Esempio n. 1
0
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()
Esempio n. 2
0
	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
Esempio n. 3
0
	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()
Esempio n. 4
0
 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,
     ]
Esempio n. 5
0
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()
Esempio n. 6
0
		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()
Esempio n. 7
0
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
Esempio n. 8
0
        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})
Esempio n. 10
0
 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})
Esempio n. 11
0
    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()
Esempio n. 12
0
        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()
Esempio n. 13
0
        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()
Esempio n. 14
0
	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})
Esempio n. 15
0
 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)
Esempio n. 16
0
	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})
Esempio n. 17
0
	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()
Esempio n. 18
0
	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
Esempio n. 19
0
    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()
Esempio n. 20
0
        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()