123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- #!/usr/bin/env python3
- import gspread
- from oauth2client.service_account import ServiceAccountCredentials
- import sys
- import nba_py.player as player
- import datetime
- import time
- import timeout_decorator
- _spreadsheetKey = "12Zv95ZMJ008KXC5ytVnBusjX9wUnpOg0TOLwmxMNOTQ"
- def _getStatsSheet(_key):
- scope = ['https://spreadsheets.google.com/feeds',
- 'https://www.googleapis.com/auth/drive']
- _credentials = ServiceAccountCredentials.from_json_keyfile_name('NBA Playoffs Game-1f9a46f0715c.json', scope)
- _gc = gspread.authorize(_credentials)
- # open spreadsheet
- _spreadsheet = _gc.open_by_key(_key)
-
- # open worksheet
- _statsSheet = _spreadsheet.get_worksheet(0)
- _leaderSheet = _spreadsheet.get_worksheet(1)
-
- # count participants
- _numParticipants = _leaderSheet.row_count - 1
- return _statsSheet, _leaderSheet
-
-
- def _getNumParticipants(_leaderSheet):
- _numParticipants = _leaderSheet.row_count - 1
-
- return _numParticipants
-
- def _getRowsFromDate(_statsSheet, _numParticipants):
- # get today
- _today = datetime.date.today()
- # else manually set the date
- #_today = datetime.date(2018, 5, 16)
-
- _urlDate = _today.strftime('%m/%d/%Y')
- # count rows
- _shtRows = _statsSheet.row_count
-
- # set first date cell
- _startRow = 4
-
- # get date cells
- while _startRow <= _shtRows:
- _dateCell = _statsSheet.cell(_startRow, 1, value_render_option='UNFORMATTED_VALUE')
- _daysSince1900 = _dateCell.value
- _date = datetime.date(1899, 12, 30) + datetime.timedelta(int(_daysSince1900))
- if _today == _date:
- break
- elif _today > _date:
- _startRow += _numParticipants
- else:
- _startRow = 0 # no games today
- break
-
- _lastRow = _startRow + _numParticipants - 1
-
- return _startRow, _lastRow, _urlDate
- def _getPlayersCells(_statsSheet, _startRow, _lastRow):
-
- _playersCells = _statsSheet.range(_startRow, 3, _lastRow, 3)
-
- # filter cells
- for _playerCell in _playersCells[:]:
- if _playerCell.value == "":
- _playersCells.remove(_playerCell)
- break
-
- return _playersCells
-
- def _getPlayerFirstNameLastName(_player):
- _firstNamelastName = _player.split()
- _firstName = _firstNamelastName[0]
- _firstName = _firstName.replace('.', '')
- _lastName = _firstNamelastName[1]
-
- return _firstName, _lastName
-
- @timeout_decorator.timeout(10)
- def _getPlayerID(_firstName, _lastName):
- _playerID = player.get_player(first_name=_firstName,last_name=_lastName)
- return _playerID
- @timeout_decorator.timeout(10)
- def _getPlayerStats(_playerID, _urlDate):
- _playerStats = {}
- _playerGameLogs = player.PlayerGameLogs(player_id=_playerID,
- season_type='Playoffs',
- date_from=_urlDate,
- date_to=_urlDate)
- for _playerGameLog in _playerGameLogs.info():
- for _stat in _playerGameLog.keys():
- _playerStats[_stat] = _playerGameLog[_stat]
- return _playerStats
- def _updatePlayerStatsCells(_statsSheet, _playerCell, _playerStats):
- _rowNumber = _playerCell.row
- for _stat in _playerStats:
- if _stat == "PTS" and _playerStats[_stat] != "":
- _statsSheet.update_cell(_rowNumber, 4, _playerStats[_stat])
- elif _stat == "REB" and _playerStats[_stat] != "":
- _statsSheet.update_cell(_rowNumber, 5, _playerStats[_stat])
- elif _stat == "AST" and _playerStats[_stat] != "":
- _statsSheet.update_cell(_rowNumber, 6, _playerStats[_stat])
- elif _stat == "STL" and _playerStats[_stat] != "":
- _statsSheet.update_cell(_rowNumber, 7, _playerStats[_stat])
- elif _stat == "BLK" and _playerStats[_stat] != "":
- _statsSheet.update_cell(_rowNumber, 8, _playerStats[_stat])
- elif _stat == "TOV" and _playerStats[_stat] != "":
- _statsSheet.update_cell(_rowNumber, 9, _playerStats[_stat])
- if _stat == "WL" and _playerStats[_stat] != "":
- _statsSheet.update_cell(_rowNumber, 11, _playerStats[_stat])
- def _badName(_statsSheet, _playerCell):
- _rowNumber = _playerCell.row
- _statsSheet.update_cell(_rowNumber, 12, "Fix name, then delete this message!")
- ###### EXECUTE ########
- while True:
- try:
- _statsSheet, _leaderSheet = _getStatsSheet(_spreadsheetKey)
- _numParticipants = _getNumParticipants(_leaderSheet)
- _startRow, _lastRow, _urlDate = _getRowsFromDate(_statsSheet, _numParticipants)
- if _startRow == 0:
- print("No games today! Pausing for 1000s")
- time.sleep(1000)
- continue
- else:
- _playersCells = _getPlayersCells(_statsSheet, _startRow, _lastRow)
- except gspread.exceptions.APIError:
- print("API overloaded, adding a 100 second delay...")
- time.sleep(100)
- continue
- except oauth2client.client.HttpAccessTokenRefreshError:
- time.sleep(100)
- continue
- for _playerCell in _playersCells:
-
- while True:
-
- try:
- _playerName = _playerCell.value
- print(_playerName)
- except gspread.exceptions.APIError:
- print("API overloaded, adding a 100 second delay...")
- time.sleep(100)
- continue
-
- try:
- _firstName, _lastName = _getPlayerFirstNameLastName(_playerName)
- except:
- #_badName(_statsSheet, _playerCell)
- break
-
- try:
- print("Getting player ID...")
- _playerID = _getPlayerID(_firstName, _lastName)
- except timeout_decorator.TimeoutError:
- print("NBA.com API not responding, retrying...")
- continue
- except:
- #_badName(_statsSheet, _playerCell)
- break
-
- try:
- print("Getting player stats...")
- _playerStats = _getPlayerStats(_playerID, _urlDate)
- except timeout_decorator.TimeoutError:
- print("NBA.com API not responding, retrying...")
- continue
-
- try:
- print("Updating stats...")
- _updatePlayerStatsCells(_statsSheet, _playerCell, _playerStats)
- except gspread.exceptions.APIError:
- print("API overloaded, adding a 100 second delay...")
- time.sleep(100)
- continue
-
- break # move to next player in player list
-
- print("Cooling down, safe to break!")
- time.sleep(100)
- continue # restart entire loop
|