From 75e8a1fec112ce1220fc0f77eb738cb57696a887 Mon Sep 17 00:00:00 2001 From: qo-op Date: Mon, 8 Mar 2021 02:48:05 +0100 Subject: [PATCH] Kodi19 compatibility upgrade --- .../resources/sites/astroport.py | 1557 +++++++++++------ 1 file changed, 1064 insertions(+), 493 deletions(-) diff --git a/.install/.kodi/addons/plugin.video.vstream/resources/sites/astroport.py b/.install/.kodi/addons/plugin.video.vstream/resources/sites/astroport.py index 7740c7a..1f89c63 100644 --- a/.install/.kodi/addons/plugin.video.vstream/resources/sites/astroport.py +++ b/.install/.kodi/addons/plugin.video.vstream/resources/sites/astroport.py @@ -1,46 +1,208 @@ # -*- coding: utf-8 -*- # vStream https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.lib.comaddon import progress, addon, dialog +import imp +import random +import time +import xbmcvfs +from resources.lib.comaddon import progress, addon, dialog, VSlog, VSPath, isMatrix, xbmc +from resources.lib.handler.inputParameterHandler import cInputParameterHandler +from resources.lib.handler.requestHandler import cRequestHandler +from resources.lib.handler.outputParameterHandler import cOutputParameterHandler +from resources.lib.util import Quote, cUtil, Unquote +import resources.sites.ianime as i +from resources.lib.tmdb import cTMDb from resources.lib.gui.gui import cGui from resources.lib.gui.guiElement import cGuiElement from resources.lib.gui.hoster import cHosterGui -from resources.lib.handler.inputParameterHandler import cInputParameterHandler -from resources.lib.handler.outputParameterHandler import cOutputParameterHandler -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.tmdb import cTMDb -from resources.lib.util import Quote, cUtil, Unquote +from resources.lib.handler.premiumHandler import cPremiumHandler + +try: + import urllib2 +except ImportError: + import urllib.request as urllib2 + +try: + from sqlite3 import dbapi2 as sqlite +except: + from pysqlite2 import dbapi2 as sqlite -import random SITE_IDENTIFIER = 'astroport' SITE_NAME = 'ASTROPORT _PROFIL_ (_LOGIN_) (_MDP_)' SITE_DESC = 'Partage ~/astroport/films (animes, series) avec ses amis https://gchange.fr (https://cesium.app ) via IPFS' -# URL_MAIN = 'http://localhost:10021/' -# NOT USING nginx relay anymore URL_MAIN = 'http://127.0.0.1:8181/ipns/_IPFSNODEID_/._IPFSNODEID_/' -# FASTRXBIAN / AASTRXBIAN ... KEY_PASTE_ID = 'PASTE_ID' -SETTING_PASTE_ID = 'astroport_id_' -SETTING_PASTE_LABEL = 'astroport_label_' +SETTING_PASTE_ID = SITE_IDENTIFIER + '_id_' +SETTING_PASTE_LABEL = SITE_IDENTIFIER + '_label_' UNCLASSIFIED_GENRE = '_NON CLASSÉ_' UNCLASSIFIED = 'Indéterminé' URL_SEARCH_MOVIES = (URL_MAIN + '&pasteID=' + KEY_PASTE_ID + '&sMedia=film&sSearch=', 'showSearchGlobal') URL_SEARCH_SERIES = (URL_MAIN + '&pasteID=' + KEY_PASTE_ID + '&sMedia=serie&sSearch=', 'showSearchGlobal') URL_SEARCH_ANIMS = (URL_MAIN + '&pasteID=' + KEY_PASTE_ID + '&sMedia=anime&sSearch=', 'showSearchGlobal') +URL_SEARCH_DIVERS = (URL_MAIN + '&pasteID=' + KEY_PASTE_ID + '&sMedia=divers&sSearch=', 'showSearchGlobal') FUNCTION_SEARCH = 'showSearchGlobal' +CACHE = 'special://home/userdata/addon_data/plugin.video.vstream/%s_cache.db' % SITE_IDENTIFIER + +if not isMatrix(): + REALCACHE = VSPath(CACHE).decode('utf-8') + PATH = 'special://home/addons/plugin.video.vstream/resources/lib/pasteCrypt2.pyc' +else: + REALCACHE = VSPath(CACHE) + PATH = 'special://home/addons/plugin.video.vstream/resources/lib/pasteCrypt3.pyc' + + def getNbItemParPage(): - nbItem = addon().getSetting('pastebin_nbItemParPage') - if nbItem: - return int(nbItem) - return 25 + nbItem = addon().getSetting(SITE_IDENTIFIER + '_nbItemParPage') + if not nbItem: + nbItem = "25" + addon().setSetting(SITE_IDENTIFIER + '_nbItemParPage', nbItem) + return int(nbItem) ITEM_PAR_PAGE = getNbItemParPage() -PASTE_PAR_GROUPE = 50 # jusqu'à 50 groupes de paste, chaque groupe peut contenir jusqu'à 50 liens pastebin +GROUPE_MAX = 50 # jusqu'à 50 dossiers, limitation du skin +PASTE_PAR_GROUPE = 100 # jusqu'à 100 liens pastebin par dossier + + +# Durée du cache, en Heures +def getCacheDuration(): + cacheDuration = addon().getSetting(SITE_IDENTIFIER + '_cacheDuration') + if not cacheDuration: + cacheDuration = "12" # en heure + addon().setSetting(SITE_IDENTIFIER + '_cacheDuration', cacheDuration) + return min(int(cacheDuration), 168) + +CACHE_DURATION = getCacheDuration() + + +""" GESTION DU CACHE """ + +class PasteCache: + + def __init__(self): + + try: + if not xbmcvfs.exists(CACHE): + self.db = sqlite.connect(REALCACHE) + self.db.row_factory = sqlite.Row + self.dbcur = self.db.cursor() + self.__createdb() + return + except: + VSlog('Error: Unable to create DB %s' % REALCACHE) + pass + + try: + self.db = sqlite.connect(REALCACHE) + self.db.row_factory = sqlite.Row + self.dbcur = self.db.cursor() + except: + VSlog('Error: Unable to connect to %s' % REALCACHE) + pass + + def __createdb(self): + + sql_create = "CREATE TABLE IF NOT EXISTS %s ("\ + "paste_id TEXT, "\ + "date FLOAT, "\ + "content BLOB,"\ + "UNIQUE(paste_id)"\ + ");" % SITE_IDENTIFIER + try: + self.dbcur.execute(sql_create) + except: + VSlog('Error: Unable to create table %s' % SITE_IDENTIFIER) + + self.dbcur.execute(sql_create) + VSlog('table %s creee' % SITE_IDENTIFIER) + + def __del__(self): + """ Cleanup db when object destroyed """ + try: + self.dbcur.close() + self.db.close() + except: + pass + + # Récupérer dans le cache + def read(self, pasteID): + + try: + sql_select = 'SELECT * FROM %s WHERE paste_id = \'%s\'' % (SITE_IDENTIFIER, pasteID) + self.dbcur.execute(sql_select) + matchedrow = self.dbcur.fetchone() + except Exception as e: + VSlog('************* Error selecting from %s db: %s' % (SITE_IDENTIFIER, e), 4) + return None, False + + if matchedrow: + data = dict(matchedrow) + + # Supprimer les données trop anciennes + cacheDuration = time.time() - CACHE_DURATION * 3600 + if data['date'] < cacheDuration: + self.clean(cacheDuration) + return None, False + + # Utiliser les données du cache + if isMatrix(): + content = data['content'].decode("utf-8") + else: + content = str(data['content']) + if content[-1] == '.': + return content[:-1], True + return content, False + else: + return None, False + + # Sauvegarde des données dans un cache + def save(self, pasteID, pasteContent, isMovie): + + try: + sql = 'INSERT INTO %s (paste_id, content, date) VALUES (?, ?, ?)' % SITE_IDENTIFIER + buff = str(pasteContent) + if isMovie: + buff += '.' + + if isMatrix(): + buff = memoryview(bytes(buff, encoding='utf-8')) + else: + buff = buffer(buff) + + self.dbcur.execute(sql, (pasteID, buff, time.time())) + self.db.commit() + except Exception as e: + VSlog('SQL ERROR INSERT into table \'%s\', ID=%s, e=%s' % (SITE_IDENTIFIER, pasteID, e) ) + pass + + # Suprimer une entrée + def remove(self, ID): + + try: + sql_delete = 'DELETE FROM %s WHERE paste_id = \'%s\'' % (SITE_IDENTIFIER, ID) + self.dbcur.execute(sql_delete) + self.db.commit() + except Exception as e: + VSlog('************* Error deleting from cache db: %s, e=%s' % (ID, e), 4) + return None + + + # Suprimer les données trop anciennes + def clean(self, cacheDuration): + + try: + sql_delete = 'DELETE FROM %s WHERE date < \'%s\'' % (SITE_IDENTIFIER, cacheDuration) + self.dbcur.execute(sql_delete) + self.db.commit() + except Exception as e: + VSlog('************* Error deleting from %s db: %s' % (SITE_IDENTIFIER, e), 4) + return None + + # Exemple # CAT; TMDB; TITLE; SAISON; YEAR; GENRES; URLS=https://uptobox.com/ @@ -48,27 +210,33 @@ PASTE_PAR_GROUPE = 50 # jusqu'à 50 groupes de paste, chaque groupe peut conte # serie;48866;Les 100;Saison 2; 2014; ['Fantastique', 'Aventure']; {'S02E01':['lien1', 'lien2'], 'S02E02':['lien1']} # Exemple minimum -# TITLE; URLS -# Demain ne meurt jamais;['https://uptobox.com/nwxxxx'] +# CAT;TITLE; URLS +# film;Demain ne meurt jamais;['https://uptobox.com/nwxxxx'] -class PasteBinContent: - CAT = -1 # (Optionnel) - Catégorie 'film', 'serie' 'anime' (Film par défaut) - TMDB = -1 # (optionnel) - Id TMDB - TITLE = -1 # Titre du film / épisodes - SAISON = -1 # (optionnel) - Saison pour les séries (ex 'Saison 03' ou 'S03' ou '03') OU Saga pour les films (ex 'Mission impossible') - GROUPES = -1 # (optionnel) - Groupes tel que NETFLIX, HBO, MARVEL, DISNEY, Films enfants, ... - YEAR = -1 # (optionnel) - Année - GENRES = -1 # (optionnel) - Liste des genres - RES = -1 # (optionnel) - Résolution (720p, 1080p, 4K, ...) - DIRECTOR = -1# (optionnel) - Réalisateur au format id:nom - CAST = -1 # (optionnel) - Acteurs au format id:nom - NETWORK = -1 # (optionnel) - Diffuseur au format id:nom - URLS = -1 # Liste des liens, avec épisodes pour les séries - HEBERGEUR = '' # (optionnel) - URL de l'hebergeur, pour éviter de le mettre dans chaque URL, ex : 'https://uptobox.com/' +class PasteContent: + CAT = -1 # (Optionnel) - Catégorie 'film', 'serie' 'anime' (Film par défaut) + TMDB = -1 # (optionnel) - Id TMDB + TITLE = -1 # Titre du film / épisodes + SAISON = -1 # (optionnel) - Saison pour les séries (ex 'Saison 03' ou 'S03' ou '03') OU Saga pour les films (ex 'Mission impossible') + GROUPES = -1 # (optionnel) - Groupes tel que NETFLIX, HBO, MARVEL, DISNEY, Films enfants, ... + YEAR = -1 # (optionnel) - Année + GENRES = -1 # (optionnel) - Liste des genres + RES = -1 # (optionnel) - Résolution (720p, 1080p, 4K, ...) + DIRECTOR = -1 # (optionnel) - Réalisateur au format id:nom + CAST = -1 # (optionnel) - Acteurs au format id:nom + NETWORK = -1 # (optionnel) - Diffuseur au format id:nom + HEBERGEUR = '' # (optionnel) - URL de l'hebergeur, pour éviter de le mettre dans chaque URL, ex : 'https://uptobox.com/' + movies = False # Liste des liens, avec épisodes pour les séries + URLS = -1 # Liste des liens, avec épisodes pour les séries + chiffrer = None + cache = None + keyUpto = None + keyAlld = None + keyReald = None - # Pour comparer deux pastes, savoir si les champs sont dans le même ordre - def isFormat(self, other): - if not isinstance(other, PasteBinContent): + # Pour comparer deux pastes, savoir si les champs sont dans le même ordre + def isFormat(self, other): + if not isinstance(other, PasteContent): return False return self.CAT == other.CAT \ @@ -83,51 +251,128 @@ class PasteBinContent: and self.CAST == other.CAST \ and self.NETWORK == other.NETWORK \ and self.URLS == other.URLS - - def getLines(self, sContent): - lines = sContent.splitlines() - # Vérifie si la ligne d'entete existe avec les champs obligatoires - entete = lines[0].split(";") - if 'TITLE' not in entete and 'URLS' not in entete: - return [] + def getLines(self, pasteBin): + + sContent, self.movies = self._getCache().read(pasteBin) + + # Lecture en cache + if sContent: + lines = eval(sContent) + entete = lines[0].split(";") + + # Lecture sur le site + else: + # test si paste accessible + lines, self.movies = self._decompress(pasteBin) + if not lines: + return [] + + # Vérifie si la ligne d'entete existe avec les champs obligatoires + entete = lines[0].split(";") + if 'TITLE' not in entete and 'URL' not in entete: + return [] + self._getCache().save(pasteBin, lines, self.movies) # Calcul des index de chaque champ idx = 0 for champ in entete: champ = champ.strip() - - if 'URL' in champ: # supporte URL ou URLS + + if 'URL' in champ: # supporte URL ou URLS hebergeur = champ.split('=') champ = 'URLS' - if len(hebergeur)>1: - self.HEBERGEUR = hebergeur[1].replace(' ','').replace('"','').replace('\'','') - if not self.HEBERGEUR.endswith('/'): - self.HEBERGEUR += '/' + if len(hebergeur) > 1: + self.HEBERGEUR = hebergeur[1].replace(' ', '').replace('"', '').replace('\'', '') if champ in dir(self): setattr(self, champ, idx) - idx +=1 + idx += 1 lines = [k.split(";") for k in lines[1:]] - - - # Reconstruire les liens - if self.HEBERGEUR: - for line in lines: - sHost = line[self.URLS] - if "{" in sHost: - sUrl = eval(sHost) - for link in sUrl.keys(): - sUrl[link] = self.HEBERGEUR + sUrl[link] - elif "[" in sHost: - sHost = eval(sHost) - sUrl = [(self.HEBERGEUR + link) for link in sHost] - else: - sUrl = self.HEBERGEUR + sHost - line[self.URLS] = sUrl - + return lines + def resolveLink(self, pasteBin, link): + if not self.movies: + return self.HEBERGEUR+link + + if 'uptobox' in self.HEBERGEUR: + # Recherche d'un compte premium valide + links = None + if not self.keyUpto and not self.keyAlld and not self.keyReald: + self.keyUpto = cPremiumHandler('uptobox').getToken() + if self.keyUpto: + links = self._resolveLink(pasteBin, link) + if not links : + self.keyUpto = None + self.keyReald = cPremiumHandler('realdebrid').getToken() + if self.keyReald: + links = self._resolveLink(pasteBin, link) + if not links : + self.keyReald = None + self.keyAlld = cPremiumHandler('alldebrid').getToken() + if self.keyAlld: + links = self._resolveLink(pasteBin, link) + if not links : + self.keyAlld = None + + # Un compte avec un des trois débrideurs + if not links and (self.keyUpto or self.keyAlld or self.keyReald): + links = self._resolveLink(pasteBin, link) + if not links : + dialog().VSinfo(err) + if links: + return links + else: + dialog().VSinfo('Certains liens nécessitent un Compte Premium') + + return self.HEBERGEUR+link + + def _resolveLink(self, pasteBin, link): + + # Un token avec un des trois débrideurs + if self.keyUpto or self.keyAlld or self.keyReald: + links = self._getCrypt().resolveLink(pasteBin, link, self.keyUpto, self.keyAlld, self.keyReald) + if links and len(links)>1: + l = links[0] + if l: + return l + err = 'Erreur : ' + str(links[1]) + VSlog(err) + + def _decompress(self, pasteBin): + + lines = [] + hasMovies = False + try: + lines = self._getCrypt().loadFile(pasteBin) + if lines: + hasMovies = True + except Exception as e: + pass + + if not hasMovies: + oRequestHandler = cRequestHandler(URL_MAIN + pasteBin) + oRequestHandler.setTimeout(4) + sContent = oRequestHandler.request() + if sContent.startswith('<'): + return [], False + + if sContent.startswith('CAT;'): + lines = sContent.splitlines() + + return lines, hasMovies + + def _getCrypt(self): + if not self.chiffrer: + self.chiffrer = imp.load_compiled("Chiffrage", VSPath(PATH)).Crypt() + return self.chiffrer + + def _getCache(self): + if not self.cache: + self.cache = PasteCache() + return self.cache + def load(): addons = addon() @@ -135,17 +380,17 @@ def load(): numID = 0 pasteListe = {} - + # Recherche des listes déclarées for numID in range(1, 50): pasteLabel = addons.getSetting(SETTING_PASTE_LABEL + str(numID)) if pasteLabel: pasteListe[pasteLabel] = numID - - # Trie des listes par label + + # Trie des dossiers par label pasteListe = sorted(pasteListe.items(), key=lambda paste: paste[0]) - if len(pasteListe)>0: + if len(pasteListe) > 0: oOutputParameterHandler = cOutputParameterHandler() searchUrl = URL_SEARCH_MOVIES[0] oOutputParameterHandler.addParameter('siteUrl', searchUrl) @@ -155,34 +400,34 @@ def load(): searchUrl = URL_SEARCH_SERIES[0] oOutputParameterHandler.addParameter('siteUrl', searchUrl) oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche (Séries)', 'search.png', oOutputParameterHandler) - + oOutputParameterHandler = cOutputParameterHandler() searchUrl = URL_SEARCH_ANIMS[0] oOutputParameterHandler.addParameter('siteUrl', searchUrl) oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche (Animes)', 'search.png', oOutputParameterHandler) - for pasteBin in pasteListe: pasteLabel = pasteBin[0] pasteID = pasteBin[1] - + oGuiElement = cGuiElement() oGuiElement.setSiteName(SITE_IDENTIFIER) oGuiElement.setFunction('showMenu') oGuiElement.setTitle(pasteLabel) oGuiElement.setIcon("mark.png") oGuiElement.setMeta(0) - + oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('pasteID', pasteID) + oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, SITE_IDENTIFIER, SITE_IDENTIFIER, 'renamePasteName', addons.VSlang(30223)) + oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, SITE_IDENTIFIER, SITE_IDENTIFIER, 'refreshPaste', "Forcer la mise à jour") oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, SITE_IDENTIFIER, SITE_IDENTIFIER, 'deletePasteName', addons.VSlang(30412)) oGui.addFolder(oGuiElement, oOutputParameterHandler) - - - # Menu pour ajouter un lien - oOutputParameterHandler = cOutputParameterHandler() - oGui.addDir(SITE_IDENTIFIER, 'addPasteName', '[COLOR coral]Ajouter un dossier[/COLOR]', 'listes.png', oOutputParameterHandler) + # Menu pour ajouter un dossier (hors widget) + if not xbmc.getCondVisibility('Window.IsActive(home)'): + oOutputParameterHandler = cOutputParameterHandler() + oGui.addDir(SITE_IDENTIFIER, 'addPasteName', '[COLOR coral]Ajouter un dossier %s[/COLOR]' % SITE_NAME, 'listes.png', oOutputParameterHandler) oGui.setEndOfDirectory() @@ -195,57 +440,72 @@ def showMenu(): pasteID = oInputParameterHandler.getValue('pasteID') sMedia = oInputParameterHandler.getValue('sMedia') + pbContent = PasteContent() prefixID = SETTING_PASTE_ID + str(pasteID) pasteBin = addons.getSetting(prefixID) - contenu = getPasteBin(pasteBin) + contenu = getPasteBin(pbContent, pasteBin) for numID in range(1, PASTE_PAR_GROUPE): pasteBin = addons.getSetting(prefixID + '_' + str(numID)) - contenu = contenu.union(getPasteBin(pasteBin)) - + contenu = contenu.union(getPasteBin(pbContent, pasteBin)) + if not sMedia: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('pasteID', pasteID) - - cnt = contenu.intersection(['containFilms', 'containSeries', 'containAnimes']) + + cnt = contenu.intersection(['containFilms', 'containSeries', 'containAnimes', 'containDivers']) if len(cnt) == 1: showDetailMenu(pasteID, contenu) else: if 'containFilms' in contenu: oOutputParameterHandler.addParameter('sMedia', 'film') oGui.addDir(SITE_IDENTIFIER, 'showMenu', 'Films', 'films.png', oOutputParameterHandler) - + if 'containSeries' in contenu: oOutputParameterHandler.addParameter('sMedia', 'serie') oGui.addDir(SITE_IDENTIFIER, 'showMenu', 'Séries', 'tv.png', oOutputParameterHandler) - + if 'containAnimes' in contenu: oOutputParameterHandler.addParameter('sMedia', 'anime') oGui.addDir(SITE_IDENTIFIER, 'showMenu', 'Animes', 'animes.png', oOutputParameterHandler) - - oGui.addDir(SITE_IDENTIFIER, 'addPasteID', '[COLOR coral]Ajouter un lien ASTRXBIAN[/COLOR]', 'listes.png', oOutputParameterHandler) + + if 'containDivers' in contenu: + oOutputParameterHandler.addParameter('sMedia', 'divers') + oGui.addDir(SITE_IDENTIFIER, 'showMenu', 'Divers', 'buzz.png', oOutputParameterHandler) + + # Menu pour ajouter un lien (hors widget) + if not xbmc.getCondVisibility('Window.IsActive(home)'): + oGui.addDir(SITE_IDENTIFIER, 'addPasteID', '[COLOR coral]Ajouter un code %s[/COLOR]' % SITE_NAME, 'notes.png', oOutputParameterHandler) + oGui.addDir(SITE_IDENTIFIER, 'adminPasteID', '[COLOR coral]Retirer un code %s[/COLOR]' % SITE_NAME, 'trash.png', oOutputParameterHandler) elif 'film' in sMedia: contenu.discard('containSeries') contenu.discard('containAnimes') + contenu.discard('containDivers') showDetailMenu(pasteID, contenu) elif 'serie' in sMedia: contenu.discard('containFilms') contenu.discard('containAnimes') + contenu.discard('containDivers') showDetailMenu(pasteID, contenu) elif 'anime' in sMedia: contenu.discard('containFilms') contenu.discard('containSeries') + contenu.discard('containDivers') + showDetailMenu(pasteID, contenu) + elif 'divers' in sMedia: + contenu.discard('containFilms') + contenu.discard('containSeries') + contenu.discard('containAnimes') showDetailMenu(pasteID, contenu) - - oGui.setEndOfDirectory() + oGui.setEndOfDirectory() def showDetailMenu(pasteID, contenu): oGui = cGui() - - sUrl = URL_MAIN #+ pasteBin + + sUrl = URL_MAIN + '&numPage=1' # + pasteBin if 'containFilms' in contenu: oOutputParameterHandler = cOutputParameterHandler() searchUrl = URL_SEARCH_MOVIES[0].replace(KEY_PASTE_ID, pasteID) @@ -253,24 +513,24 @@ def showDetailMenu(pasteID, contenu): oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche (Films)', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() - oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&pasteID=' + pasteID) + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&bNews=True&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showMovies', 'Films (Derniers ajouts)', 'news.png', oOutputParameterHandler) if 'containFilmGenres' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showGenres', 'Films (Genres)', 'genres.png', oOutputParameterHandler) - + if 'containFilmGroupes' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&pasteID=' + pasteID) - oGui.addDir(SITE_IDENTIFIER, 'showGroupes', 'Films (Listes)', 'genres.png', oOutputParameterHandler) - + oGui.addDir(SITE_IDENTIFIER, 'showGroupes', 'Films (Listes)', 'listes.png', oOutputParameterHandler) + if 'containFilmSaga' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showSaga', 'Films (Saga)', 'genres.png', oOutputParameterHandler) - + if 'containFilmYear' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&pasteID=' + pasteID) @@ -302,8 +562,7 @@ def showDetailMenu(pasteID, contenu): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&bRandom=True&pasteID=' + pasteID) - oGui.addDir(SITE_IDENTIFIER, 'showMovies', 'Films (Aléatoires)', 'news.png', oOutputParameterHandler) - + oGui.addDir(SITE_IDENTIFIER, 'showMovies', 'Films (Aléatoires)', 'listes.png', oOutputParameterHandler) if 'containSeries' in contenu: oOutputParameterHandler = cOutputParameterHandler() @@ -312,32 +571,36 @@ def showDetailMenu(pasteID, contenu): oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche (Séries)', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() - oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&pasteID=' + pasteID) + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&bNews=True&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showMovies', 'Séries (Derniers ajouts)', 'news.png', oOutputParameterHandler) - oOutputParameterHandler = cOutputParameterHandler() - oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&pasteID=' + pasteID) - oGui.addDir(SITE_IDENTIFIER, 'showGenres', 'Séries (Genres)', 'genres.png', oOutputParameterHandler) + if 'containSerieGenres' in contenu: + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&pasteID=' + pasteID) + oGui.addDir(SITE_IDENTIFIER, 'showGenres', 'Séries (Genres)', 'genres.png', oOutputParameterHandler) if 'containSerieGroupes' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&pasteID=' + pasteID) - oGui.addDir(SITE_IDENTIFIER, 'showGroupes', 'Séries (Listes)', 'genres.png', oOutputParameterHandler) - + oGui.addDir(SITE_IDENTIFIER, 'showGroupes', 'Séries (Listes)', 'listes.png', oOutputParameterHandler) + + if 'containSerieNetwork' in contenu: + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&pasteID=' + pasteID) + oGui.addDir(SITE_IDENTIFIER, 'showNetwork', 'Séries (Par diffuseurs)', 'host.png', oOutputParameterHandler) + if 'containSerieYear' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showYears', 'Séries (Par années)', 'annees.png', oOutputParameterHandler) - if 'containSerieNetwork' in contenu: - oOutputParameterHandler = cOutputParameterHandler() - oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&pasteID=' + pasteID) - oGui.addDir(SITE_IDENTIFIER, 'showNetwork', 'Séries (Par diffuseurs)', 'genres.png', oOutputParameterHandler) - oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'AlphaList', 'Séries (Ordre alphabétique)', 'az.png', oOutputParameterHandler) + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&bRandom=True&pasteID=' + pasteID) + oGui.addDir(SITE_IDENTIFIER, 'showMovies', 'Séries (Aléatoires)', 'listes.png', oOutputParameterHandler) if 'containAnimes' in contenu: oOutputParameterHandler = cOutputParameterHandler() @@ -346,7 +609,7 @@ def showDetailMenu(pasteID, contenu): oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche (Animes)', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() - oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=anime&pasteID=' + pasteID) + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=anime&bNews=True&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showMovies', 'Animes (Derniers ajouts)', 'news.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() @@ -356,63 +619,111 @@ def showDetailMenu(pasteID, contenu): if 'containAnimeGroupes' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=anime&pasteID=' + pasteID) - oGui.addDir(SITE_IDENTIFIER, 'showGroupes', 'Animes (Listes)', 'genres.png', oOutputParameterHandler) - + oGui.addDir(SITE_IDENTIFIER, 'showGroupes', 'Animes (Listes)', 'listes.png', oOutputParameterHandler) + + if 'containAnimeNetwork' in contenu: + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=anime&pasteID=' + pasteID) + oGui.addDir(SITE_IDENTIFIER, 'showNetwork', 'Animes (Par diffuseurs)', 'host.png', oOutputParameterHandler) + + if 'containAnimeYear' in contenu: + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=anime&pasteID=' + pasteID) + oGui.addDir(SITE_IDENTIFIER, 'showYears', 'Animes (Par années)', 'annees.png', oOutputParameterHandler) + oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=anime&pasteID=' + pasteID) - oGui.addDir(SITE_IDENTIFIER, 'AlphaList', 'Animes (Ordre alphabétique)', 'listes.png', oOutputParameterHandler) - + oGui.addDir(SITE_IDENTIFIER, 'AlphaList', 'Animes (Ordre alphabétique)', 'az.png', oOutputParameterHandler) + + if 'containDivers' in contenu: + oOutputParameterHandler = cOutputParameterHandler() + searchUrl = URL_SEARCH_DIVERS[0].replace(KEY_PASTE_ID, pasteID) + oOutputParameterHandler.addParameter('siteUrl', searchUrl) + oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche (Divers)', 'search.png', oOutputParameterHandler) + + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=divers&pasteID=' + pasteID) + oGui.addDir(SITE_IDENTIFIER, 'showMovies', 'Divers (Derniers ajouts)', 'news.png', oOutputParameterHandler) + + if 'containDiversGenres' in contenu: + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=divers&pasteID=' + pasteID) + oGui.addDir(SITE_IDENTIFIER, 'showGenres', 'Divers (Catégories)', 'genres.png', oOutputParameterHandler) + + if 'containDiversGroupes' in contenu: + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=divers&pasteID=' + pasteID) + oGui.addDir(SITE_IDENTIFIER, 'showGroupes', 'Divers (Listes)', 'listes.png', oOutputParameterHandler) + + if 'containDiversYear' in contenu: + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=divers&pasteID=' + pasteID) + oGui.addDir(SITE_IDENTIFIER, 'showYears', 'Divers (Par années)', 'annees.png', oOutputParameterHandler) + + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=divers&pasteID=' + pasteID) + oGui.addDir(SITE_IDENTIFIER, 'AlphaList', 'Divers (Ordre alphabétique)', 'az.png', oOutputParameterHandler) -def getPasteBin(pasteBin): +# Etablir les menus en fonction du contenu +def getPasteBin(pbContent, pasteBin): containList = set() - + if not pasteBin: return containList - - # Etablir les menus en fonction du contenu - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - sContent = oRequestHandler.request() - pbContent = PasteBinContent() - movies = pbContent.getLines(sContent) + movies = pbContent.getLines(pasteBin) # Calculer les menus for movie in movies: if pbContent.CAT == -1 or 'film' in movie[pbContent.CAT]: containList.add('containFilms') - if pbContent.GENRES>=0 and len(movie[pbContent.GENRES].strip())>0: + if pbContent.GENRES >= 0 and len(movie[pbContent.GENRES].strip()) > 2: containList.add('containFilmGenres') - if pbContent.GROUPES>=0 and len(movie[pbContent.GROUPES].replace('[', '').replace(']', '').strip())>0: + if pbContent.GROUPES >= 0 and len(movie[pbContent.GROUPES].replace('[', '').replace(']', '').strip()) > 0: containList.add('containFilmGroupes') - if pbContent.YEAR>=0 and len(movie[pbContent.YEAR].strip())>0: + if pbContent.YEAR >= 0 and len(movie[pbContent.YEAR].strip()) > 1: containList.add('containFilmYear') - if pbContent.RES>=0 and len(movie[pbContent.RES].replace('[', '').replace(']', '').replace(',', '').strip())>0: + if pbContent.RES >= 0 and len(movie[pbContent.RES].replace('[', '').replace(']', '').replace(',', '').strip()) > 0: containList.add('containFilmRes') - if pbContent.DIRECTOR>=0 and len(movie[pbContent.DIRECTOR].replace('[', '').replace(']', '').replace(',', '').strip())>0: + if pbContent.DIRECTOR >= 0 and len(movie[pbContent.DIRECTOR].replace('[', '').replace(']', '').replace(',', '').strip()) > 0: containList.add('containFilmReal') - if pbContent.CAST>=0 and len(movie[pbContent.CAST].replace('[', '').replace(']', '').replace(',', '').strip())>0: + if pbContent.CAST >= 0 and len(movie[pbContent.CAST].replace('[', '').replace(']', '').replace(',', '').strip()) > 0: containList.add('containFilmCast') - if pbContent.SAISON>=0 and len(movie[pbContent.SAISON].strip())>0: + if pbContent.SAISON >= 0 and len(movie[pbContent.SAISON].strip()) > 0: containList.add('containFilmSaga') - if pbContent.NETWORK>=0 and len(movie[pbContent.NETWORK].replace('[', '').replace(']', '').strip())>0: + if pbContent.NETWORK >= 0 and len(movie[pbContent.NETWORK].replace('[', '').replace(']', '').strip()) > 0: containList.add('containFilmNetwork') elif 'serie' in movie[pbContent.CAT]: containList.add('containSeries') - if pbContent.GROUPES>=0 and len(movie[pbContent.GROUPES].replace('[', '').replace(']', '').strip())>0: + if pbContent.GENRES >= 0 and len(movie[pbContent.GENRES].strip()) > 2: + containList.add('containSerieGenres') + if pbContent.GROUPES >= 0 and len(movie[pbContent.GROUPES].replace('[', '').replace(']', '').strip()) > 0: containList.add('containSerieGroupes') - if pbContent.NETWORK>=0 and len(movie[pbContent.NETWORK].replace('[', '').replace(']', '').strip())>0: + if pbContent.NETWORK >=0 and len(movie[pbContent.NETWORK].replace('[', '').replace(']', '').strip()) > 0: containList.add('containSerieNetwork') - if pbContent.YEAR>=0 and len(movie[pbContent.YEAR].strip())>0: + if pbContent.YEAR >= 0 and len(movie[pbContent.YEAR].strip()) > 1: containList.add('containSerieYear') elif 'anime' in movie[pbContent.CAT]: containList.add('containAnimes') - if pbContent.GROUPES>=0 and len(movie[pbContent.GROUPES].replace('[', '').replace(']', '').strip())>0: + if pbContent.GROUPES >= 0 and len(movie[pbContent.GROUPES].replace('[', '').replace(']', '').strip()) > 0: containList.add('containAnimeGroupes') + if pbContent.NETWORK >=0 and len(movie[pbContent.NETWORK].replace('[', '').replace(']', '').strip()) > 0: + containList.add('containAnimeNetwork') + if pbContent.YEAR >= 0 and len(movie[pbContent.YEAR].strip()) > 1: + containList.add('containAnimeYear') + + elif 'divers' in movie[pbContent.CAT]: + containList.add('containDivers') + if pbContent.GENRES >= 0 and len(movie[pbContent.GENRES].strip()) > 2: + containList.add('containDiversGenres') + if pbContent.YEAR >= 0 and len(movie[pbContent.YEAR].strip()) > 1: + containList.add('containDiversYear') + if pbContent.GROUPES >= 0 and len(movie[pbContent.GROUPES].replace('[', '').replace(']', '').strip()) > 0: + containList.add('containDiversGroupes') return containList @@ -424,7 +735,7 @@ def showSearch(): sSearchText = oGui.showKeyBoard() if (sSearchText != False): sUrl += Quote(sSearchText) - + # Recherche globale si le pastebin n'est pas indiqué if KEY_PASTE_ID in sUrl: showSearchGlobal(sUrl) @@ -438,7 +749,7 @@ def showSearchGlobal(sSearch=''): sUrl = sSearch - for numID in range(1, PASTE_PAR_GROUPE): + for numID in range(1, GROUPE_MAX): prefixID = SETTING_PASTE_LABEL + str(numID) pastebin = addons.getSetting(prefixID) if pastebin: @@ -455,31 +766,28 @@ def showGenres(): oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') - sUrl, params = siteUrl.split('&',1) + sUrl, params = siteUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'film' pasteID = aParams['pasteID'] if 'pasteID' in aParams else None listeIDs = getPasteList(sUrl, pasteID) - + genres = {} + pbContent = PasteContent() for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - sContent = oRequestHandler.request() - pbContent = PasteBinContent() - movies = pbContent.getLines(sContent) - + movies = pbContent.getLines(pasteBin) + for movie in movies: - if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: + if pbContent.CAT >= 0 and sMedia not in movie[pbContent.CAT]: continue - + genre = movie[pbContent.GENRES].strip() if not genre or genre == '': - genre = "['"+UNCLASSIFIED_GENRE+"']" + genre = "['" + UNCLASSIFIED_GENRE + "']" elif "''" in genre: - genre = genre.replace("''", "'"+UNCLASSIFIED_GENRE+"'") + genre = genre.replace("''", "'" + UNCLASSIFIED_GENRE + "'") genre = eval(genre) if isinstance(genre, int): genre = [genre] @@ -488,9 +796,9 @@ def showGenres(): sDisplayGenre = g if str(g).isdigit(): sDisplayGenre = tmdb.getGenreFromID(g) - if not sDisplayGenre in genres: + if sDisplayGenre not in genres: genres[sDisplayGenre] = g - + genreKeys = genres.keys() for sDisplayGenre in sorted(genreKeys): genre = genres.get(sDisplayGenre) @@ -501,34 +809,31 @@ def showGenres(): oGui.setEndOfDirectory() + def showNetwork(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') - sUrl, params = siteUrl.split('&',1) + sUrl, params = siteUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'film' pasteID = aParams['pasteID'] if 'pasteID' in aParams else None - pbContent = PasteBinContent() + pbContent = PasteContent() movies = [] listeIDs = getPasteList(sUrl, pasteID) for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) + moviesBin = pbContent.getLines(pasteBin) movies += moviesBin listNetwork = {} for movie in movies: - if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: + if pbContent.CAT >= 0 and sMedia not in movie[pbContent.CAT]: continue networks = movie[pbContent.NETWORK].strip() - if networks <> '': + if networks != '': networks = eval(networks) if networks: for network in networks: @@ -551,15 +856,16 @@ def showNetwork(): oOutputParameterHandler.addParameter('sTmdbId', networkId) # Utilisé par TMDB oGui.addNetwork(SITE_IDENTIFIER, 'showMovies', networkName, 'host.png', oOutputParameterHandler) progress_.VSclose(progress_) - + oGui.setEndOfDirectory() + def showRealisateur(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') - sUrl, params = siteUrl.split('&',1) + sUrl, params = siteUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'film' pasteID = aParams['pasteID'] if 'pasteID' in aParams else None @@ -573,29 +879,25 @@ def showRealisateur(): numItem = int(numItem) numPage = int(numPage) - pbContent = PasteBinContent() + pbContent = PasteContent() movies = [] listeIDs = getPasteList(sUrl, pasteID) for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) + moviesBin = pbContent.getLines(pasteBin) movies += moviesBin listReal = {} for movie in movies: - if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: + if pbContent.CAT >= 0 and sMedia not in movie[pbContent.CAT]: continue reals = movie[pbContent.DIRECTOR].strip() - if reals <> '': + if reals != '': reals = eval(reals) if reals: for real in reals: if ':' in real: - realId, realName = real.split(':') + realId, realName = real.split(':') if realName not in listReal: listReal[realName] = realId @@ -622,57 +924,49 @@ def showRealisateur(): oGui.addPerson(SITE_IDENTIFIER, 'showMovies', realName, 'actor.png', oOutputParameterHandler) nbItem += 1 - if nbItem % ITEM_PAR_PAGE == 0 and numPage*ITEM_PAR_PAGE < len(listReal) : + if nbItem % ITEM_PAR_PAGE == 0 and numPage*ITEM_PAR_PAGE < len(listReal): numPage += 1 - + oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) oOutputParameterHandler.addParameter('numPage', numPage) oOutputParameterHandler.addParameter('numItem', numItem) - oGui.addNext(SITE_IDENTIFIER, 'showRealisateur', '[COLOR teal]Page ' + str(numPage) + ' >>>[/COLOR]', oOutputParameterHandler) + oGui.addNext(SITE_IDENTIFIER, 'showRealisateur', 'Page ' + str(numPage), oOutputParameterHandler) break progress_.VSclose(progress_) oGui.setEndOfDirectory() + def showCast(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') - - sUrl, params = siteUrl.split('&',1) - aParams = dict(param.split('=') for param in params.split('&')) - sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'film' - pasteID = aParams['pasteID'] if 'pasteID' in aParams else None numItem = oInputParameterHandler.getValue('numItem') numPage = oInputParameterHandler.getValue('numPage') - # Gestion de la pagination - if not numItem: - numItem = 0 - numPage = 1 - numItem = int(numItem) - numPage = int(numPage) + sUrl, params = siteUrl.split('&', 1) + aParams = dict(param.split('=') for param in params.split('&')) + sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'film' + pasteID = aParams['pasteID'] if 'pasteID' in aParams else None + if not numPage and 'numPage' in aParams: + numPage = aParams['numPage'] - pbContent = PasteBinContent() + pbContent = PasteContent() movies = [] listeIDs = getPasteList(sUrl, pasteID) for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) + moviesBin = pbContent.getLines(pasteBin) movies += moviesBin listActeur = {} for movie in movies: - if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: + if pbContent.CAT >= 0 and sMedia not in movie[pbContent.CAT]: continue acteurs = movie[pbContent.CAST].strip() - if acteurs <> '': + if acteurs != '': acteurs = eval(acteurs) if acteurs: for acteur in acteurs: @@ -681,6 +975,18 @@ def showCast(): if acteurName not in listActeur: listActeur[acteurName] = acteurId + # Gestion de la pagination + if not numItem: + numItem = 0 + else: + numItem = int(numItem) + numPage = int(numPage) + if numPage > 1 and numItem == 0: # choix d'une page + numItem = (numPage-1) * ITEM_PAR_PAGE + if numItem > len(listActeur): # accès direct à la dernière page + numPage = len(listActeur) / ITEM_PAR_PAGE + numItem = (numPage-1) * ITEM_PAR_PAGE + nbItem = 0 index = 0 maxProgress = min(len(listActeur), ITEM_PAR_PAGE) @@ -704,48 +1010,45 @@ def showCast(): oGui.addPerson(SITE_IDENTIFIER, 'showMovies', acteurName, 'actor.png', oOutputParameterHandler) nbItem += 1 - if nbItem % ITEM_PAR_PAGE == 0 and numPage*ITEM_PAR_PAGE < len(listActeur) : + if nbItem % ITEM_PAR_PAGE == 0 and numPage*ITEM_PAR_PAGE < len(listActeur): numPage += 1 - + oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) oOutputParameterHandler.addParameter('numPage', numPage) oOutputParameterHandler.addParameter('numItem', numItem) - oGui.addNext(SITE_IDENTIFIER, 'showCast', '[COLOR teal]Page ' + str(numPage) + ' >>>[/COLOR]', oOutputParameterHandler) + oGui.addNext(SITE_IDENTIFIER, 'showCast', 'Page ' + str(numPage), oOutputParameterHandler) break progress_.VSclose(progress_) oGui.setEndOfDirectory() + def showGroupes(): oGui = cGui() - + oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') - sUrl, params = siteUrl.split('&',1) + sUrl, params = siteUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'film' pasteID = aParams['pasteID'] if 'pasteID' in aParams else None - pbContent = PasteBinContent() + pbContent = PasteContent() movies = [] listeIDs = getPasteList(sUrl, pasteID) for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) + moviesBin = pbContent.getLines(pasteBin) movies += moviesBin sousGroupe = set() groupesPerso = set() for movie in movies: - if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: + if pbContent.CAT >= 0 and sMedia not in movie[pbContent.CAT]: continue - groupe = movie[pbContent.GROUPES].strip().replace("''",'') + groupe = movie[pbContent.GROUPES].strip().replace("''", '') if groupe: groupe = eval(groupe) if groupe: @@ -769,32 +1072,29 @@ def showGroupes(): oGui.setEndOfDirectory() + def showGroupeDetails(): oGui = cGui() - + oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') - sUrl, params = siteUrl.split('&',1) + sUrl, params = siteUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) pasteID = aParams['pasteID'] if 'pasteID' in aParams else None - sGroupe = aParams['sGroupe'] + ':' if 'sGroupe' in aParams else None + sGroupe = aParams['sGroupe'].replace('+', ' ') + ':' if 'sGroupe' in aParams else None - pbContent = PasteBinContent() + pbContent = PasteContent() movies = [] listeIDs = getPasteList(sUrl, pasteID) for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) + moviesBin = pbContent.getLines(pasteBin) movies += moviesBin groupes = set() if sGroupe: for movie in movies: - groupe = movie[pbContent.GROUPES].strip().replace("''",'') + groupe = movie[pbContent.GROUPES].strip().replace("''", '') if groupe: groupe = eval(groupe) if groupe: @@ -811,6 +1111,7 @@ def showGroupeDetails(): oGui.setEndOfDirectory() + def showSaga(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() @@ -818,57 +1119,61 @@ def showSaga(): numItem = oInputParameterHandler.getValue('numItem') numPage = oInputParameterHandler.getValue('numPage') - sUrl, params = siteUrl.split('&',1) + sUrl, params = siteUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'film' pasteID = aParams['pasteID'] if 'pasteID' in aParams else None + if not numPage and 'numPage' in aParams: + numPage = aParams['numPage'] - if not numItem: - numItem = 0 - numPage = 1 - numItem = int(numItem) - numPage = int(numPage) - - pbContent = PasteBinContent() + pbContent = PasteContent() movies = [] listeIDs = getPasteList(sUrl, pasteID) for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) + moviesBin = pbContent.getLines(pasteBin) movies += moviesBin sagas = {} for movie in movies: - if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: + if pbContent.CAT >= 0 and sMedia not in movie[pbContent.CAT]: continue saga = movie[pbContent.SAISON].strip() - if saga <> '': + if saga != '': sTmdbId = name = saga idName = saga.split(':', 1) - if len(idName)>1: + if len(idName) > 1: sTmdbId = idName[0] name = idName[1] if sTmdbId.isdigit(): sagas[name] = sTmdbId else: sagas[saga] = saga - + + # Gestion de la pagination + if not numItem: + numItem = 0 + else: + numItem = int(numItem) + numPage = int(numPage) + if numPage > 1 and numItem == 0: # choix d'une page + numItem = (numPage-1) * ITEM_PAR_PAGE + if numItem > len(sagas): # accès direct à la dernière page + numPage = len(sagas) / ITEM_PAR_PAGE + numItem = (numPage-1) * ITEM_PAR_PAGE + nbItem = 0 index = 0 progress_ = progress().VScreate(SITE_NAME) names = sagas.keys() for sSagaName in sorted(names): - + # Pagination, on se repositionne index += 1 if index <= numItem: continue numItem += 1 - + progress_.VSupdate(progress_, ITEM_PAR_PAGE) if progress_.iscanceled(): break @@ -877,32 +1182,31 @@ def showSaga(): oOutputParameterHandler = cOutputParameterHandler() if sTmdbId.isdigit(): - oOutputParameterHandler.addParameter('sTmdbId', sTmdbId) # Utilisé par TMDB + oOutputParameterHandler.addParameter('sTmdbId', sTmdbId) # Utilisé par TMDB sUrl = siteUrl + '&sSaga=' + sTmdbId + ':' + sSagaName else: sUrl = siteUrl + '&sSaga=' + sSagaName oOutputParameterHandler.addParameter('siteUrl', sUrl) - + sDisplaySaga = sSagaName - sSagaName = sSagaName.replace('[', '').replace(']', '') # Exemple pour le film [REC], les crochets sont génant pour certaines fonctions + sSagaName = sSagaName.replace('[', '').replace(']', '') # Exemple pour le film [REC], les crochets sont génant pour certaines fonctions if not sSagaName.lower().endswith('saga'): sSagaName = sSagaName + " Saga" oOutputParameterHandler.addParameter('sMovieTitle', sSagaName) - + oGui.addMoviePack(SITE_IDENTIFIER, 'showMovies', sDisplaySaga, 'genres.png', '', '', oOutputParameterHandler) nbItem += 1 - if nbItem % ITEM_PAR_PAGE == 0 and numPage*ITEM_PAR_PAGE < len(names) : + if nbItem % ITEM_PAR_PAGE == 0 and numPage*ITEM_PAR_PAGE < len(names): numPage += 1 - + oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) oOutputParameterHandler.addParameter('numPage', numPage) oOutputParameterHandler.addParameter('numItem', numItem) - oGui.addNext(SITE_IDENTIFIER, 'showSaga', '[COLOR teal]Page ' + str(numPage) + ' >>>[/COLOR]', oOutputParameterHandler) + oGui.addNext(SITE_IDENTIFIER, 'showSaga', 'Page ' + str(numPage), oOutputParameterHandler) break - progress_.VSclose(progress_) oGui.setEndOfDirectory() @@ -913,25 +1217,21 @@ def showYears(): oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') - sUrl, params = siteUrl.split('&',1) + sUrl, params = siteUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'film' pasteID = aParams['pasteID'] if 'pasteID' in aParams else None - pbContent = PasteBinContent() + pbContent = PasteContent() movies = [] listeIDs = getPasteList(sUrl, pasteID) for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) + moviesBin = pbContent.getLines(pasteBin) movies += moviesBin years = set() for line in movies: - if pbContent.CAT >=0 and sMedia not in line[pbContent.CAT]: + if pbContent.CAT >= 0 and sMedia not in line[pbContent.CAT]: continue year = line[pbContent.YEAR].strip() @@ -943,7 +1243,7 @@ def showYears(): sUrl = siteUrl + '&sYear=' + sYear oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) - oGui.addDir(SITE_IDENTIFIER, 'showMovies', sYear, 'years.png', oOutputParameterHandler) + oGui.addDir(SITE_IDENTIFIER, 'showMovies', sYear, 'annees.png', oOutputParameterHandler) oGui.setEndOfDirectory() @@ -953,25 +1253,21 @@ def showResolution(): oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') - sUrl, params = siteUrl.split('&',1) + sUrl, params = siteUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'film' pasteID = aParams['pasteID'] if 'pasteID' in aParams else None - pbContent = PasteBinContent() + pbContent = PasteContent() movies = [] listeIDs = getPasteList(sUrl, pasteID) for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) + moviesBin = pbContent.getLines(pasteBin) movies += moviesBin resolutions = set() for line in movies: - if pbContent.CAT >=0 and sMedia not in line[pbContent.CAT]: + if pbContent.CAT >= 0 and sMedia not in line[pbContent.CAT]: continue res = line[pbContent.RES].strip() @@ -984,29 +1280,33 @@ def showResolution(): else: resolutions.add(res) - if not res or res == '[]' : resolutions.add(UNCLASSIFIED) + if not res or res == '[]': + resolutions.add(UNCLASSIFIED) resolutions.discard('') - - # Trie des rsolutions - resOrder = ['8K','4K','1080P', '1080p', '720P', '720p', '576p', '540P', '540p', '480P', '480p', '360P', '360p'] + + # Trie des résolutions + resOrder = ['8K', '4K', '1080P', '720P', '576P', '540P', '480P', '360P'] + def trie_res(key): if key == UNCLASSIFIED: return 20 + key = key.replace('p', 'P') if key not in resOrder: resOrder.append(key) return resOrder.index(key) - + resolutions = sorted(resolutions, key=trie_res) for sRes in resolutions: - if sRes == '': continue + if sRes == '': + continue sDisplayRes = sRes if sDisplayRes.isdigit(): sDisplayRes += 'p' sDisplayRes = sDisplayRes\ .replace('P', 'p')\ - .replace('1080p', 'HD [1080p]')\ + .replace('1080p', 'fullHD [1080p]')\ .replace('720p', 'HD [720p]')\ .replace('540p', 'SD [540p]')\ .replace('480p', 'SD [480p]')\ @@ -1051,71 +1351,114 @@ def showMovies(sSearch=''): siteUrl = oInputParameterHandler.getValue('siteUrl') numItem = oInputParameterHandler.getValue('numItem') numPage = oInputParameterHandler.getValue('numPage') - sMedia = 'film' # Par défaut + sMedia = 'film' # Par défaut pasteID = sGenre = sSaga = sGroupe = sYear = sRes = sAlpha = sNetwork = sDirector = sCast = None - bRandom = False - + bRandom = bNews = False + if sSearch: siteUrl = sSearch - if not numItem: - numItem = 0 - numPage = 1 - numItem = int(numItem) - numPage = int(numPage) - sSearchTitle = '' - + # Pour supporter les caracteres '&' et '+' dans les noms alors qu'ils sont réservés sUrl = siteUrl.replace('+', ' ').replace('|', '+').replace(' & ', ' | ') - - sUrl, params = sUrl.split('&',1) + + sUrl, params = sUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) - if 'pasteID' in aParams: pasteID = aParams['pasteID'] - if 'sMedia' in aParams: sMedia = aParams['sMedia'] - if 'sSearch' in aParams: sSearchTitle = Unquote(aParams['sSearch']).replace(' | ', ' & ') - if 'sGenre' in aParams: sGenre = aParams['sGenre'].replace(' | ', ' & ') + if 'pasteID' in aParams: + pasteID = aParams['pasteID'] + if 'sMedia' in aParams: + sMedia = aParams['sMedia'] + if 'sSearch' in aParams: + sSearchTitle = Unquote(aParams['sSearch']).replace(' | ', ' & ') + if 'sGenre' in aParams: + sGenre = aParams['sGenre'].replace(' | ', ' & ') if 'sSaga' in aParams: sSaga = aParams['sSaga'].replace(' | ', ' & ') - if 'sGroupe' in aParams: sGroupe = aParams['sGroupe'].replace(' | ', ' & ') - if 'sYear' in aParams: sYear = aParams['sYear'] - if 'sRes' in aParams: sRes = aParams['sRes'] - if 'sAlpha' in aParams: sAlpha = aParams['sAlpha'] - if 'sNetwork' in aParams: sNetwork = aParams['sNetwork'] - if 'sDirector' in aParams: sDirector = aParams['sDirector'] - if 'sCast' in aParams: sCast = aParams['sCast'] - if 'bRandom' in aParams: bRandom = aParams['bRandom'] + if 'sGroupe' in aParams: + sGroupe = aParams['sGroupe'].replace(' | ', ' & ') + if 'sYear' in aParams: + sYear = aParams['sYear'] + if 'sRes' in aParams: + sRes = aParams['sRes'] + if 'sAlpha' in aParams: + sAlpha = aParams['sAlpha'] + if 'sNetwork' in aParams: + sNetwork = aParams['sNetwork'] + if 'sDirector' in aParams: + sDirector = aParams['sDirector'] + if 'sCast' in aParams: + sCast = aParams['sCast'] + if 'bRandom' in aParams: + bRandom = aParams['bRandom'] + if 'bNews' in aParams: + bNews = aParams['bNews'] + if not numPage and 'numPage' in aParams: + numPage = aParams['numPage'] - pbContent = PasteBinContent() + pbContent = PasteContent() movies = [] + pasteLen = [] + pasteMaxLen = [] + maxlen = 0 listeIDs = getPasteList(sUrl, pasteID) + for pasteBin in listeIDs: - oRequestHandler = cRequestHandler(URL_MAIN + pasteBin) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) + moviesBin = pbContent.getLines(pasteBin) movies += moviesBin + pasteLen.append(len(moviesBin)) + maxlen += len(moviesBin) + pasteMaxLen.append(maxlen) + # si plusieurs pastes, on les parcourt en parallèle + if (bNews or sYear or sGenre or sRes) and len(listeIDs) > 1: + moviesNews = [] + i = j = k = 0 + lenMovie = len(movies) + while k < lenMovie: + if i < pasteMaxLen[j]: + moviesNews.append(movies[i]) + k += 1 + i += pasteLen[j] + j += 1 + if j >= len(pasteMaxLen): + i = (i % lenMovie) + 1 + j=0 + + movies = moviesNews + # Recherche par ordre alphabetique => le tableau doit être trié if sAlpha: movies = sorted(movies, key=lambda line: line[pbContent.TITLE]) - + # Recherche par saga => trie par années - if sSaga and pbContent.YEAR>=0: + if sSaga and pbContent.YEAR >= 0: movies = sorted(movies, key=lambda line: line[pbContent.YEAR]) # Dans un dossier => trie par années inversées (du plus récent) if sGroupe or sDirector or sCast: movies = sorted(movies, key=lambda line: line[pbContent.YEAR], reverse=True) + # Gestion de la pagination + if not numItem: + numItem = 0 + else: + numItem = int(numItem) + numPage = int(numPage) + if numPage > 1 and numItem == 0: # choix d'une page + numItem = (numPage-1) * ITEM_PAR_PAGE + if numItem > len(movies): # accès direct à la dernière page + numPage = len(movies) / ITEM_PAR_PAGE + numItem = (numPage-1) * ITEM_PAR_PAGE + if bRandom: numItem = 0 # Génération d'indices aléatoires, ajout de deux indices car les doublons aléatoires sont rassemblés randoms = [random.randint(0, len(movies)) for _ in range(ITEM_PAR_PAGE+2)] - + movieIds = set() - + nbItem = 0 index = 0 progress_ = progress().VScreate(SITE_NAME) @@ -1132,7 +1475,7 @@ def showMovies(sSearch=''): continue numItem += 1 - # Filtrage par média (film/série), "film" par défaut si pas précisé + # Filtrage par média (film/série), "film" par défaut si pas précisé if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: continue @@ -1141,7 +1484,7 @@ def showMovies(sSearch=''): continue # Filtrage par genre - if sGenre and pbContent.GENRES >=0 : + if sGenre and pbContent.GENRES >= 0: genres = movie[pbContent.GENRES].strip() if not genres or genres == '' or "''" in genres: if sGenre != UNCLASSIFIED_GENRE: @@ -1153,7 +1496,7 @@ def showMovies(sSearch=''): continue # Filtrage par réalisateur - if sDirector and pbContent.DIRECTOR >= 0 : + if sDirector and pbContent.DIRECTOR >= 0: listDirector = movie[pbContent.DIRECTOR].strip() if not listDirector: continue @@ -1162,7 +1505,7 @@ def showMovies(sSearch=''): continue # Filtrage par acteur - if sCast and pbContent.CAST >=0 : + if sCast and pbContent.CAST >= 0: listCast = movie[pbContent.CAST].strip() if not listCast: continue @@ -1171,7 +1514,7 @@ def showMovies(sSearch=''): continue # Filtrage par diffuseur - if sNetwork and pbContent.NETWORK >= 0 : + if sNetwork and pbContent.NETWORK >= 0: listNetwork = movie[pbContent.NETWORK].strip() if not listNetwork: continue @@ -1188,17 +1531,22 @@ def showMovies(sSearch=''): if sGroupe not in groupes: continue + # Filtrage par titre + sTitle = movie[pbContent.TITLE].strip() + # l'ID TMDB sTmdbId = None if pbContent.TMDB >= 0: sTmdbId = movie[pbContent.TMDB].strip() - if sTmdbId in movieIds: + if sTmdbId: + if sTmdbId in movieIds: + continue # Filtre des doublons + movieIds.add(sTmdbId) + if not sTmdbId: + if sTitle in movieIds: continue # Filtre des doublons - movieIds.add(sTmdbId) + movieIds.add(sTitle) - # Filtrage par titre - sTitle = movie[pbContent.TITLE].strip() - # Titre recherché if sSearchTitle: if cUtil().CheckOccurence(sSearchTitle, sTitle) == 0: @@ -1225,9 +1573,9 @@ def showMovies(sSearch=''): # Filtrage par résolutions vidéos listRes = None - + if 'film' in sMedia: - if pbContent.RES>=0: + if pbContent.RES >= 0: res = movie[pbContent.RES].strip() listRes = [] if '[' in res: @@ -1236,26 +1584,32 @@ def showMovies(sSearch=''): listRes.append(res) if len(listRes) == 0: listRes.append('') - + if sRes: if sRes == UNCLASSIFIED: if '' not in listRes: continue elif sRes not in listRes: continue - + nbItem += 1 progress_.VSupdate(progress_, ITEM_PAR_PAGE) if progress_.iscanceled(): break sUrl = URL_MAIN - if sMedia : sUrl += '&sMedia=' + sMedia - if pasteID: sUrl += '&pasteID=' + pasteID - if movieYear : sUrl += '&sYear=' + movieYear - if sTmdbId: sUrl += '&idTMDB=' + sTmdbId + if sMedia: + sUrl += '&sMedia=' + sMedia + if pasteID: + sUrl += '&pasteID=' + pasteID + if movieYear: + sUrl += '&sYear=' + movieYear + if sTmdbId: + sUrl += '&idTMDB=' + sTmdbId + if sRes: + sUrl += '&sRes=' + sRes sUrl += '&sTitle=' + sTitle - + # Pour supporter les caracteres '&' et '+' dans les noms alors qu'ils sont réservés sTitle = sTitle.replace('+', ' ').replace(' & ', ' | ') sTitle = sTitle.replace('[', '').replace(']', '') # Exemple pour le film [REC], les crochets sont génants pour certaines fonctions @@ -1263,27 +1617,32 @@ def showMovies(sSearch=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sMovieTitle', sTitle) - if sTmdbId: oOutputParameterHandler.addParameter('sTmdbId', sTmdbId) # Utilisé par TMDB - if movieYear : oOutputParameterHandler.addParameter('sYear', movieYear) # Utilisé par TMDB - if listRes: oOutputParameterHandler.addParameter('listRes', listRes) + if sTmdbId: + oOutputParameterHandler.addParameter('sTmdbId', sTmdbId) # Utilisé par TMDB + if movieYear: + oOutputParameterHandler.addParameter('sYear', movieYear) # Utilisé par TMDB + if listRes: + oOutputParameterHandler.addParameter('listRes', listRes) if sMedia == 'serie': oGui.addTV(SITE_IDENTIFIER, 'showSerieSaisons', sDisplayTitle, 'series.png', '', '', oOutputParameterHandler) elif sMedia == 'anime': oGui.addAnime(SITE_IDENTIFIER, 'showSerieSaisons', sDisplayTitle, 'animes.png', '', '', oOutputParameterHandler) + elif sMedia == 'divers': + oGui.addMisc(SITE_IDENTIFIER, 'showHosters', sDisplayTitle, 'doc.png', '', '', oOutputParameterHandler) else: oGui.addMovie(SITE_IDENTIFIER, 'showHosters', sDisplayTitle, 'films.png', '', '', oOutputParameterHandler) # Gestion de la pagination if not sSearch: - - if nbItem % ITEM_PAR_PAGE == 0 and numPage*ITEM_PAR_PAGE < len(movies) : + + if nbItem % ITEM_PAR_PAGE == 0 and numPage*ITEM_PAR_PAGE < len(movies): numPage += 1 oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) oOutputParameterHandler.addParameter('numPage', numPage) oOutputParameterHandler.addParameter('numItem', numItem) - oGui.addNext(SITE_IDENTIFIER, 'showMovies', '[COLOR teal]Page ' + str(numPage) + ' >>>[/COLOR]', oOutputParameterHandler) + oGui.addNext(SITE_IDENTIFIER, 'showMovies', 'Page ' + str(numPage), oOutputParameterHandler) break progress_.VSclose(progress_) @@ -1302,26 +1661,22 @@ def showSerieSaisons(): # Pour supporter les caracteres '&' et '+' dans les noms alors qu'ils sont réservés sUrl = siteUrl.replace('+', ' ').replace('|', '+').replace(' & ', ' | ') - sUrl, params = sUrl.split('&',1) + sUrl, params = sUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) pasteID = aParams['pasteID'] if 'pasteID' in aParams else None idTMDB = aParams['idTMDB'] if 'idTMDB' in aParams else None sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'serie' - saisons = [] + saisons = {} listeIDs = getPasteList(sUrl, pasteID) - pbContent = PasteBinContent() + pbContent = PasteContent() for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) + moviesBin = pbContent.getLines(pasteBin) # Recherche les saisons de la série for serie in moviesBin: - - if pbContent.CAT >=0 and sMedia not in moviesBin[pbContent.CAT]: + + if pbContent.CAT >= 0 and sMedia not in serie[pbContent.CAT]: continue # Recherche par id @@ -1335,8 +1690,6 @@ def showSerieSaisons(): # Sinon, recherche par titre/année if not found: - if pbContent.CAT >= 0 and 'serie' not in serie[pbContent.CAT]: - continue if searchYear and pbContent.YEAR >= 0: sYear = serie[pbContent.YEAR].strip() if sYear and sYear != searchYear: @@ -1345,61 +1698,90 @@ def showSerieSaisons(): sTitle = serie[pbContent.TITLE].strip() if sTitle != searchTitle: continue - + numSaison = serie[pbContent.SAISON].strip() if numSaison not in saisons: - saisons.append(numSaison) - - - # Une seule saison, directement les épisodes - if len(saisons) == 1: - siteUrl += '&sSaison=' + saisons[0] - showEpisodesLinks(siteUrl) - return + saisons[numSaison] = set() + # Résolutions dispo pour la saison + listRes = saisons[numSaison] + if pbContent.RES >= 0: + res = serie[pbContent.RES].strip() + if '[' in res: + for r in eval(res): + listRes.add(r) + else: + listRes.add(res) + + +# # Une seule saison, directement les épisodes +# if len(saisons) == 1: +# key, res = saisons.items() +# siteUrl += '&sSaison=' + key +# showEpisodesLinks(siteUrl) +# return # Proposer les différentes saisons - for sSaison in sorted(saisons): - sUrl = siteUrl + '&sSaison=' + sSaison + saisons = sorted(saisons.items(), key=lambda saison: saison[0]) + for sSaison, res in saisons: + sDisplaySaison = sSaison if sSaison.isdigit(): - sSaison = 'S{:02d}'.format(int(sSaison)) - - sDisplayTitle = searchTitle + ' - ' + sSaison - oOutputParameterHandler = cOutputParameterHandler() - oOutputParameterHandler.addParameter('siteUrl', sUrl) - oOutputParameterHandler.addParameter('sMovieTitle', sDisplayTitle) # on ne passe pas le sTitre afin de pouvoir mettre la saison en marque-page - oGui.addEpisode(SITE_IDENTIFIER, 'showEpisodesLinks', sDisplayTitle, 'series.png', '', '', oOutputParameterHandler) + sDisplaySaison = 'S{:02d}'.format(int(sSaison)) + + if len(res) == 0: + sUrl = siteUrl + '&sSaison=' + sSaison + sDisplayTitle = searchTitle + ' - ' + sDisplaySaison + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl) + oOutputParameterHandler.addParameter('sMovieTitle', sDisplayTitle) # on ne passe pas le sTitre afin de pouvoir mettre la saison en marque-page + oGui.addEpisode(SITE_IDENTIFIER, 'showEpisodesLinks', sDisplayTitle, 'series.png', '', '', oOutputParameterHandler) + else: + for resolution in res: + sUrl = siteUrl + '&sSaison=' + sSaison + '&sRes=' + resolution + sDisplayTitle = ('%s %s [%s]') % (searchTitle, sDisplaySaison, resolution) + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('siteUrl', sUrl) + oOutputParameterHandler.addParameter('sMovieTitle', sDisplayTitle) # on ne passe pas le sTitre afin de pouvoir mettre la saison en marque-page + oGui.addEpisode(SITE_IDENTIFIER, 'showEpisodesLinks', sDisplayTitle, 'series.png', '', '', oOutputParameterHandler) oGui.setEndOfDirectory() -def showEpisodesLinks(siteUrl = ''): +def showEpisodesLinks(siteUrl=''): oGui = cGui() - - if not siteUrl: + + if not siteUrl: oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') - + # Pour supporter les caracteres '&' et '+' dans les noms alors qu'ils sont réservés sUrl = siteUrl.replace('+', ' ').replace('|', '+').replace(' & ', ' | ') - - params = sUrl.split('&',1)[1] + params = sUrl.split('&', 1)[1] aParams = dict(param.split('=') for param in params.split('&')) sSaison = aParams['sSaison'] if 'sSaison' in aParams else None + sRes = aParams['sRes'] if 'sRes' in aParams else None searchTitle = aParams['sTitle'].replace(' | ', ' & ') - + if not sSaison: oGui.setEndOfDirectory() return - - lines = getHosterList(siteUrl)[0] + + lines, listRes = getHosterList(siteUrl) + if len(listRes) != len(lines): + listRes = None listeEpisodes = [] + resIdx = 0 for episode in lines: + if listRes: + res = listRes[resIdx] + resIdx += 1 + if sRes != res: + continue for numEpisode in episode.keys(): - if not numEpisode in listeEpisodes: + if numEpisode not in listeEpisodes: listeEpisodes.append(numEpisode) - + sDisplaySaison = sSaison if sSaison.isdigit(): sDisplaySaison = 'S{:02d}'.format(int(sSaison)) @@ -1412,12 +1794,12 @@ def showEpisodesLinks(siteUrl = ''): else: episode = '{}{}'.format(sDisplaySaison, episode) sDisplayTitle = searchTitle + ' - ' + episode - + oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sMovieTitle', sDisplayTitle) oGui.addEpisode(SITE_IDENTIFIER, 'showHosters', sDisplayTitle, 'series.png', '', '', oOutputParameterHandler) - + oGui.setEndOfDirectory() @@ -1427,27 +1809,48 @@ def showHosters(): sTitle = oInputParameterHandler.getValue('sMovieTitle') siteUrl = oInputParameterHandler.getValue('siteUrl') - listHoster, listRes = getHosterList(siteUrl) + sUrl = siteUrl.replace('+', ' ').replace('|', '+').replace(' & ', ' | ') + params = sUrl.split('&', 1)[1] + aParams = dict(param.split('=') for param in params.split('&')) + sRes = aParams['sRes'] if 'sRes' in aParams else None - if len(listRes) != len (listHoster): + listHoster, listRes = getHosterList(siteUrl) + + if len(listRes) != len(listHoster): listRes = None resIdx = 0 for sHosterUrl in listHoster: if not sHosterUrl.startswith('http'): - sHosterUrl += 'http://'+ sHosterUrl + sHosterUrl += 'http://' + sHosterUrl + + if '/dl/' in sHosterUrl or '.download.' in sHosterUrl: + oHoster = cHosterGui().getHoster('lien_direct') + else: + oHoster = cHosterGui().checkHoster(sHosterUrl) - oHoster = cHosterGui().checkHoster(sHosterUrl) if (oHoster != False): - + if listRes: res = listRes[resIdx] - if res.isdigit(): res += 'p' - res = res.replace('P', 'p').replace('1080p', 'HD').replace('720p', 'HD').replace('2160p', '4K') - sDisplayName = sTitle - if res: sDisplayName += ' [%s]' %res resIdx += 1 + + # Filtre la résolution si demandée + if sRes: + if sRes == UNCLASSIFIED: + if res: + continue + else: + if sRes != res: + continue + + if res.isdigit(): + res += 'p' + res = res.replace('P', 'p').replace('1080p', 'fullHD').replace('720p', 'HD').replace('2160p', '4K') + sDisplayName = sTitle + if res: + sDisplayName += ' [%s]' % res else: sDisplayName = sTitle @@ -1457,12 +1860,13 @@ def showHosters(): oGui.setEndOfDirectory() + # Retrouve tous les liens disponibles pour un film, ou un épisode, gère les groupes multipaste def getHosterList(siteUrl): # Pour supporter les caracteres '&' et '+' dans les noms alors qu'ils sont réservés sUrl = siteUrl.replace('+', ' ').replace('|', '+').replace(' & ', ' | ') - siteUrl, params = sUrl.split('&',1) + siteUrl, params = sUrl.split('&', 1) aParams = dict(param.split('=') for param in params.split('&')) sMedia = aParams['sMedia'] if 'sMedia' in aParams else 'film' pasteID = aParams['pasteID'] if 'pasteID' in aParams else None @@ -1472,87 +1876,108 @@ def getHosterList(siteUrl): idTMDB = aParams['idTMDB'] if 'idTMDB' in aParams else None searchTitle = aParams['sTitle'].replace(' | ', ' & ') - pbContent = PasteBinContent() - movies = [] - listeIDs = getPasteList(siteUrl, pasteID) - for pasteBin in listeIDs: - sUrl = URL_MAIN + pasteBin - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - moviesBin = pbContent.getLines(sContent) - movies += moviesBin - + pbContent = PasteContent() listHoster = [] listRes = [] + listeIDs = getPasteList(siteUrl, pasteID) + + for pasteBin in listeIDs: + moviesBin = pbContent.getLines(pasteBin) - for movie in movies: + for movie in moviesBin: - # Filtrer par catégorie - if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: - continue - - # Filtrage par saison - if searchSaison and pbContent.SAISON >= 0: - sSaisons = movie[pbContent.SAISON].strip() - if sSaisons and searchSaison != sSaisons: - continue - - # Recherche par id - found = False - if idTMDB and pbContent.TMDB >= 0: - sMovieID = movie[pbContent.TMDB].strip() - if sMovieID: - if sMovieID != idTMDB: - continue - found = True - - # sinon, recherche par titre/année - if not found: - # Filtrage par années - if searchYear and pbContent.YEAR >= 0: - sYear = movie[pbContent.YEAR].strip() - if sYear and sYear != searchYear: - continue - - # Filtrage par titre - sTitle = movie[pbContent.TITLE].strip() - if sTitle != searchTitle: + # Filtrer par catégorie + if pbContent.CAT >= 0 and sMedia not in movie[pbContent.CAT]: continue - links = movie[pbContent.URLS] - if "[" in links: - links = eval(links) - listHoster.extend(links) - elif isinstance(links, list): - listHoster.extend(links) - else: - if searchEpisode: - for numEpisode, link in links.items(): - if str(numEpisode) == searchEpisode: - listHoster.append(link) - break - else: - listHoster.append(links) + # Filtrage par saison + if searchSaison and pbContent.SAISON >= 0: + sSaisons = movie[pbContent.SAISON].strip() + if sSaisons and searchSaison != sSaisons: + continue - # Retrouve les résolutions pour les films - if pbContent.RES >= 0 and 'film' in sMedia: - res = movie[pbContent.RES].strip() - if '[' in res: - listRes.extend(eval(res)) + # Recherche par id + found = False + if idTMDB and pbContent.TMDB >= 0: + sMovieID = movie[pbContent.TMDB].strip() + if sMovieID: + if sMovieID != idTMDB: + continue + found = True + + # sinon, recherche par titre/année + if not found: + # Filtrage par années + if searchYear and pbContent.YEAR >= 0: + sYear = movie[pbContent.YEAR].strip() + if sYear and sYear != searchYear: + continue + + # Filtrage par titre + sTitle = movie[pbContent.TITLE].strip() + if sTitle != searchTitle: + continue + + links = movie[pbContent.URLS] + + # numérotation des épisodes 08 -> 8 (problème de décodage en octal) + if "{" in links: + links = links.replace('{0', '{').replace('{:', '{0:').replace(',0', ',') + + listLinks = [] + + if "[" in links or "{" in links: + links = eval(links) + + # Films + if isinstance(links, list): + for link in links: + listLinks.append(link) + + #Séries + elif isinstance(links, dict): + if searchEpisode: + for numEpisode, link in links.items(): + if str(numEpisode) == searchEpisode: + listLinks.append(link) + break + else: + listHoster.append(links) + + # lien direct else: - listRes.append(res) - if len(listRes) < len(links): # On complete les résolutions manquantes - for _ in range(len(links) - len(listRes)): - listRes.append('') + listLinks.append(links) + + if len(listLinks) > 0: + listLinks = [(pbContent.resolveLink(pasteBin, link)) for link in listLinks] + listHoster.extend(listLinks) + + # Retrouve les résolutions pour les films + if pbContent.RES >= 0 and 'film' in sMedia: + res = movie[pbContent.RES].strip() + if '[' in res: + listRes.extend(eval(res)) + else: + listRes.append(res) + if len(listRes) < len(links): # On complete les résolutions manquantes + for _ in range(len(links) - len(listRes)): + listRes.append('') + + # Retrouve les résolutions pour les séries + if pbContent.RES >= 0 and 'serie' in sMedia: + res = movie[pbContent.RES].strip() + if '[' in res: + listRes.extend(eval(res)) + else: + listRes.append(res) # Supprime les doublons en gardant l'ordre # links = [links.extend(elem) for elem in listHoster if not elem in links] return listHoster, listRes - -# Ajout d'un lien pastebin + +# Ajout d'un dossier pastebin def addPasteName(): oGui = cGui() addons = addon() @@ -1560,19 +1985,18 @@ def addPasteName(): # Recherche d'un setting de libre names = set() newID = 0 - for numID in range(1, PASTE_PAR_GROUPE): + for numID in range(1, GROUPE_MAX): pasteLabel = addons.getSetting(SETTING_PASTE_LABEL + str(numID)) if pasteLabel == '': if newID == 0: newID = numID else: names.add(pasteLabel) # Labels déjà utilisés - + settingLabel = SETTING_PASTE_LABEL + str(newID) - - + # Demande du label et controle si déjà existant - sLabel = oGui.showKeyBoard('', "Saisir un nom") + sLabel = oGui.showKeyBoard('', "[COLOR coral]Saisir un nom pour le dossier[/COLOR]") if sLabel == False: return if sLabel in names: @@ -1582,10 +2006,122 @@ def addPasteName(): # Enregistrer Label/id dans les settings addons.setSetting(settingLabel, sLabel) dialog().VSinfo(addons.VSlang(30042)) - + oGui.updateDirectory() +# Retirer un dossier PasteBin +def deletePasteName(): + + addons = addon() + if not dialog().VSyesno(addons.VSlang(30456)): + return + + cache = PasteCache() + oInputParameterHandler = cInputParameterHandler() + pasteID = oInputParameterHandler.getValue('pasteID') + + labelSetting = SETTING_PASTE_LABEL + pasteID + addons.setSetting(labelSetting, '') + + prefixID = SETTING_PASTE_ID + str(pasteID) + pasteID = addons.getSetting(prefixID) + if pasteID: + addons.setSetting(prefixID, '') + cache.remove(pasteID) + + for numID in range(1, PASTE_PAR_GROUPE): + settingID = prefixID + '_' + str(numID) + pasteID = addons.getSetting(settingID) + if pasteID: + addons.setSetting(settingID, '') + cache.remove(pasteID) + + cGui().updateDirectory() + + +# Renommer un dossier PasteBin +def renamePasteName(): + + addons = addon() + oGui = cGui() + + # Recherche d'un setting de libre + names = set() + for numID in range(1, GROUPE_MAX): + pasteLabel = addons.getSetting(SETTING_PASTE_LABEL + str(numID)) + if pasteLabel: + names.add(pasteLabel) # Labels déjà utilisés + + # Demande du label et controle si déjà existant + sLabel = oGui.showKeyBoard('', "[COLOR coral]Saisir un nom pour le dossier[/COLOR]") + if sLabel == False: + return + if sLabel in names: + dialog().VSok(addons.VSlang(30082)) + return + + # Mettre à jour Label + oInputParameterHandler = cInputParameterHandler() + pasteID = oInputParameterHandler.getValue('pasteID') + labelSetting = SETTING_PASTE_LABEL + pasteID + addons.setSetting(labelSetting, sLabel) + dialog().VSinfo(addons.VSlang(30042)) + + oGui.updateDirectory() + + +# Forcer la mise à jour d'un dossier PasteBin +def refreshPaste(): + + addons = addon() + cache = PasteCache() + + oInputParameterHandler = cInputParameterHandler() + pasteID = oInputParameterHandler.getValue('pasteID') + + # Supprimer le cache de chaque paste du dossier + prefixID = SETTING_PASTE_ID + str(pasteID) + pasteBin = addons.getSetting(prefixID) + if pasteBin: + cache.remove(pasteBin) + for numID in range(1, PASTE_PAR_GROUPE): + pasteID = prefixID + '_' + str(numID) + pasteBin = addons.getSetting(pasteID) + if pasteBin != '': + cache.remove(pasteBin) + + dialog().VSinfo(addons.VSlang(30014)) + + +# Retirer tous les dossiers PasteBin +def deleteAllPasteName(): + + addons = addon() + cache = PasteCache() + + for numID in range(1, GROUPE_MAX): + labelSetting = SETTING_PASTE_LABEL + str(numID) + pasteLabel = addons.getSetting(labelSetting) + if not pasteLabel: + continue + + addons.setSetting(labelSetting, '') + + prefixID = SETTING_PASTE_ID + str(numID) + pasteID = addons.getSetting(prefixID) + if pasteID: + addons.setSetting(prefixID, '') + cache.remove(pasteID) + + for numID in range(1, PASTE_PAR_GROUPE): + settingID = prefixID + '_' + str(numID) + pasteID = addons.getSetting(settingID) + if pasteID: + addons.setSetting(settingID, '') + cache.remove(pasteID) + + # Retourne la liste des PasteBin depuis l'URL ou un groupe def getPasteList(siteUrl, pasteID): addons = addon() @@ -1613,7 +2149,7 @@ def getPasteList(siteUrl, pasteID): def addPasteID(): oGui = cGui() addons = addon() - + oInputParameterHandler = cInputParameterHandler() pasteID = oInputParameterHandler.getValue('pasteID') @@ -1624,83 +2160,118 @@ def addPasteID(): prefixID = SETTING_PASTE_ID + str(pasteID) pasteBin = addons.getSetting(prefixID) if pasteBin: - IDs.add(pasteBin) # IDs déjà renseigné + IDs.add(pasteBin) # IDs déjà renseigné if pasteBin == '': settingID = prefixID for numID in range(1, PASTE_PAR_GROUPE): pasteID = prefixID + '_' + str(numID) pasteBin = addons.getSetting(pasteID) if pasteBin != '': - IDs.add(pasteBin) # IDs déjà renseigné + IDs.add(pasteBin) # IDs déjà renseigné elif not settingID: settingID = pasteID - + # Demande de l'id PasteBin - pasteID = oGui.showKeyBoard('', "Saisir l'ID du PasteBin") + pasteID = oGui.showKeyBoard('', "[COLOR coral]Saisir le code du %s[/COLOR]" % SITE_NAME) if pasteID == False: return - if pasteID in IDs: # ID déjà dans le groupe + if pasteID in IDs: # ID déjà dans le groupe dialog().VSok(addons.VSlang(30082)) return - + # Vérifier l'entete du Paste - pbContentNew = PasteBinContent() - sUrl = URL_MAIN + pasteID - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() + pbContentNew = PasteContent() try: - movies = pbContentNew.getLines(sContent) - if len(movies) == 0 : + movies = pbContentNew.getLines(pasteID) + if len(movies) == 0: dialog().VSok(addons.VSlang(30022)) return except Exception: dialog().VSinfo(addons.VSlang(30011)) raise - + # Vérifier que les autres pastes du groupe ont le même format d'entete - if len(IDs)>0: - pbContentOld = PasteBinContent() - sUrl = URL_MAIN + IDs.pop() - oRequestHandler = cRequestHandler(sUrl) - oRequestHandler.setTimeout(4) - sContent = oRequestHandler.request() - pbContentOld.getLines(sContent) + if len(IDs) > 0: + pbContentOld = PasteContent() + pbContentOld.getLines(IDs.pop()) if not pbContentNew.isFormat(pbContentOld): dialog().VSok(addons.VSlang(30022)) return - + addons.setSetting(settingID, pasteID) dialog().VSinfo(addons.VSlang(30042)) - + oGui.updateDirectory() -# Retirer un groupe PasteBin -def deletePasteName(): +# Liste de pastes avec possibilité de les supprimer +def adminPasteID(): + oGui = cGui() + addons = addon() + + oGui.addText(SITE_IDENTIFIER, '[COLOR coral]Valider le code à retirer[/COLOR]', 'trash.png') + + oInputParameterHandler = cInputParameterHandler() + pasteID = oInputParameterHandler.getValue('pasteID') # Numéro du dossier + prefixID = SETTING_PASTE_ID + str(pasteID) + + pbContentNew = PasteContent() + for numID in range(0, PASTE_PAR_GROUPE): + if numID == 0: + pasteBin = addons.getSetting(prefixID) + else: + pasteBin = addons.getSetting(prefixID + '_' + str(numID)) + if not pasteBin: + continue + + # Vérifier la qualité du Paste + color = 'white' # Forcer une couleur évite aussi le nettoyage du "titre" + try: + movies = pbContentNew.getLines(pasteBin) + if len(movies) == 0: + color = 'red' + except Exception: + dialog().VSinfo(addons.VSlang(30011)) + raise + + pasteLabel = '[COLOR %s]%s[/COLOR]' % (color, pasteBin) + + oOutputParameterHandler = cOutputParameterHandler() + oOutputParameterHandler.addParameter('pasteID', pasteID) + oOutputParameterHandler.addParameter('pasteBin', pasteBin) + oGui.addDir(SITE_IDENTIFIER, 'deletePasteID', pasteLabel, 'trash.png', oOutputParameterHandler) + + oGui.setEndOfDirectory() + + +# Suppression d'un paste dans un dossier +def deletePasteID(): addons = addon() if not dialog().VSyesno(addons.VSlang(30456)): return - - oInputParameterHandler = cInputParameterHandler() - pasteID = oInputParameterHandler.getValue('pasteID') - labelSetting = SETTING_PASTE_LABEL + pasteID - addons.setSetting(labelSetting, '') + cache = PasteCache() + oInputParameterHandler = cInputParameterHandler() + pasteID = oInputParameterHandler.getValue('pasteID') # Numéro du dossier + pasteDel = oInputParameterHandler.getValue('pasteBin') # Paste prefixID = SETTING_PASTE_ID + str(pasteID) - addons.setSetting(prefixID, '') + pasteBin = addons.getSetting(prefixID) + if pasteDel == pasteBin: + addons.setSetting(prefixID, '') + cache.remove(pasteBin) + else: + for numID in range(1, PASTE_PAR_GROUPE): + pasteID = prefixID + '_' + str(numID) + pasteBin = addons.getSetting(pasteID) + if pasteDel == pasteBin: + addons.setSetting(pasteID, '') + cache.remove(pasteBin) + break - for numID in range(1, PASTE_PAR_GROUPE): - pasteID = prefixID + '_' + str(numID) - if addons.getSetting(pasteID): - addons.setSetting(pasteID, '') + dialog().VSinfo(addons.VSlang(30072)) cGui().updateDirectory() - -# msgctxt "#30072" -# msgid "File deleted" -# msgstr "Fichier supprimé"