From f3cf2e518b38429d8c777e093012611e053a2f86 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 19 Sep 2018 15:19:23 -0300 Subject: [PATCH] Correcciones - Dilo: Nuevo canal - Goovie: Correcion por cambio de estructura - PelisIpad: Correccion para thumbs - SeriesBlanco: Correccion por cambio de estructura - platformtools: thumbs genericos para videoteca y pagina siguiente --- plugin.video.alfa/channels/dilo.json | 37 +++ plugin.video.alfa/channels/dilo.py | 297 ++++++++++++++++++ plugin.video.alfa/channels/goovie.py | 167 ++++------ plugin.video.alfa/channels/pelisipad.py | 17 +- plugin.video.alfa/channels/seriesblanco.py | 12 +- .../platformcode/platformtools.py | 33 +- .../media/themes/default/thumb_next.png | Bin 10508 -> 28054 bytes 7 files changed, 427 insertions(+), 136 deletions(-) create mode 100644 plugin.video.alfa/channels/dilo.json create mode 100644 plugin.video.alfa/channels/dilo.py diff --git a/plugin.video.alfa/channels/dilo.json b/plugin.video.alfa/channels/dilo.json new file mode 100644 index 00000000..1d094d6f --- /dev/null +++ b/plugin.video.alfa/channels/dilo.json @@ -0,0 +1,37 @@ +{ + "id": "dilo", + "name": "Dilo", + "active": true, + "adult": false, + "language": [], + "thumbnail": "https://s22.postimg.cc/u6efsniqp/dilo.png", + "banner": "", + "categories": [ + "tvshow", + "vos" + ], + "settings": [ + { + "id": "include_in_global_search", + "type": "bool", + "label": "Incluir en busqueda global", + "default": false, + "enabled": false, + "visible": false + }, + { + "id": "filter_languages", + "type": "list", + "label": "Mostrar enlaces en idioma...", + "default": 0, + "enabled": true, + "visible": true, + "lvalues": [ + "No filtrar", + "CAST", + "LAT", + "VOSE" + ] + } + ] +} diff --git a/plugin.video.alfa/channels/dilo.py b/plugin.video.alfa/channels/dilo.py new file mode 100644 index 00000000..70a52b20 --- /dev/null +++ b/plugin.video.alfa/channels/dilo.py @@ -0,0 +1,297 @@ +# -*- coding: utf-8 -*- +# -*- Channel Dilo -*- +# -*- Created for Alfa-addon -*- +# -*- By the Alfa Develop Group -*- + +import re + +from channels import autoplay +from channels import filtertools +from core import httptools +from core import scrapertools +from core import servertools +from core import jsontools +from core import tmdb +from core.item import Item +from platformcode import config, logger +from channelselector import get_thumb + +host = 'https://www.dilo.nu/' + +IDIOMAS = {'Español': 'CAST', 'Latino': 'LAT', 'Subtitulado': 'VOSE'} +list_language = IDIOMAS.values() +list_quality = [] +list_servers = ['openload', 'streamango', 'powvideo', 'clipwatching', 'streamplay', 'streamcherry', 'gamovideo'] + +def get_source(url): + logger.info() + data = httptools.downloadpage(url).data + data = re.sub(r'\n|\r|\t| |
|\s{2,}', "", data) + return data + +def mainlist(item): + logger.info() + + autoplay.init(item.channel, list_servers, list_quality) + itemlist = [] + + itemlist.append(Item(channel=item.channel, title="Nuevos capitulos", action="latest_episodes", url=host, + thumbnail=get_thumb('new episodes', auto=True))) + + itemlist.append(Item(channel=item.channel, title="Ultimas", action="latest_shows", url=host, + thumbnail=get_thumb('last', auto=True))) + + itemlist.append(Item(channel=item.channel, title="Todas", action="list_all", url=host + 'catalogue', + thumbnail=get_thumb('all', auto=True))) + + itemlist.append(Item(channel=item.channel, title="Generos", action="section", + url=host + 'catalogue', thumbnail=get_thumb('genres', auto=True))) + + itemlist.append(Item(channel=item.channel, title="Por Años", action="section", url=host + 'catalogue', + thumbnail=get_thumb('year', auto=True))) + + itemlist.append(Item(channel=item.channel, title = 'Buscar', action="search", url= host+'search?s=', + thumbnail=get_thumb('search', auto=True))) + + autoplay.show_option(item.channel, itemlist) + + return itemlist + + +def list_all(item): + logger.info() + + itemlist = [] + data = get_source(item.url) + patron = '
') + if next_page != '': + itemlist.append(Item(channel=item.channel, action="list_all", title='Siguiente >>>', + url=page_base+next_page, thumbnail=get_thumb("more.png"), + type=item.type)) + return itemlist + + + +def section(item): + logger.info() + + itemlist = [] + data=get_source(item.url) + + if item.title == 'Generos': + data = scrapertools.find_single_match(data, '>Todos los generos.*?.*?
.*?text-uppercase"') + patron = '
([^<]+)
' + matches = re.compile(patron, re.DOTALL).findall(data) + + for scrapedurl, scrapedthumbnail, scrapedtitle in matches: + title = scrapedtitle + contentSerieName = scrapedtitle + itemlist.append(Item(channel=item.channel, action='seasons', url=scrapedurl, thumbnail=scrapedthumbnail, + title=title, contentSerieName=contentSerieName)) + + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) + + return itemlist + + +def seasons(item): + from core import jsontools + import urllib + logger.info() + + itemlist=[] + + data=get_source(item.url) + serie_id = scrapertools.find_single_match(data, '{"item_id": (\d+)}') + post = {'item_id': serie_id} + post = urllib.urlencode(post) + seasons_url = '%sapi/web/seasons.php' % host + headers = {'Referer':item.url} + data = jsontools.load(httptools.downloadpage(seasons_url, post=post, headers=headers).data) + infoLabels = item.infoLabels + for dict in data: + season = dict['number'] + + if season != '0': + infoLabels['season'] = season + title = 'Temporada %s' % season + itemlist.append(Item(channel=item.channel, url=item.url, title=title, action='episodesxseason', + contentSeasonNumber=season, id=serie_id, infoLabels=infoLabels)) + + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) + + if config.get_videolibrary_support() and len(itemlist) > 0: + itemlist.append( + Item(channel=item.channel, title='[COLOR yellow]Añadir esta serie a la videoteca[/COLOR]', url=item.url, + action="add_serie_to_library", extra="episodios", contentSerieName=item.contentSerieName)) + + return itemlist + + +def episodesxseason(item): + logger.info() + from core import jsontools + import urllib + logger.info() + + itemlist = [] + season = item.infoLabels['season'] + post = {'item_id': item.id, 'season_number': season} + post = urllib.urlencode(post) + + seasons_url = '%sapi/web/episodes.php' % host + headers = {'Referer': item.url} + data = jsontools.load(httptools.downloadpage(seasons_url, post=post, headers=headers).data) + infoLabels = item.infoLabels + for dict in data: + + episode = dict['number'] + epi_name = dict['name'] + title = '%sx%s - %s' % (season, episode, epi_name) + url = '%s%s/' % (host, dict['permalink']) + infoLabels['episode'] = episode + itemlist.append(Item(channel=item.channel, title=title, action='findvideos', url=url, + contentEpisodeNumber=season, id=item.id, infoLabels=infoLabels)) + + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) + + return itemlist + +def episodios(item): + logger.info() + itemlist = [] + templist = seasons(item) + for tempitem in templist: + itemlist += episodesxseason(tempitem) + return itemlist + + +def findvideos(item): + logger.info() + + itemlist = [] + data = get_source(item.url) + patron = 'data-link="([^"]+)">.*?500">([^<]+)<.*?>Reproducir en ([^<]+)' + matches = re.compile(patron, re.DOTALL).findall(data) + for enc_url, server, language in matches: + if not config.get_setting('unify'): + title = ' [%s]' % language + else: + title = '' + + itemlist.append(Item(channel=item.channel, title='%s'+title, url=enc_url, action='play', + language=IDIOMAS[language], server=server, infoLabels=item.infoLabels)) + + itemlist = servertools.get_servers_itemlist(itemlist, lambda x: x.title % x.server.capitalize()) + + # Requerido para FilterTools + + itemlist = filtertools.get_links(itemlist, item, list_language) + + # Requerido para AutoPlay + + autoplay.start(itemlist, item) + + return itemlist + + + +def decode_link(enc_url): + logger.info() + + try: + new_data = get_source(enc_url) + new_enc_url = scrapertools.find_single_match(new_data, 'src="([^"]+)"') + try: + url = httptools.downloadpage(new_enc_url, follow_redirects=False).headers['location'] + except: + if not 'jquery' in new_enc_url: + url = new_enc_url + except: + pass + + return url + + +def play(item): + logger.info() + + item.url = decode_link(item.url) + + itemlist = [item] + + return itemlist + + +def search(item, texto): + logger.info() + import urllib + itemlist = [] + texto = texto.replace(" ", "+") + item.url = item.url + texto + if texto != '': + try: + return list_all(item) + except: + itemlist.append(item.clone(url='', title='No hay elementos...', action='')) + return itemlist diff --git a/plugin.video.alfa/channels/goovie.py b/plugin.video.alfa/channels/goovie.py index 2948cf73..4de00a9c 100644 --- a/plugin.video.alfa/channels/goovie.py +++ b/plugin.video.alfa/channels/goovie.py @@ -17,10 +17,10 @@ from channels import autoplay from platformcode import config, logger -IDIOMAS = {'1':'Cast', '2':'Lat', '3':'VOSE', '4':'VO'} +IDIOMAS = {'EspaL':'Cast', 'LatinoL':'Lat', 'SubL':'VOSE', 'OriL':'VO'} list_language = IDIOMAS.values() -CALIDADES = {'1':'1080','2':'720','3':'480','4':'360'} +CALIDADES = {'1080p':'1080','720p':'720','480p':'480','360p':'360'} list_quality = ['1080', '720', '480', '360'] @@ -89,17 +89,20 @@ def section(item): logger.info() itemlist=[] data = get_source(host+item.type) - if 'Genero' in item.title: - data = scrapertools.find_single_match(data, 'genero.*?') + data = scrapertools.find_single_match(data, 'Generos.*?') elif 'Año' in item.title: - data = scrapertools.find_single_match(data, 'año.*?') - patron = '(.*?)' + data = scrapertools.find_single_match(data, 'Años.*?') + patron = "
  • " matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle in matches: + for scrapedtitle in matches: title = scrapedtitle - itemlist.append(Item(channel=item.channel, url=scrapedurl, title=title, action='list_all', + if r'\d+' in scrapedtitle: + url = '%s%s/filtro/,/%s,' % (host, item.type, title) + else: + url = '%s%s/filtro/%s,/,' % (host, item.type, title) + itemlist.append(Item(channel=item.channel, url=url, title=title, action='list_all', type=item.type)) return itemlist @@ -109,46 +112,33 @@ def list_all(item): itemlist = [] data = get_source(item.url) - #logger.debug(data) - #return - if item.type == 'peliculas': - patron = '
    .*?.*?

    (.*?)

    .*?' - patron += "

    (.*?)

    (\d{4}) /.*?.*?'(\d+)'" - matches = re.compile(patron, re.DOTALL).findall(data) + patron = '
    ' + matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedthumbnail, scrapedurl, scrapedtitle, scrapedplot, year, video_id in matches: + for scrapedurl, scrapedthumbnail, scrapedtitle in matches: - title = '%s [%s]' % (scrapedtitle, year) - contentTitle = scrapedtitle - thumbnail = scrapedthumbnail - url = scrapedurl + title = scrapedtitle + thumbnail = scrapedthumbnail.strip() + url = scrapedurl + filter_thumb = thumbnail.replace("https://image.tmdb.org/t/p/w154", "") + filter_list = {"poster_path": filter_thumb} + filter_list = filter_list.items() + new_item = Item(channel=item.channel, + title=title, + url=url, + thumbnail=thumbnail, + plot=thumbnail, + infoLabels={'filtro':filter_list}) - itemlist.append(item.clone(action='findvideos', - title=title, - url=url, - thumbnail=thumbnail, - contentTitle=contentTitle, - video_id=video_id, - infoLabels={'year':year})) + if item.type == 'peliculas': + new_item.action = 'findvideos' + new_item.contentTitle = scrapedtitle + else: + new_item.action = 'seasons' + new_item.contentSerieName = scrapedtitle - elif item.type == 'series': - patron = '
    .*?.*?.*?' - patron +='

    (.*?)

    (.*?)

    (\d{4}) /' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedplot, year in matches: - title = scrapedtitle - contentSerieName = scrapedtitle - thumbnail = scrapedthumbnail - url = scrapedurl - - itemlist.append(item.clone(action='seasons', - title=title, - url=url, - thumbnail=thumbnail, - plot=scrapedplot, - contentSerieName=contentSerieName, - infoLabels={'year':year})) + itemlist.append(new_item) tmdb.set_infoLabels(itemlist, seekTmdb=True) # Paginación @@ -199,21 +189,18 @@ def episodesxseasons(item): itemlist = [] data=get_source(item.url) - logger.debug(data) - patron= "ViewEpisode\('(\d+)', this\)>
    %s - (\d+)
    " % item.infoLabels['season'] - patron += ".*?src=(.*?) />.*?namep>(.*?)" - + patron= "
  • ]+)>%s - (\d+)

    ([^>]+)

    " % item.infoLabels['season'] matches = re.compile(patron, re.DOTALL).findall(data) infoLabels = item.infoLabels - for video_id, scrapedepisode, scrapedthumbnail, scrapedtitle in matches: + for url, scrapedepisode, scrapedtitle in matches: infoLabels['episode'] = scrapedepisode title = '%sx%s - %s' % (infoLabels['season'], infoLabels['episode'], scrapedtitle) - itemlist.append(Item(channel=item.channel, title= title, url=item.url, thumbnail=scrapedthumbnail, - action='findvideos', video_id=video_id, infoLabels=infoLabels)) + itemlist.append(Item(channel=item.channel, title= title, url=url, action='findvideos', + infoLabels=infoLabels)) tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) @@ -224,87 +211,45 @@ def findvideos(item): logger.info() from lib import jsunpack itemlist = [] - headers = {'referer':item.url} - if item.video_id == '': - find_id = get_source(item.url) - #logger.debug(find_id) - #return - item.video_id = scrapertools.find_single_match(find_id, 'var centerClick = (\d+);') - url = 'https://goovie.co/api/links/%s' % item.video_id - data = httptools.downloadpage(url, headers=headers).data - video_list = jsontools.load(data) - for video_info in video_list: - logger.debug(video_info) - url = video_info['visor'] - plot = 'idioma: %s calidad: %s' % (video_info['idioma'], video_info['calidad']) + data = get_source(item.url) + + patron = "onclick=clickLink\(this, '([^']+)', '([^']+)', '([^']+)'\);>" + matches = re.compile(patron, re.DOTALL).findall(data) + headers = {'referer': item.url} + for url, quality, language in matches: + data = httptools.downloadpage(url, headers=headers, follow_redirects=False).data data = re.sub(r'"|\n|\r|\t| |
    |\s{2,}', "", data) packed = scrapertools.find_single_match(data, '(eval\(.*?);var') unpacked = jsunpack.unpack(packed) - logger.debug('unpacked %s' % unpacked) server = scrapertools.find_single_match(unpacked, "src:.'(http://\D+)/") id = scrapertools.find_single_match(unpacked, "src:.'http://\D+/.*?description:.'(.*?).'") if server == '': if 'powvideo' in unpacked: - id = scrapertools.find_single_match(unpacked ,",description:.'(.*?).'") - server= 'https://powvideo.net' + id = scrapertools.find_single_match(unpacked, ",description:.'(.*?).'") + server = 'https://powvideo.net' url = '%s/%s' % (server, id) if server != '' and id != '': - language = IDIOMAS[video_info['idioma']] - quality = CALIDADES[video_info['calidad']] + language = IDIOMAS[language] + quality = CALIDADES[quality] title = ' [%s] [%s]' % (language, quality) - itemlist.append(Item(channel=item.channel, title='%s'+title, url=url, action='play', language=language, - quality=quality)) - - itmelist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) + itemlist.append(Item(channel=item.channel, title='%s' + title, url=url, action='play', language=language, + quality=quality, infoLabels=item.infoLabels)) + itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) return sorted(itemlist, key=lambda i: i.language) + def search(item, texto): logger.info() texto = texto.replace(" ", "+") item.url = item.url + texto item.type = 'peliculas' if texto != '': - return search_results(item) + return list_all(item) else: return [] -def search_results(item): - logger.info() - - itemlist=[] - - data=get_source(item.url) - logger.debug(data) - patron = '
    .*?href=(.*?)>.*?typeContent>(.*?)<.*?' - patron += '.*?

    (.*?)

    (.*?)

    (\d{4})<' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, content_type ,scrapedthumb, scrapedtitle, scrapedplot, year in matches: - - title = scrapedtitle - url = scrapedurl - thumbnail = scrapedthumb - plot = scrapedplot - if content_type != 'Serie': - action = 'findvideos' - else: - action = 'seasons' - - new_item=Item(channel=item.channel, title=title, url=url, thumbnail=thumbnail, plot=plot, - action=action, type=content_type, infoLabels={'year':year}) - if new_item.action == 'findvideos': - new_item.contentTitle = new_item.title - else: - new_item.contentSerieName = new_item.title - - itemlist.append(new_item) - - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) - - return itemlist - def newest(categoria): logger.info() itemlist = [] @@ -313,9 +258,9 @@ def newest(categoria): if categoria in ['peliculas']: item.url = host + 'peliculas' elif categoria == 'infantiles': - item.url = host + 'peliculas/generos/animación' + item.url = host + 'peliculas/filtro/Animación,/,' elif categoria == 'terror': - item.url = host + 'peliculas/generos/terror' + item.url = host + 'peliculas/filtro/Terror,/,' item.type='peliculas' itemlist = list_all(item) if itemlist[-1].title == 'Siguiente >>': diff --git a/plugin.video.alfa/channels/pelisipad.py b/plugin.video.alfa/channels/pelisipad.py index 63034e92..2abea066 100644 --- a/plugin.video.alfa/channels/pelisipad.py +++ b/plugin.video.alfa/channels/pelisipad.py @@ -77,10 +77,10 @@ def submenu(item): url=host % "list/ultimas-peliculas" + ext, text_color=color2, thumbnail=host % "list/ultimas-peliculas/thumbnail_167x250.jpg", fanart=host % "list/ultimas-peliculas/background_1080.jpg", viewmode="movie_with_plot")) - itemlist.append(Item(channel=item.channel, title="Destacados", action="entradas", - url=host % "list/000-novedades" + ext, text_color=color2, - thumbnail=host % "list/screener/thumbnail_167x250.jpg", - fanart=host % "list/screener/background_1080.jpg", viewmode="movie_with_plot")) + # itemlist.append(Item(channel=item.channel, title="Destacados", action="entradas", + # url=host % "list/000-novedades" + ext, text_color=color2, + # thumbnail=host % "list/screener/thumbnail_167x250.jpg", + # fanart=host % "list/screener/background_1080.jpg", viewmode="movie_with_plot")) itemlist.append(Item(channel=item.channel, title="Más vistas", action="entradas", url=host % "list/peliculas-mas-vistas" + ext, text_color=color2, thumbnail=host % "list/peliculas-mas-vistas/thumbnail_167x250.jpg", @@ -167,7 +167,7 @@ def entradas(item): #if child['year']: # title += " (" + child['year'] + ")" #title += quality - + thumbnail += "|User-Agent=%s" % httptools.get_user_agent video_urls = [] for k, v in child.get("video", {}).items(): for vid in v: @@ -232,6 +232,7 @@ def entradasconlistas(item): thumbnail = host % "list/%s/thumbnail_167x250.jpg" % child["id"] fanart = host % "list/%s/background_1080.jpg" % child["id"] + thumbnail += "|User-Agent=%s" % httptools.get_user_agent itemlist.append(Item(channel=item.channel, action=action, title=title, url=url, thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, show=show, infoLabels=infolabels, contentTitle=fulltitle, viewmode="movie_with_plot", @@ -295,7 +296,7 @@ def entradasconlistas(item): for vid in v: video_urls.append(["http://%s.pelisipad.com/s/transcoder/%s" % (vid["server"], vid["url"]) + "?%s", vid["height"]]) - + thumbnail += "|User-Agent=%s" % httptools.get_user_agent itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, video_urls=video_urls, thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, infoLabels=infolabels, contentTitle=fulltitle, viewmode="movie_with_plot", text_color=color3)) @@ -347,6 +348,7 @@ def series(item): if child.get("numberOfSeasons") and "- Temporada" not in title: title += " (Temps:%s)" % child['numberOfSeasons'] + thumbnail += "|User-Agent=%s" % httptools.get_user_agent itemlist.append(Item(channel=item.channel, action="episodios", title=title, url=url, text_color=color3, thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, infoLabels=infolabels, contentTitle=fulltitle, viewmode="movie_with_plot", show=fulltitle)) @@ -414,6 +416,7 @@ def episodios(item): title = fulltitle = child['name'].rsplit(" ", 1)[0] + " - " + child['name'].rsplit(" ", 1)[1] except: title = fulltitle = child['id'].replace("-", " ") + thumbnail += "|User-Agent=%s" % httptools.get_user_agent itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, contentTitle=fulltitle, viewmode="movie", show=item.show, infoLabels=infoLabels, video_urls=video_urls, extra="episodios", @@ -491,6 +494,7 @@ def nuevos_cap(item): else: title = fulltitle = child['name'] + thumbnail += "|User-Agent=%s" % httptools.get_user_agent itemlist.append(Item(channel=item.channel, action=action, title=title, url=url, thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, contentTitle=fulltitle, viewmode="movie", show=item.fulltitle, infoLabels=infoLabels, video_urls=video_urls, extra="nuevos", @@ -571,6 +575,7 @@ def listas(item): infolabels['title'] = title try: from core import videolibrarytools + thumbnail += "|User-Agent=%s" % httptools.get_user_agent new_item = item.clone(title=title, url=url, fulltitle=title, fanart=fanart, extra="findvideos", thumbnail=thumbnail, infoLabels=infolabels, category="Cine") videolibrarytools.add_movie(new_item) diff --git a/plugin.video.alfa/channels/seriesblanco.py b/plugin.video.alfa/channels/seriesblanco.py index 45a6f607..0eed39d9 100644 --- a/plugin.video.alfa/channels/seriesblanco.py +++ b/plugin.video.alfa/channels/seriesblanco.py @@ -212,21 +212,21 @@ def new_episodes(item): itemlist = [] data = get_source(item.url) - data = scrapertools.find_single_match(data, '
    Series Online : Capítulos estrenados recientemente
    .*?') - patron = '
  • .*?src="([^"]+)".*? data-original-title=" (\d+x\d+).*?' + patron = '
  • .*?src="([^"]+)"' matches = re.compile(patron, re.DOTALL).findall(data) - for lang_data, scrapedurl, scrapedthumbnail, scrapedinfo, in matches: + for lang_data, scrapedinfo, scrapedurl, scrapedthumbnail in matches: - url = host+scrapedurl + url =scrapedurl thumbnail = scrapedthumbnail scrapedinfo = scrapedinfo.split('x') season = scrapedinfo[0] episode = scrapedinfo[1] - scrapedtitle = scrapertools.find_single_match(url, 'capitulo/([^/]+)/').replace("-", " ") - title = '%s - %sx%s' % (scrapedtitle, season, episode ) + scrapedtitle = scrapertools.find_single_match(url, 'capitulo/([^/]+)/') + url = '%scapitulos/%s' % (host, scrapedtitle) + title = '%s - %sx%s' % (scrapedtitle.replace('-', ' '), season, episode ) title, language = add_language(title, lang_data) itemlist.append(Item(channel=item.channel, action='seasons', diff --git a/plugin.video.alfa/platformcode/platformtools.py b/plugin.video.alfa/platformcode/platformtools.py index f1ad9e63..09667a5c 100644 --- a/plugin.video.alfa/platformcode/platformtools.py +++ b/plugin.video.alfa/platformcode/platformtools.py @@ -154,6 +154,13 @@ def render_items(itemlist, parent_item): valid_genre = True elif anime: valid_genre = True + elif 'siguiente' in item.title.lower() and '>' in item.title: + item.thumbnail = get_thumb("next.png") + elif 'add' in item.action: + if 'pelicula' in item.action: + item.thumbnail = get_thumb("videolibrary_movie.png") + elif 'serie' in item.action: + item.thumbnail = get_thumb("videolibrary_tvshow.png") if unify_enabled and parent_item.channel != 'alfavorites': @@ -1071,8 +1078,8 @@ def play_torrent(item, xlistitem, mediaurl): #### Compatibilidad con Kodi 18: evita cuelgues/cancelaciones cuando el .torrent se lanza desde pantalla convencional if xbmc.getCondVisibility('Window.IsMedia'): - xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, xlistitem) #Preparamos el entorno para evutar error Kod1 18 - time.sleep(1) #Dejamos que se ejecute + xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, xlistitem) #Preparamos el entorno para evitar error Kod1 18 + time.sleep(1) #Dejamos tiempo para que se ejecute mediaurl = urllib.quote_plus(item.url) if ("quasar" in torrent_options[seleccion][1] or "elementum" in torrent_options[seleccion][1]) and item.infoLabels['tmdb_id']: #Llamada con más parámetros para completar el título @@ -1083,17 +1090,17 @@ def play_torrent(item, xlistitem, mediaurl): xbmc.executebuiltin("PlayMedia(" + torrent_options[seleccion][1] % mediaurl + ")") - #Seleccionamos que clientes torrent soportamos para el marcado de vídeos vistos - if "quasar" in torrent_options[seleccion][1] or "elementum" in torrent_options[seleccion][1]: - time_limit = time.time() + 150 #Marcamos el timepo máx. de buffering - while not is_playing() and time.time() < time_limit: #Esperamos mientra buffera - time.sleep(5) #Repetimos cada intervalo - #logger.debug(str(time_limit)) - - if item.strm_path and is_playing(): #Sólo si es de Videoteca - from platformcode import xbmc_videolibrary - xbmc_videolibrary.mark_auto_as_watched(item) #Marcamos como visto al terminar - #logger.debug("Llamado el marcado") + #Seleccionamos que clientes torrent soportamos para el marcado de vídeos vistos: asumimos que todos funcionan + #if "quasar" in torrent_options[seleccion][1] or "elementum" in torrent_options[seleccion][1]: + time_limit = time.time() + 150 #Marcamos el timepo máx. de buffering + while not is_playing() and time.time() < time_limit: #Esperamos mientra buffera + time.sleep(5) #Repetimos cada intervalo + #logger.debug(str(time_limit)) + + if item.strm_path and is_playing(): #Sólo si es de Videoteca + from platformcode import xbmc_videolibrary + xbmc_videolibrary.mark_auto_as_watched(item) #Marcamos como visto al terminar + #logger.debug("Llamado el marcado") if seleccion == 1: from platformcode import mct diff --git a/plugin.video.alfa/resources/media/themes/default/thumb_next.png b/plugin.video.alfa/resources/media/themes/default/thumb_next.png index a2035b8e9dfd455aa9e9a1749c602d8d8a539f36..a2f3b346a273d72f958e882b5cc055f2f7033741 100644 GIT binary patch literal 28054 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 R@DDYRyo@rqLdy8d{{b@&J&6DS literal 10508 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