-
Notifications
You must be signed in to change notification settings - Fork 0
/
addon.py
executable file
·104 lines (88 loc) · 4.36 KB
/
addon.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
from xbmcswift2 import Plugin
from xbmcswift2 import xbmc
import mlb_player
import mlbtv_stream_api
import mlb_exceptions
from globals import *
from mlb_games_queue import MlbGamesQueue
plugin = Plugin()
@plugin.route('/')
def index():
item = {
'label': 'Play BasesLoaded',
'path': plugin.url_for(play_basesloaded.__name__)
}
return plugin.finish([item])
@plugin.route('/basesloaded')
def play_basesloaded():
delay_sec = 20
refresh_sec = 10
games_queue = MlbGamesQueue(delay_sec, refresh_sec, plugin)
# Need a way of checking if there are any current games, not just
# games that are currently *on*
# Maybe display to user: "There are N games on right now"
games = games_queue.get()
if games is None:
plugin.notify("No games on")
return
monitor = xbmc.Monitor()
playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
player = mlb_player.MlbPlayer(mlb_playlist=playlist)
curr_game = None
streams_not_found = set([])
while not monitor.abortRequested():
# TODO encapsulate all this logic in an object
if not games:
# TODO better UX for this situation
xbmc.log("No game found")
xbmc.sleep(5000)
continue
# Update state of curr_game
if curr_game is not None:
new_curr_game = [game for game in games if game['state'].away_team == curr_game['state'].away_team
and game['state'].home_team == curr_game['state'].home_team]
if not new_curr_game:
curr_game = None
else:
curr_game = new_curr_game[0]
# Iterate through best games in order, choosing first one a stream exists for
for game in games:
if curr_game == game:
xbmc.log("Not switching because current game is still best game")
break
try:
# Only switch games if:
# curr_game is None (either no curr_game or it's in commercial break)
# The change in leverage is > 1.5 and there's a new batter in curr_game
# game has a better leverage than curr_game and curr_game is below average leverage (1.0) and there's a new batter in curr_game
curr_game_none = curr_game is None
new_batter = curr_game and curr_game['state'].new_batter
large_leverage_diff = curr_game and (game['leverage_index'] - curr_game['leverage_index'] > 1.5)
game_better = curr_game and game['leverage_index'] > curr_game['leverage_index']
curr_game_below_avg = curr_game and curr_game['leverage_index'] < 1.0
if curr_game_none or (new_batter and (large_leverage_diff or (curr_game_below_avg and game_better))):
if (game['state'].home_team, game['state'].away_team) in streams_not_found:
xbmc.log("Already know stream doesn't exist for game {0}".format(game))
continue
stream = mlbtv_stream_api.get_stream(game['state'].home_team, game['state'].away_team)
xbmc.log("Switching from {0} to {1}".format(curr_game, game))
curr_game = game
xbmc.log("stream: " + stream)
player.play_video(stream)
if curr_game == game:
xbmc.log("Current game is in commercial break or is over")
if curr_game != game and (game['leverage_index'] - curr_game['leverage_index']) <= 1.5:
xbmc.log("{0} is better game, but not enough better to switch from {1}".format(game, curr_game))
elif curr_game != game and (game['leverage_index'] - curr_game['leverage_index']) > 1.5:
xbmc.log("{0} is a better game, but {1} still has a batter at the plate".format(game, curr_game))
break
except mlb_exceptions.StreamNotFoundException:
streams_not_found.add((game['state'].home_team, game['state'].away_team),)
xbmc.log("Stream not found for {0}. Setting cache to {1}".format(game, streams_not_found))
continue
if monitor.waitForAbort(refresh_sec) or not player.isPlayingVideo():
break
# Update games
games = games_queue.get()
if __name__ == '__main__':
plugin.run()