def getMediaLink(self): self.oPremiumHandler = cPremiumHandler(self.getPluginIdentifier()) if (self.oPremiumHandler.isPremiumModeAvailable()): ADDON = addon() try: mDefault = int(ADDON.getSetting("hoster_uptobox_mode_default")) except AttributeError: mDefault = 0 if mDefault == 0: ret = dialog().VSselect([ 'Passer en Streaming (via Uptostream)', 'Rester en direct (via Uptobox)' ], 'Choissisez votre mode de fonctionnement') else: # 0 is ask me, so 1 is uptostream and so on... ret = mDefault - 1 # mode stream if ret == 0: return self.__getMediaLinkForGuest() # mode DL if ret == 1: return self.__getMediaLinkByPremiumUser() return False else: VSlog('UPTOBOX - no premium') return self.__getMediaLinkForGuest()
def getAvailablePlugins(self, sLabel): addons = addon() sFolder = "/usr/lib/enigma2/python/Plugins/Extensions/IPTVPlayer/tsiplayer/addons/resources/sites" sFolder = sFolder.replace('\\', '/') VSlog("Sites Folder: " + sFolder) aFileNames = self.__getFileNamesFromFolder(sFolder) aPlugins = [] for sFileName in aFileNames: VSlog("Load Plugin: " + str(sFileName)) # wir versuchen das plugin zu importieren aPlugin = self.__importPlugin(sFileName, sLabel) if (aPlugin[0] != False): sSiteUrl = aPlugin[0] sPluginSettingsName = aPlugin[1] sSiteDesc = aPlugin[2] sSiteName = aPlugin[3] # existieren zu diesem plugin die an/aus settings bPlugin = addons.getSetting(sPluginSettingsName) if (bPlugin != ''): # settings gefunden if (bPlugin == 'true'): aPlugins.append( self.__createAvailablePluginsItem( sSiteUrl, sSiteName, sFileName, sSiteDesc)) else: # settings nicht gefunden, also schalten wir es trotzdem sichtbar aPlugins.append( self.__createAvailablePluginsItem( sSiteUrl, sSiteName, sFileName, sSiteDesc)) return aPlugins
def Box(self, listitems): addons = addon() class XMLDialog(xbmcgui.WindowXMLDialog): def __init__(self, *args, **kwargs): self.tmdb_id = "" def onInit(self): self.container = self.getControl(6) self.button = self.getControl(5) self.getControl(3).setVisible(False) self.getControl(1).setLabel("Choisissez le bon contenu") self.list = self.container.addItems(listitems) self.setFocus(self.container) def onClick(self, controlId): self.tmdb_id = self.getControl( controlId).getSelectedItem().getUniqueID('tmdb') self.close() path = 'special://home/addons/plugin.video.vstream' wd = XMLDialog('DialogSelect.xml', path, 'Default') wd.doModal() tmdb_id = wd.tmdb_id del wd return tmdb_id
def __init__(self, api_key='', debug=False, lang='fr'): self.ADDON = addon() self.api_key = self.ADDON.getSetting('api_tmdb') self.debug = debug self.lang = lang self.poster = 'https://image.tmdb.org/t/p/%s' % self.ADDON.getSetting( 'poster_tmdb') self.fanart = 'https://image.tmdb.org/t/p/%s' % self.ADDON.getSetting( 'backdrop_tmdb') try: if not xbmcvfs.exists(self.CACHE): # f = open(self.cache, 'w') # f.close() self.db = sqlite.connect(self.REALCACHE) self.db.row_factory = sqlite.Row self.dbcur = self.db.cursor() self.__createdb() return except: VSlog('Error: Unable to write on %s' % self.REALCACHE) pass try: self.db = sqlite.connect(self.REALCACHE) self.db.row_factory = sqlite.Row self.dbcur = self.db.cursor() except: VSlog('Error: Unable to connect to %s' % self.REALCACHE) pass
def getData(): if addon().getSetting("PlutoTV_sid"): deviceID = addon().getSetting("PlutoTV_deviceID") clientID = addon().getSetting("PlutoTV_clientID") sid = addon().getSetting("PlutoTV_sid") else: sid = str(uuid.uuid1().hex) deviceID = str(uuid.uuid4().hex) clientID = Quote(''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits + '=+') for _ in range(24))) addon().setSetting("PlutoTV_deviceID", deviceID) addon().setSetting("PlutoTV_clientID", clientID) addon().setSetting("PlutoTV_sid", sid) return clientID, deviceID, sid
def load(): oGui = cGui() addons = addon() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_WEB) oGui.addDir(SITE_IDENTIFIER, 'showWeb', addons.VSlang(30332), 'tv.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', MOVIE_IPTVSITE) oGui.addDir(SITE_IDENTIFIER, 'showIptvSite', 'Iptv (Sites)', 'tv.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'http://') oGui.addDir('radio', 'showGenres', addons.VSlang(30203) + ' (Genres)', 'music.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', URL_RADIO) oGui.addDir('radio', 'showAZ', addons.VSlang(30203) + ' (A-Z)', 'music.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', URL_RADIO) oGui.addDir('radio', 'showWeb', addons.VSlang(30203), 'music.png', oOutputParameterHandler) #oOutputParameterHandler.addParameter('siteUrl', 'http://') #oGui.addDir('lsdb', 'load', 'Liveset Database', 'music.png', oOutputParameterHandler) oGui.setEndOfDirectory()
def GetURL_MAIN(): ADDON = addon() # MemorisedHost = '' oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') Sources = oInputParameterHandler.getValue('function') # z = oInputParameterHandler.getAllParameter() # VSlog(z) # quand vStream load tous les sites on passe >> globalSources # quand vStream load a partir du menu home on passe >> callplugin # quand vStream fabrique une liste de plugin pour menu(load site globalRun and call function search) >> search # quand l'url ne contient pas celle déjà enregistrer dans settings et que c'est pas dlprotect on active. if not ( Sources == 'callpluging' or Sources == 'globalSources' or Sources == 'search' ) and ADDON.getSetting( 'ZT' )[6:] not in sUrl and 'dl-protect1.' not in sUrl and 'zt-protect.' not in sUrl: oRequestHandler = cRequestHandler(URL_HOST) oRequestHandler.disableSSL() oRequestHandler.request() MemorisedHost = oRequestHandler.getRealUrl() if MemorisedHost is not None and MemorisedHost != '': if 'cf_chl_jschl_tk' not in MemorisedHost: ADDON.setSetting('ZT', MemorisedHost) VSlog("ZT url >> " + str(MemorisedHost) + ' sauvegarder >> ' + ADDON.getSetting('ZT')) else: ADDON.setSetting('ZT', URL_HOST) VSlog( "Url non changer car egal a None le site peux etre surchager utilisation de >> ADDON.getSetting('ZT')" ) return ADDON.getSetting('ZT') else: # si pas de zt dans settings on récup l'url une fois dans le site if not ADDON.getSetting('ZT') and not (Sources == 'callpluging' or Sources == 'globalSources' or Sources == 'search'): oRequestHandler = cRequestHandler(URL_HOST) oRequestHandler.disableSSL() oRequestHandler.request() MemorisedHost = oRequestHandler.getRealUrl() if MemorisedHost is not None and MemorisedHost != '': if 'cf_chl_jschl_tk' not in MemorisedHost: ADDON.setSetting('ZT', MemorisedHost) VSlog("ZT url vide >> " + str(MemorisedHost) + ' sauvegarder >> ' + ADDON.getSetting('ZT')) else: ADDON.setSetting('ZT', URL_HOST) VSlog( "Url non changer car egal a None le site peux etre surcharger utilisation de >> ADDON.getSetting('ZT')" ) return ADDON.getSetting('ZT') else: VSlog("ZT pas besoin d'url") return ADDON.getSetting('ZT')
def showSearch(): VSlog('showSearch global0') oGui = cGui() addons = addon() VSlog('showSearch global1') oInputParameterHandler = cInputParameterHandler() VSlog('showSearch global2') sSearchText = oInputParameterHandler.getValue('searchtext') VSlog('showSearch global3') sCat = oInputParameterHandler.getValue('sCat') VSlog('showSearch global4') VSlog('sText=' + str(sSearchText)) oHandler = cRechercheHandler() oHandler.setText(sSearchText) oHandler.setCat(sCat) aPlugins = oHandler.getAvailablePlugins() if not aPlugins: return True VSlog('aPlugins=' + str(len(aPlugins))) total = len(aPlugins) progress_ = progress().VScreate(large=True) # kodi 17 vire la fenetre busy qui se pose au dessus de la barre de Progress try: xbmc.executebuiltin('Dialog.Close(busydialog)') except: pass oGui.addText('globalSearch', addons.VSlang(30081) % sSearchText, 'search.png') sSearchText = Quote(sSearchText) count = 1 for plugin in aPlugins: if not os.path.exists( GetCacheSubDir('Tsiplayer') + 'VStream_listing.search'): break progress_.VSupdate(progress_, total, plugin['name'], True) if progress_.iscanceled(): break oGui.addText(plugin['identifier'], '%s. [COLOR olive]%s[/COLOR]' % (count, plugin['name']), 'sites/%s.png' % (plugin['identifier'])) oGui.searchResults[:] = [ ] # vider le tableau de résultats pour les récupérer par source _pluginSearch(plugin, sSearchText) count += 1 if not count: # aucune source ne retourne de résultats oGui.addText('globalSearch') # "Aucune information" progress_.VSclose(progress_) cGui.CONTENT = 'files' oGui.setEndOfDirectory() return True
def ouTMyTmdb(): addons = addon() addons.setSetting('tmdb_session', '') addons.setSetting('tmdb_account', '') dialog().VSinfo(addons.VSlang(30320)) VSupdate() showMyTmdb() return
def load(): oGui = cGui() addons = addon() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'http://') oGui.addDir(SITE_IDENTIFIER, 'showSearch', '%s (TMDB)' % addons.VSlang(30330), 'search.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'movie/popular') oGui.addDir(SITE_IDENTIFIER, 'showMovies', addons.VSlang(30425), 'comments.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'movie/now_playing') oGui.addDir(SITE_IDENTIFIER, 'showMovies', addons.VSlang(30426), 'films.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'movie/top_rated') oGui.addDir(SITE_IDENTIFIER, 'showMovies', addons.VSlang(30427), 'notes.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'genre/movie/list') oGui.addDir(SITE_IDENTIFIER, 'showGenreMovie', addons.VSlang(30428), 'genres.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'tv/popular') oGui.addDir(SITE_IDENTIFIER, 'showSeries', addons.VSlang(30429), 'comments.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'tv/on_the_air') oGui.addDir(SITE_IDENTIFIER, 'showSeries', addons.VSlang(30430), 'series.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'tv/top_rated') oGui.addDir(SITE_IDENTIFIER, 'showSeries', addons.VSlang(30431), 'notes.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'genre/tv/list') oGui.addDir(SITE_IDENTIFIER, 'showGenreTV', addons.VSlang(30432), 'genres.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'person/popular') oGui.addDir(SITE_IDENTIFIER, 'showActors', addons.VSlang(30433), 'actor.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'http://') oGui.addDir('topimdb', 'load', 'Top Imdb', 'star.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'http://') oGui.addDir(SITE_IDENTIFIER, 'showFolderList', 'Listes TMDB', 'listes.png', oOutputParameterHandler) oGui.setEndOfDirectory()
def __init__(self): self.addons = addon() # self.__sRootArt = cConfig().getRootArt() self.__sFunctionName = '' self.__sRootArt = 'file:///usr/lib/enigma2/python/Plugins/Extensions/IPTVPlayer/tsiplayer/addons/resources/art/' self.__sType = 'video' self.__sMeta = 0 self.__sTrailer = '' self.__sMetaAddon = self.addons.getSetting('meta-view') self.__sMediaUrl = '' self.__sSiteUrl = '' # contient le titre qui sera coloré self.__sTitle = '' # contient le titre propre self.__sCleanTitle = '' # titre considéré Vu self.__sTitleWatched = '' self.__ResumeTime = 0 # Durée déjà lue de la vidéo self.__TotalTime = 0 # Durée totale de la vidéo # contient le titre modifié pour BDD self.__sFileName = '' self.__sDescription = '' self.__sGenre = '' self.__sThumbnail = '' self.__sPoster = '' self.__Season = '' self.__Episode = '' self.__sIcon = self.DEFAULT_FOLDER_ICON self.__sFanart = '' self.__sDecoColor = self.addons.getSetting('deco_color') self.poster = 'https://image.tmdb.org/t/p/%s' % self.addons.getSetting( 'poster_tmdb') self.fanart = 'https://image.tmdb.org/t/p/%s' % self.addons.getSetting( 'backdrop_tmdb') # For meta search # TmdbId the movie database https://developers.themoviedb.org/ self.__TmdbId = '' # ImdbId pas d'api http://www.imdb.com/ self.__ImdbId = '' self.__Year = '' self.__aItemValues = {} self.__aProperties = {} self.__aContextElements = [] self.__sSiteName = '' # categorie utilisé pour marque-page et recherche. # 1 - movies/saga , 2 - tvshow/episode/anime, 5 - misc/Next self.__sCat = ''
def insert_bookmark(self, meta): title = self.str_conv(meta['title']) siteurl = QuotePlus(meta['siteurl']) try: sIcon = meta['icon'].decode('UTF-8') except: sIcon = meta['icon'] try: ex = 'INSERT INTO favorite (title, siteurl, site, fav, cat, icon, fanart) VALUES (?, ?, ?, ?, ?, ?, ?)' self.dbcur.execute(ex, (title, siteurl, meta['site'], meta['fav'], meta['cat'], sIcon, meta['fanart'])) self.db.commit() dialog().VSinfo(addon().VSlang(30042), meta['title']) VSlog('SQL INSERT favorite Successfully') except Exception as e: if 'UNIQUE constraint failed' in e.message: dialog().VSinfo(addon().VSlang(30043), meta['title']) VSlog('SQL ERROR INSERT : %s' % e) 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 Plugins.Extensions.IPTVPlayer.tsiplayer.addons.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: VSlog('SQL ERROR %s' % sql_delete) return 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: VSlog('SQL ERROR INSERT into download') pass
def showSearch(): oGui = cGui() addons = addon() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'search/movie') oGui.addDir(SITE_IDENTIFIER, 'showSearchMovie', addons.VSlang(30423), 'search.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'search/tv') oGui.addDir(SITE_IDENTIFIER, 'showSearchSerie', addons.VSlang(30424), 'search.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'search/person') oGui.addDir(SITE_IDENTIFIER, 'showSearchActor', addons.VSlang(30450), 'search.png', oOutputParameterHandler) oGui.setEndOfDirectory()
def getContext(): addons = addon() dialogs = dialog() tmdb_account = addons.getSetting('tmdb_account') if tmdb_account == "": dialogs.VSerror(addons.VSlang(30442)) return False, False, False disp = [] lang = [] fow = [] yn = [] disp.append('vote') fow.append('vote') yn.append(True) lang.append(addons.VSlang(30443)) disp.append('account/%s/watchlist' % tmdb_account) fow.append('watchlist') yn.append(True) lang.append(addons.VSlang(30444)) disp.append('account/%s/favorite' % tmdb_account) fow.append('favorite') yn.append(True) lang.append(addons.VSlang(30445)) disp.append('account/%s/watchlist' % tmdb_account) fow.append('watchlist') yn.append(False) lang.append(addons.VSlang(30446)) disp.append('account/%s/favorite' % tmdb_account) fow.append('favorite') yn.append(False) lang.append(addons.VSlang(30447)) ret = dialogs.VSselect(lang, 'TMDB') if ret > -1: return disp[ret], fow[ret], yn[ret] return False
def globalSources(): oGui = cGui() oPluginHandler = cPluginHandler() aPlugins = oPluginHandler.getAvailablePlugins(True) if len(aPlugins) == 0: addons = addon() addons.openSettings() oGui.updateDirectory() else: for aPlugin in aPlugins: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'http://venom') icon = 'sites/%s.png' % (aPlugin[1]) # icon = 'https://imgplaceholder.com/512x512/transparent/fff?text=%s&font-family=Roboto_Bold' % aPlugin[1] oGui.addDir(aPlugin[1], 'load', aPlugin[0], icon, oOutputParameterHandler) oGui.setEndOfDirectory() return
def del_history(self): from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.lib.gui.gui import cGui oGui = cGui() oInputParameterHandler = cInputParameterHandler() if oInputParameterHandler.exist('searchtext'): sql_delete = "DELETE FROM history WHERE title = '%s'" % ( oInputParameterHandler.getValue('searchtext')) else: sql_delete = 'DELETE FROM history;' try: self.dbcur.execute(sql_delete) self.db.commit() dialog().VSinfo(addon().VSlang(30041)) oGui.updateDirectory() return False, False except Exception: VSlog('SQL ERROR DELETE : %s' % sql_delete) return False, False
def getWatchlist(): grab = cTMDb() addons = addon() tmdb_session = addons.getSetting('tmdb_session') tmdb_account = addons.getSetting('tmdb_account') if not tmdb_session: return if not tmdb_account: return oInputParameterHandler = cInputParameterHandler() sCat = oInputParameterHandler.getValue('sCat') if not sCat: return sCat = sCat.replace('1', 'movie').replace('2', 'tv') # dans le doute si meta active sTMDB = oInputParameterHandler.getValue('sTmdbId') sTitle = oInputParameterHandler.getValue('sFileName') # import re # if sCat == "tv": # sSeason = re.search('aison (\d+)',sTitle).group(1) # sEpisode = re.search('pisode (\d+)',sTitle).group(1) if not sTMDB: sTMDB = grab.get_idbyname(sTitle, '', sCat) if not sTMDB: return sPost = {"media_type": sCat, "media_id": sTMDB, 'watchlist': True} sAction = 'account/%s/watchlist' % tmdb_account data = grab.getPostUrl(sAction, sPost) if len(data) > 0: dialog().VSinfo(data['status_message']) return
def load(): oGui = cGui() addons = addon() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'http://') oGui.addDir(SITE_IDENTIFIER, 'showGenres', addons.VSlang(30203) + ' (Genres)', 'music.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'http://') oGui.addDir(SITE_IDENTIFIER, 'showAZ', addons.VSlang(30203) + ' (A-Z)', 'music.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'http://') oGui.addDir(SITE_IDENTIFIER, 'showWeb', addons.VSlang(30203), 'music.png', oOutputParameterHandler) oGui.setEndOfDirectory()
def viewInfo(self): if addon().getSetting('information-view') == "false": from resources.lib.config import WindowsBoxes oInputParameterHandler = cInputParameterHandler() sCleanTitle = oInputParameterHandler.getValue( 'sFileName') if oInputParameterHandler.exist( 'sFileName') else xbmc.getInfoLabel( 'ListItem.Property(sCleanTitle)') sMeta = oInputParameterHandler.getValue( 'sMeta') if oInputParameterHandler.exist( 'sMeta') else xbmc.getInfoLabel('ListItem.Property(sMeta)') sYear = oInputParameterHandler.getValue( 'sYear') if oInputParameterHandler.exist( 'sYear') else xbmc.getInfoLabel('ListItem.Year') WindowsBoxes(sCleanTitle, sCleanTitle, sMeta, sYear) else: # On appel la fonction integrer a Kodi pour charger les infos. xbmc.executebuiltin('Action(Info)')
def getAvailablePlugins(self): addons = addon() sText = self.getText() if not sText: return False sCat = self.getCat() if not sCat: return False # historique try: if (addons.getSetting("history-view") == 'true'): meta = {} meta['title'] = sText meta['disp'] = sCat cDb().insert_history(meta) except: pass sFolder = "/usr/lib/enigma2/python/Plugins/Extensions/IPTVPlayer/tsiplayer/addons/resources/sites" sFolder = sFolder.replace('\\', '/') VSlog("Sites Folder: " + sFolder) aFileNames = self.__getFileNamesFromFolder(sFolder) aPlugins = [] for sFileName in aFileNames: sPluginSettingsName = 'plugin_' + sFileName bPlugin = addons.getSetting(sPluginSettingsName) if (bPlugin == 'true'): aPlugin = self.importPlugin(sFileName, sCat) if aPlugin: aPlugins.append(aPlugin) return aPlugins
def showSeriesEpisode(): grab = cTMDb() addons = addon() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sFanart = oInputParameterHandler.getValue('sFanart') sTmdbId = oInputParameterHandler.getValue('sTmdbId') sSeason = oInputParameterHandler.getValue('sSeason') # sId = oInputParameterHandler.getValue('sId') if sSeason == False: sSeason = sUrl.split('/')[-1] if sFanart == False: sFanart = '' oGui = cGui() # recherche saison complete oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sMovieTitle) # oOutputParameterHandler.addParameter('type', 'serie') search = '%s S%02d' % (sMovieTitle, int(sSeason)) # oOutputParameterHandler.addParameter('searchtext', search) if not isMatrix(): oOutputParameterHandler.addParameter('searchtext', cUtil().CleanName(search)) else: oOutputParameterHandler.addParameter('searchtext', search) oGuiElement = cGuiElement() oGuiElement.setSiteName('globalSearch') oGuiElement.setFunction('searchMovie') oGuiElement.setTitle(addons.VSlang(30415)) oGuiElement.setCat(2) oGuiElement.setIcon("searchtmdb.png") oGui.addFolder(oGuiElement, oOutputParameterHandler) result = grab.getUrl(sUrl) total = len(result) if (total > 0 and 'episodes' in result): total = len(result['episodes']) progress_ = progress().VScreate(SITE_NAME) oOutputParameterHandler = cOutputParameterHandler() for i in result['episodes']: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break # sId, sTitle, sOtitle, sThumb, sFanart = i['id'], i['name'], i['original_name'], i['poster_path'], i['backdrop_path'] sEpNumber = i['episode_number'] # Mise en forme des infos (au format meta imdb) i = grab._format(i, '') sTitle, sGenre, sThumb, sFanart, sDesc, sYear = i['title'], i[ 'genre'], i['cover_url'], i['backdrop_url'], i['plot'], i[ 'year'] if not isMatrix(): sTitle = sTitle.encode("utf-8") sTitle = 'S%s E%s %s' % (sSeason, str(sEpNumber), sTitle) sExtraTitle = ' S' + "%02d" % int(sSeason) + 'E' + "%02d" % int( sEpNumber) oOutputParameterHandler.addParameter( 'siteUrl', sMovieTitle + '|' + sExtraTitle) # Pour compatibilite Favoris oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sTmdbId', sTmdbId) oOutputParameterHandler.addParameter('sSeason', sSeason) oOutputParameterHandler.addParameter('sEpisode', sEpNumber) oOutputParameterHandler.addParameter('type', 'serie') if not isMatrix(): oOutputParameterHandler.addParameter( 'searchtext', cUtil().CleanName(sMovieTitle)) else: oOutputParameterHandler.addParameter('searchtext', sMovieTitle) cGui.CONTENT = "tvshows" oGuiElement = cGuiElement() oGuiElement.setTmdbId(sTmdbId) oGuiElement.setSiteName('globalSearch') oGuiElement.setFunction('showSearch') oGuiElement.setTitle(sTitle) oGuiElement.setFileName(sMovieTitle) oGuiElement.setIcon('series.png') oGuiElement.setMeta(2) oGuiElement.setThumbnail(sThumb) oGuiElement.setFanart(sFanart) oGuiElement.setCat(2) oGuiElement.setDescription(sDesc) oGuiElement.setYear(sYear) oGuiElement.setGenre(sGenre) oGui.addFolder(oGuiElement, oOutputParameterHandler) progress_.VSclose(progress_) # tchnagement mode view = addons.getSetting('visuel-view') oGui.setEndOfDirectory(view)
class cGui: SITE_NAME = 'cGui' CONTENT = 'files' searchResults = [] listing = [] ADDON = addon() if isKrypton(): CONTENT = 'addons' def addNewDir(self, Type, sId, sFunction, sLabel, sIcon, sThumbnail='', sDesc='', oOutputParameterHandler='', sMeta=0, sCat=None): oGuiElement = cGuiElement() # dir ou link => CONTENT par défaut = files if Type != 'dir' and Type != 'link': cGui.CONTENT = Type oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) if sThumbnail == '': oGuiElement.setThumbnail(oGuiElement.getIcon()) else: oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setMeta(sMeta) oGuiElement.setDescription(sDesc) if sCat is not None: oGuiElement.setCat(sCat) # Pour addLink on recupere le sCat precedent. elif Type == 'link': oInputParameterHandler = cInputParameterHandler() sCat = oInputParameterHandler.getValue('sCat') if sCat: oGuiElement.setCat(sCat) oOutputParameterHandler.addParameter('sFav', sFunction) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass def addMovie(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): self.addNewDir('movies', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 1, 1) def addTV(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): self.addNewDir('tvshows', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 2, 2) def addAnime(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): self.addNewDir('tvshows', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 4, 2) def addMisc(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): if sThumbnail or sDesc: type = 'videos' else: type = 'files' self.addNewDir(type, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 0, 5) def addMoviePack(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): self.addNewDir('movies', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 3, 1) def addDir(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler='', sDesc=""): self.addNewDir('dir', sId, sFunction, sLabel, sIcon, '', sDesc, oOutputParameterHandler, 0, None) def addLink(self, sId, sFunction, sLabel, sThumbnail, sDesc, oOutputParameterHandler=''): sIcon = sThumbnail self.addNewDir('link', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 0, None) # Affichage d'un épisode, sans recherche de Métadonnées, et menu adapté def addEpisode(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): self.addNewDir('episodes', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 0, 2) # Affichage d'une personne (acteur, réalisateur, ..) def addPerson(self, sId, sFunction, sLabel, sIcon, sThumbnail, oOutputParameterHandler=''): sThumbnail = '' sDesc = '' self.addNewDir('artists', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 7, None) # Affichage d'un réseau de distribution du média def addNetwork(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler=''): sThumbnail = '' sDesc = '' self.addNewDir('files', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 8, None) def addNext(self, sId, sFunction, sLabel, oOutputParameterHandler): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle('[COLOR teal]' + sLabel + ' >>>[/COLOR]') oGuiElement.setIcon('next.png') oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) oGuiElement.setCat(5) self.createContexMenuPageSelect(oGuiElement, oOutputParameterHandler) self.createContexMenuViewBack(oGuiElement, oOutputParameterHandler) self.addFolder(oGuiElement, oOutputParameterHandler) # utiliser oGui.addText(SITE_IDENTIFIER) def addNone(self, sId): return self.addText(sId) def addText(self, sId, sLabel='', sIcon='none.png'): printDBG('addText0001:') # Pas de texte lors des recherches globales if window(10101).getProperty('search') == 'true': return oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction('DoNothing') if not sLabel: sLabel = self.ADDON.VSlang(30204) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) oOutputParameterHandler = cOutputParameterHandler() self.addFolder(oGuiElement, oOutputParameterHandler) # non utiliser depuis le 22/04 def addMovieDB(self, sId, sFunction, sLabel, sIcon, sThumbnail, sFanart, oOutputParameterHandler=''): cGui.CONTENT = 'movies' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setMeta(1) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sFanart) oGuiElement.setCat(7) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.addFolder(oGuiElement, oOutputParameterHandler) # non utiliser 22/04 def addTVDB(self, sId, sFunction, sLabel, sIcon, sThumbnail, sFanart, oOutputParameterHandler=''): cGui.CONTENT = 'tvshows' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setMeta(2) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sFanart) oGuiElement.setCat(7) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.addFolder(oGuiElement, oOutputParameterHandler) # afficher les liens non playable def addFolder(self, oGuiElement, oOutputParameterHandler='', _isFolder=True): printDBG('addFolder0001:') # recherche append les reponses if window(10101).getProperty('search') == 'true': import copy cGui.searchResults.append({ 'guiElement': oGuiElement, 'params': copy.deepcopy(oOutputParameterHandler) }) return # Des infos a rajouter ? params = { 'siteUrl': oGuiElement.setSiteUrl, 'sTmdbId': oGuiElement.setTmdbId, 'sYear': oGuiElement.setYear } try: for sParam, callback in params.iteritems(): value = oOutputParameterHandler.getValue(sParam) if value: callback(value) except AttributeError: for sParam, callback in params.items(): value = oOutputParameterHandler.getValue(sParam) if value: callback(value) oListItem = self.createListItem(oGuiElement) oListItem.setProperty('IsPlayable', 'false') sCat = oGuiElement.getCat() if sCat: cGui.sCat = sCat oOutputParameterHandler.addParameter('sCat', sCat) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oOutputParameterHandler.addParameter('sTitleWatched', oGuiElement.getTitleWatched()) if cGui.CONTENT in ('movies', 'tvshows', 'episodes'): self.createContexMenuinfo(oGuiElement, oOutputParameterHandler) self.createContexMenuba(oGuiElement, oOutputParameterHandler) self.createContexMenuBookmark(oGuiElement, oOutputParameterHandler) if self.ADDON.getSetting('bstoken') != '': self.createContexMenuTrakt(oGuiElement, oOutputParameterHandler) if self.ADDON.getSetting('tmdb_account') != '': self.createContexMenuTMDB(oGuiElement, oOutputParameterHandler) self.createContexMenuSimil(oGuiElement, oOutputParameterHandler) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) elif sCat and sCat == 5: # MISC self.createContexMenuBookmark(oGuiElement, oOutputParameterHandler) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) self.listing.append((sItemUrl, oListItem, _isFolder)) # Vider les paramètres pour être recyclé self.TsiplayerWrite(oGuiElement, oOutputParameterHandler) #oOutputParameterHandler.clearParameter() def TsiplayerWrite(self, oGuiElement, oOutputParameterHandler): sPluginPath = 'Tsiplayer' sParams = oOutputParameterHandler.getParameterAsUri() sId = oGuiElement.getSiteName() sLabel = oGuiElement.getTitle() sFunction = oGuiElement.getFunction() sIcon = oGuiElement.getIcon() sThumbnail = oGuiElement.getThumbnail() sMeta = oGuiElement.getMeta() sItemUrl = '%s?site=%s&function=%s&title=%s&meta=%s&%s' % ( sPluginPath, sId, sFunction, QuotePlus( str(sLabel)), sMeta, sParams) if sIcon == 'special://home/addons/plugin.video.vstream/resources/art/': sIcon = sThumbnail #PIK = self.MyPath() + "VStream_listing.dat" PIK = self.MyPath() + ("tmdb/VStream_listing_%s.dat" % sId) time_now = round(time.time() * 1000) data = [oGuiElement, oOutputParameterHandler, time_now] with open(PIK, "a+b") as f: pickle.dump(data, f) return '' def MyPath(self): return GetCacheSubDir('Tsiplayer') # affiche les liens playable def addHost(self, oGuiElement, oOutputParameterHandler=''): oInputParameterHandler = cInputParameterHandler() cGui.CONTENT = 'files' if oOutputParameterHandler.getValue('siteUrl'): sSiteUrl = oOutputParameterHandler.getValue('siteUrl') oGuiElement.setSiteUrl(sSiteUrl) # On récupere le sCat du fichier précédent. sCat = oInputParameterHandler.getValue('sCat') if sCat: oGuiElement.setCat(sCat) oListItem = self.createListItem(oGuiElement) oListItem.setProperty('IsPlayable', 'true') oListItem.setProperty('Video', 'true') oListItem.addStreamInfo('video', {}) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oOutputParameterHandler.addParameter('sTitleWatched', oGuiElement.getTitleWatched()) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) self.listing.append((sItemUrl, oListItem, False)) self.TsiplayerWrite(oGuiElement, oOutputParameterHandler) def createListItem(self, oGuiElement): oListItem = listitem(oGuiElement.getTitle()) # voir : https://kodi.wiki/view/InfoLabels oListItem.setInfo(oGuiElement.getType(), oGuiElement.getItemValues()) oListItem.setArt({ 'poster': oGuiElement.getPoster(), 'thumb': oGuiElement.getThumbnail(), 'icon': oGuiElement.getIcon(), 'fanart': oGuiElement.getFanart() }) aProperties = oGuiElement.getItemProperties() for sPropertyKey, sPropertyValue in aProperties.items(): oListItem.setProperty(sPropertyKey, str(sPropertyValue)) return oListItem # Marquer vu/Non vu def createContexMenuWatch(self, oGuiElement, oOutputParameterHandler=''): self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'setWatched', self.ADDON.VSlang(30206)) def createContexMenuPageSelect(self, oGuiElement, oOutputParameterHandler): oContext = cContextElement() oContext.setFile('cGui') oContext.setSiteName('cGui') oContext.setFunction('selectPage') oContext.setTitle(self.ADDON.VSlang(30017)) oOutputParameterHandler.addParameter('OldFunction', oGuiElement.getFunction()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) def createContexMenuViewBack(self, oGuiElement, oOutputParameterHandler): oContext = cContextElement() oContext.setFile('cGui') oContext.setSiteName('cGui') oContext.setFunction('viewBack') oContext.setTitle(self.ADDON.VSlang(30018)) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) # marque page def createContexMenuBookmark(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler.addParameter('sCleanTitle', oGuiElement.getCleanTitle()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oOutputParameterHandler.addParameter('sFav', oGuiElement.getFunction()) oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cFav', 'cFav', 'setBookmark', self.ADDON.VSlang(30210)) def createContexMenuTrakt(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler.addParameter('sImdbId', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) sType = cGui.CONTENT.replace('tvshows', 'shows') oOutputParameterHandler.addParameter('sType', sType) self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cTrakt', 'cTrakt', 'getAction', self.ADDON.VSlang(30214)) def createContexMenuTMDB(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler.addParameter('sImdbId', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'themoviedb_org', 'themoviedb_org', 'getAction', 'TMDB') def createContexMenuDownload(self, oGuiElement, oOutputParameterHandler='', status='0'): if status == '0': self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'StartDownloadOneFile', self.ADDON.VSlang(30215)) if status == '0' or status == '2': self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'delDownload', self.ADDON.VSlang(30216)) self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'DelFile', self.ADDON.VSlang(30217)) if status == '1': self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'StopDownloadList', self.ADDON.VSlang(30218)) if status == '2': self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'ReadDownload', self.ADDON.VSlang(30219)) self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'ResetDownload', self.ADDON.VSlang(30220)) # Information def createContexMenuinfo(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) oOutputParameterHandler.addParameter('sYear', oGuiElement.getYear()) self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewInfo', self.ADDON.VSlang(30208)) # Bande annonce def createContexMenuba(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sYear', oGuiElement.getYear()) oOutputParameterHandler.addParameter('sTrailerUrl', oGuiElement.getTrailer()) oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewBA', self.ADDON.VSlang(30212)) # Recherche similaire def createContexMenuSimil(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewSimil', self.ADDON.VSlang(30213)) def createSimpleMenu(self, oGuiElement, oOutputParameterHandler, sFile, sName, sFunction, sTitle): oContext = cContextElement() oContext.setFile(sFile) oContext.setSiteName(sName) oContext.setFunction(sFunction) oContext.setTitle(sTitle) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) def createContexMenuDelFav(self, oGuiElement, oOutputParameterHandler=''): self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'cFav', 'cFav', 'delBookmarksMenu', self.ADDON.VSlang(30209)) def createContexMenuSettings(self, oGuiElement, oOutputParameterHandler=''): self.createSimpleMenu(oGuiElement, oOutputParameterHandler, 'globalParametre', 'globalParametre', 'opensetting', self.ADDON.VSlang(30023)) def __createContextMenu(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] # Menus classiques reglés a la base if len(oGuiElement.getContextItems()) > 0: for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler( ) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % ( sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] oListItem.addContextMenuItems(aContextMenus, True) return oListItem def __ContextMenu(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] if len(oGuiElement.getContextItems()) > 0: for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler( ) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % ( sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] oListItem.addContextMenuItems(aContextMenus) return oListItem def __ContextMenuPlay(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] if len(oGuiElement.getContextItems()) > 0: for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler( ) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % ( sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] oListItem.addContextMenuItems(aContextMenus) return oListItem 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 setEndOfDirectory(self, ForceViewMode=False): printDBG('set end of dir') def updateDirectory(self): # refresh the content xbmc.executebuiltin('Container.Refresh') xbmc.sleep(600) # Nécessaire pour laisser le temps du refresh def viewBA(self): oInputParameterHandler = cInputParameterHandler() sFileName = oInputParameterHandler.getValue('sFileName') sYear = oInputParameterHandler.getValue('sYear') sTrailerUrl = oInputParameterHandler.getValue('sTrailerUrl') sMeta = oInputParameterHandler.getValue('sMeta') from resources.lib.ba import cShowBA cBA = cShowBA() cBA.SetSearch(sFileName) cBA.SetYear(sYear) cBA.SetTrailerUrl(sTrailerUrl) cBA.SetMetaType(sMeta) cBA.SearchBA() def viewBack(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() # sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') sTest = '%s?site=%s' % (sPluginPath, sId) xbmc.executebuiltin('Container.Update(%s, replace)' % sTest) def viewInfo(self): if addon().getSetting('information-view') == "false": from resources.lib.config import WindowsBoxes oInputParameterHandler = cInputParameterHandler() sCleanTitle = oInputParameterHandler.getValue( 'sFileName') if oInputParameterHandler.exist( 'sFileName') else xbmc.getInfoLabel( 'ListItem.Property(sCleanTitle)') sMeta = oInputParameterHandler.getValue( 'sMeta') if oInputParameterHandler.exist( 'sMeta') else xbmc.getInfoLabel('ListItem.Property(sMeta)') sYear = oInputParameterHandler.getValue( 'sYear') if oInputParameterHandler.exist( 'sYear') else xbmc.getInfoLabel('ListItem.Year') WindowsBoxes(sCleanTitle, sCleanTitle, sMeta, sYear) else: # On appel la fonction integrer a Kodi pour charger les infos. xbmc.executebuiltin('Action(Info)') def viewSimil(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sCleanTitle = oInputParameterHandler.getValue( 'sFileName') if oInputParameterHandler.exist( 'sFileName') else xbmc.getInfoLabel( 'ListItem.Property(sCleanTitle)') sCat = oInputParameterHandler.getValue( 'sCat') if oInputParameterHandler.exist( 'sCat') else xbmc.getInfoLabel('ListItem.Property(sCat)') oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('searchtext', sCleanTitle) oOutputParameterHandler.addParameter('sCat', sCat) oOutputParameterHandler.addParameter('readdb', 'False') sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, 'globalSearch', 'globalSearch', sParams) # Si lancé depuis la page Home de Kodi, il faut d'abord en sortir pour lancer la recherche if xbmc.getCondVisibility('Window.IsVisible(home)'): xbmc.executebuiltin('ActivateWindow(%d)' % (10028)) xbmc.executebuiltin('Container.Update(%s)' % sTest) return False def selectPage(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() # sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') sFunction = oInputParameterHandler.getValue('OldFunction') siteUrl = oInputParameterHandler.getValue('siteUrl') if siteUrl.endswith( '/'): # for the url http.://www.1test.com/annee-2020/page-2/ urlSource = siteUrl.rsplit('/', 2)[0] endOfUrl = siteUrl.rsplit('/', 2)[1] + '/' else: # for the url http.://www.1test.com/annee-2020/page-2 or /page-2.html urlSource = siteUrl.rsplit('/', 1)[0] endOfUrl = siteUrl.rsplit('/', 1)[1] oParser = cParser() oldNum = oParser.getNumberFromString(endOfUrl) newNum = 0 if oldNum: newNum = self.showNumBoard() if newNum: try: siteUrl = urlSource + '/' + endOfUrl.replace(oldNum, newNum, 1) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, sId, sFunction, sParams) xbmc.executebuiltin('Container.Update(%s)' % sTest) except: return False return False def selectPage2(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sId = oInputParameterHandler.getValue('sId') sFunction = oInputParameterHandler.getValue('OldFunction') siteUrl = oInputParameterHandler.getValue('siteUrl') selpage = self.showNumBoard() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) oOutputParameterHandler.addParameter('Selpage', selpage) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, sId, sFunction, sParams) xbmc.executebuiltin('Container.Update(%s, replace)' % sTest) def setWatched(self): if True: # Use vStream database oInputParameterHandler = cInputParameterHandler() sSite = oInputParameterHandler.getValue('siteUrl') sTitle = oInputParameterHandler.getValue('sTitleWatched') if not sTitle: return meta = {} meta['title'] = sTitle meta['site'] = sSite db = cDb() row = db.get_watched(meta) if row: db.del_watched(meta) db.del_resume(meta) else: db.insert_watched(meta) # To test # updateDirectory() else: # Use kodi buildin feature xbmc.executebuiltin('Action(ToggleWatched)') # Not usefull ? # updateDirectory() def showKeyBoard(self, sDefaultText='', heading=''): keyboard = xbmc.Keyboard(sDefaultText) keyboard.setHeading(heading) keyboard.doModal() if (keyboard.isConfirmed()): sSearchText = keyboard.getText() if (len(sSearchText)) > 0: return sSearchText return False def showNumBoard(self, sDefaultNum=''): dialogs = dialog() numboard = dialogs.numeric(0, self.ADDON.VSlang(30019), sDefaultNum) # numboard.doModal() if numboard is not None: return numboard return False def openSettings(self): return False def showNofication(self, sTitle, iSeconds=0): return False def showError(self, sTitle, sDescription, iSeconds=0): return False def showInfo(self, sTitle, sDescription, iSeconds=0): return False
def showSeriesSaison(): oGui = cGui() grab = cTMDb() addons = addon() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sFanart = oInputParameterHandler.getValue('sFanart') sTmdbId = oInputParameterHandler.getValue('sTmdbId') sId = oInputParameterHandler.getValue('sId') if sId == False: sId = sUrl.split('/')[-1] if sFanart == False: sFanart = '' # recherche la serie complete oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sMovieTitle) # oOutputParameterHandler.addParameter('type', 'serie') # oOutputParameterHandler.addParameter('searchtext', sMovieTitle) if not isMatrix(): oOutputParameterHandler.addParameter('searchtext', cUtil().CleanName(sMovieTitle)) else: oOutputParameterHandler.addParameter('searchtext', sMovieTitle) oGuiElement = cGuiElement() oGuiElement.setSiteName('globalSearch') oGuiElement.setFunction('searchMovie') oGuiElement.setTitle(addons.VSlang(30414)) oGuiElement.setCat(2) oGuiElement.setIcon("searchtmdb.png") oGui.addFolder(oGuiElement, oOutputParameterHandler) result = grab.getUrl(sUrl) total = len(result) if (total > 0): total = len(result['seasons']) progress_ = progress().VScreate(SITE_NAME) oOutputParameterHandler = cOutputParameterHandler() for i in result['seasons']: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break sNbreEp, SSeasonNum = i['episode_count'], i['season_number'] # Mise en forme des infos (au format meta imdb) i = grab._format(i, '') sTitle, sGenre, sThumb, sFanart, sDesc, sYear = i['title'], i[ 'genre'], i['cover_url'], i['backdrop_url'], i['plot'], i[ 'year'] sTitle = 'Saison ' + str(SSeasonNum) + ' (' + str(sNbreEp) + ')' sUrl = 'tv/' + str(sId) + '/season/' + str(SSeasonNum) oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sId', sId) oOutputParameterHandler.addParameter('sSeason', SSeasonNum) oOutputParameterHandler.addParameter('sFanart', sFanart) oOutputParameterHandler.addParameter('sTmdbId', sTmdbId) cGui.CONTENT = "tvshows" oGuiElement = cGuiElement() oGuiElement.setTmdbId(sTmdbId) oGuiElement.setSiteName(SITE_IDENTIFIER) oGuiElement.setFunction('showSeriesEpisode') oGuiElement.setTitle(sTitle) oGuiElement.setFileName(sMovieTitle) oGuiElement.setIcon('series.png') oGuiElement.setMeta(2) oGuiElement.setThumbnail(sThumb) oGuiElement.setPoster(sThumb) oGuiElement.setFanart(sFanart) oGuiElement.setCat(7) oGuiElement.setDescription(sDesc) oGuiElement.setYear(sYear) oGuiElement.setGenre(sGenre) oGui.addFolder(oGuiElement, oOutputParameterHandler) progress_.VSclose(progress_) # changement mode view = addons.getSetting('visuel-view') oGui.setEndOfDirectory(view)
URL_MAIN = 'http://mafreebox.freebox.fr/freeboxtv/playlist.m3u' URL_WEB = 'https://raw.githubusercontent.com/Kodi-vStream/venom-xbmc-addons/Beta/repo/resources/webtv2.m3u' URL_RADIO = 'https://raw.githubusercontent.com/Kodi-vStream/venom-xbmc-addons/master/repo/resources/radio.m3u' MOVIE_IPTVSITE = (True, 'showIptvSite') UA = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/48.0.2564.116 Chrome/48.0.2564.116 Safari/537.36' headers = {'User-Agent': UA, 'Accept': '*/*', 'Connection': 'keep-alive'} icon = 'tv.png' # /home/lordvenom/.kodi/ # sRootArt = cConfig().getRootArt() sRootArt = 'special://home/addons/plugin.video.vstream/resources/art/tv' ADDON = addon() class track: def __init__(self, length, title, path, icon, data=''): self.length = length self.title = title self.path = path self.icon = icon self.data = data def load(): oGui = cGui() addons = addon()
ANIM_ANNEES = (True, 'ShowYearsAnimes') ANIM_GENRES = (True, 'ShowGenreAnimes') ANIM_ALPHA = (True, 'ShowAlphaAnimes') ANIM_VOSTFRS = (URL_MAIN + 'series-0-1/anime/0---', 'showSeries') DRAMA_DRAMAS = (True, 'showMenuDramas') DRAMA_ANNEES = (True, 'ShowYearsDramas') DRAMA_GENRES = (True, 'ShowGenreDramas') DRAMA_ALPHA = (True, 'ShowAlphaDramas') DRAMA_VOSTFRS = (URL_MAIN + 'series-0-1/drama/0---', 'showSeries') TOKUSATSU_TOKUSATSUS = (True, 'showMenuTokusatsu') TOKUSATSU = (URL_MAIN + 'series-0-1/tokusatsu/0---', 'showSeries') TOKUSATSU_ALPHA = ('true', 'ShowAlphaTokusatsu') adulteContent = addon().getSetting('contenu_adulte') def load(): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_DRAMAS[0]) oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche', 'search.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', DRAMA_DRAMAS[0]) oGui.addDir(SITE_IDENTIFIER, DRAMA_DRAMAS[1], 'Dramas', 'dramas.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', ANIM_ANIMS[0])
def showActors(sSearch=''): oGui = cGui() grab = cTMDb() addons = addon() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') iPage = 1 if (oInputParameterHandler.exist('page')): iPage = oInputParameterHandler.getValue('page') if (oInputParameterHandler.exist('sSearch')): sSearch = oInputParameterHandler.getValue('sSearch') if sSearch: # format obligatoire evite de modif le format de l'url dans la lib >> _call # a cause d'un ? pas ou il faut pour ça >> invalid api key result = grab.getUrl(sUrl, iPage, 'query=' + sSearch) else: result = grab.getUrl(sUrl, iPage) total = len(result) if (total > 0): total = len(result['results']) progress_ = progress().VScreate(SITE_NAME) oOutputParameterHandler = cOutputParameterHandler() # récup le nombre de page pour NextPage nbrpage = result['total_pages'] for i in result['results']: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break sName, sThumb = i['name'], i['profile_path'] if sThumb: POSTER_URL = grab.poster sThumb = POSTER_URL + sThumb else: sThumb = '' oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sThumb', sThumb) if not isMatrix(): sName = sName.encode('utf-8') oOutputParameterHandler.addParameter( 'siteUrl', 'person/' + str(i['id']) + '/movie_credits') sTitle = str(sName) oGuiElement = cGuiElement() oGuiElement.setSiteName(SITE_IDENTIFIER) oGuiElement.setFunction('showFilmActor') oGuiElement.setTitle(sTitle) oGuiElement.setFileName(sName) oGuiElement.setIcon('actors.png') oGuiElement.setMeta(0) oGuiElement.setThumbnail(sThumb) oGuiElement.setPoster(sThumb) oGuiElement.setCat(7) oGui.addFolder(oGuiElement, oOutputParameterHandler) progress_.VSclose(progress_) if (int(iPage) < int(nbrpage)): iNextPage = int(iPage) + 1 oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('page', iNextPage) # ajoute param sSearch pour garder le bon format d'url avec grab url if sSearch: oOutputParameterHandler.addParameter('sSearch', sSearch) oGui.addNext(SITE_IDENTIFIER, 'showActors', 'Page ' + str(iNextPage), oOutputParameterHandler) view = addons.getSetting('visuel-view') oGui.setEndOfDirectory(view)
class cHosterGui: SITE_NAME = 'cHosterGui' ADDON = addon() # step 1 - bGetRedirectUrl in ein extra optionsObject verpacken def showHoster(self, oGui, oHoster, sMediaUrl, sThumbnail, bGetRedirectUrl=False): oInputParameterHandler = cInputParameterHandler() # Gestion NextUp siteUrl = oInputParameterHandler.getValue('siteUrl') site = oInputParameterHandler.getValue('site') saisonUrl = oInputParameterHandler.getValue('saisonUrl') nextSaisonFunc = oInputParameterHandler.getValue('nextSaisonFunc') sLang = oInputParameterHandler.getValue('sLang') sRes = oInputParameterHandler.getValue('sRes') oGuiElement = cGuiElement() oGuiElement.setSiteName(self.SITE_NAME) oGuiElement.setFunction('play') oGuiElement.setTitle(oHoster.getDisplayName()) # oGuiElement.setThumbnail(sThumbnail) # if (oInputParameterHandler.exist('sMeta')): # sMeta = oInputParameterHandler.getValue('sMeta') # oGuiElement.setMeta(int(sMeta)) oGuiElement.setFileName(oHoster.getFileName()) oGuiElement.getInfoLabel() if sThumbnail: oGuiElement.setThumbnail(sThumbnail) oGuiElement.setIcon('host.png') oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sMediaUrl', sMediaUrl) oOutputParameterHandler.addParameter('sHosterIdentifier', oHoster.getPluginIdentifier()) oOutputParameterHandler.addParameter('bGetRedirectUrl', bGetRedirectUrl) oOutputParameterHandler.addParameter('sFileName', oHoster.getFileName()) oOutputParameterHandler.addParameter('sTitleWatched', oGuiElement.getTitleWatched()) oOutputParameterHandler.addParameter('sTitle', oHoster.getDisplayName()) oOutputParameterHandler.addParameter('sLang', sLang) oOutputParameterHandler.addParameter('sRes', sRes) oOutputParameterHandler.addParameter('sId', 'cHosterGui') oOutputParameterHandler.addParameter('siteUrl', siteUrl) # gestion NextUp oOutputParameterHandler.addParameter('sourceName', site) # source d'origine oOutputParameterHandler.addParameter('nextSaisonFunc', nextSaisonFunc) oOutputParameterHandler.addParameter('saisonUrl', saisonUrl) # nouveaux pour la lecture. if oInputParameterHandler.exist('sCat'): sCat = oInputParameterHandler.getValue('sCat') oGuiElement.setCat(sCat) oOutputParameterHandler.addParameter('sCat', sCat) else: oGuiElement.setCat('4') # context playlist menu oContext = cContextElement() oContext.setFile('cHosterGui') oContext.setSiteName(self.SITE_NAME) oContext.setFunction('addToPlaylist') oContext.setTitle(self.ADDON.VSlang(30201)) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) # Download menu if oHoster.isDownloadable(): oContext = cContextElement() oContext.setFile('cDownload') oContext.setSiteName('cDownload') oContext.setFunction('AddtoDownloadList') oContext.setTitle(self.ADDON.VSlang(30202)) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) if oHoster.isDownloadable(): # Beta context download and view menu oContext = cContextElement() oContext.setFile('cDownload') oContext.setSiteName('cDownload') oContext.setFunction('AddtoDownloadListandview') oContext.setTitle(self.ADDON.VSlang(30326)) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) # Upload menu uptobox if cInputParameterHandler().getValue( 'site') != 'siteuptobox' and self.ADDON.getSetting( 'hoster_uptobox_premium') == 'true': host = oHoster.getPluginIdentifier() accept = [ 'uptobox', 'uptostream', 'onefichier', 'uploaded', 'uplea' ] for i in accept: if host == i: oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'siteuptobox', 'siteuptobox', 'UptomyAccount', self.ADDON.VSlang(30325)) # onefichier if cInputParameterHandler().getValue( 'site') != 'siteonefichier' and self.ADDON.getSetting( 'hoster_onefichier_premium') == 'true': host = oHoster.getPluginIdentifier() accept = 'onefichier' # les autres ne fonctionnent pas if host == accept: oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'siteonefichier', 'siteonefichier', 'UptomyAccount', '1fichier') # context FAV menu oGui.createContexMenuBookmark(oGuiElement, oOutputParameterHandler) # context Library menu oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cLibrary', 'cLibrary', 'setLibrary', self.ADDON.VSlang(30324)) oGui.addHost(oGuiElement, oOutputParameterHandler) def checkHoster(self, sHosterUrl, debrid=True): # securite if not sHosterUrl: return False # Petit nettoyage sHosterUrl = sHosterUrl.split('|')[0] sHosterUrl = sHosterUrl.lower() # Recuperation du host try: sHostName = sHosterUrl.split('/')[2] except: sHostName = sHosterUrl if debrid: # L'user a active l'url resolver ? if self.ADDON.getSetting('UserUrlResolver') == 'true': import urlresolver hmf = urlresolver.HostedMediaFile(url=sHosterUrl) if hmf.valid_url(): tmp = self.getHoster('resolver') RH = sHosterUrl.split('/')[2] RH = RH.replace('www.', '') tmp.setRealHost(RH.split('.')[0].upper()) return tmp # L'user a activé alldebrid ? if self.ADDON.getSetting('hoster_alldebrid_premium') == 'true': return self.getHoster('alldebrid') # L'user a activé debrid_link ? if self.ADDON.getSetting('hoster_debridlink_premium') == 'true': if "debrid.link" not in sHosterUrl: return self.getHoster('debrid_link') else: return self.getHoster("lien_direct") # Gestion classique if ('streamz' in sHostName): return self.getHoster('streamz') if ('streamax' in sHostName): return self.getHoster('streamax') if ('gounlimited' in sHostName): return self.getHoster('gounlimited') if ('xdrive' in sHostName): return self.getHoster('xdrive') if ('facebook' in sHostName): return self.getHoster('facebook') if ('mixdrop' in sHostName): return self.getHoster('mixdrop') if ('mixloads' in sHostName): return self.getHoster('mixloads') if ('vidoza' in sHostName): return self.getHoster('vidoza') if ('youtube' in sHostName) or ('youtu.be' in sHostName): return self.getHoster('youtube') if ('rutube' in sHostName): return self.getHoster('rutube') if ('vk.com' in sHostName): return self.getHoster('vk') if ('vkontakte' in sHostName): return self.getHoster('vk') if ('vkcom' in sHostName): return self.getHoster('vk') if ('megawatch' in sHostName): return self.getHoster('megawatch') if ('playvidto' in sHostName): return self.getHoster('vidto') # vidtodo et clone if ('vidtodo' in sHostName) or ('vixtodo' in sHostName): return self.getHoster('vidtodo') if ('viddoto' in sHostName): return self.getHoster('vidtodo') if ('vidstodo' in sHostName): return self.getHoster('vidtodo') if ('vidzi' in sHostName): return self.getHoster('vidzi') if ('vcstream' in sHostName): return self.getHoster('vidcloud') if ('filetrip' in sHostName): return self.getHoster('filetrip') if ('uptostream' in sHostName): return self.getHoster('uptostream') if ('dailymotion' in sHostName) or ('dai.ly' in sHostName): try: if 'stream' in sHosterUrl: return self.getHoster('lien_direct') except: pass else: return self.getHoster('dailymotion') if ('livestream' in sHostName): return self.getHoster('lien_direct') if ('flashx' in sHostName): return self.getHoster('flashx') if ('filez' in sHostName): return self.getHoster('flashx') if ('mystream' in sHostName) or ('mstream' in sHostName): return self.getHoster('mystream') if ('streamingentiercom/videophp?type=speed' in sHosterUrl): return self.getHoster('speedvideo') if ('speedvideo' in sHostName): return self.getHoster('speedvideo') if ('speedvid' in sHostName): return self.getHoster('speedvid') #if ('netu' in sHostName) or ('hqq' in sHostName) or ('waaw' in sHostName) or ('vizplay' in sHostName): # return self.getHoster('netu') if ('upstream' in sHostName): return self.getHoster('upstream') if ('mail.ru' in sHostName): return self.getHoster('mailru') if ('onevideo' in sHostName): return self.getHoster('onevideo') if ('googlevideo' in sHostName): return self.getHoster('googlevideo') if ('picasaweb' in sHostName): return self.getHoster('googlevideo') if ('googleusercontent' in sHostName): return self.getHoster('googlevideo') if ('playreplay' in sHostName): return self.getHoster('playreplay') if ('ok.ru' in sHostName) or ('odnoklassniki' in sHostName): return self.getHoster('ok_ru') if ('vimeo' in sHostName): return self.getHoster('vimeo') if ('prostream' in sHostName): return self.getHoster('prostream') if ('vidfast' in sHostName): return self.getHoster('vidfast') if ('thevideo' in sHostName) or ('video.tt' in sHostName) or ('vev.io' in sHostName): return self.getHoster('thevideo_me') if ('uqload' in sHostName): return self.getHoster('uqload') if ('letwatch' in sHostName): return self.getHoster('letwatch') if ('letsupload' in sHostName): return self.getHoster('letsupload') if ('filepup' in sHostName): return self.getHoster('filepup') if ('vimple.ru' in sHostName): return self.getHoster('vimple') if ('wstream' in sHostName): return self.getHoster('wstream') if ('watchvideo' in sHostName): return self.getHoster('watchvideo') if ('drive.google.com' in sHostName): return self.getHoster('googledrive') if ('docs.google.com' in sHostName): return self.getHoster('googledrive') if ('vidwatch' in sHostName): return self.getHoster('vidwatch') if ('up2stream' in sHostName): return self.getHoster('up2stream') if ('vidbm' in sHostName): return self.getHoster('vidbm') if ('tune' in sHostName): return self.getHoster('tune') if ('vidup' in sHostName): return self.getHoster('vidup') if ('vidbull' in sHostName): return self.getHoster('vidbull') # vidlox et clone if ('vidlox' in sHostName): return self.getHoster('vidlox') if ('videobin' in sHostName): return self.getHoster('videobin') if ('stagevu' in sHostName): return self.getHoster('stagevu') if ('movshare' in sHostName) or ('wholecloud' in sHostName): return self.getHoster('wholecloud') if ('gorillavid' in sHostName): return self.getHoster('gorillavid') if ('daclips' in sHostName): return self.getHoster('daclips') if ('estream' in sHostName) and not ('widestream' in sHostName): return self.getHoster('estream') if ('hdvid' in sHostName): return self.getHoster('hdvid') if ('vshare' in sHostName): return self.getHoster('vshare') if ('giga' in sHostName): return self.getHoster('giga') if ('vidbom' in sHostName): return self.getHoster('vidbom') if ('upvid' in sHostName): return self.getHoster('upvid') if ('cloudvid' in sHostName): return self.getHoster('cloudvid') if ('clipwatching' in sHostName) or ('highstream' in sHostName): return self.getHoster('clipwatching') if ('megadrive' in sHostName): return self.getHoster('megadrive') if ('downace' in sHostName): return self.getHoster('downace') if ('clickopen' in sHostName): return self.getHoster('clickopen') if ('iframe-secured' in sHostName): return self.getHoster('iframe_secured') if ('iframe-secure' in sHostName): return self.getHoster('iframe_secure') if ('goo.gl' in sHostName) or ('bit.ly' in sHostName) or ( 'streamcrypt' in sHostName) or ('opsktp' in sHosterUrl): return self.getHoster('allow_redirects') if ('jawcloud' in sHostName): return self.getHoster('jawcloud') if ('kvid' in sHostName): return self.getHoster('kvid') if ('soundcloud' in sHostName): return self.getHoster('soundcloud') if ('mixcloud' in sHostName): return self.getHoster('mixcloud') if ('ddlfr' in sHostName): return self.getHoster('ddlfr') if ('pdj' in sHostName): return self.getHoster('pdj') if ('vidzstore' in sHostName): return self.getHoster('vidzstore') if ('hd-stream' in sHostName): return self.getHoster('hd_stream') if ('rapidstream' in sHostName): return self.getHoster('rapidstream') if ('archive' in sHostName): return self.getHoster('archive') if ('jetload' in sHostName): return self.getHoster('jetload') if ('dustreaming' in sHostName): return self.getHoster('dustreaming') # frenchvid et clone if ('french-vid' in sHostName) or ('yggseries' in sHostName): return self.getHoster('frenchvid') if ('fembed' in sHostName) or ('fem.tohds' in sHostName): return self.getHoster('frenchvid') if ('feurl' in sHostName) or ('fsimg' in sHostName): return self.getHoster('frenchvid') if ('core1player' in sHostName) or ('vfsplayer' in sHostName): return self.getHoster('frenchvid') if ('gotochus' in sHostName): return self.getHoster('frenchvid') if ('viki' in sHostName): return self.getHoster('viki') if ('flix555' in sHostName): return self.getHoster('flix555') if ('onlystream' in sHostName): return self.getHoster('onlystream') if ('pstream' in sHostName): return self.getHoster('pstream') if ('vudeo' in sHostName): return self.getHoster('vudeo') if ('sendvid' in sHostName): return self.getHoster('sendvid') if ('supervideo' in sHostName): return self.getHoster('supervideo') if ('dood' in sHostName): return self.getHoster('dood') if ('vidia' in sHostName): return self.getHoster('vidia') if ('streamtape' in sHostName): return self.getHoster('streamtape') if ('femax' in sHostName): return self.getHoster('femax') if ('vidbem' in sHostName): return self.getHoster('vidbem') if ('sibnet' in sHostName): return self.getHoster('sibnet') if ('vidplayer' in sHostName): return self.getHoster('vidplayer') if ('userload' in sHostName): return self.getHoster('userload') if ('aparat' in sHostName): return self.getHoster('aparat') if ('evoload' in sHostName): return self.getHoster('evoload') if ('vidshar' in sHostName): return self.getHoster('vidshar') if ('abcvideo' in sHostName): return self.getHoster('abcvideo') if ('plynow' in sHostName): return self.getHoster('plynow') if ('myvi.tv' in sHostName): return self.getHoster('myvitv') if ('playtube' in sHostName): return self.getHoster('playtube') if ('dwfull' in sHostName): return self.getHoster('dwfull') if ('directmoviedl' in sHostName) or ('moviesroot' in sHostName): return self.getHoster('directmoviedl') # Lien telechargeable a convertir en stream if ('1fichier' in sHostName): return self.getHoster('onefichier') if ('uptobox' in sHostName): return self.getHoster('uptobox') if ('uplea' in sHostName): return self.getHoster('uplea') if ('uploaded' in sHostName) or ('ul.to' in sHostName): if ('/file/forbidden' in sHosterUrl): return False return self.getHoster('uploaded') if ('vidload' in sHostName): return self.getHoster('vidload') if ('kaydo' in sHostName): return self.getHoster('lien_direct') if ('cloudhost' in sHostName): return self.getHoster('cloudhost') if ('rapidgator' in sHostName): return False if ('turbobit' in sHostName): return False if ('mega.nz' in sHostName) or ('mega.co.nz' in sHostName): return False if ('hitfile' in sHostName): return False if ('myfiles.alldebrid.com' in sHostName): return self.getHoster('lien_direct') if ('dl.free.fr' in sHostName): return False if ('easyload' in sHostName): return self.getHoster('easyload') if ('ninjastream' in sHostName): return self.getHoster('ninjastream') # Si aucun hebergeur connu on teste les liens directs if (sHosterUrl[-4:] in '.mp4.avi.flv.m3u8.webm.mkv'): return self.getHoster('lien_direct') # Cas special si parametre apres le lien_direct if (sHosterUrl.split('?')[0][-4:] in '.mp4.avi.flv.m3u8.webm.mkv'): return self.getHoster('lien_direct') return False def getHoster(self, sHosterFileName): exec( "from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.hosters." + sHosterFileName + " import cHoster", globals()) return cHoster() def play(self): oGui = cGui() oDialog = dialog() oInputParameterHandler = cInputParameterHandler() sHosterIdentifier = oInputParameterHandler.getValue( 'sHosterIdentifier') sMediaUrl = oInputParameterHandler.getValue('sMediaUrl') bGetRedirectUrl = oInputParameterHandler.getValue('bGetRedirectUrl') sFileName = oInputParameterHandler.getValue('sFileName') sTitle = oInputParameterHandler.getValue('sTitle') siteUrl = oInputParameterHandler.getValue('siteUrl') sCat = oInputParameterHandler.getValue('sCat') if not sTitle: sTitle = sFileName if bGetRedirectUrl == 'True': sMediaUrl = self.__getRedirectUrl(sMediaUrl) try: mediaDisplay = sMediaUrl.split('/') VSlog('Hoster - play : %s/ ... /%s' % ('/'.join(mediaDisplay[0:3]), mediaDisplay[-1])) except: VSlog('Hoster - play : ' + sMediaUrl) oHoster = self.getHoster(sHosterIdentifier) oHoster.setFileName(sFileName) sHosterName = oHoster.getDisplayName() oDialog.VSinfo(sHosterName, 'Resolve') try: oHoster.setUrl(sMediaUrl) aLink = oHoster.getMediaLink() if aLink[0] or aLink[ 1]: # Le hoster ne sait pas résoudre mais a retourné une autre url if not aLink[ 0]: # Voir exemple avec allDebrid qui : return False, URL oHoster = self.checkHoster(aLink[1], debrid=False) if oHoster: oHoster.setFileName(sFileName) sHosterName = oHoster.getDisplayName() oDialog.VSinfo(sHosterName, 'Resolve') oHoster.setUrl(sMediaUrl) aLink = oHoster.getMediaLink() if aLink[0]: oGuiElement = cGuiElement() oGuiElement.setSiteName(self.SITE_NAME) oGuiElement.setSiteUrl(siteUrl) oGuiElement.setMediaUrl(aLink[1]) oGuiElement.setTitle(sTitle) oGuiElement.setCat(sCat) oGuiElement.getInfoLabel() from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.lib.player import cPlayer oPlayer = cPlayer() # sous titres ? if len(aLink) > 2: oPlayer.AddSubtitles(aLink[2]) return oPlayer.run(oGuiElement, oHoster.getFileName(), aLink[1]) oDialog.VSerror(self.ADDON.VSlang(30020)) return except Exception as e: oDialog.VSerror(self.ADDON.VSlang(30020)) import traceback traceback.print_exc() return oGui.setEndOfDirectory() def addToPlaylist(self): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sHosterIdentifier = oInputParameterHandler.getValue( 'sHosterIdentifier') sMediaUrl = oInputParameterHandler.getValue('sMediaUrl') bGetRedirectUrl = oInputParameterHandler.getValue('bGetRedirectUrl') sFileName = oInputParameterHandler.getValue('sFileName') if bGetRedirectUrl == 'True': sMediaUrl = self.__getRedirectUrl(sMediaUrl) VSlog('Hoster - playlist ' + sMediaUrl) oHoster = self.getHoster(sHosterIdentifier) oHoster.setFileName(sFileName) oHoster.setUrl(sMediaUrl) aLink = oHoster.getMediaLink() if aLink[0]: oGuiElement = cGuiElement() oGuiElement.setSiteName(self.SITE_NAME) oGuiElement.setMediaUrl(aLink[1]) oGuiElement.setTitle(oHoster.getFileName()) from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.lib.player import cPlayer oPlayer = cPlayer() oPlayer.addItemToPlaylist(oGuiElement) dialog().VSinfo(str(oHoster.getFileName()), 'Playlist') return oGui.setEndOfDirectory() def __getRedirectUrl(self, sUrl): oRequest = cRequestHandler(sUrl) oRequest.request() return oRequest.getRealUrl()
def __callRequest(self, jsonDecode=False): if self.__enableDNS: import socket self.save_getaddrinfo = socket.getaddrinfo socket.getaddrinfo = self.new_getaddrinfo if self.__aParamatersLine: sParameters = self.__aParamatersLine else: sParameters = self.__aParamaters if (self.__cType == cRequestHandler.REQUEST_TYPE_GET): if (len(sParameters) > 0): if (self.__sUrl.find('?') == -1): self.__sUrl = self.__sUrl + '?' + str(sParameters) sParameters = '' else: self.__sUrl = self.__sUrl + '&' + str(sParameters) sParameters = '' sContent = '' if self.BUG_SSL == True: self.verify = False if self.__cType == cRequestHandler.REQUEST_TYPE_GET: method = "GET" else: method = "POST" oResponse = None try: _request = Request(method, self.__sUrl, headers=self.__aHeaderEntries) if method in ['POST']: _request.data = sParameters if self.__Cookie: _request.cookies = self.__Cookie if self.json: _request.json = self.json prepped = _request.prepare() self.s.headers.update(self.__aHeaderEntries) oResponse = self.s.send(prepped, timeout=self.__timeout, allow_redirects=self.redirects, verify=self.verify) self.__sResponseHeader = oResponse.headers self.__sRealUrl = oResponse.url if jsonDecode == False: sContent = oResponse.content #Necessaire pour Python 3 if isMatrix() and not 'youtube' in oResponse.url: try: sContent = sContent.decode('unicode-escape') except: try: sContent = sContent.decode() except: pass else: sContent = oResponse.json() except ConnectionError as e: # Retry with DNS only if addon is present from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.lib import xbmcvfs if xbmcvfs.exists('special://home/addons/script.module.dnspython/' ) and self.__enableDNS == False: self.__enableDNS = True return self.__callRequest() else: error_msg = addon().VSlang(30470) except RequestException as e: if 'CERTIFICATE_VERIFY_FAILED' in str(e) and self.BUG_SSL == False: self.BUG_SSL = True return self.__callRequest() elif 'getaddrinfo failed' in str(e) and self.__enableDNS == False: # Retry with DNS only if addon is present from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.lib import xbmcvfs if xbmcvfs.exists( 'special://home/addons/script.module.dnspython/'): self.__enableDNS = True return self.__callRequest() else: error_msg = addon().VSlang(30470) else: error_msg = "%s (%s),%s" % (addon().VSlang(30205), e, self.__sUrl) dialog().VSerror(error_msg) sContent = '' if oResponse.status_code in [503, 403]: if not "Forbidden" in sContent: #Default CLOUDPROXY_ENDPOINT = 'http://localhost:8191/v1' try: json_session = post(CLOUDPROXY_ENDPOINT, headers=self.__aHeaderEntries, data=dumps({'cmd': 'sessions.list'})) except: dialog().VSerror("%s" % ( "Page protege par Cloudflare, veuillez executer FlareSolverr." )) #On regarde si une session existe deja. if json_session.json()['sessions']: cloudproxy_session = json_session.json()['sessions'][0] else: json_session = post(CLOUDPROXY_ENDPOINT, headers=self.__aHeaderEntries, data=dumps({'cmd': 'sessions.create'})) response_session = loads(json_session.text) cloudproxy_session = response_session['session'] self.__aHeaderEntries[ 'Content-Type'] = 'application/x-www-form-urlencoded' if ( method == 'post') else 'application/json' #Ont fait une requete. json_response = post(CLOUDPROXY_ENDPOINT, headers=self.__aHeaderEntries, data=dumps({ 'cmd': 'request.%s' % method.lower(), 'url': self.__sUrl, 'session': cloudproxy_session, 'postData': '%s' % urlEncode(sParameters) if (method.lower() == 'post') else '' })) http_code = json_response.status_code response = loads(json_response.text) if 'solution' in response: if self.__sUrl != response['solution']['url']: self.__sRealUrl = response['solution']['url'] sContent = response['solution']['response'] if oResponse and not sContent: #Ignorer ces deux codes erreurs. ignoreStatus = [200, 302] if oResponse.status_code not in ignoreStatus: dialog().VSerror("%s (%d),%s" % (addon().VSlang(30205), oResponse.status_code, self.__sUrl)) if sContent: if (self.__bRemoveNewLines == True): sContent = sContent.replace("\n", "") sContent = sContent.replace("\r\t", "") if (self.__bRemoveBreakLines == True): sContent = sContent.replace(" ", "") if self.__enableDNS: socket.getaddrinfo = self.save_getaddrinfo self.__enableDNS = False return sContent