def game_in_progress() : if(debug) : print("Game is in Progress") game_info = mlbgame.day(today_year,today_month,today_day, HOME_TEAM, AWAY_TEAM) curr_game_id = game_info[0].game_id global CURR_INNING_INFO status_of_game = mlbgame.overview(curr_game_id) #if(debug) : print("status: " + status_of_game.status) while(status_of_game.status == "In Progress") : #game_info[0].game_status == IN_PROGRESS #status_of_game = mlbgame.overview(curr_game_id) ##################################################### ##################################################### #Check status of batter (balls and strikes) check_batter_status(status_of_game) ##################################################### ##################################################### #check if anyones one base check_bases_status(status_of_game) ##################################################### ##################################################### #Check status of inning (balls and strikes) check_inning_status(status_of_game) ##################################################### ##################################################### #check the current inning scores check_inning_scores(curr_game_id) ##################################################### ##################################################### check_RHE_status(status_of_game) #hold the updates until "MID or END of inning" is over midOrEnd = str(status_of_game.inning_state) while(midOrEnd == 'Middle' or midOrEnd == 'End') : #if(debug) : print("mid or end of inning") #time.sleep(10) status_of_game = mlbgame.overview(curr_game_id) midOrEnd = str(status_of_game.inning_state) time.sleep(10) #update scores every 30s #game_info = mlbgame.day(today_year,today_month,today_day, HOME_TEAM, AWAY_TEAM) status_of_game = mlbgame.overview(curr_game_id)
def __game_index_for(self, team_name): team_index = 0 team_idxs = [ i for i, game in enumerate(self.games) if team_name in [game.away_team, game.home_team] ] if len(team_idxs) > 0: attempts_remaining = 5 while attempts_remaining > 0: try: team_index = next((i for i in team_idxs if Status.is_live( mlbgame.overview(self.games[i].game_id))), team_idxs[0]) self.network_issues = False break except URLError, e: self.network_issues = True debug.error( "Networking Error while refreshing live game status of {}. {} retries remaining." .format(team_name, attempts_remaining)) debug.error("URLError: {}".format(e.reason)) attempts_remaining -= 1 time.sleep(NETWORK_RETRY_SLEEP_TIME) except ValueError: self.network_issues = True debug.error( "Value Error while refreshing live game status of {}. {} retries remaining." .format(team_name, attempts_remaining)) debug.error( "ValueError: Failed to refresh overview for {}".format( self.current_game().game_id)) attempts_remaining -= 1 time.sleep(NETWORK_RETRY_SLEEP_TIME)
def refresh_overview(self): urllib.urlcleanup() attempts_remaining = 5 while attempts_remaining > 0: try: self.overview = mlbgame.overview(self.current_game().game_id) self.__update_layout_state() self.needs_refresh = False self.print_overview_debug() self.network_issues = False break except URLError, e: self.network_issues = True debug.error( "Networking Error while refreshing the current overview. {} retries remaining." .format(attempts_remaining)) debug.error("URLError: {}".format(e.reason)) attempts_remaining -= 1 time.sleep(NETWORK_RETRY_SLEEP_TIME) except ValueError: self.network_issues = True debug.error( "Value Error while refreshing current overview. {} retries remaining." .format(attempts_remaining)) debug.error( "ValueError: Failed to refresh overview for {}".format( self.current_game().game_id)) attempts_remaining -= 1 time.sleep(NETWORK_RETRY_SLEEP_TIME)
def render(self): """Renders a game or games depending on the configuration. Infinitely loops up to 15 minutes before a refresh of the list of games is required. """ self.canvas.Fill(*ledcolors.scoreboard.fill) current_game_index = self.__get_game_from_args() game = self.games[current_game_index] starttime = time.time() while True: overview = mlbgame.overview(game.game_id) self.__refresh_game(game, overview) refresh_rate = PREGAME_RATE if overview.status == IN_PROGRESS: refresh_rate = SCOREBOARD_RATE time.sleep(refresh_rate) endtime = time.time() if endtime - self.creation_time >= FIFTEEN_MINUTES: return time_delta = endtime - starttime self.canvas.Fill(*ledcolors.scoreboard.fill) # TODO: https://github.com/ajbowler/mlb-led-scoreboard/issues/30 # The time_delta comparison will need to change depending on scrolling text size if self.config.rotate_games and time_delta >= FIFTEEN_SECONDS: starttime = time.time() self.current_scrolling_text_pos = self.canvas.width current_game_index = bump_counter(current_game_index, self.games) game = self.games[current_game_index]
def fetch_preferred_team_overview(self): if not self.is_offday_for_preferred_team(): urllib.urlcleanup() game = self.games[self.game_index_for_preferred_team()] game_overview = mlbgame.overview(game.game_id) debug.log("Preferred Team's Game Status: {}, {} {}".format(game_overview.status, game_overview.inning_state, game_overview.inning)) return game_overview
def __current_game_data(self, game): game_id = game.game_id overview = mlbgame.overview(game_id) game_data = {} game_data['away_team'] = overview.away_name_abbrev game_data['home_team'] = overview.home_name_abbrev game_data['inning'] = self.__current_inning(game_id) return game_data
def overview(id): data = mlbgame.overview(id) params = { 'game_id': id, 'away_team_id': data.away_team_id, 'home_team_id': data.home_team_id, 'home_code': data.home_code, 'away_code': data.away_code } return params
def get_inning(self): self.overview = mlbgame.overview(self.game.game_id) self.inning_state = self.overview.inning_state.lower() self.inning = self.overview.inning # Format the inning number... if self.inning == 1: self.inning = str(self.inning) + 'st' elif self.inning == 2: self.inning = str(self.inning) + 'nd' elif self.inning == 3: self.inning = str(self.inning) + 'rd' else: self.inning = str(self.inning) + 'th'
def post_game() : game_info = mlbgame.day(today_year,today_month,today_day, HOME_TEAM, AWAY_TEAM) curr_game_id = game_info[0].game_id status_of_game = mlbgame.overview(curr_game_id) if(debug) : print("In the post_game state: ") #game_info = mlbgame.day(today_year,today_month,today_day, HOME_TEAM, AWAY_TEAM) if(debug) : print("FINAL SCORE: [" + str(status_of_game.home_team_runs) + "][" + str(status_of_game.away_team_runs) + "]") init_post_game_board(str(status_of_game.home_team_runs), str(status_of_game.away_team_runs), team_abrev[status_of_game.home_team_name], team_abrev[status_of_game.away_team_name]) time.sleep(1800) #check every 30 mins
def __current_game_data(self, game): game_id = game.game_id overview = mlbgame.overview(game_id) game_data = {} game_data['away_team'] = overview.away_name_abbrev game_data['home_team'] = overview.home_name_abbrev try: game_data['inning'] = self.__current_inning(game_id) except ValueError: print('No game data could be found for %s @ %s' % (game_data['away_team'], game_data['home_team'])) return False return game_data
def refresh_overview(self): attempts_remaining = 5 while attempts_remaining > 0: try: self.overview = mlbgame.overview(self.current_game().game_id) self.needs_refresh = False self.print_overview_debug() break except URLError, e: debug.error("URLError: {}".format(e.reason)) attempts_remaining -= 1 time.sleep(NETWORK_RETRY_SLEEP_TIME) except ValueError: debug.error("ValueError: Failed to refresh overview for {}".format(self.current_game().game_id)) attempts_remaining -= 1 time.sleep(NETWORK_RETRY_SLEEP_TIME)
def refresh_overview(self): urllib.urlcleanup() attempts_remaining = 5 while attempts_remaining > 0: try: self.overview = mlbgame.overview(self.current_game().game_id) self.__update_layout_state() self.needs_refresh = False self.print_overview_debug() break except URLError, e: debug.error("URLError: {}".format(e.reason)) attempts_remaining -= 1 time.sleep(NETWORK_RETRY_SLEEP_TIME) except ValueError: debug.error("ValueError: Failed to refresh overview for {}".format(self.current_game().game_id)) attempts_remaining -= 1 time.sleep(NETWORK_RETRY_SLEEP_TIME)
def data_for_game_ids(game_ids): data = [] for game_id in game_ids: game = mlbgame.overview(game_id) data.append({ 'away_team_id': game.away_team_id, 'home_team_id': game.home_team_id, 'away_team_win_pct': float(game.away_win) / (float(game.away_win) + float(game.away_loss)), 'home_team_win_pct': float(game.home_win) / (float(game.home_win) + float(game.home_loss)), 'winning_team': game.home_team_id if int(game.home_team_runs) > int(game.away_team_runs) else game.away_team_id }) return pd.DataFrame(data)
def get_game_info(self) -> Dict[str, Any]: """ Get info for a particular game ID. Returns: Dict[str, Any]: Game info in JSON format """ # Get the overview. overview = mlbgame.overview(self.game_id) # Return formatted data. return { 'game_id': self.game_id, 'status': overview.status, 'inning': overview.inning, 'inning_state': overview.inning_state, 'home_team_runs': overview.home_team_runs, 'away_team_runs': overview.away_team_runs, 'home_team_name': overview.home_team_name, 'away_team_name': overview.away_team_name, 'time_date': overview.time_date, 'ampm': overview.ampm }
def test_overview(self): overview = mlbgame.overview('2016_08_02_nyamlb_nynmlb_1') self.assertEqual(overview.ampm, 'PM') self.assertEqual(overview.attendance, '42,819') self.assertEqual(overview.aw_lg_ampm, 'PM') self.assertEqual(overview.away_ampm, 'PM') self.assertEqual(overview.away_code, 'nya') self.assertEqual(overview.away_division, 'E') self.assertEqual(overview.away_file_code, 'nyy') self.assertEqual(overview.away_games_back, 9.0) self.assertEqual(overview.away_games_back_wildcard, 5.0) self.assertEqual(overview.away_league_id, 103) self.assertEqual(overview.away_loss, 53) self.assertEqual(overview.away_name_abbrev, 'NYY') self.assertEqual( overview.away_preview_link, '/mlb/gameday/index.jsp?gid=2016_08_02_nyamlb_nynmlb_1&mode=preview&c_id=mlb' ) self.assertIsInstance(overview.away_probable_pitcher_era, str) self.assertIsInstance(overview.away_probable_pitcher_first, str) self.assertIsInstance(overview.away_probable_pitcher_first_name, str) self.assertIsInstance(overview.away_probable_pitcher_id, str) self.assertIsInstance(overview.away_probable_pitcher_last, str) self.assertIsInstance(overview.away_probable_pitcher_last_name, str) self.assertIsInstance(overview.away_probable_pitcher_losses, str) self.assertIsInstance( overview.away_probable_pitcher_name_display_roster, str) self.assertIsInstance(overview.away_probable_pitcher_number, str) self.assertIsInstance(overview.away_probable_pitcher_s_era, str) self.assertIsInstance(overview.away_probable_pitcher_s_losses, str) self.assertIsInstance(overview.away_probable_pitcher_s_wins, str) self.assertIsInstance(overview.away_probable_pitcher_stats_season, str) self.assertIsInstance(overview.away_probable_pitcher_stats_type, str) self.assertIsInstance(overview.away_probable_pitcher_throwinghand, str) self.assertIsInstance(overview.away_probable_pitcher_wins, str) self.assertEqual( overview.away_recap_link, '/mlb/gameday/index.jsp?gid=2016_08_02_nyamlb_nynmlb_1&mode=recap&c_id=mlb' ) self.assertEqual(overview.away_sport_code, 'mlb') self.assertEqual(overview.away_team_city, 'NY Yankees') self.assertEqual(overview.away_team_errors, 2) self.assertEqual(overview.away_team_hits, 6) self.assertEqual(overview.away_team_id, 147) self.assertEqual(overview.away_team_name, 'Yankees') self.assertEqual(overview.away_team_runs, 1) self.assertEqual(overview.away_time, '7:10') self.assertEqual(overview.away_time_zone, 'ET') self.assertEqual(overview.away_win, 53) self.assertEqual(overview.balls, 0) self.assertEqual(overview.date, 'August 2, 2016') self.assertEqual(overview.day, 'TUE') self.assertEqual(overview.double_header_sw, 'N') self.assertEqual(overview.elapsed_time, '2:39') self.assertEqual(overview.first_pitch_et, '') self.assertEqual( overview.game_data_directory, '/components/game/mlb/year_2016/month_08/day_02/gid_2016_08_02_nyamlb_nynmlb_1' ) self.assertEqual(overview.game_id, '2016/08/02/nyamlb-nynmlb-1') self.assertEqual(overview.game_nbr, 1) self.assertEqual(overview.game_pk, 448453) self.assertEqual(overview.game_type, 'R') self.assertEqual(overview.gameday_link, '2016_08_02_nyamlb_nynmlb_1') self.assertEqual(overview.gameday_sw, 'P') self.assertEqual(overview.hm_lg_ampm, 'PM') self.assertEqual(overview.home_ampm, 'PM') self.assertEqual(overview.home_code, 'nyn') self.assertEqual(overview.home_division, 'E') self.assertEqual(overview.home_file_code, 'nym') self.assertEqual(overview.home_games_back, 8.0) self.assertEqual(overview.home_games_back_wildcard, '-') self.assertEqual(overview.home_league_id, 104) self.assertEqual(overview.home_loss, 51) self.assertEqual(overview.home_name_abbrev, 'NYM') self.assertEqual( overview.home_preview_link, '/mlb/gameday/index.jsp?gid=2016_08_02_nyamlb_nynmlb_1&mode=preview&c_id=mlb' ) self.assertIsInstance(overview.home_probable_pitcher_era, str) self.assertIsInstance(overview.home_probable_pitcher_first, str) self.assertIsInstance(overview.home_probable_pitcher_first_name, str) self.assertIsInstance(overview.home_probable_pitcher_id, str) self.assertIsInstance(overview.home_probable_pitcher_last, str) self.assertIsInstance(overview.home_probable_pitcher_last_name, str) self.assertIsInstance(overview.home_probable_pitcher_losses, str) self.assertIsInstance( overview.home_probable_pitcher_name_display_roster, str) self.assertIsInstance(overview.home_probable_pitcher_number, str) self.assertIsInstance(overview.home_probable_pitcher_s_era, str) self.assertIsInstance(overview.home_probable_pitcher_s_losses, str) self.assertIsInstance(overview.home_probable_pitcher_s_wins, str) self.assertIsInstance(overview.home_probable_pitcher_stats_season, str) self.assertIsInstance(overview.home_probable_pitcher_stats_type, str) self.assertIsInstance(overview.home_probable_pitcher_throwinghand, str) self.assertIsInstance(overview.home_probable_pitcher_wins, str) self.assertEqual( overview.home_recap_link, '/mlb/gameday/index.jsp?gid=2016_08_02_nyamlb_nynmlb_1&mode=recap&c_id=mlb' ) self.assertEqual(overview.home_sport_code, 'mlb') self.assertEqual(overview.home_team_city, 'NY Mets') self.assertEqual(overview.home_team_errors, 0) self.assertEqual(overview.home_team_hits, 10) self.assertEqual(overview.home_team_id, 121) self.assertEqual(overview.home_team_name, 'Mets') self.assertEqual(overview.home_team_runs, 7) self.assertEqual(overview.home_time, '7:10') self.assertEqual(overview.home_time_zone, 'ET') self.assertEqual(overview.home_win, 55) self.assertEqual(overview.id, '2016/08/02/nyamlb-nynmlb-1') self.assertEqual(overview.ind, 'F') self.assertEqual(overview.inning, 9) self.assertEqual(overview.inning_state, '') self.assertEqual(overview.is_no_hitter, 'N') self.assertEqual(overview.is_perfect_game, 'N') self.assertEqual(overview.league, 'AN') self.assertEqual(overview.location, 'Flushing, NY') self.assertEqual(overview.note, '') self.assertEqual(overview.official_scorer, 'Jordan Sprechman') self.assertEqual(overview.original_date, '2016/08/02') self.assertEqual(overview.outs, 3) self.assertEqual( overview.photos_link, '/mlb/gameday/index.jsp?gid=2016_08_02_nyamlb_nynmlb_1&mode=photos' ) self.assertEqual( overview.preview, '/mlb/gameday/index.jsp?gid=2016_08_02_nyamlb_nynmlb_1&mode=preview&c_id=mlb' ) self.assertEqual(overview.scheduled_innings, 9) self.assertEqual(overview.start_time, '7:11 PM') self.assertEqual(overview.status, 'Final') self.assertEqual(overview.status_ind, 'F') self.assertEqual(overview.strikes, 0) self.assertEqual(overview.tbd_flag, 'N') self.assertEqual(overview.tiebreaker_sw, 'N') self.assertEqual(overview.time, '7:10') self.assertEqual(overview.time_aw_lg, '7:10') self.assertEqual(overview.time_date, '2016/08/02 7:10') self.assertEqual(overview.time_date_aw_lg, '2016/08/02 7:10') self.assertEqual(overview.time_date_hm_lg, '2016/08/02 7:10') self.assertEqual(overview.time_hm_lg, '7:10') self.assertEqual(overview.time_zone, 'ET') self.assertEqual(overview.time_zone_aw_lg, -4) self.assertEqual(overview.time_zone_hm_lg, -4) self.assertEqual(overview.top_inning, 'Y') self.assertEqual(overview.tv_station, 'WPIX') self.assertEqual(overview.tz_aw_lg_gen, 'ET') self.assertEqual(overview.tz_hm_lg_gen, 'ET') self.assertEqual(overview.venue, 'Citi Field') self.assertEqual(overview.venue_id, 3289) self.assertEqual(overview.venue_name, 'Citi Field') self.assertEqual(overview.venue_w_chan_loc, 'USNY0504') self.assertEqual(overview.weather, '75 degrees, partly cloudy') self.assertEqual(overview.wind, '8 mph, R to L') self.assertEqual( overview.wrapup_link, '/mlb/gameday/index.jsp?gid=2016_08_02_nyamlb_nynmlb_1&mode=wrap&c_id=mlb' )
def games_in_season(season): print 'Building data/{}/games/{}_games_data.csv'.format(season, season) dataList = [] for month in range(4, 12): for day in range(1, 32): print '\n{}/{}/{}'.format(month, day, season) for gameID in game_ids_for_date(month, day, season): try: game = mlbgame.overview(gameID) except: break if not data_exists_for_game(game): break awayData = pd.read_csv('data/{}/teams/{}_{}_data.csv'.format( season, game.away_name_abbrev, season)) homeData = pd.read_csv('data/{}/teams/{}_{}_data.csv'.format( season, game.home_name_abbrev, season)) gameData = (awayData, homeData) if not hasattr(game, 'time_date'): break if not game_dates_match(game.time_date, gameData): break gameNumber = game_number_for_game(game) lines = line_for_game(gameData, gameNumber) overUnder = over_under_for_game(gameData, gameNumber) print game.away_name_abbrev, '@', game.home_name_abbrev teamRatings = team_rating_for_game(gameData, gameNumber) expWinPcts = pythagorean_win_pct_for_game(gameData, gameNumber) startingPitcherRatings = starting_pitcher_rating_for_game( gameData, gameNumber) startingPitcherAdjustments = starting_pitcher_adjustment_for_game( gameData, gameNumber) teamWinProbabilities = win_probability_for_game( gameData, gameNumber) winningTeam = game.home_name_abbrev if int( game.home_team_runs) > int( game.away_team_runs) else game.away_name_abbrev winningLine = lines[ 1] if winningTeam == game.home_name_abbrev else lines[0] wasHomeTeamWinner = 1 if winningTeam == game.home_name_abbrev else 0 dataList.append({ 'Date': game.time_date, 'AwayTeam': game.away_name_abbrev, 'HomeTeam': game.home_name_abbrev, 'AwayTeamID': mlbgameTeamAbbrevToCoversTeamID[game.away_name_abbrev], 'HomeTeamID': mlbgameTeamAbbrevToCoversTeamID[game.home_name_abbrev], 'AwayTeamStartingPitcherRating': startingPitcherRatings[0], 'HomeTeamStartingPitcherRating': startingPitcherRatings[1], 'AwayTeamStartingPitcherAdjustment': startingPitcherAdjustments[0], 'HomeTeamStartingPitcherAdjustment': startingPitcherAdjustments[1], 'AwayTeamWinProbability': teamWinProbabilities[0], 'HomeTeamWinProbability': teamWinProbabilities[1], 'WinningTeam': winningTeam, 'WinningTeamID': mlbgameTeamAbbrevToCoversTeamID[winningTeam], 'WasHomeTeamWinner': wasHomeTeamWinner, 'AwayTeamLine': lines[0], 'HomeTeamLine': lines[1], 'Over/Under': overUnder, 'WinningTeamLine': winningLine, 'AwayTeamRating': teamRatings[0], 'HomeTeamRating': teamRatings[1], 'AwayTeamPythagoreanExpectedWin%': expWinPcts[0], 'HomeTeamPythagoreanExpectedWin%': expWinPcts[1] }) data = pd.DataFrame(dataList) data.to_csv('data/{}/games/{}_games_data.csv'.format(season, season), encoding='utf-8')
def data_for_game_ids(gameIDs): gamesData = [] global bankroll, bankrollTrend betAmount = math.ceil(bankroll * 0.01) for gameID in gameIDs: try: game = mlbgame.overview(gameID) except: break if does_data_exist_for_game(game): awayTeamLine = get_line_for_game(game.away_name_abbrev, game.time_date) homeTeamLine = get_line_for_game(game.home_name_abbrev, game.time_date) if awayTeamLine and homeTeamLine: bankrollTrend.append(bankroll) if bankroll < betAmount: raise ValueError("Bankroll must be higher than bet amount") bankroll -= betAmount awayTeamWinProbability, homeTeamWinProbability = expected_win_probabilities_for_game( game) pick = game.home_name_abbrev if homeTeamWinProbability >= awayTeamWinProbability else game.away_name_abbrev winningTeam = game.home_name_abbrev if int( game.home_team_runs) > int( game.away_team_runs) else game.away_name_abbrev winningLine = homeTeamLine if winningTeam == game.home_name_abbrev else awayTeamLine gameDict = { 'date': game.time_date, 'matchup': game.away_name_abbrev + ' @ ' + game.home_name_abbrev, 'away_team_win_pct': float(game.away_win) / (float(game.away_win) + float(game.away_loss)), 'home_team_win_pct': float(game.home_win) / (float(game.home_win) + float(game.home_loss)), 'pick': pick, 'away_team_line': awayTeamLine, 'home_team_line': awayTeamLine, 'winning_team': winningTeam, 'winning_line': winningLine } gamesData.append(gameDict) if pick == winningTeam: bankroll += math.ceil( betAmount * convert_line_to_multiplier(winningLine)) print gameDict['date'], gameDict['matchup'], gameDict[ 'pick'], gameDict['winning_line'] if len(gamesData) > 0: data = pd.DataFrame(gamesData) data['pick_match'] = np.where(data['pick'] == data['winning_team'], 1, 0) return data
def test_overview_empty(self): self.assertRaises(ValueError, lambda: mlbgame.overview('game_id')) self.assertRaises(ValueError, lambda: mlbgame.overview('2016_08_02_nymlb_nymlb_1'))
import pandas as pd import os # Define Years of Interest (2010-2018) years = [year for year in range(2010, 2018 + 1)] # Pull all games from MLBGAME API schedule = mlbgame.games(years, home='Nationals') games = mlbgame.combine_games(schedule) results = [] # Loop through games and keep regular season games played in DC for game in games: game_datetime = game.date game_date = game_datetime.date() game_overview = mlbgame.overview(game.game_id) # Game Type, should be == 'R' for regular season game_type = game_overview.game_type if (game_type != 'S'): print(game_date) game_df = pd.DataFrame({'natls_home': 1}, index=[game_date]) results.append(game_df) # Concatentate one big dataframe results_df = pd.concat(results, axis=0) # Output final dataframe TIMESTR = time.strftime("%Y%m%d_%H%M%S") filename = "Natls_Home_Games_2010_2018_" + TIMESTR + ".csv" filepath = os.path.join("./Output", filename) results_df.to_csv(filepath, index=True)
def render(self): """Renders a game or games depending on the configuration. Infinitely loops up to 15 minutes before a refresh of the list of games is required. """ self.canvas.Fill(*ledcolors.scoreboard.fill) current_game_index = self.__get_game_from_args() game = self.games[current_game_index] starttime = time.time() while True: try: if self.data_needs_refresh: overview = mlbgame.overview(game.game_id) self.data_needs_refresh = False # If a game_id can't be found, we fail gracefully and try the next game except ValueError as e: if str(e) == "Could not find a game with that id.": error_strings = ["Game ID","Not","Found"] + [game.game_id] self.__handle_error(e, error_strings) current_game_index = bump_counter(current_game_index, self.games) game = self.games[current_game_index] else: error_strings = split_string(str(e), self.canvas.width/4) self.__handle_error(e, error_strings) continue # Catch everything else. except: err_type, error, traceback = sys.exc_info() error_strings = split_string(str(error), self.canvas.width/4) self.__handle_error(error, error_strings) continue self.__refresh_game(game, overview) if self.config.scroll_until_finished == False: self.scroll_finished = True refresh_rate = SCROLL_TEXT_FAST_RATE if self.config.slowdown_scrolling == True: refresh_rate = SCROLL_TEXT_SLOW_RATE if overview.status == IN_PROGRESS: refresh_rate = self.config.live_rotate_rate self.data_needs_refresh = True self.scroll_finished = True time.sleep(refresh_rate) endtime = time.time() if endtime - self.creation_time >= FIFTEEN_MINUTES: return time_delta = endtime - starttime self.canvas.Fill(*ledcolors.scoreboard.fill) rotate_rate = self.config.live_rotate_rate # Always use the default 15 seconds for our pregame rotations if overview.status == PRE_GAME or overview.status == SCHEDULED: rotate_rate = self.config.pregame_rotate_rate if overview.status == FINAL or overview.status == GAME_OVER: rotate_rate = self.config.final_rotate_rate if time_delta >= rotate_rate and self.scroll_finished: starttime = time.time() self.data_needs_refresh = True self.scroll_finished = False self.current_scrolling_text_pos = self.canvas.width if self.__should_rotate_to_next_game(overview): current_game_index = bump_counter(current_game_index, self.games) game = self.games[current_game_index]