def lists(self): if traktCredentials == False and imdbCredentials == False: return control.dialog.ok('Exodus', control.lang(30081).encode('utf-8'), control.lang(30082).encode('utf-8'), control.lang(30083).encode('utf-8')) if traktCredentials == True: self.addDirectoryItem(30084, 'movies&url=traktcollection', 'trakt.png', 'DefaultMovies.png', queue=True) self.addDirectoryItem(30085, 'tvshows&url=traktcollection', 'trakt.png', 'DefaultTVShows.png') self.addDirectoryItem(30086, 'movies&url=traktwatchlist', 'trakt.png', 'DefaultMovies.png', queue=True) self.addDirectoryItem(30087, 'tvshows&url=traktwatchlist', 'trakt.png', 'DefaultTVShows.png') if imdbCredentials == True: self.addDirectoryItem(30088, 'movies&url=imdbwatchlist', 'imdb.png', 'DefaultMovies.png', queue=True) self.addDirectoryItem(30089, 'tvshows&url=imdbwatchlist', 'imdb.png', 'DefaultTVShows.png') if traktCredentials == True: self.addDirectoryItem(30090, 'movies&url=traktfeatured', 'trakt.png', 'DefaultMovies.png', queue=True) self.addDirectoryItem(30091, 'tvshows&url=traktfeatured', 'trakt.png', 'DefaultTVShows.png') if traktIndicators == True: self.addDirectoryItem(30092, 'movies&url=trakthistory', 'trakt.png', 'DefaultMovies.png', queue=True) self.addDirectoryItem(30093, 'calendar&url=trakthistory', 'trakt.png', 'DefaultTVShows.png', queue=True) self.addDirectoryItem(30094, 'calendar&url=progress', 'trakt.png', 'DefaultRecentlyAddedEpisodes.png', queue=True) self.addDirectoryItem(30095, 'calendar&url=mycalendar', 'trakt.png', 'DefaultRecentlyAddedEpisodes.png', queue=True) if traktCredentials == True or imdbCredentials == True: self.addDirectoryItem(30096, 'movieUserlists', 'userlists.png', 'DefaultMovies.png') self.addDirectoryItem(30097, 'tvUserlists', 'userlists.png', 'DefaultTVShows.png') self.addDirectoryItem(30098, 'episodeUserlists', 'userlists.png', 'DefaultTVShows.png') self.endDirectory()
def resetsettings(): from resources.lib.modules import control; for key in ['cookie_experation', 'user_age', 'user_birthday', 'user_id', 'user_type']: try: setting(str('fn.' + key), ''); except Exception as inst: logger.error(inst); pass; try: setting('fn.ut', control.lang(32600).encode('utf-8')); setting('fn.subscriber_status', control.lang(32601).encode('utf-8')); setting('fn.user_role', control.lang(32602).encode('utf-8')); setting('fn.user_agent', control.lang(32603).encode('utf-8')); except Exception as inst: logger.error(inst); pass;
def nhlDirectory(): dt = procTimezone(5) datex = int(dt.strftime('%Y%m%d')) url = 'http://live.nhl.com/GameData/SeasonSchedule-20152016.json' result = client.request(url) items = json.loads(result) items = sorted(items, key=lambda k: k['est']) addDirectoryItem(control.lang(30751).encode('utf-8'), 'Scoreboard', 'nhlScoreboard', '0', '0') addDirectoryItem(control.lang(30752).encode('utf-8'), 'Archived', 'nhlArchives', '0', '0') addDirectoryItem(control.lang(30753).encode('utf-8'), '0', '0', '0', '0') addDirectoryItem(control.lang(30754).encode('utf-8'), '0', '0', '0', '0') for item in items: try: est = datetime.datetime.strptime(item['est'], '%Y%m%d %H:%M:%S') date = int(est.strftime('%Y%m%d')) if not date == datex: raise Exception() est = procTimezone(5, est) name = '%s at %s [COLOR gold](%s)[/COLOR] [COLOR red](%s)[/COLOR]' % (item['a'], item['h'], est.strftime('%H:%M'), est.strftime('%Y-%m-%d')) url = str(item['id']) addDirectoryItem(name, url, 'nhlStreams', '0', '0') except: pass endDirectory()
def range(self, url): control.idle() yes = control.yesnoDialog(control.lang(32555).encode('utf-8'), '', '') if not yes: return if not control.condVisibility('Window.IsVisible(infodialog)') and not control.condVisibility('Player.HasVideo'): control.infoDialog(control.lang(32552).encode('utf-8'), time=10000000) self.infoDialog = True from resources.lib.indexers import tvshows items = tvshows.tvshows().get(url, idx=False) if items == None: items = [] for i in items: try: if xbmc.abortRequested == True: return sys.exit() self.add(i['title'], i['year'], i['imdb'], i['tvdb'], range=True) except: pass if self.infoDialog == True: control.infoDialog(control.lang(32554).encode('utf-8'), time=1) if self.library_setting == 'true' and not control.condVisibility('Library.IsScanningVideo'): control.execute('UpdateLibrary(video)')
def add(self, tvshowtitle, year, imdb, tvdb, range=False): if not control.condVisibility('Window.IsVisible(infodialog)') and not control.condVisibility('Player.HasVideo'): control.infoDialog(control.lang(32552).encode('utf-8'), time=10000000) self.infoDialog = True from resources.lib.indexers import episodes items = episodes.episodes().get(tvshowtitle, year, imdb, tvdb, idx=False) try: items = [{'title': i['title'], 'year': i['year'], 'imdb': i['imdb'], 'tvdb': i['tvdb'], 'season': i['season'], 'episode': i['episode'], 'tvshowtitle': i['tvshowtitle'], 'premiered': i['premiered']} for i in items] except: items = [] try: if not self.dupe_setting == 'true': raise Exception() if items == []: raise Exception() id = [items[0]['imdb'], items[0]['tvdb']] lib = control.jsonrpc('{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": {"properties" : ["imdbnumber", "title", "year"]}, "id": 1}') lib = unicode(lib, 'utf-8', errors='ignore') lib = json.loads(lib)['result']['tvshows'] lib = [i['title'].encode('utf-8') for i in lib if str(i['imdbnumber']) in id or (i['title'].encode('utf-8') == items[0]['tvshowtitle'] and str(i['year']) == items[0]['year'])][0] lib = control.jsonrpc('{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": {"filter":{"and": [{"field": "tvshow", "operator": "is", "value": "%s"}]}, "properties": ["season", "episode"]}, "id": 1}' % lib) lib = unicode(lib, 'utf-8', errors='ignore') lib = json.loads(lib)['result']['episodes'] lib = ['S%02dE%02d' % (int(i['season']), int(i['episode'])) for i in lib] items = [i for i in items if not 'S%02dE%02d' % (int(i['season']), int(i['episode'])) in lib] except: pass files_added = 0 for i in items: try: if xbmc.abortRequested == True: return sys.exit() if self.check_setting == 'true': if i['episode'] == '1': self.block = True src = lib_tools.check_sources(i['title'], i['year'], i['imdb'], i['tvdb'], i['season'], i['episode'], i['tvshowtitle'], i['premiered']) if src: self.block = False if self.block == True: raise Exception() premiered = i.get('premiered', '0') if (premiered != '0' and int(re.sub('[^0-9]', '', str(premiered))) > int(self.date)) or (premiered == '0' and not self.include_unknown): continue self.strmFile(i) files_added += 1 except: pass if range == True: return if self.infoDialog == True: control.infoDialog(control.lang(32554).encode('utf-8'), time=1) if self.library_setting == 'true' and not control.condVisibility('Library.IsScanningVideo') and files_added > 0: control.execute('UpdateLibrary(video)')
def calendars(self, idx=True): m = control.lang(32060).encode('utf-8').split('|') try: months = [(m[0], 'January'), (m[1], 'February'), (m[2], 'March'), (m[3], 'April'), (m[4], 'May'), (m[5], 'June'), (m[6], 'July'), (m[7], 'August'), (m[8], 'September'), (m[9], 'October'), (m[10], 'November'), (m[11], 'December')] except: months = [] d = control.lang(32061).encode('utf-8').split('|') try: days = [(d[0], 'Monday'), (d[1], 'Tuesday'), (d[2], 'Wednesday'), (d[3], 'Thursday'), (d[4], 'Friday'), (d[5], 'Saturday'), (d[6], 'Sunday')] except: days = [] for i in range(0, 30): try: name = (self.datetime - datetime.timedelta(days = i)) name = (control.lang(32062) % (name.strftime('%A'), name.strftime('%d %B'))).encode('utf-8') for m in months: name = name.replace(m[1], m[0]) for d in days: name = name.replace(d[1], d[0]) try: name = name.encode('utf-8') except: pass url = self.calendar_link % (self.datetime - datetime.timedelta(days = i)).strftime('%Y-%m-%d') self.list.append({'name': name, 'url': url, 'image': 'calendar.png', 'action': 'calendar'}) except: pass if idx == True: self.addDirectory(self.list) return self.list
def range(self, url): control.idle() yes = control.yesnoDialog(control.lang(30425).encode("utf-8"), "", "") if not yes: return if not control.condVisibility("Window.IsVisible(infodialog)") and not control.condVisibility("Player.HasVideo"): control.infoDialog(control.lang(30421).encode("utf-8"), time=10000000) self.infoDialog = True from resources.lib.indexers import movies items = movies.movies().get(url, idx=False) if items == None: items = [] for i in items: try: if xbmc.abortRequested == True: return sys.exit() self.add(i["name"], i["title"], i["year"], i["imdb"], range=True) except: pass if self.infoDialog == True: control.infoDialog(control.lang(30423).encode("utf-8"), time=1) if self.library_setting == "true" and not control.condVisibility("Library.IsScanningVideo"): control.execute("UpdateLibrary(video)")
def clear(table=None): try: control.idle() if table == None: table = ['rel_list', 'rel_lib'] elif not type(table) == list: table = [table] yes = control.yesnoDialog(control.lang(30401).encode('utf-8'), '', '') if not yes: return dbcon = database.connect(control.cacheFile) dbcur = dbcon.cursor() for t in table: try: dbcur.execute("DROP TABLE IF EXISTS %s" % t) dbcur.execute("VACUUM") dbcon.commit() except: pass nanscrapers.clear_cache() control.infoDialog(control.lang(30402).encode('utf-8')) except: pass
def views(self): try: control.idle() items = [ (control.lang(32001).encode('utf-8'), 'movies'), (control.lang(32002).encode('utf-8'), 'tvshows'), (control.lang(32054).encode('utf-8'), 'seasons'), (control.lang(32038).encode('utf-8'), 'episodes') ] select = control.selectDialog([i[0] for i in items], control.lang(32049).encode('utf-8')) if select == -1: return content = items[select][1] title = control.lang(32059).encode('utf-8') url = '%s?action=addView&content=%s' % (sys.argv[0], content) poster, banner, fanart = control.addonPoster(), control.addonBanner(), control.addonFanart() item = control.item(label=title) item.setInfo(type='Video', infoLabels = {'title': title}) item.setArt({'icon': poster, 'thumb': poster, 'poster': poster, 'banner': banner}) item.setProperty('Fanart_Image', fanart) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=False) control.content(int(sys.argv[1]), content) control.directory(int(sys.argv[1]), cacheToDisc=True) from resources.lib.modules import cache views.setView(content, {}) except: return
def clearCache(self): control.idle() yes = control.yesnoDialog(control.lang(32056).encode('utf-8'), '', '') if not yes: return from resources.lib.modules import cache cache.cache_clear() control.infoDialog(control.lang(32057).encode('utf-8'), sound=True, icon='INFO')
def get(self, name, year='0'): try: offset = '0' if not control.setting('bookmarks') == 'true': raise Exception() idFile = hashlib.md5() for i in name: idFile.update(str(i)) for i in year: idFile.update(str(i)) idFile = str(idFile.hexdigest()) dbcon = database.connect(control.bookmarksFile) dbcur = dbcon.cursor() dbcur.execute("SELECT * FROM bookmark WHERE idFile = '%s'" % idFile) match = dbcur.fetchone() self.offset = str(match[1]) dbcon.commit() if self.offset == '0': raise Exception() minutes, seconds = divmod(float(self.offset), 60) ; hours, minutes = divmod(minutes, 60) label = '%02d:%02d:%02d' % (hours, minutes, seconds) label = (control.lang(32502) % label).encode('utf-8') try: yes = control.dialog.contextmenu([label, control.lang(32501).encode('utf-8'), ]) except: yes = control.yesnoDialog(label, '', '', str(name), control.lang(32503).encode('utf-8'), control.lang(32501).encode('utf-8')) if yes: self.offset = '0' return self.offset except: return offset
def search(self, query=None): try: if control.infoLabel('Container.PluginName') == '': return control.dialog.ok('Exodus', control.lang(30518).encode('utf-8'), '', '') if not control.infoLabel('ListItem.Title') == '': self.query = control.window.getProperty('%s.movie.search' % control.addonInfo('id')) elif query == None: t = control.lang(30201).encode('utf-8') k = control.keyboard('', t) ; k.doModal() self.query = k.getText() if k.isConfirmed() else None else: self.query = query if (self.query == None or self.query == ''): return control.window.setProperty('%s.movie.search' % control.addonInfo('id'), self.query) url = self.search_link % urllib.quote_plus(self.query) self.list = cache.get(self.trakt_list, 0, url) self.worker() self.movieDirectory(self.list) return self.list except: return
def addDirectory(self, items, queue=False): if items == None or len(items) == 0: return sysaddon = sys.argv[0] isPlayable = False if control.setting('autoplay') == 'false' and control.setting('hosts.mode') == '1' else True addonFanart, addonThumb, artPath = control.addonFanart(), control.addonThumb(), control.artPath() for i in items: try: try: name = control.lang(i['name']).encode('utf-8') except: name = i['name'] if i['image'].startswith('http://'): thumb = i['image'] elif not artPath == None: thumb = os.path.join(artPath, i['image']) else: thumb = addonThumb url = '%s?action=%s' % (sysaddon, i['action']) try: url += '&url=%s' % urllib.quote_plus(i['url']) except: pass cm = [] if queue == True and isPlayable == True: cm.append((control.lang(30202).encode('utf-8'), 'RunPlugin(%s?action=queueItem)' % sysaddon)) item = control.item(label=name, iconImage=thumb, thumbnailImage=thumb) item.addContextMenuItems(cm, replaceItems=False) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=True) except: pass control.directory(int(sys.argv[1]), cacheToDisc=True)
def rdAuthorize(): try: CLIENT_ID = 'X245A4XAIBGVM' USER_AGENT = 'Kodi Exodus/3.0' if not '' in credentials()['realdebrid'].values(): if control.yesnoDialog(control.lang(30411).encode('utf-8'), control.lang(30413).encode('utf-8'), '', 'RealDebrid', control.lang(30415).encode('utf-8'), control.lang(30414).encode('utf-8')): control.setSetting(id='realdebrid.id', value='') control.setSetting(id='realdebrid.secret', value='') control.setSetting(id='realdebrid.token', value='') control.setSetting(id='realdebrid.refresh', value='') control.setSetting(id='realdebrid.auth', value='') raise Exception() headers = {'User-Agent': USER_AGENT} url = 'https://api.real-debrid.com/oauth/v2/device/code?client_id=%s&new_credentials=yes' % (CLIENT_ID) result = client.request(url, headers=headers) result = json.loads(result) verification_url = (control.lang(30416) + '[COLOR skyblue]%s[/COLOR]' % result['verification_url']).encode('utf-8') user_code = (control.lang(30417) + '[COLOR skyblue]%s[/COLOR]' % result['user_code']).encode('utf-8') device_code = result['device_code'] interval = result['interval'] progressDialog = control.progressDialog progressDialog.create('RealDebrid', verification_url, user_code) for i in range(0, 3600): try: if progressDialog.iscanceled(): break time.sleep(1) if not float(i) % interval == 0: raise Exception() url = 'https://api.real-debrid.com/oauth/v2/device/credentials?client_id=%s&code=%s' % (CLIENT_ID, device_code) result = client.request(url, headers=headers, error=True) result = json.loads(result) if 'client_secret' in result: break except: pass try: progressDialog.close() except: pass id, secret = result['client_id'], result['client_secret'] url = 'https://api.real-debrid.com/oauth/v2/token' post = urllib.urlencode({'client_id': id, 'client_secret': secret, 'code': device_code, 'grant_type': 'http://oauth.net/grant_type/device/1.0'}) result = client.request(url, post=post, headers=headers) result = json.loads(result) token, refresh = result['access_token'], result['refresh_token'] control.setSetting(id='realdebrid.id', value=id) control.setSetting(id='realdebrid.secret', value=secret) control.setSetting(id='realdebrid.token', value=token) control.setSetting(id='realdebrid.refresh', value=refresh) control.setSetting(id='realdebrid.auth', value='*************') raise Exception() except: control.openSettings('3.13')
def addDirectoryItem(self, name, query, thumb, icon, queue=False, isAction=True, isFolder=True): try: name = control.lang(name).encode('utf-8') except: pass url = '%s?action=%s' % (sysaddon, query) if isAction == True else query thumb = os.path.join(artPath, thumb) if not artPath == None else icon cm = [] if queue == True and isPlayable == True: cm.append((control.lang(30155).encode('utf-8'), 'RunPlugin(%s?action=queueItem)' % sysaddon)) item = control.item(label=name, iconImage=thumb, thumbnailImage=thumb) item.addContextMenuItems(cm, replaceItems=False) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=isFolder)
def addDirectoryItem(name, url, action, image, image2, fanart, content, data, tvshow='0', totalItems=0, isFolder=True): if not str(image).lower().startswith('http'): image = control.addonInfo('icon') if not str(image2).lower().startswith('http'): image2 = control.addonInfo('icon') if not str(fanart).lower().startswith('http'): fanart = control.addonInfo('fanart') if content in ['movies', 'episodes']: playable = 'true' else: playable = 'false' sysaddon = sys.argv[0] if url.startswith('$base64'): import base64 ; url = base64.b64decode(re.compile('\$base64\[(.+?)\]$').findall(url)[0]) u = '%s?name=%s&url=%s&tvdb=&imdb=&source=GVideo&provider=Mpie&content=%s&action=playItem' % (sysaddon, urllib.quote_plus(name), urllib.quote_plus(url), str(content)) cm = [] if content == 'movies': cm.append((control.lang(30708).encode('utf-8'), 'XBMC.Action(Info)')) elif content in ['tvshows', 'seasons']: cm.append((control.lang(30709).encode('utf-8'), 'XBMC.Action(Info)')) elif content == 'episodes': cm.append((control.lang(30710).encode('utf-8'), 'XBMC.Action(Info)')) if content == 'movies' and not isFolder == True: downloadFile = name try: downloadFile = '%s (%s)' % (data['title'], data['year']) except: pass cm.append((control.lang(30722).encode('utf-8'), 'RunPlugin(%s?action=addDownload&name=%s&url=%s&image=%s)' % (sysaddon, urllib.quote_plus(downloadFile), urllib.quote_plus(url), urllib.quote_plus(image)))) elif content == 'episodes' and not isFolder == True: downloadFile = name try: downloadFile = '%s S%02dE%02d' % (data['tvshowtitle'], int(data['season']), int(data['episode'])) except: pass cm.append((control.lang(30722).encode('utf-8'), 'RunPlugin(%s?action=addDownload&name=%s&url=%s&image=%s)' % (sysaddon, urllib.quote_plus(downloadFile), urllib.quote_plus(url), urllib.quote_plus(image)))) if content == 'movies': cm.append((control.lang(30711).encode('utf-8'), 'RunPlugin(%s?action=addView&content=movies)' % sysaddon)) elif content == 'tvshows': cm.append((control.lang(30712).encode('utf-8'), 'RunPlugin(%s?action=addView&content=tvshows)' % sysaddon)) elif content == 'seasons': cm.append((control.lang(30713).encode('utf-8'), 'RunPlugin(%s?action=addView&content=seasons)' % sysaddon)) elif content == 'episodes': cm.append((control.lang(30714).encode('utf-8'), 'RunPlugin(%s?action=addView&content=episodes)' % sysaddon)) item = control.item(name, iconImage='DefaultFolder.png', thumbnailImage=image) try: item.setArt({'poster': image2, 'tvshow.poster': image2, 'season.poster': image2, 'banner': image, 'tvshow.banner': image, 'season.banner': image}) except: pass item.addContextMenuItems(cm, replaceItems=False) item.setProperty('Fanart_Image', fanart) if playable == 'true': item.setProperty('IsPlayable', 'true') item.setInfo(type='Video', infoLabels=data) control.addItem(handle=int(sys.argv[1]),url=u,listitem=item,totalItems=totalItems,isFolder=isFolder)
def promptForLogin(prompt=None): import xbmcgui; from resources.lib.modules import control; __settings__ = xbmcaddon.Addon(control.addonInfo('id')) if prompt: if xbmcgui.Dialog().yesno(control.lang(32755).encode('utf-8'), control.lang(32756).encode('utf-8'), control.lang(32757).encode('utf-8')): __settings__.openSettings(); else: __settings__.openSettings();
def addDirectory(self, items, queue=False): if items == None or len(items) == 0: control.idle() ; sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) addonFanart, addonThumb, artPath = control.addonFanart(), control.addonThumb(), control.artPath() queueMenu = control.lang(32065).encode('utf-8') playRandom = control.lang(32535).encode('utf-8') addToLibrary = control.lang(32551).encode('utf-8') for i in items: try: name = i['name'] if i['image'].startswith('http'): thumb = i['image'] elif not artPath == None: thumb = os.path.join(artPath, i['image']) else: thumb = addonThumb url = '%s?action=%s' % (sysaddon, i['action']) try: url += '&url=%s' % urllib.quote_plus(i['url']) except: pass cm = [] cm.append(('Settings', 'RunPlugin(%s?action=openSettings&query=0.0)' % sysaddon)) cm.append((playRandom, 'RunPlugin(%s?action=random&rtype=movie&url=%s)' % (sysaddon, urllib.quote_plus(i['url'])))) if queue == True: cm.append((queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) try: cm.append((addToLibrary, 'RunPlugin(%s?action=moviesToLibrary&url=%s)' % (sysaddon, urllib.quote_plus(i['context'])))) except: pass item = control.item(label=name) item.setArt({'icon': thumb, 'thumb': thumb}) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.addContextMenuItems(cm) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: pass control.content(syshandle, 'addons') control.directory(syshandle, cacheToDisc=True)
def addDirectoryItem(self, name, query, thumb, icon, context=None, queue=False, isAction=True, isFolder=True): try: name = control.lang(name).encode('utf-8') except: pass url = '%s?action=%s' % (sysaddon, query) if isAction == True else query thumb = os.path.join(artPath, thumb) if not artPath == None else icon cm = [] if queue == True: cm.append((queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) if not context == None: cm.append((control.lang(context[0]).encode('utf-8'), 'RunPlugin(%s?action=%s)' % (sysaddon, context[1]))) item = control.item(label=name) item.addContextMenuItems(cm) item.setArt({'icon': thumb, 'thumb': thumb}) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=isFolder)
def getURISource(self, url): u = None sourceDict = [] for package, name, is_pkg in pkgutil.walk_packages(__path__): sourceDict.append((name, is_pkg)) sourceDict = [i[0] for i in sourceDict if i[1] == False] sourceDict = [(i, __import__(i, globals(), locals(), [], -1).source()) for i in sourceDict] domain = re.sub('^www\.|^www\d+\.', '', urlparse.urlparse(url.strip().lower()).netloc) domains = [(i[0], i[1].domains) for i in sourceDict] domains = [i[0] for i in domains if any(x in domain for x in i[1])] if not domains: return False call = [i[1] for i in sourceDict if i[0] == domains[0]][0] progressDialog = control.progressDialog progressDialog.create(control.addonInfo('name'), control.lang(30726).encode('utf-8')) progressDialog.update(0) progressDialog.update(0, control.lang(30726).encode('utf-8'), control.lang(30731).encode('utf-8')) self.sources = call.sources(url, self.hostDict, self.hostprDict) progressDialog.update(50, control.lang(30726).encode('utf-8'), control.lang(30731).encode('utf-8')) items = self.sourcesFilter() filter = [i for i in items if i['source'].lower() in self.hostcapDict and i['debrid'] == ''] items = [i for i in items if not i in filter] filter = [i for i in items if i['source'].lower() in self.hostblockDict and i['debrid'] == ''] items = [i for i in items if not i in filter] items = [i for i in items if ('autoplay' in i and i['autoplay'] == True) or not 'autoplay' in i] for i in range(len(items)): try: if progressDialog.iscanceled(): break if xbmc.abortRequested == True: return sys.exit() url = self.sourcesResolve(items[i]) if u == None: u = url if not url == None: break except: pass try: progressDialog.close() except: pass return u
def getSearch(): addDirectoryItem('%s...' % control.lang(30702).encode('utf-8'), '0', 'searchDirectory', '0', '0', '0', '0', '0', {}) addDirectoryItem(control.lang(30703).encode('utf-8'), '0', 'clearSearch', '0', '0', '0', '0', '0', {}) try: def search(): return result = cache.get(search, 600000000, table='rel_srch') for q in result: try: addDirectoryItem('%s...' % q, q, 'searchDirectory2', '0', '0', '0', '0', '0', {}) except: pass except: pass control.directory(int(sys.argv[1]), cacheToDisc=True)
def getCategory(): getDirectory('0', phLink, '0', '0', '0', '0', close=False) addCategoryItem('Radio Crazy', 'radioDirectory', 'http://mecca.watchkodi.com/images/radios.png') addCategoryItem('Cartoon Crazy','CartoonDirectory','http://mecca.watchkodi.com/images/cartoon.png') addCategoryItem('NHL', 'nhlDirectory', 'http://mecca.watchkodi.com/images/hockey.jpg') addCategoryItem('News Updates', 'dmode&url=%s' % phNews, artPath + 'blazetameravAni.gif') addCategoryItem(control.lang(30701).encode('utf-8'), 'openSettings', artPath + 'settings.png') addCategoryItem(control.lang(30721).encode('utf-8'), 'downloader', artPath + 'downloader.png') addCategoryItem(control.lang(30702).encode('utf-8'), 'search', artPath + 'search.png') if phTest in control.listDir(control.dataPath)[1]: addCategoryItem('Testings', 'localDirectory', artPath + 'home.png') endCategory()
def authTrakt(): try: if getTraktCredentialsInfo() == True: if control.yesnoDialog(control.lang(30479).encode('utf-8'), control.lang(30481).encode('utf-8'), '', 'Trakt', control.lang(30483).encode('utf-8'), control.lang(30482).encode('utf-8')): control.setSetting(id='trakt.user', value='') control.setSetting(id='trakt.token', value='') control.setSetting(id='trakt.refresh', value='') raise Exception() result = getTrakt('/oauth/device/code', {'client_id': 'c029c80fd3d3a5284ee820ba1cf7f0221da8976b8ee5e6c4af714c22fc4f46fa'}) result = json.loads(result) verification_url = (control.lang(30416) + '[COLOR skyblue]%s[/COLOR]' % result['verification_url']).encode('utf-8') user_code = (control.lang(30417) + '[COLOR skyblue]%s[/COLOR]' % result['user_code']).encode('utf-8') expires_in = int(result['expires_in']) device_code = result['device_code'] interval = result['interval'] progressDialog = control.progressDialog progressDialog.create('Trakt', verification_url, user_code) for i in range(0, expires_in): try: if progressDialog.iscanceled(): break time.sleep(1) if not float(i) % interval == 0: raise Exception() r = getTrakt('/oauth/device/token', {'client_id': 'c029c80fd3d3a5284ee820ba1cf7f0221da8976b8ee5e6c4af714c22fc4f46fa', 'client_secret': '90a1840447a1e39d350023263902fe7010338d19789e6260f18df56a8b07a68a', 'code': device_code}) r = json.loads(r) if 'access_token' in r: break except: pass try: progressDialog.close() except: pass token, refresh = r['access_token'], r['refresh_token'] headers = {'Content-Type': 'application/json', 'trakt-api-key': 'c029c80fd3d3a5284ee820ba1cf7f0221da8976b8ee5e6c4af714c22fc4f46fa', 'trakt-api-version': '2', 'Authorization': 'Bearer %s' % token} result = client.request('http://api-v2launch.trakt.tv/users/me', headers=headers) result = json.loads(result) user = result['username'] control.setSetting(id='trakt.user', value=user) control.setSetting(id='trakt.token', value=token) control.setSetting(id='trakt.refresh', value=refresh) raise Exception() except: control.openSettings('3.1')
def authTrakt(): try: if getTraktCredentialsInfo() == True: if control.yesnoDialog(control.lang(32511).encode('utf-8'), control.lang(32512).encode('utf-8'), '', 'Trakt'): control.setSetting(id='trakt.user', value='') control.setSetting(id='trakt.token', value='') control.setSetting(id='trakt.refresh', value='') raise Exception() result = getTraktAsJson('/oauth/device/code', {'client_id': V2_API_KEY}) verification_url = (control.lang(32513) % result['verification_url']).encode('utf-8') user_code = (control.lang(32514) % result['user_code']).encode('utf-8') expires_in = int(result['expires_in']) device_code = result['device_code'] interval = result['interval'] progressDialog = control.progressDialog progressDialog.create('Trakt', verification_url, user_code) for i in range(0, expires_in): try: if progressDialog.iscanceled(): break time.sleep(1) if not float(i) % interval == 0: raise Exception() r = getTraktAsJson('/oauth/device/token', {'client_id': V2_API_KEY, 'client_secret': CLIENT_SECRET, 'code': device_code}) if 'access_token' in r: break except: pass try: progressDialog.close() except: pass token, refresh = r['access_token'], r['refresh_token'] headers = {'Content-Type': 'application/json', 'trakt-api-key': V2_API_KEY, 'trakt-api-version': 2, 'Authorization': 'Bearer %s' % token} result = client.request(urlparse.urljoin(BASE_URL, '/users/me'), headers=headers) result = utils.json_loads_as_str(result) user = result['username'] control.setSetting(id='trakt.user', value=user) control.setSetting(id='trakt.token', value=token) control.setSetting(id='trakt.refresh', value=refresh) raise Exception() except: control.openSettings('3.1')
def showPlaybackInfo(self): try: if not control.setting('player.info') == 'true': raise Exception() elapsedTime = '%s %s %s' % (control.lang(30464).encode('utf-8'), int((time.time() - self.loadingTime)), control.lang(30465).encode('utf-8')) control.infoDialog(elapsedTime, heading=self.name) except: pass
def clear(table=None): try: control.idle() if table == None: table = ['rel_list', 'rel_lib'] elif not type(table) == list: table = [table] yes = control.yesnoDialog(control.lang(30401).encode('utf-8'), '', '') if not yes: return dbcon = database.connect(control.cacheFile) dbcur = dbcon.cursor() for t in table: try: dbcur.execute("DROP TABLE IF EXISTS %s" % t) dbcur.execute("VACUUM") dbcon.commit() except: pass except: pass import xbmcgui xbmcgui.Dialog().notification('[COLOR ffff0000]StreamHub[/COLOR]','Process Complete')
def addView(content): try: skin = control.skin skinPath = control.skinPath xml = os.path.join(skinPath,'addon.xml') file = control.openFile(xml) read = file.read().replace('\n','') file.close() try: src = re.compile('defaultresolution="(.+?)"').findall(read)[0] except: src = re.compile('<res.+?folder="(.+?)"').findall(read)[0] src = os.path.join(skinPath, src) src = os.path.join(src, 'MyVideoNav.xml') file = control.openFile(src) read = file.read().replace('\n','') file.close() views = re.compile('<views>(.+?)</views>').findall(read)[0] views = [int(x) for x in views.split(',')] for view in views: label = control.infoLabel('Control.GetLabel(%s)' % (view)) if not (label == '' or label == None): break record = (skin, content, str(view)) control.makeFile(control.dataPath) dbcon = database.connect(control.viewsFile) dbcur = dbcon.cursor() dbcur.execute("CREATE TABLE IF NOT EXISTS views (""skin TEXT, ""view_type TEXT, ""view_id TEXT, ""UNIQUE(skin, view_type)"");") dbcur.execute("DELETE FROM views WHERE skin = '%s' AND view_type = '%s'" % (record[0], record[1])) dbcur.execute("INSERT INTO views Values (?, ?, ?)", record) dbcon.commit() viewName = control.infoLabel('Container.Viewmode') control.infoDialog(control.lang(30491).encode('utf-8'), heading=viewName) except: return
def playItem(url, dialog=None): try: url = resolveUrl(url) if url == None: return control.infoDialog(control.lang(30705).encode('utf-8')) meta = {} for i in ['title', 'originaltitle', 'tvshowtitle', 'year', 'season', 'episode', 'genre', 'rating', 'votes', 'director', 'writer', 'plot', 'tagline']: try: meta[i] = control.infoLabel('listitem.%s' % i) except: pass meta['title'] = cleantitle(meta['title']) meta = dict((k,v) for k, v in meta.iteritems() if not v == '') if not 'title' in meta: meta['title'] = cleantitle(control.infoLabel('listitem.label')) icon = control.infoLabel('listitem.icon') title = meta['title'] try: if not '.f4m'in url: raise Exception() ext = url.split('?')[0].split('&')[0].split('|')[0].rsplit('.')[-1].replace('/', '').lower() if not ext == 'f4m': raise Exception() from resources.lib.modules.f4mproxy.F4mProxy import f4mProxyHelper return f4mProxyHelper().playF4mLink(url, title, None, None, '', icon) except: pass item = control.item(path=url, iconImage=icon, thumbnailImage=icon) try: item.setArt({'icon': icon}) except: pass item.setInfo(type='Video', infoLabels = meta) control.player.play(url, item) except: pass
def addDirectory(self, items): if items == None or len(items) == 0: return sysaddon = sys.argv[0] addonFanart, addonThumb, artPath = control.addonFanart(), control.addonThumb(), control.artPath() for i in items: try: try: name = control.lang(i['name']).encode('utf-8') except: name = i['name'] if i['image'].startswith('http://'): thumb = i['image'] elif not artPath == None: thumb = os.path.join(artPath, i['image']) else: thumb = addonThumb url = '%s?action=%s' % (sysaddon, i['action']) try: url += '&url=%s' % urllib.quote_plus(i['url']) except: pass cm = [] item = control.item(label=name, iconImage=thumb, thumbnailImage=thumb) item.addContextMenuItems(cm, replaceItems=False) if not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=True) except: pass control.directory(int(sys.argv[1]), cacheToDisc=True)
def getCategory(): getDirectory('0', phLink, '0', '0', '0', '0', close=False) addCategoryItem(control.lang(30701).encode('utf-8'), 'openSettings', 'settings.png') if phTest in control.listDir(control.dataPath)[1]: addCategoryItem('Testings', 'localDirectory', 'home.png') endCategory()
def channelDirectory(self, items): if items == None or len(items) == 0: control.idle() sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting( 'fanart') try: isOld = False control.item().getArt('type') except: isOld = True isPlayable = 'true' if not 'plugin' in control.infoLabel( 'Container.PluginName') else 'false' playbackMenu = control.lang(32063).encode('utf-8') if control.setting( 'hosts.mode') == '2' else control.lang(32064).encode('utf-8') queueMenu = control.lang(32065).encode('utf-8') refreshMenu = control.lang(32072).encode('utf-8') for i in items: try: label = '[B]%s[/B] : %s (%s)' % (i['channel'].upper(), i['title'], i['year']) sysname = urllib.quote_plus('%s (%s)' % (i['title'], i['year'])) systitle = urllib.quote_plus(i['title']) imdb, tmdb, year = i['imdb'], i['tmdb'], i['year'] meta = dict((k, v) for k, v in i.iteritems() if not v == '0') meta.update({ 'code': imdb, 'imdbnumber': imdb, 'imdb_id': imdb }) meta.update({'tmdb_id': tmdb}) meta.update({'mediatype': 'movie'}) meta.update({ 'trailer': '%s?action=trailer&name=%s' % (sysaddon, sysname) }) #meta.update({'trailer': 'plugin://script.extendedinfo/?info=playtrailer&&id=%s' % imdb}) meta.update({'playcount': 0, 'overlay': 6}) try: meta.update( {'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass sysmeta = urllib.quote_plus(json.dumps(meta)) url = '%s?action=play&title=%s&year=%s&imdb=%s&meta=%s&t=%s' % ( sysaddon, systitle, year, imdb, sysmeta, self.systime) sysurl = urllib.quote_plus(url) cm = [] cm.append( (queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) cm.append( (refreshMenu, 'RunPlugin(%s?action=refresh)' % sysaddon)) cm.append((playbackMenu, 'RunPlugin(%s?action=alterSources&url=%s&meta=%s)' % (sysaddon, sysurl, sysmeta))) if isOld == True: cm.append( (control.lang2(19033).encode('utf-8'), 'Action(Info)')) item = control.item(label=label) art = {} if 'poster2' in i and not i['poster2'] == '0': art.update({ 'icon': i['poster2'], 'thumb': i['poster2'], 'poster': i['poster2'] }) elif 'poster' in i and not i['poster'] == '0': art.update({ 'icon': i['poster'], 'thumb': i['poster'], 'poster': i['poster'] }) else: art.update({ 'icon': addonPoster, 'thumb': addonPoster, 'poster': addonPoster }) art.update({'banner': addonBanner}) if settingFanart == 'true' and 'fanart' in i and not i[ 'fanart'] == '0': item.setProperty('Fanart_Image', i['fanart']) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.setArt(art) item.addContextMenuItems(cm) item.setProperty('IsPlayable', isPlayable) item.setInfo(type='Video', infoLabels=meta) video_streaminfo = {'codec': 'h264'} item.addStreamInfo('video', video_streaminfo) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except: pass control.content(syshandle, 'files') control.directory(syshandle, cacheToDisc=True)
def process(self, url, direct=True): try: dialog = None dialog = control.progressDialog dialog.create(control.addonInfo('name'), control.lang(30726).encode('utf-8')) dialog.update(0) except: pass try: if not '</regex>' in url: raise Exception() from resources.lib.modules import regex u = regex.resolve(url) if not u == None: url = u except: pass try: if not url.startswith('rtmp'): raise Exception() if len(re.compile('\s*timeout=(\d*)').findall(url)) == 0: url += ' timeout=10' try: dialog.close() except: pass return url except: pass try: if not any(i in url for i in ['.m3u8', '.f4m', '.ts']): raise Exception() ext = url.split('?')[0].split('&')[0].split('|')[0].rsplit( '.')[-1].replace('/', '').lower() if not ext in ['m3u8', 'f4m', 'ts']: raise Exception() try: dialog.close() except: pass return url except: pass try: preset = re.findall('<preset>(.+?)</preset>', url)[0] title, year, imdb = re.findall( '<title>(.+?)</title>', url)[0], re.findall( '<year>(.+?)</year>', url)[0], re.findall('<imdb>(.+?)</imdb>', url)[0] try: tvdb, tvshowtitle, premiered, season, episode = re.findall( '<tvdb>(.+?)</tvdb>', url)[0], re.findall( '<tvshowtitle>(.+?)</tvshowtitle>', url)[0], re.findall('<premiered>(.+?)</premiered>', url)[0], re.findall( '<season>(.+?)</season>', url)[0], re.findall( '<episode>(.+?)</episode>', url)[0] except: tvdb = tvshowtitle = premiered = season = episode = None direct = False presetDict = [ 'primewire_mv_tv', 'watchfree_mv_tv', 'movie25_mv', 'watchseries_tv', 'afdah_mv', 'dayt_mv_tv', 'dizibox_tv', 'dizigold_tv', 'miradetodo_mv', 'onlinedizi_tv', 'pelispedia_mv_tv', 'pubfilm_mv_tv', 'putlocker_mv_tv', 'rainierland_mv', 'sezonlukdizi_tv', 'tunemovie_mv', 'xmovies_mv' ] if preset == 'searchsd': presetDict = [ 'primewire_mv_tv', 'watchfree_mv_tv', 'movie25_mv', 'watchseries_tv' ] from resources.lib.sources import sources try: dialog.update(0, control.lang(30726).encode('utf-8'), control.lang(30731).encode('utf-8')) except: pass u = sources().getSources(title, year, imdb, tvdb, season, episode, tvshowtitle, premiered, presetDict=presetDict, progress=False, timeout=20) try: dialog.update(50, control.lang(30726).encode('utf-8'), control.lang(30731).encode('utf-8')) except: pass u = sources().sourcesDirect(u, progress=False) if not u == None: try: dialog.close() except: pass return u except: pass try: from resources.lib.sources import sources u = sources().getURISource(url) if not u == False: direct = False if u == None or u == False or u == []: raise Exception() try: dialog.update(50, control.lang(30726).encode('utf-8'), control.lang(30731).encode('utf-8')) except: pass u = sources().sourcesDirect(u, progress=False) if not u == None: try: dialog.close() except: pass return u except: pass try: if not '.google.com' in url: raise Exception() from resources.lib.modules import directstream u = directstream.google(url)[0]['url'] try: dialog.close() except: pass return u except: pass try: import urlresolver try: hmf = urlresolver.HostedMediaFile(url=url, include_disabled=True, include_universal=False) except: hmf = urlresolver.HostedMediaFile(url=url) if hmf.valid_url() == False: raise Exception() direct = False u = hmf.resolve() if 'plugin://plugin.video.youtube' in u: raise Exception() if not u == False: try: dialog.close() except: pass return u except: pass try: try: headers = dict(urlparse.parse_qsl(url.rsplit('|', 1)[1])) except: headers = dict('') if not url.startswith('http'): raise Exception() result = client.request(url.split('|')[0], headers=headers, output='headers', timeout='20') if 'Content-Type' in result and not 'html' in result[ 'Content-Type']: raise Exception() import liveresolver if liveresolver.isValid(url) == True: direct = False u = liveresolver.resolve(url) if not u == None: try: dialog.close() except: pass return u except: pass if direct == True: return url try: dialog.close() except: pass
def get_globo_americas(): is_globosat_available = control.is_globosat_available() headers = { "Accept-Encoding": "gzip", "User-Agent": "Globo Play/0 (iPhone)", "x-tenant-id": "globo-play-us", 'x-platform-id': 'web', 'x-device-id': 'desktop', 'x-client-version': '0.4.3' } now = datetime.datetime.utcnow() + datetime.timedelta( hours=control.get_current_brasilia_utc_offset()) date = now.strftime('%Y-%m-%d') variables = urllib.quote_plus('{{"date":"{}"}}'.format(date)) query = 'query%20getEpgBroadcastList%28%24date%3A%20Date%21%29%20%7B%0A%20%20broadcasts%20%7B%0A%20%20%20%20...broadcastFragment%0A%20%20%7D%0A%7D%0Afragment%20broadcastFragment%20on%20Broadcast%20%7B%0A%20%20mediaId%0A%20%20media%20%7B%0A%20%20%20%20serviceId%0A%20%20%20%20headline%0A%20%20%20%20thumb%28size%3A%20720%29%0A%20%20%20%20availableFor%0A%20%20%20%20title%20%7B%0A%20%20%20%20%20%20slug%0A%20%20%20%20%20%20headline%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20transmissionId%0A%20%20geofencing%0A%20%20geoblocked%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20color%0A%20%20%20%20name%0A%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%7D%0A%20%20epgByDate%28date%3A%20%24date%29%20%7B%0A%20%20%20%20entries%20%7B%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20description%0A%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20tags%0A%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20contentRatingCriteria%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20alternativeTime%0A%20%20%20%20%20%20title%7B%0A%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20originProgramId%0A%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20countries%0A%20%20%20%20%20%20%20%20directorsNames%0A%20%20%20%20%20%20%20%20castNames%0A%20%20%20%20%20%20%20%20genresNames%0A%20%20%20%20%20%20%20%20authorsNames%0A%20%20%20%20%20%20%20%20screenwritersNames%0A%20%20%20%20%20%20%20%20artDirectorsNames%0A%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%20%20%20%20%20%20%20%20%20%20portrait%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20poster%7B%0A%20%20%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20logo%20%7B%0A%20%20%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D' url = 'https://jarvis.globo.com/graphql?query={query}&variables={variables}'.format( query=query, variables=variables) control.log('GLOBOPLAY US - GET %s' % url) response = cache.get(requests.get, 24, url, headers=headers, table='globoplay').json() control.log(response) broadcasts = response['data']['broadcasts'] utc_now = int(control.to_timestamp(datetime.datetime.utcnow())) # thumb_usa = 'https://live-thumbs.video.globo.com/glbeua/snapshot/' + str(int(time.time())) result = [] for broadcast in broadcasts: media_id = str(broadcast.get('mediaId', 0)) if is_globosat_available and media_id != str( GLOBO_US_LIVE_SUBSCRIBER_MEDIA_ID): continue epg = next((epg for epg in broadcast['epgByDate']['entries'] if int(epg['startTime']) <= utc_now < int(epg['endTime'])), {}) control.log('EPG: %s' % epg) channel = broadcast.get('channel', {}) or {} logo = channel.get('logo') channel_name = channel.get('name', '').replace( 'TV Globo', 'Globo') + ' USA' # broadcast.get('media', {}).get('headline', '') fanart = broadcast.get('imageOnAir') channel_id = channel.get('id', 0) service_id = broadcast.get('media', {}).get('serviceId', 0) # channel_slug = '%s-americas' % channel.get('name', '').lower().replace(' ', '') duration = epg.get('durationInMinutes', 0) * 60 title_obj = epg.get('title', {}) or {} title = epg.get('name', '') description = title_obj.get('description') or epg.get( 'description', '') fanart = title_obj.get('cover', {}).get('landscape', fanart) or fanart poster = title_obj.get('poster', {}).get('web') label = '[B]' + channel_name + '[/B]' + ('[I] - ' + title + '[/I]' if title else '') program_datetime = datetime.datetime.utcfromtimestamp( epg.get('startTime', 0)) + util.get_utc_delta() next_start = datetime.datetime.utcfromtimestamp(epg.get( 'endTime', 0)) + util.get_utc_delta() plotoutline = datetime.datetime.strftime( program_datetime, '%H:%M') + ' - ' + datetime.datetime.strftime( next_start, '%H:%M') description = '%s | %s' % (plotoutline, description) tags = [plotoutline] if epg.get('liveBroadcast', False): tags.append(control.lang(32004)) tags.extend(epg.get('tags', []) or []) result.append({ 'handler': PLAYER_HANDLER, 'method': 'play_stream', 'IsPlayable': True, 'id': media_id, 'channel_id': channel_id, 'service_id': service_id, 'live': epg.get('liveBroadcast', False) or False, 'livefeed': True, 'label': label, 'title': label, # 'title': title, 'tvshowtitle': title, 'plot': description, # 'plotoutline': plotoutline, # "tagline": plotoutline, 'tag': tags, 'duration': duration, "dateadded": datetime.datetime.strftime(program_datetime, '%Y-%m-%d %H:%M:%S'), 'sorttitle': title, 'studio': 'Globoplay Americas', 'year': title_obj.get('releaseYear'), 'country': title_obj.get('countries', []), 'genre': title_obj.get('genresNames', []), 'cast': title_obj.get('castNames', []), 'director': title_obj.get('directorsNames', []), 'writer': title_obj.get('screenwritersNames', []), 'credits': title_obj.get('artDirectorsNames', []), 'mpaa': epg.get('contentRating'), "art": { 'icon': logo, 'clearlogo': logo, 'thumb': fanart, 'fanart': fanart, 'tvshow.poster': poster } }) return result
def addSearch(self, url): try: skip = 0 if '|SPLITER|' in url: keep = url url,matcher = url.split('|SPLITER|') skip = 1 section = 1 elif '|SECTION|' in url: matcher = url.replace('|SECTION|','') section = 1 else: section = 0 except: section = 0 link = 'https://t2k-repository.ml/IT/IT/tRmKGjTbr/xmls/clowns.xml' if skip == 0: if section == 1: keyboard = control.keyboard('', control.lang(30702).encode('utf-8')) keyboard.doModal() if not (keyboard.isConfirmed()): return url = keyboard.getText() keep = url + '|SPLITER|' + matcher else: if (url is None or url == ''): keyboard = control.keyboard('', control.lang(30702).encode('utf-8')) keyboard.doModal() if not (keyboard.isConfirmed()): return url = keyboard.getText() if (url is None or url == ''): return if section == 1: input = keep else: input = url def search(): return [input] query = cache.get(search, 600000000, table='rel_srch') def search(): return [x for y,x in enumerate((query + [input])) if x not in (query + [input])[:y]] cache.get(search, 0, table='rel_srch') links = client.request(link) links = re.findall('<link>(.+?)</link>', links) if section == 0: links = [i for i in links if str(i).startswith('http')] else: links = [i for i in links if str(i).startswith('http') and matcher.lower() in str(i).lower()] self.list = [] ; threads = [] for link in links: threads.append(workers.Thread(self.it_list, link)) [i.start() for i in threads] ; [i.join() for i in threads] self.list = [i for i in self.list if url.lower() in i['name'].lower()] for i in self.list: try: name = '' if not i['vip'] in ['No-Name TV']: name += '[B]%s[/B] | ' % i['vip'].upper() name += i['name'] i.update({'name' : name}) except: pass for i in self.list: i.update({'content': 'videos'}) self.addDirectory(self.list)
def accountCheck(self): if traktCredentials == False and imdbCredentials == False: control.idle() control.infoDialog(control.lang(32042), sound=True, icon='WARNING')
def clearCacheAll(self): yes = control.yesnoDialog(control.lang(32056)) if not yes: return from resources.lib.modules import cache cache.cache_clear_all() control.infoDialog(control.lang(32057), sound=True, icon='INFO')
def infoCheck(self, version): try: control.infoDialog('www.tvaddons.ag', control.lang(32074).encode('utf-8'), time=5000, sound=False) return '1' except: return '1'
def playlive(self, id, meta): control.log("Oi Play - play_stream: id=%s | meta=%s" % (id, meta)) if id is None: return try: url = self.geturl(id) except Exception as ex: control.okDialog(control.lang(31200), str(ex)) return encrypted = False # 'drm' in data and 'licenseUrl' in data['drm'] if encrypted: print('DRM Video!') if encrypted and not control.is_inputstream_available(): control.okDialog(control.lang(31200), control.lang(34103).encode('utf-8')) return # url = data['individualization']['url'] # url = url.replace('https://', 'http://') # hack # info = data['token']['cmsChannelItem'] # title = info['title'] control.log("live media url: %s" % url) try: meta = json.loads(meta) except: meta = { "playcount": 0, "overlay": 6, # "title": title, # "thumb": info['positiveLogoUrl'], # "mediatype": "video", # "aired": None, # "genre": info["categoryName"], # "plot": title, # "plotoutline": title } poster = meta['poster'] if 'poster' in meta else None thumb = meta['thumb'] if 'thumb' in meta else None self.offset = float(meta['milliseconds_watched']) / 1000.0 if 'milliseconds_watched' in meta else 0 self.isLive = True # info['isLive'] parsed_url = urlparse(url) if ".m3u8" in parsed_url.path: self.url, mime_type, stopEvent, cookies = hlshelper.pick_bandwidth(url) else: self.url = url mime_type, stopEvent, cookies = 'video/mp4', None, None if self.url is None: if stopEvent: control.log("Setting stop event for proxy player") stopEvent.set() control.infoDialog(control.lang(34100).encode('utf-8'), icon='ERROR') return control.log("Resolved URL: %s" % repr(self.url)) control.log("Parsed URL: %s" % repr(parsed_url)) item = control.item(path=self.url) item.setArt({'icon': thumb, 'thumb': thumb, 'poster': poster}) item.setProperty('IsPlayable', 'true') item.setInfo(type='Video', infoLabels=control.filter_info_labels(meta)) item.setContentLookup(False) # if ".mpd" in parsed_url.path: # mime_type = 'application/dash+xml' # item.setProperty('inputstream.adaptive.manifest_type', 'mpd') # if self.isLive: # item.setProperty('inputstream.adaptive.manifest_update_parameter', 'full') # # else: item.setProperty('inputstream.adaptive.manifest_type', 'hls') if encrypted: control.log("DRM: com.widevine.alpha") # licence_url = data['drm']['licenseUrl'] + '&token=' + data['drm']['jwtToken'] # item.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha') # item.setProperty('inputstream.adaptive.license_key', licence_url + "||R{SSM}|") # if mime_type: # item.setMimeType(mime_type) # control.log("MIME TYPE: %s" % repr(mime_type)) if not cookies and control.is_inputstream_available(): item.setProperty('inputstreamaddon', 'inputstream.adaptive') item.setProperty('inputstream', 'inputstream.adaptive') # Kodi 19 control.resolve(int(sys.argv[1]), True, item) control.log("Done playing. Quitting...")
def add(self, tvshowtitle, year, imdb, tvdb, range=False): if not control.condVisibility('Window.IsVisible(infodialog)') and not control.condVisibility('Player.HasVideo')\ and self.silentDialog is False: control.infoDialog(control.lang(32552).encode('utf-8'), time=10000000) self.infoDialog = True from resources.lib.indexers import episodes items = episodes.episodes().get(tvshowtitle, year, imdb, tvdb, idx=False) try: items = [{ 'title': i['title'], 'year': i['year'], 'imdb': i['imdb'], 'tvdb': i['tvdb'], 'season': i['season'], 'episode': i['episode'], 'tvshowtitle': i['tvshowtitle'], 'premiered': i['premiered'] } for i in items] except: items = [] try: if not self.dupe_setting == 'true': raise Exception() if items == []: raise Exception() id = [items[0]['imdb'], items[0]['tvdb']] lib = control.jsonrpc( '{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": {"properties" : ["imdbnumber", "title", "year"]}, "id": 1}' ) lib = unicode(lib, 'utf-8', errors='ignore') lib = json.loads(lib)['result']['tvshows'] lib = [ i['title'].encode('utf-8') for i in lib if str(i['imdbnumber']) in id or ( i['title'].encode('utf-8') == items[0]['tvshowtitle'] and str(i['year']) == items[0]['year']) ][0] lib = control.jsonrpc( '{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": {"filter":{"and": [{"field": "tvshow", "operator": "is", "value": "%s"}]}, "properties": ["season", "episode"]}, "id": 1}' % lib) lib = unicode(lib, 'utf-8', errors='ignore') lib = json.loads(lib)['result']['episodes'] lib = [ 'S%02dE%02d' % (int(i['season']), int(i['episode'])) for i in lib ] items = [ i for i in items if not 'S%02dE%02d' % (int(i['season']), int(i['episode'])) in lib ] except: pass files_added = 0 for i in items: try: if xbmc.abortRequested == True: return sys.exit() if self.check_setting == 'true': if i['episode'] == '1': self.block = True src = lib_tools.check_sources(i['title'], i['year'], i['imdb'], i['tvdb'], i['season'], i['episode'], i['tvshowtitle'], i['premiered']) if src: self.block = False if self.block == True: raise Exception() premiered = i.get('premiered', '0') if (premiered != '0' and int(re.sub('[^0-9]', '', str(premiered))) > int( self.date)) or (premiered == '0' and not self.include_unknown): continue self.strmFile(i) files_added += 1 except: pass if range == True: return if self.infoDialog is True: control.infoDialog(control.lang(32554).encode('utf-8'), time=1) if self.library_setting == 'true' and not control.condVisibility( 'Library.IsScanningVideo') and files_added > 0: control.execute('UpdateLibrary(video)')
def update(self, query=None, info='true'): if not query == None: control.idle() try: items = [] season, episode = [], [] show = [ os.path.join(self.library_folder, i) for i in control.listDir(self.library_folder)[0] ] for s in show: try: season += [ os.path.join(s, i) for i in control.listDir(s)[0] ] except: pass for s in season: try: episode.append([ os.path.join(s, i) for i in control.listDir(s)[1] if i.endswith('.strm') ][-1]) except: pass for file in episode: try: file = control.openFile(file) read = file.read() read = read.encode('utf-8') file.close() if not read.startswith(sys.argv[0]): raise Exception() params = dict(urlparse.parse_qsl(read.replace('?', ''))) try: tvshowtitle = params['tvshowtitle'] except: tvshowtitle = None try: tvshowtitle = params['show'] except: pass if tvshowtitle == None or tvshowtitle == '': raise Exception() year, imdb, tvdb = params['year'], params['imdb'], params[ 'tvdb'] imdb = 'tt' + re.sub('[^0-9]', '', str(imdb)) try: tmdb = params['tmdb'] except: tmdb = '0' items.append({ 'tvshowtitle': tvshowtitle, 'year': year, 'imdb': imdb, 'tmdb': tmdb, 'tvdb': tvdb }) except: pass items = [i for x, i in enumerate(items) if i not in items[x + 1:]] if len(items) == 0: raise Exception() except: return try: lib = control.jsonrpc( '{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": {"properties" : ["imdbnumber", "title", "year"]}, "id": 1}' ) lib = unicode(lib, 'utf-8', errors='ignore') lib = json.loads(lib)['result']['tvshows'] except: return if info == 'true' and not control.condVisibility( 'Window.IsVisible(infodialog)') and not control.condVisibility( 'Player.HasVideo'): control.infoDialog(control.lang(32553).encode('utf-8'), time=10000000) self.infoDialog = True try: control.makeFile(control.dataPath) dbcon = database.connect(control.libcacheFile) dbcur = dbcon.cursor() dbcur.execute("CREATE TABLE IF NOT EXISTS tvshows (" "id TEXT, " "items TEXT, " "UNIQUE(id)" ");") except: return try: from resources.lib.indexers import episodes except: return files_added = 0 # __init__ doesn't get called from services so self.date never gets updated and new episodes are not added to the library self.datetime = (datetime.datetime.utcnow() - datetime.timedelta(hours=5)) if control.setting('library.importdelay') != 'true': self.date = self.datetime.strftime('%Y%m%d') else: self.date = (self.datetime - datetime.timedelta(hours=24)).strftime('%Y%m%d') for item in items: it = None if xbmc.abortRequested == True: return sys.exit() try: dbcur.execute("SELECT * FROM tvshows WHERE id = '%s'" % item['tvdb']) fetch = dbcur.fetchone() it = eval(fetch[1].encode('utf-8')) except: pass try: if not it == None: raise Exception() it = episodes.episodes().get(item['tvshowtitle'], item['year'], item['imdb'], item['tvdb'], idx=False) status = it[0]['status'].lower() it = [{ 'title': i['title'], 'year': i['year'], 'imdb': i['imdb'], 'tvdb': i['tvdb'], 'season': i['season'], 'episode': i['episode'], 'tvshowtitle': i['tvshowtitle'], 'premiered': i['premiered'] } for i in it] if status == 'continuing': raise Exception() dbcur.execute("INSERT INTO tvshows Values (?, ?)", (item['tvdb'], repr(it))) dbcon.commit() except: pass try: id = [item['imdb'], item['tvdb']] if not item['tmdb'] == '0': id += [item['tmdb']] ep = [ x['title'].encode('utf-8') for x in lib if str(x['imdbnumber']) in id or ( x['title'].encode('utf-8') == item['tvshowtitle'] and str(x['year']) == item['year']) ][0] ep = control.jsonrpc( '{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": {"filter":{"and": [{"field": "tvshow", "operator": "is", "value": "%s"}]}, "properties": ["season", "episode"]}, "id": 1}' % ep) ep = unicode(ep, 'utf-8', errors='ignore') ep = json.loads(ep).get('result', {}).get('episodes', {}) ep = [{ 'season': int(i['season']), 'episode': int(i['episode']) } for i in ep] ep = sorted(ep, key=lambda x: (x['season'], x['episode']))[-1] num = [ x for x, y in enumerate(it) if str(y['season']) == str(ep['season']) and str(y['episode']) == str(ep['episode']) ][-1] it = [y for x, y in enumerate(it) if x > num] if len(it) == 0: continue except: continue for i in it: try: if xbmc.abortRequested == True: return sys.exit() premiered = i.get('premiered', '0') if (premiered != '0' and int(re.sub('[^0-9]', '', str(premiered))) > int(self.date)) or (premiered == '0' and not self.include_unknown): continue libtvshows().strmFile(i) files_added += 1 except: pass if self.infoDialog == True: control.infoDialog(control.lang(32554).encode('utf-8'), time=1) if self.library_setting == 'true' and not control.condVisibility( 'Library.IsScanningVideo') and files_added > 0: control.execute('UpdateLibrary(video)')
def addDirectory(self, items, mode=True): if items == None or len(items) == 0: return sysaddon = sys.argv[0] addonPoster = addonBanner = control.addonInfo('icon') addonFanart = control.addonInfo('fanart') try: devmode = True if 'testings.xml' in control.listDir( control.dataPath)[1] else False except: devmode = False if mode == True: mode = [i['content'] for i in items if 'content' in i] else: mode = [] if 'movies' in mode: mode = 'movies' elif 'tvshows' in mode: mode = 'tvshows' elif 'seasons' in mode: mode = 'seasons' elif 'episodes' in mode: mode = 'episodes' else: mode = None for i in items: try: try: name = control.lang(int(i['name'])).encode('utf-8') except: name = i['name'] url = '%s?action=%s' % (sysaddon, i['action']) try: url += '&url=%s' % urllib.quote_plus(i['url']) except: pass if i['action'] == 'plugin' and 'url' in i: url = i['url'] if i['action'] == 'developer' and not devmode == True: raise Exception() poster = i['poster'] if 'poster' in i else '0' banner = i['banner'] if 'banner' in i else '0' fanart = i['fanart'] if 'fanart' in i else '0' if poster == '0': poster = addonPoster if banner == '0' and poster == '0': banner = addonBanner elif banner == '0': banner = poster content = i['content'] if 'content' in i else '0' replaceItems = False if content == '0' else True folder = i['folder'] if 'folder' in i else True meta = dict((k, v) for k, v in i.iteritems() if not v == '0') try: meta.update({'duration': str(int(meta['duration']) * 60)}) except: pass cm = [] if content in ['movies', 'tvshows']: meta.update({ 'trailer': '%s?action=trailer&name=%s' % (sysaddon, urllib.quote_plus(name)) }) cm.append((control.lang(30707).encode('utf-8'), 'RunPlugin(%s?action=trailer&name=%s)' % (sysaddon, urllib.quote_plus(name)))) if content == 'movies': cm.append((control.lang(30708).encode('utf-8'), 'XBMC.Action(Info)')) elif content in ['tvshows', 'seasons']: cm.append((control.lang(30709).encode('utf-8'), 'XBMC.Action(Info)')) elif content == 'episodes': cm.append((control.lang(30710).encode('utf-8'), 'XBMC.Action(Info)')) if content == 'movies': try: dfile = '%s (%s)' % (data['title'], data['year']) except: dfile = name try: cm.append((control.lang(30722).encode( 'utf-8' ), 'RunPlugin(%s?action=addDownload&name=%s&url=%s&image=%s)' % (sysaddon, urllib.quote_plus(dfile), urllib.quote_plus(i['url']), urllib.quote_plus(poster)))) except: pass elif content == 'episodes': try: dfile = '%s S%02dE%02d' % (data['tvshowtitle'], int(data['season']), int(data['episode'])) except: dfile = name try: cm.append((control.lang(30722).encode( 'utf-8' ), 'RunPlugin(%s?action=addDownload&name=%s&url=%s&image=%s)' % (sysaddon, urllib.quote_plus(dfile), urllib.quote_plus(i['url']), urllib.quote_plus(poster)))) except: pass if mode == 'movies': cm.append((control.lang(30711).encode('utf-8'), 'RunPlugin(%s?action=addView&content=movies)' % sysaddon)) elif mode == 'tvshows': cm.append((control.lang(30712).encode('utf-8'), 'RunPlugin(%s?action=addView&content=tvshows)' % sysaddon)) elif mode == 'seasons': cm.append((control.lang(30713).encode('utf-8'), 'RunPlugin(%s?action=addView&content=seasons)' % sysaddon)) elif mode == 'episodes': cm.append( (control.lang(30714).encode('utf-8'), 'RunPlugin(%s?action=addView&content=episodes)' % sysaddon)) if devmode == True: try: cm.append(('Open in browser', 'RunPlugin(%s?action=browser&url=%s)' % (sysaddon, urllib.quote_plus(i['url'])))) except: pass if replaceItems == True: cm.append((control.lang(30725).encode('utf-8'), 'RunPlugin(%s?action=openSettings)' % sysaddon)) item = control.item(label=name, iconImage=poster, thumbnailImage=poster) try: item.setArt({ 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster, 'banner': banner, 'tvshow.banner': banner, 'season.banner': banner }) except: pass if not fanart == '0': item.setProperty('Fanart_Image', fanart) elif not addonFanart == None: item.setProperty('Fanart_Image', addonFanart) item.setInfo(type='Video', infoLabels=meta) item.addContextMenuItems(cm, replaceItems=replaceItems) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=folder) except: pass if not mode == None: control.content(int(sys.argv[1]), mode) control.directory(int(sys.argv[1]), cacheToDisc=True) if not mode == None: views.setView(mode)
def uploadLog(self): yes = control.yesnoDialog(control.lang(32056)) if not yes: return from resources.lib.modules import log_utils log_utils.upload_log()
def get(self, name, season, episode, imdb, year='0'): offset = '0' if control.setting('bookmarks') == 'true': if control.setting('bookmarks.trakt') == 'true': try: from resources.lib.modules import trakt if not episode is None: # Looking for a Episode progress traktInfo = trakt.getTraktAsJson( 'https://api.trakt.tv/sync/playback/episodes?extended=full' ) for i in traktInfo: if imdb == i['show']['ids']['imdb']: # Checking Episode Number if int(season ) == i['episode']['season'] and int( episode) == i['episode']['number']: # Calculating Offset to seconds offset = (float(i['progress'] / 100) * int(i['episode']['runtime']) * 60) else: # Looking for a Movie Progress traktInfo = trakt.getTraktAsJson( 'https://api.trakt.tv/sync/playback/episodes?extended=full' ) for i in traktInfo: if imdb == i['movie']['ids']['imdb']: # Calculating Offset to seconds offset = (float(i['progress'] / 100) * int(i['movie']['runtime']) * 60) if control.setting('bookmarks.auto') == 'false': try: yes = control.dialog.contextmenu([ "Resume", control.lang(32501).encode('utf-8'), ]) except: yes = control.yesnoDialog( "Resume", '', '', str(name), control.lang(32503).encode('utf-8'), control.lang(32501).encode('utf-8')) if yes: offset = '0' return offset except: return '0' else: try: offset = '0' if not control.setting('bookmarks') == 'true': raise Exception() idFile = hashlib.md5() for i in name: idFile.update(str(i)) for i in year: idFile.update(str(i)) idFile = str(idFile.hexdigest()) dbcon = database.connect(control.bookmarksFile) dbcur = dbcon.cursor() dbcur.execute( "SELECT * FROM bookmark WHERE idFile = '%s'" % idFile) match = dbcur.fetchone() self.offset = str(match[1]) dbcon.commit() if self.offset == '0': raise Exception() minutes, seconds = divmod(float(self.offset), 60) hours, minutes = divmod(minutes, 60) label = '%02d:%02d:%02d' % (hours, minutes, seconds) label = (control.lang(32502) % label).encode('utf-8') if control.setting('bookmarks.auto') == 'false': try: yes = control.dialog.contextmenu([ label, control.lang(32501).encode('utf-8'), ]) except: yes = control.yesnoDialog( label, '', '', str(name), control.lang(32503).encode('utf-8'), control.lang(32501).encode('utf-8')) if yes: self.offset = '0' return self.offset except: return offset else: return offset
def infoCheck(self, version): try: control.infoDialog('', control.lang(32074), time=5000, sound=False) return '1' except: return '1'
from resources.lib.modules import control from resources.lib.modules import trakt sysaddon = sys.argv[0] ; syshandle = int(sys.argv[1]) ; control.moderator() artPath = control.artPath() ; addonFanart = control.addonFanart() imdbCredentials = False if control.setting('imdb.user') == '' else True traktCredentials = trakt.getTraktCredentialsInfo() traktIndicators = trakt.getTraktIndicatorsInfo() queueMenu = control.lang(32065).encode('utf-8') class navigator: def root(self): self.addDirectoryItem(32001, 'movieNavigator', 'movies.png', 'DefaultMovies.png') self.addDirectoryItem(32002, 'tvNavigator', 'tvshows.png', 'DefaultTVShows.png') if not control.setting('lists.widget') == '0': self.addDirectoryItem(32003, 'mymovieNavigator', 'mymovies.png', 'DefaultVideoPlaylists.png') self.addDirectoryItem(32004, 'mytvNavigator', 'mytvshows.png', 'DefaultVideoPlaylists.png') if not control.setting('movie.widget') == '0': self.addDirectoryItem(32005, 'movieWidget', 'latest-movies.png', 'DefaultRecentlyAddedMovies.png') if (traktIndicators == True and not control.setting('tv.widget.alt') == '0') or (traktIndicators == False and not control.setting('tv.widget') == '0'):
def get(self, name, imdb, season, episode): try: import gzip, codecs from io import BytesIO import re, base64 import xmlrpc.client as xmlrpc_client except: log_utils.error() return try: langDict = {'Afrikaans': 'afr', 'Albanian': 'alb', 'Arabic': 'ara', 'Armenian': 'arm', 'Basque': 'baq', 'Bengali': 'ben', 'Bosnian': 'bos', 'Breton': 'bre', 'Bulgarian': 'bul', 'Burmese': 'bur', 'Catalan': 'cat', 'Chinese': 'chi', 'Croatian': 'hrv', 'Czech': 'cze', 'Danish': 'dan', 'Dutch': 'dut', 'English': 'eng', 'Esperanto': 'epo', 'Estonian': 'est', 'Finnish': 'fin', 'French': 'fre', 'Galician': 'glg', 'Georgian': 'geo', 'German': 'ger', 'Greek': 'ell', 'Hebrew': 'heb', 'Hindi': 'hin', 'Hungarian': 'hun', 'Icelandic': 'ice', 'Indonesian': 'ind', 'Italian': 'ita', 'Japanese': 'jpn', 'Kazakh': 'kaz', 'Khmer': 'khm', 'Korean': 'kor', 'Latvian': 'lav', 'Lithuanian': 'lit', 'Luxembourgish': 'ltz', 'Macedonian': 'mac', 'Malay': 'may', 'Malayalam': 'mal', 'Manipuri': 'mni', 'Mongolian': 'mon', 'Montenegrin': 'mne', 'Norwegian': 'nor', 'Occitan': 'oci', 'Persian': 'per', 'Polish': 'pol', 'Portuguese': 'por,pob', 'Portuguese(Brazil)': 'pob,por', 'Romanian': 'rum', 'Russian': 'rus', 'Serbian': 'scc', 'Sinhalese': 'sin', 'Slovak': 'slo', 'Slovenian': 'slv', 'Spanish': 'spa', 'Swahili': 'swa', 'Swedish': 'swe', 'Syriac': 'syr', 'Tagalog': 'tgl', 'Tamil': 'tam', 'Telugu': 'tel', 'Thai': 'tha', 'Turkish': 'tur', 'Ukrainian': 'ukr', 'Urdu': 'urd'} codePageDict = {'ara': 'cp1256', 'ar': 'cp1256', 'ell': 'cp1253', 'el': 'cp1253', 'heb': 'cp1255', 'he': 'cp1255', 'tur': 'cp1254', 'tr': 'cp1254', 'rus': 'cp1251', 'ru': 'cp1251'} quality = ['bluray', 'hdrip', 'brrip', 'bdrip', 'dvdrip', 'webrip', 'hdtv'] langs = [] try: try: langs = langDict[control.setting('subtitles.lang.1')].split(',') except: langs.append(langDict[control.setting('subtitles.lang.1')]) except: pass try: try: langs = langs + langDict[control.setting('subtitles.lang.2')].split(',') except: langs.append(langDict[control.setting('subtitles.lang.2')]) except: pass try: subLang = xbmc.Player().getSubtitles() except: subLang = '' if subLang == langs[0]: raise Exception() server = xmlrpc_client.Server('https://api.opensubtitles.org/xml-rpc', verbose=0) # token = server.LogIn('', '', 'en', 'XBMC_Subtitles_v1') token = server.LogIn('', '', 'en', 'XBMC_Subtitles_Unofficial_v5.2.14') # service.subtitles.opensubtitles_by_opensubtitles if 'token' not in token: return log_utils.log('OpenSubtitles Login failed: token=%s' % token, level=log_utils.LOGWARNING) else: token = token['token'] sublanguageid = ','.join(langs) imdbid = re.sub(r'[^0-9]', '', imdb) if not (season is None or episode is None): result = server.SearchSubtitles(token, [{'sublanguageid': sublanguageid, 'imdbid': imdbid, 'season': season, 'episode': episode}])['data'] fmt = ['hdtv'] else: result = server.SearchSubtitles(token, [{'sublanguageid': sublanguageid, 'imdbid': imdbid}])['data'] try: vidPath = xbmc.Player().getPlayingFile() except: vidPath = '' fmt = re.split(r'\.|\(|\)|\[|\]|\s|\-', vidPath) fmt = [i.lower() for i in fmt] fmt = [i for i in fmt if i in quality] filter = [] result = [i for i in result if i['SubSumCD'] == '1'] for lang in langs: filter += [i for i in result if i['SubLanguageID'] == lang and any(x in i['MovieReleaseName'].lower() for x in fmt)] filter += [i for i in result if i['SubLanguageID'] == lang and any(x in i['MovieReleaseName'].lower() for x in quality)] filter += [i for i in result if i['SubLanguageID'] == lang] try: lang = xbmc.convertLanguage(filter[0]['SubLanguageID'], xbmc.ISO_639_1) except: lang = filter[0]['SubLanguageID'] filename = filter[0]['SubFileName'] log_utils.log('downloaded subtitle=%s' % filename, level=log_utils.LOGDEBUG) content = [filter[0]['IDSubtitleFile'],] content = server.DownloadSubtitles(token, content) content = base64.b64decode(content['data'][0]['data']) content = gzip.GzipFile(fileobj=BytesIO(content)).read() subtitle = control.transPath('special://temp/') subtitle = control.joinPath(subtitle, 'TemporarySubs.%s.srt' % lang) log_utils.log('subtitle file = %s' % subtitle, level=log_utils.LOGDEBUG) codepage = codePageDict.get(lang, '') if codepage and control.setting('subtitles.utf') == 'true': try: content_encoded = codecs.decode(content, codepage) # check for kodi 19? content = codecs.encode(content_encoded, 'utf-8') # check for kodi 19? except: pass file = control.openFile(subtitle, 'w') file.write(content) file.close() xbmc.sleep(1000) xbmc.Player().setSubtitles(subtitle) if control.setting('subtitles.notification') == 'true': if Player().isPlayback(): control.sleep(500) control.notification(title=filename, message=control.lang(32191) % lang.upper()) except: log_utils.error()
def authTrakt(): try: if getTraktCredentialsInfo() == True: if control.yesnoDialog( control.lang(32511).encode('utf-8'), control.lang(32512).encode('utf-8'), '', 'Trakt'): control.setSetting(id='trakt.user', value='') control.setSetting(id='trakt.token', value='') control.setSetting(id='trakt.refresh', value='') raise Exception() result = getTraktAsJson('/oauth/device/code', {'client_id': V2_API_KEY}) verification_url = (control.lang(32513) % result['verification_url']).encode('utf-8') user_code = (control.lang(32514) % result['user_code']).encode('utf-8') expires_in = int(result['expires_in']) device_code = result['device_code'] interval = result['interval'] progressDialog = control.progressDialog progressDialog.create('Trakt', verification_url, user_code) for i in range(0, expires_in): try: if progressDialog.iscanceled(): break time.sleep(1) if not float(i) % interval == 0: raise Exception() r = getTraktAsJson( '/oauth/device/token', { 'client_id': V2_API_KEY, 'client_secret': CLIENT_SECRET, 'code': device_code }) if 'access_token' in r: break except: pass try: progressDialog.close() except: pass token, refresh = r['access_token'], r['refresh_token'] headers = { 'Content-Type': 'application/json', 'trakt-api-key': V2_API_KEY, 'trakt-api-version': 2, 'Authorization': 'Bearer %s' % token } result = client.request(urlparse.urljoin(BASE_URL, '/users/me'), headers=headers) result = utils.json_loads_as_str(result) user = result['username'] control.setSetting(id='trakt.user', value=user) control.setSetting(id='trakt.token', value=token) control.setSetting(id='trakt.refresh', value=refresh) raise Exception() except: control.openSettings('3.1')
from resources.lib.modules import control from resources.lib.modules import trakt from resources.lib.modules import cache from resources.lib.modules import api_keys artPath = control.artPath() addonFanart = control.addonFanart() imdbCredentials = False if control.setting('imdb.user') == '' else True traktCredentials = trakt.getTraktCredentialsInfo() traktIndicators = trakt.getTraktIndicatorsInfo() queueMenu = control.lang(32065) class navigator: def root(self): api_keys.chk() self.addDirectoryItem(32001, 'movieNavigator', 'movies.png', 'DefaultMovies.png') self.addDirectoryItem(32002, 'tvNavigator', 'tvshows.png', 'DefaultTVShows.png') if not control.setting('lists.widget') == '0': self.addDirectoryItem(32003, 'mymovieNavigator', 'mymovies.png', 'DefaultVideoPlaylists.png') self.addDirectoryItem(32004, 'mytvNavigator', 'mytvshows.png', 'DefaultVideoPlaylists.png')
def rdAuthorize(): try: CLIENT_ID = 'X245A4XAIBGVM' USER_AGENT = 'Kodi Maximus/3.0' if not '' in credentials()['realdebrid'].values(): if control.yesnoDialog( control.lang(32531).encode('utf-8'), control.lang(32532).encode('utf-8'), '', 'RealDebrid'): control.setSetting(id='realdebrid.id', value='') control.setSetting(id='realdebrid.secret', value='') control.setSetting(id='realdebrid.token', value='') control.setSetting(id='realdebrid.refresh', value='') control.setSetting(id='realdebrid.auth', value='') raise Exception() headers = {'User-Agent': USER_AGENT} url = 'https://api.real-debrid.com/oauth/v2/device/code?client_id=%s&new_credentials=yes' % ( CLIENT_ID) result = client.request(url, headers=headers) result = json.loads(result) verification_url = (control.lang(32533) % result['verification_url']).encode('utf-8') user_code = (control.lang(32534) % result['user_code']).encode('utf-8') device_code = result['device_code'] interval = result['interval'] progressDialog = control.progressDialog progressDialog.create('RealDebrid', verification_url, user_code) for i in range(0, 3600): try: if progressDialog.iscanceled(): break time.sleep(1) if not float(i) % interval == 0: raise Exception() url = 'https://api.real-debrid.com/oauth/v2/device/credentials?client_id=%s&code=%s' % ( CLIENT_ID, device_code) result = client.request(url, headers=headers, error=True) result = json.loads(result) if 'client_secret' in result: break except: pass try: progressDialog.close() except: pass id, secret = result['client_id'], result['client_secret'] url = 'https://api.real-debrid.com/oauth/v2/token' post = urllib.urlencode({ 'client_id': id, 'client_secret': secret, 'code': device_code, 'grant_type': 'http://oauth.net/grant_type/device/1.0' }) result = client.request(url, post=post, headers=headers) result = json.loads(result) token, refresh = result['access_token'], result['refresh_token'] control.setSetting(id='realdebrid.id', value=id) control.setSetting(id='realdebrid.secret', value=secret) control.setSetting(id='realdebrid.token', value=token) control.setSetting(id='realdebrid.refresh', value=refresh) control.setSetting(id='realdebrid.auth', value='*************') raise Exception() except: control.openSettings('3.16')
def add_uncached_torrent(self, magnet_url, pack=False): def _return_failed(message=control.lang(33586)): try: control.progressDialog.close() except: pass self.delete_torrent(torrent_id) control.hide() control.sleep(500) control.okDialog(title=control.lang(40018), message=message) return False control.busy() try: active_count = self.torrents_activeCount() if active_count['nb'] >= active_count['limit']: return _return_failed() except: pass interval = 5 stalled = ['magnet_error', 'error', 'virus', 'dead'] extensions = supported_video_extensions() torrent_id = self.add_magnet(magnet_url) if not torrent_id: return _return_failed() torrent_info = self.torrent_info(torrent_id) if 'error_code' in torrent_info: return _return_failed() status = torrent_info['status'] line = '%s\n%s\n%s' if status == 'magnet_conversion': line1 = control.lang(40013) line2 = torrent_info['filename'] line3 = control.lang(40012) % str(torrent_info['seeders']) timeout = 100 control.progressDialog.create(control.lang(40018), line % (line1, line2, line3)) while status == 'magnet_conversion' and timeout > 0: control.progressDialog.update(timeout, line % (line1, line2, line3)) if control.monitor.abortRequested(): return sysexit() try: if control.progressDialog.iscanceled(): return _return_failed(control.lang(40014)) except: pass timeout -= interval control.sleep(1000 * interval) torrent_info = self.torrent_info(torrent_id) status = torrent_info['status'] if any(x in status for x in stalled): return _return_failed() line3 = control.lang(40012) % str(torrent_info['seeders']) try: control.progressDialog.close() except: pass if status == 'downloaded': control.busy() return True if status == 'magnet_conversion': return _return_failed() if any(x in status for x in stalled): return _return_failed(status) if status == 'waiting_files_selection': video_files = [] all_files = torrent_info['files'] for item in all_files: if any(item['path'].lower().endswith(x) for x in extensions): video_files.append(item) if pack: try: if len(video_files) == 0: return _return_failed() video_files = sorted(video_files, key=lambda x: x['path']) torrent_keys = [str(i['id']) for i in video_files] if not torrent_keys: return _return_failed(control.lang(40014)) torrent_keys = ','.join(torrent_keys) self.add_torrent_select(torrent_id, torrent_keys) control.okDialog(title='default', message=control.lang(40017) % control.lang(40058)) control.hide() return True # returning true here causes "success" to be returned and resolve runs on non valid link except: return _return_failed() else: try: video = max(video_files, key=lambda x: x['bytes']) file_id = video['id'] except ValueError: return _return_failed() self.add_torrent_select(torrent_id, str(file_id)) control.sleep(2000) torrent_info = self.torrent_info(torrent_id) status = torrent_info['status'] if status == 'downloaded': control.hide() control.notification(message=control.lang(32057), icon=rd_icon) return True file_size = round(float(video['bytes']) / (1000**3), 2) line1 = '%s...' % (control.lang(40017) % control.lang(40058)) line2 = torrent_info['filename'] line3 = status control.progressDialog.create(control.lang(40018), line % (line1, line2, line3)) while not status == 'downloaded': control.sleep(1000 * interval) torrent_info = self.torrent_info(torrent_id) status = torrent_info['status'] if status == 'downloading': line3 = control.lang(40011) % ( file_size, round(float(torrent_info['speed']) / (1000**2), 2), torrent_info['seeders'], torrent_info['progress']) else: line3 = status control.progressDialog.update( int(float(torrent_info['progress'])), line % (line1, line2, line3)) if control.monitor.abortRequested(): return sysexit() try: if control.progressDialog.iscanceled(): if control.yesnoDialog( 'Delete RD download also?', 'No will continue the download', 'but close dialog'): return _return_failed(control.lang(40014)) else: control.progressDialog.close() control.hide() return False except: pass if any(x in status for x in stalled): return _return_failed() try: control.progressDialog.close() except: pass control.hide() return True control.hide() return False
def pick_bandwidth(url): bandwidth_setting_temp = control.setting('bandwidth') # In settings.xml - bandwidth # Auto = '0' # Adaptive = '1' # Manual = '2' # Max = '3' # Medium = '4' # Low = '5' if bandwidth_setting_temp == "1": bandwidth_setting = "Adaptive" elif bandwidth_setting_temp == "2": bandwidth_setting = "Manual" elif bandwidth_setting_temp == "3": bandwidth_setting = "Max" elif bandwidth_setting_temp == "4": bandwidth_setting = "Medium" elif bandwidth_setting_temp == "5": bandwidth_setting = "Low" else: bandwidth_setting = "Auto" if bandwidth_setting == 'Auto': cookie_jar = cookielib.MozillaCookieJar(control.cookieFile, None, None) cookie_jar.clear() cookie_jar.save(control.cookieFile, None, None) return url, None, None if bandwidth_setting == 'Adaptive': proxy = control.proxy_url maxbandwidth = get_max_bandwidth() url_resolver = hlsProxy() player_type_temp = control.setting('proxy_type') if player_type_temp == "0": player_type = "Downloader" else: player_type = "Redirect" player = HLSDownloader if player_type == 'Downloader' else HLSWriter if player_type == 'Redirect': player.DOWNLOAD_IN_BACKGROUND = False elif player_type != 'Downloader': player.DOWNLOAD_IN_BACKGROUND = True url, mime_type = url_resolver.resolve(url, proxy=proxy, maxbitrate=maxbandwidth, player=player) return url, mime_type, url_resolver.stopEvent playlist, cookies = m3u8.load(url) if playlist is None: return None, None, None bandwidth_options = [] for index, playlist_item in enumerate(playlist.playlists): bandwidth_options.append({ 'index': index, 'bandwidth': str(playlist.playlists[index].stream_info.bandwidth) }) bandwidth_options = sorted(bandwidth_options, key=lambda k: int(k['bandwidth'])) if bandwidth_setting == 'Manual': options = [] options = options + [b['bandwidth'] for b in bandwidth_options] dialog = xbmcgui.Dialog() bandwidth = dialog.select(control.lang(34010).encode('utf-8'), options) else: if bandwidth_setting == 'Max': bandwidth = len(bandwidth_options) - 1 elif bandwidth_setting == 'Medium': bandwidth = len(bandwidth_options) - 2 elif bandwidth_setting == 'Low': bandwidth = 1 cookies_str = urllib.urlencode(cookies.get_dict()).replace('&', '; ') + ';' url = '%s|Cookie=%s' % (playlist.playlists[ bandwidth_options[bandwidth]['index']].absolute_uri, cookies_str) xbmc.log("FINAL URL: %s" % url, level=xbmc.LOGNOTICE) cookie_jar = cookielib.MozillaCookieJar(control.cookieFile, None, None) cookie_jar.clear() for cookie in cookies: cookie_jar.set_cookie(cookie) cookie_jar.save(control.cookieFile, None, None) return url, None, None
def my_downloads_to_listItem(self, page): try: from datetime import datetime import time sysaddon, syshandle = argv[0], int(argv[1]) my_downloads, pages = self.downloads(page) except: my_downloads = None if not my_downloads: return extensions = supported_video_extensions() my_downloads = [ i for i in my_downloads if i['download'].lower().endswith(tuple(extensions)) ] downloadMenu, deleteMenu = control.lang(40048), control.lang(40050) for count, item in enumerate(my_downloads, 1): if page > 1: count += (page - 1) * 50 try: cm = [] try: datetime_object = datetime.strptime( item['generated'], FormatDateTime).date() except TypeError: datetime_object = datetime( *(time.strptime(item['generated'], FormatDateTime)[0:6] )).date() name = control.strip_non_ascii_and_unprintable( item['filename']) size = float(int(item['filesize'])) / 1073741824 label = '%02d | %.2f GB | %s | [I]%s [/I]' % ( count, size, datetime_object, name) url_link = item['download'] url = '%s?action=play_URL&url=%s' % (sysaddon, url_link) cm.append(( downloadMenu, 'RunPlugin(%s?action=download&name=%s&image=%s&url=%s&caller=realdebrid)' % (sysaddon, quote_plus(name), quote_plus(rd_icon), url_link))) cm.append( (deleteMenu % 'File', 'RunPlugin(%s?action=rd_DeleteDownload&id=%s&name=%s)' % (sysaddon, item['id'], name))) item = control.item(label=label) item.addContextMenuItems(cm) item.setArt({ 'icon': rd_icon, 'poster': rd_icon, 'thumb': rd_icon, 'fanart': addonFanart, 'banner': rd_icon }) item.setInfo(type='video', infoLabels='') control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except: log_utils.error() if page < pages: page += 1 next = True else: next = False if next: try: nextMenu = control.lang(32053) url = '%s?action=rd_MyDownloads&query=%s' % (sysaddon, page) page = ' [I](%s)[/I]' % page nextMenu = '[COLOR skyblue]' + nextMenu + page + '[/COLOR]' item = control.item(label=nextMenu) icon = control.addonNext() item.setArt({ 'icon': rd_icon, 'poster': rd_icon, 'thumb': rd_icon, 'fanart': addonFanart, 'banner': rd_icon }) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: log_utils.error() control.content(syshandle, 'files') control.directory(syshandle, cacheToDisc=True)
def addDirectory(self, items, queue=False): if items is None or len(items) == 0: return sysaddon = sys.argv[0] addonPoster = addonBanner = control.addonInfo('icon') addonFanart = control.addonInfo('fanart') playlist = control.playlist if not queue is False: playlist.clear() try: devmode = True if 'testings.xml' in control.listDir(control.dataPath)[1] else False except: devmode = False mode = [i['content'] for i in items if 'content' in i] if 'movies' in mode: mode = 'movies' elif 'tvshows' in mode: mode = 'tvshows' elif 'seasons' in mode: mode = 'seasons' elif 'episodes' in mode: mode = 'episodes' elif 'videos' in mode: mode = 'videos' else: mode = 'addons' for i in items: try: try: name = control.lang(int(i['name'])).encode('utf-8') except: name = i['name'] if name == '': name = i['name'] url = '%s?action=%s' % (sysaddon, i['action']) try: url += '&url=%s' % quote_plus(i['url']) except: pass try: url += '&content=%s' % quote_plus(i['content']) except: pass if i['action'] == 'plugin' and 'url' in i: url = i['url'] try: devurl = dict(parse_qsl(urlparse(url).query))['action'] except: devurl = None if devurl == 'developer' and not devmode is True: raise Exception() poster = i['poster'] if 'poster' in i else '0' banner = i['banner'] if 'banner' in i else '0' fanart = i['fanart'] if 'fanart' in i else '0' if poster == '0': poster = addonPoster if banner == '0' and poster == '0': banner = addonBanner elif banner == '0': banner = poster content = i['content'] if 'content' in i else '0' folder = i['folder'] if 'folder' in i else True # meta = dict((k, v) for k, v in i.iteritems() if v != '0') meta = dict((k, v) for k, v in i.iteritems() if v != '0' and v != '') cm = [] if content in ['movies', 'tvshows']: meta.update({'trailer': '%s?action=trailer&name=%s' % (sysaddon, quote_plus(name))}) cm.append((control.lang(30707).encode('utf-8'), 'RunPlugin(%s?action=trailer&name=%s)' % (sysaddon, quote_plus(name)))) if content in ['movies', 'tvshows', 'seasons', 'episodes']: cm.append((control.lang(30708).encode('utf-8'), 'XBMC.Action(Info)')) if (folder is False and not '|regex=' in str(i.get('url'))) or (folder is True and content in ['tvshows', 'seasons']): cm.append((control.lang(30723).encode('utf-8'), 'RunPlugin(%s?action=queueItem)' % sysaddon)) if content == 'movies': try: dfile = '%s (%s)' % (i['title'], i['year']) except: dfile = name try: cm.append((control.lang(30722).encode('utf-8'), 'RunPlugin(%s?action=addDownload&name=%s&url=%s&image=%s)' % (sysaddon, quote_plus(dfile), quote_plus(i['url']), quote_plus(poster)))) except: pass elif content == 'episodes': try: dfile = '%s S%02dE%02d' % (i['tvshowtitle'], int(i['season']), int(i['episode'])) except: dfile = name try: cm.append((control.lang(30722).encode('utf-8'), 'RunPlugin(%s?action=addDownload&name=%s&url=%s&image=%s)' % (sysaddon, quote_plus(dfile), quote_plus(i['url']), quote_plus(poster)))) except: pass elif content == 'songs': try: cm.append((control.lang(30722).encode('utf-8'), 'RunPlugin(%s?action=addDownload&name=%s&url=%s&image=%s)' % (sysaddon, quote_plus(name), quote_plus(i['url']), quote_plus(poster)))) except: pass if mode == 'movies': cm.append((control.lang(30711).encode('utf-8'), 'RunPlugin(%s?action=addView&content=movies)' % sysaddon)) elif mode == 'tvshows': cm.append((control.lang(30712).encode('utf-8'), 'RunPlugin(%s?action=addView&content=tvshows)' % sysaddon)) elif mode == 'seasons': cm.append((control.lang(30713).encode('utf-8'), 'RunPlugin(%s?action=addView&content=seasons)' % sysaddon)) elif mode == 'episodes': cm.append((control.lang(30714).encode('utf-8'), 'RunPlugin(%s?action=addView&content=episodes)' % sysaddon)) if devmode is True: try: cm.append(('Open in browser', 'RunPlugin(%s?action=browser&url=%s)' % (sysaddon, quote_plus(i['url'])))) except: pass item = control.item(label=name, iconImage=poster, thumbnailImage=poster) if fanart == '0': fanart = addonFanart try: item.setArt({'poster': poster, 'fanart': fanart, 'tvshow.poster': poster, 'season.poster': poster, 'banner': banner, 'tvshow.banner': banner, 'season.banner': banner}) except: pass if queue is False: item.setInfo(type='Video', infoLabels = meta) item.addContextMenuItems(cm) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=folder) else: item.setInfo(type='Video', infoLabels = meta) playlist.add(url=url, listitem=item) except: pass if not queue is False: return control.player.play(playlist) try: i = items[0] if i['next'] == '': raise Exception() # nextMenu = control.lang(32053).encode('utf-8') # page = ' [I](%s)[/I]' % str(url.split('&page=', 1)[1]) # nextMenu = '[COLOR skyblue]' + nextMenu + page + '[/COLOR]' url = '%s?action=%s&url=%s' % (sysaddon, i['nextaction'], quote_plus(i['next'])) item = control.item(label=control.lang(30500).encode('utf-8')) item.setArt({'addonPoster': addonPoster, 'thumb': addonPoster, 'poster': addonPoster, 'fanart': addonFanart, 'tvshow.poster': addonPoster, 'season.poster': addonPoster, 'banner': addonPoster, 'tvshow.banner': addonPoster, 'season.banner': addonPoster}) control.addItem(handle=int(sys.argv[1]), url=url, listitem=item, isFolder=True) except: pass if not mode is None: control.content(int(sys.argv[1]), mode) control.directory(int(sys.argv[1]), cacheToDisc=True) if mode in ['movies', 'tvshows', 'seasons', 'episodes']: views.setView(mode, {'skin.estuary': 55})
def browse_user_torrents(self, folder_id): try: sysaddon, syshandle = argv[0], int(argv[1]) torrent_files = self.torrent_info(folder_id) except: return extensions = supported_video_extensions() try: file_info = [ i for i in torrent_files['files'] if i['path'].lower().endswith(tuple(extensions)) ] file_urls = torrent_files['links'] for c, i in enumerate(file_info): try: i.update({'url_link': file_urls[c]}) except: pass pack_info = sorted(file_info, key=lambda k: k['path']) except: if self.server_notifications: control.notification( message='Real-Debrid Error: browse_user_torrents failed', icon=rd_icon) log_utils.log('Real-Debrid Error: browse_user_torrents failed', __name__, log_utils.LOGWARNING) return file_str, downloadMenu, renameMenu, deleteMenu, clearFinishedMenu = \ control.lang(40047).upper(), control.lang(40048), control.lang(40049), control.lang(40050), control.lang(40051) for count, item in enumerate(pack_info, 1): try: cm = [] try: url_link = item['url_link'] except: continue if url_link.startswith('/'): url_link = 'http' + url_link name = item['path'] if name.startswith('/'): name = name.split('/')[-1] size = float(int(item['bytes'])) / 1073741824 label = '%02d | [B]%s[/B] | %.2f GB | [I]%s [/I]' % ( count, file_str, size, name) url = '%s?action=play_URL&url=%s&caller=realdebrid&type=unrestrict' % ( sysaddon, url_link) cm.append(( downloadMenu, 'RunPlugin(%s?action=download&name=%s&image=%s&url=%s&caller=realdebrid&type=unrestrict)' % (sysaddon, quote_plus(name), quote_plus(rd_icon), url_link))) cm.append(( deleteMenu % 'Torrent', 'RunPlugin(%s?action=rd_DeleteUserTorrent&id=%s&name=%s)' % (sysaddon, item['id'], quote_plus(name)))) item = control.item(label=label) item.addContextMenuItems(cm) item.setArt({ 'icon': rd_icon, 'poster': rd_icon, 'thumb': rd_icon, 'fanart': addonFanart, 'banner': rd_icon }) item.setInfo(type='video', infoLabels='') control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except: log_utils.error() control.content(syshandle, 'files') control.directory(syshandle, cacheToDisc=True)
def get_mais_canais(): query = 'query%20getBroadcastList%20%7B%0A%20%20%20%20%20%20broadcasts%20%7B%0A%20%20%20%20%20%20%20%20...broadcastFragment%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20fragment%20broadcastFragment%20on%20Broadcast%20%7B%0A%20%20%20%20%20%20mediaId%0A%20%20%20%20%20%20transmissionId%0A%20%20%20%20%20%20logo%0A%20%20%20%20%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20%20%20%20%20withoutDVRMediaId%0A%20%20%20%20%20%20promotionalMediaId%0A%20%20%20%20%20%20salesPageCallToAction%0A%20%20%20%20%20%20promotionalText%0A%20%20%20%20%20%20geofencing%0A%20%20%20%20%20%20geoblocked%0A%20%20%20%20%20%20ignoreAdvertisements%0A%20%20%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20color%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%20%20%20%20%20%20requireUserTeam%0A%20%20%20%20%20%20%20%20payTvServiceId%0A%20%20%20%20%20%20%20%20payTvUsersMessage%0A%20%20%20%20%20%20%20%20payTvExternalLink%0A%20%20%20%20%20%20%20%20payTvExternalLinkLabel%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20epgCurrentSlots%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20tags%0A%20%20%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20%20%20title%7B%0A%20%20%20%20%20%20%20%20%20%20poster%7B%0A%20%20%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20landscape%0A%20%20%20%20%20%20%20%20%20%20%20%20portrait%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20%20%20type%0A%20%20%20%20%20%20%20%20%20%20format%0A%20%20%20%20%20%20%20%20%20%20countries%0A%20%20%20%20%20%20%20%20%20%20directors%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20cast%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20genres%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20media%20%7B%0A%20%20%20%20%20%20%20%20serviceId%0A%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20thumb%28size%3A%20720%29%0A%20%20%20%20%20%20%20%20availableFor%0A%20%20%20%20%20%20%20%20title%20%7B%0A%20%20%20%20%20%20%20%20%20%20slug%0A%20%20%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20subscriptionService%20%7B%0A%20%20%20%20%20%20%20%20%20%20faq%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20url%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20salesPage%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20identifier%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D' variables = '{}' response = request_query(query, variables, force_refresh=True) or {} for broadcast in response.get('data', {}).get('broadcasts', []) or []: channel = broadcast.get('channel', {}) or {} if channel.get('id') == '196': continue media_id = str(broadcast.get('mediaId', 0)) epg = next((epg for epg in broadcast.get('epgCurrentSlots', [])), {}) control.log('EPG: %s' % epg) logo = channel.get('logo') channel_name = broadcast.get('media', {}).get('headline', '').replace( 'Agora no ', '').replace('Agora na ', '').strip() #channel.get('name', '') fanart = broadcast.get('imageOnAir') channel_id = channel.get('id', 0) service_id = broadcast.get('media', {}).get('serviceId', 0) # channel_slug = '%s-americas' % channel.get('name', '').lower().replace(' ', '') duration = epg.get('durationInMinutes', 0) * 60 title_obj = epg.get('title', {}) or {} title = epg.get('name', '') description = title_obj.get('description') or epg.get( 'description', '') fanart = title_obj.get('cover', {}).get('landscape', fanart) or fanart poster = title_obj.get('poster', {}).get('web') thumb = THUMBS.get(str(broadcast.get('transmissionId'))) thumb = (SNAPSHOT_URL.format(transmission=thumb) + '?=' + str(int(time.time()))) if thumb else fanart label = '[B]' + channel_name + '[/B]' + ('[I] - ' + title + '[/I]' if title else '') program_datetime = datetime.datetime.utcfromtimestamp( epg.get('startTime', 0)) + util.get_utc_delta() next_start = datetime.datetime.utcfromtimestamp(epg.get( 'endTime', 0)) + util.get_utc_delta() plotoutline = datetime.datetime.strftime( program_datetime, '%H:%M') + ' - ' + datetime.datetime.strftime( next_start, '%H:%M') description = '%s | %s' % (plotoutline, description) tags = [plotoutline] if epg.get('liveBroadcast', False): tags.append(control.lang(32004)) tags.extend(epg.get('tags', []) or []) yield { 'handler': PLAYER_HANDLER, 'method': 'play_stream', 'IsPlayable': True, 'id': media_id, 'channel_id': channel_id, 'service_id': service_id, 'live': epg.get('liveBroadcast', False) or False, 'livefeed': True, 'label': label, 'title': label, # 'title': title, 'tvshowtitle': title, 'plot': description, # 'plotoutline': plotoutline, # "tagline": plotoutline, 'tag': tags, 'duration': duration, "dateadded": datetime.datetime.strftime(program_datetime, '%Y-%m-%d %H:%M:%S'), 'sorttitle': title, 'studio': 'Globoplay', 'year': title_obj.get('releaseYear'), 'country': title_obj.get('countries', []), 'genre': title_obj.get('genresNames', []), 'cast': title_obj.get('castNames', []), 'director': title_obj.get('directorsNames', []), 'writer': title_obj.get('screenwritersNames', []), 'credits': title_obj.get('artDirectorsNames', []), 'mpaa': epg.get('contentRating'), "art": { 'icon': logo, 'clearlogo': logo, 'thumb': thumb, 'fanart': fanart, 'tvshow.poster': poster } }
def movieDirectory(self, items): if items is None or len(items) == 0: control.idle() sys.exit() sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) addonPoster, addonBanner = control.addonPoster(), control.addonBanner() addonFanart, settingFanart = control.addonFanart(), control.setting( 'fanart') traktCredentials = trakt.getTraktCredentialsInfo() show_trailers = True if control.setting( 'showtrailers') == 'true' else False try: isOld = False control.item().getArt('type') except Exception: isOld = True isPlayable = 'true' if 'plugin' not in control.infoLabel( 'Container.PluginName') else 'false' indicators = playcount.getMovieIndicators() playbackMenu = control.lang(32063).encode('utf-8') if control.setting( 'hosts.mode') == '2' else control.lang(32064).encode('utf-8') watchedMenu = control.lang(32068).encode( 'utf-8') if trakt.getTraktIndicatorsInfo( ) is True else control.lang(32066).encode('utf-8') unwatchedMenu = control.lang(32069).encode( 'utf-8') if trakt.getTraktIndicatorsInfo( ) is True else control.lang(32067).encode('utf-8') queueMenu = control.lang(32065).encode('utf-8') traktManagerMenu = control.lang(32070).encode('utf-8') nextMenu = control.lang(32053).encode('utf-8') addToLibrary = control.lang(32551).encode('utf-8') for i in items: try: label = '%s (%s)' % (i['title'], i['year']) imdb, tmdb, title, year = i['imdb'], i['tmdb'], i[ 'originaltitle'], i['year'] sysname = urllib.quote_plus('%s (%s)' % (title, year)) systitle = urllib.quote_plus(title) meta = dict((k, v) for k, v in i.iteritems() if not v == '0') meta.update({ 'code': imdb, 'imdbnumber': imdb, 'imdb_id': imdb }) meta.update({'tmdb_id': tmdb}) meta.update({'mediatype': 'movie'}) meta.update({ 'trailer': '%s?action=trailer&name=%s' % (sysaddon, urllib.quote_plus(label)) }) # meta.update({'trailer': 'plugin://script.extendedinfo/?info=playtrailer&&id=%s' % imdb}) if 'duration' not in i: meta.update({'duration': '120'}) elif i['duration'] == '0': meta.update({'duration': '120'}) try: meta.update({'duration': str(int(meta['duration']) * 60)}) except Exception: pass try: meta.update( {'genre': cleangenre.lang(meta['genre'], 'en')}) except Exception: pass poster = [ i[x] for x in ['poster3', 'poster', 'poster2'] if i.get(x, '0') != '0' ] poster = poster[0] if poster else addonPoster meta.update({'poster': poster}) sysmeta = urllib.quote_plus(json.dumps(meta)) url = '%s?action=play&title=%s&year=%s&imdb=%s&meta=%s&t=%s' % ( sysaddon, systitle, year, imdb, sysmeta, self.systime) sysurl = urllib.quote_plus(url) cm = [] if show_trailers is True: cm.append(('Watch Trailer', 'RunPlugin(%s?action=trailer&name=%s)' % (sysaddon, urllib.quote_plus(label)))) cm.append( (queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) try: overlay = int(playcount.getMovieOverlay(indicators, imdb)) if overlay == 7: cm.append(( unwatchedMenu, 'RunPlugin(%s?action=moviePlaycount&imdb=%s&query=6)' % (sysaddon, imdb))) meta.update({'playcount': 1, 'overlay': 7}) else: cm.append(( watchedMenu, 'RunPlugin(%s?action=moviePlaycount&imdb=%s&query=7)' % (sysaddon, imdb))) meta.update({'playcount': 0, 'overlay': 6}) except Exception: pass if traktCredentials is True: cm.append(( traktManagerMenu, 'RunPlugin(%s?action=traktManager&name=%s&imdb=%s&content=movie)' % (sysaddon, sysname, imdb))) cm.append((playbackMenu, 'RunPlugin(%s?action=alterSources&url=%s&meta=%s)' % (sysaddon, sysurl, sysmeta))) if isOld is True: cm.append( (control.lang2(19033).encode('utf-8'), 'Action(Info)')) cm.append(( addToLibrary, 'RunPlugin(%s?action=movieToLibrary&name=%s&title=%s&year=%s&imdb=%s&tmdb=%s)' % (sysaddon, sysname, systitle, year, imdb, tmdb))) item = control.item(label=label) art = {} art.update({'icon': poster, 'thumb': poster, 'poster': poster}) if 'banner' in i and not i['banner'] == '0': art.update({'banner': i['banner']}) else: art.update({'banner': addonBanner}) if 'clearlogo' in i and not i['clearlogo'] == '0': art.update({'clearlogo': i['clearlogo']}) if 'clearart' in i and not i['clearart'] == '0': art.update({'clearart': i['clearart']}) if settingFanart == 'true' and 'fanart2' in i and not i[ 'fanart2'] == '0': item.setProperty('Fanart_Image', i['fanart2']) elif settingFanart == 'true' and 'fanart' in i and not i[ 'fanart'] == '0': item.setProperty('Fanart_Image', i['fanart']) elif addonFanart is not None: item.setProperty('Fanart_Image', addonFanart) item.setArt(art) item.addContextMenuItems(cm) item.setProperty('IsPlayable', isPlayable) item.setInfo(type='Video', infoLabels=meta) video_streaminfo = {'codec': 'h264'} item.addStreamInfo('video', video_streaminfo) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except Exception: pass try: url = items[0]['next'] if url == '': raise Exception() icon = control.addonNext() url = '%s?action=moviePage&url=%s' % (sysaddon, urllib.quote_plus(url)) item = control.item(label=nextMenu) item.setArt({ 'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon }) if addonFanart is not None: item.setProperty('Fanart_Image', addonFanart) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except Exception: pass # control.content(syshandle, 'movies') # control.directory(syshandle, cacheToDisc=True) # views.setView('movies', {'skin.estuary': 55, 'skin.confluence': 500}) self.endDirectory(contentType='movies', sortMethod=control.xDirSort.Label, category='Boxset List')
pass else: try: r += '&' + p + '=' + quote_plus(rlist[rand][p]) except: pass try: r += '&meta=' + quote_plus(json.dumps(rlist[rand])) except: r += '&meta=' + quote_plus("{}") if rtype == "movie": try: control.infoDialog(rlist[rand]['title'], control.lang(32536).encode('utf-8'), time=30000) except: pass elif rtype == "episode": try: control.infoDialog(rlist[rand]['tvshowtitle'] + " - Season " + rlist[rand]['season'] + " - " + rlist[rand]['title'], control.lang(32536).encode('utf-8'), time=30000) except: pass control.execute('RunPlugin(%s)' % r) except:
def _select_resource(video_id, resources, metadata, title_override=None): resource = None encrypted = False player = 'android' drm_scheme = None enable_4k = control.is_4k_enabled enable_hdr = control.setting('enable_hdr') == 'true' prefer_dash = control.setting('prefer_dash') == 'true' prefer_smoothstreaming = control.setting( 'prefer_smoothstreaming') == 'true' prefer_playready = control.setting('prefer_playready') == 'true' if prefer_smoothstreaming: for node in resources: if 'players' in node and 'encrypted' in node and node[ 'encrypted'] and any( 'smoothstreaming' in s for s in node['players']) and any( 'playready' in s for s in node['content_protection']): encrypted = True resource = node player = 'android_native' drm_scheme = 'com.microsoft.playready' server_url = resource['content_protection']['playready'][ 'server'] break if prefer_playready and not resource: try_player = 'androidtv_hdr' if enable_hdr else 'androidtv_sdr' if enable_4k else 'androidtv' for node in resources: if 'players' in node and 'encrypted' in node and node[ 'encrypted'] and any( try_player in s for s in node['players']) and any( 'playready' in s for s in node['content_protection']): encrypted = True resource = node player = try_player drm_scheme = 'com.microsoft.playready' server_url = resource['content_protection']['playready'][ 'server'] break if not resource: for node in resources: if 'players' in node and 'encrypted' in node and node[ 'encrypted'] and any( 'android_native' in s for s in node['players']) and any( 'playready' in s for s in node['content_protection']): encrypted = True resource = node player = 'android_native' drm_scheme = 'com.microsoft.playready' server_url = resource['content_protection']['playready'][ 'server'] break if not resource: for node in resources: if 'players' in node and 'encrypted' in node and node[ 'encrypted'] and any( 'android_native' in s for s in node['players']) and any( 'widevine' in s for s in node['content_protection']): encrypted = True resource = node player = 'android_native' drm_scheme = 'com.widevine.alpha' server_url = resource['content_protection']['widevine'][ 'server'] break if not resource and enable_4k and prefer_dash: for node in resources: if 'players' in node and any('tv_4k_dash' in s for s in node['players']): resource = node player = 'tv_4k_dash' break if not resource and prefer_dash: for node in resources: if 'players' in node and any('tv_dash' in s for s in node['players']): resource = node player = 'tv_dash' break if not resource and enable_4k and (not prefer_dash or not control.is_inputstream_available()): for node in resources: if 'players' in node and any( 'tvos_4k' in s for s in node['players'] ) and '2160' in node['_id'] and not node.get('encrypted', False): resource = node player = 'tvos_4k' break if not resource and enable_4k and enable_hdr: for node in resources: # if 'players' in node and 'height' in node and node['height'] == 2160 and any('androidtv_hdr' in s for s in node['players']): if 'players' in node and any('androidtv_hdr' in s for s in node['players']): resource = node player = 'androidtv_hdr' break if not resource and enable_4k: for node in resources: # if 'players' in node and 'height' in node and node['height'] == 2160 and any('androidtv_sdr' in s for s in node['players']): if 'players' in node and any('androidtv_sdr' in s for s in node['players']): resource = node player = 'androidtv_sdr' break #Prefer MP4 when available if not resource: for node in resources: if 'players' in node and 'height' in node and node[ 'height'] == 720 and any('desktop' in s for s in node['players']): resource = node player = 'android' break if not resource: for node in resources: if 'players' in node and any('androidtv' in s for s in node['players']): resource = node player = 'androidtv' break if not resource: for node in resources: if 'players' in node and any('android' in s for s in node['players']): resource = node player = 'android' break if (resource or None) is None: control.infoDialog(message=control.lang(34102).encode('utf-8'), sound=True, icon='ERROR') return None control.log('Selected resource for video %s: %s' % (video_id, resource['_id'])) subtitles = [] for subtitle in resources: if 'type' in subtitle and subtitle['type'] == 'subtitle': control.log('Found Subtitle: %s' % subtitle['url']) subtitles.append({ 'language': subtitle['language'], 'url': subtitle['url'] }) result = { "resource_id": resource['_id'], "id": video_id, "title": title_override or metadata["title"], "program": metadata["program"], "program_id": metadata["program_id"], "provider_id": metadata["provider_id"], "channel": metadata["channel"], "channel_id": metadata["channel_id"], "category": metadata["category"], "subscriber_only": metadata["subscriber_only"], "exhibited_at": metadata["exhibited_at"], "player": player, "version": PLAYER_VERSION, "url": resource["url"], "query_string_template": resource["query_string_template"], "thumbUri": resource["thumbUri"] if 'thumbUri' in resource else None, "encrypted": encrypted, "drm_scheme": drm_scheme, "protection_url": server_url.replace(DEVICE_ID_KEY, DEVICE_ID) if encrypted else None, 'subtitles': subtitles } control.log(result) return result
def onAction(self, action): try: if action in self.selection_actions: focus_id = self.getFocusId() if focus_id == 2050: # listItems position = self.get_position(self.window_id) chosen_listitem = self.item_list[position] trakt = chosen_listitem.getProperty('dg.trakt') if chosen_listitem.getProperty('dg.isSelected') == 'true': chosen_listitem.setProperty('dg.isSelected', '') if trakt in self.selected_items: self.selected_items.remove(trakt) else: chosen_listitem.setProperty('dg.isSelected', 'true') self.selected_items.append(trakt) elif focus_id == 2051: # OK Button self.close() elif focus_id == 2052: # Cancel Button self.selected_items = None self.close() elif focus_id == 2053: # Select All Button for item in self.item_list: item.setProperty('dg.isSelected', 'true') elif focus_id == 2045: # Stop Trailer Playback Button self.execute_code('PlayerControl(Stop)') sleep(500) self.setFocusId(self.window_id) elif action in self.context_actions: cm = [] chosen_listitem = self.item_list[self.get_position( self.window_id)] media_type = chosen_listitem.getProperty('dg.media_type') source_trailer = chosen_listitem.getProperty('dg.trailer') if not source_trailer: from resources.lib.modules import trailer if media_type == 'show': source_trailer = trailer.Trailer().worker( 'show', chosen_listitem.getProperty('dg.tvshowtitle'), chosen_listitem.getProperty('dg.year'), None, chosen_listitem.getProperty('dg.imdb')) else: source_trailer = trailer.Trailer().worker( 'movie', chosen_listitem.getProperty('dg.title'), chosen_listitem.getProperty('dg.year'), None, chosen_listitem.getProperty('dg.imdb')) if source_trailer: cm += [('[B]Play Trailer[/B]', 'playTrailer')] if media_type == 'show': cm += [('[B]Browse Series[/B]', 'browseSeries')] chosen_cm_item = dialog.contextmenu([i[0] for i in cm]) if chosen_cm_item == -1: return cm_action = cm[chosen_cm_item][1] if cm_action == 'playTrailer': self.execute_code('PlayMedia(%s, 1)' % source_trailer) total_sleep = 0 while True: sleep(500) total_sleep += 500 self.hasVideo = condVisibility('Player.HasVideo') if self.hasVideo or total_sleep >= 10000: break if self.hasVideo: self.setFocusId(2045) while (condVisibility('Player.HasVideo') and not monitor.abortRequested()): self.setProgressBar() sleep(1000) self.hasVideo = False self.progressBarReset() self.setFocusId(self.window_id) else: self.setFocusId(self.window_id) if cm_action == 'browseSeries': systvshowtitle = quote_plus( chosen_listitem.getProperty('dg.tvshowtitle')) year = chosen_listitem.getProperty('dg.year') imdb = chosen_listitem.getProperty('dg.imdb') tmdb = chosen_listitem.getProperty('dg.tmdb') tvdb = chosen_listitem.getProperty('dg.tvdb') from resources.lib.modules.control import lang if not yesnoDialog(lang(32182), '', ''): return self.chosen_hide, self.chosen_unhide = None, None self.close() sysart = quote_plus(chosen_listitem.getProperty('dg.art')) self.execute_code( 'ActivateWindow(Videos,plugin://plugin.video.dg/?action=seasons&tvshowtitle=%s&year=%s&imdb=%s&tmdb=%s&tvdb=%s&art=%s,return)' % (systvshowtitle, year, imdb, tmdb, tvdb, sysart)) elif action in self.closing_actions: self.selected_items = None if self.hasVideo: self.execute_code('PlayerControl(Stop)') else: self.close() except: from resources.lib.modules import log_utils log_utils.error() self.close()
def manager(name, imdb, tvdb, content): try: post = { "movies": [{ "ids": { "imdb": imdb } }] } if content == 'movie' else { "shows": [{ "ids": { "tvdb": tvdb } }] } items = [(control.lang(32516).encode('utf-8'), '/sync/collection')] items += [(control.lang(32517).encode('utf-8'), '/sync/collection/remove')] items += [(control.lang(32518).encode('utf-8'), '/sync/watchlist')] items += [(control.lang(32519).encode('utf-8'), '/sync/watchlist/remove')] items += [(control.lang(32520).encode('utf-8'), '/users/me/lists/%s/items')] result = getTraktAsJson('/users/me/lists') lists = [(i['name'], i['ids']['slug']) for i in result] lists = [lists[i // 2] for i in range(len(lists) * 2)] for i in range(0, len(lists), 2): lists[i] = ((control.lang(32521) % lists[i][0]).encode('utf-8'), '/users/me/lists/%s/items' % lists[i][1]) for i in range(1, len(lists), 2): lists[i] = ((control.lang(32522) % lists[i][0]).encode('utf-8'), '/users/me/lists/%s/items/remove' % lists[i][1]) items += lists select = control.selectDialog([i[0] for i in items], control.lang(32070).encode('utf-8')) if select == -1: return elif select == 4: t = control.lang(32520).encode('utf-8') k = control.keyboard('', t) k.doModal() new = k.getText() if k.isConfirmed() else None if (new == None or new == ''): return result = __getTrakt('/users/me/lists', post={ "name": new, "privacy": "private" })[0] try: slug = utils.json_loads_as_str(result)['ids']['slug'] except: return control.infoDialog(control.lang(32070).encode('utf-8'), heading=str(name), sound=True, icon='ERROR') result = __getTrakt(items[select][1] % slug, post=post)[0] else: result = __getTrakt(items[select][1], post=post)[0] icon = control.infoLabel( 'ListItem.Icon') if not result == None else 'ERROR' control.infoDialog(control.lang(32070).encode('utf-8'), heading=str(name), sound=True, icon=icon) except: return