def onPlayBackError(self): Bookmarks().reset(self.current_time, self.media_length, self.name, self.year) log_utils.error() sys.exit(1) xbmc.log('onPlayBackError callback', 2)
def get_seasonEpisodes_meta(self, tmdb, season): # builds episodes meta from "/season/?" request if not tmdb and not season: return None try: if not tmdb: return None result = self.get_season_request(tmdb, season) if '404:NOT FOUND' in result: return result if not result: return meta = {} except: from resources.lib.modules import log_utils log_utils.error() return None try: meta['premiered'] = str(result.get('air_date', '')) if result.get('air_date') else '' # Kodi season level Information gui seems no longer available in 19 unless you use "mediatype = tvshow" for seasons episodes = [] unaired_count = 0 for episode in result['episodes']: episode_meta = {} episode_meta['mediatype'] = 'episode' episode_meta['premiered'] = str(episode.get('air_date', '')) if episode.get('air_date') else '' # this is season premiered, not series premiered. if not episode_meta['premiered']: # access to "status" not available at this level unaired_count += 1 pass elif int(re.sub(r'[^0-9]', '', str(episode_meta['premiered']))) > int(re.sub(r'[^0-9]', '', str(self.today_date))): unaired_count += 1 # try: meta['year'] = meta['premiered'][:4] # DO NOT USE, this will make the year = season premiered but scrapers want series premiered for year. # except: meta['year'] = '' episode_meta['episode'] = episode['episode_number'] crew = episode.get('crew') try: episode_meta['director'] = ', '.join([d['name'] for d in [x for x in crew if x['job'] == 'Director']]) except: episode_meta['director'] = '' try: episode_meta['writer'] = ', '.join([w['name'] for w in [y for y in crew if y['job'] == 'Writer']]) # movies also contains "screenplay", "author", "novel". See if any apply for shows except: episode_meta['writer'] = '' episode_meta['tmdb_epID'] = episode['id'] episode_meta['title'] = episode['name'] episode_meta['plot'] = episode.get('overview', '') if episode.get('overview') else '' episode_meta['code'] = episode['production_code'] episode_meta['season'] = episode['season_number'] episode_meta['thumb'] = '%s%s' % (still_path, episode['still_path']) if episode.get('still_path') else '' episode_meta['rating'] = episode['vote_average'] episode_meta['votes'] = episode['vote_count'] episodes.append(episode_meta) meta['season_isAiring'] = 'true' if unaired_count > 0 else 'false' # I think this should be in episodes module where it has access to "showSeasons" meta for "status" meta['seasoncount'] = len(result.get('episodes')) #seasoncount = number of episodes for given season # meta['tvseasontitle'] = result['name'] # seasontitle ? meta['plot'] = result.get('overview', '') if result.get('overview') else '' # Kodi season level Information seems no longer available in 19 meta['tmdb'] = tmdb meta['poster'] = '%s%s' % (poster_path, result['poster_path']) if result.get('poster_path') else '' meta['season_poster'] = meta['poster'] meta['season'] = result.get('season_number') meta['castandart'] = [] for person in result['credits']['cast']: try: meta['castandart'].append({'name': person['name'], 'role': person['character'], 'thumbnail': ('%s%s' % (profile_path, person['profile_path']) if person.get('profile_path') else '')}) except: pass if len(meta['castandart']) == 150: break # meta['banner'] = '' # not available from TMDb meta['episodes'] = episodes except: from resources.lib.modules import log_utils log_utils.error() return meta
def trakt_list(self, url, user): list = [] try: q = dict(parse_qsl(urlsplit(url).query)) q.update({'extended': 'full'}) q = (urlencode(q)).replace('%2C', ',') u = url.replace('?' + urlparse(url).query, '') + '?' + q if '/related' in u: u = u + '&limit=20' result = trakt.getTraktAsJson(u) if not result: return list items = [] for i in result: try: movie = i['movie'] movie['added'] = i.get('listed_at') # for watchlist----confimed it's in response movie['paused_at'] = i.get('paused_at', '') # for history try: movie['progress'] = max(0, min(1, i['progress'] / 100.0)) except: movie['progress'] = '' try: movie['lastplayed'] = i.get('watched_at', '') except: movie['lastplayed'] = '' items.append(movie) except: pass if len(items) == 0: items = result except: log_utils.error() return try: q = dict(parse_qsl(urlsplit(url).query)) if int(q['limit']) != len(items): raise Exception() q.update({'page': str(int(q['page']) + 1)}) q = (urlencode(q)).replace('%2C', ',') next = url.replace('?' + urlparse(url).query, '') + '?' + q except: next = '' def items_list(item): try: values = item values['next'] = next values['title'] = py_tools.ensure_str(item.get('title')) values['originaltitle'] = values['title'] try: values['premiered'] = item.get('released', '')[:10] except: values['premiered'] = '' values['year'] = str(item.get('year', '')) if item.get('year') else '' if not values['year']: try: values['year'] = str(values['premiered'][:4]) except: values['year'] = '' ids = item.get('ids', {}) values['imdb'] = str(ids.get('imdb', '')) if ids.get('imdb') else '' values['tmdb'] = str(ids.get('tmdb', '')) if ids.get('tmdb') else '' values['tvdb'] = '' # values['studio'] = item.get('network', '') # do not set, some skins show studio icons in place of thumb and looks like dog shit values['genre'] = [] for x in item['genres']: values['genre'].append(x.title()) if not values['genre']: values['genre'] = 'NA' values['duration'] = int(item.get('runtime') * 60) if item.get('runtime') else '' values['rating'] = item.get('rating') values['votes'] = item['votes'] values['mpaa'] = item.get('certification', '') values['plot'] = py_tools.ensure_str(item.get('overview')) values['poster'] = '' values['fanart'] = '' try: values['trailer'] = control.trailer % item['trailer'].split('v=')[1] except: values['trailer'] = '' for k in ('released', 'ids', 'genres', 'runtime', 'certification', 'overview', 'comment_count', 'network'): values.pop(k, None) # pop() keys that are not needed anymore list.append(values) except: log_utils.error() threads = [] for item in items: threads.append(workers.Thread(items_list, item)) [i.start() for i in threads] [i.join() for i in threads] return list
def tmdb_list(self, url): try: result = get_request(url % API_key) if '404:NOT FOUND' in result: return result items = result['results'] except: return self.list = [] ; sortList = [] try: page = int(result['page']) total = int(result['total_pages']) if page >= total: raise Exception() if 'page=' not in url: raise Exception() next = '%s&page=%s' % (url.split('&page=', 1)[0], page+1) except: next = '' for item in items: try: values = {} values['next'] = next values['tmdb'] = str(item.get('id', '')) if item.get('id') else '' sortList.append(values['tmdb']) values['imdb'] = '' values['tvdb'] = '' values['metacache'] = False self.list.append(values) except: from resources.lib.modules import log_utils log_utils.error() def items_list(i): if self.list[i]['metacache']: return try: values = {} tmdb = self.list[i].get('tmdb', '') movie_meta = cache.get(self.get_movie_meta, 96, tmdb) values.update(movie_meta) imdb = values['imdb'] if self.enable_fanarttv: extended_art = fanarttv_cache.get(fanarttv.get_movie_art, 168, imdb, tmdb) if extended_art: values.update(extended_art) values = dict((k,v) for k, v in iter(values.items()) if v is not None and v != '') # remove empty keys so .update() doesn't over-write good meta with empty values. self.list[i].update(values) meta = {'imdb': imdb, 'tmdb': tmdb, 'tvdb': '', 'lang': self.lang, 'user': self.user, 'item': values} self.meta.append(meta) except: from resources.lib.modules import log_utils log_utils.error() self.list = metacache.fetch(self.list, self.lang, self.user) threads = [] for i in range(0, len(self.list)): threads.append(Thread(target=items_list, args=(i,))) [i.start() for i in threads] [i.join() for i in threads] if self.meta: self.meta = [i for i in self.meta if i.get('tmdb')] metacache.insert(self.meta) sorted_list = [] self.list = [i for i in self.list if i.get('tmdb')] for i in sortList: sorted_list += [item for item in self.list if item['tmdb'] == i] # resort to match TMDb list because threading will lose order. return sorted_list
def tmdb_collections_list(self, url): if not url: return try: result = get_request(url) if '404:NOT FOUND' in result: return result if '/collection/' in url: items = result['parts'] elif '/3/' in url: items = result['items'] else: items = result['results'] except: return self.list = [] try: page = int(result['page']) total = int(result['total_pages']) if page >= total: raise Exception() if 'page=' not in url: raise Exception() next = '%s&page=%s' % (url.split('&page=', 1)[0], page+1) except: next = '' for item in items: try: values = {} values['next'] = next media_type = item.get('media_type', '') if media_type == 'movie': continue values['tmdb'] = str(item.get('id', '')) if item.get('id') else '' values['metacache'] = False self.list.append(values) except: from resources.lib.modules import log_utils log_utils.error() def items_list(i): if self.list[i]['metacache']: return try: values = {} tmdb = self.list[i].get('tmdb', '') showSeasons_meta = cache.get(self.get_showSeasons_meta, 96, tmdb) values.update(showSeasons_meta) imdb = values['imdb'] tvdb = values['tvdb'] if self.enable_fanarttv: extended_art = fanarttv_cache.get(fanarttv.get_tvshow_art, 168, tvdb) if extended_art: values.update(extended_art) values = dict((k,v) for k, v in iter(values.items()) if v is not None and v != '') # remove empty keys so .update() doesn't over-write good meta with empty values. self.list[i].update(values) meta = {'imdb': imdb, 'tmdb': tmdb, 'tvdb': tvdb, 'lang': self.lang, 'user': self.user, 'item': values} self.meta.append(meta) except: from resources.lib.modules import log_utils log_utils.error() self.list = metacache.fetch(self.list, self.lang, self.user) threads = [] for i in range(0, len(self.list)): threads.append(Thread(target=items_list, args=(i,))) [i.start() for i in threads] [i.join() for i in threads] if self.meta: self.meta = [i for i in self.meta if i.get('tmdb')] metacache.insert(self.meta) self.list = [i for i in self.list if i.get('tmdb')] return self.list
def browse_user_cloud(self, folder): sysaddon, syshandle = argv[0], int(argv[1]) extensions = supported_video_extensions() torrent_folder = jsloads(folder) links = torrent_folder['links'] # links = [i for i in links if i['filename'].lower().endswith(tuple(extensions))] status_code = torrent_folder['statusCode'] file_str, downloadMenu, deleteMenu = getLS(40047).upper(), getLS( 40048), getLS(40050) for count, item in enumerate(links, 1): try: cm = [] url_link = item['link'] name = string_tools.strip_non_ascii_and_unprintable( item['filename']) if name.lower().endswith(invalid_extensions): continue if not name.lower().endswith(tuple(extensions)): files = item['files'] entry = files[0].get('e') name = entry[0].get('n') if isinstance( entry, list) else entry.get('n') def entry_loop(entry): entry = entry.get('e') name = entry[0].get('n') if isinstance( entry, list) else entry.get('n') if not name.lower().endswith(tuple(extensions)): return entry_loop(entry) else: return string_tools.strip_non_ascii_and_unprintable( name) if not name.lower().endswith(tuple(extensions)): name = entry_loop(entry) size = item['size'] display_size = float(int(size)) / 1073741824 label = '%02d | [B]%s[/B] | %.2f GB | [I]%s [/I]' % ( count, file_str, display_size, name) if status_code == 4: url = '%s?action=play_URL&url=%s&caller=alldebrid&type=unrestrict' % ( sysaddon, url_link) else: url = '' cm.append(( downloadMenu, 'RunPlugin(%s?action=download&name=%s&image=%s&url=%s&caller=alldebrid)' % (sysaddon, quote_plus(name), quote_plus(ad_icon), url_link))) item = control.item(label=label, offscreen=True) item.addContextMenuItems(cm) item.setArt({ 'icon': ad_icon, 'poster': ad_icon, 'thumb': ad_icon, 'fanart': addonFanart, 'banner': ad_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 download(name, image, url): # log_utils.log('name = %s' % str(name), log_utils.LOGDEBUG) try: if url is None: control.hide() return try: headers = dict(parse_qsl(url.rsplit('|', 1)[1])) except: headers = dict('') url = url.split('|')[0] try: content = re.search( r'(.+?)(?:|\.| - |-|\s)(?:S|s|\s|\.)(\d{1,2})(?!\d)(?:-{0,1})(?:E{0,1}|e{0,1})[0-2]{1}[0-9]{1}(?!\w)', name.replace('\'', '')).groups() # log_utils.log('content = %s' % str(content), log_utils.LOGDEBUG) except: content = () transname = name.translate(None, '\/:*?"<>|').strip('.') ext_list = ['.mp4', '.mkv', '.flv', '.avi', '.mpg'] for i in ext_list: transname = transname.rstrip(i) levels = ['../../../..', '../../..', '../..', '..'] if len(content) == 0: dest = control.setting('movie.download.path') dest = control.transPath(dest) for level in levels: try: control.makeFile(os.path.abspath(os.path.join(dest, level))) except: pass control.makeFile(dest) try: movie_info = re.search( r'(.+?)(?:\.{0,1}-{0,1}\.{0,1}|\s*)(?:\({0,1})((?:19|20)(?:[0-9]{2}))', name.replace('\'', '')).groups() # log_utils.log('movie_info = %s' % str(movie_info), log_utils.LOGDEBUG) except: movie_info = () if len(movie_info) != 0: movietitle = titlecase( re.sub('[^A-Za-z0-9\s]+', ' ', movie_info[0])) dest = os.path.join(dest, movietitle + '_' + movie_info[1]) else: dest = os.path.join(dest, transname) # log_utils.log('dest = %s' % str(dest), log_utils.LOGDEBUG) control.makeFile(dest) else: dest = control.setting('tv.download.path') dest = control.transPath(dest) for level in levels: try: control.makeFile(os.path.abspath(os.path.join(dest, level))) except: pass control.makeFile(dest) transtvshowtitle = content[0].translate( None, '\/:*?"<>|').strip('.').replace('.', ' ') if not transtvshowtitle[0].isupper(): transtvshowtitle = transtvshowtitle.capitalize() dest = os.path.join(dest, transtvshowtitle) control.makeFile(dest) dest = os.path.join(dest, 'Season %01d' % int(content[1])) control.makeFile(dest) ext = os.path.splitext(urlparse(url).path)[1][1:] if not ext in ['mp4', 'mkv', 'flv', 'avi', 'mpg']: ext = 'mp4' dest = os.path.join(dest, transname + '.' + ext) doDownload(url, dest, name, image, headers) except: log_utils.error() pass
def syncMyAccounts(silent=False): try: all_acct = myaccounts.getAll() trakt_acct = all_acct.get('trakt') if getSetting('trakt.token') != trakt_acct.get('token'): setSetting('trakt.isauthed', 'true') setSetting('trakt.token', trakt_acct.get('token')) setSetting('trakt.username', trakt_acct.get('username')) setSetting('trakt.refresh', trakt_acct.get('refresh')) setSetting('trakt.expires', trakt_acct.get('expires')) ad_acct = all_acct.get('alldebrid') if getSetting('alldebrid.username') != ad_acct.get('username'): setSetting('alldebrid.token', ad_acct.get('token')) setSetting('alldebrid.username', ad_acct.get('username')) pm_acct = all_acct.get('premiumize') if getSetting('premiumize.username') != pm_acct.get('username'): setSetting('premiumize.token', pm_acct.get('token')) setSetting('premiumize.username', pm_acct.get('username')) rd_acct = all_acct.get( 'realdebrid' ) # token refresh 1hr expiry, Venom handles this internally if getSetting('realdebrid.username') != rd_acct.get('username'): setSetting('realdebrid.token', rd_acct.get('token')) setSetting('realdebrid.username', rd_acct.get('username')) setSetting('realdebrid.client_id', rd_acct.get('client_id')) setSetting('realdebrid.refresh', rd_acct.get('refresh')) setSetting('realdebrid.secret', rd_acct.get('secret')) fanart_acct = all_acct.get('fanart_tv') if getSetting('fanart.tv.api.key') != fanart_acct.get('api_key'): setSetting('fanart.tv.api.key', fanart_acct.get('api_key')) tmdb_acct = all_acct.get('tmdb') if getSetting('tmdb.api.key') != tmdb_acct.get('api_key'): setSetting('tmdb.api.key', tmdb_acct.get('api_key')) if getSetting('tmdb.username') != tmdb_acct.get('username'): setSetting('tmdb.username', tmdb_acct.get('username')) if getSetting('tmdb.password') != tmdb_acct.get('password'): setSetting('tmdb.password', tmdb_acct.get('password')) if getSetting('tmdb.session_id') != tmdb_acct.get('session_id'): setSetting('tmdb.session_id', tmdb_acct.get('session_id')) tvdb_acct = all_acct.get('tvdb') if getSetting('tvdb.api.key') != tvdb_acct.get('api_key'): setSetting('tvdb.api.key', tvdb_acct.get('api_key')) imdb_acct = all_acct.get('imdb') if getSetting('imdb.user') != imdb_acct.get('user'): setSetting('imdb.user', imdb_acct.get('user')) fu_acct = all_acct.get('furk') if getSetting('furk.username') != fu_acct.get('username'): setSetting('furk.username', fu_acct.get('username')) setSetting('furk.password', fu_acct.get('password')) if fu_acct.get('api_key', None): if getSetting('furk.api') != fu_acct.get('api_key'): setSetting('furk.api', fu_acct.get('api_key')) if not silent: notification(message=32114) except: from resources.lib.modules import log_utils log_utils.error()
def fetch_bookmarks(imdb, tmdb='', tvdb='', season=None, episode=None, ret_all=None, ret_type='movies'): progress = '0' try: dbcon = get_connection() dbcur = get_connection_cursor(dbcon) ck_table = dbcur.execute( '''SELECT * FROM sqlite_master WHERE type='table' AND name='bookmarks';''' ).fetchone() if not ck_table: dbcur.execute( '''CREATE TABLE IF NOT EXISTS bookmarks (tvshowtitle TEXT, title TEXT, imdb TEXT, tmdb TEXT, tvdb TEXT, season TEXT, episode TEXT, genre TEXT, mpaa TEXT, studio TEXT, duration TEXT, percent_played TEXT, paused_at TEXT, UNIQUE(imdb, tmdb, tvdb, season, episode));''' ) dbcur.connection.commit() return progress if ret_all: if ret_type == 'movies': match = dbcur.execute( '''SELECT * FROM bookmarks WHERE (tvshowtitle='')''' ).fetchall() progress = [{ 'title': i[1], 'imdb': i[2], 'tmdb': i[3], 'duration': int(i[10]), 'progress': i[11], 'paused_at': i[12] } for i in match] else: match = dbcur.execute( '''SELECT * FROM bookmarks WHERE NOT (tvshowtitle='')''' ).fetchall() progress = [{ 'tvshowtitle': i[0], 'title': i[1], 'imdb': i[2], 'tmdb': i[3], 'tvdb': i[4], 'season': int(i[5]), 'episode': int(i[6]), 'genre': i[7], 'mpaa': i[8], 'studio': i[9], 'duration': int(i[10]), 'progress': i[11], 'paused_at': i[12] } for i in match] else: if not episode: try: # Lookup both IMDb and TMDb first for more accurate movie match. match = dbcur.execute( '''SELECT * FROM bookmarks WHERE (imdb=? AND tmdb=? AND NOT imdb='' AND NOT tmdb='')''', (imdb, tmdb)).fetchone() progress = match[11] except: try: match = dbcur.execute( '''SELECT * FROM bookmarks WHERE (imdb=? AND NOT imdb='')''', (imdb, )).fetchone() progress = match[11] except: pass else: try: # Lookup both IMDb and TVDb first for more accurate episode match. match = dbcur.execute( '''SELECT * FROM bookmarks WHERE (imdb=? AND tvdb=? AND season=? AND episode=? AND NOT imdb='' AND NOT tvdb='')''', (imdb, tvdb, season, episode)).fetchone() progress = match[11] except: try: match = dbcur.execute( '''SELECT * FROM bookmarks WHERE (tvdb=? AND season=? AND episode=? AND NOT tvdb='')''', (tvdb, season, episode)).fetchone() progress = match[11] except: pass except: from resources.lib.modules import log_utils log_utils.error() finally: dbcur.close() dbcon.close() return progress
def user_transfers_to_listItem(self): try: sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) extensions = supported_video_extensions() transfer_files = self.user_transfers() if not transfer_files: control.notification(message='Request Failure-Empty Content') return except: log_utils.error() return folder_str, file_str, downloadMenu, renameMenu, deleteMenu, clearFinishedMenu = control.lang(40046).upper(),\ control.lang(40047).upper(), control.lang(40048), control.lang(40049), control.lang(40050), control.lang(40051) for count, item in enumerate(transfer_files, 1): try: cm = [] type = 'folder' if item['file_id'] is None else 'file' name = control.strip_non_ascii_and_unprintable(item['name']) status = item['status'] progress = item['progress'] if status == 'finished': progress = 100 else: try: progress = re.findall(r'(?:\d{0,1}\.{0,1})(\d+)', str(progress))[0][:2] except: progress = 'UNKNOWN' if type == 'folder': isFolder = True if status == 'finished' else False status_str = '[COLOR %s]%s[/COLOR]' % (control.getColor(control.setting('highlight.color')), status.capitalize()) label = '%02d | [B]%s[/B] - %s | [B]%s[/B] | [I]%s [/I]' % (count, status_str, str(progress) + '%', folder_str, name) url = '%s?action=pm_MyFiles&id=%s&name=%s' % (sysaddon, item['folder_id'], quote_plus(name)) # Till PM addresses issue with item also being removed from public acess if item not accessed for 60 days this option is disabled. # cm.append((clearFinishedMenu, 'RunPlugin(%s?action=pm_ClearFinishedTransfers)' % sysaddon)) else: isFolder = False details = self.item_details(item['file_id']) if not details: control.notification(message='Request Failure-Empty Content') return url_link = details['link'] if url_link.startswith('/'): url_link = 'https' + url_link size = details['size'] display_size = float(int(size))/1073741824 label = '%02d | %s%% | [B]%s[/B] | %.2f GB | [I]%s [/I]' % (count, str(progress), file_str, display_size, name) url = '%s?action=playURL&url=%s' % (sysaddon, url_link) cm.append((downloadMenu, 'RunPlugin(%s?action=download&name=%s&image=%s&url=%s&caller=premiumize)' % (sysaddon, quote_plus(name), quote_plus(pm_icon), url_link))) cm.append((deleteMenu % 'Transfer', 'RunPlugin(%s?action=pm_DeleteTransfer&id=%s&name=%s)' % (sysaddon, item['id'], quote_plus(name)))) item = control.item(label=label) item.addContextMenuItems(cm) item.setArt({'icon': pm_icon, 'poster': pm_icon, 'thumb': pm_icon, 'fanart': addonFanart, 'banner': pm_icon}) item.setInfo(type='video', infoLabels='') video_streaminfo = {'codec': 'h264'} item.addStreamInfo('video', video_streaminfo) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=isFolder) except: log_utils.error() pass control.content(syshandle, 'files') control.directory(syshandle, cacheToDisc=True)
def delete(self, type, folder_id=None, folder_name=None): try: if type == 'folder': url = folder_delete_url else: url = item_delete_url if not control.yesnoDialog(control.lang(40050) % folder_name, '', ''): return data = {'id': folder_id} response = self._post(url, data=data) if not response: return if 'status' in response: if response.get('status') == 'success': control.refresh() except: log_utils.error() pass # # from resolveURL # def get_all_hosters(self): # try: # response = self._get(list_services_path_url) # if not response: # return None # aliases = response.get('aliases', {}) # patterns = response.get('regexpatterns', {}) # tldlist = [] # for tlds in aliases.values(): # for tld in tlds: # tldlist.append(tld) # if self.get_setting('torrents') == 'true': # tldlist.extend([u'torrent', u'magnet']) # regex_list = [] # for regexes in patterns.values(): # for regex in regexes: # try: # regex_list.append(re.compile(regex)) # except: # log_utils.log('Throwing out bad Premiumize regex: %s' % regex, __name__, log_utils.LOGDEBUG) # log_utils.log('Premiumize.me patterns: %s regex: (%d) hosts: %s' % (patterns, len(regex_list), tldlist), __name__, log_utils.LOGDEBUG) # return tldlist, regex_list # except Exception as e: # log_utils.log('Error getting Premiumize hosts: %s' % e, __name__, log_utils.LOGDEBUG) # return [], [] # # from resolveURL # def valid_url(self, url, host): # if url and self.get_setting('torrents') == 'true': # url_lc = url.lower() # if url_lc.endswith('.torrent') or url_lc.startswith('magnet:'): # return True # if not self.patterns or not self.hosts: # self.hosts, self.patterns = self.get_all_hosters() # if url: # if not url.endswith('/'): # url += '/' # for pattern in self.patterns: # if pattern.findall(url): # return True # elif host: # if host.startswith('www.'): # host = host.replace('www.', '') # if any(host in item for item in self.hosts): # return True # return False
def create_transfer(self, src, folder_id=0): try: data = {'src': src, 'folder_id': folder_id} return self._post(transfer_create_url, data) except: log_utils.error()
def add_uncached_torrent(self, magnet_url, pack=False): def _transfer_info(transfer_id): info = self.list_transfer() if 'status' in info and info['status'] == 'success': for item in info['transfers']: if item['id'] == transfer_id: return item return {} def _return_failed(message=control.lang(33586)): try: control.progressDialog.close() except: pass self.delete_transfer(transfer_id) control.hide() control.sleep(500) control.okDialog(title=control.lang(40018), message=message) return False control.busy() extensions = supported_video_extensions() transfer_id = self.create_transfer(magnet_url) if not transfer_id: control.hide() return if not transfer_id['status'] == 'success': return _return_failed() transfer_id = transfer_id['id'] transfer_info = _transfer_info(transfer_id) if not transfer_info: return _return_failed() if pack: control.hide() control.okDialog(title='default', message=control.lang(40017) % control.lang(40057)) return True interval = 5 line1 = '%s...' % (control.lang(40017) % control.lang(40057)) line2 = transfer_info['name'] line3 = transfer_info['message'] control.progressDialog.create(control.lang(40018), line1, line2, line3) while not transfer_info['status'] == 'seeding': control.sleep(1000 * interval) transfer_info = _transfer_info(transfer_id) line3 = transfer_info['message'] control.progressDialog.update(int(float(transfer_info['progress']) * 100), line3=line3) if control.monitor.abortRequested(): return sys.exit() try: if control.progressDialog.iscanceled(): if control.yesnoDialog('Delete PM 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 transfer_info.get('status') == 'stalled': return _return_failed() control.sleep(1000 * interval) try: control.progressDialog.close() except: log_utils.error() pass control.hide() return True
def get(self, name, imdb, season, episode): import gzip, StringIO, codecs import xmlrpclib, re, base64 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 = xmlrpclib.Server('https://api.opensubtitles.org/xml-rpc', verbose=0) token = server.LogIn('', '', 'en', 'XBMC_Subtitles_v1') token = token['token'] sublanguageid = ','.join(langs) imdbid = re.sub('[^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('\.|\(|\)|\[|\]|\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'] content = [ filter[0]['IDSubtitleFile'], ] content = server.DownloadSubtitles(token, content) content = base64.b64decode(content['data'][0]['data']) content = gzip.GzipFile(fileobj=StringIO.StringIO(content)).read() subtitle = xbmc.translatePath('special://temp/') subtitle = control.joinPath(subtitle, 'TemporarySubs.%s.srt' % lang) codepage = codePageDict.get(lang, '') if codepage and control.setting('subtitles.utf') == 'true': try: content_encoded = codecs.decode(content, codepage) content = codecs.encode(content_encoded, 'utf-8') except: pass file = control.openFile(subtitle, 'w') file.write(str(content)) file.close() xbmc.sleep(1000) xbmc.Player().setSubtitles(subtitle) except: log_utils.error() pass
def manager(name, imdb=None, tvdb=None, season=None, episode=None, refresh=True): lists = [] try: if season is not None: season = int(season) if episode is not None: episode = int(episode) if tvdb is not None: media_type = 'Show' else: media_type = 'Movie' items = [(control.lang(33651), 'watch')] items += [(control.lang(33652), 'unwatch')] items += [(control.lang(33653), 'rate')] items += [(control.lang(33654), 'unrate')] items += [(control.lang(40075) % media_type, 'hideItem')] items += [(control.lang(33575), '/sync/collection')] items += [(control.lang(33576), '/sync/collection/remove')] if season or episode is not None: items += [(control.lang(33573), '/sync/watchlist')] items += [(control.lang(33574), '/sync/watchlist/remove')] items += [(control.lang(33577), '/sync/watchlist')] items += [(control.lang(33578), '/sync/watchlist/remove')] items += [(control.lang(33579), '/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(33580) % 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(33581) % lists[i][0]).encode('utf-8'), '/users/me/lists/%s/items/remove' % lists[i][1]) items += lists control.hide() select = control.selectDialog([i[0] for i in items], heading = control.addonInfo('name') + ' - ' + control.lang(32515)) if select == -1: return if select >= 0: # if select == 0: if items[select][0] == control.lang(33651): control.busy() watch(name, imdb = imdb, tvdb = tvdb, season = season, episode = episode, refresh = refresh) control.hide() # elif select == 1: elif items[select][0] == control.lang(33652): control.busy() unwatch(name, imdb = imdb, tvdb = tvdb, season = season, episode = episode, refresh = refresh) control.hide() # elif select == 2: elif items[select][0] == control.lang(33653): control.busy() rate(imdb = imdb, tvdb = tvdb, season = season, episode = episode) control.hide() # elif select == 3: elif items[select][0] == control.lang(33654): control.busy() unrate(imdb = imdb, tvdb = tvdb, season = season, episode = episode) control.hide() # elif select == 4: elif items[select][0] == control.lang(40075) % media_type: control.busy() hideItem(name = name, imdb = imdb, tvdb = tvdb, season = season, episode = episode) control.hide() else: if tvdb is None: post = {"movies": [{"ids": {"imdb": imdb}}]} else: if episode is not None: if items[select][0] == control.lang(33573) or items[select][0] == control.lang(33574): post = {"shows": [{"ids": {"tvdb": tvdb}}]} else: post = {"shows": [{"ids": {"tvdb": tvdb}, "seasons": [{"number": season, "episodes": [{"number": episode}]}]}]} name = name + ' - ' + '%sx%02d' % (season, episode) elif season is not None: if items[select][0] == control.lang(33573) or items[select][0] == control.lang(33574): post = {"shows": [{"ids": {"tvdb": tvdb}}]} else: post = {"shows": [{"ids": {"tvdb": tvdb}, "seasons": [{"number": season}]}]} name = name + ' - ' + 'Season %s' % season else: post = {"shows": [{"ids": {"tvdb": tvdb}}]} # if select == 8: if items[select][0] == control.lang(33579): slug = listAdd(successNotification = True) if slug is not None: getTrakt(items[select][1] % slug, post = post)[0] else: getTrakt(items[select][1], post = post)[0] control.hide() # message = 33583 if (select % 2) == 0 else 33582 message = 33583 if 'remove' in items[select][1] else 33582 if refresh: control.refresh() control.trigger_widget_refresh() if control.setting('trakt.general.notifications') == 'true': control.notification(title=name, message=message, icon='default', sound=(control.setting('notification.sound') == 'true')) except: log_utils.error() control.hide()
def items_list(i): # if i['metacache']: # return try: tvmaze = i url = self.tvmaze_info_link % i item = requests.get(url, timeout=10).json() content = item.get('type', '0').lower() try: title = (item.get('name')).encode('utf-8') except: title = item.get('name') premiered = item.get('premiered', '0') year = str(item.get('premiered', '0')) if year is not None and year != 'None' and year != '0': year = re.search(r"(\d{4})", year).group(1) else: year = '0' imdb = item.get('externals').get('imdb', '0') if imdb == '' or imdb is None or imdb == 'None': imdb = '0' tvdb = str(item.get('externals').get('thetvdb', '0')) if tvdb == '' or tvdb is None or tvdb == 'None': tvdb = '0' # TVMaze does not have tmdb_id in api tmdb = '0' studio = item.get('network', {}) or item.get('webChannel', {}) studio = studio.get('name', '0') genre = [] for i in item['genres']: genre.append(i.title()) if genre == []: genre = 'NA' duration = str(item.get('runtime', '0')) rating = str(item.get('rating').get('average', '0')) plot = item.get('summary', '0') if plot: plot = re.sub('<.+?>|</.+?>|\n', '', plot) status = item.get('status', '0') castandart = [] for person in item['_embedded']['cast']: try: try: castandart.append({ 'name': person['person']['name'].encode('utf-8'), 'role': person['character']['name'].encode('utf-8'), 'thumbnail': (person['person']['image']['original'] if person['person']['image']['original'] is not None else '0') }) except: castandart.append({ 'name': person['person']['name'], 'role': person['character']['name'], 'thumbnail': (person['person']['image']['medium'] if person['person']['image']['medium'] is not None else '0') }) except: castandart = [] pass if len(castandart) == 150: break image = item.get('image') poster = image.get('original', '0') if image is not None else '0' fanart = '0' banner = '0' mpaa = '0' votes = '0' airday = '0' airtime = '0' # self.list = metacache.fetch(self.list, self.lang, self.user) # if self.list['metacache'] is True: # raise Exception() if (imdb == '0' or tmdb == '0') and tvdb != '0': from resources.lib.modules import trakt trakt_ids = trakt.IdLookup('tvdb', tvdb, 'show') if trakt_ids: if imdb == '0': imdb = str(trakt_ids.get('imdb', '0')) if imdb == '' or imdb is None or imdb == 'None': imdb = '0' if tmdb == '0': tmdb = str(trakt_ids.get('tmdb', '0')) if tmdb == '' or tmdb is None or tmdb == 'None': tmdb = '0' ###--Check TVDb by IMDB_ID for missing ID's if tvdb == '0' and imdb != '0': try: url = self.tvdb_by_imdb % imdb result = requests.get(url).content result = re.sub(r'[^\x00-\x7F]+', '', result) result = client.replaceHTMLCodes(result) result = client.parseDOM(result, 'Series') result = [(client.parseDOM(x, 'SeriesName'), client.parseDOM(x, 'FirstAired'), client.parseDOM(x, 'seriesid'), client.parseDOM(x, 'AliasNames')) for x in result] years = [ str(year), str(int(year) + 1), str(int(year) - 1) ] item = [(x[0], x[1], x[2], x[3]) for x in result if cleantitle.get(title) == cleantitle.get( str(x[0][0])) and any(y in str(x[1][0]) for y in years)] if item == []: item = [(x[0], x[1], x[2], x[3]) for x in result if cleantitle.get(title) == cleantitle.get( str(x[3][0]))] if item == []: item = [(x[0], x[1], x[2], x[3]) for x in result if cleantitle.get(title) == cleantitle.get( str(x[0][0]))] if item == []: raise Exception() tvdb = item[0][2] tvdb = tvdb[0] or '0' except: log_utils.error() pass ###--Check TVDb by seriesname if tvdb == '0' or imdb == '0': try: url = self.tvdb_by_query % (quote_plus(title)) result = requests.get(url).content result = re.sub(r'[^\x00-\x7F]+', '', result) result = client.replaceHTMLCodes(result) result = client.parseDOM(result, 'Series') result = [(client.parseDOM(x, 'SeriesName'), client.parseDOM(x, 'FirstAired'), client.parseDOM(x, 'seriesid'), client.parseDOM(x, 'IMDB_ID'), client.parseDOM(x, 'AliasNames')) for x in result] years = [ str(year), str(int(year) + 1), str(int(year) - 1) ] item = [(x[0], x[1], x[2], x[3], x[4]) for x in result if cleantitle.get(title) == cleantitle.get( str(x[0][0])) and any(y in str(x[1][0]) for y in years)] if item == []: item = [(x[0], x[1], x[2], x[3], x[4]) for x in result if cleantitle.get(title) == cleantitle.get( str(x[4][0]))] if item == []: item = [(x[0], x[1], x[2], x[3], x[4]) for x in result if cleantitle.get(title) == cleantitle.get( str(x[0][0]))] if item == []: raise Exception() if tvdb == '0': tvdb = item[0][2] tvdb = tvdb[0] or '0' if imdb == '0': imdb = item[0][3] imdb = imdb[0] or '0' except: log_utils.error() pass ################################# if tvdb == '0': raise Exception() try: url = self.tvdb_info_link % (tvdb, self.lang) item3 = requests.get(url).content except: item3 = None if item3: if poster == '0': poster = client.parseDOM(item3, 'poster')[0] poster = '%s%s' % (self.tvdb_image, poster) if poster else '0' fanart = client.parseDOM(item3, 'fanart')[0] fanart = '%s%s' % (self.tvdb_image, fanart) if fanart else '0' banner = client.parseDOM(item3, 'banner')[0] banner = '%s%s' % (self.tvdb_image, banner) if banner else '0' mpaa = client.parseDOM(item3, 'ContentRating')[0] or '0' if duration == '0': duration = client.parseDOM(item3, 'Runtime')[0] or '0' if rating == '0': rating = client.parseDOM(item3, 'Rating')[0] or '0' votes = client.parseDOM(item3, 'RatingCount')[0] or '0' if status == '0': status = client.parseDOM(item3, 'Status')[0] or '0' if year == '0': year = client.parseDOM(item3, 'FirstAired')[0] or '0' if year != '0': year = re.compile('(\d{4})').findall( year)[0] or '0' if not plot: plot = client.parseDOM(item3, 'Overview')[0] or '0' plot = client.replaceHTMLCodes(plot) try: plot = plot.encode('utf-8') except: pass airday = client.parseDOM(item3, 'Airs_DayOfWeek')[0] or '0' # log_utils.log('airday = %s' % str(airday), __name__, log_utils.LOGDEBUG) airtime = client.parseDOM(item3, 'Airs_Time')[0] or '0' item = {} item = { 'content': content, 'title': title, 'originaltitle': title, 'year': year, 'premiered': premiered, 'studio': studio, 'genre': genre, 'duration': duration, 'rating': rating, 'votes': votes, 'mpaa': mpaa, 'castandart': castandart, 'plot': plot, 'tagline': '0', 'status': status, 'imdb': imdb, 'tvdb': tvdb, 'tmdb': tmdb, 'tvmaze': tvmaze, 'airday': airday, 'airtime': airtime, 'poster': poster, 'poster2': '0', 'banner': banner, 'banner2': '0', 'fanart': fanart, 'fanart2': '0', 'clearlogo': '0', 'clearart': '0', 'landscape': fanart, 'metacache': False, 'next': next } meta = {} meta = { 'tmdb': tmdb, 'imdb': imdb, 'tvdb': tvdb, 'lang': self.lang, 'user': self.user, 'item': item } if self.disable_fanarttv != 'true': from resources.lib.indexers import fanarttv extended_art = cache.get(fanarttv.get_tvshow_art, 168, tvdb) if extended_art: item.update(extended_art) meta.update(item) if (self.disable_fanarttv == 'true' and (poster == '0' or fanart == '0')) or ( self.disable_fanarttv != 'true' and ((poster == '0' and item.get('poster2') == '0') or (fanart == '0' and item.get('fanart2') == '0'))): from resources.lib.indexers.tmdb import TVshows tmdb_art = TVshows().get_art(tmdb) # log_utils.log('tmdb_art = %s' % tmdb_art, __name__, log_utils.LOGDEBUG) if tmdb_art: item.update(tmdb_art) if item.get('landscape', '0') == '0': landscape = item.get('fanart3', '0') item.update({'landscape': landscape}) meta.update(item) item = dict((k, v) for k, v in item.iteritems() if v != '0') self.list.append(item) if 'next' in meta.get('item'): del meta['item']['next'] self.meta.append(meta) metacache.insert(self.meta) except: log_utils.error() pass
def user_transfers_to_listItem(self): sysaddon, syshandle = argv[0], int(argv[1]) transfer_files = self.user_cloud()['magnets'] if not transfer_files: if self.server_notifications: control.notification(message='Request Failure-Empty Content', icon=ad_icon) log_utils.log('AllDebrid: Request Failure-Empty Content', __name__, log_utils.LOGDEBUG) return folder_str, deleteMenu, restartMenu = getLS(40046).upper(), getLS( 40050), getLS(40008) for count, item in enumerate(transfer_files, 1): try: status_code = item['statusCode'] if status_code in (0, 1, 2, 3): active = True downloaded = item['downloaded'] size = item['size'] try: percent = str(round(float(downloaded) / size * 100, 1)) except: percent = '0' else: active = False folder_name = string_tools.strip_non_ascii_and_unprintable( item['filename']) id = item['id'] status_str = '[COLOR %s]%s[/COLOR]' % ( control.getHighlightColor(), item['status'].capitalize()) if active: label = '%02d | [B]%s[/B] - %s | [B]%s[/B]' % ( count, status_str, str(percent) + '%', folder_name) else: label = '%02d | [B]%s[/B] | [B]%s[/B] | [I]%s [/I]' % ( count, status_str, folder_str, folder_name) if status_code == 4: url = '%s?action=ad_BrowseUserCloud&source=%s' % ( sysaddon, quote_plus(jsdumps(item))) isFolder = True else: url = '' isFolder = False cm = [] cm.append( (deleteMenu % 'Transfer', 'RunPlugin(%s?action=ad_DeleteTransfer&id=%s&name=%s)' % (sysaddon, id, folder_name))) if status_code in (6, 7, 9, 10): cm.append(( restartMenu, 'RunPlugin(%s?action=ad_RestartTransfer&id=%s&name=%s)' % (sysaddon, id, folder_name))) item = control.item(label=label, offscreen=True) item.addContextMenuItems(cm) item.setArt({ 'icon': ad_icon, 'poster': ad_icon, 'thumb': ad_icon, 'fanart': addonFanart, 'banner': ad_icon }) item.setInfo(type='video', infoLabels='') control.addItem(handle=syshandle, url=url, listitem=item, isFolder=isFolder) except: log_utils.error() control.content(syshandle, 'files') control.directory(syshandle, cacheToDisc=True)
def insert(meta): try: if not control.existsPath(control.dataPath): control.makeFile(control.dataPath) dbcon = database.connect(control.metacacheFile) dbcur = dbcon.cursor() dbcur.execute("CREATE TABLE IF NOT EXISTS meta (""imdb TEXT, ""tmdb TEXT, ""tvdb TEXT, ""lang TEXT, ""user TEXT, ""item TEXT, ""time TEXT, ""UNIQUE(imdb, tmdb, tvdb, lang, user)"");") t = int(time.time()) for m in meta: if "user" not in m: m["user"] = '' if "lang" not in m: m["lang"] = 'en' i = repr(m['item']) try: dbcur.execute("INSERT OR REPLACE INTO meta Values (?, ?, ?, ?, ?, ?, ?)", (m.get('imdb', '0'), m.get('tmdb', '0'), m.get('tvdb', '0'), m['lang'], m['user'], i, t)) except: pass dbcur.connection.commit() except: log_utils.error() pass try: dbcon.close() except: pass return # def local(items, link, poster, fanart): # try: # # dbcon = database.connect(control.metaFile()) # dbcon = database.connect(control.metacacheFile) # dbcur = dbcon.cursor() # args = [i['imdb'] for i in items] # dbcur.execute('SELECT * FROM mv WHERE imdb IN (%s)' % ', '.join(list(map(lambda arg: "'%s'" % arg, args)))) # data = dbcur.fetchall() # except: # return items # for i in range(0, len(items)): # try: # item = items[i] # match = [x for x in data if x[1] == item['imdb']][0] # try: # if poster in item and item[poster] != '0': # raise Exception() # if match[2] == '0': # raise Exception() # items[i].update({poster: link % ('300', '/%s.jpg' % match[2])}) # except: # pass # try: # if fanart in item and item[fanart] != '0': # raise Exception() # if match[3] == '0': # raise Exception() # items[i].update({fanart: link % ('1280', '/%s.jpg' % match[3])}) # except: # pass # except: # pass # dbcon.close() # return items
def resolve_magnet(self, magnet_url, info_hash, season, episode, ep_title): from resources.lib.modules.source_utils import seas_ep_filter, extras_filter try: file_url = None media_id = None failed_reason = 'Unknown' correct_files = [] append = correct_files.append extensions = supported_video_extensions() extras_filtering_list = extras_filter() transfer_id = self.create_transfer(magnet_url) transfer_info = self.list_transfer(transfer_id) # log_utils.log('transfer_info=%s' % str(transfer_info)) # valid_results = [i for i in transfer_info.get('links') if any(i.get('filename').lower().endswith(x) for x in extensions) and not i.get('link', '') == ''] #.m2ts file extension is not in "filename" so this fails valid_results = [ i for i in transfer_info.get('links') if not any( i.get('filename').lower().endswith(x) for x in invalid_extensions) and not i.get('link', '') == '' ] if len(valid_results) == 0: failed_reason = 'No valid video extension found' raise Exception() if season: for item in valid_results: if '.m2ts' in str(item.get('files')): log_utils.log( 'AllDebrid: Can not resolve .m2ts season disk episode', level=log_utils.LOGDEBUG) failed_reason = '.m2ts season disk incapable of determining episode' continue if seas_ep_filter(season, episode, item['filename']): append(item) if len(correct_files) == 0: failed_reason = 'no matching episode found' continue episode_title = re.sub(r'[^A-Za-z0-9-]+', '.', ep_title.replace('\'', '')).lower() for i in correct_files: compare_link = seas_ep_filter(season, episode, i['filename'], split=True) compare_link = re.sub(episode_title, '', compare_link) if not any(x in compare_link for x in extras_filtering_list): media_id = i['link'] break else: media_id = max(valid_results, key=lambda x: x.get('size')).get('link', None) if not self.store_to_cloud: self.delete_transfer(transfer_id) if not media_id: log_utils.log( 'AllDebrid: FAILED TO RESOLVE MAGNET %s : (%s)' % (magnet_url, failed_reason), __name__, log_utils.LOGWARNING) return None file_url = self.unrestrict_link(media_id) if not file_url: log_utils.log( 'AllDebrid: FAILED TO UNRESTRICT MAGNET %s : ' % magnet_url, __name__, log_utils.LOGWARNING) return file_url except: if failed_reason != 'Unknown': log_utils.log('AllDebrid: Error RESOLVE MAGNET %s : (%s)' % (magnet_url, failed_reason)) else: log_utils.error('AllDebrid: Error RESOLVE MAGNET %s : ' % magnet_url) if transfer_id: self.delete_transfer(transfer_id) return None
def getMovieAliases(id): try: return cache.get(getTraktAsJson, 48, '/movies/%s/aliases' % id) except: log_utils.error() return []
else: continue if url_dl == '': continue if int(i['files_num_video_player']) !> 1: if int(i['ss_num']) > 0: thumb = i['ss_urls'][0] else: thumb = '' self.addDirectoryItem(name , url_dl, thumb, '', False) else: pass self.endDirectory() return '' except: log_utils.error() pass def search(self): from resources.lib.menus import navigator navigator.Navigator().addDirectoryItem('New Search', 'furkSearchNew', 'search.png', 'search.png') try: from sqlite3 import dbapi2 as database except: from pysqlite2 import dbapi2 as database dbcon = database.connect(control.searchFile) dbcur = dbcon.cursor() try:
def getTVShowAliases(id): try: return cache.get(getTraktAsJson, 48, '/shows/%s/aliases' % id) except: log_utils.error() return []
def get_movie_meta(self, tmdb, imdb=None): if not tmdb and not imdb: return try: result = self.get_movie_request(tmdb, imdb) if '404:NOT FOUND' in result: return result if not result: return meta = {} except: from resources.lib.modules import log_utils log_utils.error() return None try: meta['mediatype'] = 'movie' # adult meta['fanart'] = '%s%s' % (fanart_path, result['backdrop_path']) if result.get('backdrop_path') else '' # belongs_to_collection # budget meta['genre'] = ' / '.join([x['name'] for x in result.get('genres', {})]) or 'NA' # homepage meta['tmdb'] = str(result.get('id', '')) if result.get('id') else '' meta['imdb'] = str(result.get('imdb_id', '')) if result.get('imdb_id') else '' meta['imdbnumber'] = meta['imdb'] meta['original_language'] = result.get('original_language', '') meta['originaltitle'] = result.get('original_title', '') meta['plot'] = result.get('overview', '') if result.get('overview') else '' # meta['?'] = result.get('popularity', '') meta['poster'] = '%s%s' % (poster_path, result['poster_path']) if result.get('poster_path') else '' # try: meta['studio'] = result.get('production_companies', {})[0]['name'] # Silvo seems to use "studio" icons in place of "thumb" for movies in list view # except: meta['studio'] = '' try: meta['country_codes'] = [i['iso_3166_1'] for i in result['production_countries']] except: meta['country_codes'] = '' meta['premiered'] = str(result.get('release_date', '')) if result.get('release_date') else '' try: meta['year'] = meta['premiered'][:4] except: meta['year'] = '' # revenue meta['duration'] = int(result.get('runtime') * 60) if result.get('runtime') else '' meta['spoken_languages'] = result.get('spoken_languages') meta['status'] = result['status'] # meta['tagline'] = result.get('tagline', '') meta['title'] = result.get('title') meta['rating'] = str(result.get('vote_average', '')) meta['votes'] = result.get('vote_count', '') crew = result.get('credits', {}).get('crew') try: meta['director'] = ', '.join([d['name'] for d in [x for x in crew if x['job'] == 'Director']]) except: meta['director'] = '' try: meta['writer'] = ', '.join([w['name'] for w in [y for y in crew if y['job'] in ('Writer', 'Screenplay', 'Author', 'Novel')]]) except: meta['writer'] = '' meta['castandart'] = [] for person in result['credits']['cast']: try: meta['castandart'].append({'name': person['name'], 'role': person['character'], 'thumbnail': ('%s%s' % (profile_path, person['profile_path']) if person.get('profile_path') else '')}) except: pass if len(meta['castandart']) == 150: break try: meta['mpaa'] = '' rel_info = [x for x in result['release_dates']['results'] if x['iso_3166_1'] == 'US'][0] for cert in rel_info.get('release_dates', {}): # loop thru all keys if cert['certification']: if cert['note']: continue # limited release adds region note here, use official full release that will be null meta['mpaa'] = cert['certification'] meta['premiered'] = cert['release_date'].split('T')[0] or meta['premiered'] # use US premiered date break except: meta['mpaa'] = '' try: trailer = [x for x in result['videos']['results'] if x['site'] == 'YouTube' and x['type'] in ('Trailer', 'Teaser')][0]['key'] meta['trailer'] = control_trailer % trailer except: meta['trailer'] = '' # make aliases match what trakt returns in sources module for title checking scrape results try: meta['aliases'] = [{'title': x['title'], 'country': x['iso_3166_1'].lower()} for x in result.get('alternative_titles', {}).get('titles') if x.get('iso_3166_1').lower() in ('us', 'uk', 'gb')] except: meta['aliases'] = [] except: from resources.lib.modules import log_utils log_utils.error() return meta
def scrobbleMovie(imdb, watched_percent): try: if not imdb.startswith('tt'): imdb = 'tt' + imdb return getTrakt('/scrobble/pause', {"movie": {"ids": {"imdb": imdb}}, "progress": watched_percent}) except: log_utils.error()
def get_showSeasons_meta(self, tmdb): # builds seasons meta from show level request if not tmdb: return None try: result = self.get_show_request(tmdb) if '404:NOT FOUND' in result: return result if not result: return meta = {} except: from resources.lib.modules import log_utils log_utils.error() return None try: meta['mediatype'] = 'tvshow' meta['fanart'] = '%s%s' % (fanart_path, result['backdrop_path']) if result.get('backdrop_path') else '' try: meta['duration'] = min(result['episode_run_time']) * 60 except: meta['duration'] = '' meta['premiered'] = str(result.get('first_air_date', '')) if result.get('first_air_date') else '' try: meta['year'] = meta['premiered'][:4] except: meta['year'] = '' meta['genre'] = ' / '.join([x['name'] for x in result.get('genres', {})]) or 'NA' meta['tmdb'] = tmdb meta['in_production'] = result.get('in_production') # do not use for "season_isAiring", this is show wide and "season_isAiring" is season specific for season pack scraping. meta['last_air_date'] = result.get('last_air_date', '') meta['last_episode_to_air'] = result.get('last_episode_to_air', '') meta['tvshowtitle'] = result.get('name') # meta['next_episode_to_air'] = results.get('next_episode_to_air', '') try: meta['studio'] = result.get('networks', {})[0].get('name') except: meta['studio'] = '' meta['total_episodes'] = result.get('number_of_episodes') # counts aired eps meta['total_seasons'] = result.get('number_of_seasons') try: meta['origin_country'] = result.get('origin_country')[0] except: meta['origin_country'] = '' meta['original_language'] = result.get('original_language') meta['originaltitle'] = result.get('original_name') meta['plot'] = result.get('overview', '') if result.get('overview') else '' # meta['?'] = result.get('popularity', '') meta['poster'] = '%s%s' % (poster_path, result['poster_path']) if result.get('poster_path') else '' meta['tvshow_poster'] = meta['poster'] # check that this new dict key is used throughout try: meta['country_codes'] = [i['iso_3166_1'] for i in result['production_countries']] except: meta['country_codes'] = '' meta['seasons'] = result.get('seasons') meta['status'] = result.get('status') # meta['counts'] = self.seasonCountParse(meta['seasons']) # check on performance hit meta['counts'] = dict(sorted({(str(i['season_number']), i['episode_count']) for i in meta['seasons']}, key=lambda k: int(k[0]))) if meta['status'].lower in ('ended', 'canceled'): meta['total_aired_episodes'] = result.get('number_of_episodes') else: meta['total_aired_episodes'] = self.airedEpisodesParse(meta['seasons'], meta['last_episode_to_air']) # meta['total_aired_episodes'] = sum([i['episode_count'] for i in meta['seasons'] if i['season_number'] < meta['last_episode_to_air']['season_number'] and i['season_number'] != 0]) + meta['last_episode_to_air']['episode_number'] meta['spoken_languages'] = result.get('spoken_languages') meta['tagline'] = result.get('tagline', '') meta['type'] = result.get('type') meta['rating'] = result.get('vote_average', '') meta['votes'] = result.get('vote_count', '') crew = result.get('credits', {}).get('crew') try: meta['director'] = ', '.join([d['name'] for d in [x for x in crew if x['job'] == 'Director']]) except: meta['director'] = '' try: meta['writer'] = ', '.join([w['name'] for w in [y for y in crew if y['job'] == 'Writer']]) # movies also contains "screenplay", "author", "novel". See if any apply for shows except: meta['writer'] = '' meta['castandart'] = [] for person in result['credits']['cast']: try: meta['castandart'].append({'name': person['name'], 'role': person['character'], 'thumbnail': ('%s%s' % (profile_path, person['profile_path']) if person.get('profile_path') else '')}) except: pass if len(meta['castandart']) == 150: break try: meta['mpaa'] = [x['rating'] for x in result['content_ratings']['results'] if x['iso_3166_1'] == 'US'][0] except: try: meta['mpaa'] = result['content_ratings'][0]['rating'] except: meta['mpaa'] = '' ids = result.get('external_ids', {}) meta['imdb'] = str(ids.get('imdb_id', '')) if ids.get('imdb_id') else '' meta['imdbnumber'] = meta['imdb'] meta['tvdb'] = str(ids.get('tvdb_id', '')) if ids.get('tvdb_id') else '' # make aliases match what trakt returns in sources module for title checking scrape results try: meta['aliases'] = [{'title': x['title'], 'country': x['iso_3166_1'].lower()} for x in result.get('alternative_titles', {}).get('results') if x.get('iso_3166_1').lower() in ('us', 'uk', 'gb')] except: meta['aliases'] = [] try: meta['trailer'] = [x for x in result['videos']['results'] if x['site'] == 'YouTube' and x['type'] in ('Trailer', 'Teaser')][0]['key'] meta['trailer'] = control_trailer % meta['trailer'] except: meta['trailer'] = '' # meta['banner'] = '' # not available from TMDb except: from resources.lib.modules import log_utils log_utils.error() return meta
def scrobbleEpisode(tvdb, season, episode, watched_percent): try: season, episode = int('%01d' % int(season)), int('%01d' % int(episode)) return getTrakt('/scrobble/pause', {"show": {"ids": {"tvdb": tvdb}}, "episode": {"season": season, "number": episode}, "progress": watched_percent}) except: log_utils.error()
def syncMyAccounts(silent=False): try: all_acct = myaccounts.getAll() trakt_acct = all_acct.get('trakt') if getSetting('trakt.token') != trakt_acct.get('token'): trakt_username = trakt_acct.get('username') setSetting('trakt.username', trakt_username) if trakt_username != '': setSetting('trakt.isauthed', 'true') else: setSetting('trakt.isauthed', '') setSetting('trakt.expires', trakt_acct.get('expires')) setSetting('trakt.token', trakt_acct.get('token')) setSetting('trakt.refresh', trakt_acct.get('refresh')) ad_acct = all_acct.get('alldebrid') if getSetting('alldebrid.username') != ad_acct.get('username'): setSetting('alldebrid.token', ad_acct.get('token')) # if getSetting('alldebrid.token') == '': setSetting('alldebrid.enable', 'false') setSetting('alldebrid.username', ad_acct.get('username')) pm_acct = all_acct.get('premiumize') if getSetting('premiumize.username') != pm_acct.get('username'): setSetting('premiumize.token', pm_acct.get('token')) # if getSetting('premiumize.token') == '': setSetting('premiumize.enable', 'false') setSetting('premiumize.username', pm_acct.get('username')) rd_acct = all_acct.get( 'realdebrid' ) # token refresh 1hr expiry, Venom handles this internally if getSetting('realdebrid.username') != rd_acct.get('username'): setSetting('realdebrid.token', rd_acct.get('token')) # if getSetting('realdebrid.token') == '': setSetting('realdebrid.enable', 'false') setSetting('realdebrid.username', rd_acct.get('username')) setSetting('realdebrid.client_id', rd_acct.get('client_id')) setSetting('realdebrid.refresh', rd_acct.get('refresh')) setSetting('realdebrid.secret', rd_acct.get('secret')) fp_acct = all_acct.get('filepursuit') if getSetting('filepursuit.api') != fp_acct.get('api_key'): setSetting('filepursuit.api', fp_acct.get('api_key')) fu_acct = all_acct.get('furk') if getSetting('furk.username') != fu_acct.get('username'): setSetting('furk.username', fu_acct.get('username')) setSetting('furk.password', fu_acct.get('password')) if getSetting('furk.api') != fu_acct.get('api_key'): setSetting('furk.api', fu_acct.get('api_key')) en_acct = all_acct.get('easyNews') if getSetting('easynews.username') != en_acct.get('username'): setSetting('easynews.username', en_acct.get('username')) setSetting('easynews.password', en_acct.get('password')) gdrive_acct = all_acct.get('gdrive') if getSetting('gdrive.url') != gdrive_acct.get('url'): setSetting('gdrive.url', gdrive_acct.get('url')) or_acct = all_acct.get('ororo') if getSetting('ororo.username') != or_acct.get('email'): setSetting('ororo.username', or_acct.get('email')) setSetting('ororo.password', or_acct.get('password')) fanart_acct = all_acct.get('fanart_tv') if getSetting('fanart_tv.api_key') != fanart_acct.get('api_key'): setSetting('fanart_tv.api_key', fanart_acct.get('api_key')) tmdb_acct = all_acct.get('tmdb') if getSetting('tmdb.api.key') != tmdb_acct.get('api_key'): setSetting('tmdb.api.key', tmdb_acct.get('api_key')) if getSetting('tmdb.username') != tmdb_acct.get('username'): setSetting('tmdb.username', tmdb_acct.get('username')) if getSetting('tmdb.password') != tmdb_acct.get('password'): setSetting('tmdb.password', tmdb_acct.get('password')) if getSetting('tmdb.session_id') != tmdb_acct.get('session_id'): setSetting('tmdb.session_id', tmdb_acct.get('session_id')) # tvdb_acct = all_acct.get('tvdb') # no longer used in Venom # if getSetting('tvdb.api.key') != tvdb_acct.get('api_key'): # setSetting('tvdb.api.key', tvdb_acct.get('api_key')) imdb_acct = all_acct.get('imdb') if getSetting('imdb.user') != imdb_acct.get('user'): setSetting('imdb.user', imdb_acct.get('user')) if not silent: notification(message=32114) except: from resources.lib.modules import log_utils log_utils.error()
def getTrakt(url, post=None, cache=True, check=False, timestamp=None, extended=False, direct=False, authentication=None): # def getTrakt(url, post = None, cache = True, check = True, timestamp = None, extended = False, direct = False, authentication = None): try: if not url.startswith(BASE_URL): url = urljoin(BASE_URL, url) if authentication: valid = True token = authentication['token'] refresh = authentication['refresh'] else: valid = getTraktCredentialsInfo() is True token = control.setting('trakt.token') refresh = control.setting('trakt.refresh') headers = {'Content-Type': 'application/json', 'trakt-api-key': V2_API_KEY, 'trakt-api-version': '2'} if post is not None: post = json.dumps(post) if direct or not valid: result = client.request(url, post = post, headers = headers) return result headers['Authorization'] = 'Bearer %s' % token result = client.request(url, post = post, headers = headers, output = 'extended', error = True) if result and not (result[1] == '401' or result[1] == '405'): if check: _cacheCheck() if extended: return result[0], result[2] else: return result[0] try: code = str(result[1]) except: code = '' if code.startswith('5') or (result and isinstance(result, basestring) and '<html' in result) or not result: return _error(url = url, post = post, timestamp = timestamp, message = 33676) oauth = urljoin(BASE_URL, '/oauth/token') opost = {'client_id': V2_API_KEY, 'client_secret': CLIENT_SECRET, 'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob', 'grant_type': 'refresh_token', 'refresh_token': refresh} result = client.request(oauth, post = json.dumps(opost), headers = headers, error = True) # log_utils.log('result = %s' % result, __name__, log_utils.LOGDEBUG) try: code = str(result[1]) except: code = '' if code.startswith('5') or not result or (result and isinstance(result, basestring) and '<html' in result): return _error(url = url, post = post, timestamp = timestamp, message = 33676) elif result and code in ['404']: return _error(url = url, post = post, timestamp = timestamp, message = 33786) elif result and code in ['401', '405']: return _error(url = url, post = post, timestamp = timestamp, message = 33677) result = json.loads(result) token, refresh = result['access_token'], result['refresh_token'] control.setSetting('trakt.token', token) control.setSetting('trakt.refresh', refresh) headers['Authorization'] = 'Bearer %s' % token result = client.request(url, post = post, headers = headers, output = 'extended') if check: _cacheCheck() if extended: return result[0], result[2] else: return result[0] except: log_utils.error() return None
def movieDirectory(self, items, unfinished=False, next=True): if not items: # with reuselanguageinvoker on an empty directory must be loaded, do not use sys.exit() control.hide() ; control.notification(title=32001, message=33049) from resources.lib.modules.player import Bookmarks sysaddon, syshandle = argv[0], int(argv[1]) disable_player_art = control.setting('disable.player.art') == 'true' hosts_mode = control.setting('hosts.mode') is_widget = 'plugin' not in control.infoLabel('Container.PluginName') settingFanart = control.setting('fanart') == 'true' addonPoster, addonFanart, addonBanner = control.addonPoster(), control.addonFanart(), control.addonBanner() indicators = playcount.getMovieIndicators(refresh=True) isPlayable = 'false' if 'plugin' not in control.infoLabel('Container.PluginName'): isPlayable = 'true' elif hosts_mode != '1': isPlayable = 'true' if hosts_mode == '2': playbackMenu = control.lang(32063) else: playbackMenu = control.lang(32064) if trakt.getTraktIndicatorsInfo(): watchedMenu, unwatchedMenu = control.lang(32068), control.lang(32069) else: watchedMenu, unwatchedMenu = control.lang(32066), control.lang(32067) playlistManagerMenu, queueMenu = control.lang(35522), control.lang(32065) traktManagerMenu, addToLibrary = control.lang(32070), control.lang(32551) nextMenu, clearSourcesMenu = control.lang(32053), control.lang(32611) for i in items: try: imdb, tmdb, title, year = i.get('imdb', ''), i.get('tmdb', ''), i['title'], i.get('year', '') trailer, runtime = i.get('trailer'), i.get('duration') label = '%s (%s)' % (title, year) try: labelProgress = label + '[COLOR %s] [%s][/COLOR]' % (self.highlight_color, str(round(float(i['progress'] * 100), 1)) + '%') except: labelProgress = label try: if int(re.sub(r'[^0-9]', '', str(i['premiered']))) > int(re.sub(r'[^0-9]', '', str(self.today_date))): labelProgress = '[COLOR %s][I]%s[/I][/COLOR]' % (self.unairedcolor, labelProgress) except: pass if i.get('traktHistory') is True: try: air_time = tools.Time.convert(stringTime=i.get('lastplayed', ''), zoneFrom='utc', zoneTo='local', formatInput='%Y-%m-%dT%H:%M:%S.000Z', formatOutput='%b %d %Y %I:%M %p') if air_time[12] == '0': air_time = air_time[:12] + '' + air_time[13:] labelProgress = labelProgress + '[COLOR %s] [%s][/COLOR]' % (self.highlight_color, air_time) except: pass sysname, systitle = quote_plus(label), quote_plus(title) meta = dict((k, v) for k, v in control.iteritems(i) if v is not None and v != '') meta.update({'code': imdb, 'imdbnumber': imdb, 'mediatype': 'movie', 'tag': [imdb, tmdb]}) try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)}) except: pass poster = meta.get('poster3') or meta.get('poster2') or meta.get('poster') or addonPoster fanart = '' if settingFanart: fanart = meta.get('fanart3') or meta.get('fanart2') or meta.get('fanart') or addonFanart landscape = meta.get('landscape') or fanart thumb = meta.get('thumb') or poster or landscape icon = meta.get('icon') or poster banner = meta.get('banner3') or meta.get('banner2') or meta.get('banner') or addonBanner art = {} if disable_player_art and hosts_mode == '2': # setResolvedUrl uses the selected ListItem so pop keys out here if user wants no player art for k in ('clearart', 'clearlogo', 'discart'): meta.pop(k, None) art.update({'icon': icon, 'thumb': thumb, 'banner': banner, 'poster': poster, 'fanart': fanart, 'landscape': landscape, 'clearlogo': meta.get('clearlogo', ''), 'clearart': meta.get('clearart', ''), 'discart': meta.get('discart', ''), 'keyart': meta.get('keyart', '')}) for k in ('poster2', 'poster3', 'fanart2', 'fanart3', 'banner2', 'banner3', 'trailer'): meta.pop(k, None) meta.update({'poster': poster, 'fanart': fanart, 'banner': banner}) ####-Context Menu and Overlays-#### cm = [] if self.traktCredentials: cm.append((traktManagerMenu, 'RunPlugin(%s?action=tools_traktManager&name=%s&imdb=%s)' % (sysaddon, sysname, imdb))) try: overlay = int(playcount.getMovieOverlay(indicators, imdb)) watched = (overlay == 5) if watched: cm.append((unwatchedMenu, 'RunPlugin(%s?action=playcount_Movie&name=%s&imdb=%s&query=4)' % (sysaddon, sysname, imdb))) meta.update({'playcount': 1, 'overlay': 5}) # lastplayed = trakt.watchedMoviesTime(imdb) # meta.update({'lastplayed': lastplayed}) else: cm.append((watchedMenu, 'RunPlugin(%s?action=playcount_Movie&name=%s&imdb=%s&query=5)' % (sysaddon, sysname, imdb))) meta.update({'playcount': 0, 'overlay': 4}) except: pass sysmeta, sysart = quote_plus(jsdumps(meta)), quote_plus(jsdumps(art)) url = '%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s' % (sysaddon, systitle, year, imdb, tmdb, sysmeta) sysurl = quote_plus(url) cm.append((playlistManagerMenu, 'RunPlugin(%s?action=playlist_Manager&name=%s&url=%s&meta=%s&art=%s)' % (sysaddon, sysname, sysurl, sysmeta, sysart))) cm.append((queueMenu, 'RunPlugin(%s?action=playlist_QueueItem&name=%s)' % (sysaddon, sysname))) cm.append((playbackMenu, 'RunPlugin(%s?action=alterSources&url=%s&meta=%s)' % (sysaddon, sysurl, sysmeta))) if hosts_mode == '1': cm.append(('Rescrape Item', 'RunPlugin(%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s&rescrape=true)' % (sysaddon, systitle, year, imdb, tmdb, sysmeta))) elif hosts_mode != '1': cm.append(('Rescrape Item', 'PlayMedia(%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s&rescrape=true)' % (sysaddon, systitle, year, imdb, tmdb, sysmeta))) cm.append((addToLibrary, 'RunPlugin(%s?action=library_movieToLibrary&name=%s&title=%s&year=%s&imdb=%s&tmdb=%s)' % (sysaddon, sysname, systitle, year, imdb, tmdb))) cm.append(('Find similar', 'ActivateWindow(10025,%s?action=movies&url=https://api.trakt.tv/movies/%s/related,return)' % (sysaddon, imdb))) cm.append((clearSourcesMenu, 'RunPlugin(%s?action=cache_clearSources)' % sysaddon)) cm.append(('[COLOR red]Venom Settings[/COLOR]', 'RunPlugin(%s?action=tools_openSettings)' % sysaddon)) #################################### if trailer: meta.update({'trailer': trailer}) else: meta.update({'trailer': '%s?action=trailer&type=%s&name=%s&year=%s&imdb=%s' % (sysaddon, 'movie', sysname, year, imdb)}) item = control.item(label=labelProgress, offscreen=True) if 'castandart' in i: item.setCast(i['castandart']) item.setArt(art) item.setUniqueIDs({'imdb': imdb, 'tmdb': tmdb}) item.setProperty('IsPlayable', isPlayable) if is_widget: item.setProperty('isVenom_widget', 'true') resumetime = Bookmarks().get(name=label, imdb=imdb, tmdb=tmdb, year=str(year), runtime=runtime, ck=True) # item.setProperty('TotalTime', str(meta['duration'])) # Adding this property causes the Kodi bookmark CM items to be added item.setProperty('ResumeTime', str(resumetime)) try: watched_percent = round(float(resumetime) / float(runtime) * 100, 1) # resumetime and runtime are both in seconds item.setProperty('PercentPlayed', str(watched_percent)) except: pass item.setInfo(type='video', infoLabels=control.metadataClean(meta)) item.addContextMenuItems(cm) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) except: log_utils.error() if next: try: if not items: raise Exception() url = items[0]['next'] if not url: raise Exception() url_params = dict(parse_qsl(urlsplit(url).query)) if 'imdb.com' in url and 'start' in url_params: page = ' [I](%s)[/I]' % str(int(((int(url_params.get('start')) - 1) / int(self.count)) + 1)) else: page = ' [I](%s)[/I]' % url_params.get('page') nextMenu = '[COLOR skyblue]' + nextMenu + page + '[/COLOR]' u = urlparse(url).netloc.lower() if u not in self.tmdb_link: url = '%s?action=moviePage&url=%s' % (sysaddon, quote_plus(url)) elif u in self.tmdb_link: url = '%s?action=tmdbmoviePage&url=%s' % (sysaddon, quote_plus(url)) item = control.item(label=nextMenu, offscreen=True) icon = control.addonNext() item.setProperty('IsPlayable', 'false') item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon}) item.setProperty ('SpecialSort', 'bottom') control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) except: log_utils.error() control.content(syshandle, 'movies') control.directory(syshandle, cacheToDisc=True) control.sleep(500) views.setView('movies', {'skin.estuary': 55, 'skin.confluence': 500})
def play_source(self, title, year, season, episode, imdb, tvdb, url, meta, select=None): try: if url is None: control.cancelPlayback() raise Exception self.media_type = 'movie' if season is None or episode is None else 'episode' self.title = title self.year = str(year) if self.media_type == 'movie': self.name = quote_plus(title) + quote_plus(' (%s)' % self.year) self.season = None self.episode = None elif self.media_type == 'episode': self.name = quote_plus(title) + quote_plus( ' S%02dE%02d' % (int(season), int(episode))) self.season = '%01d' % int(season) self.episode = '%01d' % int(episode) self.name = unquote_plus( self.name) # this looks dumb, quote to only unquote? self.DBID = None self.imdb = imdb if imdb is not None else '0' self.tvdb = tvdb if tvdb is not None else '0' self.ids = {'imdb': self.imdb, 'tvdb': self.tvdb} self.ids = dict( (k, v) for k, v in self.ids.iteritems() if v != '0') self.meta = meta self.offset = Bookmarks().get(self.name, self.year) item = control.item(path=url) ## - compare meta received to database and use largest(eventually switch to a request to fetch missing db meta for item) self.imdb_user = control.setting('imdb.user').replace('ur', '') self.tmdb_key = control.setting('tm.user') if self.tmdb_key == '' or self.tmdb_key is None: self.tmdb_key = '3320855e65a9758297fec4f7c9717698' tvdb_key_list = [ 'MDZjZmYzMDY5MGY5Yjk2MjI5NTcwNDRmMjE1OWZmYWU=', 'MUQ2MkYyRjkwMDMwQzQ0NA==', 'N1I4U1paWDkwVUE5WU1CVQ==' ] self.tvdb_key = tvdb_key_list[int(control.setting('tvdb.api.key'))] if self.media_type == 'episode': self.user = str(self.imdb_user) + str(self.tvdb_key) else: self.user = str(self.tmdb_key) self.lang = control.apiLanguage()['tvdb'] items = [{ 'imdb': imdb, 'tvdb': tvdb }] # need to add tmdb but it's not passed as of now items_ck = copy.deepcopy(items) meta1 = meta meta2 = metacache.fetch(items, self.lang, self.user)[0] if meta1 is not None: if len(meta2) > len(meta1): meta = meta2 else: meta = meta1 else: meta = meta2 if meta2 != items_ck[0] else meta1 ################## poster, thumb, season_poster, fanart, banner, clearart, clearlogo, discart, meta = self.getMeta( meta) if self.media_type == 'episode': self.episodeIDS = meta.get('episodeIDS', '0') item.setUniqueIDs(self.episodeIDS) if control.setting('disable.player.art') == 'true': item.setArt({ 'thumb': thumb, 'tvshow.poster': season_poster, 'season.poster': season_poster, 'tvshow.fanart': fanart }) else: item.setArt({ 'tvshow.clearart': clearart, 'tvshow.clearlogo': clearlogo, 'tvshow.discart': discart, 'thumb': thumb, 'tvshow.poster': season_poster, 'season.poster': season_poster, 'tvshow.fanart': fanart }) else: item.setUniqueIDs(self.ids) if control.setting('disable.player.art') == 'true': item.setArt({ 'thumb': thumb, 'poster': poster, 'fanart': fanart }) else: item.setArt({ 'clearart': clearart, 'clearlogo': clearlogo, 'discart': discart, 'thumb': thumb, 'poster': poster, 'fanart': fanart }) if 'castandart' in meta: item.setCast(meta.get('castandart', '')) item.setInfo(type='video', infoLabels=control.metadataClean(meta)) if 'plugin' not in control.infoLabel( 'Container.PluginName') or select != '1': if control.window.getProperty('infodialogs.active') or \ control.window.getProperty('extendedinfo_running'): control.closeAll() control.resolve(int(sys.argv[1]), True, item) elif select == '1': control.closeAll() control.player.play(url, item) self.keepAlive() control.window.setProperty('script.trakt.ids', json.dumps(self.ids)) control.window.clearProperty('script.trakt.ids') except: log_utils.error() return control.cancelPlayback()