def __createItemUrl(self, oGuiElement, oOutputParameterHandler=''): if (oOutputParameterHandler == ''): oOutputParameterHandler = cOutputParameterHandler() # On descend l'id TMDB dans les saisons et les épisodes oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) # Pour gérer l'enchainement des épisodes oOutputParameterHandler.addParameter('sSeason', oGuiElement.getSeason()) oOutputParameterHandler.addParameter('sEpisode', oGuiElement.getEpisode()) sParams = oOutputParameterHandler.getParameterAsUri() sPluginPath = cPluginHandler().getPluginPath() if (len(oGuiElement.getFunction()) == 0): sItemUrl = '%s?site=%s&title=%s&%s' % ( sPluginPath, oGuiElement.getSiteName(), QuotePlus(oGuiElement.getCleanTitle()), sParams) else: sItemUrl = '%s?site=%s&function=%s&title=%s&%s' % ( sPluginPath, oGuiElement.getSiteName(), oGuiElement.getFunction(), QuotePlus(oGuiElement.getCleanTitle()), sParams) return sItemUrl
def get_idbyname(self, name, year='', mediaType='movie', page=1): # On enleve le contenu entre paranthese. try: name = name.split('(')[0] except: pass if year: term = QuotePlus(name) + '&year=' + year else: term = QuotePlus(name) meta = self._call('search/' + str(mediaType), 'query=' + term + '&page=' + str(page)) # si pas de résultat avec l'année, on teste sans l'année if 'total_results' in meta: if year and meta['total_results'] == 0: return self.search_movie_name(name) # cherche 1 seul resultat if meta['total_results'] != 0: tmdb_id = meta['results'][0]['id'] return tmdb_id return False
def search_tvshow_name(self, name, year='', page=1, genre=''): if year: term = QuotePlus(name) + '&year=' + year else: term = QuotePlus(name) meta = self._call('search/tv', 'query=' + term + '&page=' + str(page)) if 'errors' not in meta and 'status_code' not in meta: # si pas de résultat avec l'année, on teste sans l'année if 'total_results' in meta and meta['total_results'] == 0 and year: meta = self.search_tvshow_name(name, '') # cherche 1 seul resultat if 'total_results' in meta and meta['total_results'] != 0: movie = '' # s'il n'y en a qu'un, c'est le bon if meta['total_results'] == 1: movie = meta['results'][0] else: # premiere boucle, recherche la correspondance parfaite sur le nom for searchMovie in meta['results']: if genre == '' or genre in searchMovie['genre_ids']: movieName = searchMovie['name'] if self._clean_title( movieName) == self._clean_title(name): movie = searchMovie break # sinon, hors documentaire et année proche if not movie: for searchMovie in meta['results']: if genre and genre in searchMovie['genre_ids']: # controle supplémentaire sur l'année meme si déjà dans la requete if year: if 'release_date' in searchMovie and searchMovie[ 'release_date']: release_date = searchMovie[ 'release_date'] yy = release_date[:4] if int(year) - int(yy) > 1: continue # plus de deux ans d'écart, c'est pas bon movie = searchMovie break # Rien d'interessant, on prend le premier if not movie: movie = meta['results'][0] # recherche de toutes les infos tmdb_id = movie['id'] meta = self.search_tvshow_id(tmdb_id) else: meta = {} return meta
def setLibrary(self): oInputParameterHandler = cInputParameterHandler() sHosterIdentifier = oInputParameterHandler.getValue( 'sHosterIdentifier') sFileName = oInputParameterHandler.getValue('sFileName') sMediaUrl = oInputParameterHandler.getValue('sMediaUrl') ret = self.DIALOG.select('Sélectionner une catégorie', ['Film', 'Série']) if ret == 0: sCat = '1' elif ret == -1: return else: sCat = '2' sMediaUrl = QuotePlus(sMediaUrl) sFileName = QuotePlus(sFileName) sLink = 'plugin://plugin.video.vstream/?function=play&site=cHosterGui&sFileName=' + sFileName + '&sMediaUrl=' + sMediaUrl + '&sHosterIdentifier=' + sHosterIdentifier sTitle = sFileName if sCat == '1': # film sTitle = cUtil().CleanName(sTitle) sTitle = self.showKeyBoard(sTitle, 'Nom du dossier et du fichier') try: sPath = '/'.join([self.__sMovieFolder, sTitle]) if not xbmcvfs.exists(sPath): xbmcvfs.mkdir(sPath) self.MakeFile(sPath, sTitle, sLink) except: self.DIALOG.VSinfo('Rajout impossible') elif sCat == '2': # serie sTitle = cUtil().CleanName(sTitle) sFTitle = self.showKeyBoard(sTitle, 'Recommandé Nomdeserie/Saison00') try: sPath = '/'.join([self.__sTVFolder, sFTitle]) if not xbmcvfs.exists(sPath): xbmcvfs.mkdir(sPath) sTitle = self.showKeyBoard(sTitle, 'Recommandé NomdeserieS00E00') self.MakeFile(sPath, sTitle, sLink) except: self.DIALOG.VSinfo('Rajout impossible')
def get_idbyname(self, name, year='', mediaType='movie', page=1): #Pour les series il faut enlever le numero de l episode et la saison. if mediaType == "tv": m = re.search( '(?i)(?:^|[^a-z])((?:E|(?:\wpisode\s?))([0-9]+(?:[\-\.][0-9\?]+)*))', name) m1 = re.search('(?i)( s(?:aison +)*([0-9]+(?:\-[0-9\?]+)*))', name) name = name.replace(m.group(1), '').replace(m1.group(1), '').replace('+', ' ') #On enleve le contenu entre paranthese. try: name = name.split('(')[0] except: pass if year: term = QuotePlus(name) + '&year=' + year else: term = QuotePlus(name) meta = self._call('search/' + str(mediaType), 'query=' + term + '&page=' + str(page)) # si pas de résultat avec l'année, on teste sans l'année if 'total_results' in meta and meta['total_results'] == 0 and year: meta = self.search_movie_name(name, '') # cherche 1 seul resultat if 'total_results' in meta and meta['total_results'] != 0: if meta['total_results'] > 1: qua = [] url = [] for aEntry in meta['results']: url.append(aEntry["id"]) qua.append(aEntry['name']) #Affichage du tableau tmdb_id = dialog().VSselectqual(qua, url) else: tmdb_id = meta['results'][0]['id'] return tmdb_id else: return False return False
def del_bookmark(self): from resources.lib.gui.gui import cGui oGui = cGui() oInputParameterHandler = cInputParameterHandler() if oInputParameterHandler.exist('sCat'): sql_delete = "DELETE FROM favorite WHERE cat = '%s'" % ( oInputParameterHandler.getValue('sCat')) if oInputParameterHandler.exist('sMovieTitle'): siteUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') siteUrl = QuotePlus(siteUrl) title = self.str_conv(sMovieTitle) title = title.replace("'", r"''") sql_delete = "DELETE FROM favorite WHERE siteurl = '%s' AND title = '%s'" % ( siteUrl, title) if oInputParameterHandler.exist('sAll'): sql_delete = 'DELETE FROM favorite;' try: self.dbcur.execute(sql_delete) self.db.commit() self.DIALOG.VSinfo(self.ADDON.VSlang(30044)) oGui.updateDirectory() return False, False except Exception: VSlog('SQL ERROR EXECUTE') return False, False
def ShowSpecialHosters(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sThumb = oInputParameterHandler.getValue('sThumb') data = re.sub('(.+?f=)', '', sUrl) data = data.replace('&c=', '') pdata = 'data=' + QuotePlus(data) if 'fr-land.me' in sUrl: oRequest = cRequestHandler('http://fr-land.me/Htplugins/Loader.php') oRequest.setRequestType(1) oRequest.addHeaderEntry('User-Agent', UA) # oRequest.addHeaderEntry('Host', 'official-film-illimite.to') oRequest.addHeaderEntry('Referer', sUrl) oRequest.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') oRequest.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3') oRequest.addHeaderEntry('Content-Type', 'application/x-www-form-urlencoded') oRequest.addParametersLine(pdata) sHtmlContent = oRequest.request() sHtmlContent = sHtmlContent.replace('\\', '') # fh = open('c:\\test.txt', "w") # fh.write(sHtmlContent) # fh.close() sPattern = '\[(.+?)\]' oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == True): listurl = aResult[1][0].replace('"', '').split(',http') listqual = aResult[1][1].replace('"', '').split(',') tab = zip(listurl, listqual) for url, qual in tab: sHosterUrl = url if not sHosterUrl.startswith('http'): sHosterUrl = 'http' + sHosterUrl oHoster = cHosterGui().checkHoster(sHosterUrl) if (oHoster != False): sDisplayTitle = '[' + qual + '] ' + sMovieTitle oHoster.setDisplayName(sDisplayTitle) oHoster.setFileName(sMovieTitle) cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb) else: oHoster = cHosterGui().checkHoster(sUrl) if (oHoster != False): oHoster.setDisplayName(sMovieTitle) oHoster.setFileName(sMovieTitle) cHosterGui().showHoster(oGui, oHoster, sUrl, sThumb) oGui.setEndOfDirectory()
def insert_resume(self, meta): title = self.str_conv(meta['title']) site = QuotePlus(meta['site']) point = meta['point'] total = meta['total'] ex = "DELETE FROM resume WHERE title = '%s'" % title try: self.dbcur.execute(ex) except Exception as e: VSlog('SQL ERROR - ' + ex) pass try: ex = 'INSERT INTO resume (title, hoster, point, total) VALUES (?, ?, ?, ?)' self.dbcur.execute(ex, (title, site, point, total)) self.db.commit() except Exception as e: if 'no such column' in str(e) or 'no column named' in str(e) or 'no such table' in str(e) : self._create_tables('resume') VSlog('Table recreated : resume') # Deuxieme tentative self.dbcur.execute(ex, (title, site, point, total)) self.db.commit() else: VSlog('SQL ERROR INSERT : %s' % e)
def del_bookmark(self): oInputParameterHandler = cInputParameterHandler() if oInputParameterHandler.exist('sCat'): sql_delete = "DELETE FROM favorite WHERE cat = '%s'" % ( oInputParameterHandler.getValue('sCat')) if oInputParameterHandler.exist('sMovieTitle'): siteUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') siteUrl = QuotePlus(siteUrl) title = self.str_conv(sMovieTitle) title = title.replace("'", r"''") sql_delete = "DELETE FROM favorite WHERE siteurl = '%s' AND title = '%s'" % ( siteUrl, title) if oInputParameterHandler.exist('sAll'): sql_delete = 'DELETE FROM favorite;' try: self.dbcur.execute(sql_delete) self.db.commit() self.DIALOG.VSinfo(self.ADDON.VSlang(30044)) xbmc.executebuiltin('Container.Refresh') return False, False except Exception, e: VSlog('SQL ERROR EXECUTE') return False, False
def insert_download(self, meta): title = self.str_conv(meta['title']) url = QuotePlus(meta['url']) sIcon = QuotePlus(meta['icon']) sPath = meta['path'] ex = 'INSERT INTO download (title, url, path, cat, icon, size, totalsize, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' try: self.dbcur.execute(ex, (title,url, sPath,meta['cat'],sIcon, '', '', 0)) self.db.commit() VSlog('SQL INSERT download Successfully') dialog().VSinfo(addon().VSlang(30042), meta['title']) except Exception as e: VSlog('SQL ERROR INSERT into download') pass
def del_bookmark(self, sSiteUrl='', sMovieTitle='', sCat = '', sAll = False): sql_delete = None # Tous supprimer if sAll: sql_delete = 'DELETE FROM favorite;' # Supprimer un bookmark selon son titre elif sMovieTitle: siteUrl = QuotePlus(sSiteUrl) title = self.str_conv(sMovieTitle) title = title.replace("'", r"''") sql_delete = "DELETE FROM favorite WHERE siteurl = '%s' AND title = '%s'" % (siteUrl, title) # Supprimer un bookmark selon son url elif sSiteUrl: siteUrl = QuotePlus(sSiteUrl) sql_delete = "DELETE FROM favorite WHERE siteurl = '%s'" % siteUrl # Supprimer toute une catégorie elif sCat: catList = ('1', '7') # films, saga if sCat not in catList: catList = ('2', '3', '4', '8') if sCat not in catList: catList = ('0', sCat) sql_delete = "DELETE FROM favorite WHERE cat in %s" % str(catList) if sql_delete: from resources.lib.gui.gui import cGui try: self.dbcur.execute(sql_delete) self.db.commit() update = self.db.total_changes if not update and sSiteUrl and sMovieTitle: # si pas trouvé, on essaie sans le titre, seulement l'URL return self.del_bookmark(sSiteUrl) dialog().VSinfo(addon().VSlang(30044)) cGui().updateDirectory() return True except Exception as e: VSlog('SQL ERROR %s' % sql_delete) return False
def showSearch(): oGui = cGui() sSearchText = oGui.showKeyBoard() if (sSearchText != False): sUrl = URL_SEARCH[0] + QuotePlus(sSearchText) showSearchResult(sUrl) oGui.setEndOfDirectory() return
def insert_download(self, meta): title = self.str_conv(meta['title']) url = QuotePlus(meta['url']) sIcon = QuotePlus(meta['icon']) sPath = meta['path'] ex = 'INSERT INTO download (title, url, path, cat, icon, size, totalsize, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' self.dbcur.execute(ex, (title,url, sPath,meta['cat'],sIcon, '', '', 0)) try: self.db.commit() VSlog('SQL INSERT download Successfully') self.DIALOG.VSinfo('Enregistré avec succès', meta['title']) except Exception, e: #print ('************* Error attempting to insert into %s cache table: %s ' % (table, e)) VSlog('SQL ERROR INSERT') pass
def __createItemUrl(self, oGuiElement, oOutputParameterHandler=''): if (oOutputParameterHandler == ''): oOutputParameterHandler = cOutputParameterHandler() sParams = oOutputParameterHandler.getParameterAsUri() sPluginPath = cPluginHandler().getPluginPath() if (len(oGuiElement.getFunction()) == 0): sItemUrl = '%s?site=%s&title=%s&%s' % ( sPluginPath, oGuiElement.getSiteName(), QuotePlus(oGuiElement.getCleanTitle()), sParams) else: sItemUrl = '%s?site=%s&function=%s&title=%s&%s' % ( sPluginPath, oGuiElement.getSiteName(), oGuiElement.getFunction(), QuotePlus(oGuiElement.getCleanTitle()), sParams) return sItemUrl
def search_collection_name(self, name): name = re.sub(" +", " ", name) # nettoyage du titre term = QuotePlus(name) meta = self._call('search/collection', 'query=' + term) if 'errors' not in meta and 'status_code' not in meta: # cherche 1 seul resultat if 'total_results' in meta and meta['total_results'] != 0: collection = '' # s'il n'y en a qu'un, c'est le bon if meta['total_results'] == 1: collection = meta['results'][0] else: # premiere boucle, recherche la correspondance parfaite sur le nom for searchCollec in meta['results']: cleanTitleTMDB = self._clean_title( searchCollec['name']) cleanTitleSearch = self._clean_title(name) if not cleanTitleSearch.endswith('saga'): cleanTitleSearch += 'saga' if cleanTitleTMDB == cleanTitleSearch: collection = searchCollec break elif (cleanTitleSearch + 'saga') == cleanTitleTMDB: collection = searchCollec break # sinon, le premier qui n'est pas du genre animation if not collection: for searchCollec in meta['results']: if 'animation' not in searchCollec['name']: collection = searchCollec break # Rien d'interessant, on prend le premier if not collection: collection = meta['results'][0] meta = collection tmdb_id = collection['id'] meta['tmdb_id'] = tmdb_id # recherche de toutes les infos meta = self.search_collection_id(tmdb_id) else: meta = {} return meta
def RecapchaBypassOld(sUrl): # Ouverture de Chrome Launcher s'il est intallez oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sPath = "special://home/addons/plugin.program.chrome.launcher/default.py" if xbmcvfs.exists(sPath): sUrl2 = QuotePlus(sUrl) xbmc.executebuiltin('RunPlugin("plugin://plugin.program.chrome.launcher/?url=' + sUrl2 + '&mode=showSite&stopPlayback=yes")') getHoster()
def reset_download(self, meta): url = QuotePlus(meta['url']) sql_select = "UPDATE download SET status = '0' WHERE status = '2' AND url = '%s'" % url try: self.dbcur.execute(sql_select) self.db.commit() return False, False except Exception: VSlog('SQL ERROR %s' % sql_select) return False, False
def del_resume(self, meta): title = QuotePlus(meta['title']) sql_select = "DELETE FROM resume WHERE title = '%s'" % title try: self.dbcur.execute(sql_select) self.db.commit() return False, False except Exception as e: VSlog('SQL ERROR %s' % sql_select) return False, False
def del_resume(self, meta): site = QuotePlus(meta['site']) sql_select = "DELETE FROM resume WHERE hoster = '%s'" % site try: self.dbcur.execute(sql_select) self.db.commit() return False, False except Exception: VSlog('SQL ERROR %s' % sql_select) return False, False
def addMovie(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): movieUrl = oOutputParameterHandler.getValue('siteUrl') oOutputParameterHandler.addParameter('movieUrl', QuotePlus(movieUrl)) oOutputParameterHandler.addParameter('movieFunc', sFunction) return self.addNewDir('movies', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 1, 1)
def get_resume(self, meta): # title = self.str_conv(meta['title']) site = QuotePlus(meta['site']) sql_select = "SELECT * FROM resume WHERE hoster = '%s'" % site try: self.dbcur.execute(sql_select) # matchedrow = self.dbcur.fetchone() matchedrow = self.dbcur.fetchall() return matchedrow except Exception: VSlog('SQL ERROR %s' % sql_select) return None
def insert_watched(self, meta): title = meta['title'] if not title: return site = QuotePlus(meta['site']) ex = 'INSERT INTO watched (title, site) VALUES (?, ?)' self.dbcur.execute(ex, (title, site)) try: self.db.commit() VSlog('SQL INSERT watched Successfully') except Exception: VSlog('SQL ERROR INSERT') pass
def get_idbyname(self, name, year='', mediaType='movie', page=1): if year: term = QuotePlus(name) + '&year=' + year else: term = QuotePlus(name) meta = self._call('search/' + str(mediaType), 'query=' + term + '&page=' + str(page)) if 'errors' not in meta and 'status_code' not in meta: # si pas de résultat avec l'année, on teste sans l'année if 'total_results' in meta and meta['total_results'] == 0 and year: meta = self.search_movie_name(name, '') # cherche 1 seul resultat if 'total_results' in meta and meta['total_results'] != 0: tmdb_id = meta['results'][0]['id'] return tmdb_id else: return False return False
def get_download(self, meta=''): if meta == '': sql_select = 'SELECT * FROM download' else: url = QuotePlus(meta['url']) sql_select = "SELECT * FROM download WHERE url = '%s' AND status = '0'" % url try: self.dbcur.execute(sql_select) matchedrow = self.dbcur.fetchall() return matchedrow except Exception: VSlog('SQL ERROR %s' % sql_select) return None
def insert_resume(self, meta): title = self.str_conv(meta['title']) site = QuotePlus(meta['site']) # hoster = meta['hoster'] point = meta['point'] ex = "DELETE FROM resume WHERE hoster = '%s'" % site self.dbcur.execute(ex) ex = 'INSERT INTO resume (title, hoster, point) VALUES (?, ?, ?)' self.dbcur.execute(ex, (title, site, point)) try: self.db.commit() except Exception: VSlog('SQL ERROR INSERT resume, title = %s' % title) pass
def insert_watched(self, meta): title = meta['title'] if not title: return site = QuotePlus(meta['site']) ex = 'INSERT INTO watched (title, site) VALUES (?, ?)' self.dbcur.execute(ex, (title, site)) try: self.db.commit() VSlog('SQL INSERT watched Successfully') except Exception, e: # print ('************* Error attempting to insert into %s cache table: %s ' % (table, e)) VSlog('SQL ERROR INSERT') pass
def get_idbyname(self, name, year='', mediaType='movie', page=1): if year: term = QuotePlus(name) + '&year=' + year else: term = QuotePlus(name) if mediaType == "tv": term = term.split('aison')[0].replace('+', ' ') meta = self._call('search/' + str(mediaType), 'query=' + term + '&page=' + str(page)) # si pas de résultat avec l'année, on teste sans l'année if 'total_results' in meta and meta['total_results'] == 0 and year: meta = self.search_movie_name(name, '') # cherche 1 seul resultat if 'total_results' in meta and meta['total_results'] != 0: if meta['total_results'] > 1: qua = [] url = [] for aEntry in meta['results']: url.append(aEntry["id"]) qua.append(aEntry['title']) #Affichage du tableau tmdb_id = dialog().VSselectqual(qua, url) else: tmdb_id = meta['results'][0]['id'] return tmdb_id else: return False return False
def addSeason(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): # Pour gérer l'enchainement des épisodes saisonUrl = oOutputParameterHandler.getValue('siteUrl') oOutputParameterHandler.addParameter('saisonUrl', QuotePlus(saisonUrl)) oOutputParameterHandler.addParameter('nextSaisonFunc', sFunction) return self.addNewDir('episodes', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 5, 4)
def SearchBA(self, window=False): sTitle = self.search + ' - Bande Annonce' # Le lien sur la BA est déjà connu urlTrailer = self.sTrailerUrl # Sinon recherche de la BA officielle dans TMDB if not urlTrailer: meta = cTMDb().get_meta(self.metaType, self.search, year=self.year) if 'trailer' in meta and meta['trailer']: self.SetTrailerUrl(meta['trailer']) urlTrailer = self.sTrailerUrl # Sinon recherche dans youtube if not urlTrailer: urlTrailer2 = 'https://www.youtube.com/results?q=' + QuotePlus( sTitle) + '&sp=EgIYAQ%253D%253D' oRequestHandler = cRequestHandler(urlTrailer2) sHtmlContent = oRequestHandler.request() listResult = re.findall('"url":"\/watch\?v=([^"]+)"', sHtmlContent) if listResult: # Premiere video trouvée urlTrailer = 'http://www.youtube.com/watch?v=' + listResult[0] # BA trouvée if urlTrailer: hote = cHoster() hote.setUrl(urlTrailer) hote.setResolution('720p') api_call = hote.getMediaLink()[1] if not api_call: return oGuiElement = cGuiElement() oGuiElement.setSiteName(SITE_IDENTIFIER) oGuiElement.setTitle(sTitle) oGuiElement.setMediaUrl(api_call) oGuiElement.setThumbnail(oGuiElement.getIcon()) oPlayer = cPlayer() oPlayer.clearPlayList() oPlayer.addItemToPlaylist(oGuiElement) oPlayer.startPlayer(window) return
def insert_resume(self, meta): title = self.str_conv(meta['title']) site = QuotePlus(meta['site']) # hoster = meta['hoster'] point = meta['point'] ex = "DELETE FROM resume WHERE hoster = '%s'" % site self.dbcur.execute(ex) ex = 'INSERT INTO resume (title, hoster, point) VALUES (?, ?, ?)' self.dbcur.execute(ex, (title, site, point)) try: self.db.commit() VSlog('SQL INSERT resume Successfully') except Exception, e: # print ('************* Error attempting to insert into %s cache table: %s ' % (table, e)) VSlog('SQL ERROR INSERT') pass