From 6ebbf3b90125f93d4744166ce3ce6c6553b98b87 Mon Sep 17 00:00:00 2001 From: Alhaziel Date: Thu, 8 Aug 2019 11:41:02 +0200 Subject: [PATCH 1/5] Fix e aggiunta search args in scrape --- core/support.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/core/support.py b/core/support.py index c9643d9b..924b1ead 100644 --- a/core/support.py +++ b/core/support.py @@ -164,7 +164,7 @@ def scrapeLang(scraped, lang, longtitle): return lang, longtitle -def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, typeContentDict, typeActionDict, blacklist, pag): +def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, typeContentDict, typeActionDict, blacklist, search, pag, function): itemlist = [] matches = scrapertoolsV2.find_multiple_matches_groups(block, patron) @@ -246,31 +246,32 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t for name, variants in typeActionDict.items(): if scraped['type'] in variants: action = name - - if (scraped["title"] not in blacklist) or longtitle: + + if ((scraped["title"] not in blacklist) or longtitle) and search.lower() in longtitle.lower(): it = Item( channel=item.channel, action=action, - contentType='episode' if ( - action == 'findvideos' and item.contentType == 'tvshow') else item.contentType, + contentType='episode' if function == 'episodios' else item.contentType, title=longtitle, - fulltitle=item.fulltitle if (action == 'findvideos' and item.contentType != 'movie') else title, - show=item.show if (action == 'findvideos' and item.contentType != 'movie') else title, + fulltitle=item.fulltitle if function == 'episodios' else title, + show=item.show if function == 'episodios' else title, quality=scraped["quality"], url=scraped["url"], infoLabels=infolabels, thumbnail=scraped["thumb"], args=item.args, - contentSerieName=title if (action == 'episodios' and item.contentType != 'movie') else '', + contentSerieName=title if item.contentType != 'movie' else '', + contentTitle=title if item.contentType == 'movie' else '', contentLanguage=lang ) - + for lg in list(set(listGroups).difference(known_keys)): it.__setattr__(lg, match[listGroups.index(lg)]) if 'itemHook' in args: it = args['itemHook'](it) itemlist.append(it) + return itemlist, matches @@ -302,6 +303,7 @@ def scrape(func): # IMPORTANT 'type' is a special key, to work need typeContentDict={} and typeActionDict={} def wrapper(*args): + function = func.__name__ itemlist = [] args = func(*args) @@ -311,6 +313,7 @@ def scrape(func): action = args['action'] if 'action' in args else 'findvideos' anime = args['anime'] if 'anime' in args else '' addVideolibrary = args['addVideolibrary'] if 'addVideolibrary' in args else True + search = args['search'] if 'search' in args else '' blacklist = args['blacklist'] if 'blacklist' in args else [] data = args['data'] if 'data' in args else '' patron = args['patron'] if 'patron' in args else args['patronMenu'] if 'patronMenu' in args else '' @@ -338,7 +341,7 @@ def scrape(func): block = "" for bl in blocks: blockItemlist, blockMatches = scrapeBlock(item, args, bl['block'], patron, headers, action, pagination, debug, - typeContentDict, typeActionDict, blacklist, pag) + typeContentDict, typeActionDict, blacklist, search, pag, function) for it in blockItemlist: if 'lang' in bl: it.contentLanguage, it.title = scrapeLang(bl, it.contentLanguage, it.title) @@ -350,14 +353,14 @@ def scrape(func): matches.extend(blockMatches) elif patron: itemlist, matches = scrapeBlock(item, args, data, patron, headers, action, pagination, debug, typeContentDict, - typeActionDict, blacklist, pag) + typeActionDict, blacklist, search, pag, function) checkHost(item, itemlist) -## if (item.contentType == "tvshow" and (action != "findvideos" and action != "play")) \ -## or (item.contentType == "episode" and action != "play") \ -## or (item.contentType == "movie" and action != "play") : - if action != 'play': + if (item.contentType == "tvshow" and (action != "findvideos" and action != "play")) \ + or (item.contentType == "episode" and action != "play") \ + or (item.contentType == "movie" and action != "play") : + # if action != 'play' or (item.contentType == "tvshow" and action != "findvideos"): tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) # else: # Si perde item show :( # for it in itemlist: @@ -383,7 +386,7 @@ def scrape(func): if anime: from specials import autorenumber - if inspect.stack()[1][3] == 'episodios' or item.action == 'episodios': autorenumber.renumber(itemlist, item, 'bold') + if function == 'episodios' or item.action == 'episodios': autorenumber.renumber(itemlist, item, 'bold') else: autorenumber.renumber(itemlist) if addVideolibrary and (item.infoLabels["title"] or item.fulltitle): From 8a0d2cbd61963c8313e3336cea215e3531178bbb Mon Sep 17 00:00:00 2001 From: Alhaziel Date: Thu, 8 Aug 2019 11:41:24 +0200 Subject: [PATCH 2/5] Riscritto Anime Force --- channels.json | 2 +- channels/animeforce.json | 37 ++- channels/animeforce.py | 532 ++++++--------------------------------- 3 files changed, 115 insertions(+), 456 deletions(-) diff --git a/channels.json b/channels.json index c76231d7..f5ad9a0a 100644 --- a/channels.json +++ b/channels.json @@ -4,7 +4,7 @@ "altadefinizione01": "https://www.altadefinizione01.cc", "altadefinizioneclick": "https://altadefinizione.cloud", "altadefinizionehd": "https://altadefinizionetv.best", - "animeforge": "https://ww1.animeforce.org", + "animeforce": "https://ww1.animeforce.org", "animeleggendari": "https://animepertutti.com", "animestream": "https://www.animeworld.it", "animespace": "http://www.animespace.tv", diff --git a/channels/animeforce.json b/channels/animeforce.json index e5cbc66e..e8ef9c00 100644 --- a/channels/animeforce.json +++ b/channels/animeforce.json @@ -11,10 +11,10 @@ { "id": "include_in_global_search", "type": "bool", - "label": "Incluir en busqueda global", + "label": "Includi in Ricerca Globale", "default": false, "enabled": false, - "visible": false + "visible": true }, { "id": "include_in_newest_anime", @@ -25,12 +25,37 @@ "visible": true }, { - "id": "include_in_newest_italiano", + "id": "checklinks", "type": "bool", - "label": "Includi in Novità - Italiano", - "default": true, + "label": "Verifica se i link esistono", + "default": false, "enabled": true, "visible": true - } + }, + { + "id": "checklinks_number", + "type": "list", + "label": "Numero de link da verificare", + "default": 1, + "enabled": true, + "visible": "eq(-1,true)", + "lvalues": [ "1", "3", "5", "10" ] + }, + { + "id": "autorenumber", + "type": "bool", + "label": "@70712", + "default": false, + "enabled": true, + "visible": true + }, + { + "id": "autorenumber_mode", + "type": "bool", + "label": "@70688", + "default": false, + "enabled": true, + "visible": "eq(-1,true)" + } ] } diff --git a/channels/animeforce.py b/channels/animeforce.py index 54a14d80..d9719f57 100644 --- a/channels/animeforce.py +++ b/channels/animeforce.py @@ -1,71 +1,53 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------ -# Ringraziamo Icarus crew -# Canale per http://animeinstreaming.net/ +# Canale per animeforce.org # ------------------------------------------------------------ import re import urllib import urlparse -from core import httptools, scrapertools, servertools, tmdb +from core import httptools, scrapertoolsV2, servertools, tmdb from core.item import Item from platformcode import config, logger from servers.decrypters import adfly +from core.support import log +from core import support -__channel__ = "animeforge" +__channel__ = "animeforce" host = config.get_channel_url(__channel__) IDIOMAS = {'Italiano': 'IT'} list_language = IDIOMAS.values() +list_servers = ['directo', 'openload'] +list_quality = ['default'] + +checklinks = config.get_setting('checklinks', __channel__) +checklinks_number = config.get_setting('checklinks_number', __channel__) headers = [['Referer', host]] -PERPAGE = 20 - -# ----------------------------------------------------------------- +@support.menu def mainlist(item): - log("mainlist", "mainlist", item.channel) - itemlist = [Item(channel=item.channel, - action="lista_anime", - title="[COLOR azure]Anime [/COLOR]- [COLOR lightsalmon]Lista Completa[/COLOR]", - url=host + "/lista-anime/", - thumbnail=CategoriaThumbnail, - fanart=CategoriaFanart), - Item(channel=item.channel, - action="animeaggiornati", - title="[COLOR azure]Anime Aggiornati[/COLOR]", - url=host, - thumbnail=CategoriaThumbnail, - fanart=CategoriaFanart), - Item(channel=item.channel, - action="ultimiep", - title="[COLOR azure]Ultimi Episodi[/COLOR]", - url=host, - thumbnail=CategoriaThumbnail, - fanart=CategoriaFanart), - Item(channel=item.channel, - action="search", - title="[COLOR yellow]Cerca ...[/COLOR]", - thumbnail="http://dc467.4shared.com/img/fEbJqOum/s7/13feaf0c8c0/Search")] + anime = ['/lista-anime/', + ('In Corso',['/lista-anime-in-corso/']), + ('Ultimi Episodi',['','peliculas','update']), + ('Ultime Serie',['/category/anime/articoli-principali/','peliculas','last']) + ] + return locals() - return itemlist - - -# ================================================================= - -# ----------------------------------------------------------------- + def newest(categoria): - log("newest", "newest" + categoria) + log(categoria) itemlist = [] item = Item() try: if categoria == "anime": item.url = host - item.action = "ultimiep" - itemlist = ultimiep(item) + item.args = 'update' + itemlist = peliculas(item) - if itemlist[-1].action == "ultimiep": + if itemlist[-1].action == "peliculas": itemlist.pop() # Continua la ricerca in caso di errore except: @@ -76,430 +58,82 @@ def newest(categoria): return itemlist - -# ================================================================= - -# ----------------------------------------------------------------- +@support.scrape def search(item, texto): - log("search", "search", item.channel) - item.url = host + "/?s=" + texto - try: - return search_anime(item) - # Continua la ricerca in caso di errore - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] + search = texto + item.contentType = 'tvshow' + patron = '(?P.*?) [Ss][Uu][Bb]' + action = 'episodios' + return locals() -# ================================================================= +@support.scrape +def peliculas(item): + anime = True + if item.args == 'update': + patron = r'src="(?P<thumb>[^"]+)" class="attachment-grid-post[^"]+" alt="[^"]*" title="(?P<title>[^"]+").*?<h2><a href="(?P<url>[^"]+)"' + def itemHook(item): + delete = scrapertoolsV2.find_single_match(item.fulltitle, r'( Episodio.*)') + number = scrapertoolsV2.find_single_match(item.title, r'Episodio (\d+)') + item.title = support.typo(number + ' - ','bold') + item.title.replace(delete,'') + item.fulltitle = item.show = item.fulltitle.replace(delete,'') + item.url = item.url.replace('-episodio-'+ number,'') + item.number = number + return item + action = 'findvideos' -# ----------------------------------------------------------------- -def search_anime(item): - log("search_anime", "search_anime", item.channel) - itemlist = [] + elif item.args == 'last': + patron = r'src="(?P<thumb>[^"]+)" class="attachment-grid-post[^"]+" alt="[^"]*" title="(?P<title>.*?)(?: Sub| sub| SUB|").*?<h2><a href="(?P<url>[^"]+)"' + action = 'episodios' - data = httptools.downloadpage(item.url).data + else: + pagination = '' + patron = '<strong><a href="(?P<url>[^"]+)">(?P<title>.*?) [Ss][Uu][Bb]' + action = 'episodios' - patron = r'<a href="([^"]+)"><img.*?src="([^"]+)".*?title="([^"]+)".*?/>' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, scrapedthumbnail, scrapedtitle in matches: - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle) - if "Sub Ita Download & Streaming" in scrapedtitle or "Sub Ita Streaming": - if 'episodio' in scrapedtitle.lower(): - itemlist.append(episode_item(item, scrapedtitle, scrapedurl, scrapedthumbnail)) - else: - scrapedtitle, eptype = clean_title(scrapedtitle, simpleClean=True) - cleantitle, eptype = clean_title(scrapedtitle) - - scrapedurl, total_eps = create_url(scrapedurl, cleantitle) - - itemlist.append( - Item(channel=item.channel, - action="episodios", - text_color="azure", - contentType="tvshow", - title=scrapedtitle, - url=scrapedurl, - fulltitle=cleantitle, - show=cleantitle, - thumbnail=scrapedthumbnail)) - - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) - - # Next Page - next_page = scrapertools.find_single_match(data, r'<link rel="next" href="([^"]+)"[^/]+/>') - if next_page != "": - itemlist.append( - Item(channel=item.channel, - action="search_anime", - text_bold=True, - title="[COLOR lightgreen]" + config.get_localized_string(30992) + "[/COLOR]", - url=next_page, - thumbnail="http://2.bp.blogspot.com/-fE9tzwmjaeQ/UcM2apxDtjI/AAAAAAAAeeg/WKSGM2TADLM/s1600/pager+old.png")) - - return itemlist + return locals() -# ================================================================= - -# ----------------------------------------------------------------- -def animeaggiornati(item): - log("animeaggiornati", "animeaggiornati", item.channel) - itemlist = [] - - data = httptools.downloadpage(item.url, headers=headers).data - - patron = r'<img.*?src="([^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><a href="([^"]+)">([^<]+)</a>' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedthumbnail, scrapedurl, scrapedtitle in matches: - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle) - if 'Streaming' in scrapedtitle: - cleantitle, eptype = clean_title(scrapedtitle) - - # Creazione URL - scrapedurl, total_eps = create_url(scrapedurl, scrapedtitle) - - itemlist.append( - Item(channel=item.channel, - action="episodios", - text_color="azure", - contentType="tvshow", - title=cleantitle, - url=scrapedurl, - fulltitle=cleantitle, - show=cleantitle, - thumbnail=scrapedthumbnail)) - - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) - - return itemlist - - -# ================================================================= - -# ----------------------------------------------------------------- -def ultimiep(item): - log("ultimiep", "ultimiep", item.channel) - itemlist = [] - - data = httptools.downloadpage(item.url, headers=headers).data - - patron = r'<img.*?src="([^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><a href="([^"]+)">([^<]+)</a>' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedthumbnail, scrapedurl, scrapedtitle in matches: - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle) - if 'Streaming' in scrapedtitle: - itemlist.append(episode_item(item, scrapedtitle, scrapedurl, scrapedthumbnail)) - - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) - - return itemlist - - -# ================================================================= - -# ----------------------------------------------------------------- -def lista_anime(item): - log("lista_anime", "lista_anime", item.channel) - - itemlist = [] - - p = 1 - if '{}' in item.url: - item.url, p = item.url.split('{}') - p = int(p) - - # Carica la pagina - data = httptools.downloadpage(item.url).data - - # Estrae i contenuti - patron = r'<li>\s*<strong>\s*<a\s*href="([^"]+?)">([^<]+?)</a>\s*</strong>\s*</li>' - matches = re.compile(patron, re.DOTALL).findall(data) - - scrapedplot = "" - scrapedthumbnail = "" - for i, (scrapedurl, scrapedtitle) in enumerate(matches): - if (p - 1) * PERPAGE > i: continue - if i >= p * PERPAGE: break - - # Pulizia titolo - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle).strip() - cleantitle, eptype = clean_title(scrapedtitle, simpleClean=True) - - itemlist.append( - Item(channel=item.channel, - extra=item.extra, - action="episodios", - text_color="azure", - contentType="tvshow", - title=cleantitle, - url=scrapedurl, - thumbnail=scrapedthumbnail, - fulltitle=cleantitle, - show=cleantitle, - plot=scrapedplot, - folder=True)) - - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) - - if len(matches) >= p * PERPAGE: - scrapedurl = item.url + '{}' + str(p + 1) - itemlist.append( - Item(channel=item.channel, - extra=item.extra, - action="lista_anime", - title="[COLOR lightgreen]" + config.get_localized_string(30992) + "[/COLOR]", - url=scrapedurl, - thumbnail="http://2.bp.blogspot.com/-fE9tzwmjaeQ/UcM2apxDtjI/AAAAAAAAeeg/WKSGM2TADLM/s1600/pager+old.png", - folder=True)) - - return itemlist - - -# ================================================================= - -# ----------------------------------------------------------------- +@support.scrape def episodios(item): - itemlist = [] - - data = httptools.downloadpage(item.url).data - - patron = '<td style="[^"]*?">\s*.*?<strong>(.*?)</strong>.*?\s*</td>\s*<td style="[^"]*?">\s*<a href="([^"]+?)"[^>]+>\s*<img.*?src="([^"]+?)".*?/>\s*</a>\s*</td>' - matches = re.compile(patron, re.DOTALL).findall(data) - - vvvvid_videos = False - for scrapedtitle, scrapedurl, scrapedimg in matches: - if 'nodownload' in scrapedimg or 'nostreaming' in scrapedimg: - continue - if 'vvvvid' in scrapedurl.lower(): - if not vvvvid_videos: vvvvid_videos = True - itemlist.append(Item(title='I Video VVVVID Non sono supportati', text_color="red")) - continue - - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle) - scrapedtitle = re.sub(r'<[^>]*?>', '', scrapedtitle) - scrapedtitle = '[COLOR azure][B]' + scrapedtitle + '[/B][/COLOR]' - itemlist.append( - Item(channel=item.channel, - action="findvideos", - contentType="episode", - title=scrapedtitle, - url=urlparse.urljoin(host, scrapedurl), - fulltitle=scrapedtitle, - show=scrapedtitle, - plot=item.plot, - fanart=item.fanart, - thumbnail=item.thumbnail)) - - # Comandi di servizio - if config.get_videolibrary_support() and len(itemlist) != 0 and not vvvvid_videos: - itemlist.append( - Item(channel=item.channel, - title=config.get_localized_string(30161), - text_color="yellow", - text_bold=True, - url=item.url, - action="add_serie_to_library", - extra="episodios", - show=item.show)) - - return itemlist + anime = True + patron = r'<td style[^>]+>\s*.*?(?:<span[^>]+)?<strong>(?P<title>[^<]+)<\/strong>.*?<td style[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>' + def itemHook(item): + item.url = item.url.replace(host, '') + return item + action = 'findvideos' + return locals() -# ================================================================== - -# ----------------------------------------------------------------- def findvideos(item): - logger.info("kod.animeforce findvideos") + log(item) itemlist = [] + + if item.number: + item.url = support.match(item, r'<a href="([^"]+)"[^>]*>', patronBlock=r'Episodio %s(.*?)</tr>' % item.number)[0][0] + + if 'http' not in item.url: + if '//' in item.url[:2]: + item.url = 'http:' + item.url + elif host not in item.url: + item.url = host + item.url + + if 'adf.ly' in item.url: + item.url = adfly.get_long_url(item.url) + elif 'bit.ly' in item.url: + item.url = httptools.downloadpage(item.url, only_headers=True, follow_redirects=False).headers.get("location") - if item.extra: - data = httptools.downloadpage(item.url, headers=headers).data + matches = support.match(item, r'button"><a href="([^"]+)"')[0] - blocco = scrapertools.find_single_match(data, r'%s(.*?)</tr>' % item.extra) - url = scrapertools.find_single_match(blocco, r'<a href="([^"]+)"[^>]*>') - if 'vvvvid' in url.lower(): - itemlist = [Item(title='I Video VVVVID Non sono supportati', text_color="red")] - return itemlist - if 'http' not in url: url = "".join(['https:', url]) - else: - url = item.url + for video in matches: + itemlist.append( + Item(channel=item.channel, + action="play", + title='diretto', + url=video, + server='directo')) - if 'adf.ly' in url: - url = adfly.get_long_url(url) - elif 'bit.ly' in url: - url = httptools.downloadpage(url, only_headers=True, follow_redirects=False).headers.get("location") + support.server(item, itemlist=itemlist) - if 'animeforce' in url: - headers.append(['Referer', item.url]) - data = httptools.downloadpage(url, headers=headers).data - itemlist.extend(servertools.find_video_items(data=data)) - - for videoitem in itemlist: - videoitem.title = item.title + videoitem.title - videoitem.fulltitle = item.fulltitle - videoitem.show = item.show - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - videoitem.contentType = item.contentType - - url = url.split('&')[0] - data = httptools.downloadpage(url, headers=headers).data - patron = """<source\s*src=(?:"|')([^"']+?)(?:"|')\s*type=(?:"|')video/mp4(?:"|')>""" - matches = re.compile(patron, re.DOTALL).findall(data) - headers.append(['Referer', url]) - for video in matches: - itemlist.append(Item(channel=item.channel, action="play", title=item.title, - url=video + '|' + urllib.urlencode(dict(headers)), folder=False)) - else: - itemlist.extend(servertools.find_video_items(data=url)) - - for videoitem in itemlist: - videoitem.title = item.title + videoitem.title - videoitem.fulltitle = item.fulltitle - videoitem.show = item.show - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - videoitem.contentType = item.contentType - - return itemlist - - -# ================================================================== - -# ================================================================= -# Funzioni di servizio -# ----------------------------------------------------------------- -def scrapedAll(url="", patron=""): - data = httptools.downloadpage(url).data - MyPatron = patron - matches = re.compile(MyPatron, re.DOTALL).findall(data) - scrapertools.printMatches(matches) - - return matches - - -# ================================================================= - -# ----------------------------------------------------------------- -def create_url(url, title, eptype=""): - logger.info() - - if 'download' not in url: - url = url.replace('-streaming', '-download-streaming') - - total_eps = "" - if not eptype: - url = re.sub(r'episodio?-?\d+-?(?:\d+-|)[oav]*', '', url) - else: # Solo se è un episodio passa - total_eps = scrapertools.find_single_match(title.lower(), r'\((\d+)-(?:episodio|sub-ita)\)') # Questo numero verrà rimosso dall'url - if total_eps: url = url.replace('%s-' % total_eps, '') - url = re.sub(r'%s-?\d*-' % eptype.lower(), '', url) - url = url.replace('-fine', '') - - return url, total_eps - -# ================================================================= - -# ----------------------------------------------------------------- -def clean_title(title, simpleClean=False): - logger.info() - - title = title.replace("Streaming", "").replace("&", "") - title = title.replace("Download", "") - title = title.replace("Sub Ita", "") - cleantitle = title.replace("#038;", "").replace("amp;", "").strip() - - if '(Fine)' in title: - cleantitle = cleantitle.replace('(Fine)', '').strip() + " (Fine)" - eptype = "" - if not simpleClean: - if "episodio" in title.lower(): - eptype = scrapertools.find_single_match(title, "((?:Episodio?|OAV))") - cleantitle = re.sub(r'%s\s*\d*\s*(?:\(\d+\)|)' % eptype, '', title).strip() - - if 'episodio' not in eptype.lower(): - cleantitle = re.sub(r'Episodio?\s*\d+\s*(?:\(\d+\)|)\s*[\(OAV\)]*', '', cleantitle).strip() - - if '(Fine)' in title: - cleantitle = cleantitle.replace('(Fine)', '') - - return cleantitle, eptype - -# ================================================================= - -# ----------------------------------------------------------------- -def episode_item(item, scrapedtitle, scrapedurl, scrapedthumbnail): - scrapedtitle, eptype = clean_title(scrapedtitle, simpleClean=True) - cleantitle, eptype = clean_title(scrapedtitle) - - # Creazione URL - scrapedurl, total_eps = create_url(scrapedurl, scrapedtitle, eptype) - - epnumber = "" - if 'episodio' in eptype.lower(): - epnumber = scrapertools.find_single_match(scrapedtitle.lower(), r'episodio?\s*(\d+)') - eptype += ":? %s%s" % (epnumber, (r" \(%s\):?" % total_eps) if total_eps else "") - - extra = "<tr>\s*<td[^>]+><strong>(?:[^>]+>|)%s(?:[^>]+>[^>]+>|[^<]*|[^>]+>)</strong>" % eptype - item = Item(channel=item.channel, - action="findvideos", - contentType="tvshow", - title=scrapedtitle, - text_color="azure", - url=scrapedurl, - fulltitle=cleantitle, - extra=extra, - show=cleantitle, - thumbnail=scrapedthumbnail) - return item - -# ================================================================= - -# ----------------------------------------------------------------- -def scrapedSingle(url="", single="", patron=""): - data = httptools.downloadpage(url).data - paginazione = scrapertools.find_single_match(data, single) - matches = re.compile(patron, re.DOTALL).findall(paginazione) - scrapertools.printMatches(matches) - - return matches - - -# ================================================================= - -# ----------------------------------------------------------------- -def Crea_Url(pagina="1", azione="ricerca", categoria="", nome=""): - # esempio - # chiamate.php?azione=ricerca&cat=&nome=&pag= - Stringa = host + "/chiamate.php?azione=" + azione + "&cat=" + categoria + "&nome=" + nome + "&pag=" + pagina - log("crea_Url", Stringa) - return Stringa - - -# ================================================================= - -# ----------------------------------------------------------------- -def log(funzione="", stringa="", canale=""): - logger.debug("[" + canale + "].[" + funzione + "] " + stringa) - - -# ================================================================= - -# ================================================================= -# riferimenti di servizio -# ----------------------------------------------------------------- -AnimeThumbnail = "http://img15.deviantart.net/f81c/i/2011/173/7/6/cursed_candies_anime_poster_by_careko-d3jnzg9.jpg" -AnimeFanart = "https://i.ytimg.com/vi/IAlbvyBdYdY/maxresdefault.jpg" -CategoriaThumbnail = "http://static.europosters.cz/image/750/poster/street-fighter-anime-i4817.jpg" -CategoriaFanart = "https://i.ytimg.com/vi/IAlbvyBdYdY/maxresdefault.jpg" -CercaThumbnail = "http://dc467.4shared.com/img/fEbJqOum/s7/13feaf0c8c0/Search" -CercaFanart = "https://i.ytimg.com/vi/IAlbvyBdYdY/maxresdefault.jpg" -AvantiTxt = config.get_localized_string(30992) -AvantiImg = "http://2.bp.blogspot.com/-fE9tzwmjaeQ/UcM2apxDtjI/AAAAAAAAeeg/WKSGM2TADLM/s1600/pager+old.png" + return itemlist \ No newline at end of file From 267d51b8ceb2df2ce0c27545b30651276c29d0b1 Mon Sep 17 00:00:00 2001 From: Alhaziel <tomas.massarenti@gmail.comm> Date: Thu, 8 Aug 2019 11:50:28 +0200 Subject: [PATCH 3/5] Icona Animeforce --- channels/animeforce.json | 4 ++-- resources/media/channels/banner/animeforce.png | Bin 0 -> 17034 bytes resources/media/channels/thumb/animeforce.png | Bin 0 -> 8377 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 resources/media/channels/banner/animeforce.png create mode 100644 resources/media/channels/thumb/animeforce.png diff --git a/channels/animeforce.json b/channels/animeforce.json index e8ef9c00..1d31153e 100644 --- a/channels/animeforce.json +++ b/channels/animeforce.json @@ -4,8 +4,8 @@ "language": ["ita"], "active": true, "adult": false, - "thumbnail": "http://www.animeforce.org/wp-content/uploads/2013/05/logo-animeforce.png", - "banner": "http://www.animeforce.org/wp-content/uploads/2013/05/logo-animeforce.png", + "thumbnail": "animeforce.png", + "banner": "animeforce.png", "categories": ["anime"], "settings": [ { diff --git a/resources/media/channels/banner/animeforce.png b/resources/media/channels/banner/animeforce.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6c312f8dacc901e02992d87ecd43445bb72bb8 GIT binary patch literal 17034 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 literal 0 HcmV?d00001 diff --git a/resources/media/channels/thumb/animeforce.png b/resources/media/channels/thumb/animeforce.png new file mode 100644 index 0000000000000000000000000000000000000000..5016d5bc704facf21adaeb9f29668a602768a50a GIT binary patch literal 8377 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 P9|wxEYBCj4F9ZJzIRT~` literal 0 HcmV?d00001 From ae65547498c5187b4622fa71ec2ec5574a929e31 Mon Sep 17 00:00:00 2001 From: Alhaziel <tomas.massarenti@gmail.comm> Date: Thu, 8 Aug 2019 12:04:47 +0200 Subject: [PATCH 4/5] Piccolo fix per Support Menu --- core/support.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/support.py b/core/support.py index 924b1ead..41ae711b 100644 --- a/core/support.py +++ b/core/support.py @@ -624,7 +624,7 @@ 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' if name == 'film' else 'tvshow',) # add search menu for category if 'search' not in args: menuItem(itemlist, filename, 'Cerca ' + title + '… submenu bold', 'search', host + url, args=name) From fb88a5379a3d52398847a0d1ba1e017368996d16 Mon Sep 17 00:00:00 2001 From: Alhaziel <tomas.massarenti@gmail.comm> Date: Thu, 8 Aug 2019 12:09:05 +0200 Subject: [PATCH 5/5] Scrape thumb per episodios --- core/support.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/support.py b/core/support.py index 41ae711b..67996042 100644 --- a/core/support.py +++ b/core/support.py @@ -258,7 +258,7 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t quality=scraped["quality"], url=scraped["url"], infoLabels=infolabels, - thumbnail=scraped["thumb"], + thumbnail=item.thumbnail if function == 'episodios' else scraped["thumb"] , args=item.args, contentSerieName=title if item.contentType != 'movie' else '', contentTitle=title if item.contentType == 'movie' else '',