From dd309c307e39109f8efc304a9ee19732d9aeea51 Mon Sep 17 00:00:00 2001 From: Alhaziel01 Date: Thu, 9 Sep 2021 20:10:04 +0200 Subject: [PATCH] Fix Ricerca Globale --- channels/0example.py.txt | 6 +- channels/altadefinizionecommunity.json | 2 +- channels/altadefinizionecommunity.py | 2 +- channels/animealtadefinizione.json | 2 +- channels/animealtadefinizione.py | 4 +- channels/animeforce.py | 2 +- channels/animesaturn.py | 2 +- channels/animeuniverse.py | 2 +- channels/animeworld.py | 2 +- channels/aniplay.json | 2 +- channels/casacinema.py | 2 +- channels/cineblog01.py | 2 +- channels/cinemalibero.py | 4 +- channels/dreamsub.py | 2 +- channels/eurostreaming.py | 2 +- channels/filmigratis.py | 2 +- channels/guardaserieclick.py | 20 ++-- channels/hd4me.py | 2 +- channels/ilcorsaronero.py | 2 +- channels/ilgeniodellostreaming.py | 2 +- channels/italiaserie.py | 4 +- channels/la7.py | 1 + channels/mondoserietv.py | 4 +- channels/piratestreaming.py | 2 +- channels/serietvonline.py | 6 +- channels/serietvsubita.py | 2 +- channels/serietvu.py | 2 +- channels/toonitalia.py | 2 +- channels/tunein.py | 2 +- channels/vvvvid.py | 2 +- core/channeltools.py | 2 +- core/jsontools.py | 2 +- core/support.py | 103 ++++++++-------- core/tmdb.py | 8 +- platformcode/config.py | 2 +- platformcode/platformtools.py | 25 ++-- resources/skins/Default/720p/GlobalSearch.xml | 113 +++++++----------- resources/skins/Default/media/sub.png | Bin 0 -> 13979 bytes specials/globalsearch.py | 46 +++---- specials/search.py | 2 +- 40 files changed, 185 insertions(+), 211 deletions(-) create mode 100644 resources/skins/Default/media/sub.png diff --git a/channels/0example.py.txt b/channels/0example.py.txt index 7420bf14..f719b180 100644 --- a/channels/0example.py.txt +++ b/channels/0example.py.txt @@ -152,7 +152,7 @@ def peliculas(item): patron = r'' patronBlock = r'' patronNext = '' - pagination = '' + pagination = True #debug = True # True per testare le regex sul sito return locals() @@ -166,7 +166,7 @@ def episodios(item): patron = r'' patronBlock = r'' patronNext = '' - pagination = '' + pagination = True #debug = True return locals() @@ -182,7 +182,7 @@ def genres(item): patron = r'' patronBlock = r'' patronNext = '' - pagination = '' + pagination = True #debug = True return locals() diff --git a/channels/altadefinizionecommunity.json b/channels/altadefinizionecommunity.json index 970bab9e..a6d8504e 100644 --- a/channels/altadefinizionecommunity.json +++ b/channels/altadefinizionecommunity.json @@ -5,7 +5,7 @@ "active": true, "thumbnail": "altadefinizionecommunity.png", "banner": "", - "categories": ["movie", "tvshow", "vos"], + "categories": ["movie", "tvshow", "sub"], "not_active": ["include_in_newest"], "settings": [ { diff --git a/channels/altadefinizionecommunity.py b/channels/altadefinizionecommunity.py index 8fc7b217..8cf2019f 100644 --- a/channels/altadefinizionecommunity.py +++ b/channels/altadefinizionecommunity.py @@ -176,7 +176,7 @@ def search(item, texto): except: import sys for line in sys.exc_info(): - logger.error("%s" % line) + logger.error('{}'.format(line)) return [] diff --git a/channels/animealtadefinizione.json b/channels/animealtadefinizione.json index ce0c0876..f9a1945a 100644 --- a/channels/animealtadefinizione.json +++ b/channels/animealtadefinizione.json @@ -1,6 +1,6 @@ { "id": "animealtadefinizione", - "name": "AnimealtAdefinizione", + "name": "AnimealtaDefinizione", "active": true, "language": ["ita", "sub-ita"], "thumbnail": "animealtadefinizione.png", diff --git a/channels/animealtadefinizione.py b/channels/animealtadefinizione.py index 4c1f7fc4..6a7df1c7 100644 --- a/channels/animealtadefinizione.py +++ b/channels/animealtadefinizione.py @@ -98,7 +98,7 @@ def peliculas(item): if item.search: itemlist = [ it for it in itemlist if ' Episodio ' not in it.title ] if len(itemlist) == int(perpage): - support.nextPage(itemlist, item, function_or_level='peliculas', page=page + 1, total_pages=int(res.match)) + support.nextPage(itemlist, item, 'peliculas', page=page + 1, total_pages=int(res.match)) return itemlist return locals() @@ -106,7 +106,7 @@ def peliculas(item): @support.scrape def episodios(item): numerationEnabled = True - pagination = int(perpage) + pagination = True patron = epPatron return locals() diff --git a/channels/animeforce.py b/channels/animeforce.py index f5d7b274..2eee4cdf 100644 --- a/channels/animeforce.py +++ b/channels/animeforce.py @@ -82,7 +82,7 @@ def peliculas(item): action = 'check' if not item.args: - pagination = '' + pagination = True patron = r'[^"]+)"\s*title="(?P[^"]+)">' else: patron = r'<a href="(?P<url>[^"]+)"[^>]+>\s*<img src="(?P<thumb>[^"]+)" alt="(?P<title>.*?)(?: Sub| sub| SUB|")' diff --git a/channels/animesaturn.py b/channels/animesaturn.py index c52830f0..9db2b16b 100644 --- a/channels/animesaturn.py +++ b/channels/animesaturn.py @@ -144,7 +144,7 @@ def peliculas(item): return itemlist else: - pagination = '' + pagination = True if item.args == 'incorso': patron = r'<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<(]+)(?:\s*\((?P<year>\d+)\))?(?:\s*\((?P<lang>[A-za-z-]+)\))?</a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<' else: diff --git a/channels/animeuniverse.py b/channels/animeuniverse.py index f605c064..c147f991 100644 --- a/channels/animeuniverse.py +++ b/channels/animeuniverse.py @@ -104,7 +104,7 @@ def peliculas(item): @support.scrape def episodios(item): numerationEnabled = True - pagination = int(perpage) + pagination = True patron = epPatron return locals() diff --git a/channels/animeworld.py b/channels/animeworld.py index 5cb7fee4..90359791 100644 --- a/channels/animeworld.py +++ b/channels/animeworld.py @@ -155,7 +155,7 @@ def peliculas(item): def episodios(item): data = get_data(item) numerationEnabled = True - # pagination = 50 + # pagination = True patronBlock= r'<div class="server\s*active\s*"(?P<block>.*?)(?:<div class="server|<link)' patron = r'<li[^>]*>\s*<a.*?href="(?P<url>[^"]+)"[^>]*>(?P<episode>[^-<]+)(?:-(?P<episode2>[^<]+))?' # def itemHook(item): diff --git a/channels/aniplay.json b/channels/aniplay.json index afc23c7b..de67670b 100644 --- a/channels/aniplay.json +++ b/channels/aniplay.json @@ -5,7 +5,7 @@ "language": ["ita", "sub-ita"], "thumbnail": "aniplay.png", "banner": "aniplay.png", - "categories": ["anime", "vos"], + "categories": ["anime", "sub"], "settings": [ { "id": "sort", diff --git a/channels/casacinema.py b/channels/casacinema.py index a05b03d5..d33ba176 100644 --- a/channels/casacinema.py +++ b/channels/casacinema.py @@ -100,7 +100,7 @@ def peliculas(item): action = 'findvideos' elif item.contentType == 'tvshow': action = 'episodios' - pagination = '' + pagination = True else: action = 'select' diff --git a/channels/cineblog01.py b/channels/cineblog01.py index b605f54b..8ea2edc0 100644 --- a/channels/cineblog01.py +++ b/channels/cineblog01.py @@ -103,7 +103,7 @@ def peliculas(item): # 'Auguri di Buon Natale e Felice Anno Nuovo! – ' + str(curYear) + '!'] if 'newest' in item.args: - pagination = '' + pagination = True patronBlock = r'sequex-page-left(?P<block>.*?)sequex-page-right' if '/serietv/' not in item.url: patron = r'src="?(?P<thumb>[^ "]+)"? alt="?(?P<title>.*?)(?:\[(?P<quality>[a-zA-Z/]+)\]\s*)?(?:\[(?P<lang>Sub-ITA|ITA)\]\s*)?(?:\[(?P<quality2>[a-zA-Z/]+)\]\s*)?\((?P<year>\d{4})[^\)]*\)[^>]*>.*?<a href=(?:")?(?P<url>[^" ]+)(?:")?.*?rpwe-summary[^>]*>(?P<genre>\w+) [^ ]+ DURATA (?P<duration>[0-9]+)[^ ]+ [^ ]+ [A-Z ]+ (?P<plot>[^<]+)<' diff --git a/channels/cinemalibero.py b/channels/cinemalibero.py index 57319ecc..520c654c 100644 --- a/channels/cinemalibero.py +++ b/channels/cinemalibero.py @@ -51,7 +51,7 @@ def peliculas(item): patronBlock = r'<div class="container">.*?class="col-md-12[^"]*?">(?P<block>.*?)<div class=(?:"container"|"bg-dark ")>' if item.args == 'newest': patron = r'<div class="col-lg-3">[^>]+>[^>]+>\s<a href="(?P<url>[^"]+)".+?url\((?P<thumb>[^\)]+)\)">[^>]+>(?P<title>[^<]+)<[^>]+>[^>]+>(?:[^>]+>)?\s?(?P<rating>[\d\.]+)?[^>]+>.+?(?:[ ]\((?P<year>\d{4})\))?<[^>]+>[^>]+>(.?[\d\-x]+\s\(?(?P<lang>[sSuUbBiItTaA\-]+)?\)?\s?(?P<quality>[\w]+)?[|]?\s?(?:[fFiInNeE]+)?\s?\(?(?P<lang2>[sSuUbBiItTaA\-]+)?\)?)?' - pagination = 25 + pagination = True elif item.contentType == 'movie': patron = r'<a href="(?P<url>[^"]+)" title="(?P<title>.+?)(?:[ ]\[(?P<lang>[sSuUbB\-iItTaA]+)\])?(?:[ ]\((?P<year>\d{4})\))?"\s*alt="[^"]+"\s*class="[^"]+"(?: style="background-image: url\((?P<thumb>.+?)\)">)?\s*<div class="voto">[^>]+>[^>]+>.(?P<rating>[\d\.a-zA-Z\/]+)?[^>]+>[^>]+>[^>]+>(?:<div class="genere">(?P<quality>[^<]+)</div>)?' if item.args == 'update': @@ -60,7 +60,7 @@ def peliculas(item): elif item.contentType == 'tvshow': if item.args == 'update': patron = r'<a href="(?P<url>[^"]+)"[^<]+?url\((?P<thumb>.+?)\)">\s*?<div class="titolo">(?P<title>.+?)(?: – Serie TV)?(?:\([sSuUbBiItTaA\-]+\))?[ ]?(?P<year>\d{4})?</div>\s*?(?:<div class="genere">)?(?:[\w]+?\.?\s?[\s|S]?[\dx\-S]+?\s\(?(?P<lang>[iItTaA]+|[sSuUbBiItTaA\-]+)\)?\s?(?P<quality>[HD]+)?|.+?\(?(?P<lang2>[sSuUbBiItTaA\-]+)?\)?</div>)' - pagination = 25 + pagination = True else: patron = r'<a href="(?P<url>[^"]+)"\s*title="(?P<title>[^"\(]+)(?:"|\()(?:(?P<year>\d+)[^"]+)?.*?url\((?P<thumb>[^\)]+)\)(?:.*?<div class="voto">[^>]+>[^>]+>\s*(?P<rating>[^<]+))?.*?<div class="titolo">[^>]+>(?:<div class="genere">[^ ]*(?:\s\d+)?\s*(?:\()?(?P<lang>[^\)< ]+))?' else: diff --git a/channels/dreamsub.py b/channels/dreamsub.py index 162839b8..0c1169c8 100644 --- a/channels/dreamsub.py +++ b/channels/dreamsub.py @@ -104,7 +104,7 @@ def peliculas(item): @support.scrape def episodios(item): numerationEnabled = True - pagination = 100 + pagination = True if item.data: data = item.data diff --git a/channels/eurostreaming.py b/channels/eurostreaming.py index a2cac7c5..35c92a5e 100644 --- a/channels/eurostreaming.py +++ b/channels/eurostreaming.py @@ -35,7 +35,7 @@ def peliculas(item): if item.args == 'newest': item.contentType = 'episode' patron = r'<span class="serieTitle" style="font-size:20px">(?P<title>[^<]+) –\s*<a href="(?P<url>[^"]+)"[^>]*>\s+?(?P<episode>\d+[×x]\d+-\d+|\d+[×x]\d+) (?P<title2>[^<\(]+)\s?\(?(?P<lang>SUB ITA)?\)?</a>' - pagination = '' + pagination = True else: patron = r'<div class="post-thumb">.*?<img src="(?P<thumb>[^"]+)".*?><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.+?)\s?(?: Serie Tv)?\s?\(?(?P<year>\d{4})?\)?<\/a><\/h2>' patronNext=r'a class="next page-numbers" href="?([^>"]+)">Avanti »</a>' diff --git a/channels/filmigratis.py b/channels/filmigratis.py index beca156e..c2488775 100644 --- a/channels/filmigratis.py +++ b/channels/filmigratis.py @@ -61,7 +61,7 @@ def peliculas(item): data = re.sub('\n|\t', ' ', data) patron = r'<div class="cnt">\s.*?src="([^"]+)".+?title="((?P<title>.+?)(?:[ ]\[(?P<lang>Sub-ITA|SUB-ITA)\])?(?:[ ]\[(?P<quality>.*?)\])?(?:[ ]\((?P<year>\d+)\))?)"\s*[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s+<a href="(?P<url>[^"]+)"' patronBlock = r'<div class="container">(?P<block>.*?)</main>' - pagination = '' + pagination = True patronNext = '<a class="page-link" href="([^"]+)">>>' else: diff --git a/channels/guardaserieclick.py b/channels/guardaserieclick.py index 486fc364..0a4910bf 100644 --- a/channels/guardaserieclick.py +++ b/channels/guardaserieclick.py @@ -46,7 +46,7 @@ def mainlist(item): ## deflang = 'SUB-ITA' ## patronBlock = r'<span\s+class="label label-default label-title-typology">'+block ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' -## pagination = 25 +## pagination = True ## elif item.args == 'update': ## patronBlock = r'<div\s+class="container-fluid greybg title-serie-lastep title-last-ep fixed-title-wrapper containerBottomBarTitle">'+block ## patron = r'<a(?: rel="[^"]+")? href="(?P<url>[^"]+)"(?: class="[^"]+")?>[ ]<img class="[^"]+"[ ]title="[^"]+"[ ]alt="[^"]+"[ ]src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<episode>\d+.\d+)[ ]\((?P<lang>[a-zA-Z\-]+)[^<]+<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+)<' @@ -58,15 +58,15 @@ def mainlist(item): ## elif item.args == 'nolost': ## patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-danonperd">'+block ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' -## pagination = 25 +## pagination = True ## elif item.args == 'classic': ## patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-classiche">'+block ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' -## pagination = 25 +## pagination = True ## else: ## patronBlock = r'<div\s+class="container container-title-serie-new container-scheda" meta-slug="new">'+block ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' -## pagination = 25 +## pagination = True ## ## debug = True ## return locals() @@ -90,28 +90,28 @@ def peliculas(item): else: end_block = r'(?P<block>.*?)<div\s+class="btn btn-lg btn-default btn-load-other-series">' patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' - pagination = 25 + pagination = True if item.args == 'ined': deflang = 'SUB-ITA' patronBlock = r'<span\s+class="label label-default label-title-typology">' + end_block ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' - ## pagination = 25 + ## pagination = True elif item.args == 'update': patronBlock = r'<div\s+class="container-fluid greybg title-serie-lastep title-last-ep fixed-title-wrapper containerBottomBarTitle">' + end_block patron = r'href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>.+?class="strongText">(?P<title>.+?)<' # elif item.args == 'nolost': # patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-danonperd">' + end_block - # pagination = 25 + # pagination = True # elif item.args == 'classic': # patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-classiche">' + end_block ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' - ## pagination = 25 + ## pagination = True ## elif item.args == 'anime': ## else: patronBlock = r'<div\s+class="container container-title-serie-new container-scheda" meta-slug="new">' + end_block ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' - ## pagination = 25 + ## pagination = True # support.regexDbg(item, patronBlock, headers) # debug = True return locals() @@ -146,7 +146,7 @@ def genres(item): def search(item, text): logger.debug(text) - item.url = host + "/?s=" + text + item.url = host + "/search/" + text item.contentType = 'tvshow' item.args = 'search' try: diff --git a/channels/hd4me.py b/channels/hd4me.py index bb92ccfa..96ae8d45 100644 --- a/channels/hd4me.py +++ b/channels/hd4me.py @@ -23,7 +23,7 @@ def mainlist(item): def peliculas(item): # debug = True if item.args == 'alternative': - pagination = '' + pagination = True patron = r'<a title="(?P<title>[^\(]+)\(\s*(?P<year>\d+)\)\s\D+(?P<quality>\d+p).{3}(?P<lang>[^ ]+).*?[^"]+"\s*href="(?P<url>[^"]+)' else: patron = r'<a href="(?P<url>[^"]+)" (?:rel="?[0-9]+"?)? title="(?P<title>[^\(]+)(?!\()\s*\((?P<year>\d+)\)\s(?:[^\]]+\])?\D+(?P<quality>\d+p).{3}(?P<lang>[^ ]+).*?<img id="?cov"?.*?src="(?P<thumb>[^"]+)' diff --git a/channels/ilcorsaronero.py b/channels/ilcorsaronero.py index a198582e..b92bbfac 100644 --- a/channels/ilcorsaronero.py +++ b/channels/ilcorsaronero.py @@ -59,7 +59,7 @@ def peliculas(item): def itemlistHook(itemlist): args = item.args args[0] += 1 - support.nextPage(itemlist, item, next_page=item.url, function_or_level="peliculas") + support.nextPage(itemlist, item, next_page=item.url, "peliculas") # itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), args=args, thumbnail=support.thumb())) return itemlist return locals() diff --git a/channels/ilgeniodellostreaming.py b/channels/ilgeniodellostreaming.py index 7520c5a2..bb60ed45 100644 --- a/channels/ilgeniodellostreaming.py +++ b/channels/ilgeniodellostreaming.py @@ -79,7 +79,7 @@ def peliculas(item): if item.args == 'update': action = 'findvideos' patron = r'<div class="poster"><img src="(?P<thumb>[^"]+)"(?:[^>]+>){2}<a href="(?P<url>[^"]+)">[^>]+>(?P<episode>[\d\-x]+)(?:[^>]+>){4}(?P<title>.+?)(?:\[(?P<lang>[SsuUbBiItTaA-]{7})\])?<(?:[^>]+>){4}(?P<quality>[HDWEBRIP-]+)?(?:.+?)?/span><p class="serie"' - pagination = 25 + pagination = True def itemHook(item): item.contentType = 'episode' return item diff --git a/channels/italiaserie.py b/channels/italiaserie.py index 074472e5..68a441b7 100644 --- a/channels/italiaserie.py +++ b/channels/italiaserie.py @@ -31,14 +31,14 @@ def peliculas(item): patron = r'<div class="post-thumb">\s*<a href="(?P<url>[^"]+)" title="(?P<title>[^"\[]+)[^>]+>\s*<img src="(?P<thumb>[^"]+)"[^>]+>' if item.args == 'update': - pagination = '' + pagination = True #patron = r'br />(?:[^>]+>)?(?P<title>[^–]+)[^<]+<a href="(?P<url>[^"]+)">(?P<episode>[^ ]+)\s*(?P<title2>[^\(<]+)(?:\((?P<lang>[^\)]+))?' patron = r'br[\s/]*>(?:\s*<[^>]+>)*(?P<title>[^–<]+)[^<]+<a href="(?P<url>[^"]+)"[^>]*>(?:[^,]{0,80}[, ]{2})*(?P<episode>[\S]+)\s*(?P<title2>[^\(<]+)(?:\((?P<lang>[^\)]+))?' action = 'episodios' if item.args == 'top': patron = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)</a>(?:[^>]+>){3}<img.*?src="(?P<thumb>[^"]+)"[^>]+>(?:[^>]+>){5}:\s*(?P<rating>[^/]+)' if item.args =='a-z': - pagination = '' + pagination = True patron = r'<li ><a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)"' patronNext = r'<a class="next page-numbers" href="(.*?)">' diff --git a/channels/la7.py b/channels/la7.py index 253d8783..dd74f939 100644 --- a/channels/la7.py +++ b/channels/la7.py @@ -91,6 +91,7 @@ def peliculas(item): action = 'episodios' patron = r'<a href="(?P<url>[^"]+)"[^>]+><div class="[^"]+" data-background-image="(?P<t>[^"]+)"></div><div class="titolo">\s*(?P<title>[^<]+)<' def itemHook(item): + logger.debug(item) item.thumbnail = 'http:' + item.t if item.t.startswith('//') else item.t if item.t else item.thumbnail item.fanart = item.thumb return item diff --git a/channels/mondoserietv.py b/channels/mondoserietv.py index c3d5c750..84013ad1 100644 --- a/channels/mondoserietv.py +++ b/channels/mondoserietv.py @@ -71,7 +71,7 @@ def newest(categoria): @support.scrape def peliculas(item): - pagination = '' + pagination = True numerationEnabled = True patronNext = r'href="([^"]+)" title="[^"]+" class="lcp_nextlink"' action = 'findvideos' @@ -105,7 +105,7 @@ def peliculas(item): @support.scrape def episodios(item): numerationEnabled = True - pagination = 50 + pagination = True patronBlock = r'<table>(?P<block>.*?)</table>' patron = r'<tr><td><b>(?P<title>(?:\d+)?.*?)\s*(?:(?P<episode>(?:\d+x\d+|\d+)))\s*(?P<title2>[^<]+)(?P<data>.*?)<tr>' def itemHook(item): diff --git a/channels/piratestreaming.py b/channels/piratestreaming.py index 2cf9d96a..f0ce5bb6 100644 --- a/channels/piratestreaming.py +++ b/channels/piratestreaming.py @@ -25,7 +25,7 @@ def mainlist(item): def search(item, texto): logger.debug(texto) - item.url = host + "/?s=" + texto + item.url = host + "/search/" + texto try: return peliculas(item) # Continua la ricerca in caso di errore diff --git a/channels/serietvonline.py b/channels/serietvonline.py index 923ff857..1d780ff8 100644 --- a/channels/serietvonline.py +++ b/channels/serietvonline.py @@ -68,13 +68,13 @@ def peliculas(item): patronBlock = r'>Lista Serie Tv</a></li></ul></div><div id="box_movies">(?P<block>.*?)<div id="paginador">' patron = r'<div class="movie">[^>]+[^>]+>\s*<img src="(?P<thumb>[^"]+)" alt="(?P<title>.+?)(?:(?P<year>\d{4})|")[^>]*>\s*<a href="(?P<url>[^"]+)' elif item.contentType == 'episode': - pagination = 35 + pagination = True action = 'findvideos' patron = r'<td><a href="(?P<url>[^"]+)"(?:[^>]+)?>\s?(?P<title>.*?)(?P<episode>\d+x\d+)[ ]?(?P<title2>[^<]+)?<' elif item.contentType == 'tvshow': # SEZIONE Serie TV- Anime - Documentari - pagination = 35 + pagination = True if not item.args and 'anime' not in item.url: patron = r'<div class="movie">[^>]+>.+?src="(?P<thumb>[^"]+)" alt="[^"]+".+? href="(?P<url>[^"]+)">.*?<h2>(?P<title>[^"]+)</h2>\s?(?:<span class="year">(?P<year>\d+|\-\d+))?<' @@ -83,7 +83,7 @@ def peliculas(item): patron = r'(?:<td>)?<a href="(?P<url>[^"]+)"(?:[^>]+)?>\s?(?P<title>[^<]+)(?P<episode>[\d\-x]+)?(?P<title2>[^<]+)?<' else: # SEZIONE FILM - pagination = 25 + pagination = True if item.args == 'lista': patron = r'href="(?P<url>[^"]+)"[^>]+>(?P<title>.+?)(?:\s(?P<year>\d{4})|<)' diff --git a/channels/serietvsubita.py b/channels/serietvsubita.py index 14ff66db..31d06631 100644 --- a/channels/serietvsubita.py +++ b/channels/serietvsubita.py @@ -253,7 +253,7 @@ def peliculas_tv(item): # Paginazione patron = r'<strong class="on">\d+</strong>\s?<a href="([^<]+)">\d+</a>' - support.nextPage(itemlist, item, data, patron) + support.nextPage(itemlist, item, data=data, patron=patron) return itemlist diff --git a/channels/serietvu.py b/channels/serietvu.py index 91702709..01447e73 100644 --- a/channels/serietvu.py +++ b/channels/serietvu.py @@ -41,7 +41,7 @@ def peliculas(item): else: action = 'findvideos' patron = r'<div class="item">\s*?<a href="(?P<url>[^"]+)"\s*?data-original="(?P<thumb>[^"]+)"(?:[^>]+>){5}(?P<title>.+?)<[^>]+>\((?P<episode>[\dx\-]+)\s+?(?P<lang>Sub-Ita|[iITtAa]+)\)<' - pagination = 25 + pagination = True patronNext = r'<li><a href="([^"]+)"\s+?>Pagina successiva' return locals() diff --git a/channels/toonitalia.py b/channels/toonitalia.py index 35c37c1f..c981f243 100644 --- a/channels/toonitalia.py +++ b/channels/toonitalia.py @@ -66,7 +66,7 @@ def peliculas(item): blacklist = ['-Film Animazione disponibili in attesa di recensione '] if item.action == 'search': - pagination = '' + pagination = True #patronBlock = '"lcp_catlist"[^>]+>(?P<block>.*)</ul>' patronBlock = '<main[^>]+>(?P<block>.*?)</ma' #patron = r'href="(?P<url>[^"]+)" title="(?P<title>[^"]+)"' diff --git a/channels/tunein.py b/channels/tunein.py index fb062923..103818c1 100644 --- a/channels/tunein.py +++ b/channels/tunein.py @@ -67,7 +67,7 @@ def radio(item): thumbnail = item.thumbnail, url = url, action = 'radio')) - support.nextPage(itemlist, item, data.data, r'(?P<url>[^"]+)" key="nextStations') + support.nextPage(itemlist, item, data=data.data, patron=r'(?P<url>[^"]+)" key="nextStations') return itemlist diff --git a/channels/vvvvid.py b/channels/vvvvid.py index f683773a..26c2c3c6 100644 --- a/channels/vvvvid.py +++ b/channels/vvvvid.py @@ -107,7 +107,7 @@ def peliculas(item): json_file =loadjs(item.url + 'channel/10005/last/') logger.debug(json_file) make_itemlist(itemlist, item, json_file) - itemlist = support.pagination(itemlist, item, item.page if item.page else 1, 20) + itemlist = support.pagination(itemlist, item, 'peliculas') if item.contentType != 'movie': autorenumber.start(itemlist) tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) diff --git a/core/channeltools.py b/core/channeltools.py index ff5a0442..7313778b 100644 --- a/core/channeltools.py +++ b/core/channeltools.py @@ -108,7 +108,7 @@ def get_channel_json(channel_name): except Exception as ex: template = "An exception of type %s occured. Arguments:\n%r" message = template % (type(ex).__name__, ex.args) - logger.error(" %s" % message) + logger.error("{} | {}".format(channel_name,message)) return channel_json diff --git a/core/jsontools.py b/core/jsontools.py index a17b8f91..b80c2cec 100644 --- a/core/jsontools.py +++ b/core/jsontools.py @@ -24,7 +24,7 @@ def load(*args, **kwargs): except: logger.error("**NOT** able to load the JSON") logger.error(traceback.format_exc()) - logger.error('ERROR STACK ' + str(stack()[1][3])) + logger.error('ERROR STACK:', stack()[1]) value = {} return value diff --git a/core/support.py b/core/support.py index 5ae0a100..ccbc5671 100755 --- a/core/support.py +++ b/core/support.py @@ -243,7 +243,7 @@ class scrape: if inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes']: if len(self.seasons) > 1 and self.seasonPagination: self.itemlist = season_pagination(self.itemlist, self.item, self.seasons, self.function) - elif self.pagination or self.seasonPagination: + elif self.pagination: self.itemlist = pagination(self.itemlist, self.item, self.function) if self.action != 'play' and 'patronMenu' not in self.args and 'patronGenreMenu' not in self.args and self.tmdbEnabled and inspect.stack()[1][3] not in ['add_tvshow'] and self.function not in ['episodios', 'mainlist'] or (self.function in ['episodios'] and config.get_setting('episode_info')): # and function != 'episodios' and item.contentType in ['movie', 'tvshow', 'episode', 'undefined'] @@ -291,72 +291,72 @@ class scrape: for match in matches: self.scraped = {} - for kk in self.known_keys: - val = match[kk] if kk in match else '' - if val and (kk == "url" or kk == 'thumb') and 'http' not in val: + for k, v in match.items(): + if v and k in ['url', 'thumb'] and 'http' not in v: domain = '' - if val.startswith('//'): + if v.startswith('//'): domain = scrapertools.find_single_match(self.item.url, 'https?:') - elif val.startswith('/'): + elif v.startswith('/'): domain = scrapertools.find_single_match(self.item.url, 'https?://[a-z0-9.-]+') - val = domain + val - self.scraped[kk] = val.strip() if type(val) == str else val + v = domain + v + self.itemParams.__setattr__(k, v.strip() if type(v) == str else v) - self.itemParams.title = cleantitle(self.scraped.get('title', '')) - if self.group and self.scraped.get('title', '') in contents and not self.item.grouped: # same title and grouping enabled + self.itemParams.title = cleantitle(self.itemParams.title) + if self.group and self.itemParams.title in contents and not self.item.grouped: # same title and grouping enabled continue - if self.item.grouped and self.scraped.get('title', '') != self.item.fulltitle: # inside a group different tvshow should not be included + if self.item.grouped and self.itemParams.title != self.item.fulltitle: # inside a group different tvshow should not be included continue contents.append(self.itemParams.title) - self.itemParams.title2 = cleantitle(self.scraped.get('title2', '')) if not self.group or self.item.grouped else '' - self.itemParams.quality = self.scraped.get('quality') - self.itemParams.plot = cleantitle(self.scraped.get("plot", '')) + self.itemParams.title2 = cleantitle(self.itemParams.title2) if not self.group or self.item.grouped else '' + self.itemParams.quality = self.itemParams.quality + self.itemParams.plot = cleantitle(self.itemParams.plot) self.itemParams.language = scrapeLang(self.scraped, self.lang) self.set_infolabels() if self.sceneTitle: self.set_sceneTitle() - + if not self.group or self.item.grouped: self.set_episodes() - if self.scraped['episode2']: self.itemParams.second_episode = scrapertools.find_single_match(self.scraped['episode2'], r'(\d+)').split('x') + if self.itemParams.episode2: self.itemParams.second_episode = scrapertools.find_single_match(self.itemParams.episode2, r'(\d+)').split('x') if self.itemParams.season: self.itemParams.infoLabels['season'] = int(self.itemParams.season) if self.itemParams.episode: self.itemParams.infoLabels['episode'] = int(self.itemParams.episode) - itemlist.append(self.set_item(match)) + it = self.set_item(match) + if it: itemlist.append(it) self.itemlist.extend(itemlist) self.matches.extend(matches) def set_infolabels(self): - if self.item.infoLabels["title"] == self.scraped["title"]: + if self.item.infoLabels["title"] == self.itemParams.title: infolabels = self.item.infoLabels else: if self.function == 'episodios': infolabels = self.item.infoLabels else: infolabels = {} - if self.scraped['year']: - infolabels['year'] = self.scraped['year'] - if self.scraped["plot"]: + if self.itemParams.year: + infolabels['year'] = self.itemParams.year + if self.itemParams.plot: infolabels['plot'] = self.itemParams.plot - if self.scraped['duration']: - dur = scrapertools.find_multiple_matches(self.scraped['duration'], r'([0-9])\s*?(?:[hH]|:|\.|,|\\|\/|\||\s)\s*?([0-9]+)') + if self.itemParams.duration: + dur = scrapertools.find_multiple_matches(self.itemParams.duration, r'([0-9])\s*?(?:[hH]|:|\.|,|\\|\/|\||\s)\s*?([0-9]+)') for h, m in dur: - self.scraped['duration'] = int(h) * 60 + int(m) + self.itemParams.duration = int(h) * 60 + int(m) if not dur: - self.scraped['duration'] = scrapertools.find_single_match(self.scraped['duration'], r'(\d+)') + self.itemParams.duration = scrapertools.find_single_match(self.itemParams.duration, r'(\d+)') try: - infolabels['duration'] = int(self.scraped['duration']) * 60 + infolabels['duration'] = int(self.itemParams.duration) * 60 except: - self.scraped['duration'] = '' - if self.scraped['genere']: - genres = scrapertools.find_multiple_matches(self.scraped['genere'], '[A-Za-z]+') + self.itemParams.duration = '' + if self.itemParams.genre: + genres = scrapertools.find_multiple_matches(self.itemParams.genre, '[A-Za-z]+') infolabels['genere'] = ", ".join(genres) - if self.scraped["rating"]: - infolabels['rating'] = scrapertools.decodeHtmlentities(self.scraped["rating"]) + if self.itemParams.rating: + infolabels['rating'] = scrapertools.decodeHtmlentities(self.itemParams.rating) self.itemParams.infoLabels = infolabels @@ -370,7 +370,7 @@ class scrape: self.itemParams.quality = str(parsedTitle.get('source')) if parsedTitle.get('screen_size'): self.itemParams.quality += ' ' + str(parsedTitle.get('screen_size', '')) - if not self.scraped['year']: + if not self.itemParams.year: if type(parsedTitle.get('year', '')) == list: self.itemParams.infoLabels['year'] = parsedTitle.get('year', '')[0] else: @@ -398,8 +398,8 @@ class scrape: logger.error(traceback.format_exc()) def set_episodes(self): - ep = unifyEp(self.scraped['episode']) if self.scraped['episode'] else '' - se = self.scraped['season'] if self.scraped['season'].isdigit() else '' + ep = unifyEp(self.itemParams.episode) if self.itemParams.episode else '' + se = self.itemParams.season if self.itemParams.season.isdigit() else '' if ep and se: self.itemParams.season = int(se) if 'x' in ep: @@ -411,9 +411,9 @@ class scrape: elif self.item.season: self.itemParams.season = int(self.item.season) - if ep: self.itemParams.episode = int(scrapertools.find_single_match(self.scraped['episode'], r'(\d+)')) + if ep: self.itemParams.episode = int(scrapertools.find_single_match(self.itemParams.episode, r'(\d+)')) - elif self.item.contentType == 'tvshow' and (self.scraped['episode'] == '' and self.scraped['season'] == '' and self.itemParams.season == ''): + elif self.item.contentType == 'tvshow' and (self.itemParams.episode == '' and self.itemParams.season == '' and self.itemParams.season == ''): self.item.news = 'season_completed' else: @@ -435,17 +435,17 @@ class scrape: CT = '' if self.typeContentDict: for name, variants in self.typeContentDict.items(): - if str(self.scraped['type']).lower() in variants: + if str(self.itemParams.type).lower() in variants: CT = name break else: CT = self.item.contentType if self.typeActionDict: for name, variants in self.typeActionDict.items(): - if str(self.scraped['type']).lower() in variants: + if str(self.itemParams.type).lower() in variants: AC = name break else: AC = self.action - if (not self.scraped['title'] or self.scraped["title"] not in self.blacklist) and (self.search.lower() in self.itemParams.title.lower()): + if (not self.itemParams.title or self.itemParams.title not in self.blacklist) and (self.search.lower() in self.itemParams.title.lower()): it = self.item.clone(title=self.itemParams.title, fulltitle=self.itemParams.title, @@ -457,15 +457,15 @@ class scrape: episode2 = self.itemParams.second_episode, extraInfo = self.itemParams.extraInfo, disable_videolibrary = not self.args.get('addVideolibrary', True), - size = self.scraped['size'], - seed = self.scraped['seed']) + size = self.itemParams.size, + seed = self.itemParams.seed) - if self.scraped["url"]: it.url = self.scraped["url"] + if self.itemParams.url: it.url = self.itemParams.url if self.function == 'episodios': it.fulltitle = it.show = self.itemParams.title if self.itemParams.quality: it.quality = self.itemParams.quality if self.itemParams.language: it.contentLanguage = self.itemParams.language if self.item.prevthumb: it.thumbnail = self.item.prevthumb - elif self.scraped["thumb"]: it.thumbnail = self.scraped["thumb"] + elif self.itemParams.thumb: it.thumbnail = self.itemParams.thumb it.contentType = 'episode' if self.function == 'episodios' else CT if CT else self.item.contentType if it.contentType not in ['movie'] and self.function != 'episodios' or it.contentType in ['undefined']: it.contentSerieName = self.itemParams.title if self.function == 'peliculas': it.contentTitle= self.itemParams.title @@ -473,7 +473,7 @@ class scrape: it.contentEpisodeNumber= self.itemParams.infoLabels.get('episode', ''), if self.itemParams.title2: it.title2 = self.itemParams.title2 - if self.scraped['episode'] and self.group and not self.item.grouped: + if self.itemParams.episode and self.group and not self.item.grouped: it.action = self.function elif AC: it.action = AC @@ -848,6 +848,8 @@ def nextPage(itemlist, item, function_or_level=1, **kwargs): total_pages = integer, the number of total pages ''' logger.debug() + if 'channel_search' in [s[3] for s in inspect.stack()]: + return itemlist # get optional args data = kwargs.get('data', '') @@ -858,14 +860,6 @@ def nextPage(itemlist, item, function_or_level=1, **kwargs): page = kwargs.get('page', None) total_pages = kwargs.get('total_pages', None) - # create Item - if patron or page or next_page: - nextItem = item.clone(action = inspect.stack()[function_or_level][3] if type(function_or_level) == int else function_or_level, - title=typo(config.get_localized_string(30992), 'color kod bold'), - nextPage=True, - page=page if page else item.page + 1 if item.page else 2, - thumbnail=thumb()) - # get next_page from data if data and patron: next_page = scrapertools.find_single_match(data, patron) @@ -891,6 +885,7 @@ def nextPage(itemlist, item, function_or_level=1, **kwargs): if total_pages: item.total_pages = total_pages + # create Item if next_page or page: itemlist.append(item.clone(action = inspect.stack()[function_or_level][3] if type(function_or_level) == int else function_or_level, title=typo(config.get_localized_string(30992), 'color kod bold'), @@ -902,6 +897,8 @@ def nextPage(itemlist, item, function_or_level=1, **kwargs): def pagination(itemlist, item, function_level=1): + if 'channel_search' in [s[3] for s in inspect.stack()]: + return itemlist itemlistdb(itemlist) page = item.page if item.page else 1 perpage = config.get_setting('pagination', default=20) @@ -927,6 +924,8 @@ def pagination(itemlist, item, function_level=1): def season_pagination(itemlist, item, seasons, function_level=1): + if 'channel_search' in [s[3] for s in inspect.stack()]: + return itemlist itemlistdb(itemlist) action = function_level if type(function_level) == str else inspect.stack()[function_level][3] itlist = [] diff --git a/core/tmdb.py b/core/tmdb.py index f47a833b..4a7dd7ef 100644 --- a/core/tmdb.py +++ b/core/tmdb.py @@ -182,7 +182,7 @@ def set_infoLabels(source, seekTmdb=True, search_language=def_lang, forced=False return ret -def set_infoLabels_itemlist(item_list, seekTmdb=False, search_language=def_lang, forced=False): +def set_infoLabels_itemlist(itemlist, seekTmdb=False, search_language=def_lang, forced=False): """ Concurrently, it gets the data of the items included in the item_list. @@ -215,15 +215,15 @@ def set_infoLabels_itemlist(item_list, seekTmdb=False, search_language=def_lang, return (_i, _item, ret) - # for i, item in enumerate(item_list): + # for i, item in enumerate(itemlist): # r_list.append(sub_thread(item, i, seekTmdb)) with futures.ThreadPoolExecutor() as executor: - searchList = [executor.submit(sub_thread, item, i, seekTmdb) for i, item in enumerate(item_list)] + searchList = [executor.submit(sub_thread, item, i, seekTmdb) for i, item in enumerate(itemlist)] for res in futures.as_completed(searchList): r_list.append(res.result()) - # Sort results list by call order to keep the same order q item_list + # Sort results list by call order to keep the same order q itemlist r_list.sort(key=lambda i: i[0]) # Rebuild and return list only with results of individual calls diff --git a/platformcode/config.py b/platformcode/config.py index 86412bf4..4a229955 100644 --- a/platformcode/config.py +++ b/platformcode/config.py @@ -298,7 +298,7 @@ def get_localized_string(code): def get_localized_category(categ): categories = {'movie': get_localized_string(30122), 'tvshow': get_localized_string(30123), 'anime': get_localized_string(30124), 'documentary': get_localized_string(30125), - 'vos': get_localized_string(30136), 'sub-ita': get_localized_string(70566), + 'vos': get_localized_string(30136), 'sub': get_localized_string(30136), 'direct': get_localized_string(30137), 'torrent': get_localized_string(70015), 'live': get_localized_string(30138), 'music': get_localized_string(30139) } diff --git a/platformcode/platformtools.py b/platformcode/platformtools.py index 67010b3f..221f2acf 100644 --- a/platformcode/platformtools.py +++ b/platformcode/platformtools.py @@ -1783,6 +1783,7 @@ 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: @@ -1791,18 +1792,15 @@ def get_played_time(item): if not ID: return 0 - S = item.infoLabels.get('season', 0) - E = item.infoLabels.get('episode') + s = item.infoLabels.get('season',0) + e = item.infoLabels.get('episode') result = None try: - if S and E: - result = db['viewed'].get(ID, {}).get(str(S)+'x'+str(E)) - else: - result = db['viewed'].get(ID) - - if result: - played_time = result + result = db['viewed'].get(ID) + if type(result) == dict: + result = db['viewed'].get(ID, {}).get('{}x{}'.format(s, e), 0) + played_time = result except: import traceback logger.error(traceback.format_exc()) @@ -1814,6 +1812,7 @@ 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: @@ -1823,15 +1822,15 @@ def set_played_time(item): if not ID: return - S = item.infoLabels.get('season', 0) - E = item.infoLabels.get('episode') + s = item.infoLabels.get('season',0) + e = item.infoLabels.get('episode') try: if item.contentType == 'movie': db['viewed'][ID] = played_time - elif E: + elif e: newDict = db['viewed'].get(ID, {}) - newDict[str(S) + 'x' + str(E)] = played_time + newDict['{}x{}'.format(s, e)] = played_time db['viewed'][ID] = newDict except: import traceback diff --git a/resources/skins/Default/720p/GlobalSearch.xml b/resources/skins/Default/720p/GlobalSearch.xml index 1ddc70b1..dcf2fc84 100644 --- a/resources/skins/Default/720p/GlobalSearch.xml +++ b/resources/skins/Default/720p/GlobalSearch.xml @@ -266,18 +266,6 @@ <itemlayout height="570" width="180"> <control type="group"> <top>300</top> - <visible>String.IsEmpty(ListItem.Property(channelthumb))</visible> - <control type="image"> - <description>Item Poster</description> - <top>0</top> - <left>0</left> - <width>180</width> - <height>270</height> - <texture colordiffuse="FF999999">$INFO[ListItem.Art(poster)]</texture> - <visible>!Control.HasFocus(102)</visible> - <bordersize>10</bordersize> - <aspectratio>scale</aspectratio> - </control> <control type="image"> <description>Item Poster</description> <top>0</top> @@ -285,33 +273,27 @@ <width>180</width> <height>270</height> <texture>$INFO[ListItem.Art(poster)]</texture> - <visible>Control.HasFocus(102)</visible> - <bordersize>10</bordersize> - <aspectratio>scale</aspectratio> - </control> - </control> - <control type="group"> - <top>390</top> - <visible>!String.IsEmpty(ListItem.Property(channelthumb))</visible> - <control type="image"> - <description>Item Poster</description> - <top>0</top> - <left>0</left> - <width>180</width> - <height>180</height> - <texture colordiffuse="FF999999">$INFO[ListItem.Property(channelthumb)]</texture> - <visible>!Control.HasFocus(102)</visible> <bordersize>10</bordersize> <aspectratio>scale</aspectratio> </control> <control type="image"> <description>Item Poster</description> - <top>0</top> + <bottom>0</bottom> <left>0</left> - <width>180</width> - <height>180</height> + <width>80</width> + <height>80</height> <texture>$INFO[ListItem.Property(channelthumb)]</texture> - <visible>Control.HasFocus(102)</visible> + <bordersize>10</bordersize> + <aspectratio>scale</aspectratio> + </control> + <control type="image"> + <description>Item Poster</description> + <top>0</top> + <right>0</right> + <width>80</width> + <height>80</height> + <texture>sub.png</texture> + <visible>!String.IsEmpty(ListItem.Property(sub))</visible> <bordersize>10</bordersize> <aspectratio>scale</aspectratio> </control> @@ -319,17 +301,6 @@ </itemlayout> <focusedlayout height="570" width="380"> <control type="group"> - <control type="image"> - <description>Item Poster</description> - <top>0</top> - <left>0</left> - <width>380</width> - <height>570</height> - <texture colordiffuse="FF999999">$INFO[ListItem.Art(poster)]</texture> - <visible>!Control.HasFocus(102)</visible> - <bordersize>10</bordersize> - <aspectratio>scale</aspectratio> - </control> <control type="image"> <description>Item Poster</description> <top>0</top> @@ -337,34 +308,27 @@ <width>380</width> <height>570</height> <texture>$INFO[ListItem.Art(poster)]</texture> - <visible>Control.HasFocus(102)</visible> - <bordersize>10</bordersize> - <aspectratio>scale</aspectratio> - </control> - </control> - <control type="group"> - <top>420</top> - <left>230</left> - <visible>!String.IsEmpty(ListItem.Property(channelthumb))</visible> - <control type="image"> - <description>Item Poster</description> - <top>0</top> - <left>0</left> - <width>150</width> - <height>150</height> - <texture colordiffuse="FF999999">$INFO[ListItem.Property(channelthumb)]</texture> - <visible>!Control.HasFocus(102)</visible> <bordersize>10</bordersize> <aspectratio>scale</aspectratio> </control> <control type="image"> <description>Item Poster</description> - <top>0</top> + <bottom>0</bottom> <left>0</left> <width>150</width> <height>150</height> <texture>$INFO[ListItem.Property(channelthumb)]</texture> - <visible>Control.HasFocus(102)</visible> + <bordersize>10</bordersize> + <aspectratio>scale</aspectratio> + </control> + <control type="image"> + <description>Item Poster</description> + <top>0</top> + <right>0</right> + <width>150</width> + <height>150</height> + <texture>sub.png</texture> + <visible>!String.IsEmpty(ListItem.Property(sub))</visible> <bordersize>10</bordersize> <aspectratio>scale</aspectratio> </control> @@ -372,7 +336,12 @@ </focusedlayout> </control> </control> <!-- END Search Result Group --> - + <control type='image'> + <width>100%</width> + <height>100%</height> + <texture colordiffuse='88000000'>white.png</texture> + <visible>!Control.HasFocus(102)</visible> + </control> <control type='button'> <description>Result Overflow</description> <top>0</top> @@ -436,7 +405,7 @@ <left>0</left> <width>150</width> <height>150</height> - <texture>$INFO[ListItem.Property(thumb)]</texture> + <texture>$INFO[ListItem.Art(poster)]</texture> <bordersize>2</bordersize> <aspectratio>scale</aspectratio> </control> @@ -470,7 +439,7 @@ <left>0</left> <width>150</width> <height>150</height> - <texture>$INFO[ListItem.Property(thumb)]</texture> + <texture>$INFO[ListItem.Art(poster)]</texture> <bordersize>2</bordersize> <bordertexture colordiffuse='FF0082C2'>white.png</bordertexture> <aspectratio>scale</aspectratio> @@ -513,7 +482,7 @@ <left>0</left> <width>480</width> <height>720</height> - <texture>$INFO[Container(102).ListItem.Property(thumb)]</texture> + <texture>$INFO[Container(102).ListItem.Art(poster)]</texture> </control> <control type="textbox"> @@ -551,7 +520,7 @@ <shadowcolor>00000000</shadowcolor> <align>left</align> <aligny>center</aligny> - <label>[COLOR FFAAAAAA]$INFO[ListItem.Label()][/COLOR]</label> + <label>$INFO[ListItem.Label()]</label> </control> </itemlayout> <focusedlayout height="60" width="700"> @@ -561,7 +530,7 @@ <left>0</left> <width>700</width> <height>60</height> - <texture colordiffuse="88000000">white.png</texture> + <texture colordiffuse="CC000000">white.png</texture> <aspectratio>scale</aspectratio> </control> <control type="textbox"> @@ -575,7 +544,7 @@ <shadowcolor>00000000</shadowcolor> <align>left</align> <aligny>center</aligny> - <label>$INFO[ListItem.Label]</label> + <label>[B]$INFO[ListItem.Label][/B]</label> </control> </focusedlayout> </control> <!-- END Episodes List --> @@ -591,7 +560,7 @@ <left>0</left> <width>480</width> <height>720</height> - <texture>$INFO[Container(102).ListItem.Property(thumb)]</texture> + <texture>$INFO[Container(102).ListItem.Art(poster)]</texture> </control> <control type="textbox"> @@ -624,7 +593,7 @@ <left>5</left> <width>120</width> <height>120</height> - <texture>$INFO[ListItem.Property(thumb)]</texture> + <texture>$INFO[ListItem.Art(poster)]</texture> <aspectratio>scale</aspectratio> </control> <control type="group"> @@ -706,7 +675,7 @@ <left>5</left> <width>120</width> <height>120</height> - <texture>$INFO[ListItem.Property(thumb)]</texture> + <texture>$INFO[ListItem.Art(poster)]</texture> <aspectratio>scale</aspectratio> </control> <control type="group"> diff --git a/resources/skins/Default/media/sub.png b/resources/skins/Default/media/sub.png new file mode 100644 index 0000000000000000000000000000000000000000..171a451747d2a9356f6607e2d14ab2d9e43fcd1e GIT binary patch literal 13979 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 literal 0 HcmV?d00001 diff --git a/specials/globalsearch.py b/specials/globalsearch.py index 2e33c282..7b51e087 100644 --- a/specials/globalsearch.py +++ b/specials/globalsearch.py @@ -356,7 +356,8 @@ class SearchWindow(xbmcgui.WindowXML): self.count = len(self.searchActions) def get_channel_results(self, searchAction): - def search(text): + def channel_search(text): + logger.debug('Search on channel:', channel) valid = [] other = [] results = self.moduleDict[channel].search(searchAction, text) @@ -381,19 +382,19 @@ class SearchWindow(xbmcgui.WindowXML): other = [] try: - results, valid, other = search(self.item.text) + results, valid, other = channel_search(self.item.text) # if we are on movie search but no valid results is found, and there's a lot of results (more pages), try # to add year to search text for better filtering if self.item.contentType == 'movie' and not valid and other and other[-1].nextPage \ and self.item.infoLabels['year']: logger.debug('retring adding year on channel ' + channel) - dummy, valid, dummy = search(self.item.text + " " + str(self.item.infoLabels['year'])) + dummy, valid, dummy = channel_search(self.item.text + " " + str(self.item.infoLabels['year'])) # some channels may use original title if self.item.mode != 'all' and not valid and self.item.infoLabels.get('originaltitle'): logger.debug('retring with original title on channel ' + channel) - dummy, valid, dummy = search(self.item.infoLabels.get('originaltitle')) + dummy, valid, dummy = channel_search(self.item.infoLabels.get('originaltitle')) except: import traceback logger.error(traceback.format_exc()) @@ -402,15 +403,19 @@ class SearchWindow(xbmcgui.WindowXML): return update_lock.acquire() self.count += 1 + logger.debug('Results:', channel, results, valid, other) self.update(channel, valid, other if other else results) update_lock.release() - def makeItem(self, url): - item = Item().fromurl(url) + def makeItem(self, item): + if type(item) == str: item = Item().fromurl(item) channelParams = channeltools.get_channel_parameters(item.channel) info = item.infoLabels tagline = info.get('tagline') - title = '[B]{}[/B]'.format(item.fulltitle) + ('\n[I]{}[/I]'.format(tagline) if tagline else '') + if 'download' in item.action or 'videolibrary' in item.action: + title = '{}{}'.format(item.title, item.contentTitle) + else: + title = '[B]{}[/B]'.format(item.contentTitle) + ('\n[I]{}[/I]'.format(tagline) if tagline else '') thumb = item.thumbnail if item.thumbnail else 'Infoplus/' + item.contentType.replace('show', '') + '.png' it = xbmcgui.ListItem(title) @@ -422,11 +427,11 @@ class SearchWindow(xbmcgui.WindowXML): color = 'FFFFFFFF' if not rating else 'FFDB2360' if rating < 4 else 'FFD2D531' if rating < 7 else 'FF21D07A' it.setProperties({'rating': str(int(info.get('rating',10) * 10)), 'color': color, - 'item': url, 'verified': item.verified, 'channel':channelParams['title'], 'channelthumb': channelParams['thumbnail'] if item.verified else ''}) + 'item': item.tourl(), 'verified': item.verified, 'channel':channelParams['title'], 'channelthumb': channelParams['thumbnail'], 'sub':'true' if 'sub' in item.contentLanguage.lower() else ''}) if item.server: color = scrapertools.find_single_match(item.alive, r'(FF[^\]]+)') + it.setArt({'poster': config.get_online_server_thumb(item.server)}) it.setProperties({'channel': channeltools.get_channel_parameters(item.channel).get('title', ''), - 'thumb': config.get_online_server_thumb(item.server), 'servername': servertools.get_server_parameters(item.server.lower()).get('name', item.server), 'color': color if color else 'FF0082C2'}) @@ -436,12 +441,12 @@ class SearchWindow(xbmcgui.WindowXML): self.LOADING.setVisible(False) if self.exit: return - logger.debug('Search on channel', channel) + if self.item.mode != 'all' and 'valid' not in self.results: self.results['valid'] = 0 item = xbmcgui.ListItem('valid') - item.setProperties({'thumb': 'valid.png', - 'position': '0', + item.setArt({'poster':'valid.png'}) + item.setProperties({'position': '0', 'results': '0'}) self.channels.append(item) pos = self.CHANNELS.getSelectedPosition() @@ -460,7 +465,7 @@ class SearchWindow(xbmcgui.WindowXML): if self.CHANNELS.getSelectedPosition() == 0: items = [] for result in valid: - if result: items.append(self.makeItem(result.tourl())) + if result: items.append(self.makeItem(result)) pos = self.RESULTS.getSelectedPosition() self.RESULTS.addItems(items) if pos < 0: @@ -474,8 +479,8 @@ class SearchWindow(xbmcgui.WindowXML): name = channelParams['title'] if name not in self.results: item = xbmcgui.ListItem(name) - item.setProperties({'thumb': channelParams['thumbnail'], - 'position': '0', + item.setArt({'poster':channelParams['thumbnail']}) + item.setProperties({'position': '0', 'results': str(len(results)) }) for result in results: @@ -700,7 +705,7 @@ class SearchWindow(xbmcgui.WindowXML): other = [] for i, item in enumerate(servers): if item.server: - it = self.makeItem(item.tourl()) + it = self.makeItem(item) it.setProperty('index', str(i)) if item.quality.lower() in ['4k', '2160p', '2160', '4k2160p', '4k2160', '4k 2160p', '4k 2160', '2k']: it.setProperty('quality', 'uhd.png') @@ -720,8 +725,9 @@ class SearchWindow(xbmcgui.WindowXML): elif not item.action: self.getControl(QUALITYTAG).setText(item.fulltitle) else: - it = self.makeItem(item.tourl()) + it = self.makeItem(item) other.append(it) + logger.debug(it) uhd.sort(key=lambda it: it.getProperty('index')) fhd.sort(key=lambda it: it.getProperty('index')) @@ -732,7 +738,7 @@ class SearchWindow(xbmcgui.WindowXML): serverlist = uhd + fhd + hd + sd + unknown + other if not serverlist: serverlist = [xbmcgui.ListItem(config.get_localized_string(60347))] - serverlist[0].setProperty('thumb', support.thumb('nofolder')) + serverlist[0].setArt({'poster': support.thumb('nofolder')}) self.Focus(SERVERS) self.SERVERLIST.reset() @@ -747,7 +753,7 @@ class SearchWindow(xbmcgui.WindowXML): self.itemsResult = [] ep = [] for item in self.episodes: - title = item.title + title = item.contentTitle if item.contentEpisodeNumber: title = '{:02d}. {}'.format(item.contentEpisodeNumber, title) if item.contentSeason: title = '{}x{}'.format(item.contentSeason, title) @@ -757,7 +763,7 @@ class SearchWindow(xbmcgui.WindowXML): if not ep: ep = [xbmcgui.ListItem(config.get_localized_string(60347))] - ep[0].setProperty('thumb', support.thumb('nofolder')) + ep[0].setArt({'poster', support.thumb('nofolder')}) self.Focus(EPISODES) self.EPISODESLIST.reset() diff --git a/specials/search.py b/specials/search.py index 612e38c3..8aa267f0 100644 --- a/specials/search.py +++ b/specials/search.py @@ -488,7 +488,7 @@ def setting_channel_new(item): # presel_values = ['skip', 'actual', 'recom', 'freq', 'all', 'none', 'cast', 'lat'] presel_values = ['skip', 'actual', 'all', 'none'] - categs = ['movie', 'tvshow', 'documentary', 'anime', 'vos', 'direct', 'torrent'] + categs = ['movie', 'tvshow', 'documentary', 'anime', 'sub', 'live', 'torrent'] for c in categs: preselecciones.append(config.get_localized_string(70577) + config.get_localized_category(c)) presel_values.append(c)