def play(self, videoId): api = NetworkTenVideo() media = api.get_media_for_video(videoId) self.log.debug('Found media renditions for video: %s', repr(media.items)) if len(media.items): # Blindly go for the highest bitrate for now. # Later versions could include a customisable setting of which stream to use media_sorted = sorted(media.items, key=lambda m: m.encodingRate, reverse=True) media = media_sorted[0] path = media.defaultURL self.log.info('Using rendition: %s with url: %s' % (media, path)) else: # Fallback to API FLVFullLength (e.g. for live streams) media = api.get_fallback_media_for_video(videoId) path = media.remoteUrl self.log.info('Using fallback rendition: %s with url: %s' % (media, path)) if path.startswith('rtmp'): path = path.replace('&mp4:', ' playpath=mp4:') path += ' swfVfy=true swfUrl=%s pageUrl=%s' % (SWF_URL, PAGE_URL) # Set the resolved url, and include media stream info item = ListItem.from_dict(path=path) item.add_stream_info( 'video', { 'codec': media.videoCodec, 'width': media.frameWidth, 'height': media.frameHeight }) self.plugin.set_resolved_url(path)
def play(self, videoId): api = NetworkTenVideo() media = api.get_media_for_video(videoId) self.log.debug("Found media renditions for video: %s", repr(media.items)) if len(media.items): # Blindly go for the highest bitrate for now. # Later versions could include a customisable setting of which stream to use media_sorted = sorted(media.items, key=lambda m: m.encodingRate, reverse=True) media = media_sorted[0] path = media.defaultURL self.log.info("Using rendition: %s with url: %s" % (media, path)) else: # Fallback to API FLVFullLength (e.g. for live streams) media = api.get_fallback_media_for_video(videoId) path = media.remoteUrl self.log.info("Using fallback rendition: %s with url: %s" % (media, path)) if path.startswith("rtmp"): path = path.replace("&mp4:", " playpath=mp4:") path += " swfVfy=true swfUrl=%s pageUrl=%s" % (SWF_URL, PAGE_URL) # Set the resolved url, and include media stream info item = ListItem.from_dict(path=path) item.add_stream_info( "video", {"codec": media.videoCodec, "width": media.frameWidth, "height": media.frameHeight} ) self.plugin.set_resolved_url(path)
def play(self, videoId): api = NetworkTenVideo() media = api.get_media_for_video(videoId) self.log.debug('Found media renditions for video: %s', repr(media)) if len(media): # Blindly go for the highest bitrate for now. # Later versions could include a customisable setting of which stream to use media_sorted = sorted(media, key=lambda m: m.encodingRate, reverse=True) media = media_sorted[0] path = media.url self.log.info('Using rendition: %s with url: %s' % (media, path)) else: # Fallback to API FLVFullLength (e.g. for live streams) media = api.get_fallback_media_for_video(videoId) if media.remoteUrl: path = media.remoteUrl self.log.info('Using fallback rendition: %s with url: %s' % (media, path)) else: # attempt to deal with DRM'd content by falling back to mobile HLS stream path = "http://c.brightcove.com/services/mobile/streaming/index/master.m3u8?videoId=%s" % videoId self.log.info('Using fallback rendition unavailable - falling back to mobile HLS stream: %s' % path) if path.startswith('rtmp'): path = path.replace('&mp4:', ' playpath=mp4:') path += ' swfVfy=true swfUrl=%s pageUrl=%s' % (SWF_URL, PAGE_URL) # Set the resolved url, and include media stream info item = ListItem.from_dict(path=path) item.add_stream_info('video', {'codec': media.videoCodec, 'width': media.frameWidth, 'height': media.frameHeight}) self.plugin.set_resolved_url(path)
def videolist(self, query, page='0'): api = NetworkTenVideo(self.plugin.cached(TTL=config.CACHE_TTL)) if query == 'featured': homepage = api.get_homepage() videoIds = [] for item in homepage: videoIds.append(item['brightcoveid']) videos = api.find_videos_by_ids(video_ids = videoIds) else: querystring = query query = urlparse.parse_qs(query) query['page_number'] = page videos = api.search_videos(**query) fanart_url = None if 'fanart' in self.request.args: fanart_url = self.request.args['fanart'][0] update_listing = False if 'update' in self.request.args and self.request.args['update'][0]: update_listing = True videoItems = [] for video in videos.items: item = ListItem.from_dict( label=htmlparser.unescape(video.name), thumbnail=video.videoStillURL, is_playable=True, path=self.url_for('play.play', explicit=True, videoId=video.id) ) item.set_info( "video", self.get_item_info(video)) item.add_stream_info('video', { 'codec': 'h264', 'width': 944, 'height': 528, 'duration': float(video.length / 1000) }) item.add_stream_info('audio', { 'codec': 'aac', 'language': 'en', 'channels': 2 }) if fanart_url: item.set_property('fanart_image', fanart_url) videoItems.append(item) if videos.total_count > (videos.page_size * (int(page) + 1)): item = ListItem.from_dict( label='Next >>', path=self.url_for('videolist.videolist', query=querystring, page=str(int(page) + 1), fanart=fanart_url, update=True) ) if fanart_url: item.set_property('fanart_image', fanart_url) videoItems.insert(0, item) if int(page) > 0: item = ListItem.from_dict( label='<< Previous', path=self.url_for('videolist.videolist', query=querystring, page=str(int(page) - 1), fanart=fanart_url, update=True) ) if fanart_url: item.set_property('fanart_image', fanart_url) videoItems.insert(0, item) self.set_content('episodes') self.plugin.finish( items=videoItems, update_listing=update_listing, sort_methods=[SortMethod.UNSORTED, SortMethod.EPISODE, SortMethod.VIDEO_TITLE, SortMethod.VIDEO_RUNTIME])
def showlist(self, type): api = NetworkTenVideo(self.plugin.cached(TTL=config.CACHE_TTL)) shows = [] if "news" == type: for news in api.get_news(): fanart_url = api.get_fanart(news) item = ListItem.from_dict( label=news["Title"], path=self.url_for( "videolist.videolist", explicit=True, query=news["BCQueryForVideoListing"], page="0", fanart=fanart_url, ), ) if fanart_url: item.set_property("fanart_image", fanart_url) if "Thumbnail" in news: url = news["Thumbnail"] if url.startswith("//"): url = "http:" + url item.set_thumbnail(url) shows.append(item) elif "sport" == type: for sport in api.get_sports(): item = ListItem.from_dict( label=sport["Title"], path=self.url_for( "videolist.videolist", explicit=True, query=sport["BCQueryForVideoListing"], page="0" ), ) shows.append(item) elif "live" == type: for category in api.get_live_categories(): fanart_url = None if "fanart" in category: fanart_url = category["fanart"] item = ListItem.from_dict( label=category["title"], path=self.url_for( "videolist.videolist", explicit=True, query=category["query"], page="0", fanart=fanart_url ), ) if fanart_url: item.set_property("fanart_image", fanart_url) if "thumbnail" in category: item.set_thumbnail(category["thumbnail"]) shows.append(item) else: # tvshows for show in api.get_shows(): info_dict = {} if show["IsLongFormAvailable"] is not True: # todo: make this a setting continue if "Genres" in show and len(show["Genres"]): info_dict["genre"] = show["Genres"][0]["Name"] if "Description" in show: info_dict["plot"] = show["Description"] if "CurrentSeasonFirstEpisodeAirDateTime" in show: try: date = time.strptime(show["CurrentSeasonFirstEpisodeAirDateTime"], "%d-%m-%Y %H:%M:%S %p") info_dict["aired"] = time.strftime("%Y-%m-%d", date) info_dict["premiered"] = time.strftime("%Y-%m-%d", date) info_dict["year"] = time.strftime("%Y", date) except Exception, e: pass if "Channel" in show: info_dict["studio"] = show["Channel"] if "NumberOfVideosFromBCQuery" in show: # not technically correct as this also returns the number of short form as well but close enough info_dict["episode"] = show["NumberOfVideosFromBCQuery"] if "BCQueryForVideoListing" in show and len(show["BCQueryForVideoListing"]): query = urlparse.parse_qs(show["BCQueryForVideoListing"], True) if "all" not in query: query["all"] = [] elif not isinstance(query["all"], list): query["all"] = [query["all"]] query["all"].append("video_type_long_form:Full Episode") # some shows (Australian Survivor) have typos in the query, which break with exact matching if "video_type_long_form:Full Episodes" in query["all"]: query["all"].remove("video_type_long_form:Full Episodes") else: continue fanart_url = api.get_fanart(show) item = ListItem.from_dict( label=show["Title"], path=self.url_for( "videolist.videolist", explicit=True, query=urllib.urlencode(query, True), fanart=fanart_url ), # ShowPageItemId=show['ShowPageItemId'] info=info_dict, ) if fanart_url: item.set_property("fanart_image", fanart_url) if "Thumbnail" in show: url = show["Thumbnail"] if url.startswith("//"): url = "http:" + url item.set_thumbnail(url) shows.append(item)
def __init__(self, plugin=None): self.api = NetworkTenVideo() self.log = plugin.log self.log.debug('Cache TTL set to %d minutes', config.CACHE_TTL) self.cache = plugin.get_storage('showlist', TTL=config.CACHE_TTL) print repr(self.cache)
class APICache: def __init__(self, plugin=None): self.api = NetworkTenVideo() self.log = plugin.log self.log.debug('Cache TTL set to %d minutes', config.CACHE_TTL) self.cache = plugin.get_storage('showlist', TTL=config.CACHE_TTL) print repr(self.cache) def get_show(self, show, bypassCache=False): if not bypassCache and 'showlist' in self.cache and show in self.cache['showlist']: self.log.debug('Retrieving show data for show "%s" from cache...', show) show_data = self.cache['showlist'][show] else: self.log.debug('Retrieving show data for show "%s" from api ...', show) show_data = self.api.get_show(show) if not 'showlist' in self.cache: self.cache['showlist'] = {} self.cache['showlist'][show_data.showName] = show_data self.cache.sync() self.log.debug('Show data: %s', repr(show_data)) return show_data def get_shows(self, bypassCache=False): if not bypassCache and 'showlist' in self.cache: self.log.debug('Retrieving show list from cache...') shows = self.cache['showlist'].values() else: self.log.debug('Retrieving show list from api...') shows = self.api.get_shows().items if not 'showlist' in self.cache: self.cache['showlist'] = {} for show in shows: self.cache['showlist'][show.showName] = show self.cache.sync() self.log.debug('Shows: %s', repr(shows)) return shows def get_playlists(self, show, bypassCache=False): if not bypassCache and 'showlist' in self.cache and show in self.cache['showlist'] and self.cache['showlist'][show].playlists and len(self.cache['showlist'][show].playlists) > 0: self.log.debug('Retrieving playlists for show "%s" from cache...', show) playlists = self.cache['showlist'][show].playlists else: self.log.debug('Retrieving playlists for show "%s" from api...', show) playlists = self.api.get_playlists_for_show(show).items if show in cache['showlist']: self.cache['showlist'][show].playlists = playlists self.cache.sync() self.log.debug('Playlists: %s', repr(playlists.items)) return playlists def search_videos(self, bypassCache=False, **kwargs): key = json.dumps(kwargs) print repr(key) if not bypassCache and 'searches' in self.cache and key in self.cache['searches']: self.log.debug('Using search results from cache...') result = self.cache['searches'][key] else: self.log.debug('Using search results from api...') result = self.api.search_videos(**kwargs) if not 'searches' in self.cache: self.cache['searches'] = {} self.cache['searches'][key] = result self.cache.sync() return result
def showlist(self, type): api = NetworkTenVideo(self.plugin.cached(TTL=config.CACHE_TTL)) shows = [] if 'news' == type: for news in api.get_news(): fanart_url = api.get_fanart(news) item = ListItem.from_dict( label=news['Title'], path=self.url_for('videolist.videolist', explicit=True, query=news['BCQueryForVideoListing'], page='0', fanart=fanart_url), ) if fanart_url: item.set_property('fanart_image', fanart_url) if 'Thumbnail' in news: url = news['Thumbnail'] if url.startswith('//'): url = 'http:' + url item.set_thumbnail(url) shows.append(item) elif 'sport' == type: for sport in api.get_sports(): item = ListItem.from_dict( label=sport['Title'], path=self.url_for('videolist.videolist', explicit=True, query=sport['BCQueryForVideoListing'], page='0'), ) shows.append(item) elif 'live' == type: for category in api.get_live_categories(): fanart_url = None if 'fanart' in category: fanart_url = category['fanart'] item = ListItem.from_dict( label=category['title'], path=self.url_for('videolist.videolist', explicit=True, query=category['query'], page='0', fanart=fanart_url), ) if fanart_url: item.set_property('fanart_image', fanart_url) if 'thumbnail' in category: item.set_thumbnail(category['thumbnail']) shows.append(item) else: #tvshows for show in api.get_shows(): info_dict = {} if show['IsLongFormAvailable'] is not True: #todo: make this a setting continue if 'Genres' in show and len(show['Genres']): info_dict['genre'] = show['Genres'][0]['Name'] if 'Description' in show: info_dict['plot'] = show['Description'] if 'CurrentSeasonFirstEpisodeAirDateTime' in show: try: date = time.strptime(show['CurrentSeasonFirstEpisodeAirDateTime'],'%d-%m-%Y %H:%M:%S %p') info_dict['aired'] = time.strftime('%Y-%m-%d', date) info_dict['premiered'] = time.strftime('%Y-%m-%d', date) info_dict['year'] = time.strftime('%Y', date) except Exception, e: pass if 'Channel' in show: info_dict['studio'] = show['Channel'] if 'NumberOfVideosFromBCQuery' in show: # not technically correct as this also returns the number of short form as well but close enough info_dict['episode'] = show['NumberOfVideosFromBCQuery'] if 'BCQueryForVideoListing' in show and len(show['BCQueryForVideoListing']): query = urlparse.parse_qs(show['BCQueryForVideoListing'], True) if 'all' not in query: query['all'] = [] elif not isinstance(query['all'], list): query['all'] = [ query['all'] ] query['all'].append('video_type_long_form:Full Episode') else: continue fanart_url = api.get_fanart(show) item = ListItem.from_dict( label=show['Title'], path=self.url_for('videolist.videolist', explicit=True, query=urllib.urlencode(query, True), fanart=fanart_url), #ShowPageItemId=show['ShowPageItemId'] info=info_dict ) if fanart_url: item.set_property('fanart_image', fanart_url) if 'Thumbnail' in show: url = show['Thumbnail'] if url.startswith('//'): url = 'http:' + url item.set_thumbnail(url) shows.append(item)