astrXbian/.install/.kodi/addons/plugin.video.vstream/resources/sites/astroport.py

2278 lines
84 KiB
Python

# -*- coding: utf-8 -*-
# vStream https://github.com/Kodi-vStream/venom-xbmc-addons
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.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
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://127.0.0.1:8080/ipns/_IPFSNODEID_/._IPFSNODEID_/'
KEY_PASTE_ID = 'PASTE_ID'
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(SITE_IDENTIFIER + '_nbItemParPage')
if not nbItem:
nbItem = "25"
addon().setSetting(SITE_IDENTIFIER + '_nbItemParPage', nbItem)
return int(nbItem)
ITEM_PAR_PAGE = getNbItemParPage()
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/
# 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
# CAT;TITLE; URLS
# film;Demain ne meurt jamais;['https://uptobox.com/nwxxxx']
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, PasteContent):
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, 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
hebergeur = champ.split('=')
champ = 'URLS'
if len(hebergeur) > 1:
self.HEBERGEUR = hebergeur[1].replace(' ', '').replace('"', '').replace('\'', '')
if champ in dir(self):
setattr(self, champ, idx)
idx += 1
lines = [k.split(";") for k in lines[1:]]
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()
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 dossiers 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, '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 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()
def showMenu():
addons = addon()
oGui = cGui()
oInputParameterHandler = cInputParameterHandler()
pasteID = oInputParameterHandler.getValue('pasteID')
sMedia = oInputParameterHandler.getValue('sMedia')
pbContent = PasteContent()
prefixID = SETTING_PASTE_ID + str(pasteID)
pasteBin = addons.getSetting(prefixID)
contenu = getPasteBin(pbContent, pasteBin)
for numID in range(1, PASTE_PAR_GROUPE):
pasteBin = addons.getSetting(prefixID + '_' + str(numID))
contenu = contenu.union(getPasteBin(pbContent, pasteBin))
if not sMedia:
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('pasteID', pasteID)
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)
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()
def showDetailMenu(pasteID, contenu):
oGui = cGui()
sUrl = URL_MAIN + '&numPage=1' # + 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&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)', '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)
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)', 'listes.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&bNews=True&pasteID=' + pasteID)
oGui.addDir(SITE_IDENTIFIER, 'showMovies', 'Séries (Derniers ajouts)', 'news.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)', '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)
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()
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&bNews=True&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)', '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)', '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)
# Etablir les menus en fonction du contenu
def getPasteBin(pbContent, pasteBin):
containList = set()
if not pasteBin:
return containList
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()) > 2:
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()) > 1:
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.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:
containList.add('containSerieNetwork')
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:
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
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, GROUPE_MAX):
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 = {}
pbContent = PasteContent()
for pasteBin in listeIDs:
movies = pbContent.getLines(pasteBin)
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 sDisplayGenre not 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 = PasteContent()
movies = []
listeIDs = getPasteList(sUrl, pasteID)
for pasteBin in listeIDs:
moviesBin = pbContent.getLines(pasteBin)
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 = PasteContent()
movies = []
listeIDs = getPasteList(sUrl, pasteID)
for pasteBin in listeIDs:
moviesBin = pbContent.getLines(pasteBin)
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', 'Page ' + str(numPage), oOutputParameterHandler)
break
progress_.VSclose(progress_)
oGui.setEndOfDirectory()
def showCast():
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 numPage and 'numPage' in aParams:
numPage = aParams['numPage']
pbContent = PasteContent()
movies = []
listeIDs = getPasteList(sUrl, pasteID)
for pasteBin in listeIDs:
moviesBin = pbContent.getLines(pasteBin)
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
# 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)
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', '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)
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 = PasteContent()
movies = []
listeIDs = getPasteList(sUrl, pasteID)
for pasteBin in listeIDs:
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]:
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'].replace('+', ' ') + ':' if 'sGroupe' in aParams else None
pbContent = PasteContent()
movies = []
listeIDs = getPasteList(sUrl, pasteID)
for pasteBin in listeIDs:
moviesBin = pbContent.getLines(pasteBin)
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 numPage and 'numPage' in aParams:
numPage = aParams['numPage']
pbContent = PasteContent()
movies = []
listeIDs = getPasteList(sUrl, pasteID)
for pasteBin in listeIDs:
moviesBin = pbContent.getLines(pasteBin)
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
# 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
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', 'Page ' + str(numPage), 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 = PasteContent()
movies = []
listeIDs = getPasteList(sUrl, pasteID)
for pasteBin in listeIDs:
moviesBin = pbContent.getLines(pasteBin)
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, 'annees.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 = PasteContent()
movies = []
listeIDs = getPasteList(sUrl, pasteID)
for pasteBin in listeIDs:
moviesBin = pbContent.getLines(pasteBin)
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 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
sDisplayRes = sRes
if sDisplayRes.isdigit(): sDisplayRes += 'p'
sDisplayRes = sDisplayRes\
.replace('P', 'p')\
.replace('1080p', 'fullHD [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 = bNews = False
if sSearch:
siteUrl = sSearch
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']
if 'bNews' in aParams:
bNews = aParams['bNews']
if not numPage and 'numPage' in aParams:
numPage = aParams['numPage']
pbContent = PasteContent()
movies = []
pasteLen = []
pasteMaxLen = []
maxlen = 0
listeIDs = getPasteList(sUrl, pasteID)
for pasteBin in listeIDs:
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:
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)
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
# Filtrage par titre
sTitle = movie[pbContent.TITLE].strip()
# l'ID TMDB
sTmdbId = None
if pbContent.TMDB >= 0:
sTmdbId = movie[pbContent.TMDB].strip()
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(sTitle)
# 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
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
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)
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):
numPage += 1
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', siteUrl)
oOutputParameterHandler.addParameter('numPage', numPage)
oOutputParameterHandler.addParameter('numItem', numItem)
oGui.addNext(SITE_IDENTIFIER, 'showMovies', 'Page ' + str(numPage), 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 = PasteContent()
for pasteBin in listeIDs:
moviesBin = pbContent.getLines(pasteBin)
# Recherche les saisons de la série
for serie in moviesBin:
if pbContent.CAT >= 0 and sMedia not in serie[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 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[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
saisons = sorted(saisons.items(), key=lambda saison: saison[0])
for sSaison, res in saisons:
sDisplaySaison = sSaison
if sSaison.isdigit():
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=''):
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
sRes = aParams['sRes'] if 'sRes' in aParams else None
searchTitle = aParams['sTitle'].replace(' | ', ' & ')
if not sSaison:
oGui.setEndOfDirectory()
return
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 numEpisode not 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')
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
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
if '/dl/' in sHosterUrl or '.download.' in sHosterUrl:
oHoster = cHosterGui().getHoster('lien_direct')
else:
oHoster = cHosterGui().checkHoster(sHosterUrl)
if (oHoster != False):
if listRes:
res = listRes[resIdx]
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
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 = PasteContent()
listHoster = []
listRes = []
listeIDs = getPasteList(siteUrl, pasteID)
for pasteBin in listeIDs:
moviesBin = pbContent.getLines(pasteBin)
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:
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:
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 dossier pastebin
def addPasteName():
oGui = cGui()
addons = addon()
# Recherche d'un setting de libre
names = set()
newID = 0
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('', "[COLOR coral]Saisir un nom pour le dossier[/COLOR]")
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()
# 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()
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('', "[COLOR coral]Saisir le code du %s[/COLOR]" % SITE_NAME)
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 = PasteContent()
try:
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 = 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()
# 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
cache = PasteCache()
oInputParameterHandler = cInputParameterHandler()
pasteID = oInputParameterHandler.getValue('pasteID') # Numéro du dossier
pasteDel = oInputParameterHandler.getValue('pasteBin') # Paste
prefixID = SETTING_PASTE_ID + str(pasteID)
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
dialog().VSinfo(addons.VSlang(30072))
cGui().updateDirectory()