nba_playoffs_game_updater.py 6.6 KB

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