# -*- coding: utf-8 -*- # vStream https://github.com/Kodi-vStream/venom-xbmc-addons from resources.lib.comaddon import progress, addon, dialog 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 import random SITE_IDENTIFIER = 'astroport' SITE_NAME = 'ASTROPORT _PROFIL_ (_LOGIN_) (_MDP_)' SITE_DESC = 'Partage ~/astroport/films (animes, series) avec ses amis https://gchnange.fr (https://cesium.app ) via IPFS' URL_MAIN = 'http://127.0.0.1:8181/ipns/_IPNSKEY_/xbian/' KEY_PASTE_ID = 'PASTE_ID' SETTING_PASTE_ID = 'pastebin_id_' SETTING_PASTE_LABEL = 'pastebin_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') FUNCTION_SEARCH = 'showSearchGlobal' def getNbItemParPage(): nbItem = addon().getSetting('pastebin_nbItemParPage') if nbItem: return int(nbItem) return 25 ITEM_PAR_PAGE = getNbItemParPage() PASTE_PAR_GROUPE = 50 # jusqu'à 50 groupes de paste, chaque groupe peut contenir jusqu'à 50 liens pastebin # Exemple # CAT; TMDB; TITLE; SAISON; YEAR; GENRES; URLS=https://uptobox.com/ # film;714;Demain ne meurt jamais;James BOND;1997;['Action', 'Aventure', 'Thriller'];['nwxxxx','nwYYzz'] # 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'] 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/' # Pour comparer deux pastes, savoir si les champs sont dans le même ordre def isFormat(self, other): if not isinstance(other, PasteBinContent): return False return self.CAT == other.CAT \ and self.TMDB == other.TMDB \ and self.TITLE == other.TITLE \ and self.SAISON == other.SAISON \ and self.GROUPES == other.GROUPES \ and self.YEAR == other.YEAR \ and self.GENRES == other.GENRES \ and self.RES == other.RES \ and self.DIRECTOR == other.DIRECTOR \ 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 [] # Calcul des index de chaque champ idx = 0 for champ in entete: champ = champ.strip() 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 champ in dir(self): setattr(self, champ, idx) 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 load(): addons = addon() oGui = cGui() 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 pasteListe = sorted(pasteListe.items(), key=lambda paste: paste[0]) if len(pasteListe)>0: oOutputParameterHandler = cOutputParameterHandler() searchUrl = URL_SEARCH_MOVIES[0] oOutputParameterHandler.addParameter('siteUrl', searchUrl) oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche (Films)', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() 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, '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 PasteBin[/COLOR]', 'listes.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showMenu(): addons = addon() oGui = cGui() oInputParameterHandler = cInputParameterHandler() pasteID = oInputParameterHandler.getValue('pasteID') sMedia = oInputParameterHandler.getValue('sMedia') prefixID = SETTING_PASTE_ID + str(pasteID) pasteBin = addons.getSetting(prefixID) contenu = getPasteBin(pasteBin) for numID in range(1, PASTE_PAR_GROUPE): pasteBin = addons.getSetting(prefixID + '_' + str(numID)) contenu = contenu.union(getPasteBin(pasteBin)) if not sMedia: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('pasteID', pasteID) cnt = contenu.intersection(['containFilms', 'containSeries', 'containAnimes']) 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 PasteBin[/COLOR]', 'listes.png', oOutputParameterHandler) elif 'film' in sMedia: contenu.discard('containSeries') contenu.discard('containAnimes') showDetailMenu(pasteID, contenu) elif 'serie' in sMedia: contenu.discard('containFilms') contenu.discard('containAnimes') showDetailMenu(pasteID, contenu) elif 'anime' in sMedia: contenu.discard('containFilms') contenu.discard('containSeries') showDetailMenu(pasteID, contenu) oGui.setEndOfDirectory() def showDetailMenu(pasteID, contenu): oGui = cGui() sUrl = URL_MAIN #+ pasteBin if 'containFilms' in contenu: oOutputParameterHandler = cOutputParameterHandler() searchUrl = URL_SEARCH_MOVIES[0].replace(KEY_PASTE_ID, pasteID) oOutputParameterHandler.addParameter('siteUrl', searchUrl) oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche (Films)', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&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) 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) oGui.addDir(SITE_IDENTIFIER, 'showYears', 'Films (Par années)', 'annees.png', oOutputParameterHandler) if 'containFilmRes' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showResolution', 'Films (Par résolutions)', 'hd.png', oOutputParameterHandler) if 'containFilmNetwork' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showNetwork', 'Films (Par diffuseurs)', 'host.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'AlphaList', 'Films (Ordre alphabétique)', 'az.png', oOutputParameterHandler) if 'containFilmReal' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showRealisateur', 'Films (Par réalisateurs)', 'actor.png', oOutputParameterHandler) if 'containFilmCast' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showCast', 'Films (Par acteurs)', 'actor.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=film&bRandom=True&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showMovies', 'Films (Aléatoires)', 'news.png', oOutputParameterHandler) if 'containSeries' in contenu: oOutputParameterHandler = cOutputParameterHandler() searchUrl = URL_SEARCH_SERIES[0].replace(KEY_PASTE_ID, pasteID) oOutputParameterHandler.addParameter('siteUrl', searchUrl) oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche (Séries)', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&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 'containSerieGroupes' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=serie&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showGroupes', 'Séries (Listes)', 'genres.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) if 'containAnimes' in contenu: oOutputParameterHandler = cOutputParameterHandler() searchUrl = URL_SEARCH_ANIMS[0].replace(KEY_PASTE_ID, pasteID) oOutputParameterHandler.addParameter('siteUrl', searchUrl) oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche (Animes)', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=anime&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showMovies', 'Animes (Derniers ajouts)', 'news.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=anime&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showGenres', 'Animes (Genres)', 'genres.png', oOutputParameterHandler) if 'containAnimeGroupes' in contenu: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=anime&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'showGroupes', 'Animes (Listes)', 'genres.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl + '&sMedia=anime&pasteID=' + pasteID) oGui.addDir(SITE_IDENTIFIER, 'AlphaList', 'Animes (Ordre alphabétique)', 'listes.png', oOutputParameterHandler) def getPasteBin(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) # 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: containList.add('containFilmGenres') 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: containList.add('containFilmYear') 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: containList.add('containFilmReal') 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: containList.add('containFilmSaga') 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: containList.add('containSerieGroupes') 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: 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: containList.add('containAnimeGroupes') return containList def showSearch(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') 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) else: showMovies(sUrl) oGui.setEndOfDirectory() def showSearchGlobal(sSearch=''): addons = addon() sUrl = sSearch for numID in range(1, PASTE_PAR_GROUPE): prefixID = SETTING_PASTE_LABEL + str(numID) pastebin = addons.getSetting(prefixID) if pastebin: searchUrl = sUrl.replace(KEY_PASTE_ID, str(numID)) try: showMovies(searchUrl) except: pass def showGenres(): tmdb = cTMDb() 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 listeIDs = getPasteList(sUrl, pasteID) genres = {} for pasteBin in listeIDs: sUrl = URL_MAIN + pasteBin oRequestHandler = cRequestHandler(sUrl) sContent = oRequestHandler.request() pbContent = PasteBinContent() movies = pbContent.getLines(sContent) for movie in movies: 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+"']" elif "''" in genre: genre = genre.replace("''", "'"+UNCLASSIFIED_GENRE+"'") genre = eval(genre) if isinstance(genre, int): genre = [genre] if genre: for g in genre: sDisplayGenre = g if str(g).isdigit(): sDisplayGenre = tmdb.getGenreFromID(g) if not sDisplayGenre in genres: genres[sDisplayGenre] = g genreKeys = genres.keys() for sDisplayGenre in sorted(genreKeys): genre = genres.get(sDisplayGenre) oOutputParameterHandler = cOutputParameterHandler() sUrl = siteUrl + '&sGenre=' + str(genre) oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'showMovies', sDisplayGenre, 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showNetwork(): 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 pbContent = PasteBinContent() 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) movies += moviesBin listNetwork = {} for movie in movies: if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: continue networks = movie[pbContent.NETWORK].strip() if networks <> '': networks = eval(networks) if networks: for network in networks: if ':' in network: networkId, networkName = network.split(':') if networkName not in listNetwork: listNetwork[networkName] = networkId maxProgress = len(listNetwork) progress_ = progress().VScreate(SITE_NAME) for networkName, networkId in sorted(listNetwork.items()): progress_.VSupdate(progress_, maxProgress) if progress_.iscanceled(): break sUrl = siteUrl + '&sNetwork=' + networkId + ":" + networkName.replace('+', '|') oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) 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) 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) pbContent = PasteBinContent() 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) movies += moviesBin listReal = {} for movie in movies: if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: continue reals = movie[pbContent.DIRECTOR].strip() if reals <> '': reals = eval(reals) if reals: for real in reals: if ':' in real: realId, realName = real.split(':') if realName not in listReal: listReal[realName] = realId nbItem = 0 index = 0 maxProgress = min(len(listReal), ITEM_PAR_PAGE) progress_ = progress().VScreate(SITE_NAME) for realName, realId in sorted(listReal.items()): # Pagination, on se repositionne index += 1 if index <= numItem: continue numItem += 1 progress_.VSupdate(progress_, maxProgress) if progress_.iscanceled(): break sUrl = siteUrl + '&sDirector=' + realId + ":" + realName oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sTmdbId', realId) # Utilisé par TMDB oGui.addPerson(SITE_IDENTIFIER, 'showMovies', realName, 'actor.png', oOutputParameterHandler) nbItem += 1 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) 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) pbContent = PasteBinContent() 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) movies += moviesBin listActeur = {} for movie in movies: if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: continue acteurs = movie[pbContent.CAST].strip() if acteurs <> '': acteurs = eval(acteurs) if acteurs: for acteur in acteurs: if ':' in acteur: acteurId, acteurName = acteur.split(':') if acteurName not in listActeur: listActeur[acteurName] = acteurId nbItem = 0 index = 0 maxProgress = min(len(listActeur), ITEM_PAR_PAGE) progress_ = progress().VScreate(SITE_NAME) for acteurName, acteurId in sorted(listActeur.items()): # Pagination, on se repositionne index += 1 if index <= numItem: continue numItem += 1 progress_.VSupdate(progress_, maxProgress) if progress_.iscanceled(): break sUrl = siteUrl + '&sCast=' + acteurId + ":" + acteurName oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sTmdbId', acteurId) # Utilisé par TMDB oGui.addPerson(SITE_IDENTIFIER, 'showMovies', acteurName, 'actor.png', oOutputParameterHandler) nbItem += 1 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) break progress_.VSclose(progress_) oGui.setEndOfDirectory() def showGroupes(): 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 pbContent = PasteBinContent() 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) movies += moviesBin sousGroupe = set() groupesPerso = set() for movie in movies: if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: continue groupe = movie[pbContent.GROUPES].strip().replace("''",'') if groupe: groupe = eval(groupe) if groupe: for gr in groupe: if ':' in gr: grID = gr.split(':')[0] if grID not in sousGroupe: sousGroupe.add(grID) else: groupesPerso.add(gr) groupes = groupesPerso.union(sousGroupe) for sGroupe in sorted(groupes): sUrl = siteUrl + '&sGroupe=' + sGroupe oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) if sGroupe in sousGroupe: oGui.addDir(SITE_IDENTIFIER, 'showGroupeDetails', sGroupe, 'genres.png', oOutputParameterHandler) else: oGui.addDir(SITE_IDENTIFIER, 'showMovies', sGroupe, 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showGroupeDetails(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') 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 pbContent = PasteBinContent() 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) movies += moviesBin groupes = set() if sGroupe: for movie in movies: groupe = movie[pbContent.GROUPES].strip().replace("''",'') if groupe: groupe = eval(groupe) if groupe: for gr in groupe: if gr.startswith(sGroupe): groupes.add(gr) for sGroupe in sorted(groupes): sUrl = siteUrl + '&sGroupe=' + sGroupe.replace('+', '|') oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) sDisplayGroupe = sGroupe.split(':')[1] oGui.addDir(SITE_IDENTIFIER, 'showMovies', sDisplayGroupe, 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showSaga(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') numItem = oInputParameterHandler.getValue('numItem') numPage = oInputParameterHandler.getValue('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 numItem: numItem = 0 numPage = 1 numItem = int(numItem) numPage = int(numPage) pbContent = PasteBinContent() 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) movies += moviesBin sagas = {} for movie in movies: if pbContent.CAT >=0 and sMedia not in movie[pbContent.CAT]: continue saga = movie[pbContent.SAISON].strip() if saga <> '': sTmdbId = name = saga idName = saga.split(':', 1) if len(idName)>1: sTmdbId = idName[0] name = idName[1] if sTmdbId.isdigit(): sagas[name] = sTmdbId else: sagas[saga] = saga 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 sTmdbId = sagas[sSagaName] oOutputParameterHandler = cOutputParameterHandler() if sTmdbId.isdigit(): 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 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) : 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) break progress_.VSclose(progress_) oGui.setEndOfDirectory() def showYears(): 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 pbContent = PasteBinContent() 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) movies += moviesBin years = set() for line in movies: if pbContent.CAT >=0 and sMedia not in line[pbContent.CAT]: continue year = line[pbContent.YEAR].strip() if not year: year = UNCLASSIFIED years.add(year) for sYear in sorted(years, reverse=True): sUrl = siteUrl + '&sYear=' + sYear oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'showMovies', sYear, 'years.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showResolution(): 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 pbContent = PasteBinContent() 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) movies += moviesBin resolutions = set() for line in movies: if pbContent.CAT >=0 and sMedia not in line[pbContent.CAT]: continue res = line[pbContent.RES].strip() if '[' in res: if res != '[]': res = eval(res) resolutions = resolutions.union(res) if '' in res or len(res) == 0: resolutions.add(UNCLASSIFIED) else: resolutions.add(res) 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'] def trie_res(key): if key == UNCLASSIFIED: return 20 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 sDisplayRes = sRes if sDisplayRes.isdigit(): sDisplayRes += 'p' sDisplayRes = sDisplayRes\ .replace('P', 'p')\ .replace('1080p', 'HD [1080p]')\ .replace('720p', 'HD [720p]')\ .replace('540p', 'SD [540p]')\ .replace('480p', 'SD [480p]')\ .replace('360p', 'SD [360p]')\ .replace('4K', '2160p')\ .replace('8K', '4320p')\ .replace('2160p', '4K [2160p]')\ .replace('4320p', '8K [4320p]') sUrl = siteUrl + '&sRes=' + sRes oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'showMovies', sDisplayRes, 'hd.png', oOutputParameterHandler) oGui.setEndOfDirectory() def AlphaList(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') for i in range(0, 36): if (i < 10): sLetter = chr(48 + i) else: sLetter = chr(65 + i -10) sUrl = siteUrl + '&sAlpha=' + sLetter oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'showMovies', '[COLOR teal] Lettre [COLOR red]' + sLetter + '[/COLOR][/COLOR]', 'listes.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showMovies(sSearch=''): oGui = cGui() oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') numItem = oInputParameterHandler.getValue('numItem') numPage = oInputParameterHandler.getValue('numPage') sMedia = 'film' # Par défaut pasteID = sGenre = sSaga = sGroupe = sYear = sRes = sAlpha = sNetwork = sDirector = sCast = None bRandom = 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) 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 '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'] pbContent = PasteBinContent() movies = [] listeIDs = getPasteList(sUrl, pasteID) for pasteBin in listeIDs: oRequestHandler = cRequestHandler(URL_MAIN + pasteBin) oRequestHandler.setTimeout(4) sContent = oRequestHandler.request() moviesBin = pbContent.getLines(sContent) movies += moviesBin # 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: 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) 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) for movie in movies: if bRandom and index not in randoms: index += 1 continue # Pagination, on se repositionne index += 1 if index <= numItem: continue numItem += 1 # 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 # Filtrage par saga if sSaga and sSaga != movie[pbContent.SAISON].strip(): continue # Filtrage par genre if sGenre and pbContent.GENRES >=0 : genres = movie[pbContent.GENRES].strip() if not genres or genres == '' or "''" in genres: if sGenre != UNCLASSIFIED_GENRE: continue elif genres: genres = eval(genres) genres = [str(g) for g in genres] if sGenre not in genres: continue # Filtrage par réalisateur if sDirector and pbContent.DIRECTOR >= 0 : listDirector = movie[pbContent.DIRECTOR].strip() if not listDirector: continue listDirector = eval(listDirector) if sDirector not in listDirector: continue # Filtrage par acteur if sCast and pbContent.CAST >=0 : listCast = movie[pbContent.CAST].strip() if not listCast: continue listCast = eval(listCast) if sCast not in listCast: continue # Filtrage par diffuseur if sNetwork and pbContent.NETWORK >= 0 : listNetwork = movie[pbContent.NETWORK].strip() if not listNetwork: continue listNetwork = eval(listNetwork) if sNetwork not in listNetwork: continue # Filtrage par groupe if sGroupe and pbContent.GROUPES >= 0: groupes = movie[pbContent.GROUPES].strip() if not groupes: continue groupes = eval(groupes) if sGroupe not in groupes: continue # l'ID TMDB sTmdbId = None if pbContent.TMDB >= 0: sTmdbId = movie[pbContent.TMDB].strip() if sTmdbId in movieIds: continue # Filtre des doublons movieIds.add(sTmdbId) # Filtrage par titre sTitle = movie[pbContent.TITLE].strip() # Titre recherché if sSearchTitle: if cUtil().CheckOccurence(sSearchTitle, sTitle) == 0: continue # Recherche alphabétique if sAlpha: if sTitle[0].upper() != sAlpha: continue sDisplayTitle = sTitle # Filtrage par années movieYear = '' if pbContent.YEAR >= 0: movieYear = movie[pbContent.YEAR].strip() # sDisplayTitle = '%s (%s)' % (sTitle, movieYear) if sYear: if sYear == UNCLASSIFIED: if movieYear != '': continue elif not movieYear or sYear != movieYear: continue # Filtrage par résolutions vidéos listRes = None if 'film' in sMedia: if pbContent.RES>=0: res = movie[pbContent.RES].strip() listRes = [] if '[' in res: listRes.extend(eval(res)) else: 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 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 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 sMedia == 'serie': oGui.addTV(SITE_IDENTIFIER, 'showSerieSaisons', sDisplayTitle, 'series.png', '', '', oOutputParameterHandler) elif sMedia == 'anime': oGui.addAnime(SITE_IDENTIFIER, 'showSerieSaisons', sDisplayTitle, 'animes.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) : 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) break progress_.VSclose(progress_) if not sSearch: oGui.setEndOfDirectory() def showSerieSaisons(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() siteUrl = oInputParameterHandler.getValue('siteUrl') searchTitle = oInputParameterHandler.getValue('sMovieTitle') searchYear = oInputParameterHandler.getValue('sYear') # 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) 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 = [] listeIDs = getPasteList(sUrl, pasteID) pbContent = PasteBinContent() for pasteBin in listeIDs: sUrl = URL_MAIN + pasteBin oRequestHandler = cRequestHandler(sUrl) oRequestHandler.setTimeout(4) sContent = oRequestHandler.request() moviesBin = pbContent.getLines(sContent) # Recherche les saisons de la série for serie in moviesBin: if pbContent.CAT >=0 and sMedia not in moviesBin[pbContent.CAT]: continue # Recherche par id found = False if idTMDB and pbContent.TMDB >= 0: sMovieID = serie[pbContent.TMDB].strip() if sMovieID: if sMovieID != idTMDB: continue found = True # 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: continue 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 # Proposer les différentes saisons for sSaison in sorted(saisons): sUrl = siteUrl + '&sSaison=' + 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) oGui.setEndOfDirectory() def showEpisodesLinks(siteUrl = ''): oGui = cGui() 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] aParams = dict(param.split('=') for param in params.split('&')) sSaison = aParams['sSaison'] if 'sSaison' in aParams else None searchTitle = aParams['sTitle'].replace(' | ', ' & ') if not sSaison: oGui.setEndOfDirectory() return lines = getHosterList(siteUrl)[0] listeEpisodes = [] for episode in lines: for numEpisode in episode.keys(): if not numEpisode in listeEpisodes: listeEpisodes.append(numEpisode) sDisplaySaison = sSaison if sSaison.isdigit(): sDisplaySaison = 'S{:02d}'.format(int(sSaison)) for episode in sorted(listeEpisodes): sUrl = siteUrl + '&sEpisode=' + str(episode) if str(episode).isdigit(): episode = '{}E{:02d}'.format(sDisplaySaison, int(episode)) 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() def showHosters(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sTitle = oInputParameterHandler.getValue('sMovieTitle') siteUrl = oInputParameterHandler.getValue('siteUrl') 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 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 else: sDisplayName = sTitle oHoster.setDisplayName(sDisplayName) oHoster.setFileName(sTitle) cHosterGui().showHoster(oGui, oHoster, sHosterUrl, '') 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) 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 searchYear = aParams['sYear'] if 'sYear' in aParams else None searchSaison = aParams['sSaison'] if 'sSaison' in aParams else None searchEpisode = aParams['sEpisode'] if 'sEpisode' in aParams else None 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 listHoster = [] listRes = [] for movie in movies: # 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: 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) # 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('') # 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 def addPasteName(): oGui = cGui() addons = addon() # Recherche d'un setting de libre names = set() newID = 0 for numID in range(1, PASTE_PAR_GROUPE): 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") if sLabel == False: return if sLabel in names: dialog().VSok(addons.VSlang(30082)) return # Enregistrer Label/id dans les settings addons.setSetting(settingLabel, sLabel) dialog().VSinfo(addons.VSlang(30042)) oGui.updateDirectory() # Retourne la liste des PasteBin depuis l'URL ou un groupe def getPasteList(siteUrl, pasteID): addons = addon() IDs = [] siteId = siteUrl.split(URL_MAIN) # Supporte le format https://pastebin.com/raw/izu23hfkjhd if siteId[1]: IDs.append(siteId[1]) if pasteID: prefixID = SETTING_PASTE_ID + str(pasteID) pasteBin = addons.getSetting(prefixID) if pasteBin and pasteBin not in IDs: IDs.append(pasteBin) for numID in range(1, PASTE_PAR_GROUPE): pasteID = prefixID + '_' + str(numID) pasteBin = addons.getSetting(pasteID) if pasteBin and pasteBin not in IDs: IDs.append(pasteBin) return IDs # Ajout d'un lien pastebin def addPasteID(): oGui = cGui() addons = addon() oInputParameterHandler = cInputParameterHandler() pasteID = oInputParameterHandler.getValue('pasteID') # Recherche d'un setting de libre # Et lister les pastes déjà déclarés pour éviter les doublons IDs = set() settingID = None prefixID = SETTING_PASTE_ID + str(pasteID) pasteBin = addons.getSetting(prefixID) if pasteBin: 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é elif not settingID: settingID = pasteID # Demande de l'id PasteBin pasteID = oGui.showKeyBoard('', "Saisir l'ID du PasteBin") if pasteID == False: return 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() try: movies = pbContentNew.getLines(sContent) 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 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(): addons = addon() if not dialog().VSyesno(addons.VSlang(30456)): return oInputParameterHandler = cInputParameterHandler() pasteID = oInputParameterHandler.getValue('pasteID') labelSetting = SETTING_PASTE_LABEL + pasteID addons.setSetting(labelSetting, '') prefixID = SETTING_PASTE_ID + str(pasteID) addons.setSetting(prefixID, '') for numID in range(1, PASTE_PAR_GROUPE): pasteID = prefixID + '_' + str(numID) if addons.getSetting(pasteID): addons.setSetting(pasteID, '') cGui().updateDirectory() # msgctxt "#30072" # msgid "File deleted" # msgstr "Fichier supprimé"