1251 lines
53 KiB
Python
1251 lines
53 KiB
Python
# -*- 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)
|