from resources.lib.globals import * def categories(): addDir('Today\'s Games',100,ICON,FANART) addDir('Yesterday\'s Games',105,ICON,FANART) #addDir('Favorite Team Recent Games','favteam',500,ICON,FANART) addDir('Goto Date',200,ICON,FANART) def todaysGames(game_day): if game_day == None: game_day = localToEastern() settings.setSetting(id='stream_date', value=game_day) display_day = stringToDate(game_day, "%Y-%m-%d") url_game_day = display_day.strftime('year_%Y/month_%m/day_%d') prev_day = display_day - timedelta(days=1) addDir('[B]<< Previous Day[/B]',101,PREV_ICON,FANART,prev_day.strftime("%Y-%m-%d")) date_display = '[B][I]'+ colorString(display_day.strftime("%A, %m/%d/%Y"),GAMETIME_COLOR)+'[/I][/B]' addPlaylist(date_display,str(game_day),900,ICON,FANART) #addPlaylist(date_display,display_day,'/playhighlights',999,ICON,FANART) url = 'http://gdx.mlb.com/components/game/mlb/'+url_game_day+'/grid_ce.json' req = urllib2.Request(url) req.add_header('Connection', 'close') req.add_header('User-Agent', UA_PS4) try: response = urllib2.urlopen(req) json_source = json.load(response) response.close() except HTTPError as e: xbmc.log('The server couldn\'t fulfill the request.') xbmc.log('Error code: ', e.code) sys.exit() global RECAP_PLAYLIST global EXTENDED_PLAYLIST RECAP_PLAYLIST.clear() EXTENDED_PLAYLIST.clear() try: itr = json_source['data']['games']['game'] if not isinstance(itr, list): itr = [itr] for game in itr: createGameListItem(game, game_day) except: # if there are no games on this date pass next_day = display_day + timedelta(days=1) addDir('[B]Next Day >>[/B]',101,NEXT_ICON,FANART,next_day.strftime("%Y-%m-%d")) def createGameListItem(game, game_day): #icon = getGameIcon(game['home_team_id'],game['away_team_id']) icon = ICON #http://mlb.mlb.com/mlb/images/devices/ballpark/1920x1080/2681.jpg #B&W #fanart = 'http://mlb.mlb.com/mlb/images/devices/ballpark/1920x1080/'+game['venue_id']+'.jpg' #Color fanart = 'http://www.mlb.com/mlb/images/devices/ballpark/1920x1080/color/'+game['venue_id']+'.jpg' if TEAM_NAMES == "0": away_team = game['away_team_name'] home_team = game['home_team_name'] else: away_team = game['away_name_abbrev'] home_team = game['home_name_abbrev'] fav_game = False if game['away_team_name'].encode('utf-8') in FAV_TEAM : fav_game = True away_team = colorString(away_team,getFavTeamColor()) if game['home_team_name'].encode('utf-8') in FAV_TEAM: fav_game = True home_team = colorString(home_team,getFavTeamColor()) game_time = '' if game['status'] == 'Preview': game_time = game_day+' '+game['event_time'] game_time = stringToDate(game_time, "%Y-%m-%d %I:%M %p") game_time = easternToLocal(game_time) if TIME_FORMAT == '0': game_time = game_time.strftime('%I:%M %p').lstrip('0') else: game_time = game_time.strftime('%H:%M') game_time = colorString(game_time,UPCOMING) else: game_time = game['status'] if game_time == 'Final': game_time = colorString(game_time,FINAL) elif 'In Progress' in game_time: if game['top_inning'] == 'Y': #up triangle #top_bottom = u"\u25B2" top_bottom = "T" else: #down triangle #top_bottom = u"\u25BC" top_bottom = "B" inning = game['inning'] if int(inning) % 10 == 1 and int(inning) != 11: ordinal_indicator = "st" elif int(inning) % 10 == 2 and int(inning) != 12: ordinal_indicator = "nd" elif int(inning) % 10 == 3 and int(inning) != 13: ordinal_indicator = "rd" else: ordinal_indicator = "th" game_time = top_bottom + ' ' + inning + ordinal_indicator if int(inning) >= 9: color = CRITICAL else: color = LIVE game_time = colorString(game_time,color) else: game_time = colorString(game_time,LIVE) event_id = str(game['calendar_event_id']) gid = game['id'] live_feeds = 0 archive_feeds = 0 teams_stream = game['away_code'] + game['home_code'] stream_date = str(game_day) desc = '' hide_spoilers = 0 if NO_SPOILERS == '1' or (NO_SPOILERS == '2' and fav_game) or (NO_SPOILERS == '3' and game_day == localToEastern()) or (NO_SPOILERS == '4' and game_day < localToEastern()) or game['status'] == 'Preview': name = game_time + ' ' + away_team + ' at ' + home_team hide_spoilers = 1 else: name = game_time + ' ' + away_team + ' ' + colorString(str(game['away_score']),SCORE_COLOR) + ' at ' + home_team + ' ' + colorString(str(game['home_score']),SCORE_COLOR) name = name.encode('utf-8') if fav_game: name = '[B]'+name+'[/B]' title = away_team + ' at ' + home_team title = title.encode('utf-8') #Label free game of the day if applicable try: if game['game_media']['homebase']['media'][0]['free'] == "ALL": #and game_day >= localToEastern(): name = colorString(name, FREE) except: pass #Set audio/video info based on stream quality setting audio_info, video_info = getAudioVideoInfo() #'duration':length info = {'plot':desc,'tvshowtitle':'MLB','title':title,'originaltitle':title,'aired':game_day,'genre':LOCAL_STRING(700),'mediatype':'video'} #Create Playlist for the days recaps and condensed try: recap_url, condensed_url = getHighlightLinks(teams_stream, stream_date) global RECAP_PLAYLIST listitem = xbmcgui.ListItem(title, thumbnailImage=icon) listitem.setInfo( type="Video", infoLabels={ "Title": title }) RECAP_PLAYLIST.add(recap_url, listitem) global EXTENDED_PLAYLIST listitem = xbmcgui.ListItem(title, thumbnailImage=icon) listitem.setInfo( type="Video", infoLabels={ "Title": title } ) EXTENDED_PLAYLIST.add(condensed_url, listitem) except: pass addStream(name,title,event_id,gid,icon,fanart,info,video_info,audio_info,teams_stream,stream_date) def streamSelect(event_id, gid, teams_stream, stream_date): display_day = stringToDate(stream_date, "%Y-%m-%d") url_game_day = display_day.strftime('year_%Y/month_%m/day_%d') url = 'http://gdx.mlb.com/components/game/mlb/'+url_game_day+'/grid_ce.json' req = urllib2.Request(url) req.add_header('Connection', 'close') req.add_header('User-Agent', UA_PS4) try: response = urllib2.urlopen(req) json_source = json.load(response) response.close() except HTTPError as e: xbmc.log('The server couldn\'t fulfill the request.') xbmc.log('Error code: ', e.code) sys.exit() #Find selected game teams = {} itr = json_source['data']['games']['game'] if type(itr) is not list: itr = [itr] #xbmc.log(str(itr)) for game in itr: xbmc.log(game['id']) xbmc.log(gid) if gid == game['id']: try: epg = game['game_media']['homebase']['media'] teams={'Home':game['home_name_abbrev'],'Away':game['away_name_abbrev']} break except: #no stream info, abort! abort! msg = "No playable streams found." dialog = xbmcgui.Dialog() ok = dialog.ok('Streams Not Found', msg) sys.exit() stream_title = [] content_id = [] free_game = [] media_state = [] playback_scenario = [] archive_type = ['Highlights','Recap','Condensed','Full Game'] #archive_type = ['Recap','Condensed','Full Game'] try: for item in epg: xbmc.log(str(item)) xbmc.log(str(item['playback_scenario'])) xbmc.log(PLAYBACK_SCENARIO) if str(item['playback_scenario']) == PLAYBACK_SCENARIO: if item['enhanced'] == 'Y': title = 'Enhanced' stream_title.append(title) else: title = str(item['type'])[6:].title() try: stream_title.append(teams[title] + " ("+item['display']+")") except: stream_title.append(title+ " ("+item['display']+")") media_state.append(item['state']) content_id.append(item['id']) playback_scenario.append(str(item['playback_scenario'])) elif str(item['playback_scenario']) == "HTTP_CLOUD_AUDIO" and item['state'] != 'MEDIA_OFF': title = str(item['type']).title() title = title.replace('_', ' ') stream_title.append(title + " ("+item['display']+")") media_state.append(item['state']) content_id.append(item['id']) playback_scenario.append(str(item['playback_scenario'])) except: pass ''' elif str(item['playback_scenario']) == "FLASH_2500K_1280X720" and item['type'] != 'condensed_game': title = str(item['type']).title() title = title.replace('_', ' ') stream_title.append(title + " ("+item['display']+")") media_state.append(item['state']) content_id.append(item['id']) playback_scenario.append("HTTP_CLOUD_WIRED_60") ''' #All past games should have highlights if len(stream_title) == 0 and stream_date > localToEastern(): msg = "No playable streams found." dialog = xbmcgui.Dialog() ok = dialog.ok('Streams Not Found', msg) sys.exit() #Reverse Order for display purposes #stream_title.reverse() #ft.reverse() xbmc.log("MEDIA STATE") xbmc.log(str(media_state)) stream_url = '' media_auth = '' play_highlights = 0 if len(media_state) > 0: if media_state[0] == 'MEDIA_ARCHIVE': dialog = xbmcgui.Dialog() a = dialog.select('Choose Archive', archive_type) if a > -1: if a < 3: recap, condensed, highlights = getHighlightLinks(teams_stream, stream_date) if a == 0: play_highlights = 1 elif a == 1: try: stream_url = recap['url'] except: dialog = xbmcgui.Dialog() ok = dialog.ok('Recap Not Available', 'The recap for this game is not yet available. \nPlease check back later.') else: try: stream_url = condensed['url'] except: dialog = xbmcgui.Dialog() ok = dialog.ok('Condensed Game Not Available', 'The condensed game is not yet available. \nPlease check back later.') if QUALITY == 'Always Ask' and ((len(highlights) > 0 and play_highlights == 1) or stream_url != '') : bandwidth = getStreamQuality(str(highlights[0][0])) else: bandwidth = find(QUALITY,'(',' kbps)') stream_url = createHighlightStream(stream_url, bandwidth) elif a == 3: dialog = xbmcgui.Dialog() n = dialog.select('Choose Stream', stream_title) if n > -1: stream_url, media_auth = fetchStream(content_id[n],event_id,playback_scenario[n]) stream_url = createFullGameStream(stream_url,media_auth,media_state[n]) else: #Add Highlights option to live games stream_title.insert(0,'Highlights') dialog = xbmcgui.Dialog() n = dialog.select('Choose Stream', stream_title) if n > -1: if stream_title[n] == 'Highlights': recap, condensed, highlights = getHighlightLinks(teams_stream, stream_date) if len(highlights) > 0: play_highlights = 1 if QUALITY == 'Always Ask': bandwidth = getStreamQuality(str(highlights[0][0])) else: bandwidth = find(QUALITY,'(',' kbps)') else: try: n = n -1 stream_url, media_auth = fetchStream(content_id[n],event_id,playback_scenario[n]) stream_url = createFullGameStream(stream_url,media_auth,media_state[n]) except: pass else: archive_type = ['Highlights'] dialog = xbmcgui.Dialog() a = dialog.select('Choose Archive', archive_type) if a == 0: #getHighlightLinks(teams_stream, stream_date) play_highlights = 1 listitem = xbmcgui.ListItem(path=stream_url) if '.m3u8' in stream_url: xbmcplugin.setResolvedUrl(handle=addon_handle, succeeded=True, listitem=listitem) elif play_highlights == 1: highlight_name = ['Play All'] highlight_url = ['junk'] for i in range(0,len(highlights)-1): #highlights.append([clip_url,headline,icon]) highlight_url.append(highlights[i][0]) highlight_name.append(highlights[i][1]) dialog = xbmcgui.Dialog() a = dialog.select('Choose Highlight', highlight_name) if a > 0: #listitem = xbmcgui.ListItem(thumbnailImage=highlights[a-1][2], path=highlights[a-1][0]) listitem = xbmcgui.ListItem(path=createHighlightStream(highlight_url[a], bandwidth)) listitem.setInfo( type="Video", infoLabels={ "Title": highlight_name[a] }) xbmcplugin.setResolvedUrl(handle=addon_handle, succeeded=True, listitem=listitem) elif a == 0: HIGHLIGHT_PLAYLIST= xbmc.PlayList(xbmc.PLAYLIST_VIDEO) HIGHLIGHT_PLAYLIST.clear() xbmc.log(str(highlights)) listitem = xbmcgui.ListItem('dummy', thumbnailImage='') listitem.setInfo( type="Video", infoLabels={ "Title": 'dummy' }) HIGHLIGHT_PLAYLIST.add('http://cdn.gravlab.net/sparse/v1d30/2013/nightskyHLS/Lapse2.m3u8', listitem) for i in range(0,len(highlights)-1): #highlights.append([clip_url,headline,icon]) listitem = xbmcgui.ListItem(highlights[i][1], thumbnailImage=highlights[i][2]) listitem.setInfo( type="Video", infoLabels={ "Title": highlights[i][1] }) HIGHLIGHT_PLAYLIST.add(createHighlightStream(highlights[i][0], bandwidth), listitem) else: #xbmcplugin.setResolvedUrl(addon_handle, False, listitem) xbmc.executebuiltin('Dialog.Close(all,true)') def playAllHighlights(): stream_title = ['Recap','Condensed'] dialog = xbmcgui.Dialog() n = dialog.select('View All', stream_title) if n == 0: xbmc.Player().play(RECAP_PLAYLIST) elif n == 1: xbmc.Player().play(EXTENDED_PLAYLIST) def getGamesForDate(stream_date): stream_date_new = stringToDate(stream_date, "%Y-%m-%d") year = stream_date_new.strftime("%Y") month = stream_date_new.strftime("%m") day = stream_date_new.strftime("%d") url = 'http://gdx.mlb.com/components/game/mlb/year_'+year+'/month_'+month+'/day_'+day+'/' req = urllib2.Request(url) req.add_header('Connection', 'close') req.add_header('User-Agent', UA_IPAD) try: response = urllib2.urlopen(req) html_data = response.read() response.close() except HTTPError as e: xbmc.log('The server couldn\'t fulfill the request.') xbmc.log('Error code: ', e.code) sys.exit() #
  • gid_2016_03_13_arimlb_chamlb_1/
  • match = re.compile('
  • (.+?)
  • ',re.DOTALL).findall(html_data) global RECAP_PLAYLIST global EXTENDED_PLAYLIST RECAP_PLAYLIST.clear() EXTENDED_PLAYLIST.clear() pDialog = xbmcgui.DialogProgressBG() pDialog.create('MLB Highlights', 'Retrieving Streams ...') match_count = len(match) if match_count == 0: match_count = 1 # prevent division by zero when no games perc_increments = 100/match_count first_time_thru = True bandwidth = find(QUALITY,'(',' kbps)') for gid, junk in match: pDialog.update(perc_increments, message='Downloading '+gid) try: recap, condensed, highlights = getHighlightLinks(None, stream_date, gid) if first_time_thru and QUALITY == 'Always Ask': bandwidth = getStreamQuality(str(recap['url'])) first_time_thru = False listitem = xbmcgui.ListItem(recap['title'], thumbnailImage=recap['icon']) listitem.setInfo( type="Video", infoLabels={ "Title": recap['title'] }) RECAP_PLAYLIST.add(createHighlightStream(recap['url'],bandwidth), listitem) listitem = xbmcgui.ListItem(condensed['title'], thumbnailImage=condensed['icon']) listitem.setInfo( type="Video", infoLabels={ "Title": condensed['title'] } ) EXTENDED_PLAYLIST.add(createHighlightStream(condensed['url'],bandwidth), listitem) except: pass perc_increments += perc_increments pDialog.close() def createHighlightStream(url, bandwidth): if bandwidth != '' and int(bandwidth) < 4500: url = url.replace('master_tablet_60.m3u8', 'asset_'+bandwidth+'K.m3u8') url = url + '|User-Agent='+UA_IPAD return url def getHighlightLinks(teams_stream, stream_date, gid=None, bandwidth=None): #global HIGHLIGHT_PLAYLIST #HIGHLIGHT_PLAYLIST.clear() stream_date = stringToDate(stream_date, "%Y-%m-%d") year = stream_date.strftime("%Y") month = stream_date.strftime("%m") day = stream_date.strftime("%d") if gid == None: away = teams_stream[:3].lower() home = teams_stream[3:].lower() url = 'http://gdx.mlb.com/components/game/mlb/year_'+year+'/month_'+month+'/day_'+day+'/gid_'+year+'_'+month+'_'+day+'_'+away+'mlb_'+home+'mlb_1/media/mobile.xml' else: url = 'http://gdx.mlb.com/components/game/mlb/year_'+year+'/month_'+month+'/day_'+day+'/gid_'+gid+'/media/mobile.xml' req = urllib2.Request(url) req.add_header('Connection', 'close') req.add_header('User-Agent', UA_IPAD) try: response = urllib2.urlopen(req) xml_data = response.read() response.close() except HTTPError as e: xbmc.log('The server couldn\'t fulfill the request.') xbmc.log('Error code: ', e.code) sys.exit() match = re.compile('(.+?)(.+?)(.+?)(.+?)(.+?)',re.DOTALL).findall(xml_data) bandwidth = find(QUALITY,'(',' kbps)') recap = {} condensed = {} highlights = [] for media_id, media_tag, headline, junk1, icon, junk2, clip_url in match: if 'media-type="T"' in media_tag: #if bandwidth != '' and int(bandwidth) < 4500: #clip_url = clip_url.replace('master_tablet_60.m3u8', 'asset_'+bandwidth+'K.m3u8') #clip_url = clip_url + '|User-Agent='+UA_IPAD highlights.append([clip_url,headline,icon]) if 'media-type="R"' in media_tag: #icon = 'http://mediadownloads.mlb.com/mlbam/'+year+'/'+month+'/'+day+'/images/mlbf_'+media_id+'_th_43.jpg' title = headline recap = {'url':clip_url, 'icon':icon, 'title':headline} elif 'media-type="C"' in media_tag: #icon = 'http://mediadownloads.mlb.com/mlbam/'+year+'/'+month+'/'+day+'/images/mlbf_'+media_id+'_th_43.jpg' title = headline condensed = {'url':clip_url, 'icon':icon, 'title':headline} return recap, condensed, highlights def createFullGameStream(stream_url, media_auth, media_state): #SD (800 kbps)|SD (1600 kbps)|HD (3000 kbps)|HD (5000 kbps) bandwidth = '' bandwidth = find(QUALITY,'(',' kbps)') if QUALITY == 'Always Ask': bandwidth = getStreamQuality(stream_url) #Only set bandwidth if it's explicitly set if bandwidth != '': if media_state == 'MEDIA_ARCHIVE': #ARCHIVE #stream_url = stream_url.replace(MASTER_FILE_TYPE, bandwidth+'K/'+bandwidth+'_complete_fwv2-trimmed.m3u8') stream_url = stream_url.replace(MASTER_FILE_TYPE, bandwidth+'K/'+bandwidth+'_complete-trimmed.m3u8') elif media_state == 'MEDIA_ON': #LIVE #stream_url = stream_url.replace(MASTER_FILE_TYPE, bandwidth+'K/'+bandwidth+'_slide_fwv2.m3u8') stream_url = stream_url.replace(MASTER_FILE_TYPE, bandwidth+'K/'+bandwidth+'_complete.m3u8') #CDN akc_url = 'akc.mlb.com' l3c_url = 'l3c.mlb.com' if CDN == 'Akamai' and akc_url not in stream_url: stream_url = stream_url.replace(l3c_url,akc_url) elif CDN == 'Level 3' and l3c_url not in stream_url: stream_url = stream_url.replace(akc_url,l3c_url) #stream_url = stream_url + '|User-Agent='+UA_IPAD+'&Cookie='+media_auth stream_url = stream_url + '|User-Agent='+UA_PS4+'&Cookie='+media_auth return stream_url def fetchStream(content_id,event_id,playback_scenario): stream_url = '' media_auth = '' identity_point_id = '' fingerprint = '' expired_cookies = True try: cj = cookielib.LWPCookieJar(os.path.join(ADDON_PATH_PROFILE, 'cookies.lwp')) cj.load(os.path.join(ADDON_PATH_PROFILE, 'cookies.lwp'),ignore_discard=True) #Check if cookies have expired at_least_one_expired = False num_cookies = 0 for cookie in cj: num_cookies += 1 if cookie.is_expired(): at_least_one_expired = True break if not at_least_one_expired: expired_cookies = False except: pass if expired_cookies or num_cookies == 0 or USERNAME != OLD_USERNAME or PASSWORD != OLD_PASSWORD: #Remove cookie file cookie_file = xbmc.translatePath(os.path.join(ADDON_PATH_PROFILE+'cookies.lwp')) try: os.remove(cookie_file) except: pass login() cj = cookielib.LWPCookieJar(os.path.join(ADDON_PATH_PROFILE, 'cookies.lwp')) cj.load(os.path.join(ADDON_PATH_PROFILE, 'cookies.lwp'),ignore_discard=True) for cookie in cj: if cookie.name == "ipid": identity_point_id = cookie.value elif cookie.name == "fprt": fingerprint = cookie.value if identity_point_id == '' or fingerprint == '': return stream_url, media_auth session_key = getSessionKey(content_id,event_id,identity_point_id,fingerprint) #Reload Cookies cj = cookielib.LWPCookieJar(os.path.join(ADDON_PATH_PROFILE, 'cookies.lwp')) cj.load(os.path.join(ADDON_PATH_PROFILE, 'cookies.lwp'),ignore_discard=True) if PROXY_ENABLED != 'true': opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) else: proxy_url = 'http://'+PROXY_SERVER+':'+PROXY_PORT proxy_support = urllib2.ProxyHandler({ 'http': proxy_url, 'https': proxy_url }) if PROXY_USER != '' and PROXY_PWD != '': auth_handler = urllib2.ProxyBasicAuthHandler() auth_handler.add_password(None, proxy_url, PROXY_USER, PROXY_PWD) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), proxy_support, auth_handler) else: opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), proxy_support) urllib2.install_opener(opener) if session_key == '': return stream_url, media_auth elif session_key == 'blackout': msg = "The game you are trying to access is not currently available due to local or national blackout restrictions.\n Full game archives will be available 48 hours after completion of this game." dialog = xbmcgui.Dialog() ok = dialog.ok('Game Blacked Out', msg) return stream_url, media_auth url = 'https://mlb-ws-mf.media.mlb.com/pubajaxws/bamrest/MediaService2_0/op-findUserVerifiedEvent/v-2.3' url = url + '?identityPointId='+identity_point_id url = url + '&fingerprint='+fingerprint url = url + '&contentId='+content_id url = url + '&eventId='+event_id url = url + '&playbackScenario='+playback_scenario url = url + '&subject=LIVE_EVENT_COVERAGE' url = url + '&sessionKey='+urllib.quote_plus(session_key) url = url + '&platform=PS4' url = url + '&format=json' req = urllib2.Request(url) req.add_header("Accept", "*/*") req.add_header("Accept-Encoding", "deflate") req.add_header("Accept-Language", "en-US,en;q=0.8") req.add_header("Connection", "keep-alive") req.add_header("User-Agent", UA_PS4) response = opener.open(req) json_source = json.load(response) response.close() if json_source['status_code'] == 1: uv_media_item = json_source['user_verified_event'][0]['user_verified_content'][0]['user_verified_media_item'][0] if 'BLACKOUT' in str(uv_media_item ['blackout_status']).upper(): msg = "We're sorry. We have determined that you are blacked out of watching the game you selected due to Major League Baseball exclusivities." #try: if str(uv_media_item ['media_item']['state']).upper() == 'MEDIA_ARCHIVE': #cc_url = str(json_source['user_verified_event'][0]['user_verified_content'][0]['domain_specific_attributes'][3]['value']) for attribute in json_source['user_verified_event'][0]['user_verified_content'][0]['domain_specific_attributes']: if str(attribute['name']).lower() == 'inning_index_location_xml': inning_xml_url = str(attribute['value']) #inning_xml_url = "http://mlb.mlb.com/mlb/mmls2016/447002.xml" blackout_lift_min, blackout_lift_time = getBlackoutLiftTime(inning_xml_url) msg = msg + " This blackout will expire in "+str(blackout_lift_min)+" minutes at approximately "+str(blackout_lift_time)+"." break dialog = xbmcgui.Dialog() ok = dialog.ok('Game Blacked Out', msg) sys.exit() xbmc.executebuiltin('Dialog.Close(all,true)') elif str(uv_media_item ['auth_status']) == 'NotAuthorizedStatus': msg = "You do not have an active MLB.TV premium subscription. If you are using a Single Team or Free subscription please check this is enabled in the addon settings." dialog = xbmcgui.Dialog() ok = dialog.ok('Account Not Authorized', msg) sys.exit() xbmc.executebuiltin('Dialog.Close(all,true)') else: stream_url = uv_media_item ['url'] #Find subtitles ''' for item in json_source['user_verified_event'][0]['user_verified_content'][0]['domain_specific_attributes']: if item['name'] == 'closed_captions_location_ttml': subtitles_url = item['value'] convertSubtitles(subtitles_url) ''' session_key = json_source['session_key'] #Update Session Key settings.setSetting(id='session_key', value=session_key) else: msg = json_source['status_message'] dialog = xbmcgui.Dialog() ok = dialog.ok('Error Fetching Stream', msg) for cookie in cj: if cookie.name == "mediaAuth": media_auth = "mediaAuth="+cookie.value settings.setSetting(id='media_auth', value=media_auth) cj.save(ignore_discard=True) return stream_url, media_auth def getSessionKey(content_id,event_id,identity_point_id,fingerprint): #session_key = '' session_key = str(settings.getSetting(id="session_key")) if session_key == '': cj = cookielib.LWPCookieJar(os.path.join(ADDON_PATH_PROFILE, 'cookies.lwp')) cj.load(os.path.join(ADDON_PATH_PROFILE, 'cookies.lwp'),ignore_discard=True) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) epoch_time_now = str(int(round(time.time()*1000))) url = 'https://mlb-ws-mf.media.mlb.com/pubajaxws/bamrest/MediaService2_0/op-findUserVerifiedEvent/v-2.3' url = url + '?identityPointId='+identity_point_id url = url + '&fingerprint='+fingerprint url = url + '&eventId='+event_id url = url + '&subject=LIVE_EVENT_COVERAGE' url = url + '&platform=WIN8' url = url + '&frameworkURL=https://mlb-ws-mf.media.mlb.com&frameworkEndPoint=/pubajaxws/bamrest/MediaService2_0/op-findUserVerifiedEvent/v-2.3' url = url + '&_='+epoch_time_now req = urllib2.Request(url) req.add_header("Accept", "*/*") req.add_header("Accept-Encoding", "deflate") req.add_header("Accept-Language", "en-US,en;q=0.8") req.add_header("Connection", "keep-alive") req.add_header("User-Agent", UA_PC) req.add_header("Origin", "http://m.mlb.com") req.add_header("Referer", "http://m.mlb.com/tv/e"+event_id+"/v"+content_id+"/?&media_type=video&clickOrigin=Media Grid&team=mlb&forwardUrl=http://m.mlb.com/tv/e"+event_id+"/v"+content_id+"/?&media_type=video&clickOrigin=Media%20Grid&team=mlb&template=mp5default&flowId=registration.dynaindex&mediaTypeTemplate=video") response = opener.open(req) xml_data = response.read() response.close() session_key = find(xml_data,'','') settings.setSetting(id='session_key', value=session_key) ''' if json_source['status_code'] == 1: if json_source['user_verified_event'][0]['user_verified_content'][0]['user_verified_media_item'][0]['blackout_status']['status'] == 'BlackedOutStatus': msg = "You do not have access to view this content. To watch live games and learn more about blackout restrictions, please visit NHL.TV" session_key = 'blackout' else: session_key = str(json_source['session_key']) settings.setSetting(id='session_key', value=session_key) else: msg = json_source['status_message'] dialog = xbmcgui.Dialog() ok = dialog.ok('Error Fetching Stream', msg) ''' return session_key def myTeamsGames(): if FAV_TEAM != 'None': fav_team_id = getFavTeamId() end_date = localToEastern() end_date = stringToDate(end_date, "%Y-%m-%d") start_date = end_date - timedelta(days=30) start_date = start_date.strftime("%Y%m%d") end_date = end_date.strftime("%Y%m%d") season = start_date.strftime("%Y") url = 'http://mlb.mlb.com/lookup/named.schedule_vw.bam?end_date='+end_date+'&season='+season+'&team_id='+fav_team_id+'&start_date='+start_date #${expand},schedule.ticket&${optionalParams}' req = urllib2.Request(url) req.add_header('User-Agent', UA_IPAD) response = urllib2.urlopen(req) json_source = json.load(response) response.close() # match = re.compile('').findall(link) for game_row in match: for game in date['games']: createGameListItem(game, date['date']) else: msg = "Please select your favorite team from the addon settings" dialog = xbmcgui.Dialog() ok = dialog.ok('Favorite Team Not Set', msg) def login(): #Check if username and password are provided global USERNAME if USERNAME == '': dialog = xbmcgui.Dialog() USERNAME = dialog.input('Please enter your username', type=xbmcgui.INPUT_ALPHANUM) settings.setSetting(id='username', value=USERNAME) global PASSWORD if PASSWORD == '': dialog = xbmcgui.Dialog() PASSWORD = dialog.input('Please enter your password', type=xbmcgui.INPUT_ALPHANUM, option=xbmcgui.ALPHANUM_HIDE_INPUT) settings.setSetting(id='password', value=PASSWORD) if USERNAME != '' and PASSWORD != '': settings.setSetting("old_username",USERNAME) settings.setSetting("old_password",PASSWORD) cj = cookielib.LWPCookieJar(os.path.join(ADDON_PATH_PROFILE, 'cookies.lwp')) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) url = 'https://securea.mlb.com/authenticate.do' login_data = 'uri=%2Faccount%2Flogin_register.jsp®istrationAction=identify&emailAddress='+USERNAME+'&password='+PASSWORD+'&submitButton=' req = urllib2.Request(url, data=login_data, headers= {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-US,en;q=0.8", "Content-Type": "application/x-www-form-urlencoded", "Origin": "https://securea.mlb.com", "Connection": "keep-alive", #"Cookie": "SESSION_1=wf_forwardUrl===http://m.mlb.com/tv/e14-469412-2016-03-02/v545147283/?&media_type=video&clickOrigin=Media%20Grid&team=mlb~wf_flowId===registration.dynaindex~wf_template===mp5default~wf_mediaTypeTemplate===video~stage===3~flowId===registration.dynaindex~forwardUrl===http://m.mlb.com/tv/e14-469412-2016-03-02/v545147283/?&media_type=video&clickOrigin=Media%20Grid&team=mlb;", "Cookie": "SESSION_1=wf_forwardUrl%3D%3D%3Dhttp%3A%2F%2Fm.mlb.com%2Ftv%2Fe14-469412-2016-03-02%2Fv545147283%2F%3F%26media_type%3Dvideo%26clickOrigin%3DMedia%2520Grid%26team%3Dmlb%7Ewf_flowId%3D%3D%3Dregistration.dynaindex%7Ewf_template%3D%3D%3Dmp5default%7Ewf_mediaTypeTemplate%3D%3D%3Dvideo%7Estage%3D%3D%3D3%7EflowId%3D%3D%3Dregistration.dynaindex%7EforwardUrl%3D%3D%3Dhttp%3A%2F%2Fm.mlb.com%2Ftv%2Fe14-469412-2016-03-02%2Fv545147283%2F%3F%26media_type%3Dvideo%26clickOrigin%3DMedia%2520Grid%26team%3Dmlb%3B", "User-Agent": UA_PC}) try: response = opener.open(req) # if url has not changed the login was not valid. if response.geturl() == url: msg = "Please check that your username and password are correct" dialog = xbmcgui.Dialog() ok = dialog.ok('Invalid Login', msg) sys.exit() else: cj.save(ignore_discard=True); except HTTPError as e: xbmc.log('The server couldn\'t fulfill the request.') xbmc.log('Error code: ', e.code) xbmc.log(url) #Error 401 for invalid login if e.code == 401: msg = "Please check that your username and password are correct" dialog = xbmcgui.Dialog() ok = dialog.ok('Invalid Login', msg) #response = opener.open(req) #user_data = response.read() response.close() def logout(): #Just delete the cookie file cookie_file = xbmc.translatePath(os.path.join(ADDON_PATH_PROFILE+'cookies.lwp')) try: os.remove(cookie_file) except: pass settings.setSetting(id='session_key', value='') dialog = xbmcgui.Dialog() title = "Logout Successful" dialog.notification(title, 'Logout completed successfully', ICON, 5000, False) params=get_params() name=None mode=None game_day=None event_id=None gid=None teams_stream=None stream_date=None try: name=urllib.unquote_plus(params["name"]) except: pass try: mode=int(params["mode"]) except: pass try: game_day=urllib.unquote_plus(params["game_day"]) except: pass try: event_id=urllib.unquote_plus(params["event_id"]) except: pass try: gid=urllib.unquote_plus(params["gid"]) except: pass try: teams_stream=urllib.unquote_plus(params["teams_stream"]) except: pass try: stream_date=urllib.unquote_plus(params["stream_date"]) except: pass if mode==None: categories() elif mode == 100: #Todays Games todaysGames(None) elif mode == 101: #Prev and Next todaysGames(game_day) elif mode == 104: streamSelect(event_id, gid, teams_stream, stream_date) elif mode == 105: #Yesterday's Games game_day = localToEastern() display_day = stringToDate(game_day, "%Y-%m-%d") prev_day = display_day - timedelta(days=1) todaysGames(prev_day.strftime("%Y-%m-%d")) elif mode == 200: #Goto Date search_txt = '' dialog = xbmcgui.Dialog() game_day = dialog.input('Enter date (yyyy-mm-dd)', type=xbmcgui.INPUT_ALPHANUM) mat=re.match('(\d{4})-(\d{2})-(\d{2})$', game_day) if mat is not None: todaysGames(game_day) else: if game_day != '': msg = "The date entered is not in the format required." dialog = xbmcgui.Dialog() ok = dialog.ok('Invalid Date', msg) sys.exit() elif mode == 400: logout() elif mode == 500: myTeamsGames() elif mode == 900: getGamesForDate(stream_date) playAllHighlights() elif mode == 999: sys.exit() if mode == 100: xbmcplugin.endOfDirectory(addon_handle, cacheToDisc=False) elif mode == 101: xbmcplugin.endOfDirectory(addon_handle, cacheToDisc=False, updateListing=True) else: xbmcplugin.endOfDirectory(addon_handle)