diff --git a/channels.json b/channels.json index 5ae7e2d9..888b3c70 100644 --- a/channels.json +++ b/channels.json @@ -31,7 +31,7 @@ "mediasetplay": "https://www.mediasetplay.mediaset.it", "mondoserietv": "https://mondoserietv.club", "paramount": "https://www.paramountnetwork.it", - "piratestreaming": "https://www.piratestreaming.design", + "piratestreaming": "https://www.piratestreaming.video", "polpotv": "https://roma.polpo.tv", "raiplay": "https://www.raiplay.it", "seriehd": "https://altadefinizionecommunity.casa", @@ -48,7 +48,6 @@ "findhost": { "altadefinizioneclick": "https://altadefinizione-nuovo.click", "altadefinizionecommunity": "https://altaregistrazione.com", - "animealtadefinizione": "https://www.animealtadefinizione.it", "filmpertutti": "https://filmpertuttiii.nuovo.live" } } \ No newline at end of file diff --git a/channels/0example.py.txt b/channels/0example.py.txt index f719b180..a07a91de 100644 --- a/channels/0example.py.txt +++ b/channels/0example.py.txt @@ -145,7 +145,7 @@ def mainlist(item): # AVVERTENZE: Se il titolo è trovato nella ricerca TMDB/TVDB/Altro allora le locandine e altre info non saranno quelle recuperate nel sito.!!!! @support.scrape def peliculas(item): - #support.dbg() # decommentare per attivare web_pdb + #logger.dbg() # decommentare per attivare web_pdb action = '' blacklist = [''] @@ -159,7 +159,7 @@ def peliculas(item): @support.scrape def episodios(item): - #support.dbg() + #logger.dbg() action = '' blacklist = [''] @@ -175,7 +175,7 @@ def episodios(item): # per genere, per anno, per lettera, per qualità ecc ecc @support.scrape def genres(item): - #support.dbg() + #logger.dbg() action = '' blacklist = [''] @@ -195,7 +195,7 @@ def genres(item): # andranno modificate anche le def peliculas e episodios ove occorre def select(item): logger.debug() - #support.dbg() + #logger.dbg() data = httptools.downloadpage(item.url, headers=headers).data # pulizia di data, in caso commentare le prossime 2 righe data = re.sub('\n|\t', ' ', data) diff --git a/channels/__init__.py b/channels/__init__.py index 32a587e7..20e069e6 100644 --- a/channels/__init__.py +++ b/channels/__init__.py @@ -3,6 +3,7 @@ import os import sys + # Appends the main plugin dir to the PYTHONPATH if an internal package cannot be imported. # Examples: In Plex Media Server all modules are under "Code.*" package, and in Enigma2 under "Plugins.Extensions.*" try: @@ -10,3 +11,4 @@ try: import core except: sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) + diff --git a/channels/animealtadefinizione.py b/channels/animealtadefinizione.py index 6a7df1c7..5e193863 100644 --- a/channels/animealtadefinizione.py +++ b/channels/animealtadefinizione.py @@ -116,7 +116,6 @@ def findvideos(item): if item.contentType == 'movie': matches = support.match(item, patron=epPatron).matches for title, url in matches: - # support.dbg() get_video_list(item, url, title, itemlist) else: get_video_list(item, item.url, support.config.get_localized_string(30137), itemlist) diff --git a/channels/animesaturn.py b/channels/animesaturn.py index 9db2b16b..a8fbfd0b 100644 --- a/channels/animesaturn.py +++ b/channels/animesaturn.py @@ -20,8 +20,6 @@ def get_cookie(data): def get_data(item): - # support.dbg() - # url = support.match(item.url, headers=headers, follow_redirects=True, only_headers=True).url data = support.match(item.url, headers=headers, follow_redirects=True).data if 'ASCookie' in data: get_cookie(data) @@ -177,46 +175,11 @@ def findvideos(item): logger.debug() itemlist = [] links = [] - # page_data = '' - # titles =['Primario', 'Secondario', 'Alternativo Primario', 'Alternativo Secondario'] - # pre_data = support.match(item, headers=headers).data - # url = support.match(pre_data , patron=r'[^>]+>[^>]+>G').match - # urls = [url, url+'&extra=1', url+'&s=alt', url+'&s=alt&extra=1'] - # links = [] - # support.dbg() - # for i, url in enumerate(urls): - # data = support.match(url, headers=headers).data - # if not '&s' in url: - # link = support.match(data, patron=r'(?:[^>]+>[^>]+>G').match - # internal = support.match(data, patron=r'[^>]+>[^>]+>G').match urls = support.match(support.match(main_url, headers=headers).data, patron=r']+>|/>)(.*?)(?:|

)', patronBlock=r'Streaming:(.*?)').matches if 'Episodio' in str(item.url): item.contentType = 'tvshow' diff --git a/channels/dreamsub.py b/channels/dreamsub.py index 0c1169c8..50eb7aba 100644 --- a/channels/dreamsub.py +++ b/channels/dreamsub.py @@ -117,7 +117,6 @@ def episodios(item): def findvideos(item): itemlist = [] logger.debug() - # support.dbg() matches = support.match(item, patron=r'href="([^"]+)"', patronBlock=r'
(?P.+?)
' diff --git a/channels/ilgeniodellostreaming.py b/channels/ilgeniodellostreaming.py index bb60ed45..cc67e083 100644 --- a/channels/ilgeniodellostreaming.py +++ b/channels/ilgeniodellostreaming.py @@ -191,7 +191,7 @@ def findvideos(item): for i, url in enumerate(list_url): itemlist.append(support.Item( channel=item.channel, - title=list_servers[i], + # title=list_servers[i], url=url, action='play', quality=list_quality[i], diff --git a/channels/mediasetplay.py.old b/channels/mediasetplay.py.old index 1a0645ee..e74f99f8 100644 --- a/channels/mediasetplay.py.old +++ b/channels/mediasetplay.py.old @@ -30,7 +30,7 @@ current_session.headers.update({'Content-Type': 'application/json', 'User-Agent' # login anonimo res = current_session.post(loginUrl, json=loginData, verify=False) -support.dbg() +logger.dbg() Token = res.json['response']['beToken'] sid = res.json['response']['sid'] current_session.headers.update({'authorization': 'Bearer' + Token}) @@ -318,7 +318,7 @@ def get_from_id(item): def get_programs(item, ret=[], args={}): hasMore = False url = '' - # support.dbg() + # logger.dbg() if 'search' in item.args: args['uxReference'] = item.args[2] diff --git a/channels/seriehd.py b/channels/seriehd.py index 7f0c5597..628b6c87 100644 --- a/channels/seriehd.py +++ b/channels/seriehd.py @@ -105,7 +105,7 @@ def episodios(item): data = '' # debugging - # support.dbg() + # logger.dbg() # for i, season in enumerate(seasons.matches): # data += get_season(seasons.data if i == 0 else '', season[0], season[1]) import sys diff --git a/channels/streamtime.py b/channels/streamtime.py index 439d3660..00de08c8 100644 --- a/channels/streamtime.py +++ b/channels/streamtime.py @@ -134,7 +134,7 @@ def episodios(item): def findvideos(item): - # support.dbg() + # logger.dbg() domain = scrapertools.find_single_match(item.url, 'https?://[a-z0-9.-]+') if item.contentType == 'movie': id = item.url.split('/')[-1] diff --git a/channels/tantifilm.py b/channels/tantifilm.py index db9217d6..d4a412d6 100644 --- a/channels/tantifilm.py +++ b/channels/tantifilm.py @@ -191,13 +191,13 @@ def findvideos(item): # data += '\n'.join(listurl) logger.debug(data) itemlist = [] - # support.dbg() + # logger.dbg() if '/serietv/series/names' in item.url: itemlist.extend(support.server(item, itemlist=hdpass(Item(url=item.url)))) else: urls = support.match(data, patron=player_iframe).matches - # support.dbg() + # logger.dbg() if item.otherLinks: urls += support.match(item.otherLinks, patron=r'href="([^"]+)').matches diff --git a/channels/vvvvid.py b/channels/vvvvid.py index 26c2c3c6..6ab9e301 100644 --- a/channels/vvvvid.py +++ b/channels/vvvvid.py @@ -102,7 +102,7 @@ def newest(categoria): def peliculas(item): itemlist = [] - # support.dbg() + # logger.dbg() if not item.args: json_file =loadjs(item.url + 'channel/10005/last/') logger.debug(json_file) diff --git a/core/autoplay.py b/core/autoplay.py index e78f5c07..399b1ad3 100644 --- a/core/autoplay.py +++ b/core/autoplay.py @@ -32,7 +32,7 @@ def start(itemlist, item): if not config.is_xbmc(): return itemlist - if config.get_setting('autoplay') or (item.channel == 'community' and item.autoplay): + if config.get_setting('autoplay') or item.autoplay: # Save the current value of "Action and Player Mode" in preferences user_config_setting_action = config.get_setting("default_action") # user_config_setting_player = config.get_setting("player_mode") @@ -72,8 +72,9 @@ def start(itemlist, item): platformtools.dialog_notification('AutoPlay', '{}{}{}'.format(name, lang, quality), sound=False) # Try to play the links If the channel has its own play method, use it - try: channel = __import__('channels.%s' % channel_id, None, None, ["channels.%s" % channel_id]) - except: channel = __import__('specials.%s' % channel_id, None, None, ["specials.%s" % channel_id]) + channel = platformtools.channel_import(channel_id) + if not channel: + return if hasattr(channel, 'play'): resolved_item = getattr(channel, 'play')(videoitem) if len(resolved_item) > 0: diff --git a/core/channeltools.py b/core/channeltools.py index 7313778b..5a14350d 100644 --- a/core/channeltools.py +++ b/core/channeltools.py @@ -171,7 +171,6 @@ def get_default_settings(channel_name): channel_path = filetools.join(config.get_runtime_path(), 'channels', channel_name + '.json') - # from core.support import dbg; dbg() if filetools.exists(channel_path): default_controls = default_file['settings'] default_controls_renumber = default_file['renumber'] diff --git a/core/scraper.py b/core/scraper.py index 6286d07b..503b0a63 100644 --- a/core/scraper.py +++ b/core/scraper.py @@ -21,7 +21,6 @@ def find_and_set_infoLabels(item): :param item: :return: Boolean indicating if the 'code' could be found """ - # from core.support import dbg;dbg() global scraper scraper = None # logger.debug("item:\n" + item.tostring('\n')) diff --git a/core/servertools.py b/core/servertools.py index e957b11e..d3fa22b7 100644 --- a/core/servertools.py +++ b/core/servertools.py @@ -63,7 +63,7 @@ def find_video_items(item=None, data=None): for label, url, server, thumbnail in findvideos(data): title = label itemlist.append( - item.clone(title=title, action="play", url=url, thumbnail=thumbnail, server=server, folder=False)) + item.clone(serverName=title, action="play", url=url, thumbnail=thumbnail, server=server, folder=False)) return itemlist @@ -118,7 +118,7 @@ def get_servers_itemlist(itemlist, fnc=None, sort=False): item.server = "directo" if fnc: - item.title = fnc(item) + item.serverName = fnc(item) # Sort according to favoriteslist if necessary @@ -751,7 +751,7 @@ def check_list_links(itemlist, numero='', timeout=3): if res: it = res[0] verificacion = res[1] - it.title = verificacion + ' ' + it.title.strip() + it.serverName = verificacion + ' ' + it.title.strip() logger.debug('VERIFICATION= ' + verificacion) it.alive = verificacion return itemlist diff --git a/core/support.py b/core/support.py index 241b0d56..a96db6cb 100755 --- a/core/support.py +++ b/core/support.py @@ -20,7 +20,7 @@ from time import time from core import httptools, scrapertools, servertools, tmdb, channeltools, autoplay from core.item import Item from lib import unshortenit -from platformcode import config, logger +from platformcode import config, logger, platformtools channels_order = {'Rai 1': 1, 'Rai 2': 2, @@ -486,7 +486,8 @@ class scrape: it.action=self.action if it.action == 'findvideos': - it.window = True if item.window_type == 0 or (config.get_setting("window_type") == 0) else False + platformtools.window_type(it) + # it.window = True if item.window_type == 0 or (config.get_setting("window_type") == 0) else False if it.window: it.folder = False for lg in list(set(match.keys()).difference(self.known_keys)): @@ -573,20 +574,6 @@ def html_uniform(data): return re.sub("='([^']+)'", '="\\1"', data.replace('\n', ' ').replace('\t', ' ').replace(' ', ' ')) -# Debug - -def dbg(): - if config.dev_mode(): - try: - import web_pdb - if not web_pdb.WebPdb.active_instance: - import webbrowser - webbrowser.open('http://127.0.0.1:5555') - web_pdb.set_trace() - except: - pass - - # Menu def menuItem(itemlist, channel, title='', action='', url='', contentType='undefined', args=[], style=True): @@ -914,7 +901,7 @@ def nextPage(itemlist, item, function_or_level=1, **kwargs): def pagination(itemlist, item, function_level=1): - if stackCheck('channel_search'): + if stackCheck(['channel_search', 'update_videolibrary']): return itemlist if not item.page: @@ -959,7 +946,7 @@ def pagination(itemlist, item, function_level=1): def season_pagination(itemlist, item, seasons=[], function_level=1): - if stackCheck('channel_search'): + if stackCheck(['channel_search', 'update_videolibrary']): return itemlist action = function_level if type(function_level) == str else inspect.stack()[function_level][3] @@ -1020,6 +1007,8 @@ def season_pagination(itemlist, item, seasons=[], function_level=1): def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=True, Download=True, patronTag=None, Videolibrary=True): logger.debug() + if item.autoplay != '': AutoPlay = item.autoplay + if not data and not itemlist: data = httptools.downloadpage(item.url, headers=headers, ignore_response_code=True).data if data: @@ -1050,26 +1039,36 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru videoitem.server = videoitem.server.lower() if videoitem.video_urls or srv_param.get('active', False): - logger.debug(item) - quality = videoitem.quality if videoitem.quality else item.quality if item.quality else '' - # videoitem = item.clone(url=videoitem.url, serverName=videoitem.serverName, server=videoitem.server, action='play') - videoitem.contentLanguage = videoitem.contentLanguage if videoitem.contentLanguage else item.contentLanguage if item.contentLanguage else 'ITA' - videoitem.serverName = videoitem.title if videoitem.server == 'directo' else servertools.get_server_parameters(videoitem.server).get('name', videoitem.server.capitalize()) - # videoitem.title = item.contentTitle.strip() if item.contentType == 'movie' and item.contentTitle or (config.get_localized_string(30161) in item.fulltitle) else item.fulltitle - videoitem.plot = typo(videoitem.title, 'bold') + (typo(quality, '_ [] bold') if quality else '') - videoitem.channel = item.channel - videoitem.fulltitle = item.fulltitle - videoitem.show = item.show - videoitem.ch_name = channeltools.get_channel_parameters(item.channel)['title'] - if not videoitem.video_urls: videoitem.thumbnail = item.thumbnail - videoitem.contentType = item.contentType - videoitem.infoLabels = item.infoLabels - videoitem.quality = quality - videoitem.referer = item.referer if item.referer else item.url - videoitem.action = "play" - videoitem.videolibrary_id = item.videolibrary_id - videoitem.from_library = item.from_library - videoitem.fanart = item.fanart if item.contentType == 'movie' else item.thumbnail + + vi = item.clone(server=videoitem.server, + serverName=videoitem.serverName, + url=videoitem.url, + video_urls= videoitem.video_urlsn, + ch_name=channeltools.get_channel_parameters(item.channel)['title'], + action = "play") + if videoitem.title: vi.serverName = videoitem.serverName + if videoitem.quality: vi.quality = videoitem.quality + if not vi.referer: vi.referer = item.url + if videoitem.contentType == 'episode': vi.fanart=videoitem.thumbnail + videoitem = vi + # videoitem = item.clone(serverName = videoitem.title if videoitem.title else videoitem.ser) + # quality = videoitem.quality if videoitem.quality else item.quality if item.quality else '' + # videoitem.contentLanguage = videoitem.contentLanguage if videoitem.contentLanguage else item.contentLanguage if item.contentLanguage else 'ITA' + # videoitem.serverName = videoitem.serverName if videoitem.server == 'directo' else servertools.get_server_parameters(videoitem.server).get('name', videoitem.server.capitalize()) + # videoitem.plot = typo(videoitem.serverName, 'bold') + (typo(quality, '_ [] bold') if quality else '') + # videoitem.channel = item.channel + # videoitem.fulltitle = item.fulltitle + # videoitem.show = item.show + # videoitem.ch_name = channeltools.get_channel_parameters(item.channel)['title'] + # if not videoitem.video_urls: videoitem.thumbnail = item.thumbnail + # videoitem.contentType = item.contentType + # videoitem.infoLabels = item.infoLabels + # videoitem.quality = quality + # videoitem.referer = item.referer if item.referer else item.url + # videoitem.action = "play" + # videoitem.videolibrary_id = item.videolibrary_id + # videoitem.from_library = item.from_library + # videoitem.fanart = item.fanart if item.contentType == 'movie' else item.thumbnail return videoitem # non threaded for webpdb @@ -1084,10 +1083,7 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru for it in futures.as_completed(thL): if it.result(): verifiedItemlist.append(it.result()) - try: - verifiedItemlist.sort(key=lambda it: int(re.sub(r'\D','',it.quality))) - except: - verifiedItemlist.sort(key=lambda it: it.quality, reverse=True) + if patronTag: addQualityTag(item, verifiedItemlist, data, patronTag) @@ -1840,17 +1836,20 @@ def dooplay_menu(item, type): def get_jwplayer_mediaurl(data, srvName, onlyHttp=False, dataIsBlock=False): from core import jsontools video_urls = [] - block = scrapertools.find_single_match(data, r'sources"?\s*:\s*(.*?}])') if not dataIsBlock else data + block = scrapertools.find_single_match(data, r'sources"?\s*:\s*(.*?}?])') if not dataIsBlock else data if block: json = jsontools.load(block) if json: sources = [] for s in json: - if 'file' in s.keys(): - src = s['file'] + if isinstance(s, str): + sources.append((s, '')) else: - src = s['src'] - sources.append((src, s.get('label'))) + if 'file' in s.keys(): + src = s['file'] + else: + src = s['src'] + sources.append((src, s.get('label'))) else: if 'file:' in block: sources = scrapertools.find_multiple_matches(block, r'file:\s*"([^"]+)"(?:,label:\s*"([^"]+)")?') diff --git a/core/tmdb.py b/core/tmdb.py index e92b07b0..dd27ce38 100644 --- a/core/tmdb.py +++ b/core/tmdb.py @@ -214,7 +214,7 @@ def set_infoLabels_itemlist(itemlist, seekTmdb=False, search_language=def_lang, return (_i, _item, ret) - # from core.support import dbg; dbg() + # logger.dbg() # for i, item in enumerate(itemlist): # r_list.append(sub_thread(item, i, seekTmdb)) with futures.ThreadPoolExecutor() as executor: diff --git a/core/trakt_tools.py b/core/trakt_tools.py index 98e4ff74..ea79e9c9 100644 --- a/core/trakt_tools.py +++ b/core/trakt_tools.py @@ -275,7 +275,6 @@ def wait_for_update_trakt(): def update_all(): - # from core.support import dbg;dbg() from time import sleep logger.debug() sleep(20) @@ -306,7 +305,6 @@ def context(item): pass try: - from core.support import dbg;dbg() result = execute(item.clone(url="/sync/watchlist/" + Type)) post = {Type: [{"ids": {"tmdb": item.infoLabels["tmdb_id"]}}]} if condition in str(result): diff --git a/core/tvdb.py b/core/tvdb.py index 6bc3f9fd..2fefce3c 100644 --- a/core/tvdb.py +++ b/core/tvdb.py @@ -78,7 +78,6 @@ otvdb_global = None def find_and_set_infoLabels(item): logger.debug() - # from core.support import dbg;dbg() # logger.debug("item es %s" % item) p_dialog = None @@ -666,8 +665,6 @@ class Tvdb(object): url = HOST + "/episodes/%s" % _id - # from core.support import dbg;dbg() - try: DEFAULT_HEADERS["Accept-Language"] = lang logger.debug("url: %s, \nheaders: %s" % (url, DEFAULT_HEADERS)) diff --git a/core/videolibrarytools.py b/core/videolibrarytools.py index 230c470e..56fdc26d 100644 --- a/core/videolibrarytools.py +++ b/core/videolibrarytools.py @@ -120,7 +120,7 @@ def save_movie(item, silent=False): # get extra info from fanart tv - # support.dbg() + # logger.dbg() extra_info = get_fanart_tv(item) if not item.infoLabels.get('posters', []): item.infoLabels['posters'] = [] item.infoLabels['posters'] += extra_info['poster'] @@ -443,33 +443,34 @@ def save_episodes(item, episodelist, extra_info, host, local_files, silent=False episode = None season_episode = None - if e.contentSeason and e.contentEpisodeNumber: season_episode = '{}x{:02d}'.format(e.contentSeason, e.contentEpisodeNumber) - strm_path = filetools.join(item.base_name, "{}.strm".format(season_episode)) - - if item.infoLabels.get('imdb_id'): e.infoLabels['imdb_id'] = item.infoLabels['imdb_id'] - if item.infoLabels.get('tmdb_id'): e.infoLabels['tmdb_id'] = item.infoLabels['tmdb_id'] - if item.infoLabels.get('tvdb_id'): e.infoLabels['tvdb_id'] = item.infoLabels['tvdb_id'] - - tmdb.set_infoLabels_item(e) - if not e.infoLabels.get('playcount'): e.infoLabels['playcount'] = 0 - head_nfo = scraper.get_nfo(e) - - episode_item = Item(action='findvideos', - channel='videolibrary', - strm_path=strm_path, - contentSeason = e.contentSeason, - contentEpisodeNumber = e.contentEpisodeNumber, - contentType = e.contentType, - infoLabels = e.infoLabels, - head_nfo = head_nfo, - videolibrary_id = item.videolibrary_id, - thumbnail = e.infoLabels.get('poster_path') if e.infoLabels.get('poster_path') else item.thumbnail, - fanart = e.infoLabels.get('poster_path') if e.infoLabels.get('poster_path') else item.fanart, - title = e.infoLabels['title']) - episode = episodes.get(season_episode, {}) + if episode: + episode_item = episode['item'] + else: + strm_path = filetools.join(item.base_name, '{}.strm'.format(season_episode)) + + if item.infoLabels.get('imdb_id'): e.infoLabels['imdb_id'] = item.infoLabels['imdb_id'] + if item.infoLabels.get('tmdb_id'): e.infoLabels['tmdb_id'] = item.infoLabels['tmdb_id'] + if item.infoLabels.get('tvdb_id'): e.infoLabels['tvdb_id'] = item.infoLabels['tvdb_id'] + + tmdb.set_infoLabels_item(e) + if not e.infoLabels.get('playcount'): e.infoLabels['playcount'] = 0 + # head_nfo = scraper.get_nfo(e) + + episode_item = Item(action='findvideos', + channel='videolibrary', + strm_path=strm_path, + contentSeason = e.contentSeason, + contentEpisodeNumber = e.contentEpisodeNumber, + contentType = e.contentType, + infoLabels = e.infoLabels, + # head_nfo = head_nfo, + videolibrary_id = item.videolibrary_id, + thumbnail = e.infoLabels.get('poster_path') if e.infoLabels.get('poster_path') else item.thumbnail, + fanart = e.infoLabels.get('poster_path') if e.infoLabels.get('poster_path') else item.fanart, + title = e.infoLabels['title']) try: if not episode: @@ -526,9 +527,9 @@ def save_episodes(item, episodelist, extra_info, host, local_files, silent=False # add strm_file if episode is not present in db or inside videolibrary path # if not filetools.exists(filetools.join(TVSHOWS_PATH, strm_path)): if season_episode not in local_files.get('db',{}).keys(): - logger.debug("Creating .strm: " + strm_path) - item_strm = Item(channel='videolibrary', action='play_from_library', strm_path=strm_path, contentType='episode', videolibrary_id=episode_item.videolibrary_id, contentSeason = episode_item.contentSeason, contentEpisodeNumber = episode_item.contentEpisodeNumber,) - filetools.write(filetools.join(TVSHOWS_PATH, strm_path), '{}?{}'.format(addon_name, item_strm.tourl())) + logger.debug("Creating .strm: " + episode_item.strm_path) + item_strm = Item(channel='videolibrary', action='play_from_library', strm_path=episode_item.strm_path, contentType='episode', videolibrary_id=episode_item.videolibrary_id, contentSeason = episode_item.contentSeason, contentEpisodeNumber = episode_item.contentEpisodeNumber,) + filetools.write(filetools.join(TVSHOWS_PATH, episode_item.strm_path), '{}?{}'.format(addon_name, item_strm.tourl())) # update db if episode added # if failed == 0 and config.get_setting('kod_scraper'): @@ -610,14 +611,14 @@ def save_episodes(item, episodelist, extra_info, host, local_files, silent=False if episode: episodes[season_episode] = episode e = episode['item'] - if not e.contentSeason in current_seasons: current_seasons.append(e.contentSeason) + if not e.contentSeason in current_seasons or e.contentSeason not in seasons: current_seasons.append(e.contentSeason) if not lang: lang = item.contentLanguage if item.contentLanguage else 'ITA' if not lang in item.lang_list: item.lang_list.append(lang) if not silent: i += 1 p_dialog.update(int(math.ceil(i * t)), message=e.title) - # support.dbg() + # logger.dbg() # for e in episodelist: # item, episode, season_episode, lang, I, O, F = save_episode(item, episodes, e) # inserted += I @@ -781,11 +782,7 @@ def add_tvshow(item, channel=None, itemlist=[]): item.__dict__["channel"] = item.__dict__.pop("from_channel") if not channel: - try: - channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel]) - # channel = __import__('specials.%s' % item.channel, fromlist=["specials.%s" % item.channel]) - except ImportError: - exec("import channels." + item.channel + " as channel") + channel = platformtools.channel_import(item.channel) # To disambiguate titles, TMDB is caused to ask for the really desired title # The user can select the title among those offered on the first screen @@ -806,7 +803,7 @@ def add_tvshow(item, channel=None, itemlist=[]): itemlist = getattr(channel, it.action)(it) item.host = channel.host if itemlist: - # support.dbg() + # logger.dbg() from platformcode.autorenumber import start, check if not check(item, itemlist): action = item.action @@ -881,7 +878,7 @@ def get_fanart_tv(item, set='', ret={}): return d _id = item.infoLabels.get('tmdb_id') - # support.dbg() + # logger.dbg() if _id: _type = item.contentType.replace('show','').replace('movie','movies') @@ -1085,48 +1082,59 @@ def restore_videolibrary(): try: os.mkdir(TVSHOWS_PATH) except: pass + movie_files = [] + for root, dir, files in filetools.walk(MOVIES_PATH): + movie_files.extend(files) + for item in movies: + dialog.update(int(progress / total * 100), item.title) base_name = set_base_name(item, item.videolibrary_id) - path = filetools.join(MOVIES_PATH, base_name) - try: os.mkdir(path) + + try: os.mkdir(filetools.join(MOVIES_PATH, base_name)) except: pass - nfo_path = filetools.join(base_name, "{}.nfo".format(base_name)) - strm_path = filetools.join(base_name, "{}.strm".format(base_name)) - nfo_exists = filetools.exists(filetools.join(MOVIES_PATH, nfo_path)) - strm_exists = filetools.exists(filetools.join(MOVIES_PATH, strm_path)) + local = True if 'local' in videolibrarydb['movie'][item.videolibrary_id]['channels'] else False - if not nfo_exists: + + if not "{}.nfo".format(base_name) in movie_files: if not item.head_nfo: item.head_nfo = scraper.get_nfo(item) filetools.write(filetools.join(MOVIES_PATH, item.nfo_path), item.head_nfo) - if not strm_exists and not local: + + if not "{}.strm".format(base_name) in movie_files and not local: item_strm = Item(channel='videolibrary', action='play_from_library', strm_path=item.strm_path, contentType='movie', contentTitle=item.contentTitle, videolibrary_id=item.videolibrary_id) filetools.write(filetools.join(MOVIES_PATH, item.strm_path), '{}?{}'.format(addon_name, item_strm.tourl())) + progress += 1 - dialog.update(int(progress / total * 100)) + dialog.update(int(progress / total * 100), item.title) for item in tvshows: + dialog.update(int(progress / total * 100), item.title) base_name = set_base_name(item, item.videolibrary_id) - path = filetools.join(TVSHOWS_PATH, base_name) - try: os.mkdir(path) + + try: os.mkdir(filetools.join(TVSHOWS_PATH, base_name)) except: pass - nfo_path = filetools.join(base_name, "tvshow.nfo") - nfo_exists = filetools.exists(filetools.join(TVSHOWS_PATH, nfo_path)) - if not nfo_exists: + + if not filetools.exists(filetools.join(TVSHOWS_PATH, base_name, 'tvshow.nfo')): if not item.head_nfo: item.head_nfo = scraper.get_nfo(item) filetools.write(filetools.join(TVSHOWS_PATH, item.nfo_path), item.head_nfo) episodes = [x['item'] for x in dict(videolibrarydb['episode'][item.videolibrary_id]).values()] - for e in episodes: + + episode_files = [] + + for root, dir, files in filetools.walk(filetools.join(TVSHOWS_PATH, base_name)): + episode_files.extend(files) + + for e in sorted(episodes, key=lambda e: (e.contentSeason, e.contentEpisodeNumber)): + dialog.update(int(progress / total * 100), item.title + '\n{}x{:02d}'.format(e.contentSeason, e.contentEpisodeNumber)) season_episode = '{}x{:02d}'.format(e.contentSeason, e.contentEpisodeNumber) - strm_path = filetools.join(item.base_name, "{}.strm".format(season_episode)) - strm_exists = filetools.exists(filetools.join(MOVIES_PATH, strm_path)) + strm_path = filetools.join(item.base_name, '{}.strm'.format(season_episode)) local = True if 'local' in videolibrarydb['episode'][item.videolibrary_id][season_episode]['channels'] else False - if not strm_exists and not local: + if not '{}.strm'.format(season_episode) in episode_files and not local: logger.debug("Creating .strm: " + strm_path) item_strm = Item(channel='videolibrary', action='play_from_library', strm_path=strm_path, contentType='episode', videolibrary_id=e.videolibrary_id, contentSeason = e.contentSeason, contentEpisodeNumber = e.contentEpisodeNumber,) filetools.write(filetools.join(TVSHOWS_PATH, strm_path), '{}?{}'.format(addon_name, item_strm.tourl())) progress += 1 - dialog.update(int(progress / total * 100)) + dialog.update(int(progress / total * 100), item.title) videolibrarydb.close() dbconverter.save_all() @@ -1178,8 +1186,7 @@ def convert_videolibrary(): it.url = channels_dict[ch] remove_host(it) tmdb.find_and_set_infoLabels(it) - try: channel = __import__('channels.%s' % ch, fromlist=['channels.%s' % ch]) - except: channel = __import__('specials.%s' % ch, fromlist=['specials.%s' % ch]) + channel = platformtools.channel_import(ch) it.host = channel.host it.url = channel.host + it.url episodes = getattr(channel, 'episodios')(it) diff --git a/lib/generictools.py b/lib/generictools.py index caac391c..a22b39df 100644 --- a/lib/generictools.py +++ b/lib/generictools.py @@ -197,7 +197,7 @@ def update_title(item): # new_item.infoLabels['year'] = '-' # if new_item.contentSeason: # del new_item.infoLabels['season'] # It works wrong with num. seasonal - # support.dbg() + # logger.dbg() # scraper_return = scraper.find_and_set_infoLabels(new_item) #logger.debug(item) diff --git a/lib/unshortenit.py b/lib/unshortenit.py index b9f78684..6636603f 100644 --- a/lib/unshortenit.py +++ b/lib/unshortenit.py @@ -42,6 +42,7 @@ class UnshortenIt(object): _swzz_regex = r'swzz\.xyz' _stayonline_regex = r'stayonline\.pro' _snip_regex = r'[0-9a-z]+snip\.|uprotector\.xyz' + _linksafe_regex = r'linksafe\.cc' # for services that only include real link inside iframe _simple_iframe_regex = r'cryptmango|xshield\.net|vcrypt\.club' # for services that only do redirects @@ -49,7 +50,7 @@ class UnshortenIt(object): listRegex = [_adfly_regex, _linkbucks_regex, _adfocus_regex, _lnxlu_regex, _shst_regex, _hrefli_regex, _anonymz_regex, _shrink_service_regex, _rapidcrypt_regex, _simple_iframe_regex, _linkup_regex, _linkhub_regex, - _swzz_regex, _stayonline_regex, _snip_regex, _simple_redirect] + _swzz_regex, _stayonline_regex, _snip_regex, _linksafe_regex, _simple_redirect] _maxretries = 5 @@ -98,6 +99,8 @@ class UnshortenIt(object): uri, code = self._unshorten_stayonline(uri) if re.search(self._snip_regex, uri, re.IGNORECASE): uri, code = self._unshorten_snip(uri) + if re.search(self._linksafe_regex, uri, re.IGNORECASE): + uri, code = self._unshorten_linksafe(uri) if re.search(self._simple_redirect, uri, re.IGNORECASE): p = httptools.downloadpage(uri) uri = p.url @@ -666,6 +669,9 @@ class UnshortenIt(object): # uri = new_uri return uri, 200 + def _unshorten_linksafe(self, uri): + return b64decode(uri.split('?url=')[-1]).decode(), 200 + def decrypt_aes(text, key): try: diff --git a/platformcode/autorenumber.py b/platformcode/autorenumber.py index edf268bc..6191e4de 100644 --- a/platformcode/autorenumber.py +++ b/platformcode/autorenumber.py @@ -7,7 +7,7 @@ import xbmc, xbmcgui, re, base64, sys from core import jsontools, tmdb, filetools from core.item import Item -from core.support import typo, dbg, Item +from core.support import typo, Item from platformcode import config, platformtools, logger PY3 = True if sys.version_info[0] >= 3 else False if PY3: @@ -70,7 +70,7 @@ def b64(json, mode = 'encode'): def find_episodes(item): logger.debug() - ch = __import__('channels.' + item.channel, fromlist=["channels.{}".format(item.channel)]) + ch = platformtools.channel_import(item.channel) itemlist = getattr(ch, item.action)(item) return itemlist @@ -187,7 +187,7 @@ class autorenumber(): item.contentSeason = int(self.episodes[number].split('x')[0]) item.contentEpisodeNumber = int(self.episodes[number].split('x')[1]) - # dbg() + # logger.dbg() # for i in self.itemlist: # sub_thread(i) diff --git a/platformcode/contextmenu/tvshow_options.py b/platformcode/contextmenu/tvshow_options.py index 4956962a..55ec5225 100644 --- a/platformcode/contextmenu/tvshow_options.py +++ b/platformcode/contextmenu/tvshow_options.py @@ -121,7 +121,7 @@ def get_id(): return dbid def check_condition(): - # support.dbg() + # logger.dbg() global path path = search_paths(get_id()) return path diff --git a/platformcode/dbconverter.py b/platformcode/dbconverter.py index 7752712b..9b169b16 100644 --- a/platformcode/dbconverter.py +++ b/platformcode/dbconverter.py @@ -10,9 +10,9 @@ import sqlite3 # conn = sqlite3.connect(get_file_db()) date = strftime('%Y-%m-%d %H:%M:%S', localtime(float(time()))) -def save_all(): - movies = dict(videolibrarydb['movie']) - tvshows = dict(videolibrarydb['tvshow']) +def save_all(_type=''): + movies = dict(videolibrarydb['movie']) if _type == 'movie' or not _type else {} + tvshows = dict(videolibrarydb['tvshow']) if _type == 'tvshow' or not _type else {} videolibrarydb.close() for movie in movies.values(): @@ -93,6 +93,12 @@ def get_id(column, table): else: _id = 1 return _id +def exist(value, column, table): + statement = False + sql = 'SELECT * FROM {} WHERE {} = {}'.format(table, column, value) + nun_records, records = execute_sql_kodi(sql, conn=conn) + if nun_records: statement = True + return statement def get_images(item): @@ -292,13 +298,19 @@ class addMovie(object): def set_files(self): self.idFile = get_id('idFile', 'files') - if self.info.get('playcount', None): - sql = 'INSERT OR IGNORE INTO files (idFile, idPath, strFilename, playCount, lastPlayed, dateAdded) VALUES ( ?, ?, ?, ?, ?, ?)' - params = (self.idFile, self.idPath, self.strFilename, self.info.get('playcount', None), self.item.lastplayed, date) + if exist(self.idPath, 'idpath', 'files'): + if self.info.get('playcount', None): + sql = 'UPDATE path SET playCount=? WHERE idPath=?' + params = (self.info.get('playcount', None), self.idPath) + self.sql_actions.append([sql, params]) else: - sql = 'INSERT OR IGNORE INTO files (idFile, idPath, strFilename, dateAdded) VALUES ( ?, ?, ?, ?)' - params = (self.idFile, self.idPath, self.strFilename, date) - self.sql_actions.append([sql, params]) + if self.info.get('playcount', None): + sql = 'INSERT OR IGNORE INTO files (idFile, idPath, strFilename, playCount, lastPlayed, dateAdded) VALUES ( ?, ?, ?, ?, ?, ?)' + params = (self.idFile, self.idPath, self.strFilename, self.info.get('playcount', None), self.item.lastplayed, date) + else: + sql = 'INSERT OR IGNORE INTO files (idFile, idPath, strFilename, dateAdded) VALUES ( ?, ?, ?, ?)' + params = (self.idFile, self.idPath, self.strFilename, date) + self.sql_actions.append([sql, params]) def set_rating(self): self.rating_id = get_id('rating_id', 'rating') @@ -595,7 +607,7 @@ class addTvShow(object): files = {r[1].replace('.strm',''):r[0] for r in records} self.idFiles = {} idFile = get_id('idFile', 'files') - # support.dbg() + # logger.dbg() for episode in self.idEpisodes.keys(): if episode in files.keys(): self.idFiles[episode] = files[episode] diff --git a/platformcode/elementum_download.py b/platformcode/elementum_download.py index 5d31f193..87b7f416 100644 --- a/platformcode/elementum_download.py +++ b/platformcode/elementum_download.py @@ -60,7 +60,7 @@ def extract(): def setting(): - # support.dbg() + # logger.dbg() xbmc.executebuiltin('UpdateLocalAddons') xbmc.sleep(1000) if filetools.isfile(elementum_setting_file): diff --git a/platformcode/infoplus.py b/platformcode/infoplus.py index 6187eb7d..75cfab1d 100644 --- a/platformcode/infoplus.py +++ b/platformcode/infoplus.py @@ -8,7 +8,7 @@ from core import httptools, tmdb from core.item import Item from platformcode import config, platformtools, logger -from core.support import match, typo, dbg +from core.support import match, typo info_list = [] diff --git a/platformcode/keymaptools.py b/platformcode/keymaptools.py index ac98cfac..34d56e30 100644 --- a/platformcode/keymaptools.py +++ b/platformcode/keymaptools.py @@ -186,7 +186,7 @@ class Main(xbmcgui.WindowXMLDialog): import channelselector itemlist = self.menulist(channelselector.getchanneltypes()) elif channel_name not in ['downloads', 'setting', 'help']: - channel = __import__('specials.%s' % channel_name, fromlist=["specials.%s" % channel_name]) + channel = platformtools.channel_import(channel_name) itemlist = self.menulist(channel.mainlist(Item().fromurl(self.MENU.getSelectedItem().getProperty('run')))) self.SUBMENU.reset() self.SUBMENU.addItems(itemlist) diff --git a/platformcode/launcher.py b/platformcode/launcher.py index 004fa0e0..bce34fc4 100644 --- a/platformcode/launcher.py +++ b/platformcode/launcher.py @@ -46,6 +46,8 @@ def run(item=None): if len(sp) > 1: for e in sp[1:]: key, val = e.split('=') + if val.lower() == 'false': val = False + elif val.lower() == 'true': val = True item.__setattr__(key, val) # If no item, this is mainlist else: @@ -66,7 +68,6 @@ def run(item=None): config.set_setting('show_once', True) logger.info(item.tostring()) - # from core.support import dbg;dbg() try: if not config.get_setting('tmdb_active'): @@ -113,8 +114,7 @@ def run(item=None): elif item.channel == "infoplus": from platformcode import infoplus - action = getattr(infoplus, item.action) - return action(item) + return getattr(infoplus, item.action)(item) elif item.channel == 'trakt_tools': from core import trakt_tools @@ -156,7 +156,6 @@ def run(item=None): else: platformtools.dialog_ok(config.get_localized_string(20000), config.get_localized_string(70740) % "\n".join([item.url[j:j+57] for j in range(0, len(item.url), 57)])) elif item.action == "gotopage": - # from core.support import dbg;dbg() from core import scrapertools head = config.get_localized_string(70511) scraped_page = scrapertools.find_single_match(item.url,'[=/]([0-9]+)') @@ -184,23 +183,9 @@ def run(item=None): item.nextSeason = season xbmc.executebuiltin("Container.Update(%s?%s)" % (sys.argv[0], item.tourl())) else: - # Checks if channel exists - if os.path.isfile(os.path.join(config.get_runtime_path(), 'channels', item.channel + ".py")): - CHANNELS = 'channels' - else: - CHANNELS = 'specials' - - channel_file = os.path.join(config.get_runtime_path(), CHANNELS, item.channel + ".py") - - logger.debug("channel_file= " + channel_file + ' - ' + CHANNELS + ' - ' + item.channel) - - channel = None - - if os.path.exists(channel_file): - try: - channel = __import__('%s.%s' % (CHANNELS, item.channel), None, None, ['%s.%s' % (CHANNELS, item.channel)]) - except ImportError: - exec("import " + CHANNELS + "." + item.channel + " as channel") + channel = platformtools.channel_import(item.channel) + if not channel: + return logger.info("Running channel %s | %s" % (channel.__name__, channel.__file__)) @@ -244,7 +229,8 @@ def run(item=None): # Special action for findvideos, where the plugin looks for known urls elif item.action == "findvideos": from core import servertools - if item.window and item.channel != 'videolibrary': + p_dialog = None + if item.window: p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), config.get_localized_string(60683)) p_dialog.update(0) @@ -260,7 +246,7 @@ def run(item=None): if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist) - if item.window and item.channel not in ['videolibrary', 'local']: + if p_dialog: p_dialog.update(100) p_dialog.close() platformtools.serverwindow(item, itemlist) @@ -291,7 +277,6 @@ def run(item=None): # Special action for searching, first asks for the words then call the "search" function elif item.action == "search": - # from core.support import dbg;dbg() if filetools.isfile(temp_search_file) and config.get_setting('videolibrary_kodi'): itemlist = [] f = filetools.read(temp_search_file) @@ -474,27 +459,19 @@ def play_from_library(item): @param item: item with information """ - # def get_played_time(item): - # if item.contentType == 'movie': nfo_path = item.nfo - # else: nfo_path = item.strm_path.replace('strm','nfo') - # if nfo_path and filetools.isfile(nfo_path): - # from core import videolibrarytools - # head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path) - # sleep(1) - # played_time = platformtools.get_played_time(item_nfo) - # else: played_time = 0 - # return played_time - - - # from time import sleep - - # logger.debug("item: \n" + item.tostring('\n')) - # from core.support import dbg; dbg() import xbmc, xbmcgui, xbmcplugin - item.window_type = config.get_setting("window_type") if config.get_setting('next_ep') < 3 and item.contentType != 'movie' else 0 - xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xbmcgui.ListItem(path=os.path.join(config.get_runtime_path(), "resources", "kod.mp4"))) - xbmc.Player().stop() - if xbmc.getCondVisibility('Window.IsMedia') and not item.window_type == 0: + + platformtools.window_type(item) + platformtools.prevent_busy(item) + item.action = item.next_action if item.next_action else 'findvideos' + + if not item.videolibrary_id: + if item.window and item.action == 'findvideos': + return run(item) + else: + xbmc.executebuiltin("Container.Update(" + sys.argv[0] + "?" + item.tourl() + ")") + + elif xbmc.getCondVisibility('Window.IsMedia') and not item.window: if item.contentType == 'episode': it = videolibrarydb[item.contentType][item.videolibrary_id]['{}x{:02d}'.format(item.infoLabels['season'], item.infoLabels['episode'])]['item'] else: @@ -504,4 +481,4 @@ def play_from_library(item): videolibrarydb.close() else: item.window = True - return videolibrary.findvideos(item) + return run(item) diff --git a/platformcode/logger.py b/platformcode/logger.py index 263bee7a..80c3a3ab 100644 --- a/platformcode/logger.py +++ b/platformcode/logger.py @@ -51,6 +51,17 @@ def log(*args, **kwargs): function=frame.f_code.co_name, message=msg), kwargs.get('level', DEF_LEVEL)) +def dbg(open=True): + if config.dev_mode(): + try: + import web_pdb + if not web_pdb.WebPdb.active_instance and open: + import webbrowser + webbrowser.open('http://127.0.0.1:5555') + web_pdb.set_trace() + except: + pass + class WebErrorException(Exception): def __init__(self, url, channel, *args, **kwargs): diff --git a/platformcode/platformtools.py b/platformcode/platformtools.py index 1bc9d793..d025b9c2 100644 --- a/platformcode/platformtools.py +++ b/platformcode/platformtools.py @@ -18,7 +18,7 @@ else: import os, xbmc, xbmcgui, xbmcplugin from past.utils import old_div -from core import scrapertools +from core import filetools, scrapertools from core.item import Item from platformcode import logger, config @@ -425,7 +425,7 @@ def render_items(itemlist, parent_item): return item, item_url, listitem # For Debug - # from core.support import dbg;dbg() + # logger.dbg() # r_list = [set_item(i, item, parent_item) for i, item in enumerate(itemlist)] r_list = [] @@ -674,7 +674,6 @@ def set_context_commands(item, item_url, parent_item, **kwargs): # context_commands.append((config.get_localized_string(60348), "Action(Info)")) # InfoPlus - # from core.support import dbg;dbg() # if config.get_setting("infoplus"): #if item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.infoLabels['tvdb_id'] or \ # (item.contentTitle and item.infoLabels["year"]) or item.contentSerieName: @@ -1054,7 +1053,7 @@ def play_video(item, strm=False, force_direct=False, autoplay=False): if not mediaurl: return # video information is obtained. - xlistitem = xbmcgui.ListItem(item.title, path=item.url) + xlistitem = xbmcgui.ListItem(item.contentTitle, path=item.url) xlistitem.setArt({"thumb": item.contentThumbnail if item.contentThumbnail else item.thumbnail}) set_infolabels(xlistitem, item, True) @@ -1771,7 +1770,6 @@ def get_platform(): def get_played_time(item): logger.debug() from core import db - # from core.support import dbg;dbg() played_time = 0 if not item.infoLabels: @@ -1801,7 +1799,6 @@ def get_played_time(item): def set_played_time(item): logger.debug() from core import db - # from core.support import dbg;dbg() played_time = item.played_time if not item.infoLabels: @@ -1815,6 +1812,7 @@ def set_played_time(item): e = item.infoLabels.get('episode') try: + # logger.dbg() if e: newDict = db['viewed'].get(ID, {}) newDict['{}x{}'.format(s, e)] = played_time @@ -1828,16 +1826,9 @@ def set_played_time(item): del db['viewed'][ID] -# def prevent_busy(item): -# logger.debug() -# if not item.autoplay and not item.window: -# xbmc.Player().play(os.path.join(config.get_runtime_path(), "resources", "kod.mp4")) -# xbmc.sleep(200) -# xbmc.Player().stop() - def prevent_busy(item): logger.debug() - if not item.autoplay and not item.window: + if item.action == 'play_from_library' or (not item.autoplay and not item.window): if item.globalsearch: xbmc.Player().play(os.path.join(config.get_runtime_path(), "resources", "kod.mp4")) else: xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xbmcgui.ListItem(path=os.path.join(config.get_runtime_path(), "resources", "kod.mp4"))) xbmc.sleep(200) @@ -1909,4 +1900,25 @@ def serverwindow(item, itemlist): else: from platformcode.launcher import run run(selection) - reopen = True \ No newline at end of file + reopen = True + + +def window_type(item): + if type(item.window) == bool: + pass + elif config.get_setting('window_type') == 0 or (config.get_setting('next_ep') == 3 and item.contentType != 'movie'): + item.window = True + else: + item.window = False + return item + + +def channel_import(channel_id): + if filetools.exists(filetools.join(config.get_runtime_path(), 'channels', channel_id + ".py")): + channel = __import__('channels.'+ channel_id, None, None, ["channels." + channel_id]) + elif filetools.exists(filetools.join(config.get_runtime_path(), 'specials', channel_id + ".py")): + channel = __import__('specials.' + channel_id, None, None, ["specials." + channel_id]) + else: + logger.info('Channel {} not Exist') + channel = None + return channel \ No newline at end of file diff --git a/platformcode/shortcuts.py b/platformcode/shortcuts.py index 5ceececf..740c5a3b 100644 --- a/platformcode/shortcuts.py +++ b/platformcode/shortcuts.py @@ -102,7 +102,6 @@ def channels_menu(item): def check_channels(item): from specials import setting from platformcode import config, platformtools - # from core.support import dbg; dbg() item.channel = 'setting' item.extra = 'lib_check_datajson' itemlist = setting.conf_tools(item) @@ -131,7 +130,6 @@ def SettingOnPosition(item): def select(item): - # from core.support import dbg;dbg() from platformcode import config, platformtools # item.id = setting ID # item.type = labels or values diff --git a/platformcode/xbmc_videolibrary.py b/platformcode/xbmc_videolibrary.py index c4af9443..b535a567 100644 --- a/platformcode/xbmc_videolibrary.py +++ b/platformcode/xbmc_videolibrary.py @@ -261,6 +261,7 @@ def mark_content_as_watched_on_kodi(item, value=1): @param value: > 0 for seen, 0 for not seen """ logger.debug() + logger.dbg() if item.contentType == 'movie': path = '%{}%'.format(item.strm_path.split('\\')[0].split('/')[0] if item.strm_path else item.base_name) @@ -270,6 +271,7 @@ def mark_content_as_watched_on_kodi(item, value=1): if r: payload = {"jsonrpc": "2.0", "method": "VideoLibrary.SetMovieDetails", "params": {"movieid": r[0][0], "playcount": value}, "id": 1} data = get_data(payload) + logger.debug(data) elif item.contentType == 'episode': path = '%{}'.format(item.strm_path.replace('\\','%').replace('/', '%')) sql = 'select idEpisode from episode_view where c18 like "{}"'.format(path) @@ -299,7 +301,6 @@ def mark_content_as_watched_on_kodi(item, value=1): def set_watched_on_kod(data): from specials import videolibrary from core import videolibrarydb - # from core.support import dbg;dbg() data = jsontools.load(data) Type = data.get('item', {}).get('type','') @@ -329,7 +330,7 @@ def set_watched_on_kod(data): # item.all_ep else: - # support.dbg() + # logger.dbg() sql = 'select strPath from {}_view where (id{} like "{}")'.format(Type, Type.replace('tv','').capitalize(), ID) n, records = execute_sql_kodi(sql) if records: @@ -811,7 +812,7 @@ def clean_by_id(item): tmdb_id = item.infoLabels.get('tmdb_id', '') season_id = item.infoLabels.get('temporada_id', '') episode_id = item.infoLabels.get('episodio_id', '') - # support.dbg() + # logger.dbg() # search movie ID if item.contentType == 'movie': diff --git a/servers/hdmario.py b/servers/hdmario.py index 1b1adf30..c7786973 100644 --- a/servers/hdmario.py +++ b/servers/hdmario.py @@ -137,9 +137,9 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= secureProof = scrapertools.find_single_match(unpacked, """X-Secure-Proof['"]\s*,\s*['"]([^"']+)""") logger.debug('X-Secure-Proof=' + secureProof) - data = httptools.downloadpage(baseUrl + '/pl/' + page_url.split('/')[-1].replace('?', '') + '.m3u8', headers=[['X-Secure-Proof', secureProof]]).data + data = httptools.downloadpage(baseUrl + '/pl/' + page_url.split('/')[-1].replace('?', ''), headers=[['X-Secure-Proof', secureProof]]).data filetools.write(xbmc.translatePath('special://temp/hdmario.m3u8'), data, 'w') - video_urls = [{'type':'m3u8', 'url':'special://temp/hdmario.m3u8'}] + video_urls = [{'type':'hls', 'url':baseUrl + '/pl/' + page_url.split('/')[-1].replace('?', '')}] return video_urls diff --git a/servers/highload.json b/servers/highload.json new file mode 100644 index 00000000..281dcb43 --- /dev/null +++ b/servers/highload.json @@ -0,0 +1,42 @@ +{ + "active": true, + "find_videos": { + "ignore_urls": [], + "patterns": [ + { + "pattern": "(https://highload.to/[ef]/[A-z0-9]+)", + "url": "\\1" + } + ] + }, + "free": true, + "id": "highload", + "name": "HighLoad", + "settings": [ + { + "default": false, + "enabled": true, + "id": "black_list", + "label": "@60654", + "type": "bool", + "visible": true + }, + { + "default": 0, + "enabled": true, + "id": "favorites_servers_list", + "label": "@60655", + "lvalues": [ + "No", + "1", + "2", + "3", + "4", + "5" + ], + "type": "list", + "visible": false + } + ], + "thumbnail": "https://i.postimg.cc/3JrRZv5w/highload.png" + } \ No newline at end of file diff --git a/servers/highload.py b/servers/highload.py new file mode 100644 index 00000000..5e738f52 --- /dev/null +++ b/servers/highload.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +try: + from urllib.parse import urlparse +except: + from urlparse import urlparse + +from core import httptools, support +from platformcode import logger, config +from functools import reduce +import base64 + + +def test_video_exists(page_url): + logger.info('page_url="{}"'.format(page_url)) + global data + data = httptools.downloadpage(page_url) + if data.code == 404 or "We can't find the video" in data.data or 'sorry' in data.data: + return False, config.get_localized_string(70449) % "HighLoad" + data = data.data + return True, "" + + +def get_video_url(page_url, premium=False, user="", password="", video_password=""): + logger.info("url=" + page_url) + + global data + media_url = '' + video_urls = [] + + host = 'https://' + urlparse(page_url).netloc + + first = unhunt(support.match(data, patron =r'(.+?)').match) + + second_url = host + support.match(data, patron=r'src="(/assets/js/(?:master|tabber).js)').match + second = unhunt(httptools.downloadpage(second_url).data) + + v, r1, r2 = support.match(second, patron=r'var\s*res\s*=\s*([^.]+)\.replace\("([^"]+).+?replace\("([^"]+)').match + match = support.match(first, patron=r'var\s*{}\s*=\s*"([^"]+)'.format(v)).match + + if match: + media_url = base64.b64decode(match.replace(r1, '').replace(r2, '')).decode('utf-8') + + if media_url: + video_urls.append([media_url.split('.')[-1] +' [HighLoad]', media_url]) + return video_urls + + +def unhunt(source): + def decode(params): + h = params[0] + n = params[1] + t = int(params[2]) + e = int(params[3]) + r = "" + i = 0 + while i < len(h): + s = "" + while h[i] != n[e]: + s += h[i] + i += 1 + + for j in enumerate(n): + s = s.replace(j[1], str(j[0])) + + r += chr(int(dehunt(s, e, 10)) - t) + i += 1 + + return r + + def dehunt(d, e, f): + g = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/" + h = g[0:e] + i = g[0:f] + d = d[::-1] + j = reduce(lambda a, b: a + int(h[int(b[1])]) * (e ** int(b[0])) if int(h[int(b[1])]) != -1 else None, enumerate(d), 0) + k = "" + while j > 0: + k = i[int(j % f)] + k + j = (j - (j % f)) / f + + return k or "0" + + return decode(support.match(source, patron=r'\(h,\s*u,\s*n,\s*t,\s*e,\s*r\).+}\("([^"]+)",[^,]+,\s*"([^"]+)",\s*(\d+),\s*(\d+)').match) + diff --git a/servers/ninjastream.py b/servers/ninjastream.py index 1db68812..dd9a8419 100644 --- a/servers/ninjastream.py +++ b/servers/ninjastream.py @@ -19,7 +19,7 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= global data logger.debug("URL", page_url) video_urls = [] - # support.dbg() + # logger.dbg() headers = {'User-Agent': httptools.get_user_agent(), 'Referer': page_url, @@ -31,7 +31,7 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= data = httptools.downloadpage(apiUrl, headers=headers, post=post).json if data.get('result',{}).get('playlist'): - # support.dbg() + # logger.dbg() url = data.get('result',{}).get('playlist') video_urls.append({'type':url.split('.')[-1], 'url':url + '|Referer:' + page_url}) diff --git a/servers/paramount_server.py b/servers/paramount_server.py index 5378580e..668aa4d9 100644 --- a/servers/paramount_server.py +++ b/servers/paramount_server.py @@ -18,7 +18,6 @@ def test_video_exists(page_url): def get_video_url(page_url, premium=False, user="", password="", video_password=""): logger.debug("url=" + page_url) - # from core.support import dbg;dbg() qualities = [] video_urls = [] mgid = support.match(data, patron=r'uri":"([^"]+)"').match diff --git a/servers/voe.json b/servers/voe.json new file mode 100644 index 00000000..c2c75f3e --- /dev/null +++ b/servers/voe.json @@ -0,0 +1,42 @@ +{ + "active": true, + "find_videos": { + "ignore_urls": [], + "patterns": [ + { + "pattern": "voe.sx/(?:e/|)([A-z0-9]+)", + "url": "https://voe.sx/e/\\1" + } + ] + }, + "free": true, + "id": "voe", + "name": "VOE", + "settings": [ + { + "default": false, + "enabled": true, + "id": "black_list", + "label": "@60654", + "type": "bool", + "visible": true + }, + { + "default": 0, + "enabled": true, + "id": "favorites_servers_list", + "label": "@60655", + "lvalues": [ + "No", + "1", + "2", + "3", + "4", + "5" + ], + "type": "list", + "visible": false + } + ], + "thumbnail": "https://i.postimg.cc/4xzBfwBd/voe.png" +} \ No newline at end of file diff --git a/servers/voe.py b/servers/voe.py new file mode 100644 index 00000000..cfc780a9 --- /dev/null +++ b/servers/voe.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# -*- Server Voe -*- +# -*- Created for Alfa-addon -*- +# -*- By the Alfa Develop Group -*- + +from core import httptools +from core import scrapertools +from platformcode import logger +from platformcode import config +import sys + +PY3 = False +if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int + + +def test_video_exists(page_url): + global data + logger.info("(page_url='%s')" % page_url) + data = httptools.downloadpage(page_url).data + + if "File not found" in data or "File is no longer available" in data: + return False, config.get_localized_string(70449) % "VOE" + return True, "" + + +def get_video_url(page_url, premium=False, user="", password="", video_password=""): + logger.info("(page_url='%s')" % page_url) + video_urls = [] + video_srcs = scrapertools.find_multiple_matches(data, r"src: '([^']+)'") + if not video_srcs: + bloque = scrapertools.find_single_match(data, "sources.*?\}") + video_srcs = scrapertools.find_multiple_matches(bloque, ': "([^"]+)') + for url in video_srcs: + video_urls.append([" [Voe]", url]) + + return video_urls diff --git a/specials/classicsearch.py b/specials/classicsearch.py index b3bca021..9e4c86e1 100644 --- a/specials/classicsearch.py +++ b/specials/classicsearch.py @@ -141,7 +141,7 @@ def channel_search(item): module_dict = {} for ch in channel_list: try: - module = __import__('channels.%s' % ch, fromlist=["channels.%s" % ch]) + module = platformtools.channel_import(ch) mainlist = getattr(module, 'mainlist')(Item(channel=ch, global_search=True)) module_dict[ch] = module diff --git a/specials/community.py b/specials/community.py index a7827ba5..26981336 100644 --- a/specials/community.py +++ b/specials/community.py @@ -444,7 +444,7 @@ def findvideos(item): item.url = {} json.append({"url": url}) - # support.dbg() + # logger.dbg() for option in json: extra = set_extra_values(item, option, item.path) itemlist.append( diff --git a/specials/downloads.py b/specials/downloads.py index 7295c481..62e10d3f 100644 --- a/specials/downloads.py +++ b/specials/downloads.py @@ -4,6 +4,7 @@ # ------------------------------------------------------------ from __future__ import division +import channels #from builtins import str import sys, os PY3 = False @@ -645,10 +646,7 @@ def download_from_server(item): progreso = platformtools.dialog_progress_bg(config.get_localized_string(30101), config.get_localized_string(70178) % item.server) try: - if item.contentChannel in ['community', 'videolibrary']: - channel = __import__('specials.%s' % item.contentChannel, None, None, ['specials.%s' % item.contentChannel]) - else: - channel = __import__('channels.%s' % item.contentChannel, None, None, ['channels.%s' % item.contentChannel]) + channel = platformtools.channel_import(item.contentChannel) if hasattr(channel, "play") and not item.play_menu: progreso.update(50, config.get_localized_string(70178) % item.server + '\n' + config.get_localized_string(70180) % item.contentChannel) @@ -725,10 +723,7 @@ def download_from_best_server(item): logger.debug('using cached servers') play_items = [Item().fromurl(i) for i in item.downloadItemlist] else: - if item.contentChannel in ['community', 'videolibrary']: - channel = __import__('specials.%s' % item.contentChannel, None, None, ['specials.%s' % item.contentChannel]) - else: - channel = __import__('channels.%s' % item.contentChannel, None, None, ['channels.%s' % item.contentChannel]) + channel = platformtools.channel_import(item.contentChannel) progreso.update(50, config.get_localized_string(70184) + '\n' + config.get_localized_string(70180) % item.contentChannel) @@ -778,10 +773,7 @@ def select_server(item): logger.debug('using cached servers') play_items = [Item().fromurl(i) for i in item.downloadItemlist] else: - if item.contentChannel in ['community', 'videolibrary']: - channel = __import__('specials.%s' % item.contentChannel, None, None, ['specials.%s' % item.contentChannel]) - else: - channel = __import__('channels.%s' % item.contentChannel, None, None, ['channels.%s' % item.contentChannel]) + channel = platformtools.channel_import(item.contentChannel) progreso.update(50, config.get_localized_string(70184) + '\n' + config.get_localized_string(70180) % item.contentChannel) if hasattr(channel, item.contentAction): @@ -853,18 +845,14 @@ def get_episodes(item): if item.downloadItemlist: episodes = [Item().fromurl(i) for i in item.downloadItemlist] else: - # The item is a series or season... - if item.contentChannel in ['community', 'videolibrary']: - channel = __import__('specials.%s' % item.contentChannel, None, None, ["specials.%s" % item.contentChannel]) - else: - channel = __import__('channels.%s' % item.contentChannel, None, None, ["channels.%s" % item.contentChannel]) + channel = platformtools.channel_import(item.contentChannel) # We get the list of episodes episodes = getattr(channel, item.contentAction)(item) itemlist = [] # if episodes and not scrapertools.find_single_match(episodes[0].title, r'(\d+.\d+)') and item.channel not in ['videolibrary'] and item.action != 'season': # from platformcode.autorenumber import select_type, renumber, check - # # support.dbg() + # # logger.dbg() # if not check(item): # select_type(item) # return get_episodes(item) diff --git a/specials/filmontv.py b/specials/filmontv.py index 818d3068..4a24d488 100644 --- a/specials/filmontv.py +++ b/specials/filmontv.py @@ -264,7 +264,7 @@ def live(item): def load_live(channel_name): try: - channel = __import__('%s.%s' % ('channels', channel_name), None, None, ['%s.%s' % ('channels', channel_name)]) + channel = platformtools.channel_import(item.contentChannel) itemlist = channel.live(channel.mainlist(Item())[0]) except: itemlist = [] diff --git a/specials/globalsearch.py b/specials/globalsearch.py index 2ce5ac7a..a02d4769 100644 --- a/specials/globalsearch.py +++ b/specials/globalsearch.py @@ -4,7 +4,7 @@ import xbmc, xbmcgui, sys, channelselector, time, threading -from core.support import dbg, tmdb +from core.support import tmdb from core.item import Item from core import channeltools, scrapertools, support from platformcode import platformtools, config, logger @@ -127,7 +127,7 @@ class SearchWindow(xbmcgui.WindowXML): for channel in self.channelsList: logger.debug(channel) try: - module = __import__('channels.%s' % channel, fromlist=["channels.%s" % channel]) + module = platformtools.channel_import(channel) mainlist = getattr(module, 'mainlist')(Item(channel=channel, global_search=True)) actions = [elem for elem in mainlist if elem.action == "search" and (self.mode in ['all', 'person'] or elem.contentType in [self.mode, 'undefined'])] self.moduleDict[channel] = module @@ -658,7 +658,7 @@ class SearchWindow(xbmcgui.WindowXML): def loadEpisodes(self ,item): try: - self.channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel]) + self.channel = platformtools.channel_import(item.channel) self.itemsResult = getattr(self.channel, item.action)(item) except: import traceback diff --git a/specials/news.py b/specials/news.py index 05274fce..64a63f26 100644 --- a/specials/news.py +++ b/specials/news.py @@ -348,17 +348,8 @@ def get_newest(channel_id, categoria): # We request the news of the category (item.extra) searched in the channel channel # If there are no news for that category in the channel, it returns an empty list try: - - puede = True - try: - modulo = __import__('channels.%s' % channel_id, fromlist=["channels.%s" % channel_id]) - except: - try: - exec("import channels." + channel_id + " as modulo") - except: - puede = False - - if not puede: + modulo = platformtools.channel_import(channel_id) + if not modulo: return logger.debug("running channel " + modulo.__name__ + " " + modulo.__file__) diff --git a/specials/tvmoviedb.py b/specials/tvmoviedb.py index 5512b765..f65f805f 100644 --- a/specials/tvmoviedb.py +++ b/specials/tvmoviedb.py @@ -355,7 +355,7 @@ def filter(item): elif control in [101]: # Genre genresIds = [] genresNames = [] - # support.dbg() + # logger.dbg() if self.item.db_type == 'tmdb': url = ('{}/genre/{}/list?api_key={}&language={}'.format(tmdb.host, item.args, tmdb.api, langs.tmdb)) genres = httptools.downloadpage(url).json['genres'] diff --git a/specials/videolibrary.py b/specials/videolibrary.py index 38bd3e88..01a887da 100644 --- a/specials/videolibrary.py +++ b/specials/videolibrary.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- #from builtins import str +import channels import sys, os, traceback, xbmc, xbmcgui PY3 = False @@ -8,7 +9,7 @@ if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int from core import httptools, support, filetools, scrapertools, videolibrarytools, videolibrarydb from core.item import Item -from platformcode import config, logger, platformtools +from platformcode import config, dbconverter, logger, platformtools if PY3: from concurrent import futures @@ -18,7 +19,6 @@ else: import urlparse - def mainlist(item): logger.debug() itemlist = [item.clone(title=config.get_localized_string(60509), contentType='movie', action='list_movies', thumbnail=support.thumb('videolibrary_movie')), @@ -91,7 +91,8 @@ def list_genres(item): def list_sets(item): videos = dict(videolibrarydb['collection']).values() videolibrarydb.close() - itemlist = [v for v in videos] + itemlist = [] + itemlist = [v.clone(contentType='list') for v in videos] itemlist.sort(key=lambda it: it.title) add_context(itemlist) return itemlist @@ -184,14 +185,14 @@ def list_movies(item, silent=False): logger.debug() videos = dict(videolibrarydb['movie']).values() - if item.list_year: itemlist = [v['item'] for v in videos if item.list_year == v['item'].infoLabels['year']] - elif item.list_rating: itemlist = [v['item'] for v in videos if item.list_rating == int(float(v['item'].infoLabels['rating']))] - elif item.list_genre: itemlist = [v['item'] for v in videos if item.list_genre in v['item'].infoLabels['genre']] - elif item.list_actor: itemlist = [v['item'] for v in videos if item.list_actor in str(v['item'].infoLabels['castandrole'])] - elif item.list_director: itemlist = [v['item'] for v in videos if item.list_director in v['item'].infoLabels['director']] - elif item.set: itemlist = [v['item'] for v in videos if item.set == v['item'].infoLabels.get('setid', '')] - elif config.get_setting('collection') and not item.text: itemlist = [v['item'] for v in videos if (item.text.lower() in v['item'].title.lower() and not 'setid' in v['item'].infoLabels)] + [v for v in dict(videolibrarydb['collection']).values()] - else: itemlist = [v['item'] for v in videos if item.text.lower() in v['item'].title.lower()] + if item.list_year: itemlist = [platformtools.window_type(v['item']) for v in videos if item.list_year == v['item'].infoLabels['year']] + elif item.list_rating: itemlist = [platformtools.window_type(v['item']) for v in videos if item.list_rating == int(float(v['item'].infoLabels['rating']))] + elif item.list_genre: itemlist = [platformtools.window_type(v['item']) for v in videos if item.list_genre in v['item'].infoLabels['genre']] + elif item.list_actor: itemlist = [platformtools.window_type(v['item']) for v in videos if item.list_actor in str(v['item'].infoLabels['castandrole'])] + elif item.list_director: itemlist = [platformtools.window_type(v['item']) for v in videos if item.list_director in v['item'].infoLabels['director']] + elif item.set: itemlist = [platformtools.window_type(v['item']) for v in videos if item.set == v['item'].infoLabels.get('setid', '')] + elif config.get_setting('collection') and not item.text: itemlist = [v['item'] for v in videos if (item.text.lower() in v['item'].title.lower() and not 'setid' in v['item'].infoLabels)] + [v.clone(contentType='list') for v in dict(videolibrarydb['collection']).values()] + else: itemlist = [platformtools.window_type(v['item']) for v in videos if item.text.lower() in v['item'].title.lower()] videolibrarydb.close() add_context(itemlist) if silent == False: @@ -209,12 +210,12 @@ def list_tvshows(item): videos = dict(videolibrarydb['tvshow']).values() - if item.list_year: series = [v['item'] for v in videos if item.list_year == v['item'].infoLabels['year']] - elif item.list_rating: series = [v['item'] for v in videos if item.list_rating == int(float(v['item'].infoLabels['rating']))] - elif item.list_genre: series = [v['item'] for v in videos if item.list_genre in v['item'].infoLabels['genre']] - elif item.list_actor: series = [v['item'] for v in videos if item.list_actor in str(v['item'].infoLabels['castandrole'])] - elif item.list_director: series = [v['item'] for v in videos if item.list_director in v['item'].infoLabels['director'] or item.list_director in v['item'].infoLabels['writer']] - else: series = [v['item'] for v in videos if item.text.lower() in v['item'].title.lower()] + if item.list_year: series = [platformtools.window_type(v['item']) for v in videos if item.list_year == v['item'].infoLabels['year']] + elif item.list_rating: series = [platformtools.window_type(v['item']) for v in videos if item.list_rating == int(float(v['item'].infoLabels['rating']))] + elif item.list_genre: series = [platformtools.window_type(v['item']) for v in videos if item.list_genre in v['item'].infoLabels['genre']] + elif item.list_actor: series = [platformtools.window_type(v['item']) for v in videos if item.list_actor in str(v['item'].infoLabels['castandrole'])] + elif item.list_director: series = [platformtools.window_type(v['item']) for v in videos if item.list_director in v['item'].infoLabels['director'] or item.list_director in v['item'].infoLabels['writer']] + else: series = [platformtools.window_type(v['item']) for v in videos if item.text.lower() in v['item'].title.lower()] def sub_thread(it): it.contentType = 'tvshow' @@ -330,17 +331,9 @@ def get_episodes(item): def findvideos(item): from core import autoplay, servertools from platformcode import platformtools - logger.debug() - if config.get_setting('next_ep') == 3 and item.contentType != 'movie': - platformtools.prevent_busy(item) - item.window = True videolibrarytools.check_renumber_options(item) itemlist = [] - if item.window: - p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), config.get_localized_string(60683)) - p_dialog.update(0) - if not item.strm_path: logger.debug('Unable to search for videos due to lack of parameters') @@ -363,8 +356,7 @@ def findvideos(item): item.infoLabels = videolibrarydb['episode'][item.videolibrary_id][ep]['item'].infoLabels videolibrarydb.close() - if item.window: - p_dialog.update(50) + if videolibrary_items.get('local'): try: local = videolibrary_items['local'] @@ -400,8 +392,6 @@ def findvideos(item): pl = [s for s in itemlist if s.contentLanguage in [prefered_lang, '']] if pl: itemlist = pl - if item.window: - p_dialog.update(100) if len(itlist) > 1: for it in itemlist: @@ -415,13 +405,10 @@ def findvideos(item): if config.get_setting('checklinks') and not config.get_setting('autoplay'): itemlist = servertools.check_list_links(itemlist, config.get_setting('checklinks_number')) - if item.window: - p_dialog.close() - platformtools.serverwindow(item, itemlist) - - else: + if not item.window: add_download_items(item, itemlist) - return itemlist + + return itemlist def servers(item, ch, items): @@ -446,10 +433,7 @@ def servers(item, ch, items): return serverlist if ch_params.get('active', False): - - if os.path.isfile(os.path.join(config.get_runtime_path(), 'channels', ch + '.py')): _channel = 'channels' - else: _channel = 'specials' - channel = __import__('{}.{}'.format(_channel, ch), fromlist=['{}.{}'.format(_channel, ch)]) + channel = platformtools.channel_import(ch) with futures.ThreadPoolExecutor() as executor: itlist = [executor.submit(channel_servers, item, it, channel, ch_name) for it in items] @@ -461,15 +445,12 @@ def servers(item, ch, items): def play(item): logger.log() - # support.dbg() + # logger.dbg() # logger.debug("item:\n" + item.tostring('\n')) # platformtools.play_video(item) if not item.channel == "local": - if os.path.isfile(os.path.join(config.get_runtime_path(), 'channels', item.channel + '.py')): _channel = 'channels' - else: _channel = 'specials' - - channel = __import__('{}.{}'.format(_channel, item.channel), fromlist=['{}.{}'.format(_channel, item.channel)]) + channel = platformtools.channel_import(item.channel) if hasattr(channel, "play"): itemlist = getattr(channel, "play")(item) @@ -538,14 +519,16 @@ def update_videolibrary(item=None): for it in show_list: i += 1 + it.not_add = True chname = channeltools.get_channel_parameters(it.channel)['title'] p_dialog.update(int(i * t), message=message % (it.fulltitle, chname)) it = get_host(it) - try: channel = __import__('channels.{}'.format(it.channel), fromlist=['channels.{}'.format(it.channel)]) - except: channel = __import__('specials.{}'.format(it.channel), fromlist=['specials.{}'.format(it.channel)]) + channel = platformtools.channel_import(it.channel) itemlist = getattr(channel, it.action)(it) videolibrarytools.save_tvshow(it, itemlist, True) p_dialog.close() + if config.get_setting("videolibrary_kodi"): + dbconverter.save_all('tvshow') except: p_dialog.close() @@ -838,9 +821,7 @@ def get_host(item , channel=None): item.url = urlparse.urlparse(item.url).path if item.url.startswith('/'): if not channel: - try : channel = __import__('channels.' + item.channel, None, None, ['channels.' + item.channel]) - except: channel = __import__('specials.' + item.channel, None, None, ['specials.' + item.channel]) - + channel = platformtools.channel_import(item.channel) host = channel.host if host.endswith('/'): host = host[:-1] item.url = host + item.url @@ -882,7 +863,7 @@ class subcontext(object): return config.get_localized_string(self.titledict[self.item.contentType][_type]) def makecontext(self): - # support.dbg() + # logger.dbg() # set watched # if not self.item.set: watched = self.item.infoLabels.get('playcount', 0) @@ -1023,6 +1004,7 @@ def add_download_items(item, itemlist): path=item.path, thumbnail=support.thumb('download'), parent=item.tourl()) + if item.action == 'findvideos': if item.contentType != 'movie': downloadItem.title = '{} {}'.format(support.typo(config.get_localized_string(60356), 'color kod bold'), item.title) @@ -1041,7 +1023,7 @@ def add_download_items(item, itemlist): #-------------- DELETE -------------- def delete(item): - # support.dbg() + # logger.dbg() from platformcode import xbmc_videolibrary select = None delete = None @@ -1363,3 +1345,4 @@ def convert_videolibrary(item): def restore_videolibrary(item): videolibrarytools.restore_videolibrary() +