NHL: Fix playoff series wins (#740)

These would show as 0 when a series was won. It now properly shows 4.
This commit is contained in:
Erik Johnson 2019-05-01 08:41:35 -05:00 committed by GitHub
parent 68d1158c9b
commit 6441081358
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 88 additions and 66 deletions

View File

@ -125,7 +125,7 @@ class ScoresBackend(SettingsBase):
except (TypeError, ValueError):
return 0
def get_nested(self, data, expr, callback=None, default=None):
def get_nested(self, data, expr, callback=None, default=''):
if callback is None:
def callback(x):
return x

View File

@ -212,12 +212,10 @@ class MLB(ScoresBackend):
away_abbrev = self.get_nested(
game,
'teams:away:team:abbreviation',
default='').upper()
'teams:away:team:abbreviation').upper()
home_abbrev = self.get_nested(
game,
'teams:home:team:abbreviation',
default='').upper()
'teams:home:team:abbreviation').upper()
if away_abbrev and home_abbrev:
try:
for team in (home_abbrev, away_abbrev):
@ -240,27 +238,24 @@ class MLB(ScoresBackend):
ret['id'] = game['gamePk']
ret['inning'] = self.get_nested(linescore, 'currentInning', default=0)
ret['outs'] = self.get_nested(linescore, 'outs', default='')
ret['outs'] = self.get_nested(linescore, 'outs')
ret['live_url'] = self.live_url % ret['id']
for team in ('away', 'home'):
team_data = self.get_nested(game, 'teams:%s' % team, default={})
if team == 'home':
ret['venue'] = self.get_nested(team_data, 'venue:name', default='')
ret['venue'] = self.get_nested(team_data, 'venue:name')
ret['%s_city' % team] = self.get_nested(
team_data,
'team:locationName',
default='')
'team:locationName')
ret['%s_name' % team] = self.get_nested(
team_data,
'team:teamName',
default='')
'team:teamName')
ret['%s_abbrev' % team] = self.get_nested(
team_data,
'team:abbreviation',
default='')
'team:abbreviation')
ret['%s_wins' % team] = self.get_nested(
team_data,
@ -279,7 +274,7 @@ class MLB(ScoresBackend):
for key in ('delay', 'postponed', 'suspended'):
ret[key] = ''
ret['status'] = self.get_nested(game, 'status:detailedState', default='').replace(' ', '_').lower()
ret['status'] = self.get_nested(game, 'status:detailedState').replace(' ', '_').lower()
if ret['status'] == 'delayed_start':
ret['status'] = 'pregame'
@ -303,14 +298,14 @@ class MLB(ScoresBackend):
except ValueError:
ret['extra_innings'] = ''
top_bottom = self.get_nested(linescore, 'inningHalf', default='').lower()
top_bottom = self.get_nested(linescore, 'inningHalf').lower()
ret['top_bottom'] = self.inning_top if top_bottom == 'top' \
else self.inning_bottom if top_bottom == 'bottom' \
else ''
try:
game_time = datetime.strptime(
self.get_nested(game, 'gameDate', default=''),
self.get_nested(game, 'gameDate'),
'%Y-%m-%dT%H:%M:%SZ')
except ValueError as exc:
# Log when the date retrieved from the API return doesn't match the

View File

@ -242,73 +242,100 @@ class NHL(ScoresBackend):
def process_game(self, game):
ret = {}
def _update(ret_key, game_key=None, callback=None, default='?'):
ret[ret_key] = self.get_nested(game,
game_key or ret_key,
callback=callback,
default=default)
self.logger.debug('Processing %s game data: %s',
self.__class__.__name__, game)
_update('id', 'gamePk')
linescore = self.get_nested(game, 'linescore', default={})
ret['id'] = game['gamePk']
ret['live_url'] = self.live_url % ret['id']
_update('period', 'linescore:currentPeriodOrdinal', default='')
_update('time_remaining',
'linescore:currentPeriodTimeRemaining',
lambda x: x.capitalize(),
default='')
_update('venue', 'venue:name')
ret['period'] = self.get_nested(
linescore,
'currentPeriodOrdinal')
ret['time_remaining'] = self.get_nested(
linescore,
'currentPeriodTimeRemaining',
callback=lambda x: x.capitalize())
ret['venue'] = self.get_nested(
game,
'venue:name')
pp_strength = self.get_nested(game,
'linescore:powerPlayStrength',
default='')
for team in ('home', 'away'):
_update('%s_score' % team,
'teams:%s:score' % team,
callback=self.force_int,
default=0)
_update('%s_wins' % team,
'teams:%s:leagueRecord:wins' % team,
callback=self.force_int,
default=0)
_update('%s_losses' % team,
'teams:%s:leagueRecord:losses' % team,
callback=self.force_int,
default=0)
_update('%s_otl' % team,
'teams:%s:leagueRecord:ot' % team,
callback=self.force_int,
default=0)
pp_strength = self.get_nested(linescore, 'powerPlayStrength')
_update('%s_city' % team, 'teams:%s:team:shortName' % team)
_update('%s_name' % team, 'teams:%s:team:teamName' % team)
_update('%s_abbrev' % team, 'teams:%s:team:abbreviation' % team)
_update('%s_power_play' % team,
'linescore:teams:%s:powerPlay' % team,
lambda x: pp_strength if x and pp_strength != 'Even' else '')
_update('%s_empty_net' % team,
'linescore:teams:%s:goaliePulled' % team,
lambda x: self.empty_net if x else '')
for team in ('away', 'home'):
team_data = self.get_nested(game, 'teams:%s' % team, default={})
if team == 'home':
ret['venue'] = self.get_nested(team_data, 'venue:name')
ret['%s_score' % team] = self.get_nested(
team_data,
'score',
callback=self.force_int,
default=0)
ret['%s_wins' % team] = self.get_nested(
team_data,
'leagueRecord:wins',
callback=self.force_int,
default=0)
ret['%s_losses' % team] = self.get_nested(
team_data,
'leagueRecord:losses',
callback=self.force_int,
default=0)
ret['%s_otl' % team] = self.get_nested(
team_data,
'leagueRecord:ot',
callback=self.force_int,
default=0)
ret['%s_city' % team] = self.get_nested(
team_data,
'team:shortName')
ret['%s_name' % team] = self.get_nested(
team_data,
'team:teamName')
ret['%s_abbrev' % team] = self.get_nested(
team_data,
'team:abbreviation')
ret['%s_power_play' % team] = self.get_nested(
linescore,
'teams:%s:powerPlay' % team,
callback=lambda x: pp_strength if x and pp_strength != 'Even' else '')
ret['%s_empty_net' % team] = self.get_nested(
linescore,
'teams:%s:goaliePulled' % team,
callback=lambda x: self.empty_net if x else '')
if game.get('gameType') == 'P':
for team in ('home', 'away'):
# Series wins are the remainder of dividing wins by 4
ret['_'.join((team, 'wins'))] %= 4
# Calculate wins in current series. The win value will be the
# total wins thus far in the playoffs, so a positive win count
# which is equally divisible by 4 indicates 4 wins (i.e. a
# series win). Otherwise, the series win will be the remainder
# when dividing total wins by 4.
key = '%s_wins' % team
if ret[key] and ret[key] % 4 == 0:
ret[key] = 4
else:
ret[key] %= 4
# Series losses are the other team's wins
ret['home_losses'] = ret['away_wins']
ret['away_losses'] = ret['home_wins']
_update('status',
'status:abstractGameState',
lambda x: x.lower().replace(' ', '_'))
ret['status'] = self.get_nested(
game,
'status:abstractGameState',
callback=lambda x: x.lower().replace(' ', '_'))
if ret['status'] == 'live':
ret['status'] = 'in_progress'
elif ret['status'] == 'final':
_update('overtime',
'linescore:currentPeriodOrdinal',
lambda x: x if 'OT' in x or x == 'SO' else '')
ret['overtime'] = self.get_nested(
linescore,
'currentPeriodOrdinal',
callback=lambda x: x if 'OT' in x or x == 'SO' else '')
elif ret['status'] != 'in_progress':
ret['status'] = 'pregame'