nba_playoffs_game_updater.py 6.1 KB

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