def tvshowsUpdate(imdb, tvdb): try: if traktIndicators: return from metahandler import metahandlers from resources.lib.menus import episodes name = control.addonInfo('name') metaget = metahandlers.MetaData(tmdb_api_key, omdb_api_key, tvdb_api_key) metaget.get_meta('tvshow', name='', imdb_id=imdb) items = episodes.Episodes().get('', '0', imdb, '0', tvdb, create_directory=False) for i in range(len(items)): items[i]['season'] = int(items[i]['season']) items[i]['episode'] = int(items[i]['episode']) seasons = {} for i in items: if i['season'] not in seasons: seasons[i['season']] = [] seasons[i['season']].append(i) countSeason = 0 metaget.get_seasons( '', imdb, seasons.keys()) # Must be called to initialize the database. for key, value in control.iteritems(seasons): countEpisode = 0 for i in value: countEpisode += int( metaget._get_watched_episode({ 'imdb_id': i['imdb'], 'season': i['season'], 'episode': i['episode'], 'premiered': '' }) == 5) countSeason += int(countEpisode == len(value)) metaget.change_watched( 'season', '', imdb_id=imdb, season=key, watched=5 if countEpisode == len(value) else 4) metaget.change_watched( 'tvshow', '', imdb_id=imdb, watched=5 if countSeason == len(seasons.keys()) else 4) except: log_utils.error() control.refresh()
def play(self, url, content=None): try: base = url url = resolver().get(url) if not url: return control.execute('ActivateWindow(busydialog)') url = resolver().process(url) control.execute('Dialog.Close(busydialog)') if not url: return control.notification(message=30705) meta = {} for i in ['title', 'originaltitle', 'tvshowtitle', 'year', 'season', 'episode', 'genre', 'rating', 'votes', 'director', 'writer', 'plot', 'tagline']: try: meta[i] = control.infoLabel('listitem.%s' % i) except: pass meta = dict((k, v) for k, v in control.iteritems(meta) if v and v != '0') if not 'title' in meta: meta['title'] = control.infoLabel('listitem.label') icon = control.infoLabel('listitem.icon') self.name = meta['title'] ; self.year = meta['year'] if 'year' in meta else '0' self.getbookmark = True if (content == 'movies' or content == 'episodes') else False self.offset = bookmarks().get(self.name, self.year) f4m = resolver().f4m(url, self.name) if not f4m is None: return # item = control.item(path=url, iconImage=icon, thumbnailImage=icon) # iconImage and thumbnailImage removed in Kodi Matrix item = control.item(label= self.name) item.setProperty('IsPlayable', 'true') item.setArt({'icon': icon, 'thumb': icon,}) item.setInfo(type='video', infoLabels = meta) item.addStreamInfo('video', {'codec': 'h264'}) control.addItem(handle=int(argv[1]), url=url, listitem=item, isFolder=False) # control.player.play(url, item) control.resolve(handle=int(argv[1]), succeeded=True, listitem=item) self.totalTime = 0 ; self.currentTime = 0 for i in range(0, 240): if self.isPlayingVideo(): break control.sleep(1000) while self.isPlayingVideo(): try: self.totalTime = self.getTotalTime() self.currentTime = self.getTime() except: pass control.sleep(2000) control.sleep(5000) except: pass
def super_info(self, i): try: if self.list[i]['metacache']: return imdb = self.list[i].get('imdb', '') ; tmdb = self.list[i].get('tmdb', '') #### -- Missing id's lookup -- #### if not tmdb and imdb: try: result = tmdb_indexer.Movies().IdLookup(imdb) tmdb = str(result.get('id', '')) if result.get('id') else '' except: tmdb = '' if not tmdb and imdb: trakt_ids = trakt.IdLookup('imdb', imdb, 'movie') if trakt_ids: tmdb = str(trakt_ids.get('tmdb', '')) if trakt_ids.get('tmdb') else '' if not tmdb and not imdb: log_utils.log('Third fallback attempt to fetch missing ids for movie title: (%s)' % self.list[i]['title'], __name__, log_utils.LOGDEBUG) try: results = trakt.SearchMovie(title=quote_plus(self.list[i]['title']), year=self.list[i]['year'], fields='title', full=False) if results[0]['movie']['title'] != self.list[i]['title'] or results[0]['movie']['year'] != self.list[i]['year']: return ids = results[0].get('movie', {}).get('ids', {}) if not tmdb: tmdb = str(ids.get('tmdb', '')) if ids.get('tmdb') else '' if not imdb: imdb = str(ids.get('imdb', '')) if ids.get('imdb') else '' except: pass ################################# if not tmdb: return movie_meta = cache.get(tmdb_indexer.Movies().get_movie_meta, 96, tmdb) if not movie_meta: return values = {} values.update(movie_meta) if 'rating' in self.list[i] and self.list[i]['rating']: del values['rating'] #prefer trakt rating and votes if set if 'votes' in self.list[i] and self.list[i]['votes']: del values['votes'] if not imdb: imdb = values.get('imdb', '') if not values.get('imdb'): values['imdb'] = imdb if not values.get('tmdb'): values['tmdb'] = tmdb try: if self.lang == 'en' or self.lang not in values.get('available_translations', [self.lang]): raise Exception() trans_item = trakt.getMovieTranslation(imdb, self.lang, full=True) title = trans_item.get('title') or title plot = trans_item.get('overview') or plot except: log_utils.error() if not self.disable_fanarttv: extended_art = cache.get(fanarttv.get_movie_art, 168, imdb, tmdb) if extended_art: values.update(extended_art) values = dict((k, v) for k, v in control.iteritems(values) if v is not None and v != '') # remove empty keys so .update() doesn't over-write good meta with empty values. self.list[i].update(values) meta = {'imdb': imdb, 'tmdb': tmdb, 'tvdb': '', 'lang': self.lang, 'user': self.user, 'item': values} self.meta.append(meta) except: log_utils.error()
def m2ts_key_value(self, torrent_files): total_max_size, total_min_length = 0, 10000000000 for item in torrent_files: max_filesize, item_length = max( [i['filesize'] for i in item.values()]), len(item) if max_filesize >= total_max_size: if item_length < total_min_length: total_max_size, total_min_length = max_filesize, item_length dict_item = item key = int([ k for k, v in control.iteritems(item) if v['filesize'] == max_filesize ][0]) return key, [ dict_item, ]
def getTraktAsJson(url, post=None): try: res_headers = {} r = getTrakt(url=url, post=post, extended=True) if isinstance(r, tuple) and len(r) == 2: r, res_headers = r[0], r[1] if not r: return r = utils.json_loads_as_str(r) res_headers = dict( (k.lower(), v) for k, v in control.iteritems(res_headers)) if 'x-sort-by' in res_headers and 'x-sort-how' in res_headers: r = sort_list(res_headers['x-sort-by'], res_headers['x-sort-how'], r) return r except: log_utils.error()
def items_list(i): if self.list[i]['metacache']: return try: values = {} tmdb = self.list[i].get('tmdb', '') # movie_meta = self.get_movie_meta(tmdb) movie_meta = cache.get(self.get_movie_meta, 96, tmdb) values.update(movie_meta) imdb = values['imdb'] if not self.disable_fanarttv: extended_art = cache.get(fanarttv.get_movie_art, 168, imdb, tmdb) if extended_art: values.update(extended_art) values = dict((k,v) for k, v in control.iteritems(values) if v is not None and v != '') # remove empty keys so .update() doesn't over-write good meta with empty values. self.list[i].update(values) meta = {'imdb': imdb, 'tmdb': tmdb, 'tvdb': '', 'lang': self.lang, 'user': self.user, 'item': values} self.meta.append(meta) except: log_utils.error()
def fetch(items, lang='en', user=''): try: dbcon = get_connection() dbcur = get_connection_cursor(dbcon) ck_table = dbcur.execute('''SELECT * FROM sqlite_master WHERE type='table' AND name='meta';''').fetchone() if not ck_table: dbcur.execute('''CREATE TABLE IF NOT EXISTS meta (imdb TEXT, tmdb TEXT, tvdb TEXT, lang TEXT, user TEXT, item TEXT, time TEXT, UNIQUE(imdb, tmdb, tvdb, lang, user));''') dbcur.connection.commit() dbcur.close() ; dbcon.close() return items t2 = int(time()) except: log_utils.error() for i in range(0, len(items)): try: try: # First lookup by TVDb and IMDb, since there are some incorrect shows on Trakt that have the same IMDb ID, but different TVDb IDs (eg: Gotham, Supergirl). match = dbcur.execute('''SELECT * FROM meta WHERE (imdb=? AND tvdb=? AND lang=? AND user=? AND NOT imdb='' AND NOT tvdb='')''', (items[i].get('imdb', ''), items[i].get('tvdb', ''), lang, user)).fetchone() t1 = int(match[6]) except: try: # Lookup both IMDb and TMDb for more accurate match. match = dbcur.execute('''SELECT * FROM meta WHERE (imdb=? AND tmdb=? AND lang=? AND user=? AND not imdb='' AND NOT tmdb='')''', (items[i].get('imdb', ''), items[i].get('tmdb', ''), lang, user)).fetchone() t1 = int(match[6]) except: try: # Last resort single ID lookup. match = dbcur.execute('''SELECT * FROM meta WHERE (imdb=? AND lang=? AND user=? AND NOT imdb='') OR (tmdb=? AND lang=? AND user=? AND NOT tmdb='') OR (tvdb=? AND lang=? AND user=? AND NOT tvdb='')''', (items[i].get('imdb', ''), lang, user, items[i].get('tmdb', ''), lang, user, items[i].get('tvdb', ''), lang, user)).fetchone() t1 = int(match[6]) except: pass if match: update = (abs(t2 - t1) / 3600) >= 720 if update: continue item = eval(match[5]) item = dict((k, v) for k, v in control.iteritems(item) if v is not None and v != '') items[i].update(item) items[i].update({'metacache': True}) except: log_utils.error() try: dbcur.close() ; dbcon.close() except: pass return items
def items_list(i): if i['metacache']: return try: next, title, originaltitle, year, tmdb, poster, fanart, premiered, rating, votes, plot = \ i['next'], i['title'], i['originaltitle'], i['year'], i['tmdb'], i['poster'], i['fanart'], i['premiered'], i['rating'], i['votes'], i['plot'] url = self.details_link % tmdb item = get_request(url) imdb = item.get('imdb_id', '0') if not imdb or imdb == 'None': imdb = '0' # try: studio = item.get('production_companies', None)[0]['name'] # except: studio = '0' genre = [] for x in item['genres']: genre.append(x.get('name')) if genre == []: genre = 'NA' duration = str(item.get('runtime', '0')) if duration == 'None': duration = '0' mpaa = item['release_dates']['results'] mpaa = [x for x in mpaa if x['iso_3166_1'] == 'US'] try: mpaa = mpaa[0].get('release_dates')[-1].get( 'certification') if not mpaa: mpaa = mpaa[0].get('release_dates')[0].get( 'certification') if not mpaa: mpaa = mpaa[0].get('release_dates')[1].get( 'certification') mpaa = str(mpaa) except: mpaa = '0' credits = item['credits'] director = writer = '0' for person in credits['crew']: if 'Director' in person['job']: # director = ', '.join([director['name'].encode('utf-8') for director in credits['crew'] if director['job'].lower() == 'director']) director = ', '.join([ director['name'] for director in credits['crew'] if director['job'].lower() == 'director' ]) if person['job'] in [ 'Writer', 'Screenplay', 'Author', 'Novel' ]: # writer = ', '.join([writer['name'].encode('utf-8') for writer in credits['crew'] if writer['job'].lower() in ['writer', 'screenplay', 'author', 'novel']]) writer = ', '.join([ writer['name'] for writer in credits['crew'] if writer['job'].lower() in ['writer', 'screenplay', 'author', 'novel'] ]) castandart = [] for person in item['credits']['cast']: try: # try: castandart.append({'name': person['name'].encode('utf-8'), 'role': person['character'].encode('utf-8'), 'thumbnail': ((poster_path + person.get('profile_path')) if person.get('profile_path') is not None else '0')}) # except: castandart.append({'name': person['name'], 'role': person['character'], 'thumbnail': ((poster_path + person.get('profile_path')) if person.get('profile_path') is not None else '0')}) castandart.append({ 'name': person['name'], 'role': person['character'], 'thumbnail': ((poster_path + person.get('profile_path')) if person.get('profile_path') is not None else '0') }) except: castandart = [] if len(castandart) == 150: break try: trailer = [ i for i in item['videos']['results'] if i['site'] == 'YouTube' and i['type'] == 'Trailer' ][0]['key'] trailer = control.trailer % trailer except: trailer = '' values = { 'content': 'movie', 'title': title, 'originaltitle': originaltitle, 'year': year, 'premiered': premiered, 'genre': genre, 'duration': duration, 'rating': rating, 'votes': votes, 'mpaa': mpaa, 'director': director, 'writer': writer, 'castandart': castandart, 'plot': plot, 'code': tmdb, 'imdb': imdb, 'tmdb': tmdb, 'tvdb': '0', 'poster': poster, 'poster2': '0', 'poster3': '0', 'banner': '0', 'fanart': fanart, 'fanart2': '0', 'fanart3': '0', 'clearlogo': '0', 'clearart': '0', 'landscape': fanart, 'mediatype': 'movie', 'trailer': trailer, 'metacache': False, 'next': next } meta = { 'imdb': imdb, 'tmdb': tmdb, 'tvdb': '0', 'lang': self.lang, 'user': API_key, 'item': values } if disable_fanarttv != 'true': from resources.lib.indexers import fanarttv extended_art = cache.get(fanarttv.get_movie_art, 168, imdb, tmdb) if extended_art: values.update(extended_art) meta.update(values) values = dict((k, v) for k, v in control.iteritems(values) if v and v != '0') for i in range(0, len(self.list)): if str(self.list[i]['tmdb']) == str(tmdb): self.list[i].update(values) if 'next' in meta.get('item'): del meta['item']['next'] self.meta.append(meta) metacache.insert(self.meta) except: log_utils.error()
def seasonDirectory(self, items): if not items: control.hide() control.notification(title=32054, message=33049) sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) is_widget = 'plugin' not in control.infoLabel('Container.PluginName') settingFanart = control.setting('fanart') addonPoster = control.addonPoster() addonFanart = control.addonFanart() addonBanner = control.addonBanner() try: indicators = playcount.getSeasonIndicators(items[0]['imdb'], refresh=True) except: indicators = None unwatchedEnabled = control.setting( 'tvshows.unwatched.enabled') == 'true' if trakt.getTraktIndicatorsInfo(): watchedMenu = control.lang(32068) unwatchedMenu = control.lang(32069) else: watchedMenu = control.lang(32066) unwatchedMenu = control.lang(32067) traktManagerMenu = control.lang(32070) queueMenu = control.lang(32065) showPlaylistMenu = control.lang(35517) clearPlaylistMenu = control.lang(35516) labelMenu = control.lang(32055) playRandom = control.lang(32535) addToLibrary = control.lang(32551) try: multi = [i['tvshowtitle'] for i in items] except: multi = [] multi = len([x for y, x in enumerate(multi) if x not in multi[:y]]) multi = True if multi > 1 else False if self.disable_fanarttv != 'true': tvdb = [i['tvdb'] for i in items][0] from resources.lib.indexers import fanarttv extended_art = cache.get(fanarttv.get_tvshow_art, 168, tvdb) else: extended_art = None for i in items: try: imdb, tmdb, tvdb, year, season = i.get('imdb', '0'), i.get( 'tmdb', '0'), i.get('tvdb', '0'), i.get('year', '0'), i['season'] title = i['tvshowtitle'] label = '%s %s' % (labelMenu, i['season']) if not self.season_special and control.setting( 'tv.specials') == 'true': self.season_special = True if int(season) == 0 else False try: if i['unaired'] == 'true': label = '[COLOR %s][I]%s[/I][/COLOR]' % ( self.unairedcolor, label) except: pass systitle = quote_plus(title) meta = dict( (k, v) for k, v in control.iteritems(i) if v and v != '0') meta.update({ 'code': imdb, 'imdbnumber': imdb, 'mediatype': 'tvshow', 'tag': [imdb, tvdb] }) try: meta['plot'] = control.cleanPlot( meta['plot'] ) # Some plots have a link at the end remove it. except: pass try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass try: meta.update( {'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass try: meta.update({'tvshowtitle': i['label']}) except: pass try: # Year is the shows year, not the seasons year. Extract the correct year from the premier date. yearNew = re.findall(r'(\d{4})', i['premiered'])[0] # yearNew = yearNew.encode('utf-8') meta.update({'year': yearNew}) except: pass # First check thumbs, since they typically contains the seasons poster. The normal poster contains the show poster. poster = meta.get('thumb') or meta.get('poster3') or meta.get( 'poster2') or meta.get('poster') or addonPoster fanart = '' if settingFanart: fanart = meta.get('fanart3') or meta.get( 'fanart2') or meta.get('fanart') or addonFanart thumb = meta.get('thumb') or poster icon = meta.get('icon') or poster banner = meta.get('banner3') or meta.get( 'banner2') or meta.get('banner') or addonBanner if extended_art: clearlogo = extended_art.get('clearlogo') clearart = extended_art.get('clearart') else: clearlogo = '0' clearart = '0' art = {} art.update({ 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster, 'fanart': fanart, 'icon': icon, 'thumb': thumb, 'banner': banner, 'clearlogo': clearlogo, 'clearart': clearart }) ####-Context Menu and Overlays-#### cm = [] if self.traktCredentials: cm.append(( traktManagerMenu, 'RunPlugin(%s?action=tools_traktManager&name=%s&imdb=%s&tvdb=%s&season=%s)' % (sysaddon, systitle, imdb, tvdb, season))) try: overlay = int( playcount.getSeasonOverlay(indicators, imdb, tvdb, season)) watched = overlay == 7 if watched: meta.update({'playcount': 1, 'overlay': 7}) cm.append(( unwatchedMenu, 'RunPlugin(%s?action=playcount_TVShow&name=%s&imdb=%s&tvdb=%s&season=%s&query=6)' % (sysaddon, systitle, imdb, tvdb, season))) else: meta.update({'playcount': 0, 'overlay': 6}) cm.append(( watchedMenu, 'RunPlugin(%s?action=playcount_TVShow&name=%s&imdb=%s&tvdb=%s&season=%s&query=7)' % (sysaddon, systitle, imdb, tvdb, season))) except: pass url = '%s?action=episodes&tvshowtitle=%s&year=%s&imdb=%s&tmdb=%s&tvdb=%s&season=%s' % ( sysaddon, systitle, year, imdb, tmdb, tvdb, season) cm.append(( playRandom, 'RunPlugin(%s?action=random&rtype=episode&tvshowtitle=%s&year=%s&imdb=%s&tvdb=%s&season=%s)' % (sysaddon, systitle, year, imdb, tvdb, season))) cm.append((queueMenu, 'RunPlugin(%s?action=playlist_QueueItem&name=%s)' % (sysaddon, systitle))) cm.append((showPlaylistMenu, 'RunPlugin(%s?action=playlist_Show)' % sysaddon)) cm.append((clearPlaylistMenu, 'RunPlugin(%s?action=playlist_Clear)' % sysaddon)) cm.append(( addToLibrary, 'RunPlugin(%s?action=library_tvshowToLibrary&tvshowtitle=%s&year=%s&imdb=%s&tmdb=%s&tvdb=%s)' % (sysaddon, systitle, year, imdb, tmdb, tvdb))) cm.append( ('[COLOR red]Venom Settings[/COLOR]', 'RunPlugin(%s?action=tools_openSettings)' % sysaddon)) #################################### if not i.get('trailer'): meta.update({ 'trailer': '%s?action=trailer&type=%s&name=%s&year=%s&imdb=%s' % (sysaddon, 'show', quote_plus(title), year, imdb) }) item = control.item(label=label) if 'castandart' in i: item.setCast(i['castandart']) if 'episodeIDS' in i: item.setUniqueIDs(i['episodeIDS']) if unwatchedEnabled: count = playcount.getSeasonCount(imdb, season, self.season_special) if count: item.setProperty('TotalEpisodes', str(count['total'])) item.setProperty('WatchedEpisodes', str(count['watched'])) item.setProperty('UnWatchedEpisodes', str(count['unwatched'])) if 'total_seasons' in meta: item.setProperty('TotalSeasons', str(meta.get('total_seasons'))) item.setArt(art) item.setProperty('IsPlayable', 'false') if is_widget: item.setProperty('isVenom_widget', 'true') item.setInfo(type='video', infoLabels=control.metadataClean(meta)) item.addContextMenuItems(cm) video_streaminfo = {'codec': 'h264'} item.addStreamInfo('video', video_streaminfo) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: log_utils.error() try: control.property(syshandle, 'showplot', items[0]['plot']) except: pass control.content(syshandle, 'seasons') control.directory(syshandle, cacheToDisc=True) views.setView('seasons', {'skin.estuary': 55, 'skin.confluence': 500})
def seasonDirectory(self, items): if not items: # with reuselanguageinvoker on an empty directory must be loaded, do not use sys.exit() control.hide() control.notification(title=32054, message=33049) sysaddon, syshandle = argv[0], int(argv[1]) is_widget = 'plugin' not in control.infoLabel('Container.PluginName') settingFanart = control.setting('fanart') == 'true' addonPoster, addonFanart, addonBanner = control.addonPoster( ), control.addonFanart(), control.addonBanner() try: indicators = playcount.getSeasonIndicators(items[0]['imdb'], refresh=True) except: indicators = None unwatchedEnabled = control.setting( 'tvshows.unwatched.enabled') == 'true' if trakt.getTraktIndicatorsInfo(): watchedMenu, unwatchedMenu = control.lang(32068), control.lang( 32069) else: watchedMenu, unwatchedMenu = control.lang(32066), control.lang( 32067) traktManagerMenu, queueMenu = control.lang(32070), control.lang(32065) showPlaylistMenu, clearPlaylistMenu = control.lang( 35517), control.lang(35516) labelMenu, playRandom = control.lang(32055), control.lang(32535) addToLibrary = control.lang(32551) try: multi = [i['tvshowtitle'] for i in items] except: multi = [] multi = True if len( [x for y, x in enumerate(multi) if x not in multi[:y]]) > 1 else False for i in items: try: imdb, tmdb, tvdb, year, season = i.get('imdb', ''), i.get( 'tmdb', ''), i.get('tvdb', ''), i.get('year', ''), i.get('season') title = i.get('tvshowtitle') label = '%s %s' % (labelMenu, i.get('season')) if not self.season_special and self.showspecials: self.season_special = True if int(season) == 0 else False try: if i['unaired'] == 'true': label = '[COLOR %s][I]%s[/I][/COLOR]' % ( self.unairedcolor, label) except: pass systitle = quote_plus(title) meta = dict((k, v) for k, v in control.iteritems(i) if v is not None and v != '') # setting mediatype to "season" causes "Infomation" and "play trailer" to not be available in some skins meta.update( { 'code': imdb, 'imdbnumber': imdb, 'mediatype': 'season', 'tag': [imdb, tmdb] } ) # "tag" and "tagline" for movies only, but works in my skin mod so leave try: meta.update( {'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass # First check thumbs, since they typically contains the seasons poster. The normal poster contains the show poster. poster = meta.get('thumb') or meta.get('poster3') or meta.get( 'poster2') or meta.get('poster') or addonPoster season_poster = meta.get('season_poster') or poster landscape = meta.get('landscape') fanart = '' if settingFanart: fanart = meta.get('fanart3') or meta.get( 'fanart2') or meta.get( 'fanart') or landscape or addonFanart thumb = season_poster icon = meta.get('icon') or poster banner = meta.get('banner3') or meta.get( 'banner2') or meta.get('banner') or addonBanner art = {} art.update({ 'poster': season_poster, 'tvshow.poster': poster, 'season.poster': season_poster, 'fanart': fanart, 'icon': icon, 'thumb': thumb, 'banner': banner, 'clearlogo': meta.get('clearlogo'), 'clearart': meta.get('clearart'), 'landscape': landscape }) for k in ('poster2', 'poster3', 'fanart2', 'fanart3', 'banner2', 'banner3'): meta.pop(k, None) meta.update({ 'poster': poster, 'fanart': fanart, 'banner': banner, 'thumb': thumb, 'icon': icon }) ####-Context Menu and Overlays-#### cm = [] if self.traktCredentials: cm.append(( traktManagerMenu, 'RunPlugin(%s?action=tools_traktManager&name=%s&imdb=%s&tvdb=%s&season=%s)' % (sysaddon, systitle, imdb, tvdb, season))) try: overlay = int( playcount.getSeasonOverlay(indicators, imdb, tvdb, season)) watched = (overlay == 5) if watched: meta.update({'playcount': 1, 'overlay': 5}) cm.append(( unwatchedMenu, 'RunPlugin(%s?action=playcount_TVShow&name=%s&imdb=%s&tvdb=%s&season=%s&query=4)' % (sysaddon, systitle, imdb, tvdb, season))) else: meta.update({'playcount': 0, 'overlay': 4}) cm.append(( watchedMenu, 'RunPlugin(%s?action=playcount_TVShow&name=%s&imdb=%s&tvdb=%s&season=%s&query=5)' % (sysaddon, systitle, imdb, tvdb, season))) except: pass sysmeta = quote_plus(jsdumps(meta)) cm.append(( playRandom, 'RunPlugin(%s?action=random&rtype=episode&tvshowtitle=%s&year=%s&imdb=%s&tmdb=%s&tvdb=%s&meta=%s&season=%s)' % (sysaddon, systitle, year, imdb, tmdb, tvdb, sysmeta, season))) cm.append((queueMenu, 'RunPlugin(%s?action=playlist_QueueItem&name=%s)' % (sysaddon, systitle))) cm.append((showPlaylistMenu, 'RunPlugin(%s?action=playlist_Show)' % sysaddon)) cm.append((clearPlaylistMenu, 'RunPlugin(%s?action=playlist_Clear)' % sysaddon)) cm.append(( addToLibrary, 'RunPlugin(%s?action=library_tvshowToLibrary&tvshowtitle=%s&year=%s&imdb=%s&tmdb=%s&tvdb=%s)' % (sysaddon, systitle, year, imdb, tmdb, tvdb))) cm.append( ('[COLOR red]Venom Settings[/COLOR]', 'RunPlugin(%s?action=tools_openSettings)' % sysaddon)) #################################### url = '%s?action=episodes&tvshowtitle=%s&year=%s&imdb=%s&tmdb=%s&tvdb=%s&meta=%s&season=%s' % ( sysaddon, systitle, year, imdb, tmdb, tvdb, sysmeta, season) try: item = control.item(label=label, offscreen=True) except: item = control.item(label=label) if 'castandart' in i: item.setCast(i['castandart']) item.setArt(art) if unwatchedEnabled: try: count = playcount.getSeasonCount( imdb, season, self.season_special ) # self.season_special is just a flag to set if a season special exists and we are set to show it if count: item.setProperties({ 'WatchedEpisodes': str(count['watched']), 'UnWatchedEpisodes': str(count['unwatched']) }) else: item.setProperties( { 'WatchedEpisodes': '0', 'UnWatchedEpisodes': str( meta.get('counts', {}).get(str(season), '')) } ) # temp use TMDb's season-episode count for threads not finished....next load counts will update with trakt data except: pass try: item.setProperties({ 'TotalSeasons': str(meta.get('total_seasons', '')), 'TotalEpisodes': str(meta.get('total_episodes', '')) }) except: pass #da hell with 17 users if is_widget: item.setProperty('isVenom_widget', 'true') try: # Year is the shows year, not the seasons year. Extract year from premier date for InfoLabels to have "season_year". season_year = re.findall(r'(\d{4})', i.get('premiered', ''))[0] meta.update({'year': season_year}) except: pass item.setUniqueIDs({'imdb': imdb, 'tmdb': tmdb, 'tvdb': tvdb}) item.setProperty('IsPlayable', 'false') item.setInfo(type='video', infoLabels=control.metadataClean(meta)) item.addContextMenuItems(cm) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: log_utils.error() try: control.property(syshandle, 'showplot', items[0]['plot']) except: pass control.content(syshandle, 'seasons') control.directory(syshandle, cacheToDisc=True) views.setView('seasons', {'skin.estuary': 55, 'skin.confluence': 500})
def super_info(self, i): try: if self.list[i]['metacache']: return imdb = self.list[i]['imdb'] or '0' tmdb = self.list[i]['tmdb'] or '0' try: item = tmdb_indexer.Movies().get_details( tmdb, imdb ) # api claims int rq'd. But imdb_id works for movies but not looking like it does for shows if not item and (tmdb == '0' and imdb != '0'): trakt_ids = trakt.IdLookup('imdb', imdb, 'movie') if trakt_ids: tmdb = str(trakt_ids.get('tmdb', '0')) if not tmdb or tmdb == 'None': tmdb = '0' else: item = tmdb_indexer.Movies().get_details(tmdb, '0') if not item: results = trakt.SearchMovie(title=quote_plus( self.list[i]['title']), year=self.list[i]['year'], fields='title', full=False)[0] if results: if tmdb == '0': tmdb = str( results.get('movie').get('ids').get( 'tmdb', '0')) if imdb == '0': imdb = str( results.get('movie').get('ids').get( 'imdb', '0')) item = tmdb_indexer.Movies().get_details(tmdb, imdb) if not item: return else: return except: log_utils.error() return title = py_tools.ensure_str(item.get('title')) originaltitle = title #add these so sources module may not have to make a trakt api request # aliases = item.get('alternative_titles').get('titles') # log_utils.log('aliases = %s' % str(aliases), __name__, log_utils.LOGDEBUG) if imdb == '0' or imdb is None: imdb = item.get('imdb_id', '0') if not imdb or imdb == 'None': imdb = '0' if tmdb == '0' or tmdb is None: tmdb = str(item.get('id')) if 'year' not in self.list[i] or self.list[i]['year'] == '0': year = str(item.get('release_date')[:4]) else: year = self.list[i]['year'] or '0' if 'premiered' not in self.list[i] or self.list[i][ 'premiered'] == '0': # imdb and tmdb difffer often premiered = item.get('release_date') else: premiered = self.list[i]['premiered'] if premiered and year not in premiered: # hack fix for imdb vs. tmdb mismatch without a new request. premiered = premiered.replace(premiered[:4], year) if 'genre' not in self.list[i] or self.list[i][ 'genre'] == '0' or self.list[i]['genre'] == 'NA': genre = [] for x in item['genres']: genre.append(x.get('name')) if genre == []: genre = 'NA' else: genre = self.list[i]['genre'] if 'duration' not in self.list[i] or self.list[i][ 'duration'] == '0': duration = str(item.get('runtime', '0')) else: duration = self.list[i]['duration'] if 'rating' not in self.list[i] or self.list[i]['rating'] == '0': rating = str(item.get('vote_average', '0')) else: rating = self.list[i]['rating'] if 'votes' not in self.list[i] or self.list[i]['votes'] == '0': votes = str(format(int(item.get('vote_count', '0')), ',d')) else: votes = self.list[i]['votes'] if 'mpaa' not in self.list[i] or self.list[i][ 'mpaa'] == '0' or self.list[i]['mpaa'] == 'NR': mpaa = item['release_dates']['results'] mpaa = [x for x in mpaa if x['iso_3166_1'] == 'US'] try: mpaa = mpaa[0].get('release_dates')[-1].get( 'certification') if not mpaa: mpaa = mpaa[0].get('release_dates')[0].get( 'certification') if not mpaa: mpaa = mpaa[0].get('release_dates')[1].get( 'certification') mpaa = str(mpaa) except: mpaa = '0' else: mpaa = self.list[i]['mpaa'] if 'plot' not in self.list[i] or self.list[i]['plot'] == '0': plot = item.get('overview') else: plot = self.list[i]['plot'] plot = py_tools.ensure_str(plot) try: trailer = [ x for x in item['videos']['results'] if x['site'] == 'YouTube' and x['type'] == 'Trailer' ][0]['key'] trailer = control.trailer % trailer except: trailer = '' castandart = [] director = writer = '0' poster3 = fanart3 = '0' for person in item['credits']['cast']: try: # try: # castandart.append({'name': person['name'].encode('utf-8'), 'role': person['character'].encode('utf-8'), 'thumbnail': ((self.tmdb_poster + person.get('profile_path')) if person.get('profile_path') is not None else '0')}) # except: # castandart.append({'name': person['name'], 'role': person['character'], 'thumbnail': ((self.tmdb_poster + person.get('profile_path')) if person.get('profile_path') is not None else '0')}) castandart.append({ 'name': person['name'], 'role': person['character'], 'thumbnail': ((self.tmdb_poster + person.get('profile_path')) if person.get('profile_path') is not None else '0') }) except: castandart = [] if len(castandart) == 150: break for person in item['credits']['crew']: if 'Director' in person['job']: # director = ', '.join([director['name'].encode('utf-8') for director in item['credits']['crew'] if director['job'].lower() == 'director']) director = ', '.join([ director['name'] for director in item['credits']['crew'] if director['job'].lower() == 'director' ]) if person['job'] in [ 'Writer', 'Screenplay', 'Author', 'Novel' ]: # writer = ', '.join([writer['name'].encode('utf-8') for writer in item['credits']['crew'] if writer['job'].lower() in ['writer', 'screenplay', 'author', 'novel']]) writer = ', '.join([ writer['name'] for writer in item['credits']['crew'] if writer['job'].lower() in ['writer', 'screenplay', 'author', 'novel'] ]) poster3 = '%s%s' % (self.tmdb_poster, item['poster_path'] ) if item['poster_path'] else '0' fanart3 = '%s%s' % (self.tmdb_fanart, item['backdrop_path'] ) if item['backdrop_path'] else '0' try: if self.lang == 'en' or self.lang not in item.get( 'available_translations', [self.lang]): raise Exception() trans_item = trakt.getMovieTranslation(imdb, self.lang, full=True) title = trans_item.get('title') or title plot = trans_item.get('overview') or plot except: log_utils.error() item = { 'title': title, 'originaltitle': originaltitle, 'year': year, 'imdb': imdb, 'tmdb': tmdb, 'premiered': premiered, 'genre': genre, 'duration': duration, 'rating': rating, 'votes': votes, 'mpaa': mpaa, 'director': director, 'writer': writer, 'castandart': castandart, 'plot': plot, 'poster2': '0', 'poster3': poster3, 'banner': '0', 'banner2': '0', 'fanart2': '0', 'fanart3': fanart3, 'clearlogo': '0', 'clearart': '0', 'landscape': '0', 'discart': '0', 'mediatype': 'movie', 'trailer': trailer, 'metacache': False } meta = { 'imdb': imdb, 'tmdb': tmdb, 'tvdb': '0', 'lang': self.lang, 'user': self.user, 'item': item } if self.disable_fanarttv != 'true': from resources.lib.indexers import fanarttv extended_art = cache.get(fanarttv.get_movie_art, 168, imdb, tmdb) if extended_art: item.update(extended_art) meta.update(item) if item.get('landscape', '0') == '0': item.update({'landscape': fanart3}) meta.update(item) item = dict( (k, v) for k, v in control.iteritems(item) if v and v != '0') self.list[i].update(item) self.meta.append(meta) except: log_utils.error()
def items_list(tvmaze_id): # if i['metacache']: return # not possible with only a tvmaze_id try: values = {} values['next'] = next values['tvmaze'] = tvmaze_id url = self.tvmaze_info_link % tvmaze_id item = get_request(url) values['content'] = item.get('type', '').lower() values['mediatype'] = 'tvshow' values['title'] = py_tools.ensure_str(item.get('name')) values['originaltitle'] = values['title'] values['tvshowtitle'] = values['title'] values['premiered'] = str(item.get( 'premiered', '')) if item.get('premiered') else '' try: values['year'] = values['premiered'][:4] except: values['year'] = '' ids = item.get('externals') imdb = str(ids.get('imdb', '')) if ids.get('imdb') else '' tvdb = str(ids.get('thetvdb', '')) if ids.get('thetvdb') else '' tmdb = '' # TVMaze does not have tmdb_id in api studio = item.get('network', {}) or item.get('webChannel', {}) values['studio'] = studio.get('name', '') values['genre'] = [] for i in item['genres']: values['genre'].append(i.title()) if values['genre'] == []: values['genre'] = 'NA' values['duration'] = int(item.get( 'runtime', '')) * 60 if item.get('runtime') else '' values['rating'] = str(item.get('rating').get( 'average', '')) if item.get('rating').get('average') else '' values['plot'] = client.cleanHTML( py_tools.ensure_str( item['summary'])) if item.get('summary') else '' values['status'] = item.get('status', '') values['castandart'] = [] for person in item['_embedded']['cast']: try: values['castandart'].append({ 'name': person['person']['name'], 'role': person['character']['name'], 'thumbnail': (person['person']['image']['medium'] if person['person']['image']['medium'] else '') }) except: pass if len(values['castandart']) == 150: break image = item.get('image', {}) or '' values['poster'] = image.get('original', '') if image else '' values['fanart'] = '' values['banner'] = '' values['mpaa'] = '' values['votes'] = '' try: values['airday'] = item['schedule']['days'][0] except: values['airday'] = '' values['airtime'] = item['schedule']['time'] or '' try: values['airzone'] = item['network']['country']['timezone'] except: values['airzone'] = '' values['metacache'] = False #### -- Missing id's lookup -- #### if not tmdb and (imdb or tvdb): try: result = cache.get(tmdb_indexer.TVshows().IdLookup, 96, imdb, tvdb) tmdb = str(result.get('id', '')) if result.get('id') else '' except: tmdb = '' if not imdb or not tmdb or not tvdb: try: trakt_ids = trakt.SearchTVShow(quote_plus( values['tvshowtitle']), values['year'], full=False) if not trakt_ids: raise Exception ids = trakt_ids[0].get('show', {}).get('ids', {}) if not imdb: imdb = str(ids.get('imdb', '')) if ids.get('imdb') else '' if not tmdb: tmdb = str(ids.get('tmdb', '')) if ids.get('tmdb') else '' if not tvdb: tvdb = str(ids.get('tvdb', '')) if ids.get('tvdb') else '' except: log_utils.error() ################################# if not tmdb: log_utils.log( 'tvshowtitle: (%s) missing tmdb_id' % values['tvshowtitle'], __name__, log_utils.LOGDEBUG) # log TMDb does not have show return # self.list = metacache.fetch(self.list, self.lang, self.user) # if self.list['metacache'] is True: raise Exception() showSeasons = cache.get( tmdb_indexer.TVshows().get_showSeasons_meta, 96, tmdb) if not showSeasons: return showSeasons = dict( (k, v) for k, v in control.iteritems(showSeasons) if v is not None and v != '' ) # removes empty keys so .update() doesn't over-write good meta values.update(showSeasons) if not values.get('imdb'): values['imdb'] = imdb if not values.get('tmdb'): values['tmdb'] = tmdb if not values.get('tvdb'): values['tvdb'] = tvdb for k in ('seasons', ): values.pop( k, None ) # pop() keys from showSeasons that are not needed anymore if not self.disable_fanarttv: extended_art = cache.get(fanarttv.get_tvshow_art, 168, tvdb) if extended_art: values.update(extended_art) meta = { 'imdb': imdb, 'tmdb': tmdb, 'tvdb': tvdb, 'lang': self.lang, 'user': self.user, 'item': values } # DO NOT move this after "values = dict()" below or it becomes the same object and "del meta['item']['next']" removes it from both values = dict((k, v) for k, v in control.iteritems(values) if v is not None and v != '') self.list.append(values) if 'next' in meta.get('item'): del meta['item']['next'] # next can not exist in metacache self.meta.append(meta) self.meta = [ i for i in self.meta if i.get('tmdb') ] # without this ui removed missing tmdb but it still writes these cases to metacache? metacache.insert(self.meta) except: log_utils.error()
def items_list(i): # if i['metacache']: return try: tvmaze = i url = self.tvmaze_info_link % i item = get_request(url) content = item.get('type', '0').lower() title = item.get('name') title = py_tools.ensure_str(title) tvshowtitle = title premiered = item.get('premiered', '0') try: year = re.search(r"(\d{4})", premiered).group(1) except: year = '0' imdb = item.get('externals').get('imdb', '0') if not imdb or imdb == 'None': imdb = '0' tvdb = str(item.get('externals').get('thetvdb', '0')) if not tvdb or tvdb == 'None': tvdb = '0' # TVMaze does not have tmdb_id in api tmdb = '0' studio = item.get('network', {}) or item.get('webChannel', {}) studio = studio.get('name', '0') genre = [] for i in item['genres']: genre.append(i.title()) if genre == []: genre = 'NA' duration = str(item.get('runtime', '0')) rating = str(item.get('rating').get('average', '0')) plot = client.cleanHTML(item.get('summary', '0')) plot = py_tools.ensure_str(plot) status = item.get('status', '0') castandart = [] for person in item['_embedded']['cast']: try: # try: # castandart.append({'name': person['person']['name'].encode('utf-8'), 'role': person['character']['name'].encode('utf-8'), 'thumbnail': (person['person']['image']['original'] if person['person']['image']['original'] is not None else '0')}) # except: # castandart.append({'name': person['person']['name'], 'role': person['character']['name'], 'thumbnail': (person['person']['image']['medium'] if person['person']['image']['medium'] is not None else '0')}) castandart.append({ 'name': person['person']['name'], 'role': person['character']['name'], 'thumbnail': (person['person']['image']['medium'] if person['person']['image']['medium'] is not None else '0') }) except: castandart = [] if len(castandart) == 150: break image = item.get('image') poster = image.get('original', '0') if image is not None else '0' fanart = '0' banner = '0' mpaa = '0' votes = '0' airday = '0' airtime = '0' # self.list = metacache.fetch(self.list, self.lang, self.user) # if self.list['metacache'] is True: # raise Exception() if (imdb == '0' or tmdb == '0') and tvdb != '0': from resources.lib.modules import trakt trakt_ids = trakt.IdLookup('tvdb', tvdb, 'show') if trakt_ids: if imdb == '0': imdb = str(trakt_ids.get('imdb', '0')) if not imdb or imdb == 'None': imdb = '0' if tmdb == '0': tmdb = str(trakt_ids.get('tmdb', '0')) if not tmdb or tmdb == 'None': tmdb = '0' if tvdb == '0' and imdb != '0': # Check TVDb by IMDB_ID for missing tvdb_id try: tvdb = cache.get(tvdb_v1.getSeries_ByIMDB, 96, tvshowtitle, year, imdb) except: tvdb = '0' if tvdb == '0': # Check TVDb by seriesname for missing tvdb_id try: ids = cache.get(tvdb_v1.getSeries_ByName, 96, tvshowtitle, year) if ids: tvdb = ids.get(tvdb, '0') or '0' except: tvdb = '0' log_utils.error() if tvdb == '0': raise Exception() try: url = self.tvdb_info_link % (tvdb, self.lang) # item3 = requests.get(url).content ## maybe switch to client.request # test .content vs. .text item3 = requests.get(url).text # test .content vs. .text # item3 = py_tools.six_decode(item3) except: item3 = None if item3: if poster == '0': poster = client.parseDOM(item3, 'poster')[0] poster = '%s%s' % (self.tvdb_image, poster) if poster else '0' fanart = client.parseDOM(item3, 'fanart')[0] fanart = '%s%s' % (self.tvdb_image, fanart) if fanart else '0' banner = client.parseDOM(item3, 'banner')[0] banner = '%s%s' % (self.tvdb_image, banner) if banner else '0' mpaa = client.parseDOM(item3, 'ContentRating')[0] or '0' if duration == '0': duration = client.parseDOM(item3, 'Runtime')[0] or '0' if rating == '0': rating = client.parseDOM(item3, 'Rating')[0] or '0' votes = client.parseDOM(item3, 'RatingCount')[0] or '0' if status == '0': status = client.parseDOM(item3, 'Status')[0] or '0' if premiered == '0': premiered = client.parseDOM(item3, 'FirstAired')[0] or '0' if year == '0': try: year = re.compile(r'(\d{4})').findall(premiered)[0] except: year = '0' if not plot: plot = client.parseDOM(item3, 'Overview')[0] or '0' plot = client.replaceHTMLCodes(plot) airday = client.parseDOM(item3, 'Airs_DayOfWeek')[0] or '0' airtime = client.parseDOM(item3, 'Airs_Time')[0] or '0' item = {} item = { 'content': content, 'tvshowtitle': tvshowtitle, 'title': title, 'originaltitle': title, 'year': year, 'premiered': premiered, 'studio': studio, 'genre': genre, 'duration': duration, 'rating': rating, 'votes': votes, 'mpaa': mpaa, 'castandart': castandart, 'plot': plot, 'tagline': '0', 'status': status, 'imdb': imdb, 'tvdb': tvdb, 'tmdb': tmdb, 'tvmaze': tvmaze, 'airday': airday, 'airtime': airtime, 'poster': poster, 'poster2': '0', 'banner': banner, 'banner2': '0', 'fanart': fanart, 'fanart2': '0', 'clearlogo': '0', 'clearart': '0', 'landscape': fanart, 'metacache': False, 'next': next } meta = {} meta = { 'tmdb': tmdb, 'imdb': imdb, 'tvdb': tvdb, 'lang': self.lang, 'user': self.user, 'item': item } if self.disable_fanarttv != 'true': from resources.lib.indexers import fanarttv extended_art = cache.get(fanarttv.get_tvshow_art, 168, tvdb) if extended_art: item.update(extended_art) meta.update(item) if (self.disable_fanarttv == 'true' and (poster == '0' or fanart == '0')) or ( self.disable_fanarttv != 'true' and ((poster == '0' and item.get('poster2') == '0') or (fanart == '0' and item.get('fanart2') == '0'))): from resources.lib.indexers.tmdb import TVshows tmdb_art = TVshows().get_art(tmdb) if tmdb_art: item.update(tmdb_art) if item.get('landscape', '0') == '0': landscape = item.get('fanart3', '0') item.update({'landscape': landscape}) meta.update(item) item = dict( (k, v) for k, v in control.iteritems(item) if v != '0') self.list.append(item) if 'next' in meta.get('item'): del meta['item']['next'] self.meta.append(meta) metacache.insert(self.meta) except: log_utils.error()
def addDirectory(self, items, queue=False): if items is None or len(items) == 0: return sysaddon = argv[0] addonPoster = addonBanner = control.addonInfo('icon') addonFanart = control.addonInfo('fanart') playlist = control.playlist if not queue is False: playlist.clear() try: devmode = True if 'testings.xml' in control.listDir(control.dataPath)[1] else False except: devmode = False mode = [i['content'] for i in items if 'content' in i] if 'movies' in mode: mode = 'movies' elif 'tvshows' in mode: mode = 'tvshows' elif 'seasons' in mode: mode = 'seasons' elif 'episodes' in mode: mode = 'episodes' elif 'videos' in mode: mode = 'videos' else: mode = 'addons' for i in items: try: try: name = control.lang(int(i['name'])) except: name = i['name'] if name == '': name = i['name'] url = '%s?action=%s' % (sysaddon, i['action']) try: url += '&url=%s' % quote_plus(i['url']) except: pass try: url += '&content=%s' % quote_plus(i['content']) except: pass if i['action'] == 'plugin' and 'url' in i: url = i['url'] try: devurl = dict(parse_qsl(urlparse(url).query))['action'] except: devurl = None if devurl == 'developer' and not devmode is True: raise Exception() poster = i['poster'] if 'poster' in i else '' banner = i['banner'] if 'banner' in i else '' fanart = i['fanart'] if 'fanart' in i else '' if not poster: poster = addonPoster if not banner and not poster: banner = addonBanner elif banner == '': banner = poster content = i['content'] if 'content' in i else '' folder = i['folder'] if 'folder' in i else True meta = dict((k, v) for k, v in control.iteritems(i) if v is not None and v != '') cm = [] if content in ['movies', 'tvshows']: meta.update({'trailer': '%s?action=trailer&name=%s' % (sysaddon, quote_plus(name))}) cm.append((control.lang(30707), 'RunPlugin(%s?action=trailer&name=%s)' % (sysaddon, quote_plus(name)))) if content in ['movies', 'tvshows', 'seasons', 'episodes']: cm.append((control.lang(30708), 'XBMC.Action(Info)')) if (folder is False and not '|regex=' in str(i.get('url'))) or (folder is True and content in ['tvshows', 'seasons']): cm.append((control.lang(30723), 'RunPlugin(%s?action=playlist_QueueItem)' % sysaddon)) if content == 'movies': try: dfile = '%s (%s)' % (i['title'], i['year']) except: dfile = name try: cm.append((control.lang(30722), 'RunPlugin(%s?action=addDownload&name=%s&url=%s&image=%s)' % (sysaddon, quote_plus(dfile), quote_plus(i['url']), quote_plus(poster)))) except: pass elif content == 'episodes': try: dfile = '%s S%02dE%02d' % (i['tvshowtitle'], int(i['season']), int(i['episode'])) except: dfile = name try: cm.append((control.lang(30722), 'RunPlugin(%s?action=addDownload&name=%s&url=%s&image=%s)' % (sysaddon, quote_plus(dfile), quote_plus(i['url']), quote_plus(poster)))) except: pass elif content == 'songs': try: cm.append((control.lang(30722), 'RunPlugin(%s?action=addDownload&name=%s&url=%s&image=%s)' % (sysaddon, quote_plus(name), quote_plus(i['url']), quote_plus(poster)))) except: pass if mode == 'movies': cm.append((control.lang(30711), 'RunPlugin(%s?action=tools_addView&content=movies)' % sysaddon)) elif mode == 'tvshows': cm.append((control.lang(30712), 'RunPlugin(%s?action=tools_addView&content=tvshows)' % sysaddon)) elif mode == 'seasons': cm.append((control.lang(30713), 'RunPlugin(%s?action=tools_addView&content=seasons)' % sysaddon)) elif mode == 'episodes': cm.append((control.lang(30714), 'RunPlugin(%s?action=tools_addView&content=episodes)' % sysaddon)) if devmode is True: try: cm.append(('Open in browser', 'RunPlugin(%s?action=browser&url=%s)' % (sysaddon, quote_plus(i['url'])))) except: pass try: item = control.item(label=name, offscreen=True) except: item = control.item(label=name) if fanart == '0': fanart = addonFanart try: item.setArt({'poster': poster, 'fanart': fanart, 'tvshow.poster': poster, 'season.poster': poster, 'banner': banner, 'tvshow.banner': banner, 'season.banner': banner}) except: pass if queue is False: item.setInfo(type='Video', infoLabels = meta) item.addContextMenuItems(cm) control.addItem(handle=int(argv[1]), url=url, listitem=item, isFolder=folder) else: item.setInfo(type='Video', infoLabels = meta) playlist.add(url=url, listitem=item) except: log_utils.error() if not queue is False: return control.player.play(playlist) try: i = items[0] if i['next'] == '': raise Exception() # nextMenu = control.lang(32053) # page = ' [I](%s)[/I]' % str(url.split('&page=', 1)[1]) # nextMenu = '[COLOR skyblue]' + nextMenu + page + '[/COLOR]' url = '%s?action=%s&url=%s' % (sysaddon, i['nextaction'], quote_plus(i['next'])) try: item = control.item(label=control.lang(30500), offscreen=True) except: item = control.item(label=control.lang(30500)) item.setArt({'addonPoster': addonPoster, 'thumb': addonPoster, 'poster': addonPoster, 'fanart': addonFanart, 'tvshow.poster': addonPoster, 'season.poster': addonPoster, 'banner': addonPoster, 'tvshow.banner': addonPoster, 'season.banner': addonPoster}) control.addItem(handle=int(argv[1]), url=url, listitem=item, isFolder=True) except: log_utils.error() if not mode is None: control.content(int(argv[1]), mode) control.directory(int(argv[1]), cacheToDisc=True) if mode in ['movies', 'tvshows', 'seasons', 'episodes']: views.setView(mode, {'skin.estuary': 55})
def getMeta(self, meta): try: if not meta: raise Exception() poster = meta.get('poster3') or meta.get('poster2') or meta.get( 'poster') #poster2 and poster3 may not be passed anymore thumb = meta.get('thumb') thumb = thumb or poster or control.addonThumb() season_poster = meta.get('season_poster') or poster fanart = meta.get('fanart') banner = meta.get('banner') clearart = meta.get('clearart') clearlogo = meta.get('clearlogo') discart = meta.get('discart') if 'mediatype' not in meta: meta.update( {'mediatype': 'episode' if self.episode else 'movie'}) if self.episode: meta.update({'season': self.season}) meta.update({'episode': self.episode}) meta.update({'tvshowtitle': self.title}) return (poster, thumb, season_poster, fanart, banner, clearart, clearlogo, discart, meta) except: log_utils.error() try: if self.media_type != 'movie': raise Exception() meta = control.jsonrpc( '{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": {"filter":{"or": [{"field": "year", "operator": "is", "value": "%s"}, {"field": "year", "operator": "is", "value": "%s"}, {"field": "year", "operator": "is", "value": "%s"}]}, "properties" : ["title", "originaltitle", "year", "genre", "studio", "country", "runtime", "rating", "votes", "mpaa", "director", "writer", "plot", "plotoutline", "tagline", "thumbnail", "file"]}, "id": 1}' % (self.year, str(int(self.year) + 1), str(int(self.year) - 1))) meta = py_tools.ensure_text(meta, errors='ignore') meta = jsloads(meta)['result']['movies'] t = cleantitle.get(self.title) meta = [ i for i in meta if self.year == str(i['year']) and (t == cleantitle.get( i['title']) or t == cleantitle.get(i['originaltitle'])) ][0] if 'mediatype' not in meta: meta.update({'mediatype': 'movie'}) if 'duration' not in meta: meta.update({'duration': meta.get('runtime') / 60 }) # this doesn't make sense for k, v in control.iteritems(meta): if type(v) == list: try: meta[k] = str(' / '.join([i for i in v])) except: meta[k] = '' else: try: meta[k] = str(v) except: meta[k] = str(v) if 'plugin' not in control.infoLabel('Container.PluginName'): self.DBID = meta.get('movieid') poster = thumb = meta.get('thumbnail') return (poster, thumb, '', '', '', '', '', '', meta) except: log_utils.error() try: if self.media_type != 'episode': raise Exception() meta = control.jsonrpc( '{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": {"filter":{"or": [{"field": "year", "operator": "is", "value": "%s"}, {"field": "year", "operator": "is", "value": "%s"}, {"field": "year", "operator": "is", "value": "%s"}]}, "properties" : ["title", "year", "thumbnail", "file"]}, "id": 1}' % (self.year, str(int(self.year) + 1), str(int(self.year) - 1))) meta = py_tools.ensure_text(meta, errors='ignore') meta = jsloads(meta)['result']['tvshows'] t = cleantitle.get(self.title) meta = [ i for i in meta if self.year == str(i['year']) and t == cleantitle.get(i['title']) ][0] tvshowid = meta['tvshowid'] poster = meta['thumbnail'] meta = control.jsonrpc( '{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params":{ "tvshowid": %d, "filter":{"and": [{"field": "season", "operator": "is", "value": "%s"}, {"field": "episode", "operator": "is", "value": "%s"}]}, "properties": ["title", "season", "episode", "showtitle", "firstaired", "runtime", "rating", "director", "writer", "plot", "thumbnail", "file"]}, "id": 1}' % (tvshowid, self.season, self.episode)) meta = py_tools.ensure_text(meta, errors='ignore') meta = jsloads(meta)['result']['episodes'][0] if 'mediatype' not in meta: meta.update({'mediatype': 'episode'}) if 'duration' not in meta: meta.update({'duration': meta.get('runtime') / 60 }) # this doesn't make sense for k, v in control.iteritems(meta): if type(v) == list: try: meta[k] = str(' / '.join([i for i in v])) except: meta[k] = '' else: try: meta[k] = str(v) except: meta[k] = str(v) if 'plugin' not in control.infoLabel('Container.PluginName'): self.DBID = meta.get('episodeid') thumb = meta['thumbnail'] return (poster, thumb, '', '', '', '', '', '', meta) except: log_utils.error() poster, thumb, season_poster, fanart, banner, clearart, clearlogo, discart, meta = '', '', '', '', '', '', '', '', { 'title': self.name } return (poster, thumb, season_poster, fanart, banner, clearart, clearlogo, discart, meta)
def movieDirectory(self, items, unfinished=False, next=True): if not items: # with reuselanguageinvoker on an empty directory must be loaded, do not use sys.exit() control.hide() ; control.notification(title=32001, message=33049) from resources.lib.modules.player import Bookmarks sysaddon, syshandle = argv[0], int(argv[1]) disable_player_art = control.setting('disable.player.art') == 'true' hosts_mode = control.setting('hosts.mode') is_widget = 'plugin' not in control.infoLabel('Container.PluginName') settingFanart = control.setting('fanart') == 'true' addonPoster, addonFanart, addonBanner = control.addonPoster(), control.addonFanart(), control.addonBanner() indicators = playcount.getMovieIndicators(refresh=True) isPlayable = 'false' if 'plugin' not in control.infoLabel('Container.PluginName'): isPlayable = 'true' elif hosts_mode != '1': isPlayable = 'true' if hosts_mode == '2': playbackMenu = control.lang(32063) else: playbackMenu = control.lang(32064) if trakt.getTraktIndicatorsInfo(): watchedMenu, unwatchedMenu = control.lang(32068), control.lang(32069) else: watchedMenu, unwatchedMenu = control.lang(32066), control.lang(32067) playlistManagerMenu, queueMenu = control.lang(35522), control.lang(32065) traktManagerMenu, addToLibrary = control.lang(32070), control.lang(32551) nextMenu, clearSourcesMenu = control.lang(32053), control.lang(32611) for i in items: try: imdb, tmdb, title, year = i.get('imdb', ''), i.get('tmdb', ''), i['title'], i.get('year', '') trailer, runtime = i.get('trailer'), i.get('duration') label = '%s (%s)' % (title, year) try: labelProgress = label + '[COLOR %s] [%s][/COLOR]' % (self.highlight_color, str(round(float(i['progress'] * 100), 1)) + '%') except: labelProgress = label try: if int(re.sub(r'[^0-9]', '', str(i['premiered']))) > int(re.sub(r'[^0-9]', '', str(self.today_date))): labelProgress = '[COLOR %s][I]%s[/I][/COLOR]' % (self.unairedcolor, labelProgress) except: pass if i.get('traktHistory') is True: try: air_time = tools.Time.convert(stringTime=i.get('lastplayed', ''), zoneFrom='utc', zoneTo='local', formatInput='%Y-%m-%dT%H:%M:%S.000Z', formatOutput='%b %d %Y %I:%M %p') if air_time[12] == '0': air_time = air_time[:12] + '' + air_time[13:] labelProgress = labelProgress + '[COLOR %s] [%s][/COLOR]' % (self.highlight_color, air_time) except: pass sysname, systitle = quote_plus(label), quote_plus(title) meta = dict((k, v) for k, v in control.iteritems(i) if v is not None and v != '') meta.update({'code': imdb, 'imdbnumber': imdb, 'mediatype': 'movie', 'tag': [imdb, tmdb]}) try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass poster = meta.get('poster3') or meta.get('poster2') or meta.get('poster') or addonPoster fanart = '' if settingFanart: fanart = meta.get('fanart3') or meta.get('fanart2') or meta.get('fanart') or addonFanart landscape = meta.get('landscape') or fanart thumb = meta.get('thumb') or poster or landscape icon = meta.get('icon') or poster banner = meta.get('banner3') or meta.get('banner2') or meta.get('banner') or addonBanner art = {} if disable_player_art and hosts_mode == '2': # setResolvedUrl uses the selected ListItem so pop keys out here if user wants no player art for k in ('clearart', 'clearlogo', 'discart'): meta.pop(k, None) art.update({'icon': icon, 'thumb': thumb, 'banner': banner, 'poster': poster, 'fanart': fanart, 'landscape': landscape, 'clearlogo': meta.get('clearlogo', ''), 'clearart': meta.get('clearart', ''), 'discart': meta.get('discart', ''), 'keyart': meta.get('keyart', '')}) for k in ('poster2', 'poster3', 'fanart2', 'fanart3', 'banner2', 'banner3', 'trailer'): meta.pop(k, None) meta.update({'poster': poster, 'fanart': fanart, 'banner': banner}) ####-Context Menu and Overlays-#### cm = [] if self.traktCredentials: cm.append((traktManagerMenu, 'RunPlugin(%s?action=tools_traktManager&name=%s&imdb=%s)' % (sysaddon, sysname, imdb))) try: overlay = int(playcount.getMovieOverlay(indicators, imdb)) watched = (overlay == 5) if watched: cm.append((unwatchedMenu, 'RunPlugin(%s?action=playcount_Movie&name=%s&imdb=%s&query=4)' % (sysaddon, sysname, imdb))) meta.update({'playcount': 1, 'overlay': 5}) # lastplayed = trakt.watchedMoviesTime(imdb) # meta.update({'lastplayed': lastplayed}) else: cm.append((watchedMenu, 'RunPlugin(%s?action=playcount_Movie&name=%s&imdb=%s&query=5)' % (sysaddon, sysname, imdb))) meta.update({'playcount': 0, 'overlay': 4}) except: pass sysmeta, sysart = quote_plus(jsdumps(meta)), quote_plus(jsdumps(art)) url = '%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s' % (sysaddon, systitle, year, imdb, tmdb, sysmeta) sysurl = quote_plus(url) cm.append((playlistManagerMenu, 'RunPlugin(%s?action=playlist_Manager&name=%s&url=%s&meta=%s&art=%s)' % (sysaddon, sysname, sysurl, sysmeta, sysart))) cm.append((queueMenu, 'RunPlugin(%s?action=playlist_QueueItem&name=%s)' % (sysaddon, sysname))) cm.append((playbackMenu, 'RunPlugin(%s?action=alterSources&url=%s&meta=%s)' % (sysaddon, sysurl, sysmeta))) if hosts_mode == '1': cm.append(('Rescrape Item', 'RunPlugin(%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s&rescrape=true)' % (sysaddon, systitle, year, imdb, tmdb, sysmeta))) elif hosts_mode != '1': cm.append(('Rescrape Item', 'PlayMedia(%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s&rescrape=true)' % (sysaddon, systitle, year, imdb, tmdb, sysmeta))) cm.append((addToLibrary, 'RunPlugin(%s?action=library_movieToLibrary&name=%s&title=%s&year=%s&imdb=%s&tmdb=%s)' % (sysaddon, sysname, systitle, year, imdb, tmdb))) cm.append(('Find similar', 'ActivateWindow(10025,%s?action=movies&url=https://api.trakt.tv/movies/%s/related,return)' % (sysaddon, imdb))) cm.append((clearSourcesMenu, 'RunPlugin(%s?action=cache_clearSources)' % sysaddon)) cm.append(('[COLOR red]Venom Settings[/COLOR]', 'RunPlugin(%s?action=tools_openSettings)' % sysaddon)) #################################### if trailer: meta.update({'trailer': trailer}) else: meta.update({'trailer': '%s?action=trailer&type=%s&name=%s&year=%s&imdb=%s' % (sysaddon, 'movie', sysname, year, imdb)}) item = control.item(label=labelProgress, offscreen=True) if 'castandart' in i: item.setCast(i['castandart']) item.setArt(art) item.setUniqueIDs({'imdb': imdb, 'tmdb': tmdb}) item.setProperty('IsPlayable', isPlayable) if is_widget: item.setProperty('isVenom_widget', 'true') resumetime = Bookmarks().get(name=label, imdb=imdb, tmdb=tmdb, year=str(year), runtime=runtime, ck=True) # item.setProperty('TotalTime', str(meta['duration'])) # Adding this property causes the Kodi bookmark CM items to be added item.setProperty('ResumeTime', str(resumetime)) try: watched_percent = round(float(resumetime) / float(runtime) * 100, 1) # resumetime and runtime are both in seconds item.setProperty('PercentPlayed', str(watched_percent)) except: pass item.setInfo(type='video', infoLabels=control.metadataClean(meta)) item.addContextMenuItems(cm) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except: log_utils.error() if next: try: if not items: raise Exception() url = items[0]['next'] if not url: raise Exception() url_params = dict(parse_qsl(urlsplit(url).query)) if 'imdb.com' in url and 'start' in url_params: page = ' [I](%s)[/I]' % str(int(((int(url_params.get('start')) - 1) / int(self.count)) + 1)) else: page = ' [I](%s)[/I]' % url_params.get('page') nextMenu = '[COLOR skyblue]' + nextMenu + page + '[/COLOR]' u = urlparse(url).netloc.lower() if u not in self.tmdb_link: url = '%s?action=moviePage&url=%s' % (sysaddon, quote_plus(url)) elif u in self.tmdb_link: url = '%s?action=tmdbmoviePage&url=%s' % (sysaddon, quote_plus(url)) item = control.item(label=nextMenu, offscreen=True) icon = control.addonNext() item.setProperty('IsPlayable', 'false') item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon}) item.setProperty ('SpecialSort', 'bottom') control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: log_utils.error() control.content(syshandle, 'movies') control.directory(syshandle, cacheToDisc=True) control.sleep(500) views.setView('movies', {'skin.estuary': 55, 'skin.confluence': 500})
def super_info(self, i): try: if self.list[i]['metacache']: return imdb = self.list[i].get('imdb') ; tmdb = self.list[i].get('tmdb') try: item = tmdb_indexer.Movies().get_movie_request(tmdb, imdb) # api claims int rq'd. But imdb_id works for movies but not looking like it does for shows if not item and (not tmdb and imdb): trakt_ids = trakt.IdLookup('imdb', imdb, 'movie') if trakt_ids: tmdb = str(trakt_ids.get('tmdb', '')) if trakt_ids.get('tmdb') else '' if tmdb: item = tmdb_indexer.Movies().get_movie_request(tmdb, '') if not item: results = trakt.SearchMovie(title=quote_plus(self.list[i]['title']), year=self.list[i]['year'], fields='title', full=False) if results: ids = results[0].get('movie').get('ids') if not tmdb: tmdb = str(ids.get('tmdb', '')) if ids.get('tmdb') else '' if not imdb: imdb = str(ids.get('imdb', '')) if ids.get('imdb') else '' item = tmdb_indexer.Movies().get_movie_request(tmdb, imdb) if not item: return else: return except: log_utils.error() return title = item.get('title') or self.list[i]['title'] title = py_tools.ensure_str(title) originaltitle = title #add these so sources module may not have to make a trakt api request # aliases = item.get('alternative_titles').get('titles') # log_utils.log('aliases = %s' % str(aliases), __name__, log_utils.LOGDEBUG) if not imdb: imdb = str(item.get('imdb_id', '')) if item.get('imdb_id') else '' if not tmdb: tmdb = str(item.get('id', '')) if item.get('id') else '' if 'year' not in self.list[i] or not self.list[i]['year']: year = str(item.get('release_date')[:4]) if item.get('release_date') else '' else: year = self.list[i]['year'] if 'premiered' not in self.list[i] or not self.list[i]['premiered']: premiered = item.get('release_date', '') else: premiered = self.list[i]['premiered'] if premiered and year not in premiered: # hack fix for imdb vs. tmdb mismatch without a new request. premiered = premiered.replace(premiered[:4], year) if 'genre' not in self.list[i] or not self.list[i]['genre']: genre = [] for x in item['genres']: genre.append(x.get('name')) else: genre = self.list[i]['genre'] if 'duration' not in self.list[i] or not self.list[i]['duration']: duration = str(item.get('runtime', '')) if item.get('runtime') else '' else: duration = self.list[i]['duration'] if 'rating' not in self.list[i] or not self.list[i]['rating']: rating = str(item.get('vote_average', '')) if item.get('vote_average') else '' else: rating = self.list[i]['rating'] if 'votes' not in self.list[i] or not self.list[i]['votes']: votes = str(item.get('vote_count', '')) if item.get('vote_count') else '' else: votes = self.list[i]['votes'] if 'mpaa' not in self.list[i] or not self.list[i]['mpaa']: rel_info = [x for x in item['release_dates']['results'] if x['iso_3166_1'] == 'US'][0] try: mpaa = '' for cert in rel_info.get('release_dates', {}): if cert['certification']: # loop thru all keys mpaa = cert['certification'] break except: mpaa = '' else: mpaa = self.list[i]['mpaa'] if 'plot' not in self.list[i] or not self.list[i]['plot']: plot = py_tools.ensure_str(item.get('overview')) else: plot = self.list[i]['plot'] try: trailer = [x for x in item['videos']['results'] if x['site'] == 'YouTube' and x['type'] == 'Trailer'][0]['key'] trailer = control.trailer % trailer except: trailer = '' director = writer = '' poster3 = fanart3 = '' castandart = [] for person in item['credits']['cast']: try: castandart.append({'name': person['name'], 'role': person['character'], 'thumbnail': ((self.profile_path + person.get('profile_path')) if person.get('profile_path') else '')}) except: pass if len(castandart) == 150: break crew = item.get('credits', {}).get('crew') try: director = ', '.join([d['name'] for d in [x for x in crew if x['job'] == 'Director']]) except: director = '' try: writer = ', '.join([w['name'] for w in [y for y in crew if y['job'] in ['Writer', 'Screenplay', 'Author', 'Novel']]]) except: writer = '' poster3 = '%s%s' % (self.tmdb_poster, item['poster_path']) if item['poster_path'] else '' fanart3 = '%s%s' % (self.tmdb_fanart, item['backdrop_path']) if item['backdrop_path'] else '' try: if self.lang == 'en' or self.lang not in item.get('available_translations', [self.lang]): raise Exception() trans_item = trakt.getMovieTranslation(imdb, self.lang, full=True) title = trans_item.get('title') or title plot = trans_item.get('overview') or plot except: log_utils.error() item = {'title': title, 'originaltitle': originaltitle, 'year': year, 'imdb': imdb, 'tmdb': tmdb, 'premiered': premiered, 'genre': genre, 'duration': duration, 'rating': rating, 'votes': votes, 'mpaa': mpaa, 'director': director, 'writer': writer, 'castandart': castandart, 'plot': plot, 'poster2': '', 'poster3': poster3, 'banner': '', 'banner2': '', 'fanart2': '', 'fanart3': fanart3, 'clearlogo': '', 'clearart': '', 'landscape': '', 'discart': '', 'mediatype': 'movie', 'trailer': trailer, 'metacache': False} if not self.disable_fanarttv: extended_art = cache.get(fanarttv.get_movie_art, 168, imdb, tmdb) if extended_art: item.update(extended_art) if not item.get('landscape'): item.update({'landscape': fanart3}) item = dict((k, v) for k, v in control.iteritems(item) if v is not None and and v != '') self.list[i].update(item) meta = {'imdb': imdb, 'tmdb': tmdb, 'tvdb': '', 'lang': self.lang, 'user': self.user, 'item': item} self.meta.append(meta) except: log_utils.error()
def imdb_list(self, url, isRatinglink=False): list = [] try: for i in re.findall(r'date\[(\d+)\]', url): url = url.replace('date[%s]' % i, (self.date_time - timedelta(days=int(i))).strftime('%Y-%m-%d')) def imdb_watchlist_id(url): return client.parseDOM(client.request(url), 'meta', ret='content', attrs = {'property': 'pageId'})[0] # return client.parseDOM(client.request(url).decode('iso-8859-1').encode('utf-8'), 'meta', ret='content', attrs = {'property': 'pageId'})[0] if url == self.imdbwatchlist_link: url = cache.get(imdb_watchlist_id, 8640, url) url = self.imdblist_link % url result = client.request(url) result = result.replace('\n', ' ') # result = result.decode('iso-8859-1').encode('utf-8') items = client.parseDOM(result, 'div', attrs = {'class': '.+? lister-item'}) + client.parseDOM(result, 'div', attrs = {'class': 'lister-item .+?'}) items += client.parseDOM(result, 'div', attrs = {'class': 'list_item.+?'}) except: log_utils.error() return next = '' try: # HTML syntax error, " directly followed by attribute name. Insert space in between. parseDOM can otherwise not handle it. result = result.replace('"class="lister-page-next', '" class="lister-page-next') # next = client.parseDOM(result, 'a', ret='href', attrs = {'class': '.+?ister-page-nex.+?'}) next = client.parseDOM(result, 'a', ret='href', attrs = {'class': 'lister-page-next.+?'}) if len(next) == 0: next = client.parseDOM(result, 'div', attrs = {'class': 'pagination'})[0] next = zip(client.parseDOM(next, 'a', ret='href'), client.parseDOM(next, 'a')) next = [i[0] for i in next if 'Next' in i[1]] next = url.replace(urlparse(url).query, urlparse(next[0]).query) next = client.replaceHTMLCodes(next) except: next = '' for item in items: try: title = client.replaceHTMLCodes(client.parseDOM(item, 'a')[1]) title = py_tools.ensure_str(title) year = client.parseDOM(item, 'span', attrs = {'class': 'lister-item-year.+?'}) try: year = re.findall(r'(\d{4})', year[0])[0] except: continue if int(year) > int((self.date_time).strftime('%Y')): continue try: show = '–'.decode('utf-8') in str(year).decode('utf-8') or '-'.decode('utf-8') in str(year).decode('utf-8') # check with Matrix except: show = False if show or 'Episode:' in item: raise Exception() # Some lists contain TV shows. try: genre = client.parseDOM(item, 'span', attrs = {'class': 'genre'})[0] except: genre = '' genre = ' / '.join([i.strip() for i in genre.split(',')]) genre = client.replaceHTMLCodes(genre) try: mpaa = client.parseDOM(item, 'span', attrs = {'class': 'certificate'})[0] except: mpaa = '' if isRatinglink and 'Short' not in genre: if mpaa in ['TV-Y', 'TV-Y7', 'TV-G', 'TV-PG', 'TV-13', 'TV-14', 'TV-MA']: raise Exception() if mpaa == '' or mpaa == 'NOT_RATED': mpaa = '' mpaa = mpaa.replace('_', '-') mpaa = client.replaceHTMLCodes(mpaa) imdb = client.parseDOM(item, 'a', ret='href')[0] imdb = re.findall(r'(tt\d*)', imdb)[0] try: # parseDOM cannot handle elements without a closing tag. from bs4 import BeautifulSoup html = BeautifulSoup(item, "html.parser") poster = html.find_all('img')[0]['loadlate'] except: poster = '' if '/nopicture/' in poster: poster = '' if poster: poster = re.sub(r'(?:_SX|_SY|_UX|_UY|_CR|_AL)(?:\d+|_).+?\.', '_SX500.', poster) poster = client.replaceHTMLCodes(poster) try: duration = re.findall(r'(\d+?) min(?:s|)', item)[-1] except: duration = '' rating = '' try: rating = client.parseDOM(item, 'span', attrs = {'class': 'rating-rating'})[0] except: try: rating = client.parseDOM(rating, 'span', attrs = {'class': 'value'})[0] except: try: rating = client.parseDOM(item, 'div', ret='data-value', attrs = {'class': '.*?imdb-rating'})[0] except: pass if rating == '-': rating = '' if not rating: try: rating = client.parseDOM(item, 'span', attrs = {'class': 'ipl-rating-star__rating'})[0] if rating == '-': rating = '' except: pass rating = client.replaceHTMLCodes(rating) votes = '' try: votes = client.parseDOM(item, 'span', attrs = {'name': 'nv'})[0] except: try: votes = client.parseDOM(item, 'div', ret='title', attrs = {'class': '.*?rating-list'})[0] except: try: votes = re.findall(r'\((.+?) vote(?:s|)\)', votes)[0] except: pass votes = client.replaceHTMLCodes(votes) try: director = re.findall(r'Director(?:s|):(.+?)(?:\||</div>)', item)[0] except: director = '' director = client.parseDOM(director, 'a') director = ' / '.join(director) director = client.replaceHTMLCodes(director) # check if this needs ensure_str() plot = '' try: plot = client.parseDOM(item, 'p', attrs = {'class': 'text-muted'})[0] except: try: plot = client.parseDOM(item, 'div', attrs = {'class': 'item_description'})[0] except: pass plot = plot.rsplit('<span>', 1)[0].strip() plot = re.sub(r'<.+?>|</.+?>', '', plot) if not plot: try: plot = client.parseDOM(item, 'div', attrs = {'class': 'lister-item-content'})[0] # not sure on this, check html plot = re.sub(r'<p\s*class="">', '<p class="plot_">', plot) plot = client.parseDOM(plot, 'p', attrs = {'class': 'plot_'})[0] plot = re.sub(r'<.+?>|</.+?>', '', plot) except: pass plot = client.cleanHTML(plot) values = {} values = {'content': 'movie', 'title': title, 'originaltitle': title, 'year': year, 'premiered': premiered, 'studio': '', 'genre': genre, 'duration': duration, 'rating': rating, 'votes': votes, 'mpaa': mpaa, 'director': director, 'writer': writer, 'cast': cast, 'plot': plot, 'code': tmdb, 'imdb': imdb, 'tmdb': tmdb, 'tvdb': '', 'poster': poster, 'poster2': '', 'poster3': '', 'banner': '', 'fanart': '', 'fanart2': '', 'fanart3': '', 'clearlogo': '', 'clearart': '', 'landscape': '', 'metacache': False, 'next': next} meta = {'imdb': imdb, 'tmdb': tmdb, 'tvdb': '', 'lang': self.lang, 'user': self.tmdb_key, 'item': values} if not self.disable_fanarttv: extended_art = cache.get(fanarttv.get_movie_art, 168, imdb, tmdb) if extended_art: values.update(extended_art) meta.update(values) values = dict((k, v) for k, v in control.iteritems(values) if v is not None and v != '') self.list.append(values) if 'next' in meta.get('item'): del meta['item']['next'] # next can not exist in metacache self.meta.append(meta) self.meta = [i for i in self.meta if i.get('tmdb')] # without this ui removed missing tmdb but it still writes these cases to metacache? metacache.insert(self.meta) # don't insert until cleaned up and can also be fetched. except: log_utils.error() return self.list
def play_source(self, title, year, season, episode, imdb, tmdb, tvdb, url, meta, select=None): try: if not url: raise Exception self.media_type = 'movie' if season is None or episode is None else 'episode' self.title = title self.year = str(year) if self.media_type == 'movie': self.name = '%s (%s)' % (title, self.year) self.season = None self.episode = None elif self.media_type == 'episode': self.name = '%s S%02dE%02d' % (title, int(season), int(episode)) self.season = '%01d' % int(season) self.episode = '%01d' % int(episode) self.DBID = None self.imdb = imdb if imdb is not None else '' self.tmdb = tmdb if tmdb is not None else '' self.tvdb = tvdb if tvdb is not None else '' self.ids = { 'imdb': self.imdb, 'tmdb': self.tmdb, 'tvdb': self.tvdb } ## - compare meta received to database and use largest(eventually switch to a request to fetch missing db meta for item) self.imdb_user = control.setting('imdb.user').replace('ur', '') self.tmdb_key = control.setting('tmdb.api.key') if not self.tmdb_key: self.tmdb_key = '3320855e65a9758297fec4f7c9717698' self.tvdb_key = control.setting('tvdb.api.key') if self.media_type == 'episode': self.user = str(self.imdb_user) + str(self.tvdb_key) else: self.user = str(self.tmdb_key) self.lang = control.apiLanguage()['tvdb'] meta1 = meta meta2 = metacache.fetch([{ 'imdb': self.imdb, 'tmdb': self.tmdb, 'tvdb': self.tvdb }], self.lang, self.user)[0] if meta2 != self.ids: meta2 = dict((k, v) for k, v in control.iteritems(meta2) if v is not None and v != '') if meta1 is not None: try: if len(meta2) > len(meta1): meta2.update(meta1) meta = meta2 else: meta = meta1 except: log_utils.error() else: meta = meta2 if meta2 != self.ids else meta1 ################## self.meta = meta poster, thumb, season_poster, fanart, banner, clearart, clearlogo, discart, meta = self.getMeta( meta) runtime = meta.get('duration') if meta else 0 self.offset = Bookmarks().get(name=self.name, imdb=imdb, tmdb=tmdb, tvdb=tvdb, season=season, episode=episode, year=self.year, runtime=runtime) item = control.item(path=url) item.setUniqueIDs(self.ids) if control.setting('disable.player.art') == 'true': for k in ('clearart', 'clearlogo', 'discart'): meta.pop(k, None) if self.media_type == 'episode': if control.setting('disable.player.art') == 'true': item.setArt({ 'thumb': thumb, 'tvshow.poster': season_poster, 'season.poster': season_poster, 'tvshow.fanart': fanart }) else: item.setArt({ 'tvshow.clearart': clearart, 'tvshow.clearlogo': clearlogo, 'tvshow.discart': discart, 'thumb': thumb, 'tvshow.poster': season_poster, 'season.poster': season_poster, 'tvshow.fanart': fanart }) else: if control.setting('disable.player.art') == 'true': item.setArt({ 'thumb': thumb, 'poster': poster, 'fanart': fanart }) else: item.setArt({ 'clearart': clearart, 'clearlogo': clearlogo, 'discart': discart, 'thumb': thumb, 'poster': poster, 'fanart': fanart }) if 'castandart' in meta: item.setCast(meta.get('castandart', '')) item.setInfo(type='video', infoLabels=control.metadataClean(meta)) if 'plugin' not in control.infoLabel( 'Container.PluginName') or select != '1': control.busy() control.resolve(int(argv[1]), True, item) elif select == '1': control.busy() control.player.play(url, item) control.homeWindow.setProperty('script.trakt.ids', jsdumps(self.ids)) self.keepAlive() control.homeWindow.clearProperty('script.trakt.ids') except: log_utils.error() return control.cancelPlayback()
def items_list(i): # if i['metacache']: return try: next, title, year, tmdb, poster, fanart, premiered, rating, votes, plot = \ i['next'], i['title'], i['year'], i['tmdb'], i['poster'], i['fanart'], i['premiered'], i['rating'], i['votes'], i['plot'] url = self.details_link % tmdb item = get_request(url) tvdb = str(item.get('external_ids').get('tvdb_id', '0')) if not tvdb or tvdb == 'None': tvdb = '0' imdb = item.get('external_ids').get('imdb_id', '0') if not imdb or imdb == 'None': imdb = '0' genre = [] for x in item['genres']: genre.append(x.get('name')) if genre == []: genre = 'NA' try: duration = str(item.get('episode_run_time', '0')[0]) except: duration = '0' if duration == 'None': duration = '0' try: mpaa = [ x['rating'] for x in item['content_ratings']['results'] if x['iso_3166_1'] == 'US' ][0] except: try: mpaa = item['content_ratings'][0]['rating'] except: mpaa = 'NR' status = item.get('status', '0') try: studio = item.get('networks', None)[0]['name'] except: studio = '0' try: total_seasons = int(item.get('number_of_seasons', '')) except: total_seasons = 0 credits = item['credits'] director = writer = '0' for person in credits['crew']: if 'Director' in person['job']: # director = ', '.join([director['name'].encode('utf-8') for director in credits['crew'] if director['job'].lower() == 'director']) director = ', '.join([ director['name'] for director in credits['crew'] if director['job'].lower() == 'director' ]) if person['job'] in [ 'Writer', 'Screenplay', 'Author', 'Novel' ]: # writer = ', '.join([writer['name'].encode('utf-8') for writer in credits['crew'] if writer['job'].lower() in ['writer', 'screenplay', 'author', 'novel']]) writer = ', '.join([ writer['name'] for writer in credits['crew'] if writer['job'].lower() in ['writer', 'screenplay', 'author', 'novel'] ]) castandart = [] for person in item['credits']['cast']: try: # try: castandart.append({'name': person['name'].encode('utf-8'), 'role': person['character'].encode('utf-8'), 'thumbnail': ((poster_path + person.get('profile_path')) if person.get('profile_path') is not None else '0')}) # except: castandart.append({'name': person['name'], 'role': person['character'], 'thumbnail': ((poster_path + person.get('profile_path')) if person.get('profile_path') is not None else '0')}) castandart.append({ 'name': person['name'], 'role': person['character'], 'thumbnail': ((poster_path + person.get('profile_path')) if person.get('profile_path') is not None else '0') }) except: castandart = [] if len(castandart) == 150: break values = { 'content': 'tvshow', 'title': title, 'originaltitle': title, 'year': year, 'premiered': premiered, 'studio': studio, 'genre': genre, 'duration': duration, 'rating': rating, 'votes': votes, 'mpaa': mpaa, 'status': status, 'director': director, 'writer': writer, 'castandart': castandart, 'plot': plot, 'code': tmdb, 'imdb': imdb, 'tmdb': tmdb, 'tvdb': tvdb, 'poster': poster, 'poster2': '0', 'poster3': '0', 'banner': '0', 'banner2': '0', 'fanart': fanart, 'fanart2': '0', 'fanart3': '0', 'clearlogo': '0', 'clearart': '0', 'landscape': fanart, 'total_seasons': total_seasons, 'metacache': False, 'next': next } meta = { 'imdb': imdb, 'tmdb': tmdb, 'tvdb': tvdb, 'lang': self.lang, 'user': self.user, 'item': values } if disable_fanarttv != 'true': from resources.lib.indexers import fanarttv extended_art = cache.get(fanarttv.get_tvshow_art, 168, tvdb) if extended_art: values.update(extended_art) meta.update(values) values = dict((k, v) for k, v in control.iteritems(values) if v and v != '0') self.list.append(values) if 'next' in meta.get('item'): del meta['item']['next'] self.meta.append(meta) metacache.insert(self.meta) except: log_utils.error()