# -*- coding: utf-8 -*- # vStream https://github.com/Kodi-vStream/venom-xbmc-addons try: # Python 2 import urllib2 except ImportError: # Python 3 import urllib.request as urllib2 import datetime import re import time import unicodedata import xbmc from resources.lib.comaddon import addon, dialog, progress, VSlog from resources.lib.gui.gui import cGui from resources.lib.gui.guiElement import cGuiElement from resources.lib.handler.inputParameterHandler import cInputParameterHandler from resources.lib.handler.outputParameterHandler import cOutputParameterHandler from resources.lib.handler.rechercheHandler import cRechercheHandler from resources.lib.handler.requestHandler import cRequestHandler from resources.lib.util import Quote try: import json except: import simplejson as json SITE_IDENTIFIER = 'cTrakt' SITE_NAME = 'Trakt' URL_API = 'https://api.trakt.tv/' API_KEY = '7139b7dace25c7bdf0bd79acf46fb02bd63310548b1f671d88832f75a4ac3dd6' API_SECRET = 'bb02b2b0267b045590bc25c21dac21b1c47446a62b792091b3275e9c4a943e74' API_VERS = '2' MAXRESULT = 10 class cTrakt: CONTENT = '0' ADDON = addon() DIALOG = dialog() def __init__(self): # self.__sFile = cConfig().getFileFav() self.__sTitle = '' self.__sAction = '' self.__sType = '' # self.__sFunctionName = '' def getToken(self): headers = {'Content-Type': 'application/json'} post = {'client_id': API_KEY} try: post = json.dumps(post).encode('utf-8') except: post = json.dumps(post) req = urllib2.Request(URL_API + 'oauth/device/code', post, headers) response = urllib2.urlopen(req) sHtmlContent = response.read() result = json.loads(sHtmlContent) response.close() # {"device_code":"a434135042b5a76159628bc974eed2f266fb47df9f438d5738ce40396d531490", "user_code":"EBDFD843", "verification_url":"https://trakt.tv/activate", "expires_in":600, "interval":5} total = len(sHtmlContent) if (total > 0): # self.__Token = result['token'] sText = (self.ADDON.VSlang(30304)) % (result['verification_url'], result['user_code']) oDialog = self.DIALOG.VSyesno(sText) if (oDialog == 0): return False if (oDialog == 1): try: headers = {'Content-Type': 'application/json'} post = {'client_id': API_KEY, 'client_secret': API_SECRET, 'code': result['device_code']} try: post = json.dumps(post).encode('utf-8') except: post = json.dumps(post) req = urllib2.Request(URL_API + 'oauth/device/token', post, headers) response = urllib2.urlopen(req) sHtmlContent = response.read() result = json.loads(sHtmlContent) response.close() if result['access_token']: self.ADDON.setSetting('bstoken', str(result['access_token'])) self.DIALOG.VSinfo(self.ADDON.VSlang(30000)) return except: pass # xbmc.executebuiltin('Container.Refresh') return return def search(self): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'https://') oOutputParameterHandler.addParameter('type', 'movie') oGui.addDir('themoviedb_org', 'showSearchMovie', self.ADDON.VSlang(30423), 'films.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'https://') oOutputParameterHandler.addParameter('type', 'show') oGui.addDir('themoviedb_org', 'showSearchSerie', self.ADDON.VSlang(30424), 'series.png', oOutputParameterHandler) oGui.setEndOfDirectory() def getLoad(self): # pour regen le token() # self.getToken() oGui = cGui() if self.ADDON.getSetting('bstoken') == '': VSlog('bstoken invalid') oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'https://') oOutputParameterHandler.addParameter('type', 'movie') oGui.addDir(SITE_IDENTIFIER, 'getToken()', self.ADDON.VSlang(30305), 'trakt.png', oOutputParameterHandler) else: # nom de l'user headers = {'Content-Type': 'application/json', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS, 'Authorization': 'Bearer %s' % self.ADDON.getSetting('bstoken')} # post = {'client_id': API_KEY, 'client_secret': API_SECRET, 'code': result['device_code']} # post = json.dumps(post) try: req = urllib2.Request(URL_API + 'users/me', None, headers) response = urllib2.urlopen(req) except: return self.getToken() sHtmlContent = response.read() result = json.loads(sHtmlContent) response.close() total = len(sHtmlContent) if (total > 0): sUsername = result['username'] oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'https://') oGui.addText(SITE_IDENTIFIER, (self.ADDON.VSlang(30306)) % sUsername) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'https://') oOutputParameterHandler.addParameter('type', 'movie') oGui.addDir(SITE_IDENTIFIER, 'search', self.ADDON.VSlang(30330), 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'https://') oOutputParameterHandler.addParameter('type', 'movie') oGui.addDir(SITE_IDENTIFIER, 'getLists', self.ADDON.VSlang(30120), 'films.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'https://') oOutputParameterHandler.addParameter('type', 'show') oGui.addDir(SITE_IDENTIFIER, 'getLists', self.ADDON.VSlang(30121), 'series.png', oOutputParameterHandler) if self.ADDON.getSetting('trakt_show_lists'): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'https://') oOutputParameterHandler.addParameter('type', 'custom-lists') oGui.addDir(SITE_IDENTIFIER, 'getLists', self.ADDON.VSlang(30360), 'trakt.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_API + 'users/me/history?page=1&limit=' + str(MAXRESULT)) oGui.addDir(SITE_IDENTIFIER, 'getTrakt', self.ADDON.VSlang(30308), 'trakt.png', oOutputParameterHandler) # oOutputParameterHandler = cOutputParameterHandler() # oOutputParameterHandler.addParameter('siteUrl', URL_API + 'users/me/watching') # oGui.addDir(SITE_IDENTIFIER, 'getBseries', 'Actuellement', 'mark.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_API + 'oauth/revoke') oGui.addDir(SITE_IDENTIFIER, 'getCalendrier', self.ADDON.VSlang(30331), 'trakt.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_API + 'oauth/revoke') oGui.addDir(SITE_IDENTIFIER, 'getBsout', self.ADDON.VSlang(30309), 'trakt.png', oOutputParameterHandler) oGui.setEndOfDirectory() def getCalendrier(self): oGui = cGui() today_date = str(datetime.datetime.now().date()) # DANGER ca rame, freeze liste = [] liste.append(['Mes sorties sur les 7 jours à venir', URL_API + 'calendars/my/shows/' + today_date + '/7']) liste.append(['Mes sorties sur les 30 jours à venir', URL_API + 'calendars/my/shows/' + today_date + '/30']) liste.append(['Nouveautées sur 7 jours', URL_API + 'calendars/all/shows/new/' + today_date + '/7']) # liste.append(['Freeze - Nouveautées sur la journée à venir', URL_API + 'calendars/all/shows/' + today_date + '/1']) for sTitle, sUrl in liste: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'getTrakt', sTitle, 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def getLists(self): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sType = oInputParameterHandler.getValue('type') headers = {'Content-Type': 'application/json', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS, 'Authorization': 'Bearer %s' % self.ADDON.getSetting('bstoken')} # stats user req2 = urllib2.Request(URL_API + 'users/me/stats', None, headers) response2 = urllib2.urlopen(req2) sHtmlContent2 = response2.read() result2 = json.loads(sHtmlContent2) response2.close() # total2 = len(sHtmlContent2) liste = [] if sType == 'movie': liste.append(['%s (%s)' % (self.ADDON.VSlang(30310), result2['movies']['collected']), URL_API + 'users/me/collection/movies?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_movies_show_watchlist') == 'true': liste.append([self.ADDON.VSlang(30311), URL_API + 'users/me/watchlist/movies?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_movies_show_watched') == 'true': liste.append(['%s (%s)' % (self.ADDON.VSlang(30312), result2['movies']['watched']), URL_API + 'users/me/watched/movies?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_movies_show_recommended') == 'true': liste.append([self.ADDON.VSlang(30313), URL_API + 'recommendations/movies']) if self.ADDON.getSetting('trakt_movies_show_boxoffice') == 'true': liste.append([self.ADDON.VSlang(30314), URL_API + 'movies/boxoffice']) if self.ADDON.getSetting('trakt_movies_show_popular') == 'true': liste.append([self.ADDON.VSlang(30315), URL_API + 'movies/popular?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_movies_show_most_weekly') == 'true': liste.append([self.ADDON.VSlang(30316), URL_API + 'movies/played/weekly?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_movies_show_most_monthly') == 'true': liste.append([self.ADDON.VSlang(30317), URL_API + 'movies/played/monthly?page=1&limit=' + str(MAXRESULT)]) # liste.append(['historique de Films', URL_API + 'users/me/history/movies']) elif sType == 'show': liste.append(['%s (%s)' % (self.ADDON.VSlang(30310), result2['shows']['collected']), URL_API + 'users/me/collection/shows?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_tvshows_show_watchlist') == 'true': liste.append([self.ADDON.VSlang(30311), URL_API + 'users/me/watchlist/shows?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_tvshows_show_watchlist_seasons') == 'true': liste.append([self.ADDON.VSlang(30318), URL_API + 'users/me/watchlist/seasons?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_tvshows_show_watchlist_episodes') == 'true': liste.append([self.ADDON.VSlang(30319), URL_API + 'users/me/watchlist/episodes?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_tvshows_show_watched') == 'true': liste.append(['%s (%s)' % (self.ADDON.VSlang(30312), result2['shows']['watched']), URL_API + 'users/me/watched/shows?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_tvshows_show_recommended') == 'true': liste.append([self.ADDON.VSlang(30313), URL_API + 'recommendations/shows']) if self.ADDON.getSetting('trakt_tvshows_show_popular') == 'true': liste.append([self.ADDON.VSlang(30315), URL_API + 'shows/popular?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_tvshows_show_most_weekly') == 'true': liste.append([self.ADDON.VSlang(30316), URL_API + 'shows/played/weekly?page=1&limit=' + str(MAXRESULT)]) if self.ADDON.getSetting('trakt_tvshows_show_most_monthly') == 'true': liste.append([self.ADDON.VSlang(30317), URL_API + 'shows/played/monthly?page=1&limit=' + str(MAXRESULT)]) # liste.append(['Historique de séries', URL_API + 'users/me/history/shows']) elif sType == 'custom-lists': request = urllib2.Request(URL_API + 'users/me/lists', headers=headers) response_lists = urllib2.urlopen(request).read() json_lists = json.loads(response_lists) for List in json_lists: url = URL_API + 'users/me/lists/' + List['ids']['slug'] + '/items' liste.append([self.decode((List['name'] + ' (' + str(List['item_count']) + ')')), url]) for sTitle, sUrl in liste: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'getTrakt', sTitle, 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def getBsout(self): # oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') headers = {'Content-Type': 'application/x-www-form-urlencoded', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS, 'Authorization': 'Bearer %s' % self.ADDON.getSetting('bstoken')} post = {'token': self.ADDON.getSetting('bstoken')} post = json.dumps(post) req = urllib2.Request(sUrl, post, headers) response = urllib2.urlopen(req) sHtmlContent = response.read() result = json.loads(sHtmlContent) response.close() total = len(sHtmlContent) if (total > 0): self.ADDON.setSetting('bstoken', '') self.DIALOG.VSinfo(self.ADDON.VSlang(30320)) xbmc.executebuiltin('Container.Refresh') return def decode(self, elem, Unicode=False): if xbmc.getInfoLabel('system.buildversion')[0:2] >= '19': return elem else: if Unicode == True: try: elem = unicodedata.normalize('NFD', unicode(elem)).encode('ascii', 'ignore').decode('unicode_escape') except UnicodeDecodeError: elem = elem.decode('utf-8') except: pass return elem.encode('utf-8') def getTrakt(self, url2=None): oGui = cGui() oInputParameterHandler = cInputParameterHandler() if url2: sUrl = url2 else: sUrl = oInputParameterHandler.getValue('siteUrl') headers = {'Content-Type': 'application/json', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS, 'Authorization': 'Bearer %s' % self.ADDON.getSetting('bstoken')} # post = {'extended': 'metadata'} # post = json.dumps(post) req = urllib2.Request(sUrl, None, headers) response = urllib2.urlopen(req) sHtmlContent = response.read() sHeaders = response.headers response.close() result = json.loads(sHtmlContent) sPage = '1' sMaxPage = '1' if 'X-Pagination-Page' in sHeaders: sPage = sHeaders['X-Pagination-Page'] if 'X-Pagination-Page-Count' in sHeaders: sMaxPage = sHeaders['X-Pagination-Page-Count'] total = len(result) sKey = 0 sFunction = 'getLoad' sId = SITE_IDENTIFIER searchtext = '' sTitle = '' if (total > 0): progress_ = progress().VScreate(SITE_NAME) for i in result: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break if 'collection' in sUrl: if 'show' in i: show = i['show'] sTitle = self.getLocalizedTitle(show, 'shows') sTrakt, sYear, sImdb, sTmdb, sDate = show['ids']['trakt'], show['year'], show['ids']['imdb'], show['ids']['tmdb'], i['last_collected_at'] # sDate = datetime.datetime(*(time.strptime(sDate, '%Y-%m-%dT%H:%M:%S.%fZ')[0:6])).strftime('%d-%m-%Y %H:%M') cTrakt.CONTENT = '2' sFunction = 'getBseasons' else: movie = i['movie'] sTitle = self.getLocalizedTitle(movie, 'movies') sTrakt, sYear, sImdb, sTmdb, sDate = movie['ids']['trakt'], movie['year'], movie['ids']['imdb'], movie['ids']['tmdb'], i['collected_at'] # sDate = datetime.datetime(*(time.strptime(sDate, '%Y-%m-%dT%H:%M:%S.%fZ')[0:6])).strftime('%d-%m-%Y %H:%M') cTrakt.CONTENT = '1' sFunction = 'showSearch' sId = 'globalSearch' sTitle = self.decode(sTitle) searchtext = ('%s') % (sTitle) if sYear: sFile = ('%s - (%s)') % (sTitle, int(sYear)) sTitle = ('%s - (%s)') % (sTitle, int(sYear)) else: sFile = ('%s') % (sTitle) sTitle = ('%s') % (sTitle) elif 'history' in sUrl: # commun sFunction = 'showSearch' sId = 'globalSearch' # 2016-11-16T09:21:18.000Z # sDate = datetime.datetime(*(time.strptime(i['watched_at'], '%Y-%m-%dT%H:%M:%S.%fZ')[0:6])).strftime('%d-%m-%Y') if 'episode' in i: sType = 'Episode' eps = i['episode'] sTitle = self.getLocalizedTitle(i, 'episodes') sTrakt, sImdb, sTmdb, sSeason, sNumber = eps['ids']['trakt'], eps['ids']['imdb'], eps['ids']['tmdb'], eps['season'], eps['number'] sExtra = ('(S%02dE%02d)') % (sSeason, sNumber) cTrakt.CONTENT = '2' else: sType = 'Film' movie = i['movie'] sTitle = self.getLocalizedTitle(movie, 'movies') sTrakt, sImdb, sTmdb, sYear = movie['ids']['trakt'], movie['ids']['imdb'], movie['ids']['tmdb'], movie['year'] sExtra = ('(%s)') % (sYear) cTrakt.CONTENT = '1' sTitle = self.decode(sTitle,Unicode=True) searchtext = ('%s') % (sTitle) sFile = ('%s - (%s)') % (sTitle, sExtra) sTitle = ('[COLOR gold]%s %s [/COLOR]- %s %s') % (sType, 'vu', sTitle, sExtra) elif 'watchlist' in sUrl: # commun sFunction = 'showSearch' sId = 'globalSearch' # 2016-11-16T09:21:18.000Z # sDate = datetime.datetime(*(time.strptime(i['listed_at'], '%Y-%m-%dT%H:%M:%S.%fZ')[0:6])).strftime('%d-%m-%Y %H:%M') if 'show' in i: show = i['show'] sTitle = self.getLocalizedTitle(show, 'shows') sTrakt, sImdb, sTmdb, sYear = show['ids']['trakt'], show['ids']['imdb'], show['ids']['tmdb'], show['year'] sExtra = ('(%s)') % (sYear) cTrakt.CONTENT = '2' elif 'episode' in i: eps = i['episode'] sTitle = self.getLocalizedTitle(i, 'episodes') sTrakt, sImdb, sTmdb, sSeason, sNumber = eps['ids']['trakt'], eps['ids']['imdb'], eps['ids']['tmdb'], eps['season'], eps['number'] sExtra = ('(S%02dE%02d)') % (sSeason, sNumber) cTrakt.CONTENT = '2' else: movie = i['movie'] sTitle = self.getLocalizedTitle(movie, 'movies') sTrakt, sImdb, sTmdb, sYear = movie['ids']['trakt'], movie['ids']['imdb'], movie['ids']['tmdb'], movie['year'] sExtra = ('(%s)') % (sYear) cTrakt.CONTENT = '1' sTitle = self.decode(sTitle,Unicode=True) searchtext = ('%s') % (sTitle) sFile = ('%s %s') % (sTitle, sExtra) sTitle = ('%s %s') % (sTitle, sExtra) elif 'watched' in sUrl: # commun sLast_watched_at, sPlays = i['last_watched_at'], i['plays'] # 2016-11-16T09:21:18.000Z # sDate = datetime.datetime(*(time.strptime(sLast_watched_at, '%Y-%m-%dT%H:%M:%S.%fZ')[0:6])).strftime('%d-%m-%Y %H:%M') if 'show' in i: show = i['show'] sTitle = self.getLocalizedTitle(show, 'shows') sTrakt, sImdb, sTmdb, sYear = show['ids']['trakt'], show['ids']['imdb'], show['ids']['tmdb'], show['year'] cTrakt.CONTENT = '2' sFunction = 'getBseasons' else: movie = i['movie'] sTitle = self.getLocalizedTitle(movie, 'movies') sTrakt, sImdb, sTmdb, sYear = movie['ids']['trakt'], movie['ids']['imdb'], movie['ids']['tmdb'], movie['year'] cTrakt.CONTENT = '1' sFunction = 'showSearch' sId = 'globalSearch' if sTitle: sTitle = self.decode(sTitle,Unicode=True) searchtext = ('%s') % (sTitle) sFile = ('%s - %s') % (sTitle, sYear) sTitle = ('%s Lectures - %s (%s)') % (sPlays, sTitle, sYear) elif 'played' in sUrl: # commun sWatcher_count, sPlay_count, sCollected_count = i['watcher_count'], i['play_count'], i['collected_count'] sFunction = 'showSearch' sId = 'globalSearch' if 'show' in i: show = i['show'] sTitle = self.getLocalizedTitle(show, 'shows') sTrakt, sImdb, sTmdb, sYear = show['ids']['trakt'], show['ids']['imdb'], show['ids']['tmdb'], show['year'] cTrakt.CONTENT = '2' else: movie = i['movie'] sTitle = self.getLocalizedTitle(movie, 'movies') sTrakt, sImdb, sTmdb, sYear = movie['ids']['trakt'], movie['ids']['imdb'], movie['ids']['tmdb'], movie['year'] cTrakt.CONTENT = '1' sTitle = self.decode(sTitle) searchtext = ('%s') % (sTitle) sFile = ('%s - (%s)') % (sTitle, int(sYear)) sTitle = ('%s - (%s)') % (sTitle, int(sYear)) elif 'calendars' in sUrl: if 'show' in i: show = i['show'] sTitle = self.getLocalizedTitle(show, 'shows') sTrakt, sImdb, sTmdb, sYear, sFirst_aired = show['ids']['trakt'], show['ids']['imdb'], show['ids']['tmdb'], show['year'], i['first_aired'] sSaison, sEpisode = i['episode']['season'], i['episode']['number'] cTrakt.CONTENT = '2' else: movie = i['movie'] sTitle = self.getLocalizedTitle(movie, 'movies') sTrakt, sImdb, sTmdb, sYear, sFirst_aired = movie['ids']['trakt'], movie['ids']['imdb'], movie['ids']['tmdb'], movie['year'], i['first_aired'] cTrakt.CONTENT = '1' if sTitle: sDate = datetime.datetime(*(time.strptime(sFirst_aired, '%Y-%m-%dT%H:%M:%S.%fZ')[0:6])).strftime('%d-%m-%Y') sTitle = self.decode(sTitle) searchtext = ('%s') % (sTitle) sFile = ('%s - (%s)') % (sTitle, sYear) sTitle = ('%s - %s (S%02dE%02d)') % (sDate, self.decode(sTitle, Unicode=True), sSaison, sEpisode) sFunction = 'showSearch' sId = 'globalSearch' elif 'search' in sUrl: if 'show' in i: show = i['show'] sTitle = self.getLocalizedTitle(show, 'shows') sTrakt, sImdb, sTmdb, sYear = show['ids']['trakt'], show['ids']['imdb'], show['ids']['tmdb'], show['year'] cTrakt.CONTENT = '2' sFunction = 'getBseasons' else: movie = i['movie'] sTitle = self.getLocalizedTitle(movie, 'movies') sTrakt, sImdb, sTmdb, sYear = movie['ids']['trakt'], movie['ids']['imdb'], movie['ids']['tmdb'], movie['year'] cTrakt.CONTENT = '1' sFunction = 'showSearch' sId = 'globalSearch' sTitle = self.decode(sTitle,Unicode=True) searchtext = ('%s') % (sTitle) sFile = ('%s - (%s)') % (sTitle, sYear) sTitle = ('%s (%s)') % ( sTitle, sYear ) elif 'recommendations' in sUrl or 'popular' in sUrl: if 'shows' in sUrl: sTitle = self.getLocalizedTitle(i, 'shows') cTrakt.CONTENT = '2' else: sTitle = self.getLocalizedTitle(i, 'movies') cTrakt.CONTENT = '1' sTrakt, sYear, sImdb, sTmdb = i['ids']['trakt'], i['year'], i['ids']['imdb'], i['ids']['tmdb'] sTitle = self.decode(sTitle) searchtext = ('%s') % (sTitle) if sYear: sFile = ('%s - (%s)') % (sTitle, int(sYear)) sTitle = ('%s - (%s)') % (sTitle, int(sYear)) else: sFile = ('%s') % (sTitle) sTitle = ('%s') % (sTitle) sFunction = 'showSearch' sId = 'globalSearch' elif 'boxoffice' in sUrl: movie = i['movie'] sTitle = self.getLocalizedTitle(movie, 'movies') sTrakt, sYear, sImdb, sTmdb = movie['ids']['trakt'], movie['year'], movie['ids']['imdb'], movie['ids']['tmdb'] cTrakt.CONTENT = '1' sTitle = self.decode(sTitle) searchtext = ('%s') % (sTitle) sFile = ('%s - (%s)') % (sTitle, int(sYear)) sTitle = ('%s - (%s)') % (sTitle, int(sYear)) sFunction = 'showSearch' sId = 'globalSearch' elif 'lists' in sUrl: sFunction = 'showSearch' sId = 'globalSearch' if 'show' in i: show = i['show'] sTitle = self.getLocalizedTitle(show, 'shows') sTrakt, sImdb, sTmdb, sYear = show['ids']['trakt'], show['ids']['imdb'], show['ids']['tmdb'], show['year'] sExtra = ('(%s)') % (sYear) cTrakt.CONTENT = '2' elif 'episode' in i: eps = i['episode'] sTitle = self.getLocalizedTitle(i, 'episodes') sTrakt, sImdb, sTmdb, sSeason, sNumber = eps['ids']['trakt'], eps['ids']['imdb'], eps['ids']['tmdb'], eps['season'], eps['number'] sExtra = ('(S%02dE%02d)') % (sSeason, sNumber) cTrakt.CONTENT = '2' else: movie = i['movie'] sTitle = self.getLocalizedTitle(movie, 'movies') sTrakt, sImdb, sTmdb, sYear = movie['ids']['trakt'], movie['ids']['imdb'], movie['ids']['tmdb'], movie['year'] sExtra = ('(%s)') % (sYear) cTrakt.CONTENT = '1' sTitle = self.decode(sTitle,Unicode=True) searchtext = ('%s') % (sTitle) sFile = ('%s %s') % (sTitle, sExtra) sTitle = ('%s %s') % (sTitle, sExtra) else: return if sTitle: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + str(sTrakt)) oOutputParameterHandler.addParameter('file', sFile) oOutputParameterHandler.addParameter('key', sKey) oOutputParameterHandler.addParameter('searchtext', searchtext) self.getFolder(oGui, sId, sTitle, sFile, sFunction, sImdb, sTmdb, oOutputParameterHandler) sKey += 1 progress_.VSclose(progress_) if (sPage < sMaxPage): sNextPage = sUrl.replace('page=' + str(sPage), 'page=' + str(int(sPage) + 1)) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sNextPage) oGui.addNext(SITE_IDENTIFIER, 'getTrakt', '[COLOR teal]Suivant >>>[/COLOR]', oOutputParameterHandler) oGui.setEndOfDirectory() return def getBseasons(self): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sFile = oInputParameterHandler.getValue('file') sKey = oInputParameterHandler.getValue('key') searchtext = oInputParameterHandler.getValue('searchtext') headers = {'Content-Type': 'application/json', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS, 'Authorization': 'Bearer %s' % self.ADDON.getSetting('bstoken')} # post = {'extended': 'metadata'} # post = json.dumps(post) req = urllib2.Request(sUrl, None, headers) response = urllib2.urlopen(req) sHtmlContent = response.read() result = json.loads(sHtmlContent) response.close() # total = len(sHtmlContent) total = len(result) sNum = 0 if (total > 0): for i in result[int(sKey)]['seasons']: if 'collection' in sUrl or 'watched' in sUrl: sNumber = i['number'] cTrakt.CONTENT = '2' else: return sTitle2 = ('%s - (S%02d)') % (self.decode(sFile), int(sNumber)) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + str(sNumber)) # oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('Key', sKey) oOutputParameterHandler.addParameter('sNum', sNum) oOutputParameterHandler.addParameter('file', sFile) oOutputParameterHandler.addParameter('title', sTitle2) oOutputParameterHandler.addParameter('searchtext', searchtext) self.getFolder(oGui, SITE_IDENTIFIER, sTitle2, sFile, 'getBepisodes', '', '', oOutputParameterHandler) sNum += 1 oGui.setEndOfDirectory() return def getLocalizedTitle(self, item, what): headers = {'Content-Type': 'application/json', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS, 'Authorization': 'Bearer %s' % self.ADDON.getSetting('bstoken')} try: if not 'episode' in what: request = urllib2.Request(URL_API + '%s/%s/translations/fr' % (what, item['ids']['slug']), headers = headers) else: show_title = self.getLocalizedTitle(item['show'], 'shows') t_values = (item['show']['ids']['slug'], item['episode']['season'], item['episode']['number']) req = URL_API + 'shows/%s/seasons/%s/episodes/%s/translations/fr' % t_values request = urllib2.Request(req, headers = headers) response = urllib2.urlopen(request) aliasContent = response.read() response.close() aliases = json.loads(aliasContent) title = next((title for title in aliases if title['language'].lower() == 'fr'), item)['title'] if title is None: return item['title'] else: return title if 'episode' not in what else show_title + ' - ' + title except: try: return item['title'] except: return item['show']['title'] def getBepisodes(self): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sTitle = oInputParameterHandler.getValue('title') sFile = oInputParameterHandler.getValue('file') sKey = oInputParameterHandler.getValue('key') sNum = oInputParameterHandler.getValue('sNum') searchtext = oInputParameterHandler.getValue('searchtext') cTrakt.CONTENT = '2' headers = {'Content-Type': 'application/json', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS, 'Authorization': 'Bearer %s' % self.ADDON.getSetting('bstoken')} # post = {'extended': 'metadata'} # post = json.dumps(post) req = urllib2.Request(sUrl, None, headers) response = urllib2.urlopen(req) sHtmlContent = response.read() result = json.loads(sHtmlContent) response.close() # total = len(sHtmlContent) total = len(result) sNumber = 0 if (total > 0): for i in result[int(sKey)]['seasons'][int(sNum)]['episodes']: if 'collection' in sUrl: sNumber = i['number'] # sDate = datetime.datetime(*(time.strptime(sDate, '%Y-%m-%dT%H:%M:%S.%fZ')[0:6])).strftime('%d-%m-%Y %H:%M') sTitle2 = ('%s (E%02d)') % (self.decode(sTitle), int(sNumber)) elif 'watched' in sUrl: sNumber, sPlays = i['number'], i['plays'] # sDate = datetime.datetime(*(time.strptime(sDate, '%Y-%m-%dT%H:%M:%S.%fZ')[0:6])).strftime('%d-%m-%Y %H:%M') sTitle2 = ('%s Lectures - %s(E%02d)') % (sPlays, self.decode(sTitle), int(sNumber)) else: return oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + str(sNumber)) oOutputParameterHandler.addParameter('file', sFile) # oOutputParameterHandler.addParameter('siteUrl', sUrl) # oOutputParameterHandler.addParameter('Key', skey) oOutputParameterHandler.addParameter('searchtext', searchtext) self.getFolder(oGui, 'globalSearch', sTitle2, sFile, 'showSearch', '', '', oOutputParameterHandler) oGui.setEndOfDirectory() return def getFolder(self, oGui, sId, sTitle, sFile, sFunction, sImdb, sTmdb, oOutputParameterHandler): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sTitle) oGuiElement.setFileName(sFile) oGuiElement.setIcon('trakt.png') # oGuiElement.setThumbnail(sThumb) oGuiElement.setImdbId(sImdb) oGuiElement.setTmdbId(sTmdb) if self.ADDON.getSetting('meta-view') == 'false': # self.getTmdbInfo(sTmdb, oGuiElement) oGuiElement.setMetaAddon('true') if cTrakt.CONTENT == '2': oGuiElement.setMeta(2) oGuiElement.setCat(2) cGui.CONTENT = 'tvshows' else: oGuiElement.setMeta(1) oGuiElement.setCat(1) cGui.CONTENT = 'movies' # oGuiElement.setDescription(sDesc) # oGuiElement.setFanart(fanart) # oGui.createContexMenuDelFav(oGuiElement, oOutputParameterHandler) # oGui.addHost(oGuiElement, oOutputParameterHandler) # self.createContexTrakt(oGui, oGuiElement, oOutputParameterHandler) oGui.addFolder(oGuiElement, oOutputParameterHandler) # oGui.addDir(SITE_IDENTIFIER, 'showMovies', sTitle, 'next.png', oOutputParameterHandler) def getContext(self): disp = [] lang = [] disp.append(URL_API + 'sync/collection') lang.append(self.ADDON.VSlang(30221) + ' ' + self.ADDON.VSlang(30310)) disp.append(URL_API + 'sync/collection/remove') lang.append('[COLOR red]' + self.ADDON.VSlang(30222) + ' ' + self.ADDON.VSlang(30310) + '[/COLOR]') disp.append(URL_API + 'sync/watchlist') lang.append(self.ADDON.VSlang(30221) + ' ' + self.ADDON.VSlang(30311)) disp.append(URL_API + 'sync/watchlist/remove') lang.append('[COLOR red]' + self.ADDON.VSlang(30222) + ' ' + self.ADDON.VSlang(30311) + '[/COLOR]') disp.append(URL_API + 'sync/history') lang.append(self.ADDON.VSlang(30221) + ' ' + self.ADDON.VSlang(30312)) disp.append(URL_API + 'sync/history/remove') lang.append('[COLOR red]' + self.ADDON.VSlang(30222) + ' ' + self.ADDON.VSlang(30312) + '[/COLOR]') ret = self.DIALOG.VSselect(lang, 'Trakt') if ret > -1: self.__sAction = disp[ret] return self.__sAction def getType(self): disp = ['movies', 'shows'] dialog2 = self.DIALOG.Dialog() dialog_select = 'Films', 'Series' ret = dialog2.select('Trakt', dialog_select) if ret > -1: self.__sType = disp[ret] return self.__sType # def getAction2(self): # sAction = URL_API + 'search/movie?query=tron' # headers = {'Content-Type': 'application/json', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS} # req = urllib2.Request(sAction, None, headers) # response = urllib2.urlopen(req) # sHtmlContent = response.read() # result = json.loads(sHtmlContent) # VSlog(str(result)) # for i in result: # VSlog(str(i['movie']['title'].encode('utf-8')) + '=' + str(i['movie']['ids']['imdb'])) def getAction(self): if self.ADDON.getSetting('bstoken') == '': self.DIALOG.VSinfo('Vous devez être connecté') return oInputParameterHandler = cInputParameterHandler() sAction = oInputParameterHandler.getValue('sAction') if not sAction: sAction = self.getContext() if not sAction: return sType = oInputParameterHandler.getValue('sCat') if not sType: sType = self.getType() # entrer imdb ? venant d'ou? sImdb = oInputParameterHandler.getValue('sImdbId') sTMDB = oInputParameterHandler.getValue('sTmdbId') sSeason = oInputParameterHandler.getValue('sSeason') sEpisode = oInputParameterHandler.getValue('sEpisode') sType = sType.replace('1', 'movies').replace('2', 'shows') if not sImdb: sPost = {} if not sTMDB: sTMDB = int(self.getTmdbID(oInputParameterHandler.getValue('sMovieTitle'), sType)) sPost = {sType: [{'ids': {'tmdb': sTMDB}}]} if sSeason: sPost = {sType: [{'ids': {'tmdb': sTMDB}, 'seasons': [{'number': int(sSeason)}]}]} if sEpisode: sPost = {sType: [{'ids': {'tmdb': sTMDB}, 'seasons': [{'number': int(sSeason), 'episodes': [{'number': int(sEpisode)}]}]}]} else: sPost = {sType: [{'ids': {'imdb': sImdb}}]} headers = {'Content-Type': 'application/json', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS, 'Authorization': 'Bearer %s' % self.ADDON.getSetting('bstoken')} try: sPost = json.dumps(sPost).encode('utf-8') except: sPost = json.dumps(sPost) req = urllib2.Request(sAction, sPost, headers) response = urllib2.urlopen(req) sHtmlContent = response.read() result = json.loads(sHtmlContent) sText = 'Erreur' try: if result['added']['movies'] == 1 or result['added']['episodes'] > 0 or result['added']['shows'] > 0: sText = 'Ajouté avec succès' except: pass try: if result['updated']['movies'] == 1 or result['updated']['episodes'] > 0 or result['updated']['shows'] > 0: sText = 'Mise à jour avec succès' except: pass try: if result['deleted']['movies'] == 1 or result['deleted']['episodes'] > 0: sText = 'Supprimé avec succès' except: pass try: if result['existing']['movies'] > 0 or result['existing']['episodes'] > 0 or result['existing']['seasons'] > 0 or result['existing']['shows'] > 0: sText = 'Entrée déjà présente' except: pass self.DIALOG.VSinfo(sText) # {u'not_found': {u'movies': [], u'seasons': [], u'people': [], u'episodes': [], u'shows': []}, u'updated': {u'movies': 0, u'episodes': 0}, u'added': {u'movies': 1, u'episodes': 0}, u'existing': {u'movies': 0, u'episodes': 0}} # {u'deleted': {u'movies': 0, u'episodes': 55}, u'not_found': {u'movies': [], u'seasons': [], u'people': [], u'episodes': [], u'shows': []}} if (oInputParameterHandler.exist('sReload')): xbmc.executebuiltin('Container.Refresh') return def getWatchlist(self): if not self.ADDON.getSetting('bstoken'): return oInputParameterHandler = cInputParameterHandler() sCat = oInputParameterHandler.getValue('sType') if not sCat: return # entrer imdb ? venant d'ou? sImdb = oInputParameterHandler.getValue('sImdbId') sTMDB = oInputParameterHandler.getValue('sTmdbId') sSeason = oInputParameterHandler.getValue('sSeason') sEpisode = oInputParameterHandler.getValue('sEpisode') sCat_trakt = sCat.replace('1', 'movies').replace('2', 'shows') if not sImdb: sPost = {} if not sTMDB: sTMDB = int(self.getTmdbID(oInputParameterHandler.getValue('sFileName'), sCat_trakt)) sPost = {sCat_trakt: [{'ids': {'tmdb': sTMDB}}]} if sSeason: sPost = {sCat_trakt: [{'ids': {'tmdb': sTMDB}, 'seasons': [{'number': int(sSeason)}]}]} if sEpisode: sPost = {sCat_trakt: [{'ids': {'tmdb': sTMDB}, 'seasons': [{'number': int(sSeason), 'episodes': [{'number': int(sEpisode)}]}]}]} else: sPost = {sCat_trakt: [{'ids': {'imdb': sImdb}}]} headers = {'Content-Type': 'application/json', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS, 'Authorization': 'Bearer %s' % self.ADDON.getSetting('bstoken')} try: sPost = json.dumps(sPost).encode('utf-8') except: sPost = json.dumps(sPost) sAction = URL_API + 'sync/watchlist' req = urllib2.Request(sAction, sPost, headers) response = urllib2.urlopen(req) sHtmlContent = response.read() result = json.loads(sHtmlContent) sText = False try: if result['added']['movies'] == 1 or result['added']['episodes'] > 0 or result['added']['shows'] > 0: sText = 'Ajouté avec succès' except: pass try: if result['updated']['movies'] == 1 or result['updated']['episodes'] > 0 or result['updated']['shows'] > 0: sText = 'Mise à jour avec succès' except: pass try: if result['deleted']['movies'] == 1 or result['deleted']['episodes'] > 0: sText = 'Supprimé avec succès' except: pass try: if result['existing']['movies'] >0 or result['existing']['episodes'] > 0 or result['existing']['seasons'] > 0 or result['existing']['shows'] > 0: sText = 'Entrée déjà présente' except: pass if sText: self.DIALOG.VSinfo(sText) return def setAsWatched(self): if not self.ADDON.getSetting('bstoken'): return oInputParameterHandler = cInputParameterHandler() sCat = oInputParameterHandler.getValue('sCat') if not sCat: return # entrer imdb ? venant d'ou? sImdb = oInputParameterHandler.getValue('sImdbId') # dans le doute si meta active sTMDB = oInputParameterHandler.getValue('sTmdbId') sTitle = oInputParameterHandler.getValue('sFileName') sCat_trakt = sCat.replace('1', 'movies').replace('2', 'shows') if sCat_trakt == "shows": sSeason = re.search('aison (\d+)',sTitle).group(1) sEpisode = re.search('pisode (\d+)',sTitle).group(1) else: sSeason = False sEpisode = False if not sImdb: sPost = {} if not sTMDB: sTMDB = int(self.getTmdbID(oInputParameterHandler.getValue('sFileName'), sCat_trakt)) sPost = {sCat_trakt: [{'ids': {'tmdb': sTMDB}}]} if sSeason: sPost = {sCat_trakt: [{'ids': {'tmdb': sTMDB}, 'seasons': [{'number': int(sSeason)}]}]} if sEpisode: sPost = {sCat_trakt: [{'ids': {'tmdb': sTMDB}, 'seasons': [{'number': int(sSeason), 'episodes': [{'number': int(sEpisode)}]}]}]} else: sPost = {sCat_trakt: [{'ids': {'imdb': sImdb}}]} headers = {'Content-Type': 'application/json', 'trakt-api-key': API_KEY, 'trakt-api-version': API_VERS, 'Authorization': 'Bearer %s' % self.ADDON.getSetting('bstoken')} try: sPost = json.dumps(sPost).encode('utf-8') except: sPost = json.dumps(sPost) sAction = URL_API + 'sync/history' req = urllib2.Request(sAction, sPost, headers) response = urllib2.urlopen(req) sHtmlContent = response.read() result = json.loads(sHtmlContent) sText = False try: if result['added']['movies'] == 1 or result['added']['episodes'] > 0 or result['added']['shows'] > 0: sText = 'Ajouté avec succès' except: pass try: if result['updated']['movies'] == 1 or result['updated']['episodes'] > 0 or result['updated']['shows'] > 0: sText = 'Mise à jour avec succès' except: pass try: if result['deleted']['movies'] == 1 or result['deleted']['episodes'] > 0: sText = 'Supprimé avec succès' except: pass try: if result['existing']['movies'] >0 or result['existing']['episodes'] > 0 or result['existing']['seasons'] > 0 or result['existing']['shows'] > 0: sText = 'Entrée déjà présente' except: pass if sText: self.DIALOG.VSinfo(sText) return def createContexTrakt(self, oGui, oGuiElement, oOutputParameterHandler=''): liste = [] liste.append(['[COLOR teal]' + self.ADDON.VSlang(30221) + ' ' + self.ADDON.VSlang(30310) + '[/COLOR]', URL_API + 'sync/collection']) liste.append(['[COLOR red]' + self.ADDON.VSlang(30222) + ' ' + self.ADDON.VSlang(30310) + '[/COLOR]', URL_API + 'sync/collection/remove']) liste.append(['[COLOR teal]' + self.ADDON.VSlang(30221) + ' ' + self.ADDON.VSlang(30311) + '[/COLOR]', URL_API + 'sync/watchlist']) liste.append(['[COLOR red]' + self.ADDON.VSlang(30222) + ' ' + self.ADDON.VSlang(30311) + '[/COLOR]', URL_API + 'sync/watchlist/remove']) liste.append(['[COLOR teal]' + self.ADDON.VSlang(30221) + ' ' + self.ADDON.VSlang(30312) + '[/COLOR]', URL_API + 'sync/history']) liste.append(['[COLOR red]' + self.ADDON.VSlang(30222) + ' ' + self.ADDON.VSlang(30312) + '[/COLOR]', URL_API + 'sync/history/remove']) for sTitle,sUrl in liste: oOutputParameterHandler = cOutputParameterHandler() if cTrakt.CONTENT == '2': oOutputParameterHandler.addParameter('sType', 'shows') else: oOutputParameterHandler.addParameter('sType', 'movies') oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sAction', sUrl) oOutputParameterHandler.addParameter('sReload', True) # oOutputParameterHandler.addParameter('sImdb', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cTrakt', 'cTrakt', 'getAction', sTitle) return def showHosters(self): oInputParameterHandler = cInputParameterHandler() # sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('file') # sThumbnail = oInputParameterHandler.getValue('sThumbnail') sMovieTitle = self.decode(sMovieTitle,Unicode=True).lower() # on repasse en utf-8 sMovieTitle = Quote(sMovieTitle) sMovieTitle = re.sub('\(.+?\)', ' ', sMovieTitle) # vire les tags entre parentheses # modif venom si le titre comporte un - il doit le chercher sMovieTitle = re.sub(r'[^a-z -]', ' ', sMovieTitle) # vire les caracteres a la con qui peuvent trainer sMovieTitle = re.sub('( |^)(le|la|les|du|au|a|l)( |$)', ' ', sMovieTitle) # vire les articles # vire les espaces multiples et on laisse les espaces sans modifs car certains codent avec %20 d'autres avec + sMovieTitle = re.sub(' +', ' ', sMovieTitle) self.vStreamSearch(sMovieTitle) def vStreamSearch(self, sMovieTitle): oGui = cGui() # oInputParameterHandler = cInputParameterHandler() # sUrl = oInputParameterHandler.getValue('siteUrl') oHandler = cRechercheHandler() oHandler.setText(sMovieTitle) # oHandler.setDisp(sDisp) aPlugins = oHandler.getAvailablePlugins() oGui.setEndOfDirectory() def getTmdbInfo(self, sTmdb, oGuiElement): return if not sTmdb: VSlog('Problème sTmdb') return oRequestHandler = cRequestHandler('https://api.themoviedb.org/3/movie/' + str(sTmdb)) oRequestHandler.addParameters('api_key', '92ab39516970ab9d86396866456ec9b6') oRequestHandler.addParameters('language', 'fr') sHtmlContent = oRequestHandler.request() try: result = json.loads(sHtmlContent) except: return # total = len(sHtmlContent) # format meta = {} meta['imdb_id'] = result['id'] meta['title'] = result['title'] meta['tagline'] = result['tagline'] meta['rating'] = result['vote_average'] meta['votes'] = result['vote_count'] meta['duration'] = result['runtime'] meta['plot'] = result['overview'] # meta['mpaa'] = result['certification'] # meta['premiered'] = result['released'] # meta['director'] = result['director'] # meta['writer'] = result['writer'] # if (total > 0): if result['poster_path']: oGuiElement.setThumbnail('https://image.tmdb.org/t/p/w396' + result['poster_path']) if result['backdrop_path']: oGuiElement.setFanart('https://image.tmdb.org/t/p/w1280' + result['backdrop_path']) for key, value in meta.items(): oGuiElement.addItemValues(key, value) return def getTmdbID(self, sTitle, sType): oInputParameterHandler = cInputParameterHandler() from resources.lib.tmdb import cTMDb grab = cTMDb() if sType == 'show' or sType == 'shows': sType = 'tv' if sType == 'movies': sType = 'movie' meta = 0 year = '' # on cherche l'annee r = re.search('(\([0-9]{4}\))', sTitle) if r: year = str(r.group(0)) sTitle = sTitle.replace(year, '') # VSlog('Recherche de : ' + sTitle) # VSlog('Saison/episode : ' + SaisonEpisode) # VSlog('Annee : ' + year) # VSlog('Type : ' + sType) meta = grab.get_idbyname(oInputParameterHandler.getValue('sFileName'), year, sType) return int(meta)