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: 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 GetHtml(self, url, data=None): self.hostComplet = re.sub('(https*:\/\/[^/]+)(\/*.*)', '\\1', url) self.host = re.sub('https*:\/\/', '', self.hostComplet) self.url = url # on cherche des precedents cookies cookies = GestionCookie().Readcookie(self.host.replace('.', '_')) htmlcontent = self.htmlrequest(url, cookies, data) if not self.CheckIfActive(htmlcontent): return htmlcontent elif "recaptcha3key" in htmlcontent: dialog().VSok('Recaptcha active, reessayer plus tard') return htmlcontent # on cherche le nouveau cookie try: cookies = self.DecryptCookie(htmlcontent) except: VSlog('Erreur decodage Stormwall') return '' VSlog('Protection Stormwall active') GestionCookie().SaveCookie(self.host.replace('.', '_'), cookies) htmlcontent = self.htmlrequest(url, cookies, data) return htmlcontent
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 _cache_save_season(self, meta, season): for s in meta['season']: if s['season_number'] != None and ( '%02d' % int(s['season_number'])) == season: meta['s_poster_path'] = s['poster_path'] meta['s_overview'] = s['overview'] meta['s_premiered'] = s['air_date'] meta['s_year'] = s['air_date'] try: if 's_premiered' in meta and meta['s_premiered']: meta['s_year'] = int(meta['s_premiered'][:4]) except: pass try: sql = 'INSERT or IGNORE INTO season (imdb_id, tmdb_id, season, year, premiered, poster_path, playcount, overview) VALUES ' \ '(?, ?, ?, ?, ?, ?, ?, ?)' self.dbcur.execute( sql, (meta['imdb_id'], s['id'], s['season_number'], s['air_date'], s['air_date'], s['poster_path'], 6, s['overview'])) self.db.commit() # VSlog('SQL INSERT Successfully') except Exception as e: if 'no such column' in str(e) or 'no column named' in str(e): self.__createdb('season') VSlog('Table recreated') self.dbcur.execute(sql_select) matchedrow = self.dbcur.fetchone() else: VSlog('SQL ERROR INSERT into table season') pass
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 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 new_getaddrinfo(self, *args): try: import sys import dns.resolver path = VSPath('special://home/addons/script.module.dnspython/lib/').decode('utf-8') if path not in sys.path: sys.path.append(path) host = args[0] port = args[1] # Keep the domain only: http://example.com/foo/bar => example.com if "//" in host: host = host[host.find("//"):] if "/" in host: host = host[:host.find("/")] resolver = dns.resolver.Resolver(configure=False) # Résolveurs DNS ouverts: https://www.fdn.fr/actions/dns/ resolver.nameservers = ['80.67.169.12', '2001:910:800::12', '80.67.169.40', '2001:910:800::40'] answer = resolver.query(host, 'a') host_found = str(answer[0]) VSlog("new_getaddrinfo found host %s" % host_found) # Keep same return schema as socket.getaddrinfo (family, type, proto, canonname, sockaddr) return [(2, 1, 0, '', (host_found, port)), (2, 1, 0, '', (host_found, port))] except Exception as e: VSlog("new_getaddrinfo ERROR: {0}".format(e)) return self.save_getaddrinfo(*args)
def _cache_save_episode(self, meta, season, episode): try: sql = 'INSERT or IGNORE INTO episode (tmdb_id, season, episode, year, title, premiered, poster_path, plot, rating, votes, director, writer, guest_stars, tagline) VALUES ' \ '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' self.dbcur.execute( sql, (meta['tmdb_id'], season, episode, meta['year'], meta['title'], meta['premiered'], meta['poster_path'], meta['plot'], meta['rating'], meta['votes'], meta['director'], meta['writer'], ''.join( meta.get('guest_stars', "")), meta["tagline"])) self.db.commit() except Exception as e: VSlog(str(e)) if 'no such column' in str(e) or 'no column named' in str(e): self.__createdb('episode') VSlog('Table recreated') # Deuxieme tentative self.dbcur.execute( sql, (meta['tmdb_id'], season, episode, meta['year'], meta['title'], meta['premiered'], meta['poster_path'], meta['plot'], meta['rating'], meta['votes'], meta['director'], meta['writer'], ''.join( meta.get('guest_stars', "")), meta.get("tagline", ""))) self.db.commit() else: VSlog('SQL ERROR INSERT into table episode') pass
def __getMediaLinkForGuest(self): Token_Alldebrid = cPremiumHandler( self.getPluginIdentifier()).getToken() if Token_Alldebrid: sUrl_Bypass = "******" + Token_Alldebrid + "&link=" + self.__sUrl else: return False, False oRequest = cRequestHandler(sUrl_Bypass) sHtmlContent = json.loads(oRequest.request()) if 'error' in sHtmlContent: if sHtmlContent['error']['code'] == 'LINK_HOST_NOT_SUPPORTED': return False, self.__sUrl # si alldebrid ne prend pas en charge ce type de lien, on retourne le lien pour utiliser un autre hoster else: VSlog('Hoster Alldebrid - Error: ' + sHtmlContent["error"]['code']) return False, False api_call = HostURL = sHtmlContent["data"]["link"] try: mediaDisplay = HostURL.split('/') VSlog('Hoster Alldebrid - play : %s/ ... /%s' % ('/'.join(mediaDisplay[0:3]), mediaDisplay[-1])) except: VSlog('Hoster Alldebrid - play : ' + HostURL) if (api_call): # api_call = api_call + '|User-Agent=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0' return True, api_call return False, False
def insert_watched(self, meta): title = meta['title'] if not title: return cat = meta['cat'] if 'cat' in meta else '1' ex = 'INSERT INTO watched (title, cat) VALUES (?, ?)' try: self.dbcur.execute(ex, (title, cat)) self.db.commit() VSlog('SQL INSERT watched Successfully') 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): if 'named cat' in str(e): # ajout nouvelle colonne 'cat' self.dbcur.execute( "ALTER TABLE watched add column cat TEXT") self.db.commit() VSlog('Table recreated : watched') # Deuxieme tentative self.dbcur.execute(ex, (title, cat)) self.db.commit() else: VSlog('SQL ERROR INSERT watched : title = %s' % e)
def _cache_save_season(self, meta, season): if 'air_date' in meta and meta['air_date']: premiered = meta['air_date'] elif 'premiered' in meta and meta['premiered']: premiered = meta['premiered'] else: premiered = 0 s_year = 0 if 'year' in meta and meta['year']: s_year = meta['year'] else: try: if premiered: s_year = int(premiered[:4]) except: pass if 'season_number' in meta: season = meta['season_number'] elif 'season' in meta: season = meta['season'] if 'overview' in meta: plot = meta.get('overview', "") else: plot = "" if meta['poster_path']: fanart = self.poster + meta['poster_path'] else: fanart = "" try: sql = 'INSERT or IGNORE INTO season (tmdb_id, season, year, premiered, poster_path, plot, episode) VALUES '\ '(?, ?, ?, ?, ?, ?, ?)' self.dbcur.execute(sql, (meta['tmdb_id'], season, s_year, premiered, fanart, plot, meta.get('episode_count', 0))) self.db.commit() except Exception as e: VSlog(str(e)) if 'no such column' in str(e) or 'no column named' in str(e): self.__createdb('season') VSlog('Table recreated') # Deuxieme tentative self.dbcur.execute( sql, (meta['tmdb_id'], season, s_year, premiered, fanart, plot, meta.get('episode_count', 0))) self.db.commit() else: VSlog('SQL ERROR INSERT into table season') pass
def __importPlugin(self, sName): try: exec("from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.sites import " + sName, globals()) exec("sSiteName = " + sName + ".SITE_NAME", globals()) exec("sSiteDesc = " + sName + ".SITE_DESC", globals()) sPluginSettingsName = 'plugin_' + sName return sSiteName, sPluginSettingsName, sSiteDesc except Exception as e: VSlog("Cannot import plugin " + str(sName)) VSlog("Detail de l\'erreur " + str(e)) return False, False
def UnlockUrl(url2=None): headers9 = { 'User-Agent': UA, 'Referer': 'https://www.flashx.co/dl?playthis' } url1 = 'https://www.flashx.co/js/code.js' if url2: url1 = url2 if not url1.startswith('http'): url1 = 'https:' + url1 VSlog('Test unlock url :' + url1) oRequest = cRequestHandler(url1) oRequest.addParameters('User-Agent', UA) # oRequest.addParameters('Accept', '*/*') # oRequest.addParameters('Accept-Encoding', 'gzip, deflate, br') # oRequest.addParameters('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3') oRequest.addParameters('Referer', 'https://www.flashx.co/dl?playthis') code = oRequest.request() url = '' if not code: url = oRequest.getRealUrl() VSlog('Redirection :' + url) else: # VSlog(code) aResult = re.search("!= null\){\s*\$.get\('([^']+)', *{(.+?)}", code, re.DOTALL) if aResult: dat = aResult.group(2) dat = dat.replace("'", '') dat = dat.replace(" ", '') dat2 = dict(x.split(':') for x in dat.split(',')) dat3 = aResult.group(1) + '?' for i, j in dat2.items(): dat3 = dat3 + str(i) + '=' + str(j) + '&' url = dat3[:-1] # url = 'https://www.flashx.tv/flashx.php?fxfx=6' if url: VSlog('Good Url :' + url1) VSlog(url) GetHtml(url, headers9) return True VSlog('Bad Url :' + url1) return False
def GetRedirectHtml(self, web_url, sId, NoEmbed=False): headers = { # 'Host': 'www.flashx.tv', 'User-Agent': UA, # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', # 'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'http://embed.flashx.tv/embed.php?c=' + sId, 'Accept-Encoding': 'identity' } MaxRedirection = 3 while MaxRedirection > 0: # generation headers # headers2 = headers # headers2['Host'] = self.GetHost(web_url) VSlog(str(MaxRedirection) + ' Test sur : ' + web_url) request = urllib2.Request(web_url, None, headers) redirection_target = web_url try: # ok ca a enfin marche reponse = urllib2.urlopen(request) sHtmlContent = reponse.read() reponse.close() if not (reponse.geturl() == web_url) and not (reponse.geturl() == ''): redirection_target = reponse.geturl() else: break except UrlError as e: if (e.code == 301) or (e.code == 302): redirection_target = e.headers['Location'] else: # VSlog(str(e.code)) # VSlog(str(e.read())) return False web_url = redirection_target if 'embed' in redirection_target and NoEmbed: # rattage, on a pris la mauvaise url VSlog('2') return False MaxRedirection = MaxRedirection - 1 return sHtmlContent
def _cache_save(self, meta, name, media_type, season, year): # Pas de cache pour les personnes ou les distributeurs if media_type in ('person', 'network'): return # cache des séries et animes if media_type == 'tvshow' or media_type == 'anime': return self._cache_save_tvshow(meta, name, 'tvshow', season, year) # cache des collections if media_type == 'collection': media_type = 'movie' # On utilise la même table que pour les films if not name.endswith('saga'): name += 'saga' # sauvegarde de la durée en minutes, pour le retrouver en minutes comme le fait TMDB runtime = 0 if 'duration' in meta and meta['duration']: runtime = int(meta['duration']) / 60 if not year and 'year' in meta: year = meta['year'] # sauvegarde movie dans la BDD # year n'est pas forcement l'année du film mais l'année utilisée pour la recherche try: sql = 'INSERT or IGNORE INTO %s (imdb_id, tmdb_id, title, year, credits, writer, director, tagline, vote_average, vote_count, runtime, ' \ 'overview, mpaa, premiered, genre, studio, status, poster_path, trailer, backdrop_path, playcount) ' \ 'VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' % media_type self.dbcur.execute( sql, (meta['imdb_id'], meta['tmdb_id'], name, year, meta['credits'], meta['writer'], meta['director'], meta['tagline'], meta['rating'], meta['votes'], str(runtime), meta['plot'], meta['mpaa'], meta['premiered'], meta['genre'], meta['studio'], meta['status'], meta['poster_path'], meta['trailer'], meta['backdrop_path'], 0)) self.db.commit() # VSlog('SQL INSERT Successfully') except Exception as e: if 'no such column' in str(e) or 'no column named' in str(e): self.__createdb(media_type) VSlog('Table recreated') self.dbcur.execute(sql_select) matchedrow = self.dbcur.fetchone() else: VSlog('SQL ERROR INSERT into table ' + media_type) pass
def insert_watched(self, meta): title = meta['title'] if not title: return site = QuotePlus(meta['site']) ex = 'INSERT INTO watched (title, site) VALUES (?, ?)' try: self.dbcur.execute(ex, (title, site)) self.db.commit() VSlog('SQL INSERT watched Successfully') except Exception: VSlog('SQL ERROR INSERT watched : title = %s, site = %s' % (title, site)) pass
def DecryptCookie(self, content): # Le nom peut varie selon les pages. if "const" in content: parseName = "const" else: parseName = "var" self.cE = re.search(parseName + ' cE = "([^"]+)"', str(content)).group(1) self.cK = re.search(parseName + ' cK = ([0-9]+)', str(content)).group(1) self.cN = re.search(parseName + ' cN = "([^"]+)"', str(content)).group(1) self.cO = re.search(parseName + ' cO = "([^"]+)"', str(content)).group(1) self.a = [] self.b = {} for i in range(len(self._0xbd1168)): self.a.append(self._0xbd1168[i]) self.b[self._0xbd1168[i]] = i _0x3b45bc = self.func5(self.cK, self.cE) VSlog('cookie : ' + self.cN + "=" + _0x3b45bc) return self.cN + "=" + _0x3b45bc
def decodex(x): from itertools import chain import base64 x = x.replace('https://www.youtube.com/embed/', '') missing_padding = len(x) % 4 if missing_padding: x += '=' * (4 - missing_padding) VSlog(x) try: e = base64.b64decode(x) t = '' r = "ETEfazefzeaZa13MnZEe" a = 0 px = chain(e) for y in list(px): if isMatrix(): t += chr(int(175 ^ y) - ord(r[a])) else: t += chr(int(175 ^ ord(y[0])) - ord(r[a])) a = 0 if a > len(r) - 2 else a + 1 return t except: return '' return ''
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 del_viewing(self, meta): sTitleWatched = meta['titleWatched'] if 'titleWatched' in meta else None sql_deleteCat = "" if not sTitleWatched: # delete all sql_delete = "DELETE FROM viewing" else: sql_deleteTitle = "DELETE FROM viewing WHERE title_id = '%s'" % sTitleWatched if 'cat' in meta: sql_deleteCat = " and cat = '%s'" % meta['cat'] sql_delete = sql_deleteTitle + sql_deleteCat update = 0 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 # si pas trouvé, on essaie sans la cat, juste le titre if not update and sql_deleteCat: del meta['cat'] return self.del_viewing(meta) return True except Exception as e: VSlog('SQL ERROR %s, error = %s' % (sql_delete, e)) return update
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 _cache_save_tvshow(self, meta, name, media_type, season, year): # ecrit les saisons dans la BDD if 'seasons' in meta: self._cache_save_season(meta, season) del meta['seasons'] if not year and 'year' in meta: year = meta['year'] # sauvegarde de la durée en minutes, pour le retrouver en minutes comme le fait TMDB runtime = 0 if 'duration' in meta and meta['duration']: runtime = int(meta['duration']) / 60 # sauvegarde tvshow dans la BDD try: sql = 'INSERT INTO %s (imdb_id, tmdb_id, title, year, credits, writer, director, vote_average, vote_count, runtime, ' \ 'overview, mpaa, premiered, genre, studio, status, poster_path, trailer, backdrop_path, playcount) ' \ 'VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' % media_type self.dbcur.execute( sql, (meta['imdb_id'], meta['tmdb_id'], name, year, meta['credits'], meta['writer'], meta['director'], meta['rating'], meta['votes'], runtime, meta['plot'], meta['mpaa'], meta['premiered'], meta['genre'], meta['studio'], meta['status'], meta['poster_path'], meta['trailer'], meta['backdrop_path'], 0)) self.db.commit() # VSlog('SQL INSERT Successfully') except Exception as e: VSlog('SQL ERROR INSERT into table ' + media_type) pass
def get_watched(self, meta): title = meta['title'] if not title: return False cat = meta['cat'] if 'cat' in meta else '1' sql_select = "SELECT * FROM watched WHERE title = '%s'" % title try: self.dbcur.execute(sql_select) matchedrow = self.dbcur.fetchall() # Gestion des homonymes films / séries # Si la cat est enregistrée, on vérifie si c'est la même for data in matchedrow: matchedcat = data['cat'] if matchedcat: return int(matchedcat) == int(cat) if matchedrow: return True return False 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): # Deuxieme tentative, sans la cat sql_select = "SELECT * FROM watched WHERE title = '%s'" % title self.dbcur.execute(sql_select) return 1 if self.dbcur.fetchall() else 0 else: VSlog('SQL ERROR %s' % sql_select) 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 _cache_search(self, media_type, name, tmdb_id='', year='', season='', episode=''): if media_type == 'movie': sql_select = 'SELECT * FROM movie' if tmdb_id: sql_select = sql_select + ' WHERE tmdb_id = \'%s\'' % tmdb_id else: sql_select = sql_select + ' WHERE title = \'%s\'' % name if year: sql_select = sql_select + ' AND year = %s' % year elif media_type == 'collection': sql_select = 'SELECT * FROM movie' if tmdb_id: sql_select = sql_select + ' WHERE tmdb_id = \'%s\'' % tmdb_id else: if not name.endswith('saga'): name += 'saga' sql_select = sql_select + ' WHERE title = \'%s\'' % name elif media_type == 'tvshow' or media_type == 'anime': sql_select = 'SELECT * FROM tvshow' if season: sql_select = 'SELECT *, season.poster_path as s_poster_path, season.premiered as s_premiered, ' \ 'season.year as s_year FROM tvshow LEFT JOIN season ON tvshow.imdb_id = season.imdb_id ' if tmdb_id: sql_select = sql_select + ' WHERE tvshow.tmdb_id = \'%s\'' % tmdb_id else: sql_select = sql_select + ' WHERE tvshow.title = \'%s\'' % name if year: sql_select = sql_select + ' AND tvshow.year = %s' % year if season: sql_select = sql_select + ' AND season.season = \'%s\'' % season else: return None try: self.dbcur.execute(sql_select) matchedrow = self.dbcur.fetchone() except Exception as e: VSlog('************* Error selecting from cache db: %s' % e, 4) return None if matchedrow: # VSlog('Found meta information by name in cache table') return dict(matchedrow) else: # VSlog('No match in local DB') return None
def cancel_download(self): sql_select = "UPDATE download SET status = '0' WHERE status = '1'" try: self.dbcur.execute(sql_select) self.db.commit() return False, False except Exception: VSlog('SQL ERROR %s' % sql_select) return False, False
def insert_viewing(self, meta): if not 'title' in meta: return if not 'siteurl' in meta: return title = self.str_conv(meta['title']) titleWatched = self.str_conv(meta['titleWatched']) siteurl = QuotePlus(meta['siteurl']) cat = meta['cat'] saison = meta['season'] if 'season' in meta else '' sTmdbId = meta['sTmdbId'] if 'sTmdbId' in meta else '' ex = "DELETE FROM viewing WHERE title_id = '%s' and cat = '%s'" % ( titleWatched, cat) try: self.dbcur.execute(ex) except Exception: VSlog('SQL ERROR - ' + ex) pass try: ex = 'INSERT INTO viewing (tmdb_id, title_id, title, siteurl, site, fav, cat, season) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' self.dbcur.execute(ex, (sTmdbId, titleWatched, title, siteurl, meta['site'], meta['fav'], cat, saison)) self.db.commit() VSlog('SQL INSERT viewing Successfully') 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('viewing') VSlog('Table recreated : viewing') # Deuxieme tentative self.dbcur.execute( ex, (meta['sTmdbId'], titleWatched, title, siteurl, meta['site'], meta['fav'], meta['cat'], saison, episode)) self.db.commit() else: VSlog('SQL ERROR INSERT : %s' % e) pass
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 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 title = '%s'" % title try: self.dbcur.execute(ex) except Exception: VSlog('SQL ERROR - ' + ex) pass try: ex = 'INSERT INTO resume (title, hoster, point) VALUES (?, ?, ?)' self.dbcur.execute(ex, (title, site, point)) self.db.commit() except Exception: VSlog('SQL ERROR INSERT resume, title = %s' % title) pass
def _cache_save_tvshow(self, meta, name, season, year): # Ecrit les saisons dans le cache for s_meta in meta['season']: s_meta['tmdb_id'] = meta['tmdb_id'] self._cache_save_season(s_meta, season) if not year and 'year' in meta: year = meta['year'] # sauvegarde tvshow dans la BDD try: sql = 'INSERT or IGNORE INTO tvshow (imdb_id, tmdb_id, title, year, cast, crew, writer, director, rating, votes, duration, ' \ 'plot, mpaa, premiered, genre, studio, status, poster_path, trailer, backdrop_path, nbseasons) ' \ 'VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' self.dbcur.execute( sql, (meta['imdb_id'], meta['tmdb_id'], name, year, meta['cast'], meta['crew'], meta['writer'], meta['director'], meta['rating'], meta['votes'], meta['duration'], meta['plot'], meta['mpaa'], meta['premiered'], meta['genre'], meta['studio'], meta['status'], meta['poster_path'], meta['trailer'], meta['backdrop_path'], meta['nbseasons'])) self.db.commit() except Exception as e: VSlog(str(e)) if 'no such column' in str(e) or 'no column named' in str(e): self.__createdb('tvshow') VSlog('Table recreated') # Deuxieme tentative self.dbcur.execute( sql, (meta['imdb_id'], meta['tmdb_id'], name, year, meta['cast'], meta['crew'], meta['writer'], meta['director'], meta['rating'], meta['votes'], meta['duration'], meta['plot'], meta['mpaa'], meta['premiered'], meta['genre'], meta['studio'], meta['status'], meta['poster_path'], meta['trailer'], meta['backdrop_path'], meta['nbseasons'])) self.db.commit() else: VSlog('SQL ERROR INSERT into table tvshow') pass