nba_playoffs_game_updater.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #!/usr/bin/env python3
  2. import gspread
  3. from oauth2client.service_account import ServiceAccountCredentials
  4. import sys
  5. import nba_py.player as player
  6. import datetime
  7. import time
  8. import timeout_decorator
  9. _spreadsheetKey = "12Zv95ZMJ008KXC5ytVnBusjX9wUnpOg0TOLwmxMNOTQ"
  10. ####### GET SHEETS AND NUM PARTICIPANTS #######
  11. def _getStatsSheet(_key):
  12. scope = ['https://spreadsheets.google.com/feeds',
  13. 'https://www.googleapis.com/auth/drive']
  14. _credentials = ServiceAccountCredentials.from_json_keyfile_name('NBA Playoffs Game-1f9a46f0715c.json', scope)
  15. _gc = gspread.authorize(_credentials)
  16. # open spreadsheet
  17. _spreadsheet = _gc.open_by_key(_key)
  18. # open worksheet
  19. _statsSheet = _spreadsheet.get_worksheet(0)
  20. _leaderSheet = _spreadsheet.get_worksheet(1)
  21. # count participants
  22. _numParticipants = _leaderSheet.row_count - 1
  23. return _statsSheet, _numParticipants
  24. def _getRowsFromDate(_statsSheet, _numParticipants):
  25. # get today
  26. _today = datetime.date.today()
  27. #_today = datetime.date(2018, 5, 2)
  28. _urlDate = _today.strftime('%m/%d/%Y')
  29. # count rows
  30. _shtRows = _statsSheet.row_count
  31. # set first date cell
  32. _startRow = 4
  33. # get date cells
  34. while _startRow <= _shtRows:
  35. _dateCell = _statsSheet.cell(_startRow, 1, value_render_option='UNFORMATTED_VALUE')
  36. _daysSince1900 = _dateCell.value
  37. _date = datetime.date(1899, 12, 30) + datetime.timedelta(int(_daysSince1900))
  38. if _today == _date:
  39. break
  40. elif _today > _date:
  41. _startRow += _numParticipants
  42. else:
  43. _startRow = 0 # no games today
  44. break
  45. _lastRow = _startRow + _numParticipants - 1
  46. return _startRow, _lastRow, _urlDate
  47. def _getPlayersCells(_statsSheet, _startRow, _lastRow):
  48. _playersCells = _statsSheet.range(_startRow, 3, _lastRow, 3)
  49. # filter cells
  50. for _playerCell in _playersCells[:]:
  51. if _playerCell.value == "":
  52. _playersCells.remove(_playerCell)
  53. break
  54. return _playersCells
  55. def _getPlayerFirstNameLastName(_player):
  56. _firstNamelastName = _player.split()
  57. _firstName = _firstNamelastName[0]
  58. _firstName = _firstName.replace('.', '')
  59. _lastName = _firstNamelastName[1]
  60. return _firstName, _lastName
  61. @timeout_decorator.timeout(10)
  62. def _getPlayerID(_firstName, _lastName):
  63. _playerID = player.get_player(first_name=_firstName,last_name=_lastName)
  64. return _playerID
  65. @timeout_decorator.timeout(10)
  66. def _getPlayerStats(_playerID, _urlDate):
  67. _playerStats = {}
  68. _playerGameLogs = player.PlayerGameLogs(player_id=_playerID,
  69. season_type='Playoffs',
  70. date_from=_urlDate,
  71. date_to=_urlDate)
  72. for _playerGameLog in _playerGameLogs.info():
  73. for _stat in _playerGameLog.keys():
  74. _playerStats[_stat] = _playerGameLog[_stat]
  75. return _playerStats
  76. def _updatePlayerStatsCells(_statsSheet, _playerCell, _playerStats):
  77. _rowNumber = _playerCell.row
  78. for _stat in _playerStats:
  79. if _stat == "PTS" and _playerStats[_stat] != "":
  80. _statsSheet.update_cell(_rowNumber, 4, _playerStats[_stat])
  81. elif _stat == "REB" and _playerStats[_stat] != "":
  82. _statsSheet.update_cell(_rowNumber, 5, _playerStats[_stat])
  83. elif _stat == "AST" and _playerStats[_stat] != "":
  84. _statsSheet.update_cell(_rowNumber, 6, _playerStats[_stat])
  85. elif _stat == "STL" and _playerStats[_stat] != "":
  86. _statsSheet.update_cell(_rowNumber, 7, _playerStats[_stat])
  87. elif _stat == "BLK" and _playerStats[_stat] != "":
  88. _statsSheet.update_cell(_rowNumber, 8, _playerStats[_stat])
  89. elif _stat == "TOV" and _playerStats[_stat] != "":
  90. _statsSheet.update_cell(_rowNumber, 9, _playerStats[_stat])
  91. if _stat == "WL" and _playerStats[_stat] != "":
  92. _statsSheet.update_cell(_rowNumber, 11, _playerStats[_stat])
  93. def _badName(_statsSheet, _playerCell):
  94. _rowNumber = _playerCell.row
  95. _statsSheet.update_cell(_rowNumber, 12, "Fix name, then delete this message!")
  96. ###### EXECUTE ########
  97. while True:
  98. try:
  99. _statsSheet, _numParticipants = _getStatsSheet(_spreadsheetKey)
  100. _startRow, _lastRow, _urlDate = _getRowsFromDate(_statsSheet, _numParticipants)
  101. if _startRow == 0:
  102. print("No games today! Pausing for 1000s")
  103. time.sleep(1000)
  104. continue
  105. else:
  106. _playersCells = _getPlayersCells(_statsSheet, _startRow, _lastRow)
  107. except gspread.exceptions.APIError:
  108. print("API overloaded, adding a 100 second delay...")
  109. time.sleep(100)
  110. continue
  111. except oauth2client.client.HttpAccessTokenRefreshError:
  112. time.sleep(100)
  113. continue
  114. for _playerCell in _playersCells:
  115. while True:
  116. try:
  117. _playerName = _playerCell.value
  118. print(_playerName)
  119. except gspread.exceptions.APIError:
  120. print("API overloaded, adding a 100 second delay...")
  121. time.sleep(100)
  122. continue
  123. try:
  124. _firstName, _lastName = _getPlayerFirstNameLastName(_playerName)
  125. except:
  126. #_badName(_statsSheet, _playerCell)
  127. break
  128. try:
  129. print("Getting player ID...")
  130. _playerID = _getPlayerID(_firstName, _lastName)
  131. except timeout_decorator.TimeoutError:
  132. print("NBA.com API not responding, retrying...")
  133. continue
  134. except:
  135. #_badName(_statsSheet, _playerCell)
  136. break
  137. try:
  138. print("Getting player stats...")
  139. _playerStats = _getPlayerStats(_playerID, _urlDate)
  140. except timeout_decorator.TimeoutError:
  141. print("NBA.com API not responding, retrying...")
  142. continue
  143. try:
  144. print("Updating stats...")
  145. _updatePlayerStatsCells(_statsSheet, _playerCell, _playerStats)
  146. except gspread.exceptions.APIError:
  147. print("API overloaded, adding a 100 second delay...")
  148. time.sleep(100)
  149. continue
  150. break # move to next player in player list
  151. print("Cooling down, safe to break!")
  152. time.sleep(100)
  153. continue # restart entire loop