From 5cc3290bef7a21f7213741a1faba6c348215e7c2 Mon Sep 17 00:00:00 2001 From: Alhaziel01 Date: Sat, 5 Mar 2022 16:23:35 +0100 Subject: [PATCH] Completato 1337x --- channels/1337x.json | 11 +- channels/1337x.py | 208 ++++++++++++++++++++++++---------- core/support.py | 53 ++++++--- platformcode/launcher.py | 2 +- platformcode/platformtools.py | 2 +- 5 files changed, 198 insertions(+), 78 deletions(-) diff --git a/channels/1337x.json b/channels/1337x.json index f25e333b..5d712a75 100644 --- a/channels/1337x.json +++ b/channels/1337x.json @@ -6,5 +6,14 @@ "thumbnail": "1337x.png", "banner": "1337x.png", "categories": ["movie", "tvshow", "torrent"], - "settings": [] + "settings": [ + { + "id": "itaSearch", + "type": "bool", + "label": "Cerca contenuti in italiano", + "default": false, + "enabled": true, + "visible": true + } + ] } diff --git a/channels/1337x.py b/channels/1337x.py index aa570e41..105dd781 100644 --- a/channels/1337x.py +++ b/channels/1337x.py @@ -1,95 +1,183 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------ -# Canale per 133x +# Canale per 1337x # ------------------------------------------------------------ -from core import httptools, support, jsontools -from platformcode import logger -import requests +import inspect +from core import support +from platformcode import logger, config # host = support.config.get_channel_url() host = 'https://www.1337x.to' -# headers = { -# 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', -# 'accept-encoding': 'gzip, deflate, br', -# 'accept-language': 'it,en;q=0.9,it-IT;q=0.8,en-GB;q=0.7,en-US;q=0.6', -# 'cache-control': 'no-cache', -# 'pragma': 'no-cache', -# 'referer': 'https://www.1337x.to/', -# 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.62'} - -# def getData(item): -# support.dbg() -# json = jsontools.load(base64.b64decode(support.match(item, patron=r'window.park\s*=\s*"([^"]+)').match)) -# data = support.match(json['page_url'], headers=json['page_headers']).data -# return data @support.menu def mainlist(item): - - film = ['/movie-lib-sort/all/it/release/desc/all/1/'] - - tvshow = ['/popular-movies', - ('Popolari', ['/popular-movies', 'popular'])] - # menu = [ - # ('BDRiP {film}', ['/categoria.php?active=0&category=1&order=data&by=DESC&page=', 'peliculas', [0, 'movie', True], 'undefined']), - # ('Cerca BDRiP... {submenu} {film}', ['/torrent-ita/1/', 'search', ['search', 'movie', True], 'movie']), - # ('DVD {film}', ['/categoria.php?active=0&category=20&order=data&by=DESC&page=', 'peliculas', [0, 'movie', True], 'undefined']), - # ('Cerca DVD... {submenu} {film}', ['/torrent-ita/20/', 'search', ['search', 'movie', True], 'movie']), - # ('Screener {film}', ['/categoria.php?active=0&category=19&order=data&by=DESC&page=', 'peliculas', [0, 'movie', True], 'undefined']), - # ('Cerca Screener.. {submenu} {film}', ['/torrent-ita/19/', 'search', ['search', 'movie', True], 'movie']), - # ('Serie TV', ['/categoria.php?active=0&category=15&order=data&by=DES&page=', 'peliculas', [0 , 'tvshow', True], 'tvshow']), - # ('Cerca Serie TV.. {submenu}', ['/torrent-ita/15/', 'search', ['search', 'tvshow',True], 'tvshow']), - # ('Anime', ['/categoria.php?active=0&category=5&order=data&by=DESC&page=', 'peliculas', [0, 'anime', True], 'tvshow']), - # ('Cerca Anime.. {submenu}', ['/torrent-ita/5/', 'search', ['search', 'anime', True], 'tvshow']), - # ('Musica', ['/categoria.php?active=0&category=2&order=data&by=DESC&page=', 'peliculas', [0, 'music', False], 'music']), - # ('Cerca Musica.. {submenu}', ['/torrent-ita/2/', 'search', ['search', 'music', False], 'music']), - # ('Audiolibri {musica}', ['/categoria.php?active=0&category=18&order=data&by=DESC&page=', 'peliculas', [0, 'music', False], 'music']), - # ('Cerca Audiolibri.. {submenu}', ['/torrent-ita/18/', 'search', ['search', 'music', False], 'music']), - # # mostrerebbe anche risultati non "multimediali" e allungherebbero inutilmente la ricerca globale - # # ('Altro {film}', ['/categoria.php?active=0&category=4&order=data&by=DESC&page=', 'peliculas', [0, 'other', False]]), - # # ('Cerca altro.. {submenu}', ['/torrent-ita/4/', 'search', ['search', 'other', False]]), - # # ('Cerca Tutto... {color kod bold}', ['/argh.php?search=', 'search', ['search', 'all', False]]) - # ] + menu = [('Film ITA {bullet bold}',['/movie-lib-sort/all/it/popularity/desc/all/1/', 'peliculas', '', 'movie']), + ('Film {submenu}',['/movie-library/1/', 'peliculas', 'filter', 'movie']), + ('Serie TV {bullet bold}',['/series-library/', 'az', '', 'tvshow'])] + + search = '' return locals() -@support.scrape -def peliculas(item): - patron = r'[^]+>){15}(?P[^<]+)(?:[^>]+>){18,23}\s*<a href="(?P<url>[^"]+)' - patronNext = r'"([^"]+)">>>' - return locals() +def moviefilter(item): + from platformcode import platformtools + + item.args = '' + controls = [] + data = support.match(item).data + + patronBlock = r'<select name="{}"[^>]+>(.+?)</select>' + patron = r'value="([^"]+)">([^<]+)' + + genres = support.match(data, patronBlock=patronBlock.format('genre'), patron=patron).matches + years = support.match(data, patronBlock=patronBlock.format('year'), patron=patron).matches + langs = support.match(data, patronBlock=patronBlock.format('lang'), patron=patron).matches + sorts = support.match(data, patronBlock=patronBlock.format('sortby'), patron=patron).matches + orders = support.match(data, patronBlock=patronBlock.format('sort'), patron=patron).matches + + item.genreValues = [x[0] for x in genres] + item.yearValues = [x[0] for x in years] + item.langValues = [x[0] for x in langs] + item.sortValues = [x[0] for x in sorts] + item.orderValues = [x[0] for x in orders] + + genres = [g[1] for g in genres] + years = [g[1] for g in years] + langs = [g[1] for g in langs] + sorts = [g[1] for g in sorts] + orders = [g[1] for g in orders] + + controls.append({'id': 'lang', 'label': 'Lingua', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':langs, 'default': 0}) + controls.append({'id': 'genre', 'label': 'Genere', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':genres, 'default': 0}) + controls.append({'id': 'year', 'label': 'Anno', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':years, 'default': 0}) + controls.append({'id': 'sort', 'label': 'Anno', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':sorts, 'default': 0}) + controls.append({'id': 'order', 'label': 'Anno', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':orders, 'default': 0}) + return platformtools.show_channel_settings(list_controls=controls, item=item, caption='Filtro', callback='filtered') + + +def filtered(item, values): + + genre = item.genreValues[values['genre']] + lang = item.langValues[values['lang']] + sortby = item.sortValues[values['sort']] + order = item.orderValues[values['order']] + year = item.yearValues[values['year']] + + return f'{host}/movie-lib-sort/{genre}/{lang}/{sortby}/{order}/{year}/1/' + + +def az(item): + import string + itemlist = [item.clone(title='1-9', url=f'{item.url}num/1/', action='peliculas', thumbnail=support.thumb('az'))] + for letter in list(string.ascii_lowercase): + itemlist.append(item.clone(title=letter.upper(), url=f'{item.url}{letter}/1/', action='peliculas', thumbnail=support.thumb('az'))) + return itemlist def search(item, text): - support.info(item, text) - if 'all' in item.args: - item.url += text - else: - item.url += text + '.html' + support.info('search', text) + item.args = 'search' + if config.get_setting('itaSearch', channel=item.channel, default=False): + text += ' ita' + text = text.replace(' ', '+') + item.url = f'{host}/search/{text}/1/' try: return peliculas(item) # Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe! except: import sys for line in sys.exc_info(): - support.logger.error("search except: %s" % line) + support.logger.error("search except: ", line) return [] +@support.scrape +def peliculas(item): + if item.args == 'filter': + item.url = moviefilter(item) + + data = support.match(item).data + if item.args == 'search': + sceneTitle = 'undefined' + patron = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)<(?:[^>]+>){3,7}(?P<seed>[^<]+)<(?:[^>]+>){6}(?P<size>[^<]+)<span' + patronNext = r'"([^"]+)">>>' + elif item.contentType == 'movie': + patron = r'<img alt="[^"]*" data-original="(?P<thumb>[^"]+)(?:[^>]+>){15}(?P<title>[^<]+)(?:[^>]+>){18,23}\s*<a href="(?P<url>[^"]+)' + patronNext = r'"([^"]+)">>>' + else: + action = 'seasons' + patron = r'<img src="(?P<thumb>[^"]+)(?:[^>]+>){4}\s*<a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)' + + if (item.args == 'search' or item.contentType != 'movie') and inspect.stack()[4][3] not in ['get_channel_results']: + def itemlistHook(itemlist): + lastUrl = support.match(data, patron=r'href="([^"]+)">Last').match + if lastUrl: + currentPage = support.match(item.url, string=True, patron=r'/(\d+)/').match + nextPage = int(currentPage) + 1 + support.nextPage(itemlist, item, next_page=item.url.replace(f'/{currentPage}', f'/{nextPage}'), function_or_level='peliculas') + return itemlist + return locals() + + +@support.scrape +def seasons(item): + item.contentType == 'season' + action = 'episodios' + patron = r'<li>\s*<a href="(?P<url>[^"]+)[^>]+>\s*<img alt="[^"]*"\ssrc="(?P<thumb>[^"]+)(?:([^>]+)>){2}\s*(?P<title>\w+ (?P<season>\d+))' + return locals() + +@support.scrape +def episodios(item): + patron = r'<img src="(?P<thumb>[^"]+)(?:[^>]+>){13}\s*(?P<season>\d+)x(?P<episode>\d+)\s*<span class="seperator">(?:[^>]+>){2}\s*<a href="(?P<url>[^"]+)">(?P<title>[^<]+)' + def itemlistHook(itemlist): + itemlist.reverse() + return itemlist + return locals() + def findvideos(item): - from lib.guessit import guessit itemlist = [] - items = support.match(item.url, patron=r'<a href="([^"]+)">([^<]+)<(?:[^>]+>){3}([^<]+)<(?:[^>]+>){6}([^<]+)<span').matches + item.disableAutoplay = True + if item.args == 'search': + itemlist.append(item.clone(server='torrent', action='play')) + else: + from lib.guessit import guessit - for url, title, seed, size in items: - title = guessit(title).get('title', '') - itemlist.append(item.clone(title = f'{title} [Seed={seed}] [{size}]', url=host + url, server='torrent', action='play')) + items = support.match(item.url, patron=r'<a href="([^"]+)">([^<]+)<(?:[^>]+>){3}([^<]+)<(?:[^>]+>){6}([^<]+)<span').matches + + for url, title, seed, size in items: + parsedTitle = guessit(title) + + title = support.scrapertools.unescape(parsedTitle.get('title', '')) + + lang = '' + if parsedTitle.get('language'): + langs = parsedTitle.get('language') + if isinstance(langs, list): + lang = 'MULTI' + else: + lang = vars(langs).get('alpha3').upper() + if not (lang.startswith('MUL') or lang.startswith('ITA')): + subs = parsedTitle.get('subtitle_language') + if isinstance(subs, list): + lang = 'Multi-Sub' + else: + lang = vars(subs).get('alpha3').upper() + if lang: + title = f'{title} [{lang}]' + + sizematch = support.match(size, patron='(\d+(?:\.\d+)?)\s* (\w+)').match + sizenumber = float(sizematch[0]) + if sizematch[1].lower() == 'gb': + sizenumber = sizenumber * 1024 + + itemlist.append(item.clone(title = f'{title} [{seed} SEEDS] [{size}]', seed=int(seed), size=sizenumber, url=host + url, server='torrent', action='play')) + itemlist.sort(key=lambda it: (it.seed, it.size), reverse=True) Videolibrary = True if 'movie' in item.args else False - return support.server(item, itemlist=itemlist, Videolibrary=Videolibrary) + return support.server(item, itemlist=itemlist, Videolibrary=Videolibrary, Sorted=False) def play(item): diff --git a/core/support.py b/core/support.py index 4f968b17..131633eb 100755 --- a/core/support.py +++ b/core/support.py @@ -412,6 +412,19 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t if parsedTitle.get('episode_title'): longtitle += s + parsedTitle.get('episode_title') infolabels['episodeName'] = parsedTitle.get('episode_title') + if parsedTitle.get('language'): + langs = parsedTitle.get('language') + if isinstance(langs, list): + lang = 'MULTI' + else: + lang = vars(langs).get('alpha3').upper() + if not (lang.startswith('MUL') or lang.startswith('ITA')): + subs = parsedTitle.get('subtitle_language') + if isinstance(subs, list): + lang = 'Multi-Sub' + else: + lang = vars(subs).get('alpha3').upper() + except: import traceback logger.error(traceback.format_exc()) @@ -450,7 +463,7 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t infoLabels=infolabels, thumbnail=item.prevthumb if item.prevthumb else item.thumbnail if not scraped["thumb"] else scraped["thumb"], args=item.args, - contentSerieName= title if contentType not in ['movie'] and function != 'episodios' or contentType in ['undefined'] else item.contentSerieName, + contentSerieName= title if contentType not in ['movie'] and function not in ['episodios', 'seasons'] or contentType in ['undefined'] else item.contentSerieName, contentTitle= title if contentType in ['movie', 'undefined'] and function == 'peliculas' else item.contentTitle, contentLanguage = lang1, contentSeason= infolabels.get('season', ''), @@ -608,7 +621,7 @@ def scrape(func): if itemlist and action != 'play' and 'patronMenu' not in args and 'patronGenreMenu' not in args \ and not stackCheck(['add_tvshow', 'get_newest']) and (function not in ['episodios', 'mainlist'] \ - or (function in ['episodios'] and config.get_setting('episode_info') and itemlist[0].season)): + or (function in ['episodios', 'seasons'] and config.get_setting('episode_info') and itemlist[0].season)): # dbg() tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) @@ -757,7 +770,7 @@ def dooplay_menu(item, type): return locals() -def menuItem(itemlist, filename, title='', action='', url='', contentType='undefined', args=[], style=True): +def menuItem(itemlist, filename, title='', action='', url='', contentType='undefined', args=[], style=True, folder=True): # Function to simplify menu creation # Call typo function @@ -775,7 +788,8 @@ def menuItem(itemlist, filename, title='', action='', url='', contentType='undef extra = extra, args = args, contentType = contentType, - globalsearch = not style + globalsearch = not style, + folder = folder )) @@ -821,7 +835,8 @@ def menu(func): url = host + var[0] if len(var) > 0 else '', action = var[1] if len(var) > 1 else 'peliculas', args=var[2] if len(var) > 2 else '', - contentType= var[3] if len(var) > 3 else 'movie') + contentType= var[3] if len(var) > 3 else 'movie', + folder = var[4] if len(var) > 4 else True) # Make MAIN MENU elif dictUrl[name] is not None: @@ -844,7 +859,8 @@ def menu(func): url = host + var[0] if len(var) > 0 else '', action = var[1] if len(var) > 1 else 'peliculas', args=var[2] if len(var) > 2 else '', - contentType= var[3] if len(var) > 3 else 'movie' if name == 'film' else 'tvshow') + contentType= var[3] if len(var) > 3 else 'movie' if name == 'film' else 'tvshow', + folder = var[4] if len(var) > 4 else True) # add search menu for category if 'search' not in args: menuItem(itemlist, filename, config.get_localized_string(70741) % title + '… {submenu bold}', 'search', host + url, contentType='movie' if name == 'film' else 'tvshow', style=not global_search) @@ -860,7 +876,8 @@ def menu(func): url = host + var[0] if len(var) > 0 else '', action = var[1] if len(var) > 1 else 'peliculas', args=var[2] if len(var) > 2 else '', - contentType= var[3] if len(var) > 3 else 'movie',) + contentType= var[3] if len(var) > 3 else 'movie', + folder = var[4] if len(var) > 4 else True) if single_search: menuItem(itemlist, filename, config.get_localized_string(70741) % '… {bold}', 'search', host + dictUrl['search'], style=not global_search) @@ -1243,7 +1260,7 @@ def pagination(itemlist, item, page, perpage, function_level=1): return itemlist -def server(item, data='', itemlist=[], headers='', CheckLinks=True, Download=True, patronTag=None, Videolibrary=True): +def server(item, data='', itemlist=[], headers='', CheckLinks=True, Download=True, patronTag=None, Videolibrary=True, Sorted=True): logger.debug() if not data and not itemlist: @@ -1253,7 +1270,7 @@ def server(item, data='', itemlist=[], headers='', CheckLinks=True, Download=Tru itemlist = itemlist + itemList verifiedItemlist = [] - def getItem(videoitem): + def getItem(n, videoitem): # if not videoitem.server: # s = servertools.get_server_from_url(videoitem.url) # videoitem.server = s[2] if s else 'directo' @@ -1299,6 +1316,7 @@ def server(item, data='', itemlist=[], headers='', CheckLinks=True, Download=Tru vi.thumbnail = videoitem.thumbnail vi.forcethumb = True videoitem = vi + videoitem.position = n return videoitem # non threaded for webpdb @@ -1309,14 +1327,18 @@ def server(item, data='', itemlist=[], headers='', CheckLinks=True, Download=Tru # verifiedItemlist.append(it) with futures.ThreadPoolExecutor() as executor: - thL = [executor.submit(getItem, videoitem) for videoitem in itemlist if videoitem.url or videoitem.video_urls] + thL = [executor.submit(getItem, n, videoitem) for n,videoitem in enumerate(itemlist) if videoitem.url or videoitem.video_urls] for it in futures.as_completed(thL): if it.result() and not config.get_setting("black_list", server=it.result().server.lower()): 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 not Sorted: + verifiedItemlist.sort(key=lambda it: it.position) + # if Sorted: + # 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) @@ -1325,7 +1347,8 @@ def server(item, data='', itemlist=[], headers='', CheckLinks=True, Download=Tru checklinks_number = config.get_setting('checklinks_number') verifiedItemlist = servertools.check_list_links(verifiedItemlist, checklinks_number) - verifiedItemlist = servertools.sort_servers(verifiedItemlist) + if Sorted: + verifiedItemlist = servertools.sort_servers(verifiedItemlist) if Videolibrary and item.contentChannel != 'videolibrary': videolibrary(verifiedItemlist, item) diff --git a/platformcode/launcher.py b/platformcode/launcher.py index b8798f1e..d9384667 100644 --- a/platformcode/launcher.py +++ b/platformcode/launcher.py @@ -320,7 +320,7 @@ def findvideos(item, itemlist=[]): platformtools.render_items(itemlist, item) if not serverlist: platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(60347)) - elif len(serverlist) == 1 and serverlist[0].server != 'torrent': + elif len(serverlist) == 1: # If there is only one server play it immediately play(itemlist[0].clone(no_return=True)) else: diff --git a/platformcode/platformtools.py b/platformcode/platformtools.py index 70a19c44..73c18b04 100644 --- a/platformcode/platformtools.py +++ b/platformcode/platformtools.py @@ -2011,7 +2011,7 @@ def serverWindow(item, itemlist): if itemlist: reopen = False - if config.get_setting('autoplay'): + if config.get_setting('autoplay') and not item.disableAutoplay: reopen = True from core import autoplay autoplay.start(itemlist, item)