diff --git a/mediaserver/platformcode/config.py b/mediaserver/platformcode/config.py index 7376a814..832bc738 100644 --- a/mediaserver/platformcode/config.py +++ b/mediaserver/platformcode/config.py @@ -233,9 +233,12 @@ def get_localized_string(code): translationsfile = open(TRANSLATION_FILE_PATH, "r") translations = translationsfile.read() translationsfile.close() - cadenas = re.findall('([^<]+)<' % code, translations) + cadenas = re.findall('msgctxt\s*"#%s"\nmsgid\s*"(.*?)"\nmsgstr\s*"(.*?)"' % code, translations) + if len(cadenas) > 0: - dev = cadenas[0] + dev = cadenas[0][1] + if not dev: + dev = cadenas[0][0] else: dev = "%d" % code @@ -366,7 +369,7 @@ configfilepath = os.path.join(get_data_path(), "settings.xml") if not os.path.exists(get_data_path()): os.mkdir(get_data_path()) # Literales -TRANSLATION_FILE_PATH = os.path.join(get_runtime_path(), "resources", "language", "Spanish", "strings.xml") +TRANSLATION_FILE_PATH = os.path.join(get_runtime_path(), "resources", "language", "Spanish", "strings.po") load_settings() # modo adulto: diff --git a/mediaserver/platformcode/controllers/html.py b/mediaserver/platformcode/controllers/html.py index 885a9d0e..0cc5f00b 100644 --- a/mediaserver/platformcode/controllers/html.py +++ b/mediaserver/platformcode/controllers/html.py @@ -677,16 +677,17 @@ class platform(Platformtools): if not "label" in c: continue # Obtenemos el valor - if not c["id"] in dict_values: - if not callback: - c["value"] = config.get_setting(c["id"], **kwargs) + if "id" in c: + if not c["id"] in dict_values: + if not callback: + c["value"] = config.get_setting(c["id"], **kwargs) + else: + c["value"] = c["default"] + + dict_values[c["id"]] = c["value"] + else: - c["value"] = c["default"] - - dict_values[c["id"]] = c["value"] - - else: - c["value"] = dict_values[c["id"]] + c["value"] = dict_values[c["id"]] # Translation if c['label'].startswith('@') and unicode(c['label'][1:]).isnumeric(): diff --git a/mediaserver/platformcode/template/js/protocol.js b/mediaserver/platformcode/template/js/protocol.js index 089a0c3d..4b4fa6d9 100644 --- a/mediaserver/platformcode/template/js/protocol.js +++ b/mediaserver/platformcode/template/js/protocol.js @@ -285,6 +285,7 @@ function get_response(data) { else { keypress = ""; }; + if (!data.items[x].value) data.items[x].value = ""; itemlist[data.items[x].category].push(replace_list(html.config.text, { "item_color": data.items[x].color, "item_label": data.items[x].label, diff --git a/mediaserver/resources/settings.xml b/mediaserver/resources/settings.xml index 5607fedd..0eb273ce 100644 --- a/mediaserver/resources/settings.xml +++ b/mediaserver/resources/settings.xml @@ -7,7 +7,7 @@ - + diff --git a/plugin.video.alfa/addon.xml b/plugin.video.alfa/addon.xml index fb22a744..3fc4a4f1 100755 --- a/plugin.video.alfa/addon.xml +++ b/plugin.video.alfa/addon.xml @@ -1,5 +1,5 @@  - + @@ -18,14 +18,12 @@ resources/media/general/ss/4.jpg [B]Estos son los cambios para esta versión:[/B] - [COLOR green][B]Arreglos[/B][/COLOR] - [I]- serieslan - - streamplay - - descargasmix - - canalpelis - Canal nuevo - - fixes internos[/I] - - [COLOR green]Gracias a [COLOR yellow][B]msdos[/B][/COLOR] por su colaboración en esta versión[/COLOR] + [COLOR green][B]Canales agregados y arreglos[/B][/COLOR] + » canalpelis » hdfull + » xdvideos » playmax + » cinetux » gnula + » flashx » rapidvideo + ¤ arreglos internos Navega con Kodi por páginas web para ver sus videos de manera fácil. Browse web pages using Kodi diff --git a/plugin.video.alfa/channels/allcalidad.json b/plugin.video.alfa/channels/allcalidad.json index 42124f56..324278a5 100755 --- a/plugin.video.alfa/channels/allcalidad.json +++ b/plugin.video.alfa/channels/allcalidad.json @@ -3,7 +3,7 @@ "name": "Allcalidad", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s22.postimg.org/irnlwuizh/allcalidad1.png", "banner": "https://s22.postimg.org/9y1athlep/allcalidad2.png", "version": 1, @@ -15,8 +15,7 @@ ], "categories": [ "movie", - "direct", - "latino" + "direct" ], "settings": [ { diff --git a/plugin.video.alfa/channels/allcalidad.py b/plugin.video.alfa/channels/allcalidad.py index ef3bfdef..c4ca9513 100755 --- a/plugin.video.alfa/channels/allcalidad.py +++ b/plugin.video.alfa/channels/allcalidad.py @@ -111,6 +111,8 @@ def findvideos(item): match = scrapertools.find_multiple_matches(bloque, '(?is)(?:iframe|script) .*?src="([^"]+)') for url in match: titulo = "Ver en: %s" + if "goo.gl" in url: + url = httptools.downloadpage(url, follow_redirects=False, only_headers=True).headers.get("location", "") if "youtube" in url: titulo = "[COLOR = yellow]Ver trailer: %s[/COLOR]" if "ad.js" in url or "script" in url: @@ -123,7 +125,6 @@ def findvideos(item): title = titulo, fulltitle = item.fulltitle, thumbnail = item.thumbnail, - server = "", url = url )) itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) @@ -139,3 +140,8 @@ def findvideos(item): infoLabels={'title': item.fulltitle}, fulltitle=item.fulltitle, extra="library")) return itemlist + + +def play(item): + item.thumbnail = item.contentThumbnail + return [item] diff --git a/plugin.video.alfa/channels/allpeliculas.json b/plugin.video.alfa/channels/allpeliculas.json index f0078ef2..b9d5ca74 100755 --- a/plugin.video.alfa/channels/allpeliculas.json +++ b/plugin.video.alfa/channels/allpeliculas.json @@ -1,7 +1,7 @@ { "id": "allpeliculas", "name": "Allpeliculas", - "language": "es", + "language": ["lat"], "active": true, "adult": false, "version": 1, @@ -31,7 +31,6 @@ "banner": "allpeliculas.png", "categories": [ "movie", - "latino", "vos", "tvshow" ], diff --git a/plugin.video.alfa/channels/allpeliculas.py b/plugin.video.alfa/channels/allpeliculas.py index 28eeacc4..089ad59f 100644 --- a/plugin.video.alfa/channels/allpeliculas.py +++ b/plugin.video.alfa/channels/allpeliculas.py @@ -271,7 +271,7 @@ def findvideos(item): idioma = IDIOMAS.get(idiomas_videos.get(language)) titulo = "%s [" + idioma + "] [" + calidad_videos.get(calidad) + "]" - itemlist.append(item.clone(action="play", title=titulo, url=url, extra=idioma)) + itemlist.append(item.clone(action="play", title=titulo, url=url, language = idioma, extra=idioma)) # Enlace Descarga patron = ' 0: + itemlist.append(Item(channel=item.channel, title="Añadir esta serie a la videoteca", + action="add_serie_to_library", extra="episodios")) + return itemlist @@ -273,42 +280,52 @@ def findvideos(item): itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}|-\s", "", data) + data = re.sub(r"\n|\r|\t|\s{2}|-\s", "", httptools.downloadpage(item.url).data) + list_videos = scrapertools.find_multiple_matches(data, 'video\[\d\]\s=\s\')(.+?)(?:)' REGEX_THUMB = r'src="(http://media.animeflv\.me/uploads/thumbs/[^"]+?)"' REGEX_PLOT = r'Línea de historia:

(.*?)' REGEX_URL = r'href="(http://animeflv\.me/Anime/[^"]+)">' -REGEX_SERIE = r'{0}.+?{1}([^<]+?)

(.+?)

'.format(REGEX_THUMB, REGEX_URL) +REGEX_SERIE = r'%s.+?%s([^<]+?)

(.+?)

' % (REGEX_THUMB, REGEX_URL) REGEX_EPISODE = r'href="(http://animeflv\.me/Ver/[^"]+?)">(?:)?(.+?)(\d+/\d+/\d+)' REGEX_GENERO = r'([^<]+)' @@ -157,20 +158,13 @@ def letras(item): base_url = 'http://animeflv.me/ListadeAnime?c=' - itemlist = [] - itemlist.append(Item(channel=item.channel, action="series", title="#", - url=base_url + "#", viewmode="movies_with_plot")) + itemlist = list() + itemlist.append(Item(channel=item.channel, action="series", title="#", url=base_url + "#")) - # Itera sobre las posiciones de las letras en la tabla ascii - # 65 = A, 90 = Z - for i in xrange(65, 91): - letter = chr(i) + for letter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": + logger.debug("title=[%s], url=[%s], thumbnail=[]" % (letter, base_url + letter)) - logger.debug("title=[{0}], url=[{1}], thumbnail=[]".format( - letter, base_url + letter)) - - itemlist.append(Item(channel=item.channel, action="series", title=letter, - url=base_url + letter, viewmode="movies_with_plot")) + itemlist.append(Item(channel=item.channel, action="series", title=letter, url=base_url + letter)) return itemlist @@ -182,14 +176,12 @@ def generos(item): html = get_url_contents(item.url) - generos = re.findall(REGEX_GENERO, html) + list_genre = re.findall(REGEX_GENERO, html) - for url, genero in generos: - logger.debug( - "title=[{0}], url=[{1}], thumbnail=[]".format(genero, url)) + for url, genero in list_genre: + logger.debug("title=[%s], url=[%s], thumbnail=[]" % (genero, url)) - itemlist.append(Item(channel=item.channel, action="series", title=genero, url=url, - plot='', viewmode="movies_with_plot")) + itemlist.append(Item(channel=item.channel, action="series", title=genero, url=url)) return itemlist @@ -198,28 +190,26 @@ def search(item, texto): logger.info() texto = texto.replace(" ", "%20") - item.url = "{0}{1}".format(item.url, texto) + item.url = "%s%s" % (item.url, texto) html = get_url_contents(item.url) try: # Se encontro un solo resultado y se redicciono a la página de la serie if html.find('Ver') >= 0: - series = [__extract_info_from_serie(html)] + show_list = [__extract_info_from_serie(html)] # Se obtuvo una lista de resultados else: - series = __find_series(html) + show_list = __find_series(html) items = [] - for serie in series: - title, url, thumbnail, plot = serie + for show in show_list: + title, url, thumbnail, plot = show - logger.debug("title=[{0}], url=[{1}], thumbnail=[{2}]".format( - title, url, thumbnail)) + logger.debug("title=[%s], url=[%s], thumbnail=[%s]" % (title, url, thumbnail)) - items.append(Item(channel=item.channel, action="episodios", title=title, - url=url, thumbnail=thumbnail, plot=plot, - show=title, viewmode="movies_with_plot", context=renumbertools.context(item))) + items.append(Item(channel=item.channel, action="episodios", title=title, url=url, thumbnail=thumbnail, + plot=plot, show=title, viewmode="movies_with_plot", context=renumbertools.context(item))) except: import sys for line in sys.exc_info(): @@ -234,25 +224,21 @@ def series(item): page_html = get_url_contents(item.url) - series = __find_series(page_html) + show_list = __find_series(page_html) items = [] - for serie in series: - title, url, thumbnail, plot = serie + for show in show_list: + title, url, thumbnail, plot = show - logger.debug("title=[{0}], url=[{1}], thumbnail=[{2}]".format( - title, url, thumbnail)) + logger.debug("title=[%s], url=[%s], thumbnail=[%s]" % (title, url, thumbnail)) - items.append(Item(channel=item.channel, action="episodios", title=title, url=url, - thumbnail=thumbnail, plot=plot, show=title, viewmode="movies_with_plot", - context=renumbertools.context(item))) + items.append(Item(channel=item.channel, action="episodios", title=title, url=url, thumbnail=thumbnail, + plot=plot, show=title, viewmode="movies_with_plot", context=renumbertools.context(item))) url_next_page = __find_next_page(page_html) if url_next_page: - items.append(Item(channel=item.channel, action="series", title=">> Página Siguiente", - url=url_next_page, thumbnail="", plot="", folder=True, - viewmode="movies_with_plot")) + items.append(Item(channel=item.channel, action="series", title=">> Página Siguiente", url=url_next_page)) return items @@ -265,7 +251,10 @@ def episodios(item): html_serie = get_url_contents(item.url) info_serie = __extract_info_from_serie(html_serie) - plot = info_serie[3] if info_serie else '' + if info_serie[3]: + plot = info_serie[3] + else: + plot = '' episodes = re.findall(REGEX_EPISODE, html_serie, re.DOTALL) @@ -280,21 +269,17 @@ def episodios(item): season, episode = renumbertools.numbered_for_tratk( item.channel, item.show, season, episode) - title = "{0}x{1:02d} {2} ({3})".format( - season, episode, "Episodio " + str(episode), date) + title = "%sx%s %s (%s)" % (season, str(episode).zfill(2), "Episodio %s" % episode, date) # El enlace pertenece a una pelicula else: - title = "{0} ({1})".format(title, date) + title = "%s (%s)" % (title, date) item.url = url es_pelicula = True - logger.debug("title=[{0}], url=[{1}], thumbnail=[{2}]".format( - title, url, item.thumbnail)) + logger.debug("title=[%s], url=[%s], thumbnail=[%s]" % (title, url, item.thumbnail)) - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, - thumbnail=item.thumbnail, plot=plot, show=item.show, - fulltitle="{0} {1}".format(item.show, title), - viewmode="movies_with_plot", folder=True)) + itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=item.thumbnail, + plot=plot, show=item.show, fulltitle="%s %s" % (item.show, title))) # El sistema soporta la videoteca y se encontro por lo menos un episodio # o pelicula @@ -315,7 +300,6 @@ def episodios(item): itemlist.append(Item(channel=item.channel, title="Descargar todos los episodios", url=item.url, action="download_all_episodes", extra="episodios", show=item.show)) - return itemlist @@ -325,22 +309,27 @@ def findvideos(item): itemlist = [] page_html = get_url_contents(item.url) - regex_api = r'http://player\.animeflv\.me/[^\"]+' iframe_url = scrapertools.find_single_match(page_html, regex_api) iframe_html = get_url_contents(iframe_url) + itemlist.extend(servertools.find_video_items(data=iframe_html)) + + qualities = ["360", "480", "720", "1080"] + for videoitem in itemlist: + videoitem.fulltitle = item.fulltitle + videoitem.title = "%s en calidad [%s]" % (videoitem.server, qualities[1]) + videoitem.channel = item.channel + videoitem.thumbnail = item.thumbnail regex_video_list = r'var part = \[([^\]]+)' videos_html = scrapertools.find_single_match(iframe_html, regex_video_list) videos = re.findall('"([^"]+)"', videos_html, re.DOTALL) - qualities = ["360", "480", "720", "1080"] - for quality_id, video_url in enumerate(videos): itemlist.append(Item(channel=item.channel, action="play", url=video_url, show=re.escape(item.show), - title="Ver en calidad [{0}]".format(qualities[quality_id]), plot=item.plot, - folder=True, fulltitle=item.title, viewmode="movies_with_plot")) + title="Ver en calidad [%s]" % (qualities[quality_id]), plot=item.plot, + fulltitle=item.title)) return __sort_by_quality(itemlist) diff --git a/plugin.video.alfa/channels/animeflv_ru.json b/plugin.video.alfa/channels/animeflv_ru.json index 1bdaea73..a7831726 100755 --- a/plugin.video.alfa/channels/animeflv_ru.json +++ b/plugin.video.alfa/channels/animeflv_ru.json @@ -3,13 +3,12 @@ "name": "AnimeFLV.RU", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "http://i.imgur.com/5nRR9qq.png", "banner": "animeflv_ru.png", "version": 1, "compatible": { - "python": "2.7.9", - "addon_version": "4.2.1" + "python": "2.7.9" }, "changes": { "change": [ diff --git a/plugin.video.alfa/channels/animeid.json b/plugin.video.alfa/channels/animeid.json index bdad185b..220d8ec8 100755 --- a/plugin.video.alfa/channels/animeid.json +++ b/plugin.video.alfa/channels/animeid.json @@ -3,7 +3,7 @@ "name": "Animeid", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "animeid.png", "banner": "animeid.png", "version": 1, diff --git a/plugin.video.alfa/channels/animeshd.json b/plugin.video.alfa/channels/animeshd.json index fdf04e49..4de05b19 100755 --- a/plugin.video.alfa/channels/animeshd.json +++ b/plugin.video.alfa/channels/animeshd.json @@ -3,7 +3,7 @@ "name": "AnimesHD", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "https://s21.postimg.org/b43i3ljav/animeshd.png", "banner": "https://s4.postimg.org/lulxulmql/animeshd-banner.png", "version": 1, @@ -22,7 +22,6 @@ } ], "categories": [ - "latino", "anime" ] } diff --git a/plugin.video.alfa/channels/animeshd.py b/plugin.video.alfa/channels/animeshd.py old mode 100755 new mode 100644 index 3fd34f84..f592b1bb --- a/plugin.video.alfa/channels/animeshd.py +++ b/plugin.video.alfa/channels/animeshd.py @@ -162,7 +162,7 @@ def episodios(item): for scrapedurl, scrapedlang, scrapedtitle in matches: language = scrapedlang - title = scrapedtitle + ' (%s)' % language + title = scrapedtitle url = scrapedurl itemlist.append(item.clone(title=title, url=url, action='findvideos', language=language)) return itemlist @@ -176,7 +176,7 @@ def findvideos(item): itemlist.extend(servertools.find_video_items(data=data)) for videoitem in itemlist: - title = item.title+' (%s)'%videoitem.server + title = item.title videoitem.channel = item.channel videoitem.title = title videoitem.action = 'play' diff --git a/plugin.video.alfa/channels/anitoonstv.json b/plugin.video.alfa/channels/anitoonstv.json index eded6911..cb7cb7e0 100755 --- a/plugin.video.alfa/channels/anitoonstv.json +++ b/plugin.video.alfa/channels/anitoonstv.json @@ -3,7 +3,7 @@ "name": "AniToons TV", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "http://i.imgur.com/9Zu5NBc.png", "banner": "http://i.imgur.com/JQSXCaB.png", "version": 1, @@ -19,6 +19,6 @@ ], "categories": [ "tvshow", - "latino" + "anime" ] } diff --git a/plugin.video.alfa/channels/anitoonstv.py b/plugin.video.alfa/channels/anitoonstv.py index 13ea2d75..3557a7f8 100644 --- a/plugin.video.alfa/channels/anitoonstv.py +++ b/plugin.video.alfa/channels/anitoonstv.py @@ -10,6 +10,17 @@ from core import servertools from core import tmdb from core.item import Item from platformcode import config, logger +from channels import autoplay + +IDIOMAS = {'latino': 'Latino'} +list_language = IDIOMAS.values() +list_servers = ['openload', + 'okru', + 'netutv', + 'rapidvideo' + ] +list_quality = ['default'] + host = "http://www.anitoonstv.com" @@ -17,6 +28,7 @@ host = "http://www.anitoonstv.com" def mainlist(item): logger.info() thumb_series = get_thumb("channels_tvshow.png") + autoplay.init(item.channel, list_servers, list_quality) itemlist = list() @@ -29,6 +41,7 @@ def mainlist(item): itemlist.append(Item(channel=item.channel, action="lista", title="Pokemon", url=host, thumbnail=thumb_series)) itemlist = renumbertools.show_option(item.channel, itemlist) + autoplay.show_option(item.channel, itemlist) return itemlist @@ -73,10 +86,10 @@ def lista(item): if "&" in show: cad = title.split("xy") show = cad[0] - + context1=[renumbertools.context(item), autoplay.context] itemlist.append( item.clone(title=title, url=url, plot=show, action="episodios", show=show, - context=renumbertools.context(item))) + context=context1)) tmdb.set_infoLabels(itemlist) return itemlist @@ -106,19 +119,15 @@ def episodios(item): season, episode = renumbertools.numbered_for_tratk( item.channel, item.show, season, episode) date = name - title = "{0}x{1:02d} {2} ({3})".format( - season, episode, "Episodio " + str(episode), date) + title = "%sx%s %s (%s)" % (season, str(episode).zfill(2), "Episodio %s" % episode, date) # title = str(temp)+"x"+cap+" "+name url = host + "/" + link - if "NO DISPONIBLE" in name: - name = name - else: + if "NO DISPONIBLE" not in name: itemlist.append(Item(channel=item.channel, action="findvideos", title=title, thumbnail=scrapedthumbnail, plot=scrapedplot, url=url, show=show)) if config.get_videolibrary_support() and len(itemlist) > 0: itemlist.append(Item(channel=item.channel, title="Añadir esta serie a la videoteca", url=item.url, - action="add_serie_to_library", extra="episodios", show=show)) return itemlist @@ -132,6 +141,7 @@ def findvideos(item): data = httptools.downloadpage(item.url).data data1 = re.sub(r"\n|\r|\t|\s{2}| ", "", data) data_vid = scrapertools.find_single_match(data1, '<div class="videos">(.+?)<\/div><div .+?>') + # name = scrapertools.find_single_match(data,'<span>Titulo.+?<\/span>([^<]+)<br>') scrapedplot = scrapertools.find_single_match(data, '<br><span>Descrip.+?<\/span>([^<]+)<br>') scrapedthumbnail = scrapertools.find_single_match(data, '<div class="caracteristicas"><img src="([^<]+)">') @@ -139,13 +149,16 @@ def findvideos(item): for server, quality, url in itemla: if "Calidad Alta" in quality: quality = quality.replace("Calidad Alta", "HQ") - server = server.lower() - server = server.strip() - if "ok" in server: + server = server.lower().strip() + if "ok" == server: server = 'okru' - itemlist.append( - item.clone(url=url, action="play", server=server, contentQuality=quality, thumbnail=scrapedthumbnail, - plot=scrapedplot, title="Enlace encontrado en %s: [%s ]" % (server.capitalize(), quality))) + if "netu" == server: + continue + itemlist.append(item.clone(url=url, action="play", server=server, contentQuality=quality, + thumbnail=scrapedthumbnail, plot=scrapedplot, + title="Enlace encontrado en %s: [%s]" % (server.capitalize(), quality))) + + autoplay.start(itemlist, item) return itemlist @@ -155,18 +168,15 @@ def play(item): itemlist = [] # Buscamos video por servidor ... - devuelve = servertools.findvideosbyserver(item.url, item.server) if not devuelve: # ...sino lo encontramos buscamos en todos los servidores disponibles - devuelve = servertools.findvideos(item.url, skip=True) if devuelve: # logger.debug(devuelve) itemlist.append(Item(channel=item.channel, title=item.contentTitle, action="play", server=devuelve[0][2], - - url=devuelve[0][1], thumbnail=item.thumbnail, folder=False)) + url=devuelve[0][1], thumbnail=item.thumbnail)) return itemlist diff --git a/plugin.video.alfa/channels/areadocumental.json b/plugin.video.alfa/channels/areadocumental.json index c9ca5448..84941551 100755 --- a/plugin.video.alfa/channels/areadocumental.json +++ b/plugin.video.alfa/channels/areadocumental.json @@ -1,7 +1,7 @@ { "id": "areadocumental", "name": "Area-Documental", - "language": "es", + "language": ["cast", "lat"], "adult": false, "active": true, "version": 1, diff --git a/plugin.video.alfa/channels/areadocumental.py b/plugin.video.alfa/channels/areadocumental.py old mode 100755 new mode 100644 index 78151414..6a04ef75 --- a/plugin.video.alfa/channels/areadocumental.py +++ b/plugin.video.alfa/channels/areadocumental.py @@ -135,18 +135,19 @@ def entradas(item): scrapedthumbnail = host + urllib.quote(scrapedthumbnail) title = scrapedtitle if "full_hd" in extra: - scrapedtitle += " [COLOR gold][3D][/COLOR]" + quality = "3D" elif "720" in extra: - scrapedtitle += " [COLOR gold][720p][/COLOR]" + quality ='720' else: - scrapedtitle += " [COLOR gold][SD][/COLOR]" + quality = 'SD' year = year.replace("\xc2\xa0", "").replace(" ", "") if not year.isspace() and year != "": infolab['year'] = int(year) - scrapedtitle += " (" + year + ")" - itemlist.append(item.clone(action="findvideos", title=scrapedtitle, fulltitle=title, - url=scrapedurl, thumbnail=scrapedthumbnail, infoLabels=infolab)) + + itemlist.append(item.clone(action="findvideos", title=title, fulltitle=title, + url=scrapedurl, thumbnail=scrapedthumbnail, infoLabels=infolab, contentTitle = + title, quality = quality)) next_page = scrapertools.find_single_match(data2, '<a href="([^"]+)"> ></a>') if next_page: @@ -171,7 +172,7 @@ def findvideos(item): url_sub = host + urllib.quote(url_sub) title = "Ver video en [[COLOR %s]%s[/COLOR]] Sub %s" % (color3, quality, label) itemlist.append(item.clone(action="play", server="directo", title=title, - url=url, subtitle=url_sub, extra=item.url, calidad=quality)) + url=url, subtitle=url_sub, extra=item.url, quality=quality, language = label)) return itemlist diff --git a/plugin.video.alfa/channels/autoplay.py b/plugin.video.alfa/channels/autoplay.py index c99e0d77..170ecb93 100644 --- a/plugin.video.alfa/channels/autoplay.py +++ b/plugin.video.alfa/channels/autoplay.py @@ -43,6 +43,10 @@ def show_option(channel, itemlist, text_color='yellow', thumbnail=None, fanart=N :return: ''' logger.info() + + if not config.is_xbmc(): + return itemlist + if thumbnail == None: thumbnail = 'https://s7.postimg.org/65ooga04b/Auto_Play.png' if fanart == None: @@ -74,228 +78,231 @@ def start(itemlist, item): :return: intenta autoreproducir, en caso de fallar devuelve el itemlist que recibio en un principio ''' logger.info() - global autoplay_node if not config.is_xbmc(): - platformtools.dialog_notification('AutoPlay ERROR', 'Sólo disponible para XBMC/Kodi') + #platformtools.dialog_notification('AutoPlay ERROR', 'Sólo disponible para XBMC/Kodi') return itemlist - else: - if not autoplay_node: - # Obtiene el nodo AUTOPLAY desde el json - autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') - # Agrega servidores y calidades que no estaban listados a autoplay_node - new_options = check_value(item.channel, itemlist) + global autoplay_node + if not autoplay_node: + # Obtiene el nodo AUTOPLAY desde el json + autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') - # Obtiene el nodo del canal desde autoplay_node - channel_node = autoplay_node.get(item.channel, {}) - # Obtiene los ajustes des autoplay para este canal - settings_node = channel_node.get('settings', {}) + if not item.channel in autoplay_node: + return itemlist - if settings_node['active']: - url_list_valid = [] - autoplay_list = [] - favorite_servers = [] - favorite_quality = [] + # Agrega servidores y calidades que no estaban listados a autoplay_node + new_options = check_value(item.channel, itemlist) - # Guarda el valor actual de "Accion y Player Mode" en preferencias - user_config_setting_action = config.get_setting("default_action") - user_config_setting_player = config.get_setting("player_mode") - # Habilita la accion "Ver en calidad alta" (si el servidor devuelve más de una calidad p.e. gdrive) - if user_config_setting_action != 2: - config.set_setting("default_action", 2) - if user_config_setting_player != 0: - config.set_setting("player_mode", 0) + # Obtiene el nodo del canal desde autoplay_node + channel_node = autoplay_node.get(item.channel, {}) + # Obtiene los ajustes des autoplay para este canal + settings_node = channel_node.get('settings', {}) - # Informa que AutoPlay esta activo - platformtools.dialog_notification('AutoPlay Activo', '', sound=False) + if settings_node['active']: + url_list_valid = [] + autoplay_list = [] + favorite_servers = [] + favorite_quality = [] - # Prioridades a la hora de ordenar itemlist: - # 0: Servidores y calidades - # 1: Calidades y servidores - # 2: Solo servidores - # 3: Solo calidades - # 4: No ordenar - if settings_node['custom_servers'] and settings_node['custom_quality']: - priority = settings_node['priority'] # 0: Servidores y calidades o 1: Calidades y servidores - elif settings_node['custom_servers']: - priority = 2 # Solo servidores - elif settings_node['custom_quality']: - priority = 3 # Solo calidades - else: - priority = 4 # No ordenar + # Guarda el valor actual de "Accion y Player Mode" en preferencias + user_config_setting_action = config.get_setting("default_action") + user_config_setting_player = config.get_setting("player_mode") + # Habilita la accion "Ver en calidad alta" (si el servidor devuelve más de una calidad p.e. gdrive) + if user_config_setting_action != 2: + config.set_setting("default_action", 2) + if user_config_setting_player != 0: + config.set_setting("player_mode", 0) - # Obtiene las listas servidores, calidades disponibles desde el nodo del json de AutoPlay - server_list = channel_node.get('servers', []) - quality_list = channel_node.get('quality', []) + # Informa que AutoPlay esta activo + platformtools.dialog_notification('AutoPlay Activo', '', sound=False) - # Se guardan los textos de cada servidor y calidad en listas p.e. favorite_servers = ['openload', - # 'streamcloud'] - for num in range(1, 4): - favorite_servers.append(channel_node['servers'][settings_node['server_%s' % num]]) - favorite_quality.append(channel_node['quality'][settings_node['quality_%s' % num]]) + # Prioridades a la hora de ordenar itemlist: + # 0: Servidores y calidades + # 1: Calidades y servidores + # 2: Solo servidores + # 3: Solo calidades + # 4: No ordenar + if settings_node['custom_servers'] and settings_node['custom_quality']: + priority = settings_node['priority'] # 0: Servidores y calidades o 1: Calidades y servidores + elif settings_node['custom_servers']: + priority = 2 # Solo servidores + elif settings_node['custom_quality']: + priority = 3 # Solo calidades + else: + priority = 4 # No ordenar - # Se filtran los enlaces de itemlist y que se correspondan con los valores de autoplay - for item in itemlist: - autoplay_elem = dict() + # Obtiene las listas servidores, calidades disponibles desde el nodo del json de AutoPlay + server_list = channel_node.get('servers', []) + quality_list = channel_node.get('quality', []) - # Comprobamos q se trata de un item de video - if 'server' not in item: + # Se guardan los textos de cada servidor y calidad en listas p.e. favorite_servers = ['openload', + # 'streamcloud'] + for num in range(1, 4): + favorite_servers.append(channel_node['servers'][settings_node['server_%s' % num]]) + favorite_quality.append(channel_node['quality'][settings_node['quality_%s' % num]]) + + # Se filtran los enlaces de itemlist y que se correspondan con los valores de autoplay + for item in itemlist: + autoplay_elem = dict() + + # Comprobamos q se trata de un item de video + if 'server' not in item: + continue + + # Agrega la opcion configurar AutoPlay al menu contextual + if 'context' not in item: + item.context = list() + if not filter(lambda x: x['action'] == 'autoplay_config', context): + item.context.append({"title": "Configurar AutoPlay", + "action": "autoplay_config", + "channel": "autoplay", + "from_channel": item.channel}) + + # Si no tiene calidad definida le asigna calidad 'default' + if item.quality == '': + item.quality = 'default' + + # Se crea la lista para configuracion personalizada + if priority < 2: # 0: Servidores y calidades o 1: Calidades y servidores + + # si el servidor y la calidad no se encuentran en las listas de favoritos o la url esta repetida, + # descartamos el item + if item.server not in favorite_servers or item.quality not in favorite_quality \ + or item.url in url_list_valid: continue - - # Agrega la opcion configurar AutoPlay al menu contextual - if 'context' not in item: - item.context = list() - if not filter(lambda x: x['action'] == 'autoplay_config', context): - item.context.append({"title": "Configurar AutoPlay", - "action": "autoplay_config", - "channel": "autoplay", - "from_channel": item.channel}) - - # Si no tiene calidad definida le asigna calidad 'default' - if item.quality == '': - item.quality = 'default' - - # Se crea la lista para configuracion personalizada - if priority < 2: # 0: Servidores y calidades o 1: Calidades y servidores - - # si el servidor y la calidad no se encuentran en las listas de favoritos o la url esta repetida, - # descartamos el item - if item.server not in favorite_servers or item.quality not in favorite_quality \ - or item.url in url_list_valid: - continue - autoplay_elem["indice_server"] = favorite_servers.index(item.server) - autoplay_elem["indice_quality"] = favorite_quality.index(item.quality) - - elif priority == 2: # Solo servidores - - # si el servidor no se encuentra en la lista de favoritos o la url esta repetida, - # descartamos el item - if item.server not in favorite_servers or item.url in url_list_valid: - continue - autoplay_elem["indice_server"] = favorite_servers.index(item.server) - - elif priority == 3: # Solo calidades - - # si la calidad no se encuentra en la lista de favoritos o la url esta repetida, - # descartamos el item - if item.quality not in favorite_quality or item.url in url_list_valid: - continue - autoplay_elem["indice_quality"] = favorite_quality.index(item.quality) - - else: # No ordenar - - # si la url esta repetida, descartamos el item - if item.url in url_list_valid: - continue - - # Si el item llega hasta aqui lo añadimos al listado de urls validas y a autoplay_list - url_list_valid.append(item.url) - autoplay_elem['videoitem'] = item - # autoplay_elem['server'] = item.server - # autoplay_elem['quality'] = item.quality - autoplay_list.append(autoplay_elem) - - # Ordenamos segun la prioridad - if priority == 0: # Servidores y calidades - autoplay_list.sort(key=lambda orden: (orden['indice_server'], orden['indice_quality'])) - - elif priority == 1: # Calidades y servidores - autoplay_list.sort(key=lambda orden: (orden['indice_quality'], orden['indice_server'])) + autoplay_elem["indice_server"] = favorite_servers.index(item.server) + autoplay_elem["indice_quality"] = favorite_quality.index(item.quality) elif priority == 2: # Solo servidores - autoplay_list.sort(key=lambda orden: orden['indice_server']) + + # si el servidor no se encuentra en la lista de favoritos o la url esta repetida, + # descartamos el item + if item.server not in favorite_servers or item.url in url_list_valid: + continue + autoplay_elem["indice_server"] = favorite_servers.index(item.server) elif priority == 3: # Solo calidades - autoplay_list.sort(key=lambda orden: orden['indice_quality']) - # Si hay elementos en la lista de autoplay se intenta reproducir cada elemento, hasta encontrar uno - # funcional o fallen todos - if autoplay_list: - played = False - max_intentos = 5 - max_intentos_servers = {} + # si la calidad no se encuentra en la lista de favoritos o la url esta repetida, + # descartamos el item + if item.quality not in favorite_quality or item.url in url_list_valid: + continue + autoplay_elem["indice_quality"] = favorite_quality.index(item.quality) - # Si se esta reproduciendo algo detiene la reproduccion - if platformtools.is_playing(): - platformtools.stop_video() + else: # No ordenar - for autoplay_elem in autoplay_list: - if not platformtools.is_playing() and not played: - videoitem = autoplay_elem['videoitem'] + # si la url esta repetida, descartamos el item + if item.url in url_list_valid: + continue - if videoitem.server not in max_intentos_servers: + # Si el item llega hasta aqui lo añadimos al listado de urls validas y a autoplay_list + url_list_valid.append(item.url) + autoplay_elem['videoitem'] = item + # autoplay_elem['server'] = item.server + # autoplay_elem['quality'] = item.quality + autoplay_list.append(autoplay_elem) + + # Ordenamos segun la prioridad + if priority == 0: # Servidores y calidades + autoplay_list.sort(key=lambda orden: (orden['indice_server'], orden['indice_quality'])) + + elif priority == 1: # Calidades y servidores + autoplay_list.sort(key=lambda orden: (orden['indice_quality'], orden['indice_server'])) + + elif priority == 2: # Solo servidores + autoplay_list.sort(key=lambda orden: orden['indice_server']) + + elif priority == 3: # Solo calidades + autoplay_list.sort(key=lambda orden: orden['indice_quality']) + + # Si hay elementos en la lista de autoplay se intenta reproducir cada elemento, hasta encontrar uno + # funcional o fallen todos + if autoplay_list: + played = False + max_intentos = 5 + max_intentos_servers = {} + + # Si se esta reproduciendo algo detiene la reproduccion + if platformtools.is_playing(): + platformtools.stop_video() + + for autoplay_elem in autoplay_list: + if not platformtools.is_playing() and not played: + videoitem = autoplay_elem['videoitem'] + + if videoitem.server not in max_intentos_servers: + max_intentos_servers[videoitem.server] = max_intentos + + # Si se han alcanzado el numero maximo de intentos de este servidor saltamos al siguiente + if max_intentos_servers[videoitem.server] == 0: + continue + + lang = " " + if hasattr(videoitem, 'language') and videoitem.language != "": + lang = " '%s' " % videoitem.language + + platformtools.dialog_notification("AutoPlay", "%s%s%s" % ( + videoitem.server.upper(), lang, videoitem.quality.upper()), sound=False) + # TODO videoitem.server es el id del server, pero podria no ser el nombre!!! + + # Intenta reproducir los enlaces + # Si el canal tiene metodo play propio lo utiliza + channel = __import__('channels.%s' % item.channel, None, None, ["channels.%s" % item.channel]) + if hasattr(channel, 'play'): + resolved_item = getattr(channel, 'play')(videoitem) + if len(resolved_item) > 0: + if isinstance(resolved_item[0], list): + videoitem.video_urls = resolved_item + else: + videoitem = resolved_item[0] + + # si no directamente reproduce + platformtools.play_video(videoitem) + + try: + if platformtools.is_playing(): + played = True + break + except: # TODO evitar el informe de que el conector fallo o el video no se encuentra + logger.debug(str(len(autoplay_list))) + + # Si hemos llegado hasta aqui es por q no se ha podido reproducir + max_intentos_servers[videoitem.server] -= 1 + + # Si se han alcanzado el numero maximo de intentos de este servidor + # preguntar si queremos seguir probando o lo ignoramos + if max_intentos_servers[videoitem.server] == 0: + text = "Parece que los enlaces de %s no estan funcionando." % videoitem.server.upper() + if not platformtools.dialog_yesno("AutoPlay", text, + "¿Desea ignorar todos los enlaces de este servidor?"): max_intentos_servers[videoitem.server] = max_intentos - # Si se han alcanzado el numero maximo de intentos de este servidor saltamos al siguiente - if max_intentos_servers[videoitem.server] == 0: - continue + else: + platformtools.dialog_notification('AutoPlay No Fue Posible', 'No Hubo Coincidencias') + if new_options: + platformtools.dialog_notification("AutoPlay", "Nueva Calidad/Servidor disponible en la " + "configuracion", sound=False) - lang = " " - if hasattr(videoitem, 'language') and videoitem.language != "": - lang = " '%s' " % videoitem.language + # Restaura si es necesario el valor previo de "Accion y Player Mode" en preferencias + if user_config_setting_action != 2: + config.set_setting("default_action", user_config_setting_action) + if user_config_setting_player != 0: + config.set_setting("player_mode", user_config_setting_player) - platformtools.dialog_notification("AutoPlay", "%s%s%s" % ( - videoitem.server.upper(), lang, videoitem.quality.upper()), sound=False) - # TODO videoitem.server es el id del server, pero podria no ser el nombre!!! - - # Intenta reproducir los enlaces - # Si el canal tiene metodo play propio lo utiliza - channel = __import__('channels.%s' % item.channel, None, None, ["channels.%s" % item.channel]) - if hasattr(channel, 'play'): - resolved_item = getattr(channel, 'play')(videoitem) - if len(resolved_item) > 0: - if isinstance(resolved_item[0], list): - videoitem.video_urls = resolved_item - else: - videoitem = resolved_item[0] - - # si no directamente reproduce - platformtools.play_video(videoitem) - - try: - if platformtools.is_playing(): - played = True - break - except: # TODO evitar el informe de que el conector fallo o el video no se encuentra - logger.debug(str(len(autoplay_list))) - - # Si hemos llegado hasta aqui es por q no se ha podido reproducir - max_intentos_servers[videoitem.server] -= 1 - - # Si se han alcanzado el numero maximo de intentos de este servidor - # preguntar si queremos seguir probando o lo ignoramos - if max_intentos_servers[videoitem.server] == 0: - text = "Parece que los enlaces de %s no estan funcionando." % videoitem.server.upper() - if not platformtools.dialog_yesno("AutoPlay", text, - "¿Desea ignorar todos los enlaces de este servidor?"): - max_intentos_servers[videoitem.server] = max_intentos - - else: - platformtools.dialog_notification('AutoPlay No Fue Posible', 'No Hubo Coincidencias') - if new_options: - platformtools.dialog_notification("AutoPlay", "Nueva Calidad/Servidor disponible en la " - "configuracion", sound=False) - - # Restaura si es necesario el valor previo de "Accion y Player Mode" en preferencias - if user_config_setting_action != 2: - config.set_setting("default_action", user_config_setting_action) - if user_config_setting_player != 0: - config.set_setting("player_mode", user_config_setting_player) - - # devuelve la lista de enlaces para la eleccion manual - return itemlist + # devuelve la lista de enlaces para la eleccion manual + return itemlist def init(channel, list_servers, list_quality): ''' - Comprueba la existencia de canal en el archivo de configuracion de Autoplay y si no existe lo añade. + Comprueba la existencia de canal en el archivo de configuracion de Autoplay y si no existe lo añade. Es necesario llamar a esta funcion al entrar a cualquier canal que incluya la funcion Autoplay. - + :param channel: (str) id del canal - :param list_servers: (list) lista inicial de servidores validos para el canal. No es necesario incluirlos todos, + :param list_servers: (list) lista inicial de servidores validos para el canal. No es necesario incluirlos todos, ya que la lista de servidores validos se ira actualizando dinamicamente. - :param list_quality: (list) lista inicial de calidades validas para el canal. No es necesario incluirlas todas, + :param list_quality: (list) lista inicial de calidades validas para el canal. No es necesario incluirlas todas, ya que la lista de calidades validas se ira actualizando dinamicamente. :return: (bool) True si la inicializacion ha sido correcta. ''' @@ -304,7 +311,7 @@ def init(channel, list_servers, list_quality): result = True if not config.is_xbmc(): - platformtools.dialog_notification('AutoPlay ERROR', 'Sólo disponible para XBMC/Kodi') + # platformtools.dialog_notification('AutoPlay ERROR', 'Sólo disponible para XBMC/Kodi') result = False else: autoplay_path = os.path.join(config.get_data_path(), "settings_channels", 'autoplay_data.json') @@ -344,16 +351,12 @@ def init(channel, list_servers, list_quality): if change: result, json_data = jsontools.update_node(autoplay_node, 'autoplay', 'AUTOPLAY') - if result: - heading = "AutoPlay Disponible" - msj = "Seleccione '<Configurar AutoPlay>' para activarlo." - icon = 0 - else: + if not result: heading = "Error al iniciar AutoPlay" msj = "Consulte su log para obtener mas información." icon = 1 - platformtools.dialog_notification(heading, msj, icon, sound=False) + platformtools.dialog_notification(heading, msj, icon, sound=False) return result @@ -517,9 +520,9 @@ def autoplay_config(item): def save(item, dict_data_saved): ''' Guarda los datos de la ventana de configuracion - + :param item: item - :param dict_data_saved: dict + :param dict_data_saved: dict :return: ''' logger.info() diff --git a/plugin.video.alfa/channels/bajui2.json b/plugin.video.alfa/channels/bajui2.json index 66c7b956..9a2e8fde 100755 --- a/plugin.video.alfa/channels/bajui2.json +++ b/plugin.video.alfa/channels/bajui2.json @@ -3,7 +3,7 @@ "name": "Bajui2", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "bajui.png", "banner": "bajui.png", "fanart": "bajui.png", diff --git a/plugin.video.alfa/channels/beeg.json b/plugin.video.alfa/channels/beeg.json index b90b31ae..3bd04c00 100755 --- a/plugin.video.alfa/channels/beeg.json +++ b/plugin.video.alfa/channels/beeg.json @@ -3,7 +3,7 @@ "name": "Beeg", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "beeg.png", "banner": "beeg.png", "version": 1, diff --git a/plugin.video.alfa/channels/bityouth.json b/plugin.video.alfa/channels/bityouth.json index 401d7de6..68495232 100755 --- a/plugin.video.alfa/channels/bityouth.json +++ b/plugin.video.alfa/channels/bityouth.json @@ -3,7 +3,7 @@ "name": "Bityouth", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "http://s6.postimg.org/6ash180up/bityoulogo.png", "banner": "bityouth.png", "version": 1, diff --git a/plugin.video.alfa/channels/borrachodetorrent.json b/plugin.video.alfa/channels/borrachodetorrent.json index 47c9158a..af57aff1 100755 --- a/plugin.video.alfa/channels/borrachodetorrent.json +++ b/plugin.video.alfa/channels/borrachodetorrent.json @@ -3,7 +3,7 @@ "name": "BorrachodeTorrent", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "http://imgur.com/BePrYmy.png", "version": 1, "changes": [ diff --git a/plugin.video.alfa/channels/bricocine.json b/plugin.video.alfa/channels/bricocine.json index 70235fa1..f458203a 100755 --- a/plugin.video.alfa/channels/bricocine.json +++ b/plugin.video.alfa/channels/bricocine.json @@ -3,7 +3,7 @@ "name": "Bricocine", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "http://s6.postimg.org/9u8m1ep8x/bricocine.jpg", "banner": "bricocine.png", "version": 1, diff --git a/plugin.video.alfa/channels/canalpelis.json b/plugin.video.alfa/channels/canalpelis.json index 86b5856e..7a38759a 100644 --- a/plugin.video.alfa/channels/canalpelis.json +++ b/plugin.video.alfa/channels/canalpelis.json @@ -3,7 +3,7 @@ "name": "CanalPelis", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "fanart": "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/canalpelisbg.jpg", "thumbnail": "http://www.canalpelis.com/wp-content/uploads/2016/11/logo_web.gif", "banner": "", @@ -15,7 +15,6 @@ } ], "categories": [ - "latino", "movie", "tvshow", "vos" @@ -38,6 +37,8 @@ "visible": true, "lvalues": [ "Sin color", + "Perfil 5", + "Perfil 4", "Perfil 3", "Perfil 2", "Perfil 1" diff --git a/plugin.video.alfa/channels/canalpelis.py b/plugin.video.alfa/channels/canalpelis.py old mode 100755 new mode 100644 index 728ba241..19604c52 --- a/plugin.video.alfa/channels/canalpelis.py +++ b/plugin.video.alfa/channels/canalpelis.py @@ -127,7 +127,7 @@ def peliculas(item): data = httptools.downloadpage(item.url).data data = re.sub(r"\n|\r|\t|\(.*?\)|\s{2}| ", "", data) - # logger.info(data) + logger.info(data) patron = '<div class="poster"><img src="([^"]+)" alt="([^"]+)">.*?' # img, title.strip() patron += '<span class="icon-star2"></span>(.*?)/div>.*?' # rating @@ -138,7 +138,8 @@ def peliculas(item): matches = scrapertools.find_multiple_matches(data, patron) for scrapedthumbnail, scrapedtitle, rating, calidad, scrapedurl, year in matches[item.page:item.page + 20]: - if 'Próximamente' not in calidad: + if 'Próximamente' not in calidad and '-XXX.jpg' not in scrapedthumbnail: + scrapedtitle = scrapedtitle.replace('Ver ', '').strip() contentTitle = scrapedtitle.partition(':')[0].partition(',')[0] title = "%s [COLOR green][%s][/COLOR] [COLOR yellow][%s][/COLOR]" % ( @@ -337,7 +338,7 @@ def episodios(item): itemlist.sort(key=lambda it: int(it.infoLabels['episode']), reverse=config.get_setting('orden_episodios', __channel__)) - + tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) # Opción "Añadir esta serie a la videoteca" if config.get_videolibrary_support() and len(itemlist) > 0: itemlist.append(Item(channel=__channel__, title="Añadir esta serie a la videoteca", url=item.url, diff --git a/plugin.video.alfa/channels/canalporno.json b/plugin.video.alfa/channels/canalporno.json index e4a4078d..80e1077b 100755 --- a/plugin.video.alfa/channels/canalporno.json +++ b/plugin.video.alfa/channels/canalporno.json @@ -3,7 +3,7 @@ "name": "Canalporno", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "http://i.imgur.com/gAbPcvT.png?1", "banner": "canalporno.png", "version": 1, diff --git a/plugin.video.alfa/channels/cartoonlatino.json b/plugin.video.alfa/channels/cartoonlatino.json index 43fa8a91..e58fef6d 100755 --- a/plugin.video.alfa/channels/cartoonlatino.json +++ b/plugin.video.alfa/channels/cartoonlatino.json @@ -3,7 +3,7 @@ "name": "Cartoon-Latino", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "http://i.imgur.com/wk6fRDZ.png", "banner": "http://i.imgur.com/115c59F.png", "version": 1, @@ -14,7 +14,6 @@ } ], "categories": [ - "tvshow", - "latino" + "tvshow" ] } \ No newline at end of file diff --git a/plugin.video.alfa/channels/cartoonlatino.py b/plugin.video.alfa/channels/cartoonlatino.py index 702d860d..1cc9d289 100644 --- a/plugin.video.alfa/channels/cartoonlatino.py +++ b/plugin.video.alfa/channels/cartoonlatino.py @@ -12,18 +12,29 @@ from core.item import Item from platformcode import config, logger host = "http://www.cartoon-latino.com/" +from channels import autoplay +IDIOMAS = {'latino': 'Latino'} +list_language = IDIOMAS.values() +list_servers = ['openload', + 'vimple', + 'gvideo', + 'rapidvideo' + ] +list_quality = ['default'] def mainlist(item): logger.info() thumb_series = get_thumb("channels_tvshow.png") + autoplay.init(item.channel, list_servers, list_quality) itemlist = list() itemlist.append(Item(channel=item.channel, action="lista", title="Series", url=host, thumbnail=thumb_series)) itemlist = renumbertools.show_option(item.channel, itemlist) + autoplay.show_option(item.channel, itemlist) return itemlist @@ -87,9 +98,10 @@ def lista(item): for link, name in matches: title = name + " [Latino]" url = link + context1=[renumbertools.context(item), autoplay.context] itemlist.append( item.clone(title=title, url=url, plot=title, action="episodios", show=title, - context=renumbertools.context(item))) + context=context1)) tmdb.set_infoLabels(itemlist) return itemlist @@ -171,11 +183,13 @@ def findvideos(item): if server in link: url = link.replace('" + ID' + server + ' + "', str(id)) if "drive" in server: - server1 = 'googlevideo' + server1 = 'Gvideo' else: server1 = server itemlist.append(item.clone(url=url, action="play", server=server1, title="Enlace encontrado en %s " % (server1.capitalize()))) + + autoplay.start(itemlist, item) return itemlist diff --git a/plugin.video.alfa/channels/ciberdocumentales.json b/plugin.video.alfa/channels/ciberdocumentales.json index 816e6020..8925f5db 100755 --- a/plugin.video.alfa/channels/ciberdocumentales.json +++ b/plugin.video.alfa/channels/ciberdocumentales.json @@ -3,7 +3,7 @@ "name": "CiberDocumentales", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "https://s9.postimg.org/secdb5s8v/ciberdocumentales.png", "banner": "https://s1.postimg.org/sa486z0of/ciberdocumentales_banner.png", "version": 1, diff --git a/plugin.video.alfa/channels/cineasiaenlinea.json b/plugin.video.alfa/channels/cineasiaenlinea.json index df5f5c91..2ef9c1a6 100755 --- a/plugin.video.alfa/channels/cineasiaenlinea.json +++ b/plugin.video.alfa/channels/cineasiaenlinea.json @@ -3,7 +3,7 @@ "name": "CineAsiaEnLinea", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "http://i.imgur.com/5KOU8uy.png?3", "banner": "cineasiaenlinea.png", "version": 1, diff --git a/plugin.video.alfa/channels/cinecalidad.json b/plugin.video.alfa/channels/cinecalidad.json index 06fc11b7..e5d9f069 100755 --- a/plugin.video.alfa/channels/cinecalidad.json +++ b/plugin.video.alfa/channels/cinecalidad.json @@ -1,12 +1,9 @@ { "id": "cinecalidad", "name": "CineCalidad", - "compatible": { - "addon_version": "4.3" - }, "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "https://s31.postimg.org/puxmvsi7v/cinecalidad.png", "banner": "https://s32.postimg.org/kihkdpx1x/banner_cinecalidad.png", "version": 1, @@ -33,7 +30,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/cinecalidad.py b/plugin.video.alfa/channels/cinecalidad.py index c968bcc5..f2b44121 100644 --- a/plugin.video.alfa/channels/cinecalidad.py +++ b/plugin.video.alfa/channels/cinecalidad.py @@ -298,7 +298,7 @@ def findvideos(item): if server_id in server_url: server = server_id.lower() - thumbnail = servertools.guess_server_thumbnail(server_id) + thumbnail = item.contentThumbnail if server_id == 'TVM': server = 'thevideo.me' url = server_url[server_id] + video_id + '.html' @@ -367,7 +367,7 @@ def play(item): for videoitem in itemlist: videoitem.title = item.fulltitle videoitem.fulltitle = item.fulltitle - videoitem.thumbnail = item.extra + videoitem.thumbnail = item.contentThumbnail videoitem.channel = item.channel else: itemlist.append(item) @@ -463,3 +463,4 @@ def search(item, texto): for line in sys.exc_info(): logger.error("%s" % line) return [] + diff --git a/plugin.video.alfa/channels/cinefox.json b/plugin.video.alfa/channels/cinefox.json index 8a5c10bd..acbb8914 100755 --- a/plugin.video.alfa/channels/cinefox.json +++ b/plugin.video.alfa/channels/cinefox.json @@ -3,7 +3,7 @@ "name": "Cinefox", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "version": 1, "thumbnail": "cinefox.png", "banner": "cinefox.png", @@ -28,7 +28,6 @@ "categories": [ "movie", "tvshow", - "latino", "vos" ], "settings": [ diff --git a/plugin.video.alfa/channels/cinefox.py b/plugin.video.alfa/channels/cinefox.py old mode 100755 new mode 100644 diff --git a/plugin.video.alfa/channels/cinefoxtv.json b/plugin.video.alfa/channels/cinefoxtv.json index 659a00fd..8c127c57 100755 --- a/plugin.video.alfa/channels/cinefoxtv.json +++ b/plugin.video.alfa/channels/cinefoxtv.json @@ -3,7 +3,7 @@ "name": "CineFoxTV", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s28.postimg.org/lytn2q1tp/cinefoxtv.png", "banner": "cinefoxtv.png", "version": 1, @@ -22,7 +22,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/cinefoxtv.py b/plugin.video.alfa/channels/cinefoxtv.py old mode 100755 new mode 100644 index 722144ac..a3adf5f9 --- a/plugin.video.alfa/channels/cinefoxtv.py +++ b/plugin.video.alfa/channels/cinefoxtv.py @@ -164,7 +164,7 @@ def findvideos(item): itemlist.extend(servertools.find_video_items(data=scrapedurl)) for videoitem in itemlist: - videoitem.title = item.contentTitle + ' (' + videoitem.server + ')' + videoitem.title = item.contentTitle videoitem.channel = item.channel videoitem.plot = info videoitem.action = "play" diff --git a/plugin.video.alfa/channels/cinehindi.json b/plugin.video.alfa/channels/cinehindi.json index ec7879d4..27959fe3 100755 --- a/plugin.video.alfa/channels/cinehindi.json +++ b/plugin.video.alfa/channels/cinehindi.json @@ -3,7 +3,7 @@ "name": "CineHindi", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "cinehindi.png", "banner": "http://i.imgur.com/cau9TVe.png", "version": 1, diff --git a/plugin.video.alfa/channels/cinetemagay.json b/plugin.video.alfa/channels/cinetemagay.json index ee01d7df..52651bfb 100755 --- a/plugin.video.alfa/channels/cinetemagay.json +++ b/plugin.video.alfa/channels/cinetemagay.json @@ -3,7 +3,7 @@ "name": "Cinetemagay", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "cinetemagay.png", "banner": "cinetemagay.png", "version": 1, diff --git a/plugin.video.alfa/channels/cinetux.json b/plugin.video.alfa/channels/cinetux.json index 582184ab..6a7d3983 100755 --- a/plugin.video.alfa/channels/cinetux.json +++ b/plugin.video.alfa/channels/cinetux.json @@ -3,7 +3,7 @@ "name": "Cinetux", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "cinetux.png", "banner": "cinetux.png", "fanart": "cinetux.jpg", @@ -27,7 +27,6 @@ } ], "categories": [ - "latino", "direct", "movie" ], diff --git a/plugin.video.alfa/channels/cinetux.py b/plugin.video.alfa/channels/cinetux.py index 348cdaf9..3ac3cd94 100644 --- a/plugin.video.alfa/channels/cinetux.py +++ b/plugin.video.alfa/channels/cinetux.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -import urlparse - from core import httptools from core import scrapertools from core import servertools @@ -48,13 +46,11 @@ def mainlist(item): "/0/Genre.png", text_color=color1)) - url = urlparse.urljoin(CHANNEL_HOST, "genero/documental/") itemlist.append(item.clone(title="Documentales", text_bold=True, text_color=color2, action="")) - itemlist.append(item.clone(action="peliculas", title=" Novedades", url=url, text_color=color1, + itemlist.append(item.clone(action="peliculas", title=" Novedades", url=CHANNEL_HOST + "genero/documental/", text_color=color1, thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres" "/0/Documentaries.png")) - url = urlparse.urljoin(CHANNEL_HOST, "genero/documental/?orderby=title&order=asc&gdsr_order=asc") - itemlist.append(item.clone(action="peliculas", title=" Por orden alfabético", text_color=color1, url=url, + itemlist.append(item.clone(action="peliculas", title=" Por orden alfabético", text_color=color1, url=CHANNEL_HOST + "genero/documental/?orderby=title&order=asc&gdsr_order=asc", thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres" "/0/A-Z.png")) itemlist.append(item.clone(title="", action="")) @@ -100,7 +96,7 @@ def newest(categoria): itemlist.pop() elif categoria == 'documentales': - item.url = urlparse.urljoin(CHANNEL_HOST, "genero/documental/") + item.url = CHANNEL_HOST + "genero/documental/" item.action = "peliculas" itemlist = peliculas(item) @@ -108,7 +104,7 @@ def newest(categoria): itemlist.pop() elif categoria == 'infantiles': - item.url = urlparse.urljoin(CHANNEL_HOST, "genero/infantil/") + item.url = CHANNEL_HOST + "genero/infantil/" item.action = "peliculas" itemlist = peliculas(item) @@ -130,7 +126,6 @@ def peliculas(item): itemlist = [] item.text_color = color2 - # Descarga la página data = httptools.downloadpage(item.url).data patron = '(?s)class="(?:result-item|item movies)">.*?<img src="([^"]+)' patron += '.*?alt="([^"]+)"' @@ -156,11 +151,6 @@ def peliculas(item): if year: new_item.infoLabels['year'] = int(year) itemlist.append(new_item) - try: - # tmdb.set_infoLabels(itemlist, __modo_grafico__) - a = 1 - except: - pass # Extrae el paginador next_page_link = scrapertools.find_single_match(data, '<link rel="next" href="([^"]+)') @@ -218,7 +208,6 @@ def generos(item): scrapedtitle = unicode(scrapedtitle, "utf8").capitalize().encode("utf8") if scrapedtitle == "Erotico" and config.get_setting("adult_mode") == 0: continue - itemlist.append(item.clone(action="peliculas", title=scrapedtitle, url=scrapedurl)) return itemlist @@ -228,9 +217,9 @@ def idioma(item): logger.info() itemlist = [] - itemlist.append(item.clone(action="peliculas", title="Español", url="http://www.cinetux.net/idioma/espanol/")) - itemlist.append(item.clone(action="peliculas", title="Latino", url="http://www.cinetux.net/idioma/latino/")) - itemlist.append(item.clone(action="peliculas", title="VOSE", url="http://www.cinetux.net/idioma/subtitulado/")) + itemlist.append(item.clone(action="peliculas", title="Español", url= CHANNEL_HOST + "idioma/espanol/")) + itemlist.append(item.clone(action="peliculas", title="Latino", url= CHANNEL_HOST + "idioma/latino/")) + itemlist.append(item.clone(action="peliculas", title="VOSE", url= CHANNEL_HOST + "idioma/subtitulado/")) return itemlist @@ -290,7 +279,6 @@ def findvideos(item): else: itemlist.append(item.clone(title="No hay enlaces disponibles", action="", text_color=color3)) - return itemlist @@ -307,6 +295,7 @@ def bloque_enlaces(data, filtro_idioma, dict_idiomas, type, item): patron = '(?is)#(option-[^"]+).*?png">([^<]+)' match = scrapertools.find_multiple_matches(data, patron) for scrapedoption, language in match: + scrapedserver = "" lazy = "" if "lazy" in bloque1: lazy = "lazy-" @@ -314,15 +303,13 @@ def bloque_enlaces(data, filtro_idioma, dict_idiomas, type, item): url = scrapertools.find_single_match(bloque1, patron) if "goo.gl" in url: url = httptools.downloadpage(url, follow_redirects=False, only_headers=True).headers.get("location", "") - if "www.cinetux.me" in url: - server = scrapertools.find_single_match(url, "player/(.*?)\.") - else: - server = servertools.get_server_from_url(url) - matches.append([url, server, "", language.strip(), t_tipo]) + if "player" in url: + scrapedserver = scrapertools.find_single_match(url, 'player/(\w+)') + matches.append([url, scrapedserver, "", language.strip(), t_tipo]) bloque2 = scrapertools.find_single_match(data, '(?s)box_links.*?dt_social_single') bloque2 = bloque2.replace("\t", "").replace("\r", "") patron = '(?s)optn" href="([^"]+)' - patron += '.*?title="([^"]+)' + patron += '.*?title="([^\.]+)' patron += '.*?src.*?src="[^>]+"?/>([^<]+)' patron += '.*?src="[^>]+"?/>([^<]+)' patron += '.*?/span>([^<]+)' @@ -336,19 +323,19 @@ def bloque_enlaces(data, filtro_idioma, dict_idiomas, type, item): scrapedtipo = match[4] if t_tipo.upper() not in scrapedtipo.upper(): continue - title = " Mirror en " + scrapedserver.split(".")[0] + " (" + scrapedlanguage + ")" + title = " Mirror en %s (" + scrapedlanguage + ")" if len(scrapedcalidad.strip()) > 0: title += " (Calidad " + scrapedcalidad.strip() + ")" if filtro_idioma == 3 or item.filtro: lista_enlaces.append(item.clone(title=title, action="play", text_color=color2, url=scrapedurl, server=scrapedserver, idioma=scrapedlanguage, - extra=item.url)) + extra=item.url, contentThumbnail = item.thumbnail)) else: idioma = dict_idiomas[language] if idioma == filtro_idioma: lista_enlaces.append(item.clone(title=title, text_color=color2, action="play", url=scrapedurl, - extra=item.url)) + extra=item.url, contentThumbnail = item.thumbnail)) else: if language not in filtrados: filtrados.append(language) @@ -357,30 +344,28 @@ def bloque_enlaces(data, filtro_idioma, dict_idiomas, type, item): title = "Mostrar enlaces filtrados en %s" % ", ".join(filtrados) lista_enlaces.append(item.clone(title=title, action="findvideos", url=item.url, text_color=color3, filtro=True)) + lista_enlaces = servertools.get_servers_itemlist(lista_enlaces, lambda i: i.title % i.server.capitalize()) return lista_enlaces def play(item): logger.info() itemlist = [] - video_urls = [] if "api.cinetux" in item.url: data = httptools.downloadpage(item.url, headers={'Referer': item.extra}).data.replace("\\", "") id = scrapertools.find_single_match(data, 'img src="[^#]+#(.*?)"') item.url = "https://youtube.googleapis.com/embed/?status=ok&hl=es&allow_embed=1&ps=docs&partnerid=30&hd=1&autoplay=0&cc_load_policy=1&showinfo=0&docid=" + id - itemlist = servertools.find_video_items(data=item.url) elif "links" in item.url or "www.cinetux.me" in item.url: data = httptools.downloadpage(item.url).data scrapedurl = scrapertools.find_single_match(data, '<a href="(http[^"]+)') if scrapedurl == "": - scrapedurl = scrapertools.find_single_match(data, '(?i)<frame src="(http[^"]+)') + scrapedurl = scrapertools.find_single_match(data, '(?i)frame.*?src="(http[^"]+)') if scrapedurl == "": scrapedurl = scrapertools.find_single_match(data, 'replace."([^"]+)"') elif "goo.gl" in scrapedurl: scrapedurl = httptools.downloadpage(scrapedurl, follow_redirects=False, only_headers=True).headers.get( "location", "") item.url = scrapedurl - itemlist = servertools.find_video_items(data=item.url) - else: - return [item] - return itemlist + item.thumbnail = item.contentThumbnail + item.server = servertools.get_server_from_url(item.url) + return [item] diff --git a/plugin.video.alfa/channels/clasicofilm.json b/plugin.video.alfa/channels/clasicofilm.json index 1c7cb4e2..d1104cb0 100755 --- a/plugin.video.alfa/channels/clasicofilm.json +++ b/plugin.video.alfa/channels/clasicofilm.json @@ -3,7 +3,7 @@ "name": "ClasicoFilm", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "http://i.imgur.com/F7sevVu.jpg?1", "banner": "clasicofilm.png", "version": 1, diff --git a/plugin.video.alfa/channels/copiapop.json b/plugin.video.alfa/channels/copiapop.json index e8d65d10..acdb4daf 100644 --- a/plugin.video.alfa/channels/copiapop.json +++ b/plugin.video.alfa/channels/copiapop.json @@ -1,7 +1,7 @@ { "id": "copiapop", "name": "Copiapop/Diskokosmiko", - "language": "es", + "language": ["cast", "lat"], "active": true, "adult": false, "version": 1, diff --git a/plugin.video.alfa/channels/crimenes.json b/plugin.video.alfa/channels/crimenes.json index 8b6d4342..500ac3a4 100755 --- a/plugin.video.alfa/channels/crimenes.json +++ b/plugin.video.alfa/channels/crimenes.json @@ -3,7 +3,7 @@ "name": "Crimenes Imperfectos", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "banner": "crimenes.png", "thumbnail": "crimenes.png", "version": 1, diff --git a/plugin.video.alfa/channels/crunchyroll.json b/plugin.video.alfa/channels/crunchyroll.json index 5d53c4cc..95156d2c 100755 --- a/plugin.video.alfa/channels/crunchyroll.json +++ b/plugin.video.alfa/channels/crunchyroll.json @@ -1,7 +1,7 @@ { "id": "crunchyroll", "name": "Crunchyroll", - "language": "es", + "language": ["cast", "lat"], "active": true, "adult": false, "version": 1, diff --git a/plugin.video.alfa/channels/cuelgame.json b/plugin.video.alfa/channels/cuelgame.json index 805701b7..fe1e6a9a 100755 --- a/plugin.video.alfa/channels/cuelgame.json +++ b/plugin.video.alfa/channels/cuelgame.json @@ -3,7 +3,7 @@ "name": "Cuelgame", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "version": 1, "changes": [ { diff --git a/plugin.video.alfa/channels/cumlouder.json b/plugin.video.alfa/channels/cumlouder.json index 8c41c900..d937eb45 100755 --- a/plugin.video.alfa/channels/cumlouder.json +++ b/plugin.video.alfa/channels/cumlouder.json @@ -3,7 +3,7 @@ "name": "Cumlouder", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "cumlouder.png", "banner": "cumlouder.png", "version": 1, diff --git a/plugin.video.alfa/channels/datoporn.json b/plugin.video.alfa/channels/datoporn.json index ca5919ce..e346f95f 100755 --- a/plugin.video.alfa/channels/datoporn.json +++ b/plugin.video.alfa/channels/datoporn.json @@ -1,7 +1,7 @@ { "id": "datoporn", "name": "DatoPorn", - "language": "es", + "language": ["*"], "active": true, "adult": true, "changes": [ diff --git a/plugin.video.alfa/channels/descargacineclasico.json b/plugin.video.alfa/channels/descargacineclasico.json index 3bfc0e52..5b5f9b5b 100755 --- a/plugin.video.alfa/channels/descargacineclasico.json +++ b/plugin.video.alfa/channels/descargacineclasico.json @@ -1,7 +1,7 @@ { "id": "descargacineclasico", "name": "descargacineclasico", - "language": "es", + "language": ["cast"], "active": true, "adult": false, "version": 1, diff --git a/plugin.video.alfa/channels/descargasmix.json b/plugin.video.alfa/channels/descargasmix.json index d519252e..ba8fc20d 100644 --- a/plugin.video.alfa/channels/descargasmix.json +++ b/plugin.video.alfa/channels/descargasmix.json @@ -1,7 +1,7 @@ { "id": "descargasmix", "name": "DescargasMIX", - "language": "es", + "language": ["cast", "lat"], "active": true, "version": 1, "adult": false, @@ -31,7 +31,6 @@ "banner": "descargasmix.png", "categories": [ "movie", - "latino", "vos", "torrent", "documentary", diff --git a/plugin.video.alfa/channels/descargasmix.py b/plugin.video.alfa/channels/descargasmix.py old mode 100755 new mode 100644 index b2797e16..5a3fe737 --- a/plugin.video.alfa/channels/descargasmix.py +++ b/plugin.video.alfa/channels/descargasmix.py @@ -220,7 +220,7 @@ def episodios(item): itemlist = [] data = get_data(item.url) - patron = '(<ul class="menu" id="seasons-list">.*?<div class="section-box related-posts">)' + patron = '(<ul class="menu ses" id="seasons-list">.*?<div class="section-box related-posts">)' bloque = scrapertools.find_single_match(data, patron) matches = scrapertools.find_multiple_matches(bloque, '<div class="polo".*?>(.*?)</div>') for scrapedtitle in matches: @@ -261,6 +261,7 @@ def epienlaces(item): data = get_data(item.url) data = data.replace("\n", "").replace("\t", "") + # Bloque de enlaces patron = '<div class="polo".*?>%s(.*?)(?:<div class="polo"|</li>)' % item.extra.strip() bloque = scrapertools.find_single_match(data, patron) diff --git a/plugin.video.alfa/channels/discoverymx.json b/plugin.video.alfa/channels/discoverymx.json index 0f3cedc0..6de0bf1e 100755 --- a/plugin.video.alfa/channels/discoverymx.json +++ b/plugin.video.alfa/channels/discoverymx.json @@ -3,7 +3,7 @@ "name": "Discoverymx", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "discoverymx.png", "banner": "discoverymx.png", "version": 1, @@ -18,7 +18,6 @@ } ], "categories": [ - "latino", "documentary" ] } \ No newline at end of file diff --git a/plugin.video.alfa/channels/divxatope.json b/plugin.video.alfa/channels/divxatope.json index 8690adca..fb58b863 100755 --- a/plugin.video.alfa/channels/divxatope.json +++ b/plugin.video.alfa/channels/divxatope.json @@ -3,7 +3,7 @@ "name": "Divxatope", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "divxatope.png", "banner": "divxatope.png", "version": 1, diff --git a/plugin.video.alfa/channels/divxatope.py b/plugin.video.alfa/channels/divxatope.py old mode 100755 new mode 100644 index 6d70b2a4..8e48defe --- a/plugin.video.alfa/channels/divxatope.py +++ b/plugin.video.alfa/channels/divxatope.py @@ -258,12 +258,11 @@ def findvideos(item): # Descarga la pagina data = httptools.downloadpage(item.url).data - item.plot = scrapertools.find_single_match(data, '<div class="post-entry" style="height:300px;">(.*?)</div>') item.plot = scrapertools.htmlclean(item.plot).strip() item.contentPlot = item.plot - link = scrapertools.find_single_match(data, 'href="http://(?:tumejorserie|tumejorjuego).*?link=([^"]+)"') + link = scrapertools.find_single_match(data, 'href.*?=.*?"http:\/\/(?:tumejorserie|tumejorjuego).*?link=([^"]+)"') if link != "": link = "http://www.divxatope1.com/" + link logger.info("torrent=" + link) @@ -272,12 +271,16 @@ def findvideos(item): url=link, thumbnail=servertools.guess_server_thumbnail("torrent"), plot=item.plot, folder=False, parentContent=item)) - patron = "<div class=\"box1\"[^<]+<img[^<]+</div[^<]+" - patron += '<div class="box2">([^<]+)</div[^<]+' - patron += '<div class="box3">([^<]+)</div[^<]+' - patron += '<div class="box4">([^<]+)</div[^<]+' - patron += '<div class="box5">(.*?)</div[^<]+' - patron += '<div class="box6">([^<]+)<' + patron = '<div class=\"box1\"[^<]+<img[^<]+<\/div[^<]+<div class="box2">([^<]+)<\/div[^<]+<div class="box3">([^<]+)' + patron += '<\/div[^<]+<div class="box4">([^<]+)<\/div[^<]+<div class="box5"><a href=(.*?) rel.*?' + patron += '<\/div[^<]+<div class="box6">([^<]+)<' + + #patron = "<div class=\"box1\"[^<]+<img[^<]+</div[^<]+" + #patron += '<div class="box2">([^<]+)</div[^<]+' + #patron += '<div class="box3">([^<]+)</div[^<]+' + #patron += '<div class="box4">([^<]+)</div[^<]+' + #patron += '<div class="box5">(.*?)</div[^<]+' + #patron += '<div class="box6">([^<]+)<' matches = re.compile(patron, re.DOTALL).findall(data) scrapertools.printMatches(matches) @@ -299,7 +302,7 @@ def findvideos(item): if "partes" in title: action = "extract_url" new_item = Item(channel=item.channel, action=action, title=title, fulltitle=title, url=url, - thumbnail=thumbnail, plot=plot, parentContent=item) + thumbnail=thumbnail, plot=plot, parentContent=item, server = servername) if comentarios.startswith("Ver en"): itemlist_ver.append(new_item) else: diff --git a/plugin.video.alfa/channels/divxtotal.json b/plugin.video.alfa/channels/divxtotal.json index 3803aa1d..f9826b37 100755 --- a/plugin.video.alfa/channels/divxtotal.json +++ b/plugin.video.alfa/channels/divxtotal.json @@ -3,7 +3,7 @@ "name": "Divxtotal", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "http://imgur.com/Madj03A.jpg", "version": 1, "changes": [ diff --git a/plugin.video.alfa/channels/divxtotal.py b/plugin.video.alfa/channels/divxtotal.py old mode 100755 new mode 100644 index 9a7746e3..889bd667 --- a/plugin.video.alfa/channels/divxtotal.py +++ b/plugin.video.alfa/channels/divxtotal.py @@ -232,7 +232,6 @@ def findtemporadas(item): th.start() data = httptools.downloadpage(item.url).data data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - if len(item.extra.split("|")): if len(item.extra.split("|")) >= 4: fanart = item.extra.split("|")[2] @@ -266,7 +265,7 @@ def findtemporadas(item): fanart_extra = item.fanart fanart_info = item.fanart - bloque_episodios = scrapertools.find_multiple_matches(data, 'Temporada (\d+) </a>(.*?)</table>') + bloque_episodios = scrapertools.find_multiple_matches(data, 'Temporada.*?(\d+).*?<\/a>(.*?)<\/table>') for temporada, bloque_epis in bloque_episodios: item.infoLabels = item.InfoLabels item.infoLabels['season'] = temporada @@ -299,9 +298,8 @@ def epis(item): itemlist = [] if item.extra == "serie_add": item.url = item.datalibrary - patron = scrapertools.find_multiple_matches(item.url, - '<td><img src=".*?images/(.*?)\.png.*?<a href="([^"]+)" title="">.*?(\d+x\d+).*?td>') + '<td><img src=".*?images\/(.*?)\.png".*?href="([^"]+)" title="">.*?(\d+x\d+).*?td>') for idioma, url, epi in patron: episodio = scrapertools.find_single_match(epi, '\d+x(\d+)') item.infoLabels['episode'] = episodio diff --git a/plugin.video.alfa/channels/documaniatv.json b/plugin.video.alfa/channels/documaniatv.json index 5338cc1c..01b5e0bb 100755 --- a/plugin.video.alfa/channels/documaniatv.json +++ b/plugin.video.alfa/channels/documaniatv.json @@ -3,7 +3,7 @@ "name": "DocumaniaTV", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "http://i.imgur.com/qMR9sg9.png", "banner": "documaniatv.png", "version": 1, diff --git a/plugin.video.alfa/channels/documentalesonline.json b/plugin.video.alfa/channels/documentalesonline.json index fe8308a3..edcab55f 100755 --- a/plugin.video.alfa/channels/documentalesonline.json +++ b/plugin.video.alfa/channels/documentalesonline.json @@ -3,7 +3,7 @@ "name": "Documentales Online", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "http://i.imgur.com/fsrnC4m.jpg", "version": 1, "changes": [ diff --git a/plugin.video.alfa/channels/doomtv.json b/plugin.video.alfa/channels/doomtv.json index 7e45d32d..72bdbfd9 100755 --- a/plugin.video.alfa/channels/doomtv.json +++ b/plugin.video.alfa/channels/doomtv.json @@ -1,40 +1,15 @@ { "id": "doomtv", "name": "doomtv", - "compatible": { - "addon_version": "4.3" - }, "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s2.postimg.org/jivgi4ak9/doomtv.png", "banner": "https://s32.postimg.org/6gxyripvp/doomtv_banner.png", "version": 1, - "changes": [ - { - "date": "24/06/2017", - "description": "Cambios para autoplay" - }, - { - "date": "06/06/2017", - "description": "COmpatibilida con AutoPlay" - }, - { - "date": "12/05/2017", - "description": "Fix generos y enlaces" - }, - { - "date": "15/03/2017", - "description": "limpieza código" - }, - { - "date": "01/02/2017", - "description": "Release." - } - ], "categories": [ - "latino", - "movie" + "movie", + "direct" ], "settings": [ { diff --git a/plugin.video.alfa/channels/doomtv.py b/plugin.video.alfa/channels/doomtv.py old mode 100755 new mode 100644 index 35df32a3..0ab1fe6e --- a/plugin.video.alfa/channels/doomtv.py +++ b/plugin.video.alfa/channels/doomtv.py @@ -18,7 +18,7 @@ list_language = IDIOMAS.values() CALIDADES = {'1080p': '1080p', '720p': '720p', '480p': '480p', '360p': '360p'} list_quality = CALIDADES.values() -list_servers = ['directo'] +list_servers = ['directo', 'openload'] host = 'http://doomtv.net/' headers = { @@ -32,10 +32,10 @@ tgenero = {"Comedia": "https://s7.postimg.org/ne9g9zgwb/comedia.png", "Aventura": "https://s10.postimg.org/6su40czih/aventura.png", "Romance": "https://s15.postimg.org/fb5j8cl63/romance.png", "Animación": "https://s13.postimg.org/5on877l87/animacion.png", - "Ciencia Ficción": "https://s9.postimg.org/diu70s7j3/cienciaficcion.png", + "Ciencia ficción": "https://s9.postimg.org/diu70s7j3/cienciaficcion.png", "Terror": "https://s7.postimg.org/yi0gij3gb/terror.png", - "Documentales": "https://s16.postimg.org/7xjj4bmol/documental.png", - "Musical": "https://s29.postimg.org/bbxmdh9c7/musical.png", + "Documental": "https://s16.postimg.org/7xjj4bmol/documental.png", + "Música": "https://s29.postimg.org/bbxmdh9c7/musical.png", "Fantasía": "https://s13.postimg.org/65ylohgvb/fantasia.png", "Bélico Guerra": "https://s23.postimg.org/71itp9hcr/belica.png", "Misterio": "https://s1.postimg.org/w7fdgf2vj/misterio.png", @@ -56,7 +56,6 @@ tgenero = {"Comedia": "https://s7.postimg.org/ne9g9zgwb/comedia.png", def mainlist(item): logger.info() - autoplay.init(item.channel, list_servers, list_quality) itemlist = [] itemlist.append( @@ -64,7 +63,7 @@ def mainlist(item): action="lista", thumbnail='https://s18.postimg.org/fwvaeo6qh/todas.png', fanart='https://s18.postimg.org/fwvaeo6qh/todas.png', - url=host + url='%s%s'%(host,'peliculas/page/1') )) itemlist.append( @@ -72,34 +71,15 @@ def mainlist(item): action="seccion", thumbnail='https://s3.postimg.org/5s9jg2wtf/generos.png', fanart='https://s3.postimg.org/5s9jg2wtf/generos.png', - url=host, - extra='generos' + url='%s%s' % (host, 'peliculas/page/1'), )) itemlist.append( - item.clone(title="Mas vistas", - action="seccion", + item.clone(title="Mas Vistas", + action="lista", thumbnail='https://s9.postimg.org/wmhzu9d7z/vistas.png', fanart='https://s9.postimg.org/wmhzu9d7z/vistas.png', - url=host, - extra='masvistas' - )) - - itemlist.append( - item.clone(title="Recomendadas", - action="lista", - thumbnail='https://s12.postimg.org/s881laywd/recomendadas.png', - fanart='https://s12.postimg.org/s881laywd/recomendadas.png', - url=host, - extra='recomendadas' - )) - - itemlist.append( - item.clone(title="Por año", - action="seccion", - thumbnail='https://s8.postimg.org/7eoedwfg5/pora_o.png', - fanart='https://s8.postimg.org/7eoedwfg5/pora_o.png', - url=host, extra='poraño' + url='%s%s'%(host,'top-imdb/page/1'), )) itemlist.append( @@ -110,8 +90,6 @@ def mainlist(item): fanart='https://s30.postimg.org/pei7txpa9/buscar.png' )) - autoplay.show_option(item.channel, itemlist) - return itemlist @@ -123,23 +101,11 @@ def lista(item): next_page_url = '' data = httptools.downloadpage(item.url).data + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) + + patron = 'movie-id=.*?href=(.*?) data-url.*?quality>(.*?)' + patron += '<img data-original=(.*?) class.*?<h2>(.*?)<\/h2>.*?<p>(.*?)<\/p>' - if item.extra == 'recomendadas': - patron = '<a href="(.*?)">.*?' - patron += '<div class="imgss">.*?' - patron += '<img src="(.*?)" alt="(.*?)(?:–.*?|\(.*?|–|").*?' - patron += '<div class="imdb">.*?' - patron += '<\/a>.*?' - patron += '<span class="ttps">.*?<\/span>.*?' - patron += '<span class="ytps">(.*?)<\/span><\/div>' - elif item.extra in ['generos', 'poraño', 'buscar']: - patron = '<div class=movie>.*?<img src=(.*?) alt=(.*?)(?:\s|\/)><a href=(.*?)>.*?' - patron += '<h2>.*?<\/h2>.*?(?:<span class=year>(.*?)<\/span>)?.*?<\/div>' - else: - patron = '<div class="imagen">.*?' - patron += '<img src="(.*?)" alt="(.*?)(?:–.*?|\(.*?|–|").*?' - patron += '<a href="([^"]+)"><(?:span) class="player"><\/span><\/a>.*?' - patron += 'h2>\s*.*?(?:year)">(.*?)<\/span>.*?<\/div>' matches = re.compile(patron, re.DOTALL).findall(data) if item.next_page != 'b': @@ -150,39 +116,36 @@ def lista(item): else: matches = matches[max_items:] next_page = 'a' - patron_next_page = '<div class="siguiente"><a href="(.*?)"|\/\?' - matches_next_page = re.compile(patron_next_page, re.DOTALL).findall(data) - if len(matches_next_page) > 0: - next_page_url = urlparse.urljoin(item.url, matches_next_page[0]) + next_page_str = scrapertools.find_single_match(data,"<li class='active'><a class=''>(\d+)</a>") + next_page_num = int(next_page_str)+1 + page_base = re.sub(r'(page\/\d+)','', item.url) + next_page_url = '%s%s%s'%(page_base,'page/',next_page_num) - for scrapedthumbnail, scrapedtitle, scrapedurl, scrapedyear in matches: - if item.extra == 'recomendadas': - url = scrapedthumbnail - title = scrapedurl - thumbnail = scrapedtitle - else: - url = scrapedurl - thumbnail = scrapedthumbnail - title = scrapedtitle - year = scrapedyear + if next_page_url: + next_page_url = next_page_url + + for scrapedurl, quality, scrapedthumbnail, scrapedtitle, plot in matches: + + url = scrapedurl + thumbnail = scrapedthumbnail + filtro_thumb = scrapedthumbnail.replace("https://image.tmdb.org/t/p/w185", "") + filtro_list = {"poster_path": filtro_thumb.strip()} + filtro_list = filtro_list.items() + title = scrapedtitle fanart = '' - plot = '' - - if 'serie' not in url: - itemlist.append( - Item(channel=item.channel, - action='findvideos', - title=title, - url=url, - thumbnail=thumbnail, - plot=plot, - fanart=fanart, - contentTitle=title, - infoLabels={'year': year}, - context=autoplay.context - )) - - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) + plot = plot + itemlist.append( + Item(channel=item.channel, + action='findvideos', + title=title, + url=url, + thumbnail=thumbnail, + plot=plot, + infoLabels={'filtro': filtro_list}, + fanart=fanart, + contentTitle=title + )) + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb = True) # Paginacion if next_page_url != '': itemlist.append( @@ -203,17 +166,8 @@ def seccion(item): itemlist = [] duplicado = [] data = httptools.downloadpage(item.url).data - - if item.extra == 'generos': - data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) - accion = 'lista' - if item.extra == 'masvistas': - patron = '<b>\d*<\/b>\s*<a href="(.*?)">(.*?<\/a>\s*<span>.*?<\/span>\s*<i>.*?<\/i><\/li>)' - accion = 'findvideos' - elif item.extra == 'poraño': - patron = '<li><a class="ito" HREF="(.*?)">(.*?)<\/a><\/li>' - else: - patron = '<li class=cat-item cat-item-.*?><a href=(.*?)>(.*?)<\/i>' + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) + patron = 'menu-item-object-category menu-item-\d+><a href=(.*?)>(.*?)<\/a><\/li>' matches = re.compile(patron, re.DOTALL).findall(data) @@ -221,61 +175,19 @@ def seccion(item): url = scrapedurl title = scrapedtitle thumbnail = '' - fanart = '' - plot = '' - year = '' - contentTitle = '' - if item.extra == 'masvistas': - year = re.findall(r'\b\d{4}\b', scrapedtitle) - title = re.sub(r'<\/a>\s*<span>.*?<\/span>\s*<i>.*?<\/i><\/li>', '', scrapedtitle) - contentTitle = title - title = title + ' (' + year[0] + ')' - - elif item.extra == 'generos': - title = re.sub(r'<\/a> <i>\d+', '', scrapedtitle) - cantidad = re.findall(r'.*?<\/a> <i>(\d+)', scrapedtitle) - th_title = title - title = title + ' (' + cantidad[0] + ')' - thumbnail = tgenero[th_title] - fanart = thumbnail - + if title in tgenero: + thumbnail = tgenero[title] if url not in duplicado: itemlist.append( Item(channel=item.channel, - action=accion, + action='lista', title=title, url=url, - thumbnail=thumbnail, - plot=plot, - fanart=fanart, - contentTitle=contentTitle, - infoLabels={'year': year} + thumbnail = thumbnail )) - duplicado.append(url) - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) return itemlist -def unpack(packed): - p, c, k = re.search("}\('(.*)', *\d+, *(\d+), *'(.*)'\.", packed, re.DOTALL).groups() - for c in reversed(range(int(c))): - if k.split('|')[c]: p = re.sub(r'(\b%s\b)' % c, k.split('|')[c], p) - p = p.replace('\\', '') - p = p.decode('string_escape') - return p - - -def getinfo(page_url): - info = () - logger.info() - data = httptools.downloadpage(page_url).data - thumbnail = scrapertools.find_single_match(data, '<div class="cover" style="background-image: url\((.*?)\);') - plot = scrapertools.find_single_match(data, '<h2>Synopsis<\/h2>\s*<p>(.*?)<\/p>') - info = (plot, thumbnail) - - return info - - def search(item, texto): logger.info() texto = texto.replace(" ", "+") @@ -305,98 +217,47 @@ def newest(categoria): return itemlist - -def get_url(item): - logger.info() - itemlist = [] - duplicado = [] - patrones = ["{'label':(.*?),.*?'file':'(.*?)'}", "{file:'(.*?redirector.*?),label:'(.*?)'}"] - data = httptools.downloadpage(item.url, headers=headers, cookies=False).data - patron = 'class="player-content"><iframe src="(.*?)"' - matches = re.compile(patron, re.DOTALL).findall(data) - - for option in matches: - if 'allplayer' in option: - url = 'http:/' + option.replace('//', '/') - data = httptools.downloadpage(url, headers=headers, cookies=False).data - packed = scrapertools.find_single_match(data, "<div id='allplayer'>.*?(eval\(function\(p,a,c,k.*?\)\)\))") - if packed: - unpacked = unpack(packed) - video_urls = [] - if "vimeocdn" in unpacked: - - streams = scrapertools.find_multiple_matches(unpacked, - "{file:'(.*?)',type:'video/.*?',label:'(.*?)'") - for video_url, quality in streams: - video_urls.append([video_url, quality]) - else: - doc_id = scrapertools.find_single_match(unpacked, 'driveid=(.*?)&') - doc_url = "http://docs.google.com/get_video_info?docid=%s" % doc_id - response = httptools.downloadpage(doc_url, cookies=False) - cookies = "" - cookie = response.headers["set-cookie"].split("HttpOnly, ") - for c in cookie: - cookies += c.split(";", 1)[0] + "; " - - data = response.data.decode('unicode-escape') - data = urllib.unquote_plus(urllib.unquote_plus(data)) - headers_string = "|Cookie=" + cookies - - url_streams = scrapertools.find_single_match(data, 'url_encoded_fmt_stream_map=(.*)') - streams = scrapertools.find_multiple_matches(url_streams, - 'itag=(\d+)&url=(.*?)(?:;.*?quality=.*?(?:,|&)|&quality=.*?(?:,|&))') - - itags = {'18': '360p', '22': '720p', '34': '360p', '35': '480p', '37': '1080p', '59': '480p'} - for itag, video_url in streams: - video_url += headers_string - video_urls.append([video_url, itags[itag]]) - - for video_item in video_urls: - calidad = video_item[1] - title = '%s [%s]' % (item.contentTitle, calidad) - url = video_item[0] - - if url not in duplicado: - itemlist.append( - Item(channel=item.channel, - action='play', - title=title, - url=url, - thumbnail=item.thumbnail, - plot=item.plot, - fanart=item.fanart, - contentTitle=item.contentTitle, - language=IDIOMAS['latino'], - server='directo', - quality=CALIDADES[calidad], - context=item.context - )) - duplicado.append(url) - else: - itemlist.extend(servertools.find_video_items(data=option)) - - for videoitem in itemlist: - - if 'Enlace' in videoitem.title: - videoitem.channel = item.channel - videoitem.title = item.contentTitle + ' (' + videoitem.server + ')' - videoitem.language = 'latino' - videoitem.quality = 'default' - return itemlist - - def findvideos(item): logger.info() itemlist = [] - itemlist = get_url(item) + #itemlist = get_url(item) + data = httptools.downloadpage(item.url).data + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) + patron = 'id=(tab\d+)><div class=movieplay><(?:iframe|script) src=(.*?)(?:scrolling|><\/script>)' + matches = re.compile(patron, re.DOTALL).findall(data) - # Requerido para FilterTools + for option, urls in matches: + quality = scrapertools.find_single_match(data, '<div class=les-content><a href=#%s>(.*?)<\/a><\/div>'%option) + title = '%s (%s)' % (item.title, quality) + if 'content' in urls: + urls = '%s%s'%('http:',urls) + hidden_data = httptools.downloadpage(urls).data + hidden_data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", hidden_data) + patron = 'sources: \[{file: (.*?),' + matches = re.compile(patron, re.DOTALL).findall(hidden_data) - itemlist = filtertools.get_links(itemlist, item, list_language) + for videoitem in matches: - # Requerido para AutoPlay - - autoplay.start(itemlist, item) + new_item = Item( + channel = item.channel, + url = videoitem, + title = title, + contentTitle = item.title, + action = 'play', + quality = quality + ) + itemlist.append(new_item) + else: + new_item = Item( + channel=item.channel, + url=urls, + title=title, + contentTitle=item.title, + action='play', + quality = quality + ) + itemlist.append(new_item) + itemlist = servertools.get_servers_itemlist(itemlist) if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findvideos': itemlist.append( diff --git a/plugin.video.alfa/channels/doramastv.json b/plugin.video.alfa/channels/doramastv.json index 767edadc..5ab1403f 100755 --- a/plugin.video.alfa/channels/doramastv.json +++ b/plugin.video.alfa/channels/doramastv.json @@ -3,7 +3,7 @@ "name": "DoramasTV", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "doramastv.png", "banner": "doramastv.png", "version": 1, diff --git a/plugin.video.alfa/channels/downloads.json b/plugin.video.alfa/channels/downloads.json index bed761f0..f38f25a1 100755 --- a/plugin.video.alfa/channels/downloads.json +++ b/plugin.video.alfa/channels/downloads.json @@ -3,7 +3,7 @@ "name": "Descargas", "active": false, "adult": false, - "language": "es", + "language": ["*"], "version": 1, "changes": [ { diff --git a/plugin.video.alfa/channels/ecarteleratrailers.json b/plugin.video.alfa/channels/ecarteleratrailers.json index 5b66a830..7def6f7c 100755 --- a/plugin.video.alfa/channels/ecarteleratrailers.json +++ b/plugin.video.alfa/channels/ecarteleratrailers.json @@ -3,7 +3,7 @@ "name": "Trailers ecartelera", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "ecarteleratrailers.png", "banner": "ecarteleratrailers.png", "version": 1, diff --git a/plugin.video.alfa/channels/ecarteleratrailers.py b/plugin.video.alfa/channels/ecarteleratrailers.py index a6bfb4dd..04ad7129 100755 --- a/plugin.video.alfa/channels/ecarteleratrailers.py +++ b/plugin.video.alfa/channels/ecarteleratrailers.py @@ -41,7 +41,7 @@ def mainlist(item): logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, fanart=thumbnail, - plot=plot, server="directo", folder=False)) + plot=plot,folder=False)) # ------------------------------------------------------ # Extrae la página siguiente diff --git a/plugin.video.alfa/channels/elitetorrent.json b/plugin.video.alfa/channels/elitetorrent.json index 5287e4f4..12372cf1 100644 --- a/plugin.video.alfa/channels/elitetorrent.json +++ b/plugin.video.alfa/channels/elitetorrent.json @@ -3,7 +3,7 @@ "name": "Elite Torrent", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "elitetorrent.png", "banner": "elitetorrent.png", "version": 2, diff --git a/plugin.video.alfa/channels/elsenordelanillo.json b/plugin.video.alfa/channels/elsenordelanillo.json index 101f0a31..692d99b1 100755 --- a/plugin.video.alfa/channels/elsenordelanillo.json +++ b/plugin.video.alfa/channels/elsenordelanillo.json @@ -3,7 +3,7 @@ "name": "El señor del anillo", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "elsenordelanillo.png", "banner": "elsenordelanillo.png", "version": 1, @@ -18,7 +18,6 @@ } ], "categories": [ - "latino", "movie" ] } \ No newline at end of file diff --git a/plugin.video.alfa/channels/eporner.json b/plugin.video.alfa/channels/eporner.json index 4ddc9dfe..f364548a 100755 --- a/plugin.video.alfa/channels/eporner.json +++ b/plugin.video.alfa/channels/eporner.json @@ -3,7 +3,7 @@ "name": "Eporner", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "eporner.png", "banner": "eporner.png", "version": 1, diff --git a/plugin.video.alfa/channels/erotik.json b/plugin.video.alfa/channels/erotik.json index 661c670d..89cdafce 100755 --- a/plugin.video.alfa/channels/erotik.json +++ b/plugin.video.alfa/channels/erotik.json @@ -3,7 +3,7 @@ "name": "Erotik", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "http://www.youfreeporntube.com/uploads/custom-logo.png", "banner": "http://www.youfreeporntube.com/uploads/custom-logo.png", "version": 1, diff --git a/plugin.video.alfa/channels/estadepelis.json b/plugin.video.alfa/channels/estadepelis.json index 5c51852b..b76cdb29 100755 --- a/plugin.video.alfa/channels/estadepelis.json +++ b/plugin.video.alfa/channels/estadepelis.json @@ -1,12 +1,9 @@ { "id": "estadepelis", "name": "Estadepelis", - "compatible": { - "addon_version": "4.3" - }, "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s24.postimg.org/nsgit7fhh/estadepelis.png", "banner": "https://s28.postimg.org/ud0l032ul/estadepelis_banner.png", "version": 1, @@ -33,7 +30,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/estrenosgo.json b/plugin.video.alfa/channels/estrenosgo.json index 94c0678c..45bf0de6 100755 --- a/plugin.video.alfa/channels/estrenosgo.json +++ b/plugin.video.alfa/channels/estrenosgo.json @@ -3,7 +3,7 @@ "name": "EstrenosGo", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "fanart": "https://github.com/master-1970/resources/raw/master/images/fanart/estrenosgo.png", "thumbnail": "https://github.com/master-1970/resources/raw/master/images/squares/estrenosgo.png", "banner": "estrenosgo.png", @@ -24,6 +24,7 @@ ], "categories": [ "movie", - "tvshow" + "tvshow", + "torrent" ] } \ No newline at end of file diff --git a/plugin.video.alfa/channels/estrenosgo.py b/plugin.video.alfa/channels/estrenosgo.py old mode 100755 new mode 100644 index 46bdd7cb..58fdddad --- a/plugin.video.alfa/channels/estrenosgo.py +++ b/plugin.video.alfa/channels/estrenosgo.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re - +from channelselector import get_thumb from core import channeltools from core import httptools from core import scrapertools @@ -166,7 +166,8 @@ def findvideos(item): title="Ver %s en %s%s" % ( capitulo.strip(), s[0][2].capitalize(), idioma), thumbnail2=item.thumbnail, - thumbnail=config.get_thumb("server_" + s[0][2] + ".png"))) + thumbnail=get_thumb("server_" + s[0][2] + ".png"), + language = idioma)) else: import os for s in servertools.findvideos(data): @@ -174,7 +175,8 @@ def findvideos(item): title="Ver en %s%s" % (s[2].capitalize(), idioma), thumbnail2=item.thumbnail, thumbnail=os.path.join(config.get_runtime_path(), "resources", "media", - "servers", "server_" + s[2] + ".png"))) + "servers", "server_" + s[2] + ".png"), + language = idioma)) # Insertar items "Buscar trailer" y "Añadir a la videoteca" if itemlist and item.extra == "movie": diff --git a/plugin.video.alfa/channels/filesmonster_catalogue.json b/plugin.video.alfa/channels/filesmonster_catalogue.json index 0a29e612..9d5422c9 100755 --- a/plugin.video.alfa/channels/filesmonster_catalogue.json +++ b/plugin.video.alfa/channels/filesmonster_catalogue.json @@ -3,7 +3,7 @@ "name": "Filesmonster Catalogue", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "filesmonster_catalogue.png", "banner": "filesmonster_catalogue.png", "version": 1, diff --git a/plugin.video.alfa/channels/freecambay.json b/plugin.video.alfa/channels/freecambay.json index b9b0beff..5f43e5ab 100755 --- a/plugin.video.alfa/channels/freecambay.json +++ b/plugin.video.alfa/channels/freecambay.json @@ -1,7 +1,7 @@ { "id": "freecambay", "name": "FreeCamBay", - "language": "es", + "language": ["*"], "active": true, "adult": true, "version": 1, diff --git a/plugin.video.alfa/channels/gmobi.json b/plugin.video.alfa/channels/gmobi.json new file mode 100644 index 00000000..cc8951c4 --- /dev/null +++ b/plugin.video.alfa/channels/gmobi.json @@ -0,0 +1,30 @@ +{ + "id": "gmobi", + "name": "gmobi", + "active": true, + "adult": false, + "language": ["cast", "lat"], + "version": 1, + "thumbnail": "http://gnula.mobi/wp-content/uploads/2016/08/Untitled-6.png", + "banner": "", + "changes": [ + { + "date": "25/08/2017", + "description": "Nuevo canal" + } + ], + "categories": [ + "movie", + "adult" + ], + "settings": [ + { + "id": "include_in_global_search", + "type": "bool", + "label": "Incluir en busqueda global", + "default": false, + "enabled": false, + "visible": false + } + ] +} diff --git a/plugin.video.alfa/channels/gmobi.py b/plugin.video.alfa/channels/gmobi.py new file mode 100644 index 00000000..b768f4af --- /dev/null +++ b/plugin.video.alfa/channels/gmobi.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------ +# Alfa +# ------------------------------------------------------------ + +import urlparse,urllib2,urllib,re +import os, sys + +from core import httptools +from core import tmdb +from core import jsontools as json +from core import scrapertools +from core import servertools +from core.item import Item +from platformcode import config, logger + + +def mainlist(item): + logger.info() + itemlist = [] + itemlist.append(item.clone(title="Novedades", action="peliculas", url="http://gnula.mobi/")) + itemlist.append(item.clone(title="Castellano", action="peliculas", + url="http://www.gnula.mobi/tag/esp)anol/")) + itemlist.append(item.clone(title="Latino", action="peliculas", url="http://gnula.mobi/tag/latino/")) + itemlist.append(item.clone(title="VOSE", action="peliculas", url="http://gnula.mobi/tag/subtitulada/")) + + itemlist.append(item.clone(title="Buscar", action="search")) + return itemlist + + +def search(item, texto): + logger.info() + texto = texto.replace(" ", "+") + item.url = "http://gnula.mobi/?s=%s" % texto + + try: + return sub_search(item) + except: + import sys + for line in sys.exc_info(): + logger.error("%s" % line) + return [] + + +def sub_search(item): + logger.info() + + itemlist = [] + + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t| |<br>", "", data) + + patron = '<div class="row">.*?<a href="([^"]+)" title="([^"]+)">.*?<img src="(.*?)" title' + matches = scrapertools.find_multiple_matches(data, patron) + + for url,name,img in matches: + itemlist.append(item.clone(title=name, url=url, action="findvideos", show=name, thumbnail=img)) + + paginacion = scrapertools.find_single_match(data, '<a href="([^"]+)" ><i class="glyphicon ' + 'glyphicon-chevron-right" aria-hidden="true"></i>') + + if paginacion: + itemlist.append(channel=item.channel, action="sub_search", title="Next page >>" , url=paginacion) + + return itemlist + +def peliculas(item): + logger.info() + itemlist = [] + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t| |<br>", "", data) + patron = '<div class="col-mt-5 postsh">.*?href="(.*?)" title="(.*?)".*?under-title">(.*?)<.*?src="(.*?)"' + matches = re.compile(patron,re.DOTALL).findall(data) + + for scrapedurl, scrapedyear, scrapedtitle, scrapedthumbnail in matches: + + url = scrapedurl + title = scrapedtitle + year = scrapertools.find_single_match(scrapedyear, r'.*?\((\d{4})\)') + thumbnail = scrapedthumbnail + new_item =Item (channel = item.channel, action="findvideos", title=title, contentTitle=title, url=url, + thumbnail=thumbnail, infoLabels = {'year':year}) + if year: + tmdb.set_infoLabels_item(new_item) + + itemlist.append(new_item) + + next_page_url = scrapertools.find_single_match(data,'<link rel="next" href="(.*?)"\/>') + if next_page_url!="": + next_page_url = urlparse.urljoin(item.url,next_page_url) + itemlist.append(item.clone(action="peliculas", title="Siguiente >>", text_color="yellow", + url=next_page_url)) + + return itemlist + diff --git a/plugin.video.alfa/channels/gnula.json b/plugin.video.alfa/channels/gnula.json index cea1c756..36decac6 100755 --- a/plugin.video.alfa/channels/gnula.json +++ b/plugin.video.alfa/channels/gnula.json @@ -3,7 +3,7 @@ "name": "Gnula", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "gnula.png", "banner": "gnula.png", "version": 1, @@ -18,7 +18,6 @@ } ], "categories": [ - "latino", "movie" ] } \ No newline at end of file diff --git a/plugin.video.alfa/channels/gnula.py b/plugin.video.alfa/channels/gnula.py index 0e5d47d1..c9306666 100755 --- a/plugin.video.alfa/channels/gnula.py +++ b/plugin.video.alfa/channels/gnula.py @@ -1,24 +1,24 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- import re -import urlparse +from core import httptools from core import scrapertools from core import servertools from core.item import Item from platformcode import logger +host = "http://gnula.nu/" def mainlist(item): logger.info() itemlist = [] itemlist.append(Item(channel=item.channel, title="Estrenos", action="peliculas", - url="http://gnula.nu/peliculas-online/lista-de-peliculas-online-parte-1/", viewmode="movie")) + url= host +"peliculas-online/lista-de-peliculas-online-parte-1/", viewmode="movie")) itemlist.append( - Item(channel=item.channel, title="Generos", action="generos", url="http://gnula.nu/generos/lista-de-generos/")) + Item(channel=item.channel, title="Generos", action="generos", url= host + "generos/lista-de-generos/")) itemlist.append(Item(channel=item.channel, title="Recomendadas", action="peliculas", - url="http://gnula.nu/peliculas-online/lista-de-peliculas-recomendadas/", viewmode="movie")) - # itemlist.append( Item(channel=item.channel, title="Portada" , action="portada" , url="http://gnula.nu/")) + url= host + "peliculas-online/lista-de-peliculas-recomendadas/", viewmode="movie")) return itemlist @@ -26,23 +26,23 @@ def generos(item): logger.info() itemlist = [] - data = scrapertools.cache_page(item.url) - - # <span style="font-weight: bold;">Lista de géneros</span><br/> + data = httptools.downloadpage(item.url).data data = scrapertools.find_single_match(data, '<spa[^>]+>Lista de g(.*?)/table') - # <strong>Historia antigua</strong> [<a href="http://gnula.nu/generos/lista-de-peliculas-del-genero-historia-antigua/" patron = '<strong>([^<]+)</strong> .<a href="([^"]+)"' matches = re.compile(patron, re.DOTALL).findall(data) for genero, scrapedurl in matches: title = scrapertools.htmlclean(genero) plot = "" - url = urlparse.urljoin(item.url, scrapedurl) + url = item.url + scrapedurl thumbnail = "" - logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") - itemlist.append( - Item(channel=item.channel, action='peliculas', title=title, url=url, thumbnail=thumbnail, plot=plot, - extra=title, viewmode="movie")) + itemlist.append(Item(channel = item.channel, + action = 'peliculas', + title = title, + url = url, + thumbnail = thumbnail, + plot = plot, + viewmode = "movie")) itemlist = sorted(itemlist, key=lambda item: item.title) @@ -52,17 +52,9 @@ def generos(item): def peliculas(item): logger.info() - ''' - <a class="Ntooltip" href="http://gnula.nu/comedia-romantica/ver-with-this-ring-2015-online/">With This Ring<span><br/> - <img src="http://gnula.nu/wp-content/uploads/2015/06/With_This_Ring2.gif"></span></a> [<span style="color: #33ccff;">18/07/15</span> <span style="color: #33ff33;">(VS)</span><span style="color: red;">(VC)</span><span style="color: #cc66cc;">(VL)</span>] [<span style="color: #ffcc99;">HD-R</span>]—–<strong>Comedia, Romántica</strong><br/> - ''' - ''' - <a class="Ntooltip" href="http://gnula.nu/aventuras/ver-las-aventuras-de-tintin-el-secreto-del-unicornio-2011-online/">The Adventures of Tintin<span><br /> - <img src="http://gnula.nu/wp-content/uploads/2015/07/The_Adventures_of_Tintin_Secret_of_the_Unicorn2.gif"></span></a> (2011) [<span style="color: #33ccff;">10/07/15</span> <span style="color: #33ff33;">(VS)</span><span style="color: red;">(VC)</span><span style="color: #cc66cc;">(VL)</span>] [<span style="color: #ffcc99;">DVD-R</span>]—–<strong>Animación, Infantil, Aventuras</strong><br /> - ''' # Descarga la página - data = scrapertools.cachePage(item.url) - patron = '<a class="Ntooltip" href="([^"]+)">([^<]+)<span><br[^<]+' + data = httptools.downloadpage(item.url).data + patron = '<a class="Ntooltip" href="([^"]+)">([^<]+)<span><br[^<]+' patron += '<img src="([^"]+)"></span></a>(.*?)<br' matches = re.compile(patron, re.DOTALL).findall(data) @@ -70,34 +62,57 @@ def peliculas(item): for scrapedurl, scrapedtitle, scrapedthumbnail, resto in matches: plot = scrapertools.htmlclean(resto).strip() title = scrapedtitle + " " + plot - fulltitle = title contentTitle = scrapedtitle - url = urlparse.urljoin(item.url, scrapedurl) - thumbnail = urlparse.urljoin(item.url, scrapedthumbnail) - logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") - itemlist.append(Item(channel=item.channel, action='findvideos', title=title, fulltitle=fulltitle, url=url, - thumbnail=thumbnail, plot=plot, extra=title, hasContentDetails=True, - contentTitle=contentTitle, contentThumbnail=thumbnail, - contentType="movie", context=["buscar_trailer"])) - + url = item.url + scrapedurl + itemlist.append(Item(channel = item.channel, + action = 'findvideos', + title = title, + url = url, + thumbnail = scrapedthumbnail, + plot = plot, + hasContentDetails = True, + contentTitle = contentTitle, + contentType = "movie", + context = ["buscar_trailer"] + )) return itemlist def findvideos(item): logger.info("item=" + item.tostring()) + itemlist = [] # Descarga la página para obtener el argumento - data = scrapertools.cachePage(item.url) + data = httptools.downloadpage(item.url).data item.plot = scrapertools.find_single_match(data, '<div class="entry">(.*?)<div class="iframes">') item.plot = scrapertools.htmlclean(item.plot).strip() item.contentPlot = item.plot + patron = 'Ver película online.*?>.*?>([^<]+)' + scrapedopcion = scrapertools.find_single_match(data, patron) + titulo_opcional = scrapertools.find_single_match(scrapedopcion, ".*?, (.*)").upper() + bloque = scrapertools.find_multiple_matches(data, 'contenedor_tab.*?/table') + cuenta = 0 + for datos in bloque: + cuenta = cuenta + 1 + patron = '<em>(opción %s.*?)</em>' %cuenta + scrapedopcion = scrapertools.find_single_match(data, patron) + titulo_opcion = "(" + scrapertools.find_single_match(scrapedopcion, "op.*?, (.*)").upper() + ")" + if "TRAILER" in titulo_opcion or titulo_opcion == "()": + titulo_opcion = "(" + titulo_opcional + ")" + urls = scrapertools.find_multiple_matches(datos, '(?:src|href)="([^"]+)') + titulo = "Ver en %s " + titulo_opcion + for url in urls: + itemlist.append(Item(channel = item.channel, + action = "play", + contentThumbnail = item.thumbnail, + fulltitle = item.contentTitle, + title = titulo, + url = url + )) + itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) + return itemlist - newthumbnail = scrapertools.find_single_match(data, - '<div class="entry"[^<]+<p align="center"><img alt="[^"]+" src="([^"]+)"') - if newthumbnail != "": - item.thumbnail = newthumbnail - item.contentThumbnail = newthumbnail - logger.info("plot=" + item.plot) - - return servertools.find_video_items(item=item, data=data) +def play(item): + item.thumbnail = item.contentThumbnail + return [item] diff --git a/plugin.video.alfa/channels/guaridavalencianista.json b/plugin.video.alfa/channels/guaridavalencianista.json index fcc8b8cd..fb8d26ed 100755 --- a/plugin.video.alfa/channels/guaridavalencianista.json +++ b/plugin.video.alfa/channels/guaridavalencianista.json @@ -3,7 +3,7 @@ "name": "La Guarida valencianista", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "guaridavalencianista.png", "banner": "guaridavalencianista.png", "version": 1, diff --git a/plugin.video.alfa/channels/hdfull.json b/plugin.video.alfa/channels/hdfull.json index c1512fa4..9c33d55e 100755 --- a/plugin.video.alfa/channels/hdfull.json +++ b/plugin.video.alfa/channels/hdfull.json @@ -3,7 +3,7 @@ "name": "HDFull", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "hdfull.png", "banner": "hdfull.png", "version": 1, diff --git a/plugin.video.alfa/channels/hdfull.py b/plugin.video.alfa/channels/hdfull.py old mode 100755 new mode 100644 index 5156104b..f09fa162 --- a/plugin.video.alfa/channels/hdfull.py +++ b/plugin.video.alfa/channels/hdfull.py @@ -273,13 +273,13 @@ def listado_series(item): def fichas(item): logger.info() itemlist = [] - + textoidiomas='' + infoLabels=dict() ## Carga estados status = jsontools.load(httptools.downloadpage(host + '/a/status/all').data) if item.title == "Buscar...": data = agrupa_datos(httptools.downloadpage(item.url, post=item.extra).data) - s_p = scrapertools.get_match(data, '<h3 class="section-title">(.*?)<div id="footer-wrapper">').split( '<h3 class="section-title">') @@ -320,10 +320,12 @@ def fichas(item): if scrapedlangs != ">": textoidiomas = extrae_idiomas(scrapedlangs) + #Todo Quitar el idioma title += bbcode_kodi2html(" ( [COLOR teal][B]" + textoidiomas + "[/B][/COLOR])") if scrapedrating != ">": valoracion = re.sub(r'><[^>]+>(\d+)<b class="dec">(\d+)</b>', r'\1,\2', scrapedrating) + infoLabels['rating']=valoracion title += bbcode_kodi2html(" ([COLOR orange]" + valoracion + "[/COLOR])") url = urlparse.urljoin(item.url, scrapedurl) @@ -348,7 +350,8 @@ def fichas(item): itemlist.append( Item(channel=item.channel, action=action, title=title, url=url, fulltitle=title, thumbnail=thumbnail, - show=show, folder=True, contentType=contentType, contentTitle=contentTitle)) + show=show, folder=True, contentType=contentType, contentTitle=contentTitle, + language =textoidiomas, infoLabels=infoLabels)) ## Paginación next_page_url = scrapertools.find_single_match(data, '<a href="([^"]+)">.raquo;</a>') @@ -424,7 +427,7 @@ def episodios(item): for episode in episodes: thumbnail = host + "/thumbs/" + episode['thumbnail'] - + language = episode['languages'] temporada = episode['season'] episodio = episode['episode'] if len(episodio) == 1: episodio = '0' + episodio @@ -465,7 +468,8 @@ def episodios(item): 'id'] + ";3" itemlist.append(Item(channel=item.channel, action="findvideos", title=title, fulltitle=title, url=url, - thumbnail=thumbnail, show=item.show, folder=True, contentType="episode")) + thumbnail=thumbnail, show=item.show, folder=True, contentType="episode", + language=language)) if config.get_videolibrary_support() and len(itemlist) > 0: itemlist.append(Item(channel=item.channel, title="Añadir esta serie a la videoteca", url=url_targets, @@ -610,7 +614,6 @@ def findvideos(item): itemlist = [] ## Carga estados status = jsontools.load(httptools.downloadpage(host + '/a/status/all').data) - url_targets = item.url ## Vídeos @@ -794,11 +797,14 @@ def agrupa_datos(data): def extrae_idiomas(bloqueidiomas): logger.info("idiomas=" + bloqueidiomas) + # Todo cambiar por lista + #textoidiomas=[] + textoidiomas = '' patronidiomas = '([a-z0-9]+).png"' idiomas = re.compile(patronidiomas, re.DOTALL).findall(bloqueidiomas) - textoidiomas = "" for idioma in idiomas: - textoidiomas = textoidiomas + idioma.upper() + " " + textoidiomas = textoidiomas + idioma +" " + #textoidiomas.append(idioma.upper()) return textoidiomas diff --git a/plugin.video.alfa/channels/hentaienespanol.json b/plugin.video.alfa/channels/hentaienespanol.json index 47a8ba67..ac517505 100755 --- a/plugin.video.alfa/channels/hentaienespanol.json +++ b/plugin.video.alfa/channels/hentaienespanol.json @@ -3,7 +3,7 @@ "name": "HentaiEnEspañol", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "https://s11.postimg.org/cmuwcvvpf/hentaienespanol.png", "banner": "https://s3.postimg.org/j3qkfut8z/hentaienespanol_banner.png", "version": 1, diff --git a/plugin.video.alfa/channels/hentaiid.json b/plugin.video.alfa/channels/hentaiid.json index d86cc149..7299938a 100755 --- a/plugin.video.alfa/channels/hentaiid.json +++ b/plugin.video.alfa/channels/hentaiid.json @@ -3,7 +3,7 @@ "name": "Hentai ID", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "https://dl.dropboxusercontent.com/u/30248079/hentai_id.png", "banner": "https://dl.dropboxusercontent.com/u/30248079/hentai_id2.png", "version": 1, diff --git a/plugin.video.alfa/channels/idocumentales.json b/plugin.video.alfa/channels/idocumentales.json index 203c5f2a..3f66b565 100755 --- a/plugin.video.alfa/channels/idocumentales.json +++ b/plugin.video.alfa/channels/idocumentales.json @@ -3,7 +3,7 @@ "name": "Idocumentales", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "https://s27.postimg.org/pjq3y552b/idocumentales.png", "banner": "https://s16.postimg.org/6d8bh1z1x/idocumentales_banner.png", "version": 1, diff --git a/plugin.video.alfa/channels/inkapelis.json b/plugin.video.alfa/channels/inkapelis.json index a8e94caa..c7979090 100755 --- a/plugin.video.alfa/channels/inkapelis.json +++ b/plugin.video.alfa/channels/inkapelis.json @@ -3,7 +3,7 @@ "name": "Inkapelis", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "changes": [ { "date": "12/03/2017", @@ -23,8 +23,7 @@ "banner": "inkapelis.png", "categories": [ "movie", - "vos", - "latino" + "vos" ], "settings": [ { diff --git a/plugin.video.alfa/channels/inkapelis.py b/plugin.video.alfa/channels/inkapelis.py old mode 100755 new mode 100644 index 29d7bf2f..0b599915 --- a/plugin.video.alfa/channels/inkapelis.py +++ b/plugin.video.alfa/channels/inkapelis.py @@ -352,7 +352,8 @@ def findvideos(item): if server == "Ul": server = "Uploaded" title = "%s [%s][%s]" % (server, idioma, calidad) - itemlist.append(item.clone(action="play", title=title, url=url)) + itemlist.append(item.clone(action="play", title=title, url=url, language = idioma, quality = calidad, + server = server)) patron = 'id="(embed[0-9]*)".*?<div class="calishow">(.*?)<.*?src="([^"]+)"' matches = scrapertools.find_multiple_matches(data, patron) @@ -362,7 +363,8 @@ def findvideos(item): title = "Directo" idioma = scrapertools.find_single_match(data, 'href="#%s".*?>([^<]+)<' % id_embed) title = "%s [%s][%s]" % (title.capitalize(), idioma, calidad) - itemlist.append(item.clone(action="play", title=title, url=url)) + itemlist.append(item.clone(action="play", title=title, url=url, language = idioma, quality = calidad, + server = server)) if itemlist: if not config.get_setting('menu_trailer', item.channel): diff --git a/plugin.video.alfa/channels/javtasty.json b/plugin.video.alfa/channels/javtasty.json index 1eb1a0f1..03abfa4e 100755 --- a/plugin.video.alfa/channels/javtasty.json +++ b/plugin.video.alfa/channels/javtasty.json @@ -1,7 +1,7 @@ { "id": "javtasty", "name": "JavTasty", - "language": "es", + "language": ["*"], "active": true, "adult": true, "version": 1, diff --git a/plugin.video.alfa/channels/javus.json b/plugin.video.alfa/channels/javus.json index 1ce77a1b..16f2c5d4 100755 --- a/plugin.video.alfa/channels/javus.json +++ b/plugin.video.alfa/channels/javus.json @@ -3,7 +3,7 @@ "name": "javus.net", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "https://s15.postimg.org/pzd3h4vy3/javus.png", "banner": "https://s21.postimg.org/5pqzedp2f/javus_banner.png", "version": 1, diff --git a/plugin.video.alfa/channels/jkanime.json b/plugin.video.alfa/channels/jkanime.json index 59b4b84c..d1c3a62b 100755 --- a/plugin.video.alfa/channels/jkanime.json +++ b/plugin.video.alfa/channels/jkanime.json @@ -3,7 +3,7 @@ "name": "JKanime", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "jkanime.png", "banner": "jkanime.png", "version": 1, diff --git a/plugin.video.alfa/channels/jkanime.py b/plugin.video.alfa/channels/jkanime.py index 523247eb..59cda535 100755 --- a/plugin.video.alfa/channels/jkanime.py +++ b/plugin.video.alfa/channels/jkanime.py @@ -3,7 +3,9 @@ import re import urlparse +from core import httptools from core import scrapertools +from core import servertools from core.item import Item from platformcode import logger @@ -11,7 +13,7 @@ from platformcode import logger def mainlist(item): logger.info() - itemlist = [] + itemlist = list() itemlist.append( Item(channel=item.channel, action="ultimos_capitulos", title="Últimos Capitulos", url="http://jkanime.net/")) itemlist.append(Item(channel=item.channel, action="ultimos", title="Últimos", url="http://jkanime.net/")) @@ -25,7 +27,7 @@ def mainlist(item): def ultimos_capitulos(item): logger.info() itemlist = [] - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data data = scrapertools.get_match(data, '<ul class="ratedul">.+?</ul>') data = data.replace('\t', '') @@ -43,7 +45,8 @@ def ultimos_capitulos(item): logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") itemlist.append( - Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, plot=plot)) + Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, plot=plot, + show=scrapedtitle.strip(), fulltitle=title)) return itemlist @@ -67,7 +70,7 @@ def search(item, texto): def ultimos(item): logger.info() itemlist = [] - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data data = scrapertools.get_match(data, '<ul class="latestul">(.*?)</ul>') patron = '<a href="([^"]+)">([^<]+)<' @@ -90,7 +93,7 @@ def generos(item): logger.info() itemlist = [] - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data data = scrapertools.get_match(data, '<div class="genres">(.*?)</div>') patron = '<a href="([^"]+)">([^<]+)</a>' @@ -114,7 +117,7 @@ def letras(item): logger.info() itemlist = [] - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data data = scrapertools.get_match(data, '<ul class="animelet">(.*?)</ul>') patron = '<a href="([^"]+)">([^<]+)</a>' @@ -138,24 +141,9 @@ def series(item): logger.info() # Descarga la pagina - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data # Extrae las entradas - ''' - <table class="search"> - <tr> - <td rowspan="2"> - <a href="http://jkanime.net/basilisk-kouga-ninpou-chou/"><img src="http://jkanime.net/assets/images/animes/thumbnail/basilisk-kouga-ninpou-chou.jpg" width="50" /></a> - </td> - <td><a class="titl" href="http://jkanime.net/basilisk-kouga-ninpou-chou/">Basilisk: Kouga Ninpou Chou</a></td> - <td rowspan="2" style="width:50px; text-align:center;">Serie</td> - <td rowspan="2" style="width:50px; text-align:center;" >24 Eps</td> - </tr> - <tr> - <td><p>Basilisk, considerada una de las mejores series del genero ninja, nos narra la historia de dos clanes ninja separados por el odio entre dos familias. Los actuales representantes, Kouga Danjo del clan Kouga y Ogen del clan… <a class="next" href="http://jkanime.net/basilisk-kouga-ninpou-chou/">seguir leyendo</a></p></td> - </tr> - </table> - ''' patron = '<table class="search[^<]+' patron += '<tr[^<]+' patron += '<td[^<]+' @@ -181,7 +169,7 @@ def series(item): itemlist.append( Item(channel=item.channel, action="episodios", title=title, url=url, thumbnail=thumbnail, fanart=thumbnail, - plot=plot, extra=extra)) + plot=plot, extra=extra, show=scrapedtitle.strip())) try: siguiente = scrapertools.get_match(data, '<a class="listsiguiente" href="([^"]+)" >Resultados Siguientes') @@ -198,7 +186,7 @@ def series(item): return itemlist -def getPagesAndEpisodes(data): +def get_pages_and_episodes(data): results = re.findall('href="#pag([0-9]+)">[0-9]+ - ([0-9]+)', data) if results: return int(results[-1][0]), int(results[-1][1]) @@ -210,37 +198,30 @@ def episodios(item): itemlist = [] # Descarga la pagina - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data scrapedplot = scrapertools.get_match(data, '<meta name="description" content="([^"]+)"/>') scrapedthumbnail = scrapertools.find_single_match(data, '<div class="separedescrip">.*?src="([^"]+)"') idserie = scrapertools.get_match(data, "ajax/pagination_episodes/(\d+)/") logger.info("idserie=" + idserie) - if " Eps" in item.extra and not "Desc" in item.extra: + if " Eps" in item.extra and "Desc" not in item.extra: caps_x = item.extra caps_x = caps_x.replace(" Eps", "") capitulos = int(caps_x) paginas = capitulos / 10 + (capitulos % 10 > 0) else: - paginas, capitulos = getPagesAndEpisodes(data) + paginas, capitulos = get_pages_and_episodes(data) logger.info("idserie=" + idserie) - for numero in range(1, paginas + 1): + for num_pag in range(1, paginas + 1): - numero_pagina = str(numero) - headers = [] - headers.append( - ["User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:16.0) Gecko/20100101 Firefox/16.0"]) - headers.append(["Referer", item.url]) - data2 = scrapertools.cache_page( - "http://jkanime.net/ajax/pagination_episodes/" + idserie + "/" + numero_pagina + "/") - logger.info("data2=" + data2) + numero_pagina = str(num_pag) + headers = {"Referer": item.url} + data2 = scrapertools.cache_page("http://jkanime.net/ajax/pagination_episodes/%s/%s/" % (idserie, numero_pagina), + headers=headers) + # logger.info("data2=" + data2) - ''' - [{"number":"1","title":"Rose of Versailles - 1"},{"number":"2","title":"Rose of Versailles - 2"},{"number":"3","title":"Rose of Versailles - 3"},{"number":"4","title":"Rose of Versailles - 4"},{"number":"5","title":"Rose of Versailles - 5"},{"number":"6","title":"Rose of Versailles - 6"},{"number":"7","title":"Rose of Versailles - 7"},{"number":"8","title":"Rose of Versailles - 8"},{"number":"9","title":"Rose of Versailles - 9"},{"number":"10","title":"Rose of Versailles - 10"}] - [{"id":"14199","title":"GetBackers - 1","number":"1","animes_id":"122","timestamp":"2012-01-04 16:59:30"},{"id":"14200","title":"GetBackers - 2","number":"2","animes_id":"122","timestamp":"2012-01-04 16:59:30"},{"id":"14201","title":"GetBackers - 3","number":"3","animes_id":"122","timestamp":"2012-01-04 16:59:30"},{"id":"14202","title":"GetBackers - 4","number":"4","animes_id":"122","timestamp":"2012-01-04 16:59:30"},{"id":"14203","title":"GetBackers - 5","number":"5","animes_id":"122","timestamp":"2012-01-04 16:59:30"},{"id":"14204","title":"GetBackers - 6","number":"6","animes_id":"122","timestamp":"2012-01-04 16:59:30"},{"id":"14205","title":"GetBackers - 7","number":"7","animes_id":"122","timestamp":"2012-01-04 16:59:30"},{"id":"14206","title":"GetBackers - 8","number":"8","animes_id":"122","timestamp":"2012-01-04 16:59:30"},{"id":"14207","title":"GetBackers - 9","number":"9","animes_id":"122","timestamp":"2012-01-04 16:59:30"},{"id":"14208","title":"GetBackers - 10","number":"10","animes_id":"122","timestamp":"2012-01-04 16:59:30"}] - ''' patron = '"number"\:"(\d+)","title"\:"([^"]+)"' matches = re.compile(patron, re.DOTALL).findall(data2) @@ -253,12 +234,12 @@ def episodios(item): logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot)) + fanart=thumbnail, plot=plot, fulltitle=title)) if len(itemlist) == 0: try: - porestrenar = scrapertools.get_match(data, - '<div[^<]+<span class="labl">Estad[^<]+</span[^<]+<span[^>]+>Por estrenar</span>') + # porestrenar = scrapertools.get_match(data, + # '<div[^<]+<span class="labl">Estad[^<]+</span[^<]+<span[^>]+>Por estrenar</span>') itemlist.append(Item(channel=item.channel, action="findvideos", title="Serie por estrenar", url="", thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot, server="directo", folder=False)) @@ -266,3 +247,34 @@ def episodios(item): pass return itemlist + + +def findvideos(item): + logger.info() + + itemlist = [] + data = re.sub(r"\n|\r|\t|\s{2}|-\s", "", httptools.downloadpage(item.url).data) + + list_videos = scrapertools.find_multiple_matches(data, '<iframe class="player_conte" src="([^"]+)"') + aux_url = [] + index = 1 + for e in list_videos: + if e.startswith("https://jkanime.net/jk.php?"): + headers = {"Referer": item.url} + data = httptools.downloadpage(e, headers=headers).data + + url = scrapertools.find_single_match(data, '<embed class="player_conte".*?&file=([^\"]+)\"') + if url: + itemlist.append(item.clone(title="Enlace encontrado en server #%s" % index, url=url, action="play")) + index += 1 + + else: + aux_url.append(e) + + itemlist.extend(servertools.find_video_items(data=",".join(aux_url))) + for videoitem in itemlist: + videoitem.fulltitle = item.fulltitle + videoitem.channel = item.channel + videoitem.thumbnail = item.thumbnail + + return itemlist diff --git a/plugin.video.alfa/channels/lacajita.json b/plugin.video.alfa/channels/lacajita.json index 02466f55..9d8e0b80 100755 --- a/plugin.video.alfa/channels/lacajita.json +++ b/plugin.video.alfa/channels/lacajita.json @@ -1,7 +1,7 @@ { "id": "lacajita", "name": "LaCajita", - "language": "es", + "language": ["cast", "lat"], "active": true, "adult": false, "version": 1, @@ -14,7 +14,6 @@ "thumbnail": "http://i.imgur.com/LVdupxc.png", "categories": [ "movie", - "latino", "vos" ], "settings": [ diff --git a/plugin.video.alfa/channels/lacajita.py b/plugin.video.alfa/channels/lacajita.py old mode 100755 new mode 100644 index 8f04a44d..c5a7e262 --- a/plugin.video.alfa/channels/lacajita.py +++ b/plugin.video.alfa/channels/lacajita.py @@ -103,7 +103,8 @@ def entradas(item): filtro = {"poster_path": filtro_thumb}.items() itemlist.append(Item(channel=item.channel, action="findvideos", url=scrapedurl, title=titulo, contentTitle=scrapedtitle, infoLabels={'filtro': filtro}, text_color=color2, - thumbnail=scrapedthumbnail, contentType="movie", fulltitle=scrapedtitle)) + thumbnail=scrapedthumbnail, contentType="movie", fulltitle=scrapedtitle, language = + idiomas)) tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) if len(matches) > item.page + 20: @@ -233,7 +234,8 @@ def findvideos(item): if detalle: title += " (%s)" % detalle - itemlist.append(item.clone(action="play", url=url, title=title, server=servidor, text_color=color3)) + itemlist.append(item.clone(action="play", url=url, title=title, server=servidor, text_color=color3, + language = idioma, quality = calidad)) if item.extra != "findvideos" and config.get_videolibrary_support(): itemlist.append(item.clone(title="Añadir película a la videoteca", action="add_pelicula_to_library", diff --git a/plugin.video.alfa/channels/locopelis.json b/plugin.video.alfa/channels/locopelis.json index d5df7370..95047a6a 100755 --- a/plugin.video.alfa/channels/locopelis.json +++ b/plugin.video.alfa/channels/locopelis.json @@ -1,12 +1,9 @@ { "id": "locopelis", "name": "LOCOPELIS", - "compatible": { - "addon_version": "4.3" - }, "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "https://s31.postimg.org/5worjw2nv/locopelis.png", "banner": "https://s31.postimg.org/ng87bb9jv/locopelis_banner.png", "version": 1, @@ -33,7 +30,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/maxipelis.json b/plugin.video.alfa/channels/maxipelis.json new file mode 100644 index 00000000..98a27139 --- /dev/null +++ b/plugin.video.alfa/channels/maxipelis.json @@ -0,0 +1,30 @@ +{ + "id": "maxipelis", + "name": "Maxipelis", + "active": true, + "adult": false, + "language": ["cast", "lat"], + "version": 1, + "thumbnail": "http://www.maxipelis.net/wp-content/uploads/2016/12/applogo.png", + "banner": "", + "changes": [ + { + "date": "25/08/2017", + "description": "Nuevo canal" + } + ], + "categories": [ + "movie", + "adult" + ], + "settings": [ + { + "id": "include_in_global_search", + "type": "bool", + "label": "Incluir en busqueda global", + "default": true, + "enabled": true, + "visible": true + } + ] +} diff --git a/plugin.video.alfa/channels/maxipelis.py b/plugin.video.alfa/channels/maxipelis.py new file mode 100644 index 00000000..eb5968b1 --- /dev/null +++ b/plugin.video.alfa/channels/maxipelis.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------ +# Alfa +# ------------------------------------------------------------ +import urlparse,urllib2,urllib,re +import os, sys + +from core import jsontools as json +from core import scrapertools +from core import servertools +from core.item import Item +from platformcode import config, logger +from core import httptools +from core import tmdb + +host = 'http://www.maxipelis.net' + + +def mainlist(item): + logger.info() + itemlist = [] + itemlist.append(Item(channel=item.channel, title="Novedades" , action="peliculas", url=host + "/pelicula")) + + itemlist.append(Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) + itemlist.append(Item(channel=item.channel, title="Buscar", action="search")) + return itemlist + + +def search(item, texto): + logger.info() + texto = texto.replace(" ", "+") + item.url = host + "/?s=%s" % texto + + try: + return sub_search(item) + + except: + import sys + for line in sys.exc_info(): + logger.error("%s" % line) + return [] + + +def sub_search(item): + logger.info() + itemlist = [] + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t| |<br>", "", data) + + patron = '<div class="thumbnail animation-2"> <a href="([^"]+)"> <img src="([^"]+)" alt="(.*?)" />.*?' + patron +='<div class="contenido"><p>(.*?)</p>' + matches = scrapertools.find_multiple_matches(data, patron) + + for url,img,name,plot in matches: + itemlist.append(item.clone(channel=item.channel, action="findvideos", title=name, url=url, plot=plot, + thumbnail=img)) + + paginacion = scrapertools.find_single_match(data, '<div class=\'resppages\'><a href="([^"]+)" ><span class="' + 'icon-chevron-right"></span>') + + if paginacion: + itemlist.append(Item(channel=item.channel, action="sub_search", title="Next page >>" , url=paginacion)) + + return itemlist + +def categorias(item): + logger.info() + itemlist = [] + data = httptools.downloadpage(item.url).data + + patron = '<li class="cat-item"><a href="([^"]+)".*?>(.*?)</a>' + matches = re.compile(patron,re.DOTALL).findall(data) + scrapertools.printMatches(matches) + + for scrapedurl,scrapedtitle in matches: + scrapedplot = "" + scrapedthumbnail = "" + itemlist.append( Item(channel=item.channel, action="peliculas", title=scrapedtitle , url=host + scrapedurl, + thumbnail=scrapedthumbnail , plot=scrapedplot)) + + return itemlist + + +def peliculas(item): + logger.info() + itemlist = [] + data = httptools.downloadpage(item.url).data + patron = '<div class="poster">.*?src="(.*?)" alt="(.*?)">.*?' + patron += '"quality">(.*?)<.*?href="(.*?)".*?<span>(\d{4}).*?"texto">(.*?)<.*?' + matches = re.compile(patron,re.DOTALL).findall(data) + + for scrapedthumbnail, scrapedtitle, scrapedquality, scrapedurl, scrapedyear, scrapedplot in matches: + url = scrapedurl + thumbnail = scrapedthumbnail + contentTitle = scrapedtitle + quality = scrapedquality + year = scrapedyear + plot = scrapedplot + if quality == "" or year=="" : + title = contentTitle + else: + title = contentTitle + " (" + year + ") " + "[COLOR red]" + quality + "[/COLOR]" + + new_item = Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, plot=plot, + contentTitle = contentTitle , infoLabels={'year':year} ) + + if year: + tmdb.set_infoLabels_item(new_item) + itemlist.append(new_item) + try: + patron = '<a href="([^"]+)" ><span class="icon-chevron-right"></span></a></div>' + next_page = re.compile(patron,re.DOTALL).findall(data) + itemlist.append( Item(channel=item.channel , action="peliculas" , title="Siguiente >>" , text_color="yellow", + url=next_page[0])) + + except: pass + return itemlist + + +def findvideos(item): + logger.info() + itemlist = [] + + data = httptools.downloadpage(item.url).data + + patron = '<tr><td> <a class="link_a" href="([^"]+)".*?<td> (.*?)</td><td> (.*?)</td><td> (.*?)</td>' + matches = scrapertools.find_multiple_matches(data, patron) + + for url, server, calidad, idioma in matches: + title = item.contentTitle + server = servertools.get_server_from_url(url) + + itemlist.append(item.clone(action="play", title=title, fulltitle = item.title, url=url, language = idioma, + contentTitle = item.contentTitle, quality = calidad, server = server)) + + if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra !='findvideos' : + itemlist.append(Item(channel=item.channel, title='[COLOR yellow]Agregar esta pelicula a la Videoteca[/COLOR]', + url=item.url, action="add_pelicula_to_library", extra="findvideos", + contentTitle = item.contentTitle)) + return itemlist + +# def play(item): +# logger.info() +# itemlist = servertools.find_video_items(data=item.url) +# +# for videoitem in itemlist: +# videoitem.title = item.title +# videoitem.fulltitle = item.fulltitle +# videoitem.thumbnail = item.thumbnail +# videoitem.channel = item.channel +# videoitem. +# return itemlist diff --git a/plugin.video.alfa/channels/mejortorrent.json b/plugin.video.alfa/channels/mejortorrent.json index 8e877af9..402c9fcb 100755 --- a/plugin.video.alfa/channels/mejortorrent.json +++ b/plugin.video.alfa/channels/mejortorrent.json @@ -3,7 +3,7 @@ "name": "Mejor Torrent", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "mejortorrent.png", "banner": "mejortorrent.png", "version": 1, diff --git a/plugin.video.alfa/channels/metaserie.json b/plugin.video.alfa/channels/metaserie.json index b72af541..041622aa 100755 --- a/plugin.video.alfa/channels/metaserie.json +++ b/plugin.video.alfa/channels/metaserie.json @@ -1,12 +1,9 @@ { "id": "metaserie", "name": "MetaSerie (Latino)", - "compatible": { - "addon_version": "4.3" - }, "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s32.postimg.org/7g50yo39h/metaserie.png", "banner": "https://s31.postimg.org/u6yddil8r/metaserie_banner.png", "version": 1, @@ -33,7 +30,6 @@ } ], "categories": [ - "latino", "tvshow" ], "settings": [ diff --git a/plugin.video.alfa/channels/miltorrents.json b/plugin.video.alfa/channels/miltorrents.json index a6f12828..18e75419 100755 --- a/plugin.video.alfa/channels/miltorrents.json +++ b/plugin.video.alfa/channels/miltorrents.json @@ -3,7 +3,7 @@ "name": "Miltorrents", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "version": 1, "changes": [ { diff --git a/plugin.video.alfa/channels/miradetodo.json b/plugin.video.alfa/channels/miradetodo.json index 27e9f5f8..28043b89 100755 --- a/plugin.video.alfa/channels/miradetodo.json +++ b/plugin.video.alfa/channels/miradetodo.json @@ -3,7 +3,7 @@ "name": "MiraDeTodo", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s17.postimg.org/e8kp12mcv/miradetodo.png", "banner": "https://s7.postimg.org/it21t0dej/miradetodo-banner.png", "version": 1, @@ -18,7 +18,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/mundoflv.json b/plugin.video.alfa/channels/mundoflv.json index 3f02a6e0..905b361a 100755 --- a/plugin.video.alfa/channels/mundoflv.json +++ b/plugin.video.alfa/channels/mundoflv.json @@ -1,12 +1,9 @@ { "id": "mundoflv", "name": "MundoFlv", - "compatible": { - "addon_version": "4.3" - }, "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s32.postimg.org/h1ewz9hhx/mundoflv.png", "banner": "mundoflv.png", "version": 1, @@ -37,7 +34,6 @@ } ], "categories": [ - "latino", "tvshow" ], "settings": [ diff --git a/plugin.video.alfa/channels/newpct.json b/plugin.video.alfa/channels/newpct.json index cd8f5128..e4669030 100755 --- a/plugin.video.alfa/channels/newpct.json +++ b/plugin.video.alfa/channels/newpct.json @@ -3,7 +3,7 @@ "name": "Newpct", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "newpct.png", "banner": "newpct.png", "version": 1, diff --git a/plugin.video.alfa/channels/newpct1.json b/plugin.video.alfa/channels/newpct1.json index d59e3d16..ef0d543a 100755 --- a/plugin.video.alfa/channels/newpct1.json +++ b/plugin.video.alfa/channels/newpct1.json @@ -3,7 +3,7 @@ "name": "Newpct1", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "newpct1.png", "banner": "newpct1.png", "version": 1, diff --git a/plugin.video.alfa/channels/newpct1.py b/plugin.video.alfa/channels/newpct1.py index db5c28d6..009ea8c6 100644 --- a/plugin.video.alfa/channels/newpct1.py +++ b/plugin.video.alfa/channels/newpct1.py @@ -2,53 +2,35 @@ import re +from channelselector import get_thumb from core import httptools from core import scrapertools from core import servertools from core.item import Item from platformcode import config, logger +from core import tmdb +host = 'http://newpct1.com/' def mainlist(item): logger.info() itemlist = [] - itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url="http://www.newpct1.com/", - extra="peliculas")) + + thumb_pelis=get_thumb("channels_movie.png") + thumb_series=get_thumb("channels_tvshow.png") + thumb_search = get_thumb("search.png") + + itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host, + extra="peliculas", thumbnail=thumb_pelis )) + + itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series", + thumbnail=thumb_series)) itemlist.append( - Item(channel=item.channel, action="submenu", title="Series", url="http://www.newpct1.com/", extra="series")) - # itemlist.append(Item(channel=item.channel, action="search", title="Buscar")) + Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_search)) return itemlist - -def search(item, texto): - logger.info("search:" + texto) - texto = texto.replace(" ", "+") - item.url = "http://www.newpct1.com/index.php?page=buscar&q=%27" + texto + "%27&ordenar=Fecha&inon=Descendente" - item.extra = "buscar-list" - try: - itemlist = completo(item) - - # Esta pagina coloca a veces contenido duplicado, intentamos descartarlo - dict_aux = {} - for i in itemlist: - if not i.url in dict_aux: - dict_aux[i.url] = i - else: - itemlist.remove(i) - - return itemlist - - - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - def submenu(item): logger.info() itemlist = [] @@ -90,30 +72,57 @@ def alfabeto(item): title = scrapedtitle.upper() url = scrapedurl - itemlist.append(Item(channel=item.channel, action="completo", title=title, url=url, extra=item.extra)) + itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra)) return itemlist def listado(item): logger.info() - # logger.info("[newpct1.py] listado url=" + item.url) itemlist = [] + url_next_page ='' data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data) data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") + #logger.debug(data) + logger.debug('item.modo: %s'%item.modo) + logger.debug('item.extra: %s'%item.extra) - patron = '<ul class="' + item.extra + '">(.*?)</ul>' - logger.debug("patron=" + patron) - fichas = scrapertools.get_match(data, patron) + if item.modo != 'next' or item.modo =='': + logger.debug('item.title: %s'% item.title) + patron = '<ul class="' + item.extra + '">(.*?)</ul>' + logger.debug("patron=" + patron) + fichas = scrapertools.get_match(data, patron) + page_extra = item.extra + else: + fichas = data + page_extra = item.extra - # <li><a href="http://www.newpct1.com/pelicula/x-men-dias-del-futuro-pasado/ts-screener/" title="Descargar XMen Dias Del Futuro gratis"><img src="http://www.newpct1.com/pictures/f/58066_x-men-dias-del-futuro--blurayrip-ac3-5.1.jpg" width="130" height="180" alt="Descargar XMen Dias Del Futuro gratis"><h2>XMen Dias Del Futuro </h2><span>BluRayRip AC3 5.1</span></a></li> patron = '<li><a href="([^"]+).*?' # url patron += 'title="([^"]+).*?' # titulo patron += '<img src="([^"]+)"[^>]+>.*?' # thumbnail patron += '<span>([^<]*)</span>' # calidad matches = re.compile(patron, re.DOTALL).findall(fichas) + logger.debug('item.next_page: %s'%item.next_page) + + + # Paginacion + if item.next_page != 'b': + if len(matches) > 30: + url_next_page = item.url + matches = matches[:30] + next_page = 'b' + modo = 'continue' + else: + matches = matches[30:] + next_page = 'a' + patron_next_page = '<a href="([^"]+)">Next<\/a>' + matches_next_page = re.compile(patron_next_page, re.DOTALL).findall(data) + modo = 'continue' + if len(matches_next_page) > 0: + url_next_page = matches_next_page[0] + modo = 'next' for scrapedurl, scrapedtitle, scrapedthumbnail, calidad in matches: url = scrapedurl @@ -121,33 +130,16 @@ def listado(item): thumbnail = scrapedthumbnail action = "findvideos" extra = "" - + year = scrapertools.find_single_match(scrapedthumbnail, r'-(\d{4})') if "1.com/series" in url: - action = "completo" + action = "episodios" extra = "serie" + title = scrapertools.find_single_match(title, '([^-]+)') title = title.replace("Ver online", "", 1).replace("Descarga Serie HD", "", 1).replace("Ver en linea", "", 1).strip() - # logger.info("[newpct1.py] titulo="+title) - ''' - if len(title)>3: - url_i = 'http://www.newpct1.com/index.php?page=buscar&url=&letter=&q=%22' + title.replace(" ","%20") + '%22' - else: - url_i = 'http://www.newpct1.com/index.php?page=buscar&url=&letter=&q=' + title - if "1.com/series-hd" in url: - extra="serie-hd" - url = url_i + '&categoryID=&categoryIDR=1469&calidad=' + calidad.replace(" ","+") #DTV+720p+AC3+5.1 - elif "1.com/series-vo" in url: - extra="serie-vo" - url = url_i + '&categoryID=&categoryIDR=775&calidad=' + calidad.replace(" ","+") #HDTV+720p+AC3+5.1 - elif "1.com/series/" in url: - extra="serie-tv" - url = url_i + '&categoryID=&categoryIDR=767&calidad=' + calidad.replace(" ","+") - - url += '&idioma=&ordenar=Nombre&inon=Descendente' - ''' else: title = title.replace("Descargar", "", 1).strip() if title.endswith("gratis"): title = title[:-7] @@ -160,7 +152,7 @@ def listado(item): context_title = scrapertools.find_single_match(url, "http://(?:www.)?newpct1.com/(.*?)/(.*?)/") if context_title: try: - context = context_title[0].replace("pelicula", "movie").replace("descargar", "movie").replace("series", + context = context_title[0].replace("descargar-", "").replace("pelicula", "movie").replace("series", "tvshow") context_title = context_title[1].replace("-", " ") if re.search('\d{4}', context_title[-4:]): @@ -170,229 +162,85 @@ def listado(item): except: context_title = show + logger.debug('contxt title: %s'%context_title) + logger.debug('year: %s' % year) - itemlist.append( - Item(channel=item.channel, action=action, title=title, url=url, thumbnail=thumbnail, extra=extra, show=show, - contentTitle=context_title, contentType=context, context=["buscar_trailer"])) + logger.debug('context: %s' % context) + if not 'array' in title: + new_item = Item(channel=item.channel, action=action, title=title, url=url, thumbnail=thumbnail, + extra = extra, + show = context_title, contentTitle=context_title, contentType=context, + context=["buscar_trailer"], infoLabels= {'year':year}) + if year: + tmdb.set_infoLabels_item(new_item, seekTmdb = True) + itemlist.append(new_item) - if "pagination" in data: - patron = '<ul class="pagination">(.*?)</ul>' - paginacion = scrapertools.get_match(data, patron) - if "Next" in paginacion: - url_next_page = scrapertools.get_match(paginacion, '<a href="([^>]+)>Next</a>')[:-1].replace(" ", "%20") - itemlist.append(Item(channel=item.channel, action="listado", title=">> Página siguiente", url=url_next_page, - extra=item.extra)) - # logger.info("[newpct1.py] listado items:" + str(len(itemlist))) + + + if url_next_page: + itemlist.append(Item(channel=item.channel, action="listado", title=">> Página siguiente", + url=url_next_page, next_page=next_page, folder=True, + text_color='yellow', text_bold=True, modo = modo, plot = extra, + extra = page_extra)) return itemlist - -def completo(item): +def listado2(item): logger.info() itemlist = [] - categoryID = "" - - # Guarda el valor por si son etiquetas para que lo vea 'listadofichas' - item_extra = item.extra - item_show = item.show - item_title = item.title - - # Lee las entradas - if item_extra.startswith("serie"): - ultimo_action = "get_episodios" - - if item.extra != "serie_add": - ''' - # Afinar mas la busqueda - if item_extra=="serie-hd": - categoryID=buscar_en_subcategoria(item.show,'1469') - elif item_extra=="serie-vo": - categoryID=buscar_en_subcategoria(item.show,'775') - elif item_extra=="serie-tv": - categoryID=buscar_en_subcategoria(item.show,'767') - if categoryID !="": - item.url=item.url.replace("categoryID=","categoryID="+categoryID) - - #Fanart - oTvdb= TvDb() - serieID=oTvdb.get_serieId_by_title(item.show) - fanart = oTvdb.get_graphics_by_serieId(serieID) - if len(fanart)>0: - item.fanart = fanart[0]''' - try: - from core.tmdb import Tmdb - oTmdb = Tmdb(texto_buscado=item.show, tipo="tv", idioma_busqueda="es") - item.fanart = oTmdb.get_backdrop() - item.plot = oTmdb.get_sinopsis() - print item.plot - except: - pass - else: - item_title = item.show - - items_programas = get_episodios(item) - else: - ultimo_action = "listado" - items_programas = listado(item) - - if len(items_programas) == 0: - return itemlist # devolver lista vacia - - salir = False - while not salir: - - # Saca la URL de la siguiente página - ultimo_item = items_programas[len(items_programas) - 1] - - # Páginas intermedias - if ultimo_item.action == ultimo_action: - # Quita el elemento de "Página siguiente" - ultimo_item = items_programas.pop() - - # Añade las entradas de la página a la lista completa - itemlist.extend(items_programas) - - # Carga la siguiente página - ultimo_item.extra = item_extra - ultimo_item.show = item_show - ultimo_item.title = item_title - logger.debug("url=" + ultimo_item.url) - if item_extra.startswith("serie"): - items_programas = get_episodios(ultimo_item) - else: - items_programas = listado(ultimo_item) - - # Última página - else: - # Añade a la lista completa y sale - itemlist.extend(items_programas) - salir = True - - if (config.get_videolibrary_support() and len(itemlist) > 0 and item.extra.startswith("serie")): - itemlist.append(Item(channel=item.channel, title="Añadir esta serie a la biblioteca", url=item.url, - action="add_serie_to_library", extra="completo###serie_add", show=item.show)) - logger.debug("items=" + str(len(itemlist))) - return itemlist - - -def get_episodios(item): - logger.info("url=" + item.url) - itemlist = [] - data = re.sub(r'\n|\r|\t|\s{2}|<!--.*?-->|<i class="icon[^>]+"></i>', "", httptools.downloadpage(item.url).data) + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post).data) data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") - logger.debug("data=" + data) + list_chars = [["ñ", "ñ"]] - patron = '<ul class="buscar-list">(.*?)</ul>' - # logger.info("[newpct1.py] patron=" + patron) + for el in list_chars: + data = re.sub(r"%s" % el[0], el[1], data) - fichas = scrapertools.get_match(data, patron) - # logger.info("[newpct1.py] matches=" + str(len(fichas))) + try: + get, post = scrapertools.find_single_match(data, '<ul class="pagination">.*?<a class="current" href.*?' + '<a\s*href="([^"]+)"(?:\s*onClick=".*?\'([^"]+)\'.*?")') + except: + post = False - # <li><a href="http://www.newpct1.com/serie/forever/capitulo-101/" title="Serie Forever 1x01"><img src="http://www.newpct1.com/pictures/c/minis/1880_forever.jpg" alt="Serie Forever 1x01"></a> <div class="info"> <a href="http://www.newpct1.com/serie/forever/capitulo-101/" title="Serie Forever 1x01"><h2 style="padding:0;">Serie <strong style="color:red;background:none;">Forever - Temporada 1 </strong> - Temporada<span style="color:red;background:none;">[ 1 ]</span>Capitulo<span style="color:red;background:none;">[ 01 ]</span><span style="color:red;background:none;padding:0px;">Espa�ol Castellano</span> Calidad <span style="color:red;background:none;">[ HDTV ]</span></h2></a> <span>27-10-2014</span> <span>450 MB</span> <span class="color"><ahref="http://www.newpct1.com/serie/forever/capitulo-101/" title="Serie Forever 1x01"> Descargar</a> </div></li> - # logger.info("[newpct1.py] get_episodios: " + fichas) - patron = '<li[^>]*><a href="([^"]+).*?' # url - patron += '<img src="([^"]+)".*?' # thumbnail - patron += '<h2 style="padding(.*?)/h2>' # titulo, idioma y calidad + if post: + if "pg" in item.post: + item.post = re.sub(r"pg=(\d+)", "pg=%s" % post, item.post) + else: + item.post += "&pg=%s" % post - matches = re.compile(patron, re.DOTALL).findall(fichas) - # logger.info("[newpct1.py] get_episodios matches: " + str(len(matches))) - for scrapedurl, scrapedthumbnail, scrapedinfo in matches: - try: - url = scrapedurl - if '</span>' in scrapedinfo: - # logger.info("[newpct1.py] get_episodios: scrapedinfo="+scrapedinfo) - try: - # <h2 style="padding:0;">Serie <strong style="color:red;background:none;">The Big Bang Theory - Temporada 6 </strong> - Temporada<span style="color:red;background:none;">[ 6 ]</span>Capitulo<span style="color:red;background:none;">[ 03 ]</span><span style="color:red;background:none;padding:0px;">Español Castellano</span> Calidad <span style="color:red;background:none;">[ HDTV ]</span></h2> - patron = '<span style=".*?">\[\s*(.*?)\]</span>.*?' # temporada - patron += '<span style=".*?">\[\s*(.*?)\].*?' # capitulo - patron += ';([^/]+)' # idioma - info_extra = re.compile(patron, re.DOTALL).findall(scrapedinfo) - (temporada, capitulo, idioma) = info_extra[0] + pattern = '<ul class="%s">(.*?)</ul>' % item.pattern + data = scrapertools.get_match(data, pattern) + pattern = '<li><a href="(?P<url>[^"]+)".*?<img src="(?P<img>[^"]+)"[^>]+>.*?<h2.*?>\s*(?P<title>.*?)\s*</h2>' - except: - # <h2 style="padding:0;">Serie <strong style="color:red;background:none;">The Affair Temporada 3 Capitulo 5</strong> - <span style="color:red;background:none;padding:0px;">Español Castellano</span> Calidad <span style="color:red;background:none;">[ HDTV ]</span></h2> - patron = '<strong style=".*?">([^<]+).*?' # temporada y capitulo - patron += '<span style=".*?">([^<]+)' + matches = re.compile(pattern, re.DOTALL).findall(data) - info_extra = re.compile(patron, re.DOTALL).findall(scrapedinfo) - (temporada_capitulo, idioma) = info_extra[0] - if re.search(r'(?i)Capitulos', temporada_capitulo): - temporada = scrapertools.find_single_match(temporada_capitulo, 'Temp.*?\s*([\d]+)') - cap1, cap2 = scrapertools.find_single_match(temporada_capitulo, 'Cap.*?\s*(\d+).*?(\d+)') - capitulo = "" - else: - temporada, capitulo = scrapertools.get_season_and_episode(temporada_capitulo).split('x') + for url, thumb, title in matches: + # fix encoding for title + real_title = scrapertools.find_single_match(title, r'font color.*?font.*?><b>(.*?)<\/b><\/font>') + title = scrapertools.htmlclean(title) + title = title.replace("�", "ñ") - # logger.info("[newpct1.py] get_episodios: temporada=" + temporada) - # logger.info("[newpct1.py] get_episodios: capitulo=" + capitulo) - logger.debug("idioma=" + idioma) - if '">' in idioma: - idioma = " [" + scrapertools.find_single_match(idioma, '">([^<]+)').strip() + "]" - elif ' ' in idioma: - idioma = " [" + scrapertools.find_single_match(idioma, ' ([^<]+)').strip() + "]" - '''else: - idioma=""''' - if capitulo: - title = item.title + " (" + temporada.strip() + "x" + capitulo.strip() + ") " + idioma - else: - title = item.title + " (Del %sx%s al %sx%s) %s" % (temporada, cap1, temporada, cap2, idioma) - else: - # <h2 style="padding:0;">The Big Bang Theory - Temporada 6 [HDTV][Cap.602][Español Castellano]</h2> - # <h2 style="padding:0;">The Beast - Temporada 1 [HDTV] [Capítulo 13] [Español]</h2 - # <h2 style="padding:0;">The Beast - Temp.1 [DVD-DVB][Cap.103][Spanish]</h2> - try: - temp, cap = scrapertools.get_season_and_episode(scrapedinfo).split('x') - except: - # Formatear temporadaXepisodio - patron = re.compile('Cap.*?\s*([\d]+)', re.IGNORECASE) - info_extra = patron.search(scrapedinfo) + # no mostramos lo que no sean videos + if "/juego/" in url or "/varios/" in url: + continue - if len(str(info_extra.group(1))) >= 3: - cap = info_extra.group(1)[-2:] - temp = info_extra.group(1)[:-2] - else: - cap = info_extra.group(1) - patron = 'Temp.*?\s*([\d]+)' - temp = re.compile(patron, re.IGNORECASE).search(scrapedinfo).group(1) + if ".com/series" in url: - title = item.title + " (" + temp + 'x' + cap + ")" + show = real_title - # logger.info("[newpct1.py] get_episodios: fanart= " +item.fanart) - itemlist.append( - Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=item.thumbnail, - show=item.show, fanart=item.fanart)) - except: - logger.error("ERROR al añadir un episodio") - if "pagination" in data: - patron = '<ul class="pagination">(.*?)</ul>' - paginacion = scrapertools.get_match(data, patron) - # logger.info("[newpct1.py] get_episodios: paginacion= " + paginacion) - if "Next" in paginacion: - url_next_page = scrapertools.get_match(paginacion, '<a href="([^>]+)>Next</a>')[:-1] - url_next_page = url_next_page.replace(" ", "%20") - # logger.info("[newpct1.py] get_episodios: url_next_page= " + url_next_page) - itemlist.append( - Item(channel=item.channel, action="get_episodios", title=">> Página siguiente", url=url_next_page)) + itemlist.append(Item(channel=item.channel, action="episodios", title=title, url=url, thumbnail=thumb, + context=["buscar_trailer"], contentSerieName=show)) + else: + + itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumb, + context=["buscar_trailer"])) + + if post: + itemlist.append(item.clone(channel=item.channel, action="listado2", title=">> Página siguiente", + thumbnail=get_thumb("next.png"))) return itemlist - -def buscar_en_subcategoria(titulo, categoria): - data = httptools.downloadpage("http://www.newpct1.com/pct1/library/include/ajax/get_subcategory.php", - post="categoryIDR=" + categoria).data - data = data.replace("</option>", " </option>") - patron = '<option value="(\d+)">(' + titulo.replace(" ", "\s").replace("(", "/(").replace(")", - "/)") + '\s[^<]*)</option>' - logger.debug("data=" + data) - logger.debug("patron=" + patron) - matches = re.compile(patron, re.DOTALL | re.IGNORECASE).findall(data) - - if len(matches) == 0: matches = [('', '')] - logger.debug("resultado=" + matches[0][0]) - return matches[0][0] - - def findvideos(item): logger.info() itemlist = [] @@ -412,7 +260,7 @@ def findvideos(item): # <a href="http://tumejorjuego.com/download/index.php?link=descargar-torrent/058310_yo-frankenstein-blurayrip-ac3-51.html" title="Descargar torrent de Yo Frankenstein " class="btn-torrent" target="_blank">Descarga tu Archivo torrent!</a> - patron = '<a href="([^"]+)" title="[^"]+" class="btn-torrent" target="_blank">' + patron = 'openTorrent.*?"title=".*?" class="btn-torrent">.*?function openTorrent.*?href = "(.*?)";' # escraped torrent url = scrapertools.find_single_match(data, patron) @@ -486,5 +334,113 @@ def findvideos(item): def episodios(item): - # Necesario para las actualizaciones automaticas - return completo(Item(channel=item.channel, url=item.url, show=item.show, extra="serie_add")) + logger.info() + itemlist = [] + infoLabels = item.infoLabels + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) + data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") + logger.debug('data: %s'%data) + pattern = '<ul class="%s">(.*?)</ul>' % "pagination" # item.pattern + pagination = scrapertools.find_single_match(data, pattern) + if pagination: + pattern = '<li><a href="([^"]+)">Last<\/a>' + full_url = scrapertools.find_single_match(pagination, pattern) + url, last_page = scrapertools.find_single_match(full_url, r'(.*?\/pg\/)(\d+)') + list_pages = [] + for x in range(1, int(last_page) + 1): + list_pages.append("%s%s" % (url, x)) + else: + list_pages = [item.url] + + logger.debug ('pattern: %s'%pattern) + for index, page in enumerate(list_pages): + logger.debug("Loading page %s/%s url=%s" % (index, len(list_pages), page)) + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page).data) + data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") + + pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern + data = scrapertools.get_match(data, pattern) + + pattern = '<li[^>]*><a href="(?P<url>[^"]+).*?<img src="(?P<thumb>[^"]+)".*?<h2[^>]+>(?P<info>.*?)</h2>' + matches = re.compile(pattern, re.DOTALL).findall(data) + + for url, thumb, info in matches: + + if "<span" in info: # new style + pattern = ".*?[^>]+>.*?Temporada\s*(?P<season>\d+)\s*Capitulo(?:s)?\s*(?P<episode>\d+)" \ + "(?:.*?(?P<episode2>\d+)?)<.+?<span[^>]+>(?P<lang>.*?)</span>\s*Calidad\s*<span[^>]+>" \ + "[\[]\s*(?P<quality>.*?)\s*[\]]</span>" + r = re.compile(pattern) + match = [m.groupdict() for m in r.finditer(info)][0] + + if match["episode2"]: + multi = True + title = "%s (%sx%s-%s) [%s][%s]" % (item.show, match["season"], str(match["episode"]).zfill(2), + str(match["episode2"]).zfill(2), match["lang"], + match["quality"]) + else: + multi = False + title = "%s (%sx%s) [%s][%s]" % (item.show, match["season"], str(match["episode"]).zfill(2), + match["lang"], match["quality"]) + + else: # old style + pattern = "\[(?P<quality>.*?)\].*?\[Cap.(?P<season>\d+)(?P<episode>\d{2})(?:_(?P<season2>\d+)" \ + "(?P<episode2>\d{2}))?.*?\].*?(?:\[(?P<lang>.*?)\])?" + + r = re.compile(pattern) + match = [m.groupdict() for m in r.finditer(info)][0] + # logger.debug("data %s" % match) + + str_lang = "" + if match["lang"] is not None: + str_lang = "[%s]" % match["lang"] + + if match["season2"] and match["episode2"]: + multi = True + if match["season"] == match["season2"]: + + title = "%s (%sx%s-%s) %s[%s]" % (item.show, match["season"], match["episode"], + match["episode2"], str_lang, match["quality"]) + else: + title = "%s (%sx%s-%sx%s) %s[%s]" % (item.show, match["season"], match["episode"], + match["season2"], match["episode2"], str_lang, + match["quality"]) + else: + title = "%s (%sx%s) %s[%s]" % (item.show, match["season"], match["episode"], str_lang, + match["quality"]) + multi = False + + season = match['season'] + episode = match['episode'] + itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumb, + quality=item.quality, multi=multi, contentSeason=season, + contentEpisodeNumber=episode, infoLabels = infoLabels)) + + # order list + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb = True) + if len(itemlist) > 1: + itemlist = sorted(itemlist, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) + + if config.get_videolibrary_support() and len(itemlist) > 0: + itemlist.append( + item.clone(title="Añadir esta serie a la videoteca", action="add_serie_to_library", extra="episodios")) + + return itemlist + +def search(item, texto): + logger.info("search:" + texto) + # texto = texto.replace(" ", "+") + + try: + item.post = "q=%s" % texto + item.pattern = "buscar-list" + itemlist = listado2(item) + + return itemlist + + # Se captura la excepción, para no interrumpir al buscador global si un canal falla + except: + import sys + for line in sys.exc_info(): + logger.error("%s" % line) + return [] diff --git a/plugin.video.alfa/channels/news.json b/plugin.video.alfa/channels/news.json index ba632499..b0a247d9 100755 --- a/plugin.video.alfa/channels/news.json +++ b/plugin.video.alfa/channels/news.json @@ -3,7 +3,7 @@ "name": "Novedades", "active": false, "adult": false, - "language": "es", + "language": ["*"], "version": 1, "changes": [ { diff --git a/plugin.video.alfa/channels/news.py b/plugin.video.alfa/channels/news.py index 5096e6a8..068ba31d 100755 --- a/plugin.video.alfa/channels/news.py +++ b/plugin.video.alfa/channels/news.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- # ------------------------------------------------------------ # Channel for recent videos on several channels # ------------------------------------------------------------ @@ -41,63 +41,51 @@ def mainlist(item): if list_canales['peliculas']: thumbnail = get_thumb("channels_movie.png") - new_item = Item(channel=item.channel, action="novedades", extra="peliculas", title="Películas", - thumbnail=thumbnail) + new_item = Item(channel=item.channel, action="novedades", extra="peliculas", title="Películas", + thumbnail=thumbnail) - new_item.context = [{"title": "Canales incluidos en: %s" % new_item.title, - "extra": new_item.extra, - "action": "setting_channel", - "channel": new_item.channel}] - new_item.category = "Novedades en %s" % new_item.extra - itemlist.append(new_item) + set_category_context(new_item) + itemlist.append(new_item) if list_canales['infantiles']: thumbnail = get_thumb("channels_children.png") - new_item = Item(channel=item.channel, action="novedades", extra="infantiles", title="Para niños", - thumbnail=thumbnail) - new_item.context = [{"title": "Canales incluidos en: %s" % new_item.title, - "extra": new_item.extra, - "action": "setting_channel", - "channel": new_item.channel}] - new_item.category = "Novedades en %s" % new_item.extra - itemlist.append(new_item) + new_item = Item(channel=item.channel, action="novedades", extra="infantiles", title="Para niños", + thumbnail=thumbnail) + set_category_context(new_item) + itemlist.append(new_item) if list_canales['series']: thumbnail = get_thumb("channels_tvshow.png") - new_item = Item(channel=item.channel, action="novedades", extra="series", title="Episodios de series", - thumbnail=thumbnail) - new_item.context = [{"title": "Canales incluidos en: %s" % new_item.title, - "extra": new_item.extra, - "action": "setting_channel", - "channel": new_item.channel}] - new_item.category = "Novedades en %s" % new_item.extra - itemlist.append(new_item) + new_item = Item(channel=item.channel, action="novedades", extra="series", title="Episodios de series", + thumbnail=thumbnail) + set_category_context(new_item) + itemlist.append(new_item) if list_canales['anime']: thumbnail = get_thumb("channels_anime.png") - new_item = Item(channel=item.channel, action="novedades", extra="anime", title="Episodios de anime", - thumbnail=thumbnail) - new_item.context = [{"title": "Canales incluidos en: %s" % new_item.title, - "extra": new_item.extra, - "action": "setting_channel", - "channel": new_item.channel}] - new_item.category = "Novedades en %s" % new_item.extra - itemlist.append(new_item) + new_item = Item(channel=item.channel, action="novedades", extra="anime", title="Episodios de anime", + thumbnail=thumbnail) + set_category_context(new_item) + itemlist.append(new_item) if list_canales['documentales']: thumbnail = get_thumb("channels_documentary.png") - new_item = Item(channel=item.channel, action="novedades", extra="documentales", title="Documentales", - thumbnail=thumbnail) - new_item.context = [{"title": "Canales incluidos en: %s" % new_item.title, - "extra": new_item.extra, - "action": "setting_channel", - "channel": new_item.channel}] - new_item.category = "Novedades en %s" % new_item.extra - itemlist.append(new_item) + new_item = Item(channel=item.channel, action="novedades", extra="documentales", title="Documentales", + thumbnail=thumbnail) + set_category_context(new_item) + itemlist.append(new_item) return itemlist +def set_category_context(item): + item.context = [{"title": "Canales incluidos en: %s" % item.title, + "extra": item.extra, + "action": "setting_channel", + "channel": item.channel}] + item.category = "Novedades en %s" % item.extra + + def get_channels_list(): logger.info() @@ -105,10 +93,7 @@ def get_channels_list(): # Rellenar listas de canales disponibles channels_path = os.path.join(config.get_runtime_path(), "channels", '*.json') - channel_language = config.get_setting("channel_language") - - if channel_language == "": - channel_language = "all" + channel_language = config.get_setting("channel_language", default="all") for infile in sorted(glob.glob(channels_path)): channel_id = os.path.basename(infile)[:-5] @@ -123,7 +108,8 @@ def get_channels_list(): continue # No incluir si el canal es en un idioma filtrado - if channel_language != "all" and channel_parameters["language"] != channel_language: + if channel_language != "all" and channel_language not in channel_parameters["language"] \ + and "*" not in channel_parameters["language"]: continue # Incluir en cada categoria, si en su configuracion el canal esta activado para mostrar novedades @@ -436,10 +422,7 @@ def settings(item): def setting_channel(item): channels_path = os.path.join(config.get_runtime_path(), "channels", '*.json') - channel_language = config.get_setting("channel_language") - - if channel_language == "": - channel_language = "all" + channel_language = config.get_setting("channel_language", default="all") list_controls = [] for infile in sorted(glob.glob(channels_path)): @@ -455,7 +438,8 @@ def setting_channel(item): continue # No incluir si el canal es en un idioma filtrado - if channel_language != "all" and channel_parameters["language"] != channel_language: + if channel_language != "all" and channel_language not in channel_parameters["language"] \ + and "*" not in channel_parameters["language"]: continue # No incluir si en su configuracion el canal no existe 'include_in_newest' diff --git a/plugin.video.alfa/channels/nuvid.json b/plugin.video.alfa/channels/nuvid.json index f51412c3..ef267da0 100755 --- a/plugin.video.alfa/channels/nuvid.json +++ b/plugin.video.alfa/channels/nuvid.json @@ -1,7 +1,7 @@ { "id": "nuvid", "name": "Nuvid", - "language": "es", + "language": ["*"], "active": true, "adult": true, "version": 1, diff --git a/plugin.video.alfa/channels/ohpelis.json b/plugin.video.alfa/channels/ohpelis.json index 5c5d00f5..26b945ca 100644 --- a/plugin.video.alfa/channels/ohpelis.json +++ b/plugin.video.alfa/channels/ohpelis.json @@ -1,17 +1,13 @@ { "id": "ohpelis", "name": "OH-PELIS", - "compatible": { - "addon_version": "4.3" - }, "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s28.postimg.org/6v7ig831p/oh-pelis.png", "banner": "https://s27.postimg.org/bz0fh8jpf/oh-pelis-banner.png", "version": 1, "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/pasateatorrent.json b/plugin.video.alfa/channels/pasateatorrent.json index 4b4554fa..71883a91 100755 --- a/plugin.video.alfa/channels/pasateatorrent.json +++ b/plugin.video.alfa/channels/pasateatorrent.json @@ -3,7 +3,7 @@ "name": "PasateaTorrent", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "http://imgur.com/iLeISt0.png", "banner": "pasateatorrent.png", "version": 1, diff --git a/plugin.video.alfa/channels/pedropolis.json b/plugin.video.alfa/channels/pedropolis.json new file mode 100644 index 00000000..f52134d9 --- /dev/null +++ b/plugin.video.alfa/channels/pedropolis.json @@ -0,0 +1,72 @@ +{ + "id": "pedropolis", + "name": "PedroPolis", + "active": true, + "adult": false, + "language": ["cast", "lat"], + "fanart": "https://scontent-lht6-1.xx.fbcdn.net/v/t31.0-8/21056316_670362456502498_8317422545691005578_o.png?oh=1f13a23a931d82e944a7ec743a19f583&oe=5A599F4D", + "thumbnail": "https://scontent-lht6-1.xx.fbcdn.net/v/t1.0-9/20292600_467501756957771_6794721577753226614_n.jpg?oh=bba1479eccf0adceeb8c0d3450cc2531&oe=5A4EE0F5", + "banner": "", + "version": 1, + "changes": [ + { + "date": "15/08/17", + "description": "Nuevo Canal" + } + ], + "categories": [ + "movie", + "tvshow", + "vos" + ], + "settings": [ + { + "id": "modo_grafico", + "type": "bool", + "label": "Buscar información extra", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "perfil", + "type": "list", + "label": "Perfil de color", + "default": 3, + "enabled": true, + "visible": true, + "lvalues": [ + "Sin color", + "Perfil 5", + "Perfil 4", + "Perfil 3", + "Perfil 2", + "Perfil 1" + ] + }, + { + "id": "orden_episodios", + "type": "bool", + "label": "Mostrar los episodios de las series en orden descendente", + "default": false, + "enabled": true, + "visible": true + }, + { + "id": "include_in_newest_peliculas", + "type": "bool", + "label": "Incluir en Novedades - Peliculas", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "include_in_newest_infantiles", + "type": "bool", + "label": "Incluir en Novedades - Infantiles", + "default": true, + "enabled": true, + "visible": true + } + ] +} diff --git a/plugin.video.alfa/channels/pedropolis.py b/plugin.video.alfa/channels/pedropolis.py new file mode 100644 index 00000000..c5a01871 --- /dev/null +++ b/plugin.video.alfa/channels/pedropolis.py @@ -0,0 +1,464 @@ +# -*- coding: utf-8 -*- +# -*- Channel PedroPolis -*- +# -*- Created for Alfa-addon -*- +# -*- By the Alfa Develop Group -*- + +import re +import sys +import urllib +import urlparse + +from core import httptools +from core import scrapertools +from core import servertools +from core.item import Item +from core import channeltools +from core import tmdb +from platformcode import config, logger +from channelselector import get_thumb + +__channel__ = "pedropolis" + +host = "http://pedropolis.com/" + +try: + __modo_grafico__ = config.get_setting('modo_grafico', __channel__) + __perfil__ = int(config.get_setting('perfil', __channel__)) +except: + __modo_grafico__ = True + __perfil__ = 0 + +# Fijar perfil de color +perfil = [['0xFFFFE6CC', '0xFFFFCE9C', '0xFF994D00', '0xFFFE2E2E', '0xFFFFD700'], + ['0xFFA5F6AF', '0xFF5FDA6D', '0xFF11811E', '0xFFFE2E2E', '0xFFFFD700'], + ['0xFF58D3F7', '0xFF2E9AFE', '0xFF2E64FE', '0xFFFE2E2E', '0xFFFFD700']] +if __perfil__ < 3: + color1, color2, color3, color4, color5 = perfil[__perfil__] +else: + color1 = color2 = color3 = color4 = color5 = "" + +headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], + ['Referer', host]] + +parameters = channeltools.get_channel_parameters(__channel__) +fanart_host = parameters['fanart'] +thumbnail_host = parameters['thumbnail'] + + +def mainlist(item): + logger.info() + + itemlist = [item.clone(title="Peliculas", action="menumovies", text_blod=True, + viewcontent='movies', viewmode="movie_with_plot", thumbnail=get_thumb("channels_movie.png")), + + item.clone(title="Series", action="menuseries", text_blod=True, extra='serie', mediatype="tvshow", + viewcontent='tvshows', url=host + 'tvshows/', viewmode="movie_with_plot", + thumbnail=get_thumb("channels_tvshow.png")), + + item.clone(title="Buscar", action="search", text_blod=True, extra='buscar', + thumbnail=get_thumb('search.png'), url=host)] + + return itemlist + + +def menumovies(item): + logger.info() + itemlist = [item.clone(title="Todas", action="peliculas", text_blod=True, url=host + 'movies/', + viewcontent='movies', viewmode="movie_with_plot"), + + item.clone(title="Más Vistas", action="peliculas", text_blod=True, + viewcontent='movies', url=host + 'tendencias/?get=movies', viewmode="movie_with_plot"), + + item.clone(title="Más Valoradas", action="peliculas", text_blod=True, viewcontent='movies', + url=host + 'calificaciones/?get=movies', viewmode="movie_with_plot"), + + item.clone(title="Géneros", action="generos", text_blod=True, viewmode="movie_with_plot", + viewcontent='movies', url=host)] + + return itemlist + + +def menuseries(item): + logger.info() + itemlist = [item.clone(title="Todas", action="series", text_blod=True, extra='serie', mediatype="tvshow", + viewcontent='tvshows', url=host + 'tvshows/', viewmode="movie_with_plot"), + + item.clone(title="Más Vistas", action="series", text_blod=True, extra='serie', mediatype="tvshow", + viewcontent='tvshows', url=host + 'tendencias/?get=tv', viewmode="movie_with_plot"), + + item.clone(title="Mejor Valoradas", action="series", text_blod=True, extra='serie', mediatype="tvshow", + viewcontent='tvshows', url=host + 'calificaciones/?get=tv', viewmode="movie_with_plot")] + + return itemlist + + +def peliculas(item): + logger.info() + itemlist = [] + url_next_page = '' + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\(.*?\)|\s{2}| ", "", data) + + patron = '<div class="poster"><img src="([^"]+)" alt="([^"]+)">.*?' # img, title + patron += '<div class="rating"><span class="[^"]+"></span>([^<]+).*?' # rating + patron += '<span class="quality">([^<]+)</span><a href="([^"]+)">.*?' # calidad, url + patron += '<span>([^<]+)</span>' # year + + matches = scrapertools.find_multiple_matches(data, patron) + + # Paginación + if item.next_page != 'b': + if len(matches) > 19: + url_next_page = item.url + matches = matches[:19] + next_page = 'b' + else: + matches = matches[19:] + next_page = 'a' + patron_next_page = "<span class=\"current\">\d+</span><a href='([^']+)'" + matches_next_page = re.compile(patron_next_page, re.DOTALL).findall(data) + if len(matches_next_page) > 0: + url_next_page = urlparse.urljoin(item.url, matches_next_page[0]) + + for scrapedthumbnail, scrapedtitle, rating, calidad, scrapedurl, year in matches: + if 'Proximamente' not in calidad: + scrapedtitle = scrapedtitle.replace('Ver ', '').partition(' /')[0].partition(':')[0].replace( + 'Español Latino', '').strip() + title = "%s [COLOR green][%s][/COLOR] [COLOR yellow][%s][/COLOR]" % (scrapedtitle, year, calidad) + + new_item = Item(channel=__channel__, action="findvideos", contentTitle=scrapedtitle, + infoLabels={'year': year, 'rating': rating}, thumbnail=scrapedthumbnail, + url=scrapedurl, next_page=next_page, quality=calidad, title=title) + if year: + tmdb.set_infoLabels_item(new_item, __modo_grafico__) + itemlist.append(new_item) + + if url_next_page: + itemlist.append(Item(channel=__channel__, action="peliculas", title="» Siguiente »", + url=url_next_page, next_page=next_page, folder=True, text_blod=True, + thumbnail=get_thumb("next.png"))) + + for item in itemlist: + if item.infoLabels['plot'] == '': + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + # logger.info(data) + item.fanart = scrapertools.find_single_match(data, + "<meta property='og:image' content='([^']+)' />").replace( + 'w780', 'original') + item.plot = scrapertools.find_single_match(data, '<div itemprop="description" class="wp-content">.*?<p>([' + '^<]+)</p>') + item.plot = scrapertools.htmlclean(item.plot) + item.infoLabels['director'] = scrapertools.find_single_match(data, + '<div class="name"><a href="[^"]+">([^<]+)</a>') + item.infoLabels['rating'] = scrapertools.find_single_match(data, '<b id="repimdb"><strong>([^<]+)</strong>') + item.infoLabels['votes'] = scrapertools.find_single_match(data, '<b id="repimdb"><strong>[' + '^<]+</strong>\s(.*?) votos</b>') + + return itemlist + + +def search(item, texto): + logger.info() + + texto = texto.replace(" ", "+") + item.url = urlparse.urljoin(item.url, "?s={0}".format(texto)) + + try: + return sub_search(item) + + # Se captura la excepción, para no interrumpir al buscador global si un canal falla + except: + import sys + for line in sys.exc_info(): + logger.error("{0}".format(line)) + return [] + + +def sub_search(item): + logger.info() + + itemlist = [] + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t| |<br>", "", data) + + patron = '<a href="([^"]+)"><img src="([^"]+)" alt="([^"]+)" />' # url, img, title + patron += '<span class="[^"]+">([^<]+)</span>.*?' # tipo + patron += '<span class="year">([^"]+)</span>.*?<div class="contenido"><p>([^<]+)</p>' # year, plot + + matches = re.compile(patron, re.DOTALL).findall(data) + + for scrapedurl, scrapedthumbnail, scrapedtitle, tipo, year, plot in matches: + title = scrapedtitle + if tipo == 'Serie': + contentType = 'tvshow' + action = 'temporadas' + title += ' [COLOR red](' + tipo + ')[/COLOR]' + else: + contentType = 'movie' + action = 'findvideos' + title += ' [COLOR green](' + tipo + ')[/COLOR]' + + itemlist.append(item.clone(title=title, url=scrapedurl, contentTitle=scrapedtitle, extra='buscar', + action=action, infoLabels={"year": year}, contentType=contentType, + thumbnail=scrapedthumbnail, text_color=color1, contentSerieName=scrapedtitle)) + + tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) + paginacion = scrapertools.find_single_match(data, '<link rel="next" href="([^"]+)" />') + + if paginacion: + itemlist.append(Item(channel=item.channel, action="sub_search", + title="» Siguiente »", url=paginacion, thumbnail=get_thumb("next.png"))) + + return itemlist + + +def newest(categoria): + logger.info() + itemlist = [] + item = Item() + try: + if categoria == 'peliculas': + item.url = host + 'movies/' + elif categoria == 'infantiles': + item.url = host + "genre/animacion/" + else: + return [] + + itemlist = peliculas(item) + if itemlist[-1].title == "» Siguiente »": + itemlist.pop() + + # Se captura la excepción, para no interrumpir al canal novedades si un canal falla + except: + import sys + for line in sys.exc_info(): + logger.error("{0}".format(line)) + return [] + + return itemlist + + +def generos(item): + logger.info() + itemlist = [] + + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + # logger.info(data) + data = scrapertools.find_single_match(data, 'Genero</a><ulclass="sub-menu">(.*?)</ul></li><li id') + + patron = '<li id="[^"]+" class="menu-item.*?<a href="([^"]+)">([^<]+)</a></li>' + matches = re.compile(patron, re.DOTALL).findall(data) + + for scrapedurl, scrapedtitle in matches: + if scrapedtitle != 'Proximamente': + title = "%s" % scrapedtitle + itemlist.append(item.clone(channel=item.channel, action="peliculas", title=title, + url=scrapedurl, text_color=color3, viewmode="movie_with_plot")) + + itemlist.sort(key=lambda it: it.title) + + return itemlist + + +def series(item): + logger.info() + url_next_page = '' + + itemlist = [] + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t| |<br>", "", data) + # logger.info(data) + + patron = '<div class="poster"><img src="([^"]+)" alt="([^"]+)">.*?<a href="([^"]+)">' + + matches = scrapertools.find_multiple_matches(data, patron) + + if item.next_page != 'b': + if len(matches) > 19: + url_next_page = item.url + matches = matches[:19] + next_page = 'b' + else: + matches = matches[19:] + next_page = 'a' + patron_next_page = '<link rel="next" href="([^"]+)" />' + matches_next_page = re.compile(patron_next_page, re.DOTALL).findall(data) + if len(matches_next_page) > 0: + url_next_page = urlparse.urljoin(item.url, matches_next_page[0]) + + for scrapedthumbnail, scrapedtitle, scrapedurl in matches: + scrapedtitle = scrapedtitle.replace('’', "'") + itemlist.append(Item(channel=__channel__, title=scrapedtitle, extra='serie', + url=scrapedurl, thumbnail=scrapedthumbnail, + contentSerieName=scrapedtitle, show=scrapedtitle, + next_page=next_page, action="temporadas", contentType='tvshow')) + + tmdb.set_infoLabels(itemlist, __modo_grafico__) + tmdb.set_infoLabels(itemlist, __modo_grafico__) + + if url_next_page: + itemlist.append(Item(channel=__channel__, action="series", title="» Siguiente »", url=url_next_page, + next_page=next_page, thumbnail=get_thumb("next.png"))) + + for item in itemlist: + if item.infoLabels['plot'] == '': + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + # logger.info(data) + item.fanart = scrapertools.find_single_match(data, + "<meta property='og:image' content='([^']+)' />").replace( + 'w780', 'original') + item.plot = scrapertools.find_single_match(data, '<h2>Sinopsis</h2><div class="wp-content"><p>([^<]+)</p>') + item.plot = scrapertools.htmlclean(item.plot) + + return itemlist + + +def temporadas(item): + logger.info() + itemlist = [] + + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t| |<br>", "", data) + # logger.info(data) + patron = '<span class="title">([^<]+)<i>.*?' # numeros de temporadas + patron += '<img src="([^"]+)"></a></div>' # capítulos + + matches = scrapertools.find_multiple_matches(data, patron) + if len(matches) > 1: + for scrapedseason, scrapedthumbnail in matches: + scrapedseason = " ".join(scrapedseason.split()) + temporada = scrapertools.find_single_match(scrapedseason, '(\d+)') + new_item = item.clone(action="episodios", season=temporada, thumbnail=scrapedthumbnail, extra='serie') + new_item.infoLabels['season'] = temporada + new_item.extra = "" + itemlist.append(new_item) + + tmdb.set_infoLabels(itemlist, __modo_grafico__) + for i in itemlist: + i.title = "%s. %s" % (i.infoLabels['season'], i.infoLabels['tvshowtitle']) + if i.infoLabels['title']: + # Si la temporada tiene nombre propio añadírselo al titulo del item + i.title += " - %s" % (i.infoLabels['title']) + if i.infoLabels.has_key('poster_path'): + # Si la temporada tiene poster propio remplazar al de la serie + i.thumbnail = i.infoLabels['poster_path'] + + itemlist.sort(key=lambda it: it.title) + + if config.get_videolibrary_support() and len(itemlist) > 0: + itemlist.append(Item(channel=__channel__, title="Añadir esta serie a la videoteca", url=item.url, + action="add_serie_to_library", extra="episodios", show=item.show, category="Series", + text_color=color1, thumbnail=get_thumb("videolibrary_tvshow.png"), fanart=fanart_host)) + + return itemlist + else: + return episodios(item) + + +def episodios(item): + logger.info() + itemlist = [] + + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t| |<br>", "", data) + # logger.info(data) + patron = '<div class="imagen"><a href="([^"]+)">.*?' # url cap, img + patron += '<div class="numerando">(.*?)</div>.*?' # numerando cap + patron += '<a href="[^"]+">([^<]+)</a>' # title de episodios + + matches = scrapertools.find_multiple_matches(data, patron) + + for scrapedurl, scrapedtitle, scrapedname in matches: + scrapedtitle = scrapedtitle.replace('--', '0') + patron = '(\d+) - (\d+)' + match = re.compile(patron, re.DOTALL).findall(scrapedtitle) + season, episode = match[0] + + if 'season' in item.infoLabels and int(item.infoLabels['season']) != int(season): + continue + + title = "%sx%s: %s" % (season, episode.zfill(2), scrapertools.unescape(scrapedname)) + new_item = item.clone(title=title, url=scrapedurl, action="findvideos", text_color=color3, fulltitle=title, + contentType="episode", extra='serie') + if 'infoLabels' not in new_item: + new_item.infoLabels = {} + + new_item.infoLabels['season'] = season + new_item.infoLabels['episode'] = episode.zfill(2) + + itemlist.append(new_item) + tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) + + # TODO no hacer esto si estamos añadiendo a la videoteca + if not item.extra: + # Obtenemos los datos de todos los capítulos de la temporada mediante multihilos + tmdb.set_infoLabels(itemlist, __modo_grafico__) + for i in itemlist: + if i.infoLabels['title']: + # Si el capitulo tiene nombre propio añadírselo al titulo del item + i.title = "%sx%s: %s" % (i.infoLabels['season'], i.infoLabels['episode'], i.infoLabels['title']) + if i.infoLabels.has_key('poster_path'): + # Si el capitulo tiene imagen propia remplazar al poster + i.thumbnail = i.infoLabels['poster_path'] + + itemlist.sort(key=lambda it: int(it.infoLabels['episode']), + reverse=config.get_setting('orden_episodios', __channel__)) + + # Opción "Añadir esta serie a la videoteca" + if config.get_videolibrary_support() and len(itemlist) > 0: + itemlist.append(Item(channel=__channel__, title="Añadir esta serie a la videoteca", url=item.url, + action="add_serie_to_library", extra="episodios", show=item.show, category="Series", + text_color=color1, thumbnail=get_thumb("videolibrary_tvshow.png"), fanart=fanart_host)) + + return itemlist + + +def findvideos(item): + logger.info() + itemlist = [] + + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + # logger.info(data) + patron = '<div id="option-(\d+)" class="[^"]+"><iframe.*?src="([^"]+)".*?</iframe>' # lang, url + matches = re.compile(patron, re.DOTALL).findall(data) + + for option, url in matches: + lang = scrapertools.find_single_match(data, '<li><a class="options" href="#option-%s">.*?<img ' + 'src="http://pedropolis.com/wp-content/themes/dooplay/assets/img' + '/flags/(\w+)' % option) + idioma = {'mx': '[COLOR cornflowerblue](LAT)[/COLOR]', 'pe': '[COLOR cornflowerblue](LAT)[/COLOR]', + 'co': '[COLOR cornflowerblue](LAT)[/COLOR]', 'es': '[COLOR green](CAST)[/COLOR]', + 'en': '[COLOR red](VOS)[/COLOR]', 'jp': '[COLOR green](VOS)[/COLOR]'} + if lang in idioma: + lang = idioma[lang] + + # obtenemos los redirecionamiento de shorturl en caso de coincidencia + if "bit.ly" in url: + url = httptools.downloadpage(url, follow_redirects=False, only_headers=True).headers.get("location", "") + + itemlist.append(item.clone(channel=__channel__, url=url, title=item.contentTitle, + action='play', language=lang)) + + itemlist = servertools.get_servers_itemlist(itemlist) + itemlist.sort(key=lambda it: it.language, reverse=False) + + for x in itemlist: + if x.extra != 'directo': + x.thumbnail = item.thumbnail + x.title = "Ver en: [COLOR yellow](%s)[/COLOR] %s" % (x.server.title(), x.language) + if item.extra != 'serie' and item.extra != 'buscar': + x.title = "Ver en: [COLOR yellowgreen](%s)[/COLOR] [COLOR yellow](%s)[/COLOR] %s" % ( + x.server.title(), x.quality, x.language) + + if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'serie': + itemlist.append(Item(channel=__channel__, + title='[COLOR yellow]Añadir esta pelicula a la videoteca[/COLOR]', + url=item.url, action="add_pelicula_to_library", + thumbnail=get_thumb("videolibrary_movie.png"), + extra="findvideos", contentTitle=item.contentTitle)) + + return itemlist diff --git a/plugin.video.alfa/channels/peliculasaudiolatino.json b/plugin.video.alfa/channels/peliculasaudiolatino.json index d4f6e3ea..b5884510 100755 --- a/plugin.video.alfa/channels/peliculasaudiolatino.json +++ b/plugin.video.alfa/channels/peliculasaudiolatino.json @@ -3,7 +3,7 @@ "name": "Peliculasaudiolatino", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "peliculasaudiolatino.png", "banner": "peliculasaudiolatino.png", "version": 1, @@ -22,7 +22,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/peliculasaudiolatino.py b/plugin.video.alfa/channels/peliculasaudiolatino.py old mode 100755 new mode 100644 index 6b6b9bc8..d5a021ac --- a/plugin.video.alfa/channels/peliculasaudiolatino.py +++ b/plugin.video.alfa/channels/peliculasaudiolatino.py @@ -7,7 +7,7 @@ from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import logger +from platformcode import logger, config HOST = 'http://peliculasaudiolatino.com' @@ -153,10 +153,19 @@ def findvideos(item): matches = re.compile(patron, re.DOTALL).findall(data) for servidor, idioma, calidad, scrapedurl in matches: url = scrapedurl - title = "Ver en " + servidor + " [" + idioma + "][" + calidad + "]" + server = servertools.get_server_name(servidor) + title = "Enlace encontrado en %s" % (server) itemlist.append(Item(channel=item.channel, action="play", title=title, fulltitle=item.fulltitle, url=url, - thumbnail=scrapedthumbnail, folder=False)) - + thumbnail=scrapedthumbnail, language=idioma, quality=calidad, server=server)) + if itemlist: + itemlist.append(Item(channel=item.channel)) + itemlist.append(item.clone(channel="trailertools", title="Buscar Tráiler", action="buscartrailer", + text_color="magenta")) + # Opción "Añadir esta película a la biblioteca de KODI" + if config.get_videolibrary_support(): + itemlist.append(Item(channel=item.channel, title="Añadir pelicula a la videoteca", text_color="green", + action="add_pelicula_to_library", url=item.url, thumbnail=item.thumbnail, + fulltitle=item.fulltitle)) return itemlist diff --git a/plugin.video.alfa/channels/peliculasdk.json b/plugin.video.alfa/channels/peliculasdk.json index fa9fc63b..bbbeb098 100755 --- a/plugin.video.alfa/channels/peliculasdk.json +++ b/plugin.video.alfa/channels/peliculasdk.json @@ -3,7 +3,7 @@ "name": "PeliculasDK", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "http://s29.postimg.org/wzw749oon/pldklog.jpg", "banner": "peliculasdk.png", "version": 1, diff --git a/plugin.video.alfa/channels/peliculasdk.py b/plugin.video.alfa/channels/peliculasdk.py old mode 100755 new mode 100644 index 3c0f4d0d..de32d30a --- a/plugin.video.alfa/channels/peliculasdk.py +++ b/plugin.video.alfa/channels/peliculasdk.py @@ -6,7 +6,9 @@ from core import scrapertools from core import servertools from core.item import Item from core.scrapertools import decodeHtmlentities as dhe -from platformcode import config, logger +from platformcode import logger +from platformcode import config +from core import tmdb try: import xbmc @@ -172,7 +174,6 @@ def peliculas(item): patron += 'Calidad:(.*?)</br>.*?' patron += 'Género:.*?tag">(.*?)</a>' matches = re.compile(patron, re.DOTALL).findall(data) - scrapertools.printMatches(matches) for scrapedurl, scrapedtitle, scrapedthumbnail, scrapedlenguaje, scrapedcalidad, scrapedgenero in matches: @@ -184,20 +185,22 @@ def peliculas(item): scrapedtitle = re.sub(r"\(\d+\)", "", scrapedtitle).strip() scrapedcalidad = re.sub(r"<a href.*?>|</a>", "", scrapedcalidad).strip() scrapedlenguaje = re.sub(r"<a href.*?>|</a>", "", scrapedlenguaje).strip() - scrapedcalidad = scrapedcalidad.replace(scrapedcalidad, - bbcode_kodi2html("[COLOR orange]" + scrapedcalidad + "[/COLOR]")) - + scrapedlenguaje = scrapedlenguaje.split(',') if not "Adultos" in scrapedgenero and not "Adultos" in scrapedlenguaje and not "Adultos" in scrapedcalidad: - scrapedlenguaje = scrapedlenguaje.replace(scrapedlenguaje, - bbcode_kodi2html("[COLOR orange]" + scrapedlenguaje + "[/COLOR]")) - scrapedtitle = scrapedtitle + "-(Idioma: " + scrapedlenguaje + ")" + "-(Calidad: " + scrapedcalidad + ")" - scrapedtitle = scrapedtitle.replace(scrapedtitle, - bbcode_kodi2html("[COLOR white]" + scrapedtitle + "[/COLOR]")) + scrapedtitle = scrapedtitle + extra = year + "|" + title_fan - itemlist.append(Item(channel=item.channel, title=scrapedtitle, url=scrapedurl, action="fanart", - thumbnail=scrapedthumbnail, extra=extra, - fanart="http://s18.postimg.org/h9kb22mnt/pdkfanart.jpg", library=True, folder=True)) + new_item = Item(channel=item.channel, title=scrapedtitle, url=scrapedurl, action="fanart", + thumbnail=scrapedthumbnail, extra=extra, + fanart="http://s18.postimg.org/h9kb22mnt/pdkfanart.jpg", library=True, folder=True, + language=scrapedlenguaje, quality=scrapedcalidad, contentTitle= scrapedtitle, infoLabels={ + 'year':year}) + #TODO Dividir los resultados antes + #if year: + # tmdb.set_infoLabels_item(new_item) + itemlist.append(new_item) + ## Paginación next_page = scrapertools.get_match(data, '<span class="current">.*?<a href="(.*?)".*?>Siguiente »</a></div>') @@ -453,7 +456,7 @@ def fanart(item): else: category = item.extra itemlist.append(Item(channel=item.channel, title=item.title, action="findvideos", url=item.url, - server="torrent", thumbnail=logo, fanart=item.extra, extra=extra, show=show, + thumbnail=logo, fanart=item.extra, extra=extra, show=show, category=category, library=item.library, fulltitle=fulltitle, folder=True)) title_info = "Info" @@ -540,17 +543,19 @@ def findvideos(item): continue servertitle = scrapertools.get_match(video_url, 'http.*?://(.*?)/') - servertitle = servertitle.replace(servertitle, - bbcode_kodi2html("[COLOR red]" + servertitle + "[/COLOR]")) servertitle = servertitle.replace("embed.", "") servertitle = servertitle.replace("player.", "") servertitle = servertitle.replace("api.video.", "") - servertitle = re.sub(r"hqq.tv|hqq.watch", "netu.tv", servertitle) - servertitle = servertitle.replace("anonymouse.org", "netu.tv") - title = bbcode_kodi2html("[COLOR orange]Ver en --[/COLOR]") + servertitle + " " + idioma + " " + calidad + servertitle = re.sub(r"hqq.tv|hqq.watch", "netutv", servertitle) + servertitle = servertitle.replace("anonymouse.org", "netu") + title = servertitle + logger.debug('servertitle: %s' % servertitle) + server = servertools.get_server_name(servertitle) + logger.debug('server: %s'%server) itemlist.append( - Item(channel=item.channel, title=title, url=video_url, action="play", thumbnail=item.category, - plot=scrapedplot, fanart=item.show)) + Item(channel=item.channel, title=title, url=video_url, action="play", + thumbnail=item.category, + plot=scrapedplot, fanart=item.show, server=server, language=idioma, quality=calidad)) if item.library and config.get_videolibrary_support() and len(itemlist) > 0: infoLabels = {'tmdb_id': item.infoLabels['tmdb_id'], 'title': item.fulltitle} diff --git a/plugin.video.alfa/channels/peliculaseroticas.json b/plugin.video.alfa/channels/peliculaseroticas.json index 8bbca10b..1b9c4b0c 100755 --- a/plugin.video.alfa/channels/peliculaseroticas.json +++ b/plugin.video.alfa/channels/peliculaseroticas.json @@ -3,7 +3,7 @@ "name": "PeliculasEroticas", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "peliculaseroticas.png", "banner": "peliculaseroticas.png", "version": 1, diff --git a/plugin.video.alfa/channels/peliculasgratis.json b/plugin.video.alfa/channels/peliculasgratis.json index 74811410..a28dc482 100755 --- a/plugin.video.alfa/channels/peliculasgratis.json +++ b/plugin.video.alfa/channels/peliculasgratis.json @@ -3,7 +3,7 @@ "name": "PeliculasGratis", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "http://imgur.com/ThH8Zmk.png", "banner": "peliculasgratis.png", "version": 1, diff --git a/plugin.video.alfa/channels/peliculasgratis.py b/plugin.video.alfa/channels/peliculasgratis.py old mode 100755 new mode 100644 index fd44147a..35e07ba5 --- a/plugin.video.alfa/channels/peliculasgratis.py +++ b/plugin.video.alfa/channels/peliculasgratis.py @@ -34,7 +34,7 @@ CALIDADES = {"micro1080p": "[COLOR plum]Micro1080p[/COLOR]", "dvds": "[COLOR lim "hdtv-rip": "[COLOR black]Hdtv-rip[/COLOR]", "micro720p": "[COLOR yellow]Micro720p[/COLOR]", "ts-hq": "[COLOR mediumspringgreen]Ts-Hq[/COLOR]", "camrip": "[COLOR royalblue]Camp-Rip[/COLOR]", "webs": "[COLOR lightsalmon]Webs[/COLOR]", "hd": "[COLOR mediumseagreen]HD[/COLOR]"} -IDIOMAS = {"castellano": "[COLOR yellow]Castelllano[/COLOR]", "latino": "[COLOR orange]Latino[/COLOR]", +IDIOMAS = {"castellano": "[COLOR yellow]Castellano[/COLOR]", "latino": "[COLOR orange]Latino[/COLOR]", "vose": "[COLOR lightsalmon]Subtitulada[/COLOR]", "vo": "[COLOR crimson]Ingles[/COLOR]", "en": "[COLOR crimson]Ingles[/COLOR]"} IDIOMASP = {"es": "[COLOR yellow]CAST[/COLOR]", "la": "[COLOR orange]LAT[/COLOR]", @@ -147,10 +147,13 @@ def scraper(item): matches = scrapertools.find_multiple_matches(bloque_enlaces, '<a class="i" href="([^"]+)".*?src="([^"]+)".*?">([^<]+)<.*?<div class="l">(.*?)<\/a><h3>.*?title[^<]+>([^<]+)<\/a><\/h3> <span>(.*?)<') for url, thumb, quality, check_idioma, title, check_year in matches: + + logger.debug('check_idioma: %s' % check_idioma) title_fan = title title_item = "[COLOR cornflowerblue][B]" + title + "[/B][/COLOR]" if item.contentType != "movie": - title = "[COLOR cornflowerblue][B]" + title + "[/B][/COLOR]" + title = title + idiomas = '' else: if quality == "ts": quality = re.sub(r'ts', 'ts-hq', quality) @@ -158,37 +161,14 @@ def scraper(item): quality = CALIDADES.get(quality) else: quality = quality - idiomas = scrapertools.find_multiple_matches(check_idioma, '<div class="id (.*?)">') - if len(idiomas) == 1: - idioma1 = idiomas[0].strip() - if IDIOMASP.get(idioma1): - idiomas = "-" + IDIOMASP.get(idioma1) - elif len(idiomas) == 2: - idioma1, idioma2 = idiomas[0], idiomas[1] - if IDIOMASP.get(idioma1, idioma2): - idioma1 = IDIOMASP.get(idioma1) - idioma2 = IDIOMASP.get(idioma2) - idiomas = "-" + idioma1 + "|" + idioma2 - elif len(idiomas) == 3: - idioma1, idioma2, idioma3 = idiomas[0], idiomas[1], idiomas[2] - idioma1 = IDIOMASP.get(idioma1) - idioma2 = IDIOMASP.get(idioma2) - idioma3 = IDIOMASP.get(idioma3) - idiomas = "-" + idioma1 + "|" + idioma2 + "|" + idioma3 - elif len(idiomas) >= 4: - idioma1, idioma2, idioma3, idioma4 = idiomas[0], idiomas[1], idiomas[2], idiomas[3] - idioma1 = IDIOMASP.get(idioma1) - idioma2 = IDIOMASP.get(idioma2) - idioma3 = IDIOMASP.get(idioma3) - idioma4 = IDIOMASP.get(idioma4) - idiomas = "-" + idioma1 + "|" + idioma2 + "|" + idioma3 + "|" + idioma4 - title = "[COLOR cornflowerblue][B]" + title + "[/B][/COLOR]" + " " + quality + " " + idiomas + idiomas = scrapertools.find_multiple_matches(check_idioma, '<div class="id (.*?)">') + title = title itemlist.append( Item(channel=item.channel, title=title, url=urlparse.urljoin(host, url), action="fanart", thumbnail=thumb, fanart="http://imgur.com/nqmJozd.jpg", extra=title_fan + "|" + title_item + "|" + check_year.strip(), - contentType=item.contentType, folder=True)) + contentType=item.contentType, folder=True, language = idiomas)) ## Paginación if check_year: next = scrapertools.find_single_match(data, 'href="([^"]+)" title="Siguiente página">') @@ -631,20 +611,14 @@ def findvideos(item): icon_server = icon_server.replace('streamin', 'streaminto') if not os.path.exists(icon_server): icon_server = thumb - if CALIDADES.get(calidad): - calidad = CALIDADES.get(calidad) - else: - calidad = "[COLOR brown]" + calidad + "[/COLOR]" - if IDIOMAS.get(idioma): - idioma = IDIOMAS.get(idioma) - else: - idioma = "[COLOR brown]" + idioma + "[/COLOR]" - + #calidad = calidad + #idioma = idioma + server = servertools.get_server_name(server_name) extra = "online" itemlist.append(Item(channel=item.channel, - title="[COLOR lightcyan][B]" + server + "[/B][/COLOR] " + calidad + " " + idioma, - url=url, action="play", thumbnail=icon_server, fanart="", contentType=item.contentType, - folder=True, id=url_post)) + title="server", url=url, action="play", fanart="", + contentType=item.contentType, folder=True, id=url_post, language=idioma, + quality=calidad, server = server)) else: bloque_dd = scrapertools.find_single_match(data, '<\/i>Descargar(.*?)<div class="enlaces">') links_dd = scrapertools.find_multiple_matches(bloque_dd, diff --git a/plugin.video.alfa/channels/peliculashindu.json b/plugin.video.alfa/channels/peliculashindu.json index 776c6b04..1448d5de 100755 --- a/plugin.video.alfa/channels/peliculashindu.json +++ b/plugin.video.alfa/channels/peliculashindu.json @@ -3,7 +3,7 @@ "name": "PeliculasHindu", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "peliculashindu.png", "banner": "peliculashindu.png", "version": 1, diff --git a/plugin.video.alfa/channels/peliculasmx.json b/plugin.video.alfa/channels/peliculasmx.json index b3434ac4..206a132d 100755 --- a/plugin.video.alfa/channels/peliculasmx.json +++ b/plugin.video.alfa/channels/peliculasmx.json @@ -3,7 +3,7 @@ "name": "PeliculasMX", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "peliculasmx.png", "banner": "peliculasmx.png", "version": 1, @@ -18,7 +18,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/peliculasmx.py b/plugin.video.alfa/channels/peliculasmx.py old mode 100755 new mode 100644 index 64b8fe2b..4055fd26 --- a/plugin.video.alfa/channels/peliculasmx.py +++ b/plugin.video.alfa/channels/peliculasmx.py @@ -4,10 +4,14 @@ import re import urlparse from core import scrapertools +from core import httptools +from core import tmdb from core.item import Item + from platformcode import logger + def mainlist(item): logger.info() @@ -25,8 +29,8 @@ def generos(item): itemlist = [] # Descarga la página - data = scrapertools.cachePage(item.url) - + data = httptools.downloadpage(item.url).data + logger.debug(data) # <li class="cat-item cat-item-3"><a href="http://peliculasmx.net/category/accion/" >Accion</a> <span>246</span> patron = '<li class="cat-item cat-item-.*?' patron += '<a href="([^"]+)".*?' @@ -51,24 +55,26 @@ def peliculas(item): itemlist = [] # Descarga la página - data = scrapertools.cachePage(item.url) - + data = httptools.downloadpage(item.url).data patron = '<div id="mt-.*?' patron += '<a href="([^"]+)".*?' patron += '<img src="([^"]+)".*?' patron += '<span class="tt">([^<]+).*?' + patron += '<span class="year">(\d{4})</span>.*?' patron += '<span class="calidad2">([^<]+)' matches = re.compile(patron, re.DOTALL).findall(data) - for match in matches: - scrapedurl = match[0] # urlparse.urljoin("",match[0]) - scrapedtitle = match[2] + ' [' + match[3] + ']' - scrapedthumbnail = match[1] - itemlist.append( - Item(channel=item.channel, action="findvideos", title=scrapedtitle, fulltitle=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, folder=True)) + for scrapedurl, scrapedthumbnail, scrapedtitle, year, quality in matches: + url =scrapedurl + title = scrapedtitle + thumbnail = scrapedthumbnail + itemlist.append( + Item(channel=item.channel, action="findvideos", title=title, contentTitle=title, url=url, + thumbnail=thumbnail, quality=quality, infoLabels={'year':year})) + + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) # Extrae la marca de siguiente página paginador = scrapertools.find_single_match(data, "<div class='paginado'>.*?lateral") diff --git a/plugin.video.alfa/channels/peliculasnu.json b/plugin.video.alfa/channels/peliculasnu.json index 431906ca..38e44252 100755 --- a/plugin.video.alfa/channels/peliculasnu.json +++ b/plugin.video.alfa/channels/peliculasnu.json @@ -1,7 +1,7 @@ { "id": "peliculasnu", "name": "Peliculas.Nu", - "language": "es", + "language": ["cast", "lat"], "active": true, "adult": false, "version": 1, @@ -27,8 +27,7 @@ "banner": "peliculasnu.png", "categories": [ "movie", - "vos", - "latino" + "vos" ], "settings": [ { diff --git a/plugin.video.alfa/channels/peliculasnu.py b/plugin.video.alfa/channels/peliculasnu.py old mode 100755 new mode 100644 index 002c4e6d..edfe851f --- a/plugin.video.alfa/channels/peliculasnu.py +++ b/plugin.video.alfa/channels/peliculasnu.py @@ -89,7 +89,7 @@ def newest(categoria): except: import sys for line in sys.exc_info(): - logger.error("{0}".format(line)) + logger.error("%s" % line) return [] return itemlist @@ -124,7 +124,8 @@ def entradas(item): infolabels = {'year': year} itemlist.append(Item(channel=item.channel, action="findvideos", url=scrapedurl, title=titulo, contentTitle=scrapedtitle, infoLabels=infolabels, text_color=color2, - thumbnail=scrapedthumbnail, contentType="movie", fulltitle=scrapedtitle)) + thumbnail=scrapedthumbnail, contentType="movie", fulltitle=scrapedtitle, + language=idiomas, quality=calidad)) if not item.from_newest: tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) @@ -214,13 +215,14 @@ def findvideos(item): url = url + '|' + item.url title = "%s - %s" % ('%s', title) - itemlist.append(item.clone(action="play", url=url, title=title, text_color=color3)) + itemlist.append(Item(channel=item.channel, action="play", url=url, title=title, text_color=color3)) itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) if item.extra != "findvideos" and config.get_videolibrary_support(): - itemlist.append(item.clone(title="Añadir película a la videoteca", action="add_pelicula_to_library", - extra="findvideos", text_color="green")) + itemlist.append( + item.clone(title="Añadir película a la videoteca", action="add_pelicula_to_library", extra="findvideos", + text_color="green")) return itemlist diff --git a/plugin.video.alfa/channels/peliculasrey.json b/plugin.video.alfa/channels/peliculasrey.json index bbb3b0af..59c1e46d 100755 --- a/plugin.video.alfa/channels/peliculasrey.json +++ b/plugin.video.alfa/channels/peliculasrey.json @@ -3,7 +3,7 @@ "name": "peliculasrey", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "peliculasrey.png", "banner": "peliculasrey.png", "version": 1, diff --git a/plugin.video.alfa/channels/peliculasrey.py b/plugin.video.alfa/channels/peliculasrey.py index 5e7312a3..bcaa5abd 100755 --- a/plugin.video.alfa/channels/peliculasrey.py +++ b/plugin.video.alfa/channels/peliculasrey.py @@ -3,23 +3,24 @@ import re import urlparse +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import logger +from platformcode import logger, config +host = "http://www.peliculasrey.com/" def mainlist(item): logger.info() itemlist = [] - itemlist.append( - Item(channel=item.channel, action="PorFecha", title="Año de Lanzamiento", url="http://www.peliculasrey.com")) - itemlist.append(Item(channel=item.channel, action="Idiomas", title="Idiomas", url="http://www.peliculasrey.com")) - itemlist.append( - Item(channel=item.channel, action="calidades", title="Por calidad", url="http://www.peliculasrey.com")) - itemlist.append(Item(channel=item.channel, action="generos", title="Por género", url="http://www.peliculasrey.com")) - itemlist.append(Item(channel=item.channel, action="search", title="Buscar...", url="http://www.peliculasrey.com")) + itemlist.append(Item(channel=item.channel, action="peliculas", title="Recientes", url=host)) + itemlist.append(Item(channel=item.channel, action="PorFecha", title="Año de Lanzamiento", url=host)) + itemlist.append(Item(channel=item.channel, action="Idiomas", title="Idiomas", url=host)) + itemlist.append(Item(channel=item.channel, action="calidades", title="Por calidad", url=host)) + itemlist.append(Item(channel=item.channel, action="generos", title="Por género", url=host)) + itemlist.append(Item(channel=item.channel, action="search", title="Buscar...", url=host)) return itemlist @@ -28,9 +29,8 @@ def PorFecha(item): logger.info() # Descarga la pagina - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data data = scrapertools.find_single_match(data, '<section class="lanzamiento">(.*?)</section>') - logger.info("data=" + data) # Extrae las entradas (carpetas) patron = '<a href="([^"]+).*?title="([^"]+)' @@ -42,7 +42,6 @@ def PorFecha(item): thumbnail = "" plot = "" url = urlparse.urljoin(item.url, scrapedurl) - logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") itemlist.append( Item(channel=item.channel, action="peliculas", title=title, url=url, thumbnail=thumbnail, plot=plot, fulltitle=title, viewmode="movie")) @@ -54,9 +53,8 @@ def Idiomas(item): logger.info() # Descarga la pagina - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data data = scrapertools.find_single_match(data, '<section class="idioma">(.*?)</section>') - logger.info("data=" + data) # Extrae las entradas (carpetas) patron = '<a href="([^"]+).*?title="([^"]+)' @@ -68,7 +66,6 @@ def Idiomas(item): thumbnail = "" plot = "" url = urlparse.urljoin(item.url, scrapedurl) - logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") itemlist.append( Item(channel=item.channel, action="peliculas", title=title, url=url, thumbnail=thumbnail, plot=plot, fulltitle=title, viewmode="movie")) @@ -80,9 +77,8 @@ def calidades(item): logger.info() # Descarga la pagina - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data data = scrapertools.find_single_match(data, '<section class="calidades">(.*?)</section>') - logger.info("data=" + data) # Extrae las entradas (carpetas) patron = '<a href="([^"]+).*?title="([^"]+)' @@ -94,7 +90,6 @@ def calidades(item): thumbnail = "" plot = "" url = urlparse.urljoin(item.url, scrapedurl) - logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") itemlist.append( Item(channel=item.channel, action="peliculas", title=title, url=url, thumbnail=thumbnail, plot=plot, fulltitle=title, viewmode="movie")) @@ -105,12 +100,8 @@ def calidades(item): def generos(item): logger.info() - # Descarga la pagina - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data data = scrapertools.find_single_match(data, '<section class="generos">(.*?)</section>') - logger.info("data=" + data) - - # Extrae las entradas (carpetas) patron = '<a href="([^"]+).*?title="([^"]+)' matches = re.compile(patron, re.DOTALL).findall(data) itemlist = [] @@ -120,7 +111,8 @@ def generos(item): thumbnail = "" plot = "" url = urlparse.urljoin(item.url, scrapedurl) - logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") + if "Adulto" in title and config.get_setting("adult_mode") == 0: + continue itemlist.append( Item(channel=item.channel, action="peliculas", title=title, url=url, thumbnail=thumbnail, plot=plot, fulltitle=title, viewmode="movie")) @@ -131,7 +123,7 @@ def generos(item): def search(item, texto): logger.info() texto = texto.replace(" ", "+") - item.url = "http://www.peliculasrey.com/?s=" + texto + item.url = host + "?s=" + texto try: # return buscar(item) @@ -148,8 +140,7 @@ def peliculas(item): logger.info() # Descarga la pagina - data = scrapertools.cache_page(item.url) - logger.info("data=" + data) + data = httptools.downloadpage(item.url).data data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) tabla_pelis = scrapertools.find_single_match(data, @@ -160,13 +151,18 @@ def peliculas(item): itemlist = [] for scrapedthumbnail, scrapedtitle, scrapedurl in matches: - logger.debug("title=[" + scrapedtitle + "], url=[" + scrapedurl + "], thumbnail=[" + scrapedthumbnail + "]") - itemlist.append(Item(channel=item.channel, action="findvideos", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot="", fulltitle=scrapedtitle)) + fulltitle = scrapedtitle.replace(scrapertools.find_single_match(scrapedtitle, '\([0-9]+\)' ), "") + itemlist.append(Item(channel = item.channel, + action = "findvideos", + title = scrapedtitle, + url = scrapedurl, + thumbnail = scrapedthumbnail, + plot = "", + fulltitle = fulltitle + )) next_page = scrapertools.find_single_match(data, 'rel="next" href="([^"]+)') if next_page != "": - # itemlist.append( Item(channel=item.channel, action="peliculas" , title=">> Página siguiente" , url=item.url+next_page, folder=True, viewmode="movie")) itemlist.append( Item(channel=item.channel, action="peliculas", title=">> Página siguiente", url=next_page, folder=True, viewmode="movie")) @@ -177,40 +173,43 @@ def peliculas(item): def findvideos(item): logger.info() - # Descarga la pagina - data = scrapertools.cache_page(item.url) - # logger.info("data="+data) - - # Extrae las entradas (carpetas) + data = httptools.downloadpage(item.url).data patron = 'hand" rel="([^"]+).*?title="(.*?)".*?<span>([^<]+)</span>.*?</span><span class="q">(.*?)<' - matches = re.compile(patron, re.DOTALL).findall(data) itemlist = [] + encontrados = [] + itemtemp = [] - for scrapedurl, nombre_servidor, idioma, calidad in matches: - idioma = idioma.strip() - calidad = calidad.strip() - - title = "Ver en " + nombre_servidor + " (" + idioma + ") (Calidad " + calidad + ")" - url = scrapedurl - thumbnail = "" - plot = "" - logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") - itemlist.append(Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, plot=plot, - folder=False)) - + for scrapedurl, server_name, language, quality in matches: + if scrapedurl in encontrados: + continue + encontrados.append(scrapedurl) + language = language.strip() + quality = quality.strip() + itemlist.append(Item(channel=item.channel, + action = "play", + extra = "", + fulltitle = item.fulltitle, + title = "%s (" + language + ") (" + quality + ")", + thumbnail = item.thumbnail, + url = scrapedurl, + folder = False, + language = language, + quality = quality + )) + itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) + if itemlist: + itemlist.append(Item(channel=item.channel)) + itemlist.append(item.clone(channel="trailertools", title="Buscar Tráiler", action="buscartrailer", + text_color="magenta")) + # Opción "Añadir esta película a la biblioteca de KODI" + if config.get_videolibrary_support(): + itemlist.append(Item(channel=item.channel, title="Añadir pelicula a la videoteca", text_color="green", + action="add_pelicula_to_library", url=item.url, thumbnail=item.thumbnail, + fulltitle=item.fulltitle)) return itemlist def play(item): - logger.info("url=" + item.url) - - itemlist = servertools.find_video_items(data=item.url) - - for videoitem in itemlist: - videoitem.title = item.title - videoitem.fulltitle = item.fulltitle - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - - return itemlist + item.thumbnail = item.contentThumbnail + return [item] diff --git a/plugin.video.alfa/channels/pelis24.json b/plugin.video.alfa/channels/pelis24.json deleted file mode 100755 index 70bb73e0..00000000 --- a/plugin.video.alfa/channels/pelis24.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "id": "pelis24", - "name": "Pelis24", - "active": true, - "adult": false, - "language": "es", - "thumbnail": "pelis24.png", - "banner": "pelis24.png", - "version": 1, - "changes": [ - { - "date": "27/04/17", - "description": "Adaptación por cambio de dominio y estructura" - }, - { - "date": "01/07/2016", - "description": "Eliminado código innecesario" - } - ], - "categories": [ - "latino", - "movie", - "vos" - ], - "settings": [ - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en busqueda global", - "default": false, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_peliculas", - "type": "bool", - "label": "Incluir en Novedades - Peliculas", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_infantiles", - "type": "bool", - "label": "Incluir en Novedades - Infantiles", - "default": true, - "enabled": true, - "visible": true - } - ] -} \ No newline at end of file diff --git a/plugin.video.alfa/channels/pelis24.py b/plugin.video.alfa/channels/pelis24.py deleted file mode 100755 index 15b3216a..00000000 --- a/plugin.video.alfa/channels/pelis24.py +++ /dev/null @@ -1,154 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import sys - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger - -thumbnail_host = 'https://github.com/master-1970/resources/raw/master/images/squares/pelis24.PNG' - - -def mainlist(item): - logger.info() - itemlist = [] - item.thumbnail = thumbnail_host - item.action = "peliculas" - itemlist.append(item.clone(title="Novedades", url="http://www.pelis24.tv/ultimas-peliculas/")) - itemlist.append(item.clone(title="Estrenos", url="http://pelis24.tv/estrenos/")) - itemlist.append(item.clone(title="", folder=False)) - itemlist.append(item.clone(title="Castellano", url="http://pelis24.tv/pelicula-ca/")) - itemlist.append(item.clone(title="Latino", url="http://pelis24.tv/pelicula-latino/")) - itemlist.append(item.clone(title="Versión original", url="http://pelis24.tv/peliculasvo/")) - itemlist.append(item.clone(title="Versión original subtitulada", url="http://pelis24.tv/peliculasvose/")) - - itemlist.append(item.clone(title="", folder=False)) - itemlist.append(item.clone(title="Filtrar por género", action="genero", url="http://pelis24.tv/tags/")) - itemlist.append(item.clone(title="Buscar", action="search", url="http://www.pelis24.tv/")) - return itemlist - - -def newest(categoria): - logger.info() - item = Item() - try: - if categoria == 'peliculas': - item.url = "http://www.pelis24.tv/ultimas-peliculas/" - elif categoria == 'infantiles': - item.url = "http://pelis24.tv/tags/Infantil/" - else: - return [] - - itemlist = peliculas(item) - if itemlist[-1].title == ">> Página siguiente": - itemlist.pop() - - # Se captura la excepción, para no interrumpir al canal novedades si un canal falla - except: - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - return itemlist - - -def search(item, texto): - logger.info() - try: - item.extra = texto - return buscar(item) - # Se captura la excepci?n, para no interrumpir al buscador global si un canal falla - except: - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def buscar(item): - itemlist = [] - if not item.page: - item.page = 1 - - url = "http://pelis24.tv/index.php?do=search&subaction=search&search_start=%s&story=%s" % ( - item.page, item.extra.replace(" ", "+")) - - data = httptools.downloadpage(url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - - patron = '<a class="sres-wrap clearfix" href="([^"]+).*?' - patron += '<img src="([^"]+)" alt="([^"]+)"' - - matches = re.compile(patron, re.DOTALL).findall(data) - - for url, thumbnail, title in matches: - if "/series/" in url: - # Descartamos las series - continue - - if not thumbnail.startswith("http"): - thumbnail = "http://www.pelis24.tv" + thumbnail - contentTitle = title.split("/")[0] - - itemlist.append( - Item(channel=item.channel, action="findvideos", title=contentTitle, url=url, thumbnail=thumbnail, - contentTitle=contentTitle)) - - if itemlist: - itemlist.append(item.clone(title=">> Página siguiente", action="buscar", thumbnail=thumbnail_host, - page=item.page + 1)) - - return itemlist - - -def genero(item): - logger.info() - itemlist = [] - generos = ["Animación", "Aventuras", "Bélico", "Ciencia+ficción", "Crimen", "Comedia", - "Deporte", "Drama", "Fantástico", "Infantil", "Musical", "Romance", "Terror", "Thriller"] - - for g in generos: - itemlist.append(Item(channel=item.channel, action="peliculas", title=g.replace('+', ' '), - thumbnail=thumbnail_host, url=item.url + g + "/")) - - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - data = scrapertools.find_single_match(data, "dle-content(.*?)not-main clearfix") - - patron = '<div class="movie-img img-box">.*?' - patron += '<img src="([^"]+).*?' - patron += 'href="([^"]+).*?' - patron += '<div class="movie-series">([^<]+)</div>' - patron += '<span><a href=[^>]+>([^<]+)</a>' - - matches = re.compile(patron, re.DOTALL).findall(data) - - for thumbnail, url, title, quality in matches: - if "/series/" in url: - # Descartamos las series - continue - - if not thumbnail.startswith("http"): - thumbnail = "http://www.pelis24.tv" + thumbnail - contentTitle = title.split("/")[0] - title = "%s (%s)" % (contentTitle, quality) - - itemlist.append( - Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, - contentQuality=quality, contentTitle=contentTitle)) - - # Extrae el paginador - next_page = scrapertools.find_single_match(data, '<span class="pnext"><a href="([^"]+)') - if next_page: - itemlist.append(Item(channel=item.channel, action="peliculas", title=">> Página siguiente", - thumbnail=thumbnail_host, url=next_page)) - - return itemlist diff --git a/plugin.video.alfa/channels/pelisadicto.json b/plugin.video.alfa/channels/pelisadicto.json index c9e6794b..3b42723d 100755 --- a/plugin.video.alfa/channels/pelisadicto.json +++ b/plugin.video.alfa/channels/pelisadicto.json @@ -3,7 +3,7 @@ "name": "Pelisadicto", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "pelisadicto.png", "banner": "pelisadicto.png", "version": 1, @@ -18,8 +18,7 @@ } ], "categories": [ - "movie", - "latino" + "movie" ], "settings": [ { diff --git a/plugin.video.alfa/channels/peliscity.json b/plugin.video.alfa/channels/peliscity.json index 75a76237..e9c744a3 100755 --- a/plugin.video.alfa/channels/peliscity.json +++ b/plugin.video.alfa/channels/peliscity.json @@ -3,7 +3,7 @@ "name": "Peliscity", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "peliscity.png", "banner": "peliscity.png", "version": 1, @@ -19,7 +19,6 @@ ], "categories": [ "movie", - "latino", "direct", "VOS" ] diff --git a/plugin.video.alfa/channels/peliscity.py b/plugin.video.alfa/channels/peliscity.py index 75873f52..78a924df 100755 --- a/plugin.video.alfa/channels/peliscity.py +++ b/plugin.video.alfa/channels/peliscity.py @@ -1,27 +1,38 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- import re -import urlparse +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import logger +from platformcode import config, logger +host = "http://peliscity.com" def mainlist(item): logger.info() - itemlist = [] + + data = httptools.downloadpage(host).data + patron = 'cat-item.*?span>([^<]+)' + matches = scrapertools.find_multiple_matches(data, patron) + can = 0 + for cantidad in matches: + can += int(cantidad.replace(".", "")) + + itemlist.append( - Item(channel=item.channel, title="Últimas agregadas", action="agregadas", url="http://peliscity.com", + Item(channel=item.channel, title="Películas: (%s)" %can, text_bold=True)) + itemlist.append( + Item(channel=item.channel, title=" Últimas agregadas", action="agregadas", url= host, viewmode="movie_with_plot")) - itemlist.append(Item(channel=item.channel, title="Peliculas HD", action="agregadas", - url="http://peliscity.com/calidad/hd-real-720", viewmode="movie_with_plot")) + itemlist.append(Item(channel=item.channel, title=" Peliculas HD", action="agregadas", + url= host + "/calidad/hd-real-720", viewmode="movie_with_plot")) itemlist.append( - Item(channel=item.channel, title="Listado por género", action="porGenero", url="http://peliscity.com")) - itemlist.append(Item(channel=item.channel, title="Buscar", action="search", url="http://peliscity.com/?s=")) - itemlist.append(Item(channel=item.channel, title="Idioma", action="porIdioma", url="http://peliscity.com/")) + Item(channel=item.channel, title=" Listado por género", action="porGenero", url= host)) + itemlist.append(Item(channel=item.channel, title=" Buscar", action="search", url= host + "/?s=")) + itemlist.append(Item(channel=item.channel, title=" Idioma", action="porIdioma", url= host)) return itemlist @@ -29,12 +40,12 @@ def mainlist(item): def porIdioma(item): itemlist = [] itemlist.append(Item(channel=item.channel, title="Castellano", action="agregadas", - url="http://www.peliscity.com/idioma/espanol-castellano/", viewmode="movie_with_plot")) + url= host + "/idioma/espanol-castellano/", viewmode="movie_with_plot")) itemlist.append( - Item(channel=item.channel, title="VOS", action="agregadas", url="http://www.peliscity.com/idioma/subtitulada/", + Item(channel=item.channel, title="VOS", action="agregadas", url= host + "/idioma/subtitulada/", viewmode="movie_with_plot")) itemlist.append(Item(channel=item.channel, title="Latino", action="agregadas", - url="http://www.peliscity.com/idioma/espanol-latino/", viewmode="movie_with_plot")) + url= host + "/idioma/espanol-latino/", viewmode="movie_with_plot")) return itemlist @@ -43,15 +54,16 @@ def porGenero(item): logger.info() itemlist = [] - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data - logger.info("data=" + data) - patron = 'cat-item.*?href="([^"]+).*?>(.*?)<' + patron = 'cat-item.*?href="([^"]+).*?>(.*?)<.*?span>([^<]+)' matches = re.compile(patron, re.DOTALL).findall(data) - for urlgen, genero in matches: - itemlist.append(Item(channel=item.channel, action="agregadas", title=genero, url=urlgen, folder=True, + for urlgen, genero, cantidad in matches: + cantidad = cantidad.replace(".", "") + titulo = genero + " (" + cantidad + ")" + itemlist.append(Item(channel=item.channel, action="agregadas", title=titulo, url=urlgen, folder=True, viewmode="movie_with_plot")) return itemlist @@ -60,7 +72,7 @@ def porGenero(item): def search(item, texto): logger.info() texto_post = texto.replace(" ", "+") - item.url = "http://www.peliscity.com/?s=" + texto_post + item.url = host + "/?s=" + texto_post try: return listaBuscar(item) @@ -76,26 +88,40 @@ def agregadas(item): logger.info() itemlist = [] - data = scrapertools.cache_page(item.url) - logger.info("data=" + data) + data = httptools.downloadpage(item.url).data + data = re.sub(r'\n|\r|\t|\s{2}| |"', "", data) - patron = 'class=\'reflectMe\' src="([^"]+).*?class="infor".*?href="([^"]+).*?<h2>(.*?)<.*?class="sinopsis">(.*?)<' # url + patron = scrapertools.find_multiple_matches (data,'<divclass=col-mt-5 postsh>.*?Duración') - matches = re.compile(patron, re.DOTALL).findall(data) - - for thumbnail, url, title, sinopsis in matches: - url = urlparse.urljoin(item.url, url) - thumbnail = urlparse.urljoin(url, thumbnail) - itemlist.append(Item(channel=item.channel, action="findvideos", title=title + " ", fulltitle=title, url=url, - thumbnail=thumbnail, show=title, plot=sinopsis)) + for element in patron: + info = scrapertools.find_single_match(element, + "calidad>(.*?)<.*?ahref=(.*?)>.*?'reflectMe' src=(.*?)\/>.*?<h2>(.*?)" + "<\/h2>.*?sinopsis>(.*?)<\/div>.*?Año:<\/span>(.*?)<\/li>") + quality = info[0] + url = info[1] + thumbnail = info[2] + title = info[3] + plot = info[4] + year = info[5].strip() + itemlist.append(Item(channel=item.channel, + action='findvideos', + contentType = "movie", + fulltitle = title, + infoLabels={'year':year}, + plot=plot, + quality=quality, + thumbnail=thumbnail, + title=title, + contentTitle = title, + url=url + )) # Paginación try: - patron = 'tima">.*?href="([^"]+)" ><i' + next_page = scrapertools.find_single_match(data,'tima>.*?href=(.*?) ><i') - next_page = re.compile(patron, re.DOTALL).findall(data) - - itemlist.append(Item(channel=item.channel, action="agregadas", title="Página siguiente >>", url=next_page[0], + itemlist.append(Item(channel=item.channel, action="agregadas", title='Pagina Siguiente >>', + url=next_page.strip(), viewmode="movie_with_plot")) except: pass @@ -107,7 +133,7 @@ def listaBuscar(item): logger.info() itemlist = [] - data = scrapertools.cache_page(item.url) + data = httptools.downloadpage(item.url).data data = re.sub(r"\n", " ", data) logger.info("data=" + data) @@ -129,30 +155,33 @@ def findvideos(item): plot = item.plot # Descarga la pagina - data = scrapertools.cache_page(item.url) - patron = 'class="optxt"><span>(.*?)<.*?width.*?class="q">(.*?)</span.*?cursor: hand" rel="(.*?)"' + data = httptools.downloadpage(item.url).data + patron = 'cursor: hand" rel="(.*?)".*?class="optxt"><span>(.*?)<.*?width.*?class="q">(.*?)</span' matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedidioma, scrapedcalidad, scrapedurl in matches: + for scrapedurl, scrapedidioma, scrapedcalidad in matches: idioma = "" - scrapedserver = re.findall("http[s*]?://(.*?)/", scrapedurl) - title = item.title + " [" + scrapedcalidad + "][" + scrapedidioma + "][" + scrapedserver[0] + "]" + title = "%s [" + scrapedcalidad + "][" + scrapedidioma +"]" + if "youtube" in scrapedurl: + scrapedurl += "&" + quality = scrapedcalidad + language = scrapedidioma if not ("omina.farlante1" in scrapedurl or "404" in scrapedurl): itemlist.append( - Item(channel=item.channel, action="play", title=title, fulltitle=title, url=scrapedurl, thumbnail="", - plot=plot, show=item.show)) + Item(channel=item.channel, action="play", title=title, fulltitle=item.title, url=scrapedurl, + thumbnail=item.thumbnail, plot=plot, show=item.show, quality= quality, language=language, extra = item.thumbnail)) + itemlist=servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) + # Opción "Añadir esta película a la biblioteca de KODI" + if item.extra != "library": + if config.get_videolibrary_support(): + itemlist.append(Item(channel=item.channel, title="Añadir a la videoteca", text_color="green", + filtro=True, action="add_pelicula_to_library", url=item.url, thumbnail = item.thumbnail, + infoLabels={'title': item.fulltitle}, fulltitle=item.title, + extra="library")) return itemlist def play(item): logger.info() - - itemlist = servertools.find_video_items(data=item.url) - - for videoitem in itemlist: - videoitem.title = item.title - videoitem.fulltitle = item.fulltitle - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - - return itemlist + item.thumbnail = item.extra + return [item] diff --git a/plugin.video.alfa/channels/peliscon.json b/plugin.video.alfa/channels/peliscon.json index d08a4de2..527c1253 100755 --- a/plugin.video.alfa/channels/peliscon.json +++ b/plugin.video.alfa/channels/peliscon.json @@ -3,7 +3,7 @@ "name": "Peliscon", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "http://imgur.com/yTQRPUJ.png", "version": 1, "changes": [ diff --git a/plugin.video.alfa/channels/peliscon.py b/plugin.video.alfa/channels/peliscon.py index 973aeda7..8c18c019 100755 --- a/plugin.video.alfa/channels/peliscon.py +++ b/plugin.video.alfa/channels/peliscon.py @@ -154,35 +154,34 @@ def scraper(item): data = httptools.downloadpage(item.url).data data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - if item.contentType == "movie": patron = scrapertools.find_multiple_matches(data, - '<div class="poster"><a href="([^"]+)"><img src="([^"]+)" alt="([^"]+)".*?/flags/(.*?).png.*?<span>(.*?)</span>') + '<div class="poster">.*?src="(.*?)" alt=.*?href="(.*?)">.*?' + '<h4>(.*?)<\/h4>.*?img\/flags\/(.*?)\.png.*?imdb.*?<span>(.*?)>') - for url, thumb, title, idioma, year in patron: + for thumb, url, title, language, year in patron: titulo = title title = re.sub(r"!|¡", "", title) title = title.replace("Autosia", "Autopsia") title = re.sub(r"’|PRE-Estreno", "'", title) new_item = item.clone(action="findvideos", title="[COLOR aqua]" + titulo + "[/COLOR]", url=url, - fulltitle=title, contentTitle=title, contentType="movie", extra=year, library=True) - new_item.infoLabels['year'] = year + fulltitle=title, contentTitle=title, contentType="movie", extra=year, library=True, + language= language, infoLabels={'year':year}) itemlist.append(new_item) - else: patron = scrapertools.find_multiple_matches(data, - '<div class="poster"><a href="([^"]+)"><img src="([^"]+)" alt="([^"]+)".*?<span>(.*?)</span>') + '<div class="poster">.*?src="(.*?)" alt=.*?href="(.*?)">.*?' + '<h4>(.*?)<\/h4>.*?<span>(.*?)<') - for url, thumb, title, year in patron: + for thumb, url, title, year in patron: titulo = title.strip() title = re.sub(r"\d+x.*", "", title) new_item = item.clone(action="findtemporadas", title="[COLOR aqua]" + titulo + "[/COLOR]", url=url, thumbnail=thumb, fulltitle=title, contentTitle=title, show=title, - contentType="tvshow", library=True) - new_item.infoLabels['year'] = year + contentType="tvshow", library=True, infoLabels={'year':year}) itemlist.append(new_item) ## Paginación @@ -282,7 +281,6 @@ def findtemporadas(item): check_temp = "yes" data = httptools.downloadpage(item.url).data data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - if len(item.extra.split("|")): if len(item.extra.split("|")) >= 4: fanart = item.extra.split("|")[2] @@ -423,6 +421,7 @@ def findvideos(item): new_item.infoLabels['episode'] = item.epi new_item.infoLabels['season'] = item.temp itemlist.append(new_item) + itemlist = servertools.get_servers_itemlist(itemlist) else: title = "[COLOR darkcyan][B]Ver capítulo [/B][/COLOR]" + "[COLOR red][B]" + capitulo + "[/B][/COLOR]" + " " + "[COLOR darkred]" + server + " ( " + idioma + " )" + "[/COLOR]" itemlist.append(Item(channel=item.channel, title=title, url=url, action="play", fanart=fanart, diff --git a/plugin.video.alfa/channels/pelisencasa.json b/plugin.video.alfa/channels/pelisencasa.json index fc6f25fe..7f8b77cd 100755 --- a/plugin.video.alfa/channels/pelisencasa.json +++ b/plugin.video.alfa/channels/pelisencasa.json @@ -3,14 +3,13 @@ "name": "PelisEnCasa", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s14.postimg.org/iqiq0bxn5/pelisencasa.png", "banner": "https://s18.postimg.org/j775ehbg9/pelisencasa_banner.png", "version": 1, "date": "17/03/2017", "changes": "First release", "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/pelisfox.json b/plugin.video.alfa/channels/pelisfox.json index c8730240..3f94badb 100755 --- a/plugin.video.alfa/channels/pelisfox.json +++ b/plugin.video.alfa/channels/pelisfox.json @@ -3,7 +3,7 @@ "name": "pelisfox", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s14.postimg.org/c43etc1lt/pelisfox.png", "banner": "https://s30.postimg.org/p6twg905d/pelisfox-banner.png", "version": 1, @@ -22,7 +22,6 @@ } ], "categories": [ - "latino", "direct", "movie" ], diff --git a/plugin.video.alfa/channels/pelisfox.py b/plugin.video.alfa/channels/pelisfox.py index 19ab6dc0..fea2249c 100644 --- a/plugin.video.alfa/channels/pelisfox.py +++ b/plugin.video.alfa/channels/pelisfox.py @@ -7,6 +7,7 @@ from core import jsontools from core import scrapertools from core import servertools from core import tmdb +from core import jsontools from core.item import Item from platformcode import config, logger @@ -237,39 +238,43 @@ def findvideos(item): language=lang, url=url )) - logger.debug('templist: %s' % templist) for videoitem in templist: - logger.debug('videoitem.language: %s' % videoitem.language) data = httptools.downloadpage(videoitem.url).data - data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) - id = scrapertools.find_single_match(data, 'var _SOURCE =.*?source:(.*?),') - if videoitem.language == 'SUB': - sub = scrapertools.find_single_match(data, 'var _SOURCE =.*?srt:(.*?),') - sub = sub.replace('\\', '') - else: - sub = '' - new_url = 'https://onevideo.tv/api/player?key=90503e3de26d45e455b55e9dc54f015b3d1d4150&link' \ - '=%s&srt=%s' % (id, sub) + urls_list = scrapertools.find_multiple_matches(data, '({"type":.*?})') + for element in urls_list: + json_data=jsontools.load(element) - data = httptools.downloadpage(new_url).data + id = json_data['id'] + sub = json_data['srt'] + url = json_data['source'] - url = scrapertools.find_single_match(data, '<iframe src="(.*?preview)"') - title = videoitem.contentTitle + ' (' + audio[videoitem.language] + ')' - logger.debug('url: %s' % url) - video_list.extend(servertools.find_video_items(data=url)) - for urls in video_list: - if urls.language == '': - urls.language = videoitem.language - urls.title = item.title + '(%s) (%s)' % (urls.language, urls.server) - logger.debug('video_list: %s' % video_list) - # itemlist.append(item.clone(title= title, url = url, action = 'play', subtitle = sub)) + quality = json_data['quality'] + if 'http' not in url : - for video_url in video_list: - video_url.channel = item.channel - video_url.action = 'play' + new_url = 'https://onevideo.tv/api/player?key=90503e3de26d45e455b55e9dc54f015b3d1d4150&link' \ + '=%s&srt=%s' % (url, sub) - if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findvideos': - itemlist.append( + data = httptools.downloadpage(new_url).data + data = re.sub(r'\\', "", data) + video_list.extend(servertools.find_video_items(data=data)) + for urls in video_list: + if urls.language == '': + urls.language = videoitem.language + urls.title = item.title + '(%s) (%s)' % (urls.language, urls.server) + + + for video_url in video_list: + video_url.channel = item.channel + video_url.action = 'play' + video_url.quality = quality + else: + server = servertools.get_server_from_url(url) + video_list.append(item.clone(title=item.title, url=url, action='play', quality = quality, + server=server)) + + + if config.get_videolibrary_support() and len(video_list) > 0 and item.extra != 'findvideos': + video_list.append( Item(channel=item.channel, title='[COLOR yellow]Añadir esta pelicula a la videoteca[/COLOR]', url=item.url, diff --git a/plugin.video.alfa/channels/pelisgratis.json b/plugin.video.alfa/channels/pelisgratis.json index 63d1efb1..7f5b5e5d 100755 --- a/plugin.video.alfa/channels/pelisgratis.json +++ b/plugin.video.alfa/channels/pelisgratis.json @@ -3,7 +3,7 @@ "name": "PelisGratis", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "https://s30.postimg.org/kilh4lr4x/pelisgratis.png", "banner": "https://s15.postimg.org/nztottswb/pelisgratis-banner.png", "version": 1, @@ -14,7 +14,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/pelisgratis.py b/plugin.video.alfa/channels/pelisgratis.py index f53df573..c415d561 100755 --- a/plugin.video.alfa/channels/pelisgratis.py +++ b/plugin.video.alfa/channels/pelisgratis.py @@ -6,6 +6,7 @@ from core import httptools from core import scrapertools from core import servertools from core import tmdb +from core import jsontools from core.item import Item from platformcode import config, logger @@ -217,56 +218,29 @@ def findvideos(item): duplicados = [] data = get_source(item.url) - data = data.replace('amp;', '') - data_page = data - - patron = 'class=TPlayerTb id=(.*?)><iframe width="560" height="315" src="(.*?)"' + patron = '<div class=TPlayerTbCurrent id=(.*?)><iframe.*?src=(.*?) frameborder' matches = re.compile(patron, re.DOTALL).findall(data) - for option, video_page in matches: - language = scrapertools.find_single_match(data_page, 'TPlayerNv=%s><span>.*?<center>(.*?)<\/center>' % option) - if language == 'Castellano': - language = 'Español' - if language in audio: - id_audio = audio[language] - else: - id_audio = language - if 'redirect' in video_page or 'yourplayer' in video_page: - data = get_source('http:%s' % video_page) - - patron = 'label:(.*?),.*?file:(.*?)&app.*?}' - matches = re.compile(patron, re.DOTALL).findall(data) - for video_url in matches: - - url = video_url[1] - url = url.replace('\/', '/') - title = item.contentTitle + ' [%s][%s]' % (video_url[0], id_audio) - server = 'directo' - if url not in duplicados: - itemlist.append(item.clone(action='play', - title=title, - url=url, - server=server - )) - duplicados.append(url) - else: - if video_page not in duplicados: - itemlist.extend(servertools.find_video_items(data=video_page)) - duplicados.append(video_page) - - for video_item in itemlist: - if video_item.server != 'directo': - video_item.channel = item.channel - video_item.quality = item.quality - video_item.title = item.contentTitle + ' [%s][%s]' % (video_item.server, id_audio) - - if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findvideos': - itemlist.append(item.clone(title='[COLOR yellow]Añadir esta pelicula a la videoteca[/COLOR]', - url=item.url, - action="add_pelicula_to_library", - extra="findvideos", - contentTitle=item.contentTitle - )) + for opt, urls_page in matches: + language = scrapertools.find_single_match (data,'data-TPlayerNv=%s><span>Opción <strong>.*?' + '<\/strong><\/span>.*?<span>(.*?)<\/span'%opt) + data = httptools.downloadpage(urls_page).data + servers = scrapertools.find_multiple_matches(data,'<button id="(.*?)"') + for server in servers: + info_urls = urls_page.replace('embed','get') + video_info=httptools.downloadpage(info_urls+'/'+server).data + video_info = jsontools.load(video_info) + video_id = video_info['extid'] + video_server = video_info['server'] + video_status = video_info['status'] + if video_status in ['finished', 'propio']: + if video_status == 'finished': + url = 'https://'+video_server+'/embed/'+video_id + else: + url = 'https://'+video_server+'/e/'+video_id + title = item.title + itemlist.append(item.clone(title=title, url=url, action='play', language=language)) + itemlist = servertools.get_servers_itemlist(itemlist) return itemlist diff --git a/plugin.video.alfa/channels/pelisipad.json b/plugin.video.alfa/channels/pelisipad.json index 7ca7abaf..fa6f8eb4 100755 --- a/plugin.video.alfa/channels/pelisipad.json +++ b/plugin.video.alfa/channels/pelisipad.json @@ -1,7 +1,7 @@ { "id": "pelisipad", "name": "PelisIpad", - "language": "es", + "language": ["cast"], "active": true, "adult": false, "version": 1, @@ -14,7 +14,8 @@ "thumbnail": "http://i.imgur.com/FzLmGKK.png", "categories": [ "movie", - "tvshow" + "tvshow", + "direct" ], "settings": [ { diff --git a/plugin.video.alfa/channels/pelisipad.py b/plugin.video.alfa/channels/pelisipad.py index 264e8534..f6425fcd 100755 --- a/plugin.video.alfa/channels/pelisipad.py +++ b/plugin.video.alfa/channels/pelisipad.py @@ -6,6 +6,7 @@ import unicodedata from core import httptools from core import jsontools from core import scrapertools +from core import servertools from core.item import Item from platformcode import config, logger @@ -152,20 +153,20 @@ def entradas(item): thumbnail = host % "movie/%s/poster_167x250.jpg" % child["id"] if child['height'] < 720: - quality = "[B] [SD][/B]" + quality = "SD" elif child['height'] < 1080: - quality = "[B] [720p][/B]" + quality = "720p" elif child['height'] >= 1080: - quality = "[B] [1080p][/B]" + quality = "1080p" fulltitle = unicodedata.normalize('NFD', unicode(child['name'], 'utf-8')).encode('ASCII', 'ignore') \ .decode("utf-8") if child['name'] == "": title = child['id'].rsplit(".", 1)[0] else: title = child['name'] - if child['year']: - title += " (" + child['year'] + ")" - title += quality + #if child['year']: + # title += " (" + child['year'] + ")" + #title += quality video_urls = [] for k, v in child.get("video", {}).items(): @@ -175,7 +176,7 @@ def entradas(item): itemlist.append(Item(channel=item.channel, action="findvideos", server="", title=title, url=url, thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, infoLabels=infolabels, - contentTitle=fulltitle, video_urls=video_urls, text_color=color3)) + contentTitle=fulltitle, video_urls=video_urls, text_color=color3, quality=quality)) return itemlist @@ -517,12 +518,12 @@ def findvideos(item): import base64 item.video_urls.sort(key=lambda it: (it[1], random.random()), reverse=True) i = 0 - calidad_actual = "" - for vid, calidad in item.video_urls: - title = "Ver vídeo en %sp" % calidad - if calidad != calidad_actual: + actual_quality = "" + for vid, quality in item.video_urls: + title = "Ver vídeo en %sp" % quality + if quality != actual_quality: i = 0 - calidad_actual = calidad + actual_quality = quality if i % 2 == 0: title += " [COLOR purple]Mirror %s[/COLOR] - %s" % (str(i + 1), item.fulltitle) @@ -530,14 +531,15 @@ def findvideos(item): title += " [COLOR green]Mirror %s[/COLOR] - %s" % (str(i + 1), item.fulltitle) url = vid % "%s" % base64.b64decode("dHQ9MTQ4MDE5MDQ1MSZtbT1NRzZkclhFand6QmVzbmxSMHNZYXhBJmJiPUUwb1dVVVgx" "WTBCQTdhWENpeU9paUE=") - itemlist.append(item.clone(title=title, action="play", url=url, server="directo", video_urls="")) + itemlist.append(item.clone(title=title, action="play", url=url, video_urls="")) i += 1 if itemlist and item.extra == "" and config.get_videolibrary_support(): itemlist.append(Item(channel=item.channel, title="Añadir enlaces a la videoteca", text_color=color5, contentTitle=item.fulltitle, url=item.url, action="add_pelicula_to_library", - infoLabels={'title': item.fulltitle}, extra="findvideos", fulltitle=item.fulltitle)) - + infoLabels={'title': item.fulltitle}, extra="findvideos", fulltitle=item.fulltitle + )) + itemlist = servertools.get_servers_itemlist(itemlist) return itemlist diff --git a/plugin.video.alfa/channels/pelismagnet.json b/plugin.video.alfa/channels/pelismagnet.json index 5418faa0..01a65eee 100755 --- a/plugin.video.alfa/channels/pelismagnet.json +++ b/plugin.video.alfa/channels/pelismagnet.json @@ -3,7 +3,7 @@ "name": "PelisMagnet", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "pelismagnet.png", "banner": "pelismagnet.png", "changes": { diff --git a/plugin.video.alfa/channels/pelismagnet.py b/plugin.video.alfa/channels/pelismagnet.py old mode 100755 new mode 100644 index ecb61647..de3369f1 --- a/plugin.video.alfa/channels/pelismagnet.py +++ b/plugin.video.alfa/channels/pelismagnet.py @@ -6,6 +6,7 @@ import urllib from core import httptools from core import jsontools from core import scrapertools +from core import servertools from core.item import Item from platformcode import config, logger @@ -84,7 +85,7 @@ def menu_genero(item): itemlist = [] - response = httptools.downloadpage("https://kproxy.com/") + httptools.downloadpage("https://kproxy.com/") url = "https://kproxy.com/doproxy.jsp" post = "page=%s&x=34&y=14" % urllib.quote(host + "/principal") response = httptools.downloadpage(url, post, follow_redirects=False).data @@ -108,7 +109,7 @@ def series(item): logger.info() itemlist = [] - response = httptools.downloadpage("https://kproxy.com/") + httptools.downloadpage("https://kproxy.com/") url = "https://kproxy.com/doproxy.jsp" post = "page=%s&x=34&y=14" % urllib.quote(item.url) response = httptools.downloadpage(url, post, follow_redirects=False).data @@ -126,17 +127,17 @@ def series(item): punt = i.get("puntuacio", "") valoracion = "" if punt and not 0: - valoracion = " (Val: {punt})".format(punt=punt) + valoracion = " (Val: %s)" % punt - title = "{nombre}{val}".format(nombre=i.get("nom", ""), val=valoracion) - url = "{url}?id={id}".format(url=api_temp, id=i.get("id", "")) + title = "%s%s" % (i.get("nom", ""), valoracion) + url = "%s?id=%s" % (api_temp, i.get("id", "")) thumbnail = "" fanart = "" if i.get("posterurl", ""): - thumbnail = "http://image.tmdb.org/t/p/w342{file}".format(file=i.get("posterurl", "")) + thumbnail = "http://image.tmdb.org/t/p/w342%s" % i.get("posterurl", "") if i.get("backurl", ""): - fanart = "http://image.tmdb.org/t/p/w1280{file}".format(file=i.get("backurl", "")) + fanart = "http://image.tmdb.org/t/p/w1280%s" % i.get("backurl", "") plot = i.get("info", "") if plot is None: @@ -144,7 +145,7 @@ def series(item): infoLabels = {'plot': plot, 'year': i.get("year"), 'tmdb_id': i.get("id"), 'mediatype': 'tvshow'} - itemlist.append(Item(channel=item.channel, action="episodios", title=title, url=url, server="torrent", + itemlist.append(Item(channel=item.channel, action="episodios", title=title, url=url, thumbnail=thumbnail, fanart=fanart, infoLabels=infoLabels, contentTitle=i.get("nom"), show=i.get("nom"))) @@ -165,7 +166,7 @@ def episodios(item): logger.info() itemlist = [] - response = httptools.downloadpage("https://kproxy.com/") + httptools.downloadpage("https://kproxy.com/") url = "https://kproxy.com/doproxy.jsp" post = "page=%s&x=34&y=14" % urllib.quote(item.url) response = httptools.downloadpage(url, post, follow_redirects=False).data @@ -173,48 +174,61 @@ def episodios(item): data = httptools.downloadpage(url).data data = jsontools.load(data) - for i in data.get("temporadas", []): - titulo = "{temporada} ({total} Episodios)".format(temporada=i.get("nomtemporada", ""), - total=len(i.get("capituls", "0"))) - itemlist.append(Item(channel=item.channel, action="episodios", title=titulo, url=item.url, - server="torrent", fanart=item.fanart, thumbnail=item.thumbnail, plot=data.get("info", ""), - folder=False)) + dict_episodes = dict() + + for i in data.get("temporadas", []): for j in i.get("capituls", []): - numero = j.get("infocapitul", "") - if not numero: - numero = "{temp}x{cap}".format(temp=i.get("numerotemporada", ""), cap=j.get("numerocapitul", "")) + numero = j.get("infocapitul", "%sx%s" % (i.get("numerotemporada", 0), j.get("numerocapitul", 0))) - titulo = j.get("nomcapitul", "") - if not titulo: - titulo = "Capítulo {num}".format(num=j.get("numerocapitul", "")) + if numero not in dict_episodes: + dict_episodes[numero] = {} + dict_episodes[numero]["title"] = j.get("nomcapitul", "Episodio %s" % j.get("numerocapitul", "")) - calidad = "" - if j.get("links", {}).get("calitat", ""): - calidad = " [{calidad}]".format(calidad=j.get("links", {}).get("calitat", "")) + season = i.get("numerotemporada", 0) + if type(season) == str: + season = 0 + dict_episodes[numero]["season"] = season - title = " {numero} {titulo}{calidad}".format(numero=numero, titulo=titulo, calidad=calidad) + episode = j.get("numerocapitul", 0) + if type(episode) == str: + episode = 0 + dict_episodes[numero]["episode"] = episode + + if j.get("links", {}).get("magnet"): + dict_episodes[numero]["url"] = [j.get("links", {}).get("magnet")] + dict_episodes[numero]["quality"] = [j.get("links", {}).get("calitat", "")] + + dict_episodes[numero]["plot"] = j.get("overviewcapitul", "") - if j.get("links", {}).get("magnet", ""): - url = j.get("links", {}).get("magnet", "") else: - return [Item(channel=item.channel, title='No hay enlace magnet disponible para este capitulo')] + if dict_episodes[numero]["title"] == "": + dict_episodes[numero]["title"] = j.get("nomcapitul", "Episodio %s" % j.get("numerocapitul", "")) - plot = i.get("overviewcapitul", "") - if plot is None: - plot = "" + if j.get("links", {}).get("magnet"): + dict_episodes[numero]["url"].append(j.get("links", {}).get("magnet")) + dict_episodes[numero]["quality"].append(j.get("links", {}).get("calitat", "")) - infoLabels = item.infoLabels - if plot: - infoLabels["plot"] = plot - infoLabels["season"] = i.get("numerotemporada") - infoLabels["episode"] = j.get("numerocapitul") - itemlist.append( - Item(channel=item.channel, action="play", title=title, url=url, server="torrent", infoLabels=infoLabels, - thumbnail=item.thumbnail, fanart=item.fanart, show=item.show, contentTitle=item.contentTitle, - contentSeason=i.get("numerotemporada"), contentEpisodeNumber=j.get("numerocapitul"))) + if dict_episodes[numero]["plot"] == "": + dict_episodes[numero]["plot"] = j.get("overviewcapitul", "") + + # logger.debug("\n\n\n dict_episodes: %s " % dict_episodes) + + for key, value in dict_episodes.items(): + list_no_duplicate = list(set(value["quality"])) + title = "%s %s [%s]" % (key, value["title"], "][".join(list_no_duplicate)) + + itemlist.append( + Item(channel=item.channel, action="findvideos", title=title, url=url, + thumbnail=item.thumbnail, fanart=item.fanart, show=item.show, data=value, + contentSerieName=item.contentTitle, contentSeason=value["season"], + contentEpisodeNumber=value["episode"])) + + # order list + if len(itemlist) > 1: + itemlist = sorted(itemlist, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) return itemlist @@ -224,7 +238,7 @@ def pelis(item): itemlist = [] - response = httptools.downloadpage("https://kproxy.com/") + httptools.downloadpage("https://kproxy.com/") url = "https://kproxy.com/doproxy.jsp" post = "page=%s&x=34&y=14" % urllib.quote(item.url) response = httptools.downloadpage(url, post, follow_redirects=False).data @@ -242,34 +256,35 @@ def pelis(item): valoracion = "" if punt and not 0: - valoracion = " (Val: {punt})".format(punt=punt) + valoracion = " (Val: %s)" % punt if i.get("magnets", {}).get("M1080", {}).get("magnet", ""): url = i.get("magnets", {}).get("M1080", {}).get("magnet", "") - calidad = "[{calidad}]".format(calidad=i.get("magnets", {}).get("M1080", {}).get("quality", "")) + calidad = "%s" % i.get("magnets", {}).get("M1080", {}).get("quality", "") else: url = i.get("magnets", {}).get("M720", {}).get("magnet", "") - calidad = "[{calidad}]".format(calidad=i.get("magnets", {}).get("M720", {}).get("quality", "")) + calidad = "%s" % (i.get("magnets", {}).get("M720", {}).get("quality", "")) if not url: continue - title = "{nombre} {calidad}{val}".format(nombre=i.get("nom", ""), val=valoracion, calidad=calidad) + title = "%s %s%s" % (i.get("nom", ""), valoracion, calidad) thumbnail = "" fanart = "" if i.get("posterurl", ""): - thumbnail = "http://image.tmdb.org/t/p/w342{file}".format(file=i.get("posterurl", "")) + thumbnail = "http://image.tmdb.org/t/p/w342%s" % i.get("posterurl", "") if i.get("backurl", ""): - fanart = "http://image.tmdb.org/t/p/w1280{file}".format(file=i.get("backurl", "")) + fanart = "http://image.tmdb.org/t/p/w1280%s" % i.get("backurl", "") plot = i.get("info", "") if plot is None: plot = "" infoLabels = {'plot': plot, 'year': i.get("year"), 'tmdb_id': i.get("id")} - itemlist.append(Item(channel=item.channel, action="play", title=title, url=url, server="torrent", - thumbnail=thumbnail, fanart=fanart, infoLabels=infoLabels, contentTitle=i.get("nom"))) + itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, server="torrent", + contentType="movie", thumbnail=thumbnail, fanart=fanart, infoLabels=infoLabels, + contentTitle=i.get("nom"), quality=calidad)) from core import tmdb tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) @@ -298,3 +313,24 @@ def search(item, texto): for line in sys.exc_info(): logger.error("%s" % line) return [] + + +def findvideos(item): + logger.info() + + itemlist = [] + + if item.contentType == "movie": + item.title = "Enlace Torrent" + item.action = "play" + itemlist.append(item) + else: + data = item.data + + for index, url in enumerate(data["url"]): + quality = data["quality"][index] + title = "Enlace torrent [%s]" % quality + itemlist.append(item.clone(action="play", title=title, url=url, quality=quality)) + servertools.get_servers_itemlist(itemlist) + + return itemlist diff --git a/plugin.video.alfa/channels/pelispedia.json b/plugin.video.alfa/channels/pelispedia.json index 43890255..17bfdead 100755 --- a/plugin.video.alfa/channels/pelispedia.json +++ b/plugin.video.alfa/channels/pelispedia.json @@ -3,7 +3,7 @@ "name": "PelisPedia", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "fanart": "http://i.imgur.com/9QbyJrf.jpg", "thumbnail": "pelispedia.png", "banner": "pelispedia.png", diff --git a/plugin.video.alfa/channels/pelispekes.json b/plugin.video.alfa/channels/pelispekes.json index 5f7e2304..060ceb9c 100755 --- a/plugin.video.alfa/channels/pelispekes.json +++ b/plugin.video.alfa/channels/pelispekes.json @@ -3,7 +3,7 @@ "name": "PelisPekes", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "pelispekes.png", "banner": "pelispekes.png", "version": 1, diff --git a/plugin.video.alfa/channels/pelisplanet.json b/plugin.video.alfa/channels/pelisplanet.json index b76b31b4..d5c61c97 100644 --- a/plugin.video.alfa/channels/pelisplanet.json +++ b/plugin.video.alfa/channels/pelisplanet.json @@ -3,7 +3,7 @@ "name": "PelisPlanet", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "fanart": "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/pelisplanetbg.png", "thumbnail": "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/pelisplanet.png", "banner": "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/pelisplanetbaner.png", @@ -38,19 +38,13 @@ "visible": true, "lvalues": [ "Sin color", + "Perfil 5", + "Perfil 4", "Perfil 3", "Perfil 2", "Perfil 1" ] }, - { - "id": "orden_episodios", - "type": "bool", - "label": "Mostrar los episodios de las series en orden descendente", - "default": false, - "enabled": true, - "visible": true - }, { "id": "include_in_newest_peliculas", "type": "bool", diff --git a/plugin.video.alfa/channels/pelisplanet.py b/plugin.video.alfa/channels/pelisplanet.py index d6e77bf0..83306a3a 100644 --- a/plugin.video.alfa/channels/pelisplanet.py +++ b/plugin.video.alfa/channels/pelisplanet.py @@ -1,274 +1,333 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse - -from core import channeltools -from core import httptools -from core import scrapertools -from core import servertools -from core import tmdb -from core.item import Item -from platformcode import config, logger - -host = "http://www.pelisplanet.com/" - -headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], - ['Referer', host]] - -parameters = channeltools.get_channel_parameters('pelisplanet') -fanart_host = parameters['fanart'] -thumbnail_host = parameters['thumbnail'] -color1, color2, color3 = ['0xFFA5F6AF', '0xFF5FDA6D', '0xFF11811E'] - - -def mainlist(item): - logger.info() - itemlist = [] - item.url = host - item.text_color = color1 - item.fanart = fanart_host - thumbnail = "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/%s.png" - - itemlist.append(item.clone(title="Novedades", action="peliculas", text_blod=True, - viewcontent='movies', thumbnail=thumbnail % 'novedades', - viewmode="movie_with_plot")) - - itemlist.append(item.clone(title="Estrenos", action="peliculas", text_blod=True, - url=host + 'genero/estrenos/', thumbnail=thumbnail % 'estrenos')) - - itemlist.append(item.clone(title="Géneros", action="generos", text_blod=True, - viewcontent='movies', thumbnail=thumbnail % 'generos', - viewmode="movie_with_plot", url=host + 'generos/')) - - itemlist.append(Item(channel=item.channel, title="Filtrar por Idiomas", - fanart=fanart_host, folder=False, text_color=color3, - text_blod=True, thumbnail=thumbnail % 'idiomas')) - - itemlist.append(item.clone(title="Castellano", action="peliculas", text_blod=True, - viewcontent='movies', thumbnail=thumbnail % 'castellano', - viewmode="movie_with_plot", url=host + 'idioma/castellano/')) - - itemlist.append(item.clone(title="Latino", action="peliculas", text_blod=True, - viewcontent='movies', thumbnail=thumbnail % 'latino', - viewmode="movie_with_plot", url=host + 'idioma/latino/')) - - itemlist.append(item.clone(title="Buscar por Título o Actor", action="search", text_blod=True, - thumbnail=thumbnail % 'busqueda', url=host)) - return itemlist - - -def search(item, texto): - logger.info() - - texto = texto.replace(" ", "+") - item.url = urlparse.urljoin(item.url, "?s={0}".format(texto)) - - try: - return sub_search(item) - - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("{0}".format(line)) - return [] - - -def sub_search(item): - logger.info() - - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - # logger.info(data) - patron = '<div class="img">.*?<a href="(?P<url>[^"]+)" title="(?P<name>[^"]+)".*?' - patron += '<img.+?src="(?P<img>[^"]+)".*?\(([^\)]+)\)"> </a></div>.*?' - patron += 'Ver\s(.*?)\sOnline' - matches = re.compile(patron, re.DOTALL).findall(data) - - for url, name, img, year, scrapedinfo in matches: - contentTitle = scrapertools.decodeHtmlentities(scrapedinfo.strip()) - plot = item.plot - itemlist.append(item.clone(title=name, url=url, contentTitle=contentTitle, - plot=plot, action="findvideos", infoLabels={"year": year}, - thumbnail=img, text_color=color3)) - - paginacion = scrapertools.find_single_match( - data, '<a class="page larger" href="([^"]+)">\d+</a>') - - if paginacion: - itemlist.append(Item(channel=item.channel, action="sub_search", - title="» Siguiente »", url=paginacion, - thumbnail='https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/next.png')) - - tmdb.set_infoLabels(itemlist) - - for item in itemlist: - if item.infoLabels['plot'] == '': - data = httptools.downloadpage(item.url).data - item.fanart = scrapertools.find_single_match( - data, 'meta property="og:image" content="([^"]+)" \/>') - item.plot = scrapertools.find_single_match(data, - 'Castellano</h3>\s*<p>(.+?)<strong>') - item.plot = scrapertools.htmlclean(item.plot) - - return itemlist - - -def newest(categoria): - logger.info() - itemlist = [] - item = Item() - try: - if categoria == 'peliculas': - item.url = host - elif categoria == 'infantiles': - item.url = host + "genero/animacion-e-infantil/" - else: - return [] - - itemlist = peliculas(item) - if itemlist[-1].title == "» Siguiente »": - itemlist.pop() - - # Se captura la excepción, para no interrumpir al canal novedades si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("{0}".format(line)) - return [] - - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\(.*?\)|\s{2}| ", "", data) - patron_todas = '<div class="home-movies">(.*?)<footer>' - data = scrapertools.find_single_match(data, patron_todas) - patron = 'col-sm-5"><a href="(?P<scrapedurl>[^"]+)".+?' - patron += 'browse-movie-link-qd.*?>(?P<calidad>[^>]+)</.+?' - patron += '<p>(?P<year>[^>]+)</p>.+?' - patron += 'title one-line">(?P<scrapedtitle>[^>]+)</h2>.+?' - patron += 'img-responsive" src="(?P<scrapedthumbnail>[^"]+)".*?' - - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, calidad, year, scrapedtitle, scrapedthumbnail in matches: - datas = httptools.downloadpage(scrapedurl).data - datas = re.sub(r"\n|\r|\t|\s{2}| ", "", datas) - # logger.info(datas) - if '/ ' in scrapedtitle: - scrapedtitle = scrapedtitle.partition('/ ')[2] - contentTitle = scrapertools.find_single_match(datas, '<em class="pull-left">Titulo original: </em>([^<]+)</p>') - contentTitle = scrapertools.decodeHtmlentities(contentTitle.strip()) - rating = scrapertools.find_single_match(datas, 'alt="Puntaje MPA IMDb" /></a><span>([^<]+)</span>') - director = scrapertools.find_single_match(datas, - '<div class="list-cast-info tableCell"><a href="[^"]+" rel="tag">([^<]+)</a></div>') - title = "%s [COLOR yellow][%s][/COLOR]" % (scrapedtitle.strip(), calidad.upper()) - - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, plot='', - url=scrapedurl, contentQuality=calidad, thumbnail=scrapedthumbnail, - contentTitle=contentTitle, - infoLabels={"year": year, 'rating': rating, 'director': director}, - text_color=color3)) - - tmdb.set_infoLabels(itemlist, seekTmdb=True) - - paginacion = scrapertools.find_single_match(data, '<a class="nextpostslink" rel="next" href="([^"]+)">') - if paginacion: - itemlist.append(Item(channel=item.channel, action="peliculas", - title="» Siguiente »", url=paginacion, plot="Página Siguiente", - thumbnail='https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/next.png')) - - for item in itemlist: - if item.infoLabels['plot'] == '': - data = httptools.downloadpage(item.url).data - item.fanart = scrapertools.find_single_match(data, 'meta property="og:image" content="([^"]+)" \/>') - item.plot = scrapertools.find_single_match(data, 'Castellano</h3>\s*<p>(.+?)<strong>') - item.plot = scrapertools.htmlclean(item.plot) - - return itemlist - - -def generos(item): - logger.info() - itemlist = [] - - data = scrapertools.cache_page(item.url) - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - # logger.info(data) - patron = '<div class="todos">.*?' - patron += '<a href="([^"]+)".*?' - patron += 'title="([^"]+)".*?' - patron += '<img src="([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, scrapedtitle, scrapedthumbnail in matches: - itemlist.append(Item(channel=item.channel, action="peliculas", title=scrapedtitle, - url=scrapedurl, text_color=color3, thumbnail=scrapedthumbnail, - plot="", viewmode="movie_with_plot", folder=True)) - - return itemlist - - -def findvideos(item): - logger.info() - itemlist = [] - - datas = httptools.downloadpage(item.url).data - datas = re.sub(r"\n|\r|\t|\(.*?\)|\s{2}| ", "", datas) - # logger.info(data) - patron = '<a style="cursor:pointer; cursor: hand;" rel="([^"]+)".*?' - patron += 'clearfix colores title_calidad">.*?<span>([^<]+)</span></a>' - - matches = re.compile(patron, re.DOTALL).findall(datas) - - for scrapedurl, servidores, in matches: - if 'pelispp.com' or 'ultrapelis' in scrapedurl: - data = httptools.downloadpage(scrapedurl, headers=headers).data - patronr = 'file: "([^"]+)",label:"([^"]+)",type' - matchesr = re.compile(patronr, re.DOTALL).findall(data) - for scrapedurl, label in matchesr: - url = scrapedurl.replace('\\', '') - language = 'latino' - quality = label.decode('cp1252').encode('utf8') - title = item.contentTitle + ' (' + str(label) + ')' - thumbnail = item.thumbnail - fanart = item.fanart - itemlist.append(item.clone(action="play", title=title, url=url, server='directo', - thumbnail=thumbnail, fanart=fanart, extra='directo', - quality=quality, language=language, )) - itemlist.sort(key=lambda it: it.title, reverse=True) - - # if 'youtube' not in scrapedurl: - if 'youtube' not in scrapedurl: - quality = scrapertools.find_single_match( - datas, '<p class="hidden-xs hidden-sm">.*?class="magnet-download">([^<]+)p</a>') - title = "[COLOR green]%s[/COLOR] [COLOR yellow][%s][/COLOR] [COLOR yellow][%s][/COLOR]" % ( - item.contentTitle, quality.upper(), servidores.capitalize()) - url = scrapedurl.replace('\\', '') - thumbnail = item.thumbnail - server = servertools.get_server_from_url(url) - - itemlist.append(item.clone(action='play', title=title, url=url, quality=quality, - server=server, text_color=color3, thumbnail=thumbnail)) - - for videoitem in itemlist: - videoitem.infoLabels = item.infoLabels - videoitem.channel = item.channel - videoitem.action = 'play' - videoitem.fulltitle = item.title - - if config.get_videolibrary_support() and len(itemlist) > 0: - itemlist.append(Item(channel=item.channel, - title='[COLOR yellow]Añadir esta pelicula a la biblioteca[/COLOR]', - url=item.url, action="add_pelicula_to_library", - thumbnail='https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/libreria.png', - extra="findvideos", contentTitle=item.contentTitle)) - - return itemlist +# -*- coding: utf-8 -*- + +import re +import sys +import urllib +import urlparse +from platformcode import config, logger +from core import httptools +from core import scrapertools +from core import servertools +from core.item import Item +from core import channeltools +from core import tmdb + +host = "http://www.pelisplanet.com/" + +headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], + ['Referer', host]] + +__channel__ = "pelisplanet" +parameters = channeltools.get_channel_parameters('pelisplanet') +fanart_host = parameters['fanart'] +thumbnail_host = parameters['thumbnail'] +try: + __modo_grafico__ = config.get_setting('modo_grafico', __channel__) + __perfil__ = int(config.get_setting('perfil', __channel__)) +except: + __modo_grafico__ = True + __perfil__ = 0 + +# Fijar perfil de color +perfil = [['0xFFFFE6CC', '0xFFFFCE9C', '0xFF994D00', '0xFFFE2E2E', '0xFFFFD700'], + ['0xFFA5F6AF', '0xFF5FDA6D', '0xFF11811E', '0xFFFE2E2E', '0xFFFFD700'], + ['0xFF58D3F7', '0xFF2E9AFE', '0xFF2E64FE', '0xFFFE2E2E', '0xFFFFD700']] +if __perfil__ < 3: + color1, color2, color3, color4, color5 = perfil[__perfil__] +else: + color1 = color2 = color3 = color4 = color5 = "" + +def mainlist(item): + logger.info() + itemlist = [] + item.url = host + item.text_color = color1 + item.fanart = fanart_host + thumbnail = "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/%s.png" + + itemlist.append(item.clone(title="Novedades", action="peliculas", text_blod=True, + viewcontent='movies', thumbnail=thumbnail % 'novedades', + viewmode="movie_with_plot")) + + itemlist.append(item.clone(title="Estrenos", action="peliculas", text_blod=True, + url=host + 'genero/estrenos/', thumbnail=thumbnail % 'estrenos')) + + itemlist.append(item.clone(title="Géneros", action="generos", text_blod=True, + viewcontent='movies', thumbnail=thumbnail % 'generos', + viewmode="movie_with_plot", url=host + 'generos/')) + + itemlist.append(Item(channel=item.channel, title="Filtrar por Idiomas", + fanart=fanart_host, folder=False, text_color=color3, + text_blod=True, thumbnail=thumbnail % 'idiomas')) + + itemlist.append(item.clone(title="Castellano", action="peliculas", text_blod=True, + viewcontent='movies', thumbnail=thumbnail % 'castellano', + viewmode="movie_with_plot", url=host + 'idioma/castellano/')) + + itemlist.append(item.clone(title="Latino", action="peliculas", text_blod=True, + viewcontent='movies', thumbnail=thumbnail % 'latino', + viewmode="movie_with_plot", url=host + 'idioma/latino/')) + + itemlist.append(item.clone(title="Buscar por Título o Actor", action="search", text_blod=True, + thumbnail=thumbnail % 'busqueda', url=host)) + return itemlist + + +def search(item, texto): + logger.info() + + texto = texto.replace(" ", "+") + item.url = urlparse.urljoin(item.url, "?s={0}".format(texto)) + + try: + return sub_search(item) + + # Se captura la excepción, para no interrumpir al buscador global si un canal falla + except: + import sys + for line in sys.exc_info(): + logger.error("{0}".format(line)) + return [] + + +def sub_search(item): + logger.info() + + itemlist = [] + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t| |<br>", "", data) + # logger.info(data) + patron = '<div class="img">.*?<a href="([^"]+)" title="([^"]+)".*?' + patron += '<img.+?src="([^"]+)".*?\(([^\)]+)\)"> </a></div>.*?' + patron += 'Ver\s(.*?)\sOnline' + matches = re.compile(patron, re.DOTALL).findall(data) + + for url, name, img, year, scrapedinfo in matches: + contentTitle = scrapertools.decodeHtmlentities(scrapedinfo.strip()) + plot = item.plot + itemlist.append(item.clone(title=name, url=url, contentTitle=contentTitle, + plot=plot, action="findvideos", infoLabels={"year": year}, + thumbnail=img, text_color=color3)) + + paginacion = scrapertools.find_single_match( + data, '<a class="page larger" href="([^"]+)">\d+</a>') + + if paginacion: + itemlist.append(Item(channel=item.channel, action="sub_search", + title="» Siguiente »", url=paginacion, + thumbnail='https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/next.png')) + + tmdb.set_infoLabels(itemlist) + + for item in itemlist: + if item.infoLabels['plot'] == '': + data = httptools.downloadpage(item.url).data + item.fanart = scrapertools.find_single_match( + data, 'meta property="og:image" content="([^"]+)" \/>') + item.plot = scrapertools.find_single_match(data, + 'Castellano</h3>\s*<p>(.+?)<strong>') + item.plot = scrapertools.htmlclean(item.plot) + + return itemlist + + +def newest(categoria): + logger.info() + itemlist = [] + item = Item() + try: + if categoria == 'peliculas': + item.url = host + elif categoria == 'infantiles': + item.url = host + "genero/animacion-e-infantil/" + else: + return [] + + itemlist = peliculas(item) + if itemlist[-1].title == "» Siguiente »": + itemlist.pop() + + # Se captura la excepción, para no interrumpir al canal novedades si un canal falla + except: + import sys + for line in sys.exc_info(): + logger.error("{0}".format(line)) + return [] + + return itemlist + + +def peliculas(item): + logger.info() + itemlist = [] + + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\(.*?\)|\s{2}| ", "", data) + patron_todas = '<div class="home-movies">(.*?)<footer>' + data = scrapertools.find_single_match(data, patron_todas) + patron = 'col-sm-5"><a href="([^"]+)".+?' + patron += 'browse-movie-link-qd.*?>([^>]+)</.+?' + patron += '<p>([^>]+)</p>.+?' + patron += 'title one-line">([^>]+)</h2>.+?' + patron += 'img-responsive" src="([^"]+)".*?' + + matches = re.compile(patron, re.DOTALL).findall(data) + + for scrapedurl, calidad, year, scrapedtitle, scrapedthumbnail in matches: + datas = httptools.downloadpage(scrapedurl).data + datas = re.sub(r"\n|\r|\t|\s{2}| ", "", datas) + #logger.info(datas) + if '/ ' in scrapedtitle: + scrapedtitle = scrapedtitle.partition('/ ')[2] + contentTitle = scrapertools.find_single_match(datas, '<em class="pull-left">Titulo original: </em>([^<]+)</p>') + contentTitle = scrapertools.decodeHtmlentities(contentTitle.strip()) + rating = scrapertools.find_single_match(datas, 'alt="Puntaje MPA IMDb" /></a><span>([^<]+)</span>') + director = scrapertools.find_single_match(datas, '<div class="list-cast-info tableCell"><a href="[^"]+" rel="tag">([^<]+)</a></div>') + title = "%s [COLOR yellow][%s][/COLOR]" % (scrapedtitle.strip(), calidad.upper()) + + new_item = Item(channel=item.channel, action="findvideos", title=title, plot='', contentType='movie', + url=scrapedurl, contentQuality=calidad, thumbnail=scrapedthumbnail, + contentTitle=contentTitle, infoLabels={"year": year, 'rating': rating, 'director': director}, + text_color=color3) + + # tmdb.set_infoLabels(itemlist, __modo_grafico__) + # tmdb.set_infoLabels(itemlist, __modo_grafico__) + if year: + tmdb.set_infoLabels_item(new_item, __modo_grafico__) + itemlist.append(new_item) + + paginacion = scrapertools.find_single_match(data, '<a class="nextpostslink" rel="next" href="([^"]+)">') + if paginacion: + + itemlist.append(Item(channel=item.channel, action="peliculas", + title="» Siguiente »", url=paginacion, plot="Página Siguiente", + thumbnail='https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/next.png')) + + for item in itemlist: + if item.infoLabels['plot'] == '': + data = httptools.downloadpage(item.url).data + item.fanart = scrapertools.find_single_match(data, 'meta property="og:image" content="([^"]+)" \/>') + item.plot = scrapertools.find_single_match(data, 'Castellano</h3>\s*<p>(.+?)<strong>') + item.plot = scrapertools.htmlclean(item.plot) + + return itemlist + + +def generos(item): + logger.info() + itemlist = [] + + data = scrapertools.cache_page(item.url) + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + # logger.info(data) + patron = '<div class="todos">.*?' + patron += '<a href="([^"]+)".*?' + patron += 'title="([^"]+)".*?' + patron += '<img src="([^"]+)"' + matches = re.compile(patron, re.DOTALL).findall(data) + + for scrapedurl, scrapedtitle, scrapedthumbnail in matches: + itemlist.append(Item(channel=item.channel, action="peliculas", title=scrapedtitle, + url=scrapedurl, text_color=color3, thumbnail=scrapedthumbnail, + plot="", viewmode="movie_with_plot", folder=True)) + + return itemlist + + +def findvideos(item): + logger.info() + itemlist = [] + + datas = httptools.downloadpage(item.url).data + datas = re.sub(r"\n|\r|\t|\(.*?\)|\s{2}| ", "", datas) + # logger.info(datas) + patron = '<a id="[^"]+" style="cursor:pointer; cursor: hand" rel="([^"]+)".*?' + patron += '<span class="optxt"><span>([^<]+)</span>.*?' + patron += '<span class="q">([^<]+)</span>' + + matches = re.compile(patron, re.DOTALL).findall(datas) + + for scrapedurl, lang, servidores in matches: + # doc_url = '' + doc_id = '' + video_urls = [] + if 'drive' in scrapedurl: + doc_id = httptools.downloadpage(scrapedurl).data + doc_id = scrapertools.find_single_match(doc_id, "docid=(\w+)") + elif 'youtube' in scrapedurl: + doc_id = scrapertools.find_single_match(scrapedurl, "docid=(\w+)") + doc_url = "http://docs.google.com/get_video_info?docid=%s" % doc_id + response = httptools.downloadpage(doc_url, cookies=False) + cookies = "" + cookie = response.headers["set-cookie"].split("HttpOnly, ") + for c in cookie: + cookies += c.split(";", 1)[0] + "; " + data = response.data.decode('unicode-escape') + data = urllib.unquote_plus(urllib.unquote_plus(data)) + headers_string = "|Cookie=" + cookies + url_streams = scrapertools.find_single_match(data, 'url_encoded_fmt_stream_map=(.*)') + streams = scrapertools.find_multiple_matches(url_streams, + 'itag=(\d+)&url=(.*?)(?:;.*?quality=.*?(?:,|&)|&quality=.*?(?:,|&))') + itags = {'18':'360p', '22':'720p', '34':'360p', '35':'480p', '37':'1080p', '43':'360p', '59':'480p'} + for itag, video_url in streams: + video_url += headers_string + video_urls.append([video_url, itags[itag]]) + + for video_item in video_urls: + calidad = video_item[1] + title = '%s [COLOR green](%s)[/COLOR] [COLOR green]([/COLOR][COLOR black]You[/COLOR][COLOR red]tube[/COLOR][COLOR green])[/COLOR]'%(item.contentTitle, calidad) + url = video_item[0] + + itemlist.append( + item.clone(channel=item.channel, + action='play', + title=title, + url= url, + thumbnail=item.thumbnail, + quality = calidad, + plot=item.plot, + fanart=item.fanart, + contentTitle=item.contentTitle, + language=lang.replace('Español ', ''), + server='directo', + context = item.context + )) + itemlist.sort(key=lambda it: it.title, reverse=True) + if 'pelispp.com' in scrapedurl or 'ultrapelis' in scrapedurl: + data = httptools.downloadpage(scrapedurl, headers=headers).data + patronr = 'file: "([^"]+)",label:"([^"]+)",type' + matchesr = re.compile(patronr, re.DOTALL).findall(data) + for scrapedurl, label in matchesr: + url = scrapedurl.replace('\\', '') + quality = label.decode('cp1252').encode('utf8') + title = item.contentTitle + ' (' + str(label) + ') ([COLOR blue]G[/COLOR][COLOR red]o[/COLOR][COLOR yellow]o[/COLOR][COLOR blue]g[/COLOR][COLOR green]l[/COLOR][COLOR red]e[/COLOR])' + thumbnail = item.thumbnail + fanart = item.fanart + itemlist.append(item.clone(action="play", title=title, url=url, server='directo', + thumbnail=thumbnail, fanart=fanart, extra='directo', + quality=quality, language=lang.replace('Español ', ''))) + itemlist.sort(key=lambda it: it.title, reverse=True) + + # if 'youtube' not in scrapedurl: + servidores.lower() + if 'drive' not in scrapedurl and 'pelispp.com' not in scrapedurl and 'youtube' not in scrapedurl and 'streamplus' not in servidores: + quality = scrapertools.find_single_match( + datas, '<p class="hidden-xs hidden-sm">.*?class="magnet-download">([^<]+)p</a>') + title = "[COLOR green]%s[/COLOR] [COLOR yellow][%s][/COLOR] [COLOR yellow][%s][/COLOR]" % ( + item.contentTitle, quality.upper(), servidores.capitalize()) + url = scrapedurl.replace('\\', '') + thumbnail = item.thumbnail + server = servertools.get_server_from_url(url) + + itemlist.append(item.clone(action='play', title=title, url=url, quality=quality, language=lang.replace('Español ', ''), + server=server, text_color=color3, thumbnail=thumbnail)) + + + if config.get_videolibrary_support() and len(itemlist) > 0: + itemlist.append(Item(channel=item.channel, + title='[COLOR yellow]Añadir esta pelicula a la videoteca[/COLOR]', + url=item.url, action="add_pelicula_to_library", + thumbnail='https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/libreria.png', + extra="findvideos", contentTitle=item.contentTitle)) + + return itemlist diff --git a/plugin.video.alfa/channels/pelisplus.json b/plugin.video.alfa/channels/pelisplus.json old mode 100755 new mode 100644 index 14c1f328..08d52f01 --- a/plugin.video.alfa/channels/pelisplus.json +++ b/plugin.video.alfa/channels/pelisplus.json @@ -1,12 +1,9 @@ { "id": "pelisplus", "name": "PelisPlus", - "compatible": { - "addon_version": "4.3" - }, "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s13.postimg.org/z5dbzfasn/pelisplus.png", "banner": "https://s16.postimg.org/p9xz2vlo5/pelisplus_banner.png", "version": 1, @@ -41,10 +38,11 @@ } ], "categories": [ - "latino", "movie", "tvshow", - "documentary" + "documentary", + "direct" + ], "settings": [ { diff --git a/plugin.video.alfa/channels/pelisplus.py b/plugin.video.alfa/channels/pelisplus.py old mode 100755 new mode 100644 index 9d0311fe..f3b424c2 --- a/plugin.video.alfa/channels/pelisplus.py +++ b/plugin.video.alfa/channels/pelisplus.py @@ -9,6 +9,7 @@ from core import scrapertools from core import tmdb from core.item import Item from platformcode import config, logger +from core import servertools host = "http://www.pelisplus.tv/" @@ -25,10 +26,11 @@ list_quality = ['1080p', '720p', '480p', '360p', - '240p' + '240p', + 'default' ] list_servers = [ - 'directo', + 'gvideo', 'openload', 'thevideos' ] @@ -419,65 +421,64 @@ def findvideos(item): logger.info() itemlist = [] duplicados = [] - datas = httptools.downloadpage(item.url).data - patron = "<iframe.*?src='([^']+)' frameborder='0' allowfullscreen.*?" - matches = re.compile(patron, re.DOTALL).findall(datas) + data = httptools.downloadpage(item.url).data + video_page = scrapertools.find_single_match(data, "<iframe width='100%' height='500' src='(.*?)' frameborder='0'") + data = httptools.downloadpage(video_page).data + patron = '<li data-id=".*?">\s+<a href="(.*?)" >' + matches = re.compile(patron, re.DOTALL).findall(data) for scrapedurl in matches: - if 'elreyxhd' or 'pelisplus.biz' in scrapedurl: - patronr = '' - data = httptools.downloadpage(scrapedurl, headers=headers).data + if 'tipo' in scrapedurl: + server = 'gvideo' + gvideo_data = httptools.downloadpage(scrapedurl).data + video_url = scrapertools.find_single_match(gvideo_data,'<div id="player">.*?border: none" src="\/\/(.*?)" ') + video_url= 'http://%s'%video_url + gvideo_url = httptools.downloadpage(video_url).data + videourl = servertools.findvideosbyserver(gvideo_url, server) - quote = scrapertools.find_single_match(data, 'sources.*?file.*?http') - if quote and "'" in quote: - patronr = "file:'([^']+)',label:'([^.*?]+)',type:.*?'.*?}" - elif '"' in quote: - patronr = '{file:"(.*?)",label:"(.*?)"}' - if patronr != '': - matchesr = re.compile(patronr, re.DOTALL).findall(data) + logger.debug('videourl: %s'%videourl) + language = 'latino' + quality = 'default' + url = videourl[0][1] + title = '%s (%s)'%(item.contentTitle, server) + thumbnail = item.thumbnail + fanart = item.fanart + if video_url not in duplicados: + itemlist.append(item.clone(action="play", + title=title, + url=url, + thumbnail=thumbnail, + fanart=fanart, + show=title, + extra='gvideo', + language=language, + quality=quality, + server=server + )) + duplicados.append(video_url) - for scrapedurl, scrapedcalidad in matchesr: - url = scrapedurl - language = 'latino' - quality = scrapedcalidad.decode('cp1252').encode('utf8') - title = item.contentTitle + ' (' + str(scrapedcalidad) + ')' - thumbnail = item.thumbnail - fanart = item.fanart - if url not in duplicados: - itemlist.append(item.clone(action="play", - title=title, - url=url, - thumbnail=thumbnail, - fanart=fanart, - show=title, - extra='directo', - language=language, - quality=quality, - server='directo', - )) - duplicados.append(url) - url = scrapedurl - from core import servertools - itemlist.extend(servertools.find_video_items(data=datas)) + + + itemlist.extend(servertools.find_video_items(data=data)) for videoitem in itemlist: # videoitem.infoLabels = item.infoLabels videoitem.channel = item.channel if videoitem.quality == '' or videoitem.language == '': - videoitem.quality = 'default' - videoitem.language = 'Latino' + videoitem.quality = 'default' + videoitem.language = 'Latino' if videoitem.server != '': - videoitem.thumbnail = servertools.guess_server_thumbnail(videoitem.server) + videoitem.thumbnail = item.contentThumbnail else: - videoitem.thumbnail = item.thumbnail - videoitem.server = 'directo' + videoitem.thumbnail = item.thumbnail + videoitem.server = 'directo' videoitem.action = 'play' videoitem.fulltitle = item.title if videoitem.extra != 'directo' and 'youtube' not in videoitem.url: - videoitem.title = item.contentTitle + ' (' + videoitem.server + ')' + videoitem.title = item.contentTitle + ' (' + videoitem.server + ')' n = 0 for videoitem in itemlist: @@ -536,6 +537,6 @@ def newest(categoria): logger.error("{0}".format(line)) return [] - return itemlist - itemlist = filtertools.get_links(itemlist, item, list_language) + + diff --git a/plugin.video.alfa/channels/pelisplusco.json b/plugin.video.alfa/channels/pelisplusco.json new file mode 100644 index 00000000..646d455f --- /dev/null +++ b/plugin.video.alfa/channels/pelisplusco.json @@ -0,0 +1,27 @@ +{ + "id": "pelisplusco", + "name": "PelisPlus.co", + "active": true, + "adult": false, + "language": ["cast", "lat"], + "thumbnail": "https://s26.postimg.org/jov1pmbh5/pelisplusco.png", + "banner": "https://s26.postimg.org/4hf259jmh/pelisplusco-banner.png", + "version": 1, + "categories": [ + "movie", + "tvshow", + "documentary", + "direct" + + ], + "settings": [ + { + "id": "include_in_global_search", + "type": "bool", + "label": "Incluir en busqueda global", + "default": false, + "enabled": false, + "visible": false + } + ] +} \ No newline at end of file diff --git a/plugin.video.alfa/channels/pelisplusco.py b/plugin.video.alfa/channels/pelisplusco.py new file mode 100644 index 00000000..adca596d --- /dev/null +++ b/plugin.video.alfa/channels/pelisplusco.py @@ -0,0 +1,310 @@ +# -*- coding: utf-8 -*- +# -*- Channel PelisPlus.co -*- +# -*- Created for Alfa-addon -*- +# -*- By the Alfa Develop Group -*- + +import re +import urllib +from platformcode import logger +from platformcode import config +from core import scrapertools +from core.item import Item +from core import servertools +from core import httptools +from core import tmdb + + +host = 'http://pelisplus.co' + +def mainlist(item): + logger.info() + + itemlist = [] + + itemlist.append(item.clone(title="Peliculas", + action="movie_menu", + )) + + itemlist.append(item.clone(title="Series", + action="series_menu", + )) + + return itemlist + +def movie_menu(item): + + logger.info() + + itemlist = [] + + itemlist.append(item.clone(title="Estrenos", + action="list_all", + url = host+'/estrenos/', + type = 'normal' + )) + + itemlist.append(item.clone(title="Generos", + action="seccion", + url=host, + seccion='generos' + )) + + itemlist.append(item.clone(title="Por Año", + action="seccion", + url=host, + seccion='anios' + )) + + return itemlist + +def series_menu(item): + + logger.info() + + itemlist =[] + + itemlist.append(item.clone(title="Todas", + action="list_all", + url=host + '/series/', + type='serie' + )) + + return itemlist + + +def get_source(url): + + logger.info() + data = httptools.downloadpage(url).data + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) + return data + +def list_all (item): + logger.info () + itemlist = [] + + if item.type not in ['normal', 'seccion', 'serie']: + post = {'page':item.page, 'type':item.type,'id':item.id} + post = urllib.urlencode(post) + data =httptools.downloadpage(item.url, post=post).data + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) + else: + data = get_source(item.url) + if item.type == 'serie' or item.type == 'recents': + contentType = 'serie' + action = 'seasons' + else: + contentType = 'pelicula' + action = 'findvideos' + + patron = 'item-%s><a href=(.*?)><figure><img src=https:(.*?)'%contentType + patron += ' alt=><\/figure><p>(.*?)<\/p><span>(.*?)<\/span>' + matches = re.compile(patron,re.DOTALL).findall(data) + + for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedyear in matches: + url = host+scrapedurl + thumbnail = scrapedthumbnail + plot= '' + contentTitle=scrapedtitle + title = contentTitle + year = scrapedyear + fanart ='' + + new_item=item.clone(action=action, + title=title, + url=url, + thumbnail=thumbnail, + plot=plot, + fanart=fanart, + infoLabels ={'year':year} + ) + if contentType =='serie': + new_item.contentSerieName=title + else: + new_item.contentTitle = title + itemlist.append(new_item) + + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb =True) + #Paginacion + + next_page_valid = scrapertools.find_single_match(data, '<div class=butmore(?: site=series|) page=(.*?) id=(.*?) ' + 'type=(.*?) limit=.*?>') + if item.type != 'normal' and (len(itemlist)>19 or next_page_valid): + type = item.type + if item.type == 'serie': + type = 'recents' + if next_page_valid: + page = str(int(next_page_valid[0])+1) + if item.type != 'recents': + id = next_page_valid[1] + type = next_page_valid[2] + else: + id ='' + else: + page = str(int(item.page)+1) + id = item.id + + if type =='recents': + type_pagination = '/series/pagination' + else: + type_pagination = '/pagination' + + url = host+type_pagination + + itemlist.append(item.clone(action = "list_all", + title = 'Siguiente >>>', + page=page, + url = url, + id = id, + type = type + )) + return itemlist + +def seccion(item): + logger.info() + itemlist = [] + data = get_source(item.url) + if item.seccion == 'generos': + patron = '<li><a href=(.*?)><i class=ion-cube><\/i>(.*?)<\/span>' + type = 'genre' + elif item.seccion == 'anios': + patron = '<li><a href=(\/peliculas.*?)>(\d{4})<\/a>' + type = 'year' + matches = re.compile(patron, re.DOTALL).findall(data) + for scrapedurl, scrapedtitle in matches: + title = scrapedtitle + if item.seccion == 'generos': + cant = re.sub(r'.*?<span class=cant-genre>','',scrapedtitle) + only_title = re.sub(r'<.*','',scrapedtitle).rstrip() + title = only_title+' (%s)'%cant + + url = host+scrapedurl + + itemlist.append( + Item(channel=item.channel, + action="list_all", + title=title, + fulltitle=item.title, + url=url, + type = 'seccion' + )) + # Paginacion + + if itemlist != []: + next_page = scrapertools.find_single_match(data, '<li><a class= item href=(.*?)&limit=.*?>Siguiente <') + next_page_url = host + next_page + import inspect + if next_page != '': + itemlist.append(item.clone(action="seccion", + title='Siguiente >>>', + url=next_page_url, + thumbnail='https://s16.postimg.org/9okdu7hhx/siguiente.png' + )) + + return itemlist + + +def seasons(item): + logger.info() + itemlist =[] + + data = httptools.downloadpage(item.url).data + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) + + patron ='<i class=ion-chevron-down arrow><\/i>(.*?)<\/div>' + matches = matches = re.compile(patron, re.DOTALL).findall(data) + infoLabels=item.infoLabels + + for title in matches: + season = title.replace('Temporada ','') + infoLabels['season'] = season + itemlist.append(Item( + channel=item.channel, + title=title, + url=item.url, + action='season_episodes', + contentSerieName= item.contentSerieName, + contentSeasonNumber = season, + infoLabels=infoLabels + )) + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) + + return itemlist[::-1] + +def season_episodes(item): + logger.info() + itemlist = [] + + data = httptools.downloadpage(item.url).data + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) + season = str(item.infoLabels['season']) + patron = '<a href=(.*?temporada-%s\/.*?) title=.*?i-play><\/i> (.*?)<\/a>'%season + matches = matches = re.compile(patron, re.DOTALL).findall(data) + infoLabels = item.infoLabels + for url, episode in matches: + episodenumber = re.sub('C.* ','',episode) + infoLabels['episode'] = episodenumber + itemlist.append(Item(channel=item.channel, + title= episode, + url = host+url, + action = 'findvideos', + infoLabels=infoLabels, + contentEpisodeNumber=episode + )) + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) + + + return itemlist[::-1] + + +def findvideos(item): + logger.info() + itemlist = [] + video_list = [] + data = httptools.downloadpage(item.url).data + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) + patron = 'data-source=(.*?) data.*?-srt=(.*?) data-iframe=0><a>(.*?) - (.*?)<\/a>' + matches = matches = re.compile(patron, re.DOTALL).findall(data) + + for url, sub, language, quality in matches: + + if 'http' not in url: + + new_url = 'https://onevideo.tv/api/player?key=90503e3de26d45e455b55e9dc54f015b3d1d4150&link' \ + '=%s&srt=%s' % (url, sub) + data = httptools.downloadpage(new_url).data + data = re.sub(r'\\', "", data) + video_list.extend(servertools.find_video_items(data=data)) + + for video_url in video_list: + video_url.channel = item.channel + video_url.action = 'play' + video_url.title = item.title + '(%s) (%s)' % (language, video_url.server) + if video_url.language == '': + video_url.language = language + video_url.subtitle = sub + video_url.contentTitle=item.contentTitle + else: + server = servertools.get_server_from_url(url) + video_list.append(item.clone(title=item.title, + url=url, + action='play', + quality = quality, + language = language, + server=server, + subtitle = sub + )) + + + if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findvideos': + itemlist.append( + Item(channel=item.channel, + title='[COLOR yellow]Añadir esta pelicula a la videoteca[/COLOR]', + url=item.url, + action="add_pelicula_to_library", + extra="findvideos", + contentTitle=item.contentTitle + )) + + return video_list + diff --git a/plugin.video.alfa/channels/pelisxporno.json b/plugin.video.alfa/channels/pelisxporno.json index 9dd87023..6d485009 100755 --- a/plugin.video.alfa/channels/pelisxporno.json +++ b/plugin.video.alfa/channels/pelisxporno.json @@ -3,7 +3,7 @@ "name": "Pelisxporno", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "http://i.imgur.com/ywMHwat.png", "banner": "pelisxporno.png", "changes": [ diff --git a/plugin.video.alfa/channels/pelisxporno.py b/plugin.video.alfa/channels/pelisxporno.py index 4175585c..c7065bb8 100755 --- a/plugin.video.alfa/channels/pelisxporno.py +++ b/plugin.video.alfa/channels/pelisxporno.py @@ -28,18 +28,14 @@ def lista(item): # Descarga la pagina data = httptools.downloadpage(item.url).data - # Extrae las entradas (carpetas) - patron = '<div class="Picture">.*?href="([^"]+)".*?<img src="([^"]+)".*?' \ - '<span class="fa-clock.*?>([^<]+)<.*?<h2 class="Title">.*?>([^<]+)</a>' \ - '.*?<p>(.*?)</p>' + patron = '<div class="video.".*?<a href="(.*?)" title="(.*?)">.*?<img src="(.*?)".*?\/>.*?duration.*?>(.*?)<' matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedthumbnail, duration, scrapedtitle, plot in matches: + for scrapedurl, scrapedtitle, scrapedthumbnail, duration in matches: if duration: scrapedtitle += " (%s)" % duration - itemlist.append(item.clone(action="findvideos", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail, - infoLabels={'plot': plot})) + itemlist.append(item.clone(action="findvideos", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail)) # Extrae la marca de siguiente página next_page = scrapertools.find_single_match(data, '<a class="nextpostslink" rel="next" href="([^"]+)"') @@ -57,12 +53,9 @@ def categorias(item): data = httptools.downloadpage(item.url).data # Extrae las entradas (carpetas) - patron = '<figure class="Picture">.*?<a href="([^"]+)".*?src="([^"]+)".*?<a.*?>(.*?)</a>' \ - '.*?<span class="fa-film Clr3B">(\d+)' + patron = '<li class="cat-item cat-item-.*?"><a href="(.*?)".*?>(.*?)<' matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedthumbnail, scrapedtitle, cantidad in matches: - if cantidad: - scrapedtitle += " (%s vídeos)" % cantidad - itemlist.append(item.clone(action="lista", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail)) + for scrapedurl, scrapedtitle in matches: + itemlist.append(item.clone(action="lista", title=scrapedtitle, url=scrapedurl)) return itemlist diff --git a/plugin.video.alfa/channels/pepecine.json b/plugin.video.alfa/channels/pepecine.json index 4dd1174b..1e8d37e9 100755 --- a/plugin.video.alfa/channels/pepecine.json +++ b/plugin.video.alfa/channels/pepecine.json @@ -3,7 +3,7 @@ "name": "Pepecine", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "fanart": "https://d12.usercdn.com/i/02278/u875vjx9c0xs.png", "thumbnail": "pepecine.png", "banner": "pepecine.png", diff --git a/plugin.video.alfa/channels/pepecine.py b/plugin.video.alfa/channels/pepecine.py index fc96c93d..304c15c7 100755 --- a/plugin.video.alfa/channels/pepecine.py +++ b/plugin.video.alfa/channels/pepecine.py @@ -355,8 +355,6 @@ def findvideos(item): except: return itemlist # Devolvemos lista vacia - lista_servers = servertools.get_servers_list() - for link in data_dict["link"]: if item.contentType == 'episode' \ and (item.contentSeason != link['season'] or item.contentEpisodeNumber != link['episode']): @@ -367,17 +365,17 @@ def findvideos(item): flag = scrapertools.find_single_match(link["label"], '(\s*\<img src=.*\>)') idioma = link["label"].replace(flag, "") if link["quality"] != "?": - calidad = (' [' + link["quality"] + ']') + calidad = (link["quality"]) else: calidad = "" - video = find_videos(link["url"], lista_servers) + itemlist.extend(servertools.find_video_items(data=url)) - if video["servidor"] != "": - servidor = video["servidor"] - url = video["url"] - title = "Ver en " + servidor.capitalize() + calidad + ' (' + idioma + ')' - itemlist.append(item.clone(action="play", viewmode="list", server=servidor, title=title, - text_color="0xFF994D00", url=url, folder=False)) + for videoitem in itemlist: + videoitem.channel = item.channel + videoitem.quality = calidad + videoitem.language = idioma + videoitem.contentTitle = item.title + itemlist = servertools.get_servers_itemlist(itemlist) if config.get_videolibrary_support() and itemlist and item.contentType == "movie": infoLabels = {'tmdb_id': item.infoLabels['tmdb_id'], @@ -390,40 +388,6 @@ def findvideos(item): return itemlist -def find_videos(url, lista_servers): - # logger.info() - ret = {'titulo': "", - 'url': "", - 'servidor': ""} - - # Ejecuta el find_videos en cada servidor hasta que encuentra una coicidencia - for serverid in lista_servers: - try: - servers_module = __import__("servers." + serverid) - server_module = getattr(servers_module, serverid) - devuelve = server_module.find_videos(url) - - if devuelve: - ret["titulo"] = devuelve[0][0] - ret["url"] = devuelve[0][1] - ret["servidor"] = devuelve[0][2] - # reordenar el listado, es probable q el proximo enlace sea del mismo servidor - lista_servers.remove(serverid) - lista_servers.insert(0, serverid) - break - - except ImportError: - logger.error("No existe conector para #" + serverid + "#") - # import traceback - # logger.info(traceback.format_exc()) - except: - logger.error("Error en el conector #" + serverid + "#") - import traceback - logger.error(traceback.format_exc()) - - return ret - - def episodios(item): # Necesario para las actualizaciones automaticas return get_temporadas(Item(channel=__chanel__, url=item.url, show=item.show, extra="serie_add")) diff --git a/plugin.video.alfa/channels/playmax.json b/plugin.video.alfa/channels/playmax.json index 49cc6afb..b850ccc6 100755 --- a/plugin.video.alfa/channels/playmax.json +++ b/plugin.video.alfa/channels/playmax.json @@ -1,7 +1,7 @@ { "id": "playmax", "name": "PlayMax", - "language": "es", + "language": ["cast", "lat"], "active": true, "adult": false, "version": 1, diff --git a/plugin.video.alfa/channels/playmax.py b/plugin.video.alfa/channels/playmax.py index 9b79bc37..154bc1a6 100644 --- a/plugin.video.alfa/channels/playmax.py +++ b/plugin.video.alfa/channels/playmax.py @@ -302,17 +302,15 @@ def fichas(item): # data = re.sub(r"\n|\r|\t|\s{2}|-\s", "", data) fichas_marca = {'1': 'Siguiendo', '2': 'Pendiente', '3': 'Favorita', '4': 'Vista', '5': 'Abandonada'} - patron = '<div class="c_fichas_image"[^>]*>[^<]*<[^>]+href="\.([^"]+)".*?src-data="\.([^"]+)".*?' \ + patron = '<div class="c_fichas_image"[^>]*>[^<]*<[^>]+href="\.([^"]+)".*?src-data="([^"]+)".*?' \ '<div class="c_fichas_data".*?marked="([^"]*)".*?serie="([^"]*)".*?' \ '<div class="c_fichas_title">(?:<div class="c_fichas_episode">([^<]+)</div>|)([^<]+)</div>' matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedthumbnail, marca, serie, episodio, scrapedtitle in matches: tipo = "movie" scrapedurl = host + scrapedurl.rsplit("-dc=")[0] if not "-dc=" in scrapedurl: scrapedurl += "-dc=" - scrapedthumbnail = host + scrapedthumbnail action = "findvideos" if __menu_info__: action = "menu_info" diff --git a/plugin.video.alfa/channels/playpornx.json b/plugin.video.alfa/channels/playpornx.json index f8a62643..2e1d4f4c 100644 --- a/plugin.video.alfa/channels/playpornx.json +++ b/plugin.video.alfa/channels/playpornx.json @@ -3,7 +3,7 @@ "name": "PlayPornX", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "https://s3.postimg.org/3rkfrnypv/playpornx.png", "banner": "https://s3.postimg.org/it5qa1gyb/playpornx-banner.png", "version": 1, diff --git a/plugin.video.alfa/channels/plusdede.json b/plugin.video.alfa/channels/plusdede.json index a5464c28..6d9912ba 100755 --- a/plugin.video.alfa/channels/plusdede.json +++ b/plugin.video.alfa/channels/plusdede.json @@ -3,7 +3,7 @@ "name": "Plusdede", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "plusdede.png", "banner": "plusdede.png", "version": 1, diff --git a/plugin.video.alfa/channels/pordede.json b/plugin.video.alfa/channels/pordede.json index 65a34761..a99cd21e 100755 --- a/plugin.video.alfa/channels/pordede.json +++ b/plugin.video.alfa/channels/pordede.json @@ -3,7 +3,7 @@ "name": "Pordede", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "pordede.png", "banne": "pordede.png", "version": 1, diff --git a/plugin.video.alfa/channels/pornhub.json b/plugin.video.alfa/channels/pornhub.json index 6a7f4be6..f22c6134 100755 --- a/plugin.video.alfa/channels/pornhub.json +++ b/plugin.video.alfa/channels/pornhub.json @@ -3,7 +3,7 @@ "name": "PornHub", "active": true, "adult": true, - "language": "es", + "language": ["*"], "fanart": "http://i.imgur.com/PwFvoss.jpg", "thumbnail": "http://s22.postimg.org/5lzcocfqp/pornhub_logo.jpg", "banner": "pornhub.png", diff --git a/plugin.video.alfa/channels/porntrex.json b/plugin.video.alfa/channels/porntrex.json index b525c7b1..849a4ac9 100755 --- a/plugin.video.alfa/channels/porntrex.json +++ b/plugin.video.alfa/channels/porntrex.json @@ -1,7 +1,7 @@ { "id": "porntrex", "name": "Porntrex", - "language": "es", + "language": ["*"], "active": true, "adult": true, "version": 1, diff --git a/plugin.video.alfa/channels/puyasubs.json b/plugin.video.alfa/channels/puyasubs.json index e31841e6..95b2e7a9 100755 --- a/plugin.video.alfa/channels/puyasubs.json +++ b/plugin.video.alfa/channels/puyasubs.json @@ -3,7 +3,7 @@ "name": "PuyaSubs!", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "http://i.imgur.com/aad4psi.png", "banner": "http://i.imgur.com/trFDT39.png", "version": 1, diff --git a/plugin.video.alfa/channels/pymovie.json b/plugin.video.alfa/channels/pymovie.json index 79f10b3e..cfbbdc10 100755 --- a/plugin.video.alfa/channels/pymovie.json +++ b/plugin.video.alfa/channels/pymovie.json @@ -3,7 +3,7 @@ "name": "pymovie", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "https://s27.postimg.org/hvmvz7vab/pymovie.png", "banner": "https://s28.postimg.org/3k0wjnwul/pymovie_banner.png", "version": 1, @@ -22,7 +22,6 @@ } ], "categories": [ - "latino", "movie", "tvshow", "documentary" diff --git a/plugin.video.alfa/channels/qserie.json b/plugin.video.alfa/channels/qserie.json index 6839e07b..ebdaccbd 100755 --- a/plugin.video.alfa/channels/qserie.json +++ b/plugin.video.alfa/channels/qserie.json @@ -3,7 +3,7 @@ "name": "QSerie", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "https://s31.postimg.org/dousrbu9n/qserie.png", "banner": "https://s32.postimg.org/nk1quq1wl/qserie_banner.png", "version": 1, @@ -22,7 +22,6 @@ } ], "categories": [ - "latino", "tvshow" ] } \ No newline at end of file diff --git a/plugin.video.alfa/channels/qserie.py b/plugin.video.alfa/channels/qserie.py index d30d6868..1dae555b 100755 --- a/plugin.video.alfa/channels/qserie.py +++ b/plugin.video.alfa/channels/qserie.py @@ -60,18 +60,15 @@ def todas(item): idioma = scrapertools.decodeHtmlentities(idioma) url = urlparse.urljoin(item.url, scrapedurl) year = scrapedyear - if idioma in audio: - idioma = audio[idioma] - else: - idioma = audio['Sub Español'] - title = scrapertools.decodeHtmlentities(scrapedtitle) + ' (' + idioma + ')' + title = scrapertools.decodeHtmlentities(scrapedtitle) thumbnail = scrapedthumbnail plot = scrapedplot fanart = 'https://s31.postimg.org/dousrbu9n/qserie.png' itemlist.append( Item(channel=item.channel, action="temporadas", title=title, url=url, thumbnail=thumbnail, plot=plot, - fanart=fanart, extra=idioma, contentSerieName=scrapedtitle, infoLabels={'year': year})) + fanart=fanart, extra=idioma, contentSerieName=scrapedtitle, infoLabels={'year': year}, + language=idioma)) tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) # Paginacion siguiente = '' diff --git a/plugin.video.alfa/channels/quierodibujosanimados.json b/plugin.video.alfa/channels/quierodibujosanimados.json index cba08198..538f5351 100755 --- a/plugin.video.alfa/channels/quierodibujosanimados.json +++ b/plugin.video.alfa/channels/quierodibujosanimados.json @@ -3,7 +3,7 @@ "name": "Quiero Dibujos Animados", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "quierodibujosanimados.png", "banner": "quierodibujosanimados.png", "fanart": "quierodibujosanimados.jpg", diff --git a/plugin.video.alfa/channels/repelis.json b/plugin.video.alfa/channels/repelis.json index 2803277a..34e8b50b 100755 --- a/plugin.video.alfa/channels/repelis.json +++ b/plugin.video.alfa/channels/repelis.json @@ -3,7 +3,7 @@ "name": "Repelis", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "repelis.png", "banner": "repelis.png", "version": 1, @@ -23,7 +23,8 @@ ], "categories": [ "movie", - "documentary" + "documentary", + "vos" ], "settings": [ { diff --git a/plugin.video.alfa/channels/repelis.py b/plugin.video.alfa/channels/repelis.py old mode 100755 new mode 100644 index 67bc251a..a80b4fec --- a/plugin.video.alfa/channels/repelis.py +++ b/plugin.video.alfa/channels/repelis.py @@ -5,6 +5,8 @@ import urlparse from core import scrapertools from core import servertools +from core import httptools +from core import tmdb from core.item import Item from platformcode import config, logger @@ -19,130 +21,107 @@ def mainlist(item): mifan = "http://www.psicocine.com/wp-content/uploads/2013/08/Bad_Robot_Logo.jpg" itemlist.append(Item(channel=item.channel, action="menupelis", title="Peliculas", url="http://www.repelis.tv/pag/1", - thumbnail="http://www.gaceta.es/sites/default/files/styles/668x300/public/metro_goldwyn_mayer_1926-web.png?itok=-lRSR9ZC", + thumbnail="http://www.gaceta.es/sites/default/files/styles/668x300/public" + "/metro_goldwyn_mayer_1926-web.png?itok=-lRSR9ZC", fanart=mifan)) itemlist.append(Item(channel=item.channel, action="menuestre", title="Estrenos", url="http://www.repelis.tv/archivos/estrenos/pag/1", - thumbnail="http://t0.gstatic.com/images?q=tbn:ANd9GcS4g68rmeLQFuX7iCrPwd00FI_OlINZXCYXEFrJHTZ0VSHefIIbaw", + thumbnail="http://t0.gstatic.com/images?q=tbn" + ":ANd9GcS4g68rmeLQFuX7iCrPwd00FI_OlINZXCYXEFrJHTZ0VSHefIIbaw", fanart=mifan)) itemlist.append( - Item(channel=item.channel, action="menudesta", title="Destacadas", url="http://www.repelis.tv/pag/1", - thumbnail="http://img.irtve.es/v/1074982/", fanart=mifan)) - itemlist.append(Item(channel=item.channel, action="todaspelis", title="Proximos estrenos", + Item(channel=item.channel, action="menudesta", title="Destacadas", url="http://www.repelis.tv/pag/1", + thumbnail="http://img.irtve.es/v/1074982/", fanart=mifan)) + itemlist.append(Item(channel=item.channel, action="menupelis", title="Proximos estrenos", url="http://www.repelis.tv/archivos/proximos-estrenos/pag/1", - thumbnail="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTpsRC-GTYzCqhor2gIDfAB61XeymwgXWSVBHoRAKs2c5HAn29f&reload=on", + thumbnail="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTpsRC" + "-GTYzCqhor2gIDfAB61XeymwgXWSVBHoRAKs2c5HAn29f&reload=on", fanart=mifan)) - itemlist.append( - Item(channel=item.channel, action="todaspelis", title="Todas las Peliculas", url="http://www.repelis.tv/pag/1", - thumbnail="https://freaksociety.files.wordpress.com/2012/02/logos-cine.jpg", fanart=mifan)) + itemlist.append(Item(channel=item.channel, action="menupelis", title="Todas las Peliculas", + url="http://www.repelis.tv/pag/1", + thumbnail="https://freaksociety.files.wordpress.com/2012/02/logos-cine.jpg", fanart=mifan)) if config.get_setting("adult_mode") != 0: - itemlist.append(Item(channel=item.channel, action="todaspelis", title="Eroticas +18", + itemlist.append(Item(channel=item.channel, action="menupelis", title="Eroticas +18", url="http://www.repelis.tv/genero/eroticas/pag/1", thumbnail="http://www.topkamisetas.com/catalogo/images/TB0005.gif", - fanart="http://www.topkamisetas.com/catalogo/images/TB0005.gif")) - # Quito la busqueda por año si no esta enabled el adultmode, porque no hay manera de filtrar los enlaces eroticos72 + fanart="http://www.topkamisetas.com/catalogo/images/TB0005.gif", extra='adult')) + # Quito la busqueda por año si no esta enabled el adultmode, porque no hay manera de filtrar los enlaces + # eroticos72 itemlist.append( - Item(channel=item.channel, action="poranyo", title="Por Año", url="http://www.repelis.tv/anio/2016", - thumbnail="http://t3.gstatic.com/images?q=tbn:ANd9GcSkxiYXdBcI0cvBLsb_nNlz_dWXHRl2Q-ER9dPnP1gNUudhrqlR", - fanart=mifan)) + Item(channel=item.channel, action="poranyo", title="Por Año", url="http://www.repelis.tv/anio/2016", + thumbnail="http://t3.gstatic.com/images?q=tbn:ANd9GcSkxiYXdBcI0cvBLsb_nNlz_dWXHRl2Q" + "-ER9dPnP1gNUudhrqlR", + fanart=mifan)) # Por categoria si que filtra la categoria de eroticos itemlist.append(Item(channel=item.channel, action="porcateg", title="Por Categoria", url="http://www.repelis.tv/genero/accion/pag/1", - thumbnail="http://www.logopro.it/blog/wp-content/uploads/2013/07/categoria-sigaretta-elettronica.png", + thumbnail="http://www.logopro.it/blog/wp-content/uploads/2013/07/categoria-sigaretta" + "-elettronica.png", fanart=mifan)) itemlist.append( - Item(channel=item.channel, action="search", title="Buscar...", url="http://www.repelis.tv/search/?s=", - thumbnail="http://thumbs.dreamstime.com/x/buscar-pistas-13159747.jpg", fanart=mifan)) + Item(channel=item.channel, action="search", title="Buscar...", url="http://www.repelis.tv/search/?s=", + thumbnail="http://thumbs.dreamstime.com/x/buscar-pistas-13159747.jpg", fanart=mifan)) return itemlist -# Peliculas recien agregadas ( quitamos las de estreno del slide-bar en el top + def menupelis(item): logger.info(item.url) itemlist = [] - data = scrapertools.cache_page(item.url).decode('iso-8859-1').encode('utf-8') + data = httptools.downloadpage(item.url).data.decode('iso-8859-1').encode('utf-8') + + if item.extra == '': + section = 'Recién Agregadas' + elif item.extra == 'year': + section = 'del Año \d{4}' + elif item.extra == 'adult': + section = 'de Eróticas \+18' + else: + section = 'de %s'%item.extra + + patronenlaces = '<h.>Películas %s<\/h.>.*?>(.*?)<\/section>'%section + - patronenlaces = '<h3>Películas Recién Agregadas</h3>.*?>(.*?)</section>' matchesenlaces = re.compile(patronenlaces, re.DOTALL).findall(data) - logger.info("begin ----------") - scrapertools.printMatches(matchesenlaces) - logger.info("end ----------") - for bloque_enlaces in matchesenlaces: patron = '<div class="poster-media-card">.*?' - patron += '<a href="(.*?)".*?title="(.*?)".*?' + patron += '<a href="(.*?)".*?title="(.*?)"(.*?)' patron += '<img src="(.*?)"' matches = re.compile(patron, re.DOTALL).findall(bloque_enlaces) - scrapertools.printMatches(matches) - for scrapedurl, scrapedtitle, scrapedthumbnail in matches: + for scrapedurl, scrapedtitle, extra_info, scrapedthumbnail in matches: logger.info("He encontrado el segundo bloque") + logger.info("extra_info: %s" % extra_info) title = scrapertools.remove_show_from_title(scrapedtitle, "Ver Película") title = title.replace("Online", ""); url = urlparse.urljoin(item.url, scrapedurl) thumbnail = urlparse.urljoin(item.url, scrapedthumbnail) - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, fulltitle=title, url=url, - thumbnail=thumbnail, fanart=thumbnail)) + quality = scrapertools.find_single_match(extra_info, 'calidad.*?>Calidad (.*?)<') + year = scrapertools.find_single_match(extra_info, '"anio">(\d{4})<') + language = scrapertools.find_multiple_matches(extra_info, 'class="(latino|espanol|subtitulado)"') + # if language = 'ingles': + # language='vo' + new_item=Item(channel=item.channel, action="findvideos", title=title, fulltitle=title, url=url, + thumbnail=thumbnail, fanart=thumbnail, language=language, quality=quality, + infoLabels={'year': year}) + if year: + tmdb.set_infoLabels_item(new_item) - ## Paginación - # <span class="current">2</span><a href="http://www.repelis.tv/page/3" + itemlist.append(new_item) - # Si falla no muestra ">> Página siguiente" try: next_page = scrapertools.get_match(data, '<span class="current">\d+</span><a href="([^"]+)"') title = "[COLOR red][B]Pagina siguiente »[/B][/COLOR]" itemlist.append( - Item(channel=item.channel, title=title, url=next_page, action="menupelis", thumbnail=item.thumbnail, - fanart=item.fanart, folder=True)) - except: - pass - return itemlist - - -# Todas las peliculas -def todaspelis(item): - logger.info(item.url) - - itemlist = [] - - data = scrapertools.cache_page(item.url).decode('iso-8859-1').encode('utf-8') - print data - patronenlaces = '<h1>.*?</h1>.*?>(.*?)</section>' - matchesenlaces = re.compile(patronenlaces, re.DOTALL).findall(data) - - for bloque_enlaces in matchesenlaces: - - # patron = '<a href="([^"]+)" title="([^"]+)"> <div class="poster".*?<img src="([^"]+)"' - - patron = '<div class="poster-media-card">.*?' - patron += '<a href="(.*?)".*?title="(.*?)".*?' - patron += '<img src="(.*?)"' - - matches = re.compile(patron, re.DOTALL).findall(bloque_enlaces) - scrapertools.printMatches(matches) - for scrapedurl, scrapedtitle, scrapedthumbnail in matches: - title = scrapertools.remove_show_from_title(scrapedtitle, "Ver Película") - title = title.replace("Online", ""); - url = urlparse.urljoin(item.url, scrapedurl) - thumbnail = urlparse.urljoin(item.url, scrapedthumbnail) - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, fulltitle=title, url=url, - thumbnail=thumbnail, fanart=thumbnail)) - - ## Paginación - # <span class="current">2</span><a href="http://www.repelis.tv/page/3" - - # Si falla no muestra ">> Página siguiente" - try: - next_page = scrapertools.get_match(data, '<span class="current">\d+</span><a href="([^"]+)"') - title = "[COLOR red][B]Pagina siguiente »[/B][/COLOR]" - itemlist.append(Item(channel=item.channel, title=title, url=next_page, action="todaspelis", folder=True)) + Item(channel=item.channel, title=title, url=next_page, action="menupelis", thumbnail=item.thumbnail, + fanart=item.fanart, folder=True, extra=item.extra)) except: pass return itemlist @@ -154,7 +133,7 @@ def menudesta(item): itemlist = [] - data = scrapertools.cache_page(item.url).decode('iso-8859-1').encode('utf-8') + data = httptools.downloadpage(item.url).data.decode('iso-8859-1').encode('utf-8') patronenlaces = '<h3>.*?Destacadas.*?>(.*?)<h3>' matchesenlaces = re.compile(patronenlaces, re.DOTALL).findall(data) @@ -168,7 +147,6 @@ def menudesta(item): patron += '<img src="(.*?)"' matches = re.compile(patron, re.DOTALL).findall(bloque_enlaces) - scrapertools.printMatches(matches) for scrapedurl, scrapedtitle, scrapedthumbnail in matches: title = scrapertools.remove_show_from_title(scrapedtitle, "Ver Película") title = title.replace("Online", ""); @@ -186,7 +164,7 @@ def menuestre(item): itemlist = [] - data = scrapertools.cache_page(item.url).decode('iso-8859-1').encode('utf-8') + data = httptools.downloadpage(item.url).data.decode('iso-8859-1').encode('utf-8') patronenlaces = '<h1>Estrenos</h1>(.*?)</section>' matchesenlaces = re.compile(patronenlaces, re.DOTALL).findall(data) @@ -195,18 +173,22 @@ def menuestre(item): # patron = '<a href="([^"]+)" title="([^"]+)"> <div class="poster".*?<img src="([^"]+)"' patron = '<div class="poster-media-card">.*?' - patron += '<a href="(.*?)".*?title="(.*?)".*?' + patron += '<a href="(.*?)".*?title="(.*?)"(.*?)' patron += '<img src="(.*?)"' matches = re.compile(patron, re.DOTALL).findall(bloque_enlaces) - scrapertools.printMatches(matches) - for scrapedurl, scrapedtitle, scrapedthumbnail in matches: + for scrapedurl, scrapedtitle, extra_info, scrapedthumbnail in matches: title = scrapertools.remove_show_from_title(scrapedtitle, "Ver Película") title = title.replace("Online", ""); url = urlparse.urljoin(item.url, scrapedurl) thumbnail = urlparse.urljoin(item.url, scrapedthumbnail) + quality = scrapertools.find_single_match(extra_info, 'calidad.*?>Calidad (.*?)<') + year = scrapertools.find_single_match(extra_info, '"anio">(\d{4})<') + language = scrapertools.find_single_match(extra_info, 'class="(latino|espanol|subtitulado)"') + itemlist.append(Item(channel=item.channel, action="findvideos", title=title, fulltitle=title, url=url, - thumbnail=thumbnail, fanart=thumbnail)) + thumbnail=thumbnail, fanart=thumbnail, language=language, quality=quality, + infoLabels={'year': year})) ## Paginación # <span class="current">2</span><a href="http://www.repelis.tv/page/3" @@ -226,34 +208,15 @@ def findvideos(item): itemlist = [] - data = scrapertools.cache_page(item.url).decode('iso-8859-1').encode('utf-8') + data = httptools.downloadpage(item.url).data.decode('iso-8859-1').encode('utf-8') - '''<h2>Sinopsis</2><p>(.*?)</p> - <div id="informacion" class="tab-pane"> - <h2>Titulo en Español</h2> - <p>Abzurdah</p> - <h2>Titulo Original</h2> - <p>Abzurdah</p> - <h2>Año de Lanzamiento</h2> - <p>2015</p> - <h2>Generos</h2> - <p>Romance</p> - <h2>Idioma</h2> - <p>Latino</p> - <h2>Calidad</h2> - <p>DVD-Rip</p> - ''' - - # estos son los datos para plot patron = '<h2>Sinopsis</h2>.*?<p>(.*?)</p>.*?<div id="informacion".*?</h2>.*?<p>(.*?)</p>' # titulo matches = re.compile(patron, re.DOTALL).findall(data) - scrapertools.printMatches(matches) for sinopsis, title in matches: title = "[COLOR white][B]" + title + "[/B][/COLOR]" patron = '<div id="informacion".*?>(.*?)</div>' matches = re.compile(patron, re.DOTALL).findall(data) - scrapertools.printMatches(matches) for scrapedplot in matches: splot = title + "\n\n" plot = scrapedplot @@ -273,37 +236,45 @@ def findvideos(item): patron = '<tbody>(.*?)</tbody>' matchesx = re.compile(patron, re.DOTALL).findall(data) - scrapertools.printMatches(matchesx) for bloq in matchesx: patron = 'href="(.*?)".*?0 0">(.*?)</.*?<td>(.*?)</.*?<td>(.*?)<' matches = re.compile(patron, re.DOTALL).findall(bloq) - # scrapertools.printMatches(matches) for scrapedurl, scrapedserver, scrapedlang, scrapedquality in matches: url = urlparse.urljoin(item.url, scrapedurl) logger.info("Lang:[" + scrapedlang + "] Quality[" + scrapedquality + "] URL[" + url + "]") patronenlaces = '.*?://(.*?)/' matchesenlaces = re.compile(patronenlaces, re.DOTALL).findall(scrapedurl) - scrapertools.printMatches(matchesenlaces) scrapedtitle = "" + if scrapedserver == 'Vimple': + scrapedserver = 'vimpleru' + elif scrapedserver == 'Ok.ru': + scrapedserver = 'okru' + server = servertools.get_server_name(scrapedserver) for scrapedenlace in matchesenlaces: scrapedtitle = title + " [COLOR white][ [/COLOR]" + "[COLOR green]" + scrapedquality + "[/COLOR]" + "[COLOR white] ][/COLOR]" + " [COLOR red] [" + scrapedlang + "][/COLOR] » " + scrapedserver - itemlist.append( - Item(channel=item.channel, action="play", title=scrapedtitle, extra=title, url=url, fanart=item.thumbnail, - thumbnail=item.thumbnail, plot=splot, folder=False)) + + itemlist.append(Item(channel=item.channel, action="play", title=scrapedtitle, extra=title, url=url, + fanart=item.thumbnail, thumbnail=item.thumbnail, plot=splot, language=scrapedlang, + quality=scrapedquality, server=server)) return itemlist def play(item): - logger.info("url=" + item.url) + logger.info() + itemlist =[] - # itemlist = servertools.find_video_items(data=item.url) + data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(scrapertools.cache_page(item.url), '<iframe src="([^"]+)"') - itemlist = servertools.find_video_items(data=url) + enc = scrapertools.find_multiple_matches(data, "Player\.decode\('(.*?)'\)") + dec='' + for cod in enc: + dec+=decode(cod) + url = scrapertools.find_single_match(dec,'src="(.*?)"') + itemlist.append(item.clone(url=url)) return itemlist @@ -314,17 +285,10 @@ def search(item, texto): item.url = 'http://www.repelis.tv/buscar/?s=%s' % (texto) logger.info(item.url) - data = scrapertools.cache_page(item.url).decode('iso-8859-1').encode('utf-8') + data = httptools.downloadpage(item.url).data.decode('iso-8859-1').encode('utf-8') logger.info("data: " + data) - ''' - <div class="col-xs-2"> - <div class="row"> - <a href="http://www.repelis.tv/8973/pelicula/contracted-phase-ii.html" title="Ver Película Contracted: Phase II Online"> - <img src="http://1.bp.blogspot.com/-YWmw6voBipE/VcB91p-EcnI/AAAAAAAAQZs/EhUzWlInmA8/s175/contracted-phase-2.jpg" border="0"> - ''' - patron = '<div class="col-xs-2">.*?' patron += '<div class="row">.*?' patron += '<a href="(.*?)" title="(.*?)">.*?' @@ -334,8 +298,6 @@ def search(item, texto): matches = re.compile(patron, re.DOTALL).findall(data) - scrapertools.printMatches(matches) - print "repelis ..................................." itemlist = [] for scrapedurl, scrapedtitle, scrapedthumbnail in matches: @@ -344,43 +306,38 @@ def search(item, texto): url = urlparse.urljoin(item.url, scrapedurl) thumbnail = urlparse.urljoin(item.url, scrapedthumbnail) logger.info(url) - itemlist.append( - Item(channel=item.channel, action="findvideos", title=title, fulltitle=title, url=url, thumbnail=thumbnail, - fanart=thumbnail)) + itemlist.append(Item(channel=item.channel, action="findvideos", title=title, fulltitle=title, url=url, + thumbnail=thumbnail, fanart=thumbnail)) return itemlist -# Por año, aquí está difícil filtrar las "eroticas" así que quito la opcion si no esta el adultmode enabled def poranyo(item): logger.info(item.url) itemlist = [] - data = scrapertools.cache_page(item.url).decode('iso-8859-1').encode('utf-8') + data = httptools.downloadpage(item.url).data.decode('iso-8859-1').encode('utf-8') patron = '<option value="([^"]+)">(.*?)</option>' matches = re.compile(patron, re.DOTALL).findall(data) - scrapertools.printMatches(matches) for scrapedurl, scrapedtitle in matches: title = scrapertools.remove_show_from_title(scrapedtitle, "Ver Película") title = title.replace("Online", "") url = urlparse.urljoin(item.url, scrapedurl) - itemlist.append( - Item(channel=item.channel, action="todaspelis", title=title, fulltitle=title, url=url, fanart=item.fanart)) + itemlist.append(Item(channel=item.channel, action="menupelis", title=title, fulltitle=title, url=url, + fanart=item.fanart, extra='year')) return itemlist -# Aqui si que se filtran las eroticas def porcateg(item): logger.info(item.url) itemlist = [] - data = scrapertools.cache_page(item.url).decode('iso-8859-1').encode('utf-8') + data = httptools.downloadpage(item.url).data.decode('iso-8859-1').encode('utf-8') patron = '<li class="cat-item cat-item-3">.*?<a href="([^"]+)" title="([^"]+)">' matches = re.compile(patron, re.DOTALL).findall(data) - scrapertools.printMatches(matches) itemlist = [] for scrapedurl, scrapedtitle in matches: @@ -389,17 +346,49 @@ def porcateg(item): url = urlparse.urljoin(item.url, scrapedurl) logger.info(url) # si no esta permitidas categoria adultos, la filtramos - erotica = "" - if config.get_setting("adult_mode") == 0: - patron = '.*?/erotic.*?' - try: - erotica = scrapertools.get_match(scrapedurl, patron) - except: - itemlist.append( - Item(channel=item.channel, action="todaspelis", fanart=item.fanart, title=title, fulltitle=title, - url=url)) + extra = title + adult_mode = config.get_setting("adult_mode") + if adult_mode != 0: + if 'erotic' in scrapedurl: + extra = 'adult' else: - itemlist.append(Item(channel=item.channel, action="todaspelis", title=title, fulltitle=title, url=url, - fanart=item.fanart)) + extra=title + + if (extra=='adult' and adult_mode != 0) or extra != 'adult': + itemlist.append(Item(channel=item.channel, action="menupelis", title=title, fulltitle=title, url=url, + fanart=item.fanart, extra = extra)) return itemlist + + +def decode(string): + + keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" + output = '' + input = string.encode('utf8') + i = 0 + while i < len(input): + + enc1 = keyStr.index(input[i]) + i += 1 + enc2 = keyStr.index(input[i]) + i += 1 + enc3 = keyStr.index(input[i]) + i += 1 + enc4 = keyStr.index(input[i]) + i += 1 + + chr1 = (enc1 << 2) | (enc2 >> 4) + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2) + chr3 = ((enc3 & 3) << 6) | enc4 + + output = output + unichr(chr1) + if enc3 != 64: + output = output + unichr(chr2) + + if enc4 != 64: + output = output + unichr(chr3) + + output = output.decode('utf8') + + return output \ No newline at end of file diff --git a/plugin.video.alfa/channels/search.json b/plugin.video.alfa/channels/search.json index e5808ff9..6cb3a753 100755 --- a/plugin.video.alfa/channels/search.json +++ b/plugin.video.alfa/channels/search.json @@ -3,7 +3,7 @@ "name": "Buscador global", "active": false, "adult": false, - "language": "es", + "language": ["*"], "version": 1, "changes": [ { diff --git a/plugin.video.alfa/channels/search.py b/plugin.video.alfa/channels/search.py index 4ae621fc..73a0190a 100644 --- a/plugin.video.alfa/channels/search.py +++ b/plugin.video.alfa/channels/search.py @@ -70,10 +70,7 @@ def settings(item): def setting_channel(item): channels_path = os.path.join(config.get_runtime_path(), "channels", '*.json') - channel_language = config.get_setting("channel_language") - - if channel_language == "": - channel_language = "all" + channel_language = config.get_setting("channel_language", default="all") list_controls = [] for infile in sorted(glob.glob(channels_path)): @@ -89,7 +86,8 @@ def setting_channel(item): continue # No incluir si el canal es en un idioma filtrado - if channel_language != "all" and channel_parameters["language"] != channel_language: + if channel_language != "all" and channel_language not in channel_parameters["language"] \ + and "*" not in channel_parameters["language"]: continue # No incluir si en la configuracion del canal no existe "include_in_global_search" @@ -292,11 +290,8 @@ def do_search(item, categories=None): channels_path = os.path.join(config.get_runtime_path(), "channels", '*.json') logger.info("channels_path=%s" % channels_path) - channel_language = config.get_setting("channel_language") + channel_language = config.get_setting("channel_language", default="all") logger.info("channel_language=%s" % channel_language) - if channel_language == "": - channel_language = "all" - logger.info("channel_language=%s" % channel_language) # Para Kodi es necesario esperar antes de cargar el progreso, de lo contrario # el cuadro de progreso queda "detras" del cuadro "cargando..." y no se le puede dar a cancelar @@ -347,7 +342,8 @@ def do_search(item, categories=None): continue # No busca si el canal es en un idioma filtrado - if channel_language != "all" and channel_parameters["language"] != channel_language: + if channel_language != "all" and channel_language not in channel_parameters["language"] \ + and "*" not in channel_parameters["language"]: logger.info("%s -idioma no válido-" % basename_without_extension) continue diff --git a/plugin.video.alfa/channels/seodiv.json b/plugin.video.alfa/channels/seodiv.json index 1dcceec1..71bd7772 100755 --- a/plugin.video.alfa/channels/seodiv.json +++ b/plugin.video.alfa/channels/seodiv.json @@ -1,12 +1,9 @@ { "id": "seodiv", "name": "Seodiv", - "compatible": { - "addon_version": "4.3" - }, "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s32.postimg.org/gh8lhbkb9/seodiv.png", "banner": "https://s31.postimg.org/klwjzp7t7/seodiv_banner.png", "version": 1, diff --git a/plugin.video.alfa/channels/seodiv.py b/plugin.video.alfa/channels/seodiv.py index 203922c2..42c4f183 100755 --- a/plugin.video.alfa/channels/seodiv.py +++ b/plugin.video.alfa/channels/seodiv.py @@ -20,7 +20,7 @@ list_servers = ['openload', list_quality = ['default'] host = 'http://www.seodiv.com' - +language = 'latino' def mainlist(item): logger.info() @@ -35,7 +35,6 @@ def mainlist(item): url=host, thumbnail='https://s27.postimg.org/iahczwgrn/series.png', fanart='https://s27.postimg.org/iahczwgrn/series.png', - language='latino' )) autoplay.show_option(item.channel, itemlist) return itemlist @@ -65,8 +64,7 @@ def todas(item): fanart=fanart, contentSerieName=title, extra='', - language=item.language, - quality='default', + language=language, context=autoplay.context )) @@ -102,8 +100,6 @@ def temporadas(item): plot=plot, fanart=fanart, temp=str(temp), contentSerieName=item.contentSerieName, - language=item.language, - quality=item.quality, context=item.context )) temp = temp + 1 @@ -158,16 +154,14 @@ def episodiosxtemp(item): logger.info() itemlist = [] + item.title = 'Temporada %s' % item.temp.zfill(2) patron_temp = '<li class=item\d+><a href=#>%s <\/a><ul><!--initiate accordion-->.*?<!--initiate ' \ 'accordion-->' % item.title all_data = get_source(item.url) data = scrapertools.find_single_match(all_data, patron_temp) tempo = item.title if 'Temporada' in item.title: - item.title = item.title.replace('Temporada', 'temporada') - item.title = item.title.strip() - item.title = item.title.replace(' ', '-') - + item.title = 'temporada-%s'%item.temp.zfill(2) patron = '<li><a href=(.*?)>.*?(Capitulo|Pelicula).*?(\d+).*?<' matches = re.compile(patron, re.DOTALL).findall(data) @@ -185,8 +179,7 @@ def episodiosxtemp(item): url=url, thumbnail=item.thumbnail, plot=plot, - language=item.language, - quality=item.quality, + language=language, contentSerieName=item.contentSerieName, context=item.context )) @@ -218,7 +211,7 @@ def episodiosxtemp(item): url=url, thumbnail=item.thumbnail, plot=plot, - language=item.language, + language=language, contentSerieName=item.contentSerieName, context=item.context )) diff --git a/plugin.video.alfa/channels/seriecanal.json b/plugin.video.alfa/channels/seriecanal.json index 8e14a0d0..88db8c97 100755 --- a/plugin.video.alfa/channels/seriecanal.json +++ b/plugin.video.alfa/channels/seriecanal.json @@ -3,7 +3,7 @@ "name": "Seriecanal", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "http://i.imgur.com/EwMK8Yd.png", "banner": "seriecanal.png", "version": 1, diff --git a/plugin.video.alfa/channels/seriesadicto.json b/plugin.video.alfa/channels/seriesadicto.json index 4039a308..4633e4dc 100755 --- a/plugin.video.alfa/channels/seriesadicto.json +++ b/plugin.video.alfa/channels/seriesadicto.json @@ -3,7 +3,7 @@ "name": "Seriesadicto", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "seriesadicto.png", "banner": "seriesadicto.png", "version": 1, diff --git a/plugin.video.alfa/channels/seriesblanco.json b/plugin.video.alfa/channels/seriesblanco.json index 4e1616fb..d9eb21b6 100755 --- a/plugin.video.alfa/channels/seriesblanco.json +++ b/plugin.video.alfa/channels/seriesblanco.json @@ -3,7 +3,7 @@ "name": "Seriesblanco", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "seriesblanco.png", "banner": "seriesblanco.png", "version": 1, @@ -23,8 +23,7 @@ ], "categories": [ "tvshow", - "vos", - "latino" + "vos" ], "settings": [ { diff --git a/plugin.video.alfa/channels/seriesblanco.py b/plugin.video.alfa/channels/seriesblanco.py index e4ba57cc..3929998b 100644 --- a/plugin.video.alfa/channels/seriesblanco.py +++ b/plugin.video.alfa/channels/seriesblanco.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- import re import urlparse @@ -10,11 +10,28 @@ from core import scrapertoolsV2 from core import servertools from core.item import Item from platformcode import config, logger +from channels import autoplay -HOST = "http://seriesblanco.com/" + + +HOST = "https://seriesblanco.com/" IDIOMAS = {'es': 'Español', 'en': 'Inglés', 'la': 'Latino', 'vo': 'VO', 'vos': 'VOS', 'vosi': 'VOSI', 'otro': 'OVOS'} list_idiomas = IDIOMAS.values() +list_language = ['default'] CALIDADES = ['SD', 'HDiTunes', 'Micro-HD-720p', 'Micro-HD-1080p', '1080p', '720p'] +list_quality = CALIDADES + +list_servers = ['streamix', + 'powvideo', + 'streamcloud', + 'openload', + 'flashx', + 'streamplay', + 'nowvideo', + 'gamovideo', + 'kingvid', + 'vidabc' + ] def mainlist(item): @@ -25,6 +42,8 @@ def mainlist(item): thumb_buscar = get_thumb("search.png") itemlist = list() + + autoplay.init(item.channel, list_servers, list_quality) itemlist.append(Item(channel=item.channel, title="Listado alfabético", action="series_listado_alfabetico", thumbnail=thumb_series_az)) itemlist.append(Item(channel=item.channel, title="Todas las series", action="series", @@ -40,11 +59,12 @@ def mainlist(item): itemlist.append(Item(channel=item.channel, title="Series por género", action="generos", url=HOST, thumbnail=thumb_series)) itemlist.append( - Item(channel=item.channel, title="Buscar...", action="search", url="https://seriesblanco.com/finder.php", + Item(channel=item.channel, title="Buscar...", action="search", url=urlparse.urljoin(HOST, "finder.php"), thumbnail=thumb_buscar)) itemlist = filtertools.show_option(itemlist, item.channel, list_idiomas, CALIDADES) + autoplay.show_option(item.channel, itemlist) return itemlist @@ -83,10 +103,11 @@ def extract_series_from_data(item, data): else: action = "findvideos" + context1=[filtertools.context(item, list_idiomas, CALIDADES), autoplay.context] itemlist.append(item.clone(title=name, url=urlparse.urljoin(HOST, url), action=action, show=name, thumbnail=img, - context=filtertools.context(item, list_idiomas, CALIDADES))) + context=context1)) more_pages = re.search('pagina=([0-9]+)">>>', data) if more_pages: @@ -241,14 +262,14 @@ def parse_videos(item, type_str, data): regex = re.compile('microhd', re.I) quality = regex.sub("Micro-HD-", quality) # quality = re.sub(r"microhd", "Micro-HD-", quality, flags=re.IGNORECASE) - + server = v_fields.get("server") title = "%s en %s [%s] [%s] (%s: %s)" % (type_str, v_fields.get("server"), IDIOMAS.get(v_fields.get("language"), "OVOS"), quality, v_fields.get("uploader"), v_fields.get("date")) itemlist.append( item.clone(title=title, fulltitle=item.title, url=urlparse.urljoin(HOST, v_fields.get("link")), action="play", language=IDIOMAS.get(v_fields.get("language"), "OVOS"), - quality=quality)) + quality=quality, server= server)) if len(itemlist) > 0: return itemlist @@ -268,7 +289,6 @@ def findvideos(item): # logger.info(data) online = extract_videos_section(data) - try: filtro_enlaces = config.get_setting("filterlinks", item.channel) except: @@ -284,6 +304,16 @@ def findvideos(item): list_links = filtertools.get_links(list_links, item, list_idiomas, CALIDADES) + for i in range(len(list_links)): + a=list_links[i].title + b=a.lstrip('Ver en') + c=b.split('[') + d=c[0].rstrip( ) + d=d.lstrip( ) + list_links[i].server=d + + autoplay.start(list_links, item) + return list_links diff --git a/plugin.video.alfa/channels/seriesdanko.json b/plugin.video.alfa/channels/seriesdanko.json index a8090bb9..076d2ce7 100755 --- a/plugin.video.alfa/channels/seriesdanko.json +++ b/plugin.video.alfa/channels/seriesdanko.json @@ -3,7 +3,7 @@ "name": "Seriesdanko", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "seriesdanko.png", "banner": "seriesdanko.png", "version": 1, diff --git a/plugin.video.alfa/channels/seriesdanko.py b/plugin.video.alfa/channels/seriesdanko.py old mode 100755 new mode 100644 index 424cf4b3..ac3c7a2b --- a/plugin.video.alfa/channels/seriesdanko.py +++ b/plugin.video.alfa/channels/seriesdanko.py @@ -40,7 +40,7 @@ def novedades(item): data = httptools.downloadpage(item.url).data data = re.sub(r"\n|\r|\t|\s{2}| |<Br>|<BR>|<br>|<br/>|<br />|-\s", "", data) data = re.sub(r"<!--.*?-->", "", data) - + logger.debug(data) patron = '<a title="([^"]+)" href="([^"]+)".*?>' patron += "<img.*?src='([^']+)'" matches = re.compile(patron, re.DOTALL).findall(data) @@ -49,11 +49,19 @@ def novedades(item): # patron = "^(.*?)(?:Ya Disponible|Disponible|Disponbile|disponible|\(Actualizada\))$" # match = re.compile(patron, re.DOTALL).findall(scrapedtitle) title = scrapertools.decodeHtmlentities(scrapedtitle) + language='' + # language = scrapertools.find_multiple_matches(title,'(Vose|Español|Latino)') + # for lang in language: + # title = title.replace(lang,'') + # title = title.replace ('Disponible','') + # title = title.replace('Ya', '') + # title = title.strip() + show = scrapertools.find_single_match(title, "^(.+?) \d+[x|X]\d+") itemlist.append(Item(channel=item.channel, title=title, url=urlparse.urljoin(HOST, scrapedurl), show=show, action="episodios", thumbnail=scrapedthumb, - context=filtertools.context(item, list_idiomas, CALIDADES))) + context=filtertools.context(item, list_idiomas, CALIDADES), language=language)) return itemlist @@ -225,7 +233,7 @@ def parse_videos(item, tipo, data): itemlist.append(Item(channel=item.channel, title=title, url=urlparse.urljoin(HOST, link), action="play", show=item.show, language=IDIOMAS.get(language, "OVOS"), quality=quality, - fulltitle=item.title)) + fulltitle=item.title, server=server)) return itemlist diff --git a/plugin.video.alfa/channels/serieslan.json b/plugin.video.alfa/channels/serieslan.json index 47e0f9dc..7927fbb8 100755 --- a/plugin.video.alfa/channels/serieslan.json +++ b/plugin.video.alfa/channels/serieslan.json @@ -3,7 +3,7 @@ "name": "SeriesLan", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "http://i.imgur.com/s6CBxlw.png", "banner": "http://i.imgur.com/c1YTgNT.png", "version": 1, @@ -14,7 +14,6 @@ } ], "categories": [ - "tvshow", - "latino" + "tvshow" ] } \ No newline at end of file diff --git a/plugin.video.alfa/channels/serieslan.py b/plugin.video.alfa/channels/serieslan.py index fac754c4..1081f3ee 100644 --- a/plugin.video.alfa/channels/serieslan.py +++ b/plugin.video.alfa/channels/serieslan.py @@ -10,6 +10,17 @@ from core import servertools from core import tmdb from core.item import Item from platformcode import config, logger +from channels import autoplay + +IDIOMAS = {'latino': 'Latino'} +list_language = IDIOMAS.values() +list_servers = ['openload', + 'okru', + 'netutv', + 'rapidvideo' + ] +list_quality = ['default'] + host = "https://serieslan.com" @@ -17,12 +28,14 @@ host = "https://serieslan.com" def mainlist(item): logger.info() thumb_series = get_thumb("channels_tvshow.png") + autoplay.init(item.channel, list_servers, list_quality) itemlist = list() itemlist.append( Item(channel=item.channel, action="lista", title="Series", url=host, thumbnail=thumb_series, page=0)) itemlist = renumbertools.show_option(item.channel, itemlist) + autoplay.show_option(item.channel, itemlist) return itemlist @@ -48,8 +61,9 @@ def lista(item): title = name url = host + link scrapedthumbnail = host + img + context1=[renumbertools.context(item), autoplay.context] itemlist.append(item.clone(title=title, url=url, action="episodios", thumbnail=scrapedthumbnail, show=title, - context=renumbertools.context(item))) + context=context1)) itemlist.append( Item(channel=item.channel, title="Página Siguiente >>", url=item.url, action="lista", page=item.page + 1)) @@ -76,7 +90,7 @@ def episodios(item): for cap, link, name in matches: title = "" - pat = "as/sd" + pat = "/" # varios episodios en un enlace if len(name.split(pat)) > 1: i = 0 @@ -164,6 +178,7 @@ def findvideos(item): itemlist.append(Item(channel=item.channel, action="play", title=title, show=show, url=video_url, plot=item.plot, thumbnail=thumbnail, server=server, folder=False)) + autoplay.start(itemlist, item) return itemlist else: return [] diff --git a/plugin.video.alfa/channels/serieslatino.json b/plugin.video.alfa/channels/serieslatino.json index 5572fd74..e3718988 100755 --- a/plugin.video.alfa/channels/serieslatino.json +++ b/plugin.video.alfa/channels/serieslatino.json @@ -1,12 +1,9 @@ { "id": "serieslatino", "name": "SeriesLatino", - "compatible": { - "addon_version": "4.3" - }, "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s17.postimg.org/rpmc90y9r/serieslatino.png", "banner": "https://s8.postimg.org/ka707waat/serieslatino_banner.png", "version": 1, @@ -33,7 +30,6 @@ } ], "categories": [ - "latino", "tvshow" ], "settings": [ diff --git a/plugin.video.alfa/channels/serieslatino.py b/plugin.video.alfa/channels/serieslatino.py old mode 100755 new mode 100644 index 25491b58..b5e9b80f --- a/plugin.video.alfa/channels/serieslatino.py +++ b/plugin.video.alfa/channels/serieslatino.py @@ -56,7 +56,7 @@ def mainlist(item): autoplay.init(item.channel, list_servers, list_quality) itemlist = [] - itemlist.append(item.clone(title="Series", action="lista", thumbnail='https://s27.postimg.org/iahczwgrn/series.png', + itemlist.append(Item(channel= item.channel, title="Series", action="lista", thumbnail='https://s27.postimg.org/iahczwgrn/series.png', fanart='https://s27.postimg.org/iahczwgrn/series.png', extra='peliculas/', url=host + 'lista-de-series/')) @@ -136,7 +136,7 @@ def temporadas(item): itemlist.append(Item(channel=item.channel, action='episodiosxtemp', url=item.url, title=title, contentSerieName=item.contentSerieName, thumbnail=thumbnail, plot=plot, fanart=fanart, - contentSeasonNumber=contentSeasonNumber, infoLabels=item.infoLabels)) + contentSeasonNumber=contentSeasonNumber, infoLabels=infoLabels)) tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) if config.get_videolibrary_support() and len(itemlist) > 0: diff --git a/plugin.video.alfa/channels/seriesmeme.json b/plugin.video.alfa/channels/seriesmeme.json index 8f0abc0e..07786a0c 100755 --- a/plugin.video.alfa/channels/seriesmeme.json +++ b/plugin.video.alfa/channels/seriesmeme.json @@ -3,7 +3,7 @@ "name": "SeriesMeme", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "seriesmeme.png", "banner": "seriesmeme.png", "version": 1, @@ -14,7 +14,6 @@ } ], "categories": [ - "tvshow", - "latino" + "tvshow" ] } \ No newline at end of file diff --git a/plugin.video.alfa/channels/seriesmeme.py b/plugin.video.alfa/channels/seriesmeme.py index 8a26700d..54c11ac0 100755 --- a/plugin.video.alfa/channels/seriesmeme.py +++ b/plugin.video.alfa/channels/seriesmeme.py @@ -7,9 +7,20 @@ from channels import renumbertools from channelselector import get_thumb from core import httptools from core import scrapertools +from core import servertools from core import tmdb from core.item import Item from platformcode import config, logger +from channels import autoplay + +IDIOMAS = {'latino': 'Latino', 'español':'Español'} +list_language = IDIOMAS.values() +list_servers = ['openload', + 'sendvid', + 'netutv', + 'rapidvideo' + ] +list_quality = ['default'] host = "https://seriesmeme.com/" @@ -19,12 +30,12 @@ def mainlist(item): thumb_series = get_thumb("channels_tvshow.png") thumb_series_az = get_thumb("channels_tvshow_az.png") - + autoplay.init(item.channel, list_servers, list_quality) itemlist = list() itemlist.append(Item(channel=item.channel, action="lista_gen", title="Novedades", url=host, thumbnail=thumb_series)) - itemlist.append(Item(channel=item.channel, action="lista", title="Series", url=urlparse.urljoin(host, "/lista"), + itemlist.append(Item(channel=item.channel, action="lista", title="Listado Completo de Series", url=urlparse.urljoin(host, "/lista"), thumbnail=thumb_series)) itemlist.append(Item(channel=item.channel, action="categorias", title="Categorias", url=host, thumbnail=thumb_series)) @@ -33,6 +44,7 @@ def mainlist(item): itemlist.append(Item(channel=item.channel, action="top", title="Top Series", url=host, thumbnail=thumb_series)) itemlist = renumbertools.show_option(item.channel, itemlist) + autoplay.show_option(item.channel, itemlist) return itemlist @@ -121,7 +133,7 @@ def lista_gen(item): patron = '<article id=.+? class=.+?><div.+?>' patron += '<a href="([^"]+)" title="([^"]+)' # scrapedurl, # scrapedtitle patron += ' Capítulos Completos ([^"]+)">' # scrapedlang - patron += '<img.+? data-src=.+? data-lazy-src="([^"]+)"' # scrapedthumbnail + patron += '<img src=".+?" data-lazy-src="([^"]+)"' # scrapedthumbnail matches = scrapertools.find_multiple_matches(data, patron) i = 0 for scrapedurl, scrapedtitle, scrapedlang, scrapedthumbnail in matches: @@ -129,18 +141,20 @@ def lista_gen(item): if 'HD' in scrapedlang: scrapedlang = scrapedlang.replace('HD', '') title = scrapedtitle + " [ " + scrapedlang + "]" + context1=[renumbertools.context(item), autoplay.context] itemlist.append( Item(channel=item.channel, title=title, url=scrapedurl, thumbnail=scrapedthumbnail, action="episodios", - show=scrapedtitle, context=renumbertools.context(item))) + show=scrapedtitle, context=context1)) tmdb.set_infoLabels(itemlist) # Paginacion - patron_pag = '<a class="nextpostslink" rel="next" href="([^"]+)">' - next_page_url = scrapertools.find_single_match(data, patron_pag) - - if next_page_url != "" and i != 1: - item.url = next_page_url - itemlist.append(Item(channel=item.channel, action="lista_gen", title=">> Página siguiente", url=next_page_url, - thumbnail='https://s32.postimg.org/4zppxf5j9/siguiente.png')) + + #patron_pag='<a class="nextpostslink" rel="next" href="([^"]+)">' + patron_pag='<li class="next right"><a href="([^"]+)" >([^"]+)<\/a><\/li>' + next_page_url = scrapertools.find_single_match(data,patron_pag) + + if next_page_url!="" and i!=1: + item.url=next_page_url[0] + itemlist.append(Item(channel = item.channel,action = "lista_gen",title = ">> Página siguiente", url = next_page_url[0], thumbnail='https://s32.postimg.org/4zppxf5j9/siguiente.png')) return itemlist @@ -171,7 +185,6 @@ def episodios(item): matches = scrapertools.find_multiple_matches(data, patron_caps) show = scrapertools.find_single_match(data, '<h3><strong>.+?de (.+?)<\/strong>') scrapedplot = scrapertools.find_single_match(data, '<strong>Sinopsis<\/strong><strong>([^"]+)<\/strong><\/pre>') - logger.info("epibla " + data) for link, cap, name in matches: if 'x' in cap: title = cap + " - " + name @@ -194,3 +207,18 @@ def episodios(item): action="add_serie_to_library", extra="episodios", show=show)) return itemlist + + +def findvideos(item): + logger.info() + + itemlist = [] + + data = httptools.downloadpage(item.url).data + itemlist.extend(servertools.find_video_items(data=data)) + for videoitem in itemlist: + videoitem.channel=item.channel + + autoplay.start(itemlist, item) + + return itemlist diff --git a/plugin.video.alfa/channels/seriespapaya.json b/plugin.video.alfa/channels/seriespapaya.json index ccd7763f..fe12bc7a 100755 --- a/plugin.video.alfa/channels/seriespapaya.json +++ b/plugin.video.alfa/channels/seriespapaya.json @@ -3,7 +3,7 @@ "name": "SeriesPapaya", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "http://i.imgur.com/P1D92cf.png", "banner": "http://i.imgur.com/OHHvi5z.png", "version": 1, diff --git a/plugin.video.alfa/channels/seriespapaya.py b/plugin.video.alfa/channels/seriespapaya.py index 0baf8eec..522180e4 100644 --- a/plugin.video.alfa/channels/seriespapaya.py +++ b/plugin.video.alfa/channels/seriespapaya.py @@ -11,12 +11,14 @@ from core import httptools from core import jsontools from core import scrapertools from core import servertools +from core import tmdb from core.item import Item from platformcode import config, logger HOST = "http://www.seriespapaya.com" -IDIOMAS = {'es': 'Español', 'lat': 'Latino', 'in': 'Inglés', 'ca': 'Catalán', 'sub': 'VOS'} +IDIOMAS = {'es': 'Español', 'lat': 'Latino', 'in': 'Inglés', 'ca': 'Catalán', 'sub': 'VOSE', 'Español Latino':'lat', + 'Español Castellano':'es', 'Sub Español':'VOSE'} list_idiomas = IDIOMAS.values() CALIDADES = ['360p', '480p', '720p HD', '1080p HD'] @@ -67,22 +69,31 @@ def series_por_letra_y_grupo(item): "letra": item.letter.lower() } data = httptools.downloadpage(url, post=urllib.urlencode(post_request)).data + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) + patron = '<div class=list_imagen><img src=(.*?) \/>.*?<div class=list_titulo><a href=(.*?) style=.*?inherit;>(.*?)' + patron +='<.*?justify>(.*?)<.*?Año:<\/b>.*?(\d{4})<' + matches = re.compile(patron, re.DOTALL).findall(data) + #series = re.findall( + # 'list_imagen.+?src="(?P<img>[^"]+).+?<div class="list_titulo"><a[^>]+href="(?P<url>[^"]+)[^>]+>(.*?)</a>', data, + # re.MULTILINE | re.DOTALL) - series = re.findall( - 'list_imagen.+?src="(?P<img>[^"]+).+?<div class="list_titulo"><a[^>]+href="(?P<url>[^"]+)[^>]+>(.*?)</a>', data, - re.MULTILINE | re.DOTALL) - - for img, url, name in series: - itemlist.append(item.clone( + for img, url, name, plot, year in matches: + new_item= Item( + channel = item.channel, action="episodios", title=name, show=name, url=urlparse.urljoin(HOST, url), thumbnail=urlparse.urljoin(HOST, img), - context=filtertools.context(item, list_idiomas, CALIDADES) - )) + context=filtertools.context(item, list_idiomas, CALIDADES), + plot = plot, + infoLabels={'year':year} + ) + if year: + tmdb.set_infoLabels_item(new_item) + itemlist.append(new_item) - if len(series) == 8: + if len(matches) == 8: itemlist.append(item.clone(title="Siguiente >>", action="series_por_letra_y_grupo", extra=item.extra + 1)) if item.extra > 0: @@ -94,13 +105,16 @@ def series_por_letra_y_grupo(item): def novedades(item): logger.info() data = httptools.downloadpage(HOST).data - shows = re.findall('sidebarestdiv[^<]+<a[^<]+title="([^"]*)[^<]+href="([^"]*)[^<]+<img[^<]+src="([^"]+)', data, - re.MULTILINE | re.DOTALL) + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) + patron = 'sidebarestdiv><a title=(.*?\d+X\d+) (.*?) href=(.*?)>.*?src=(.*?)>' + matches = re.compile(patron, re.DOTALL).findall(data) itemlist = [] - for title, url, img in shows: - itemlist.append(item.clone(action="findvideos", title=title, url=urlparse.urljoin(HOST, url), thumbnail=img)) + for title, language,url, img in matches: + language = IDIOMAS[language] + itemlist.append(item.clone(action="findvideos", title=title, url=urlparse.urljoin(HOST, url), thumbnail=img, + language=language)) return itemlist @@ -133,7 +147,6 @@ def episodios(item): itemlist = [] for url, title, langs in episodes: - logger.debug("langs %s" % langs) languages = " ".join( ["[%s]" % IDIOMAS.get(lang, lang) for lang in re.findall('images/s-([^\.]+)', langs)]) filter_lang = languages.replace("[", "").replace("]", "").split(" ") @@ -206,6 +219,5 @@ def play(item): logger.info("play: %s" % item.url) data = httptools.downloadpage(item.url).data video_url = scrapertools.find_single_match(data, "location.href='([^']+)") - logger.debug("Video URL = %s" % video_url) itemlist = servertools.find_video_items(data=video_url) return itemlist diff --git a/plugin.video.alfa/channels/seriesyonkis.json b/plugin.video.alfa/channels/seriesyonkis.json index 54fde9a4..9a37397d 100755 --- a/plugin.video.alfa/channels/seriesyonkis.json +++ b/plugin.video.alfa/channels/seriesyonkis.json @@ -3,7 +3,7 @@ "name": "Seriesyonkis", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "thumbnail": "seriesyonkis.png", "banner": "seriesyonkis.png", "fanart": "seriesyonkis.jpg", diff --git a/plugin.video.alfa/channels/serviporno.json b/plugin.video.alfa/channels/serviporno.json index 9255e43f..19cccf00 100755 --- a/plugin.video.alfa/channels/serviporno.json +++ b/plugin.video.alfa/channels/serviporno.json @@ -3,7 +3,7 @@ "name": "Serviporno", "active": true, "adult": true, - "language": "es", + "language": ["*"], "thumbnail": "serviporno.png", "banner": "serviporno.png", "version": 1, diff --git a/plugin.video.alfa/channels/sipeliculas.json b/plugin.video.alfa/channels/sipeliculas.json index c83ae8b4..62377c04 100755 --- a/plugin.video.alfa/channels/sipeliculas.json +++ b/plugin.video.alfa/channels/sipeliculas.json @@ -3,7 +3,7 @@ "name": "SiPeliculas", "active": true, "adult": false, - "language": "es", + "language": "[lat]", "banner": "https://s24.postimg.org/5wcznkxhv/sipeliculas.png", "thumbnail": "https://s23.postimg.org/adrl2k5mz/sipeliculas.png", "version": 1, @@ -18,7 +18,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/sipeliculas.py b/plugin.video.alfa/channels/sipeliculas.py index 7e76bd9b..95ba9295 100755 --- a/plugin.video.alfa/channels/sipeliculas.py +++ b/plugin.video.alfa/channels/sipeliculas.py @@ -6,6 +6,7 @@ import urlparse from core import httptools from core import scrapertools from core import servertools +from core import tmdb from core.item import Item from platformcode import logger @@ -60,18 +61,18 @@ def lista(item): logger.info() itemlist = [] data = httptools.downloadpage(item.url).data - # data = re.sub(r'"|\n|\r|\t| |<br>', "", data) - listado = scrapertools.find_single_match(data, '<div id="sipeliculas" class="borde"><div class="izquierda">(.*?)<div class="derecha"><h2') - logger.info('vergas' + listado) - patron = '<li class="[^"]+"><a class="[^"]+" href="([^"]+)" title="Ver Película([^"]+)"><i></i><img.*?src="([^"]+)" alt="[^"]+"/>(.*?)</li>' - matches = re.compile(patron, re.DOTALL).findall(listado) - for scrapedurl, scrapedtitle, scrapedthumbnail, dataplot in matches: - dataplot = scrapertools.find_single_match(data, '<div class="ttip"><h5>[^<]+</h5><p><span>([^<]+)</span>') - itemlist.append(Item(channel=item.channel, action='findvideos', title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=dataplot, contentTitle=scrapedtitle, extra=item.extra)) + patron = '<a class="i" href="(.*?)".*?src="(.*?)".*?title=.*?>(.*?)<.*?span>(.*?)<.*?<p><span>(.*?)<' + matches = re.compile(patron, re.DOTALL).findall(listado) + + for scrapedurl, scrapedthumbnail, scrapedtitle, year, plot in matches: + itemlist.append(Item(channel=item.channel, action='findvideos', title=scrapedtitle, url=scrapedurl, + thumbnail=scrapedthumbnail, plot=plot, contentTitle=scrapedtitle, extra=item.extra, + infoLabels ={'year':year})) + + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) # Paginacion if itemlist != []: patron = '<li[^<]+<a href="([^"]+)" title="[^"]+">Siguiente[^<]+</a></li>' @@ -96,22 +97,26 @@ def findvideos(item): logger.info() itemlist = [] data = httptools.downloadpage(item.url).data - # data = re.sub(r"'|\n|\r|\t| |<br>", "", data) listado1 = scrapertools.find_single_match(data, '<div class="links" id="ver-mas-opciones"><h2 class="h2"><i class="[^"]+"></i>[^<]+</h2><ul class="opciones">(.*?)</ul>') patron1 = '<li ><a id="([^"]+)" rel="nofollow" href="([^"]+)" title="[^"]+" alt="([^"]+)"><span class="opcion"><i class="[^"]+"></i><u>[^<]+</u>[^<]+</span><span class="ico"><img src="[^"]+" alt="[^"]+"/>[^<]+</span><span>([^"]+)</span><span>([^"]+)</span></a></li>' matches = matches = re.compile(patron1, re.DOTALL).findall(listado1) - for vidId, vidUrl, vidServer, idioma, calidad in matches: + for vidId, vidUrl, vidServer, language, quality in matches: + server = servertools.get_server_name(vidServer) + if 'Sub' in language: + language='sub' itemlist.append(Item(channel=item.channel, action='play', url=vidUrl, extra=vidId, - title='Ver en ' + vidServer + ' | ' + idioma + ' | ' + calidad, thumbnail=item.thumbnail)) + title='Ver en ' + vidServer + ' | ' + language + ' | ' + quality, + thumbnail=item.thumbnail, server=server, language=language, quality=quality )) listado2 = scrapertools.find_single_match(data, '<ul class="opciones-tab">(.*?)</ul>') patron2 = '<li ><a id="([^"]+)" rel="nofollow" href="([^"]+)" title="[^"]+" alt="([^"]+)"><img src="[^"]+" alt="[^"]+"/>[^<]+</a></li>' matches = matches = re.compile(patron2, re.DOTALL).findall(listado2) for vidId, vidUrl, vidServer in matches: + server = servertools.get_server_name(vidServer) itemlist.append(Item(channel=item.channel, action='play', url=vidUrl, extra=vidId, title='Ver en ' + vidServer, - thumbnail=item.thumbnail)) + thumbnail=item.thumbnail, server=server)) for videoitem in itemlist: videoitem.fulltitle = item.title diff --git a/plugin.video.alfa/channels/submityouflicks.json b/plugin.video.alfa/channels/submityouflicks.json index c93a2fc7..bf6daf4f 100755 --- a/plugin.video.alfa/channels/submityouflicks.json +++ b/plugin.video.alfa/channels/submityouflicks.json @@ -3,7 +3,7 @@ "name": "Submit Your Flicks", "active": true, "adult": true, - "language": "es", + "language": ["*"], "banner": "submityouflicks.png", "thumbnail": "submityouflicks.png", "version": 1, diff --git a/plugin.video.alfa/channels/teledocumentales.json b/plugin.video.alfa/channels/teledocumentales.json index d2cb95eb..2c390f3e 100755 --- a/plugin.video.alfa/channels/teledocumentales.json +++ b/plugin.video.alfa/channels/teledocumentales.json @@ -3,7 +3,7 @@ "name": "Teledocumentales", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "banner": "teledocumentales.png", "thumbnail": "teledocumentales.png", "version": 1, diff --git a/plugin.video.alfa/channels/thumbzilla.json b/plugin.video.alfa/channels/thumbzilla.json new file mode 100644 index 00000000..0ce89ef0 --- /dev/null +++ b/plugin.video.alfa/channels/thumbzilla.json @@ -0,0 +1,44 @@ +{ + "id": "thumbzilla", + "name": "ThumbZilla", + "active": true, + "adult": true, + "language": "en", + "fanart": "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/adults/xthearebg.jpg", + "thumbnail": "https://image.spreadshirtmedia.com/image-server/v1/designs/1002274824,width=178,height=178/thumbzilla-womens-white-tee-big-logo.png", + "banner": "", + "version": 1, + "changes": [ + { + "date": "07/06/17", + "description": "Canal Nuevo" + } + ], + "categories": [ + "adult" + ], + "settings": [ + { + "id": "modo_grafico", + "type": "bool", + "label": "Buscar información extra", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "perfil", + "type": "list", + "label": "Perfil de color", + "default": 3, + "enabled": true, + "visible": true, + "lvalues": [ + "Sin color", + "Perfil 3", + "Perfil 2", + "Perfil 1" + ] + } + ] +} diff --git a/plugin.video.alfa/channels/thumbzilla.py b/plugin.video.alfa/channels/thumbzilla.py new file mode 100644 index 00000000..3ad51f41 --- /dev/null +++ b/plugin.video.alfa/channels/thumbzilla.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- + +import re +import urlparse + +from core import channeltools +from core import httptools +from core import scrapertools +from core import servertools +from core.item import Item +from platformcode import config, logger +from channelselector import get_thumb + +__channel__ = "thumbzilla" + +host = 'https://www.thumbzilla.com/' +try: + __modo_grafico__ = config.get_setting('modo_grafico', __channel__) + __perfil__ = int(config.get_setting('perfil', __channel__)) +except: + __modo_grafico__ = True + __perfil__ = 0 + +# Fijar perfil de color +perfil = [['0xFF6E2802', '0xFFFAA171', '0xFFE9D7940'], + ['0xFFA5F6AF', '0xFF5FDA6D', '0xFF11811E'], + ['0xFF58D3F7', '0xFF2E64FE', '0xFF0404B4']] + +if __perfil__ - 1 >= 0: + color1, color2, color3 = perfil[__perfil__ - 1] +else: + color1 = color2 = color3 = "" + +headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], + ['Referer', host]] + +parameters = channeltools.get_channel_parameters(__channel__) +fanart_host = parameters['fanart'] +thumbnail_host = parameters['thumbnail'] +thumbnail = 'https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/adults/%s.png' + + +def mainlist(item): + logger.info() + itemlist = [] + itemlist.append(Item(channel=__channel__, action="videos", title="Más Calientes", url=host, + viewmode="movie", thumbnail=get_thumb("channels_adult.png"))) + + itemlist.append(Item(channel=__channel__, title="Nuevas", url=host + 'newest', + action="videos", viewmode="movie_with_plot", viewcontent='movies', + thumbnail=get_thumb("channels_adult.png"))) + + itemlist.append(Item(channel=__channel__, title="Tendencias", url=host + 'tending', + action="videos", viewmode="movie_with_plot", viewcontent='movies', + thumbnail=get_thumb("channels_adult.png"))) + + itemlist.append(Item(channel=__channel__, title="Mejores Videos", url=host + 'top', + action="videos", viewmode="movie_with_plot", viewcontent='movies', + thumbnail=get_thumb("channels_adult.png"))) + + itemlist.append(Item(channel=__channel__, title="Populares", url=host + 'popular', + action="videos", viewmode="movie_with_plot", viewcontent='movies', + thumbnail=get_thumb("channels_adult.png"))) + + itemlist.append(Item(channel=__channel__, title="Videos en HD", url=host + 'hd', + action="videos", viewmode="movie_with_plot", viewcontent='movies', + thumbnail=get_thumb("channels_adult.png"))) + + itemlist.append(Item(channel=__channel__, title="Caseros", url=host + 'hd', + action="videos", viewmode="movie_with_plot", viewcontent='homemade', + thumbnail=get_thumb("channels_adult.png"))) + + itemlist.append(Item(channel=__channel__, title="Categorías", action="categorias", + url=host + 'categories/', viewmode="movie_with_plot", viewcontent='movies', + thumbnail=get_thumb("channels_adult.png"))) + + itemlist.append(Item(channel=__channel__, title="Buscador", action="search", url=host, + thumbnail=get_thumb("channels_adult.png"), extra="buscar")) + return itemlist + + +# REALMENTE PASA LA DIRECCION DE BUSQUEDA + +def search(item, texto): + logger.info() + texto = texto.replace(" ", "+") + item.url = urlparse.urljoin(item.url, "video/search?q={0}".format(texto)) + # item.url = item.url % tecleado + item.extra = "buscar" + try: + return videos(item) + # Se captura la excepción, para no interrumpir al buscador global si un canal falla + except: + import sys + for line in sys.exc_info(): + logger.error("{0}".format(line)) + return [] + + +def videos(item): + logger.info() + itemlist = [] + + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + patron = '<a class="[^"]+" href="([^"]+)">' # url + patron += '<img id="[^"]+".*?src="([^"]+)".*?' # img + patron += '<span class="title">([^<]+)</span>.*?' # title + patron += '<span class="duration">([^<]+)</span>' # time + matches = scrapertools.find_multiple_matches(data, patron) + + for scrapedurl, scrapedthumbnail, scrapedtitle, time in matches: + title = "[%s] %s" % (time, scrapedtitle) + + itemlist.append(Item(channel=item.channel, action='findvideos', title=title, thumbnail=scrapedthumbnail, + url=host + scrapedurl, contentTile=scrapedtitle, fanart=scrapedthumbnail)) + + paginacion = scrapertools.find_single_match(data, '<link rel="next" href="([^"]+)" />').replace('amp;', '') + + if paginacion: + itemlist.append(Item(channel=item.channel, action="videos", + thumbnail=thumbnail % 'rarrow', + title="\xc2\xbb Siguiente \xc2\xbb", url=paginacion)) + + return itemlist + + +def categorias(item): + logger.info() + itemlist = [] + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t| |<br>", "", data) + # logger.info(data) + patron = 'class="checkHomepage"><a href="([^"]+)".*?' # url + patron += '<span class="count">([^<]+)</span>' # title, vids + + matches = re.compile(patron, re.DOTALL).findall(data) + + for scrapedurl, vids in matches: + scrapedtitle = scrapedurl.replace('/categories/', '').replace('-', ' ').title() + title = "%s (%s)" % (scrapedtitle, vids.title()) + thumbnail = item.thumbnail + url = urlparse.urljoin(item.url, scrapedurl) + itemlist.append(Item(channel=item.channel, action="videos", fanart=thumbnail, + title=title, url=url, thumbnail=thumbnail, + viewmode="movie_with_plot", folder=True)) + + return itemlist + + +def findvideos(item): + itemlist = [] + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|amp;|\s{2}| ", "", data) + # logger.info(data) + patron = '"quality":"([^"]+)","videoUrl":"([^"]+)"' + matches = scrapertools.find_multiple_matches(data, patron) + + for calidad, scrapedurl in matches: + scrapedurl = scrapedurl.replace('\\', '') + title = "[COLOR yellow](%s)[/COLOR] %s" % (calidad, item.contentTile) + server = servertools.get_server_from_url(scrapedurl) + + itemlist.append(item.clone(action='play', title=title, server=server, mediatype='movie', url=scrapedurl)) + + return itemlist diff --git a/plugin.video.alfa/channels/torrentlocura.json b/plugin.video.alfa/channels/torrentlocura.json index 1dc0d89c..11ea8fd8 100755 --- a/plugin.video.alfa/channels/torrentlocura.json +++ b/plugin.video.alfa/channels/torrentlocura.json @@ -3,26 +3,15 @@ "name": "Torrentlocura", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "banner": "torrentlocura.png", "thumbnail": "http://imgur.com/EWmLS3d.png", + "fanart": "http://imgur.com/V7QZLAL.jpg", "version": 1, "changes": [ { - "date": "31/12/2016", - "description": "Release" - }, - { - "date": "13/01/2017", - "description": "Añadida info a cápitulos en bloque" - }, - { - "date": "04/04/2017", - "description": "Reparación cambios web" - }, - { - "date": "28/06/2017", - "description": "Corrección código y algunas mejoras" + "date": "25/08/2017", + "description": "revamp" } ], "categories": [ diff --git a/plugin.video.alfa/channels/torrentlocura.py b/plugin.video.alfa/channels/torrentlocura.py index 20777ab0..ba8ebbfd 100755 --- a/plugin.video.alfa/channels/torrentlocura.py +++ b/plugin.video.alfa/channels/torrentlocura.py @@ -1,117 +1,55 @@ # -*- coding: utf-8 -*- -import os import re import urllib +import urlparse -import xbmc -import xbmcgui + + +from channelselector import get_thumb from core import httptools from core import scrapertools from core import servertools -from core import tmdb from core.item import Item -from core.scrapertools import decodeHtmlentities as dhe -from platformcode import config, logger +from platformcode import logger -ACTION_SHOW_FULLSCREEN = 36 -ACTION_GESTURE_SWIPE_LEFT = 511 -ACTION_SELECT_ITEM = 7 -ACTION_PREVIOUS_MENU = 10 -ACTION_MOVE_LEFT = 1 -ACTION_MOVE_RIGHT = 2 -ACTION_MOVE_DOWN = 4 -ACTION_MOVE_UP = 3 -OPTION_PANEL = 6 -OPTIONS_OK = 5 - - -# Para la busqueda en bing evitando baneos - -def browser(url): - import mechanize - - # Utilizamos Browser mechanize para saltar problemas con la busqueda en bing - br = mechanize.Browser() - # Browser options - br.set_handle_equiv(False) - br.set_handle_gzip(True) - br.set_handle_redirect(True) - br.set_handle_referer(False) - br.set_handle_robots(False) - # Follows refresh 0 but not hangs on refresh > 0 - br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) - # Want debugging messages? - # br.set_debug_http(True) - # br.set_debug_redirects(True) - # br.set_debug_responses(True) - - # User-Agent (this is cheating, ok?) - # br.addheaders = [('User-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/7.1.7 Safari/537.85.16')] - # br.addheaders =[('Cookie','SRCHD=AF=QBRE; domain=.bing.com; expires=25 de febrero de 2018 13:00:28 GMT+1; MUIDB=3B942052D204686335322894D3086911; domain=www.bing.com;expires=24 de febrero de 2018 13:00:28 GMT+1')] - # Open some site, let's pick a random one, the first that pops in mind - r = br.open(url) - response = r.read() - print response - if "img,divreturn" in response: - r = br.open("http://ssl-proxy.my-addr.org/myaddrproxy.php/" + url) - print "prooooxy" - response = r.read() - - return response - - -api_key = "2e2160006592024ba87ccdf78c28f49f" -api_fankey = "dffe90fba4d02c199ae7a9e71330c987" +host = "http://torrentlocura.com/" def mainlist(item): logger.info() - itemlist = [] - itemlist.append(item.clone(title="[COLOR crimson][B]Películas[/B][/COLOR]", action="scraper", - url="http://torrentlocura.com/peliculas/", thumbnail="http://imgur.com/RfZjMBi.png", - fanart="http://imgur.com/V7QZLAL.jpg", contentType="movie")) - itemlist.append(itemlist[-1].clone(title="[COLOR crimson][B] Películas HD[/B][/COLOR]", action="scraper", - url="http://torrentlocura.com/peliculas-hd/", - thumbnail="http://imgur.com/RfZjMBi.png", fanart="http://imgur.com/V7QZLAL.jpg", - contentType="movie")) - itemlist.append(itemlist[-1].clone(title=" [COLOR crimson][B]Estrenos[/B][/COLOR]", action="scraper", - url="http://torrentlocura.com/estrenos-de-cine/", - thumbnail="http://imgur.com/RfZjMBi.png", fanart="http://imgur.com/V7QZLAL.jpg", - contentType="movie")) - itemlist.append(itemlist[-1].clone(title="[COLOR crimson][B] Películas 3D[/B][/COLOR]", action="scraper", - url="http://torrentlocura.com/peliculas-3d/", - thumbnail="http://imgur.com/RfZjMBi.png", fanart="http://imgur.com/V7QZLAL.jpg", - contentType="movie")) + + thumb_movie = get_thumb("channels_movie.png") + thumb_tvshow = get_thumb("channels_tvshow.png") + thumb_anime = get_thumb("channels_anime.png") + thumb_search = get_thumb("search.png") + + itemlist = list() + itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host, + thumbnail=thumb_movie, pattern="peliculas")) itemlist.append( - itemlist[-1].clone(title=" [COLOR crimson][B]Películas subtituladas[/B][/COLOR]", action="scraper", - url="http://torrentlocura.com/peliculas-vo/", thumbnail="http://imgur.com/RfZjMBi.png", - fanart="http://imgur.com/V7QZLAL.jpg", contentType="movie")) + Item(channel=item.channel, action="submenu", title="Series", url=host, + thumbnail=thumb_tvshow, pattern="series")) itemlist.append( - itemlist[-1].clone(title="[COLOR crimson][B] Películas Audio Latino[/B][/COLOR]", action="scraper", - url="http://torrentlocura.com/peliculas-latino/", thumbnail="http://imgur.com/RfZjMBi.png", - fanart="http://imgur.com/V7QZLAL.jpg", contentType="movie")) - itemlist.append(itemlist[-1].clone(title="[COLOR crimson][B]Series[/B][/COLOR]", action="scraper", - url="http://torrentlocura.com/series/", thumbnail="http://imgur.com/vX2dUYl.png", - contentType="tvshow")) - itemlist.append(itemlist[-1].clone(title=" [COLOR crimson][B]Series HD[/B][/COLOR]", action="scraper", - url="http://torrentlocura.com/series-hd/", - thumbnail="http://imgur.com/vX2dUYl.png", fanart="http://imgur.com/V7QZLAL.jpg", - contentType="tvshow")) - itemlist.append(itemlist[-1].clone(title="[COLOR crimson][B]Buscar[/B][/COLOR]", action="search", url="", - thumbnail="http://imgur.com/rSttk79.png", fanart="http://imgur.com/V7QZLAL.jpg")) + Item(channel=item.channel, action="anime", title="Anime", url=host, + thumbnail=thumb_anime, pattern="anime")) + itemlist.append(Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", + thumbnail=thumb_search)) return itemlist def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = "http://torrentlocura.com/buscar" - item.extra = urllib.urlencode({'q': texto}) - item.contentType != "movie" + logger.info("search:" + texto) + # texto = texto.replace(" ", "+") + try: - return buscador(item) + item.post = "q=%s" % texto + item.pattern = "buscar-list" + itemlist = listado2(item) + + return itemlist + # Se captura la excepción, para no interrumpir al buscador global si un canal falla except: import sys @@ -120,1079 +58,409 @@ def search(item, texto): return [] -def buscador(item): +def anime(item): logger.info() itemlist = [] - data = httptools.downloadpage(item.url, post=item.extra, ).data - data = unicode(data, "latin1").encode("utf8") - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - check_item = [] - bloque_enlaces = scrapertools.find_single_match(data, 'Resultados(.*?)end .page-box') - result_0 = scrapertools.find_multiple_matches(bloque_enlaces, - 'a href="([^"]+)" title="Descargar (.*?) ([^<]+)"><img src="([^"]+)".*?Descargar</a>') - for url, tipo, title, thumb in result_0: - try: - year = scrapertools.find_single_match(title, '(\d\d\d\d)') - except: - year = "" - if tipo == "Serie": - contentType = "tv" - title = re.sub(r'-.*', '', title) - title_check = title.strip() - else: - contentType = "movie" - # tipo="Pelicula" - title = re.sub(r'de Cine', 'Screener', title) - title = title.replace("RIP", "HdRip") - title_check = (title + " " + tipo).strip() - if "pc" in tipo or "PC" in tipo or "XBOX" in tipo or "Nintendo" in tipo or "Windows" in tipo or "varios" in url or "juego" in url: - continue + title = "Anime" + url = host + "anime" + itemlist.append(item.clone(channel=item.channel, action="listado", title=title, url=url, + pattern="pelilist")) + itemlist.append( + item.clone(channel=item.channel, action="alfabeto", title=title + " [A-Z]", url=url, + thumbnail=item.thumbnail[:-4] + "_az.png", pattern="pelilist")) - if title_check in str(check_item): + return itemlist + + +def submenu(item): + logger.info() + itemlist = [] + + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) + # data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") + + pattern = '<li><a href="%s%s/">.*?<ul>(.*?)</ul>' % (host, item.pattern) + data = scrapertools.get_match(data, pattern) + + pattern = '<a href="([^"]+)".*?>([^>]+)</a>' + matches = re.compile(pattern, re.DOTALL).findall(data) + + for scrapedurl, scrapedtitle in matches: + title = scrapedtitle.strip() + url = scrapedurl + + if item.pattern in title.lower(): + itemlist.append(item.clone(channel=item.channel, action="listado", title=title, url=url, + pattern="pelilist")) + itemlist.append( + item.clone(channel=item.channel, action="alfabeto", title=title + " [A-Z]", url=url, + thumbnail=item.thumbnail[:-4] + "_az.png", pattern="pelilist")) + + return itemlist + + +def alfabeto(item): + logger.info() + itemlist = [] + + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) + # data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") + + pattern = '<ul class="alfabeto">(.*?)</ul>' + data = scrapertools.get_match(data, pattern) + + patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>' + matches = re.compile(patron, re.DOTALL).findall(data) + + for scrapedurl, scrapedtitle in matches: + title = scrapedtitle.upper() + url = scrapedurl + + itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, pattern=item.pattern)) + + return itemlist + + +def listado(item): + logger.info() + itemlist = [] + + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) + data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") + + # logger.debug("data %s " % data) + next_page = scrapertools.find_single_match(data, '<ul class="pagination">.*?<a class="current" href.*?' + '<a\s*href="([^"]+)">') + # logger.debug("data %s " % next_page) + + pattern = '<ul class="%s">(.*?)</ul>' % item.pattern + data = scrapertools.get_match(data, pattern) + # logger.debug("data %s " % data) + pattern = '<li><a href="(?P<url>[^"]+)" title="(?P<title_to_fix>[^"]+)".*?<img src="(?P<img>[^"]+)"[^>]+>' \ + '<h2.*?>\s*(?P<title>.*?)\s*</h2><span>(?P<quality>[^<]*)</span>' + + matches = re.compile(pattern, re.DOTALL).findall(data) + # logger.debug("data %s " % matches) + + for url, title_to_fix, thumb, title, quality in matches: + # fix encoding for title + title = title.replace("�", "ñ") + + # title is the clean way but it doesn't work if it's a long, so we have to use title_to_fix + title_fix = False + if title.endswith(".."): + title = title_to_fix + title_fix = True + + if ".com/series" in url: + if title_fix: + title = scrapertools.find_single_match(title, '([^-]+)') + title = title.replace("Ver online", "", 1).replace("Ver en linea", "", 1). \ + replace("Descarga Serie HD", "", 1).strip() + + show = title + + #TODO quitar calidad del titulo + + if quality: + title = "%s [%s]" % (title, quality) + + itemlist.append(Item(channel=item.channel, action="episodios", title=title, url=url, thumbnail=thumb, + quality=quality, context=["buscar_trailer"], show=show)) + + else: + if title_fix: + title = title.replace("Descargar", "", 1).strip() + if title.endswith("gratis"): + title = title[:-6].strip() + + if quality: + title = "%s [%s]" % (title, quality) + + itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumb, + quality=quality, context=["buscar_trailer"])) + + if next_page: + itemlist.append(Item(channel=item.channel, action="listado", title=">> Página siguiente", url=next_page, + pattern="pagination", thumbnail=get_thumb("next.png"))) + + return itemlist + + +def listado2(item): + logger.info() + itemlist = [] + + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post).data) + data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") + + list_chars = [["ñ", "ñ"]] + + for el in list_chars: + data = re.sub(r"%s" % el[0], el[1], data) + + try: + # logger.debug("data %s " % data) + get, post = scrapertools.find_single_match(data, '<ul class="pagination">.*?<a class="current" href.*?' + '<a\s*href="([^"]+)"(?:\s*onClick=".*?\'([^"]+)\'.*?")') + except: + post = False + + if post: + # logger.debug("post %s" % post) + # logger.debug("item.post %s" % item.post) + if "pg" in item.post: + item.post = re.sub(r"pg=(\d+)", "pg=%s" % post, item.post) + # logger.debug("item.post %s" % item.post) + else: + item.post += "&pg=%s" % post + # logger.debug("item.post %s" % item.post) + + # logger.debug("data %s " % next_page) + + pattern = '<ul class="%s">(.*?)</ul>' % item.pattern + data = scrapertools.get_match(data, pattern) + # logger.debug("data %s " % data) + + pattern = '<li><a href="(?P<url>[^"]+)".*?<img src="(?P<img>[^"]+)"[^>]+>.*?<h2.*?>\s*(?P<title>.*?)\s*</h2>' + + matches = re.compile(pattern, re.DOTALL).findall(data) + + for url, thumb, title in matches: + # fix encoding for title + title = scrapertools.htmlclean(title) + title = title.replace("�", "ñ") + + # logger.debug("\n\nu %s " % url) + # logger.debug("\nb %s " % thumb) + # logger.debug("\nt %s " % title) + + # title is the clean way but it doesn't work if it's a long, so we have to use title_to_fix + # title_fix = False + # if title.endswith(".."): + # title = title_to_fix + # title_fix = True + + # no mostramos lo que no sean videos + if "/juego/" in url or "/varios/" in url: continue - check_item.append([title_check]) - if "�" in title: - title = title.replace("�", "ñ") - title_fan = title - title_fan = re.sub( - r"\(.*?\)|-Remastered|Black And Chrome Edition|V.extendidaHD|1080p|Screener|V.O|HdRip|.*?--|\(\d+\)|\d\d\d\d|HD", - "", title_fan) - itemlist.append(Item(channel=item.channel, - title="[COLOR firebrick][B]" + tipo + "[/B][/COLOR]--" + "[COLOR red][B]" + title + "[/B][/COLOR]", - url=url, action="fanart", thumbnail=thumb, fanart="", contentType=contentType, - extra=title_fan + "|" + "[COLOR red][B]" + title_fan + "[/B][/COLOR]" + "|" + year, - folder=True)) + + if ".com/series" in url: + # title = scrapertools.find_single_match(title, '([^-]+)') + # title = title.replace("Ver online", "", 1).replace("Ver en linea", "", 1). \ + # replace("Descarga Serie HD", "", 1).strip() + + show = title + # if quality: + # title = "%s [%s]" % (title, quality) + + itemlist.append(Item(channel=item.channel, action="episodios", title=title, url=url, thumbnail=thumb, + context=["buscar_trailer"], show=show)) + + else: + # title = title.replace("Descargar", "", 1).strip() + # if title.endswith("gratis"): + # title = title[:-6].strip() + + # if quality: + # title = "%s [%s]" % (title, quality) + + itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumb, + context=["buscar_trailer"])) + + if post: + itemlist.append(item.clone(channel=item.channel, action="listado2", title=">> Página siguiente", + thumbnail=get_thumb("next.png"))) + return itemlist -def scraper(item): +def episodios(item): logger.info() itemlist = [] - # Descarga la página - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - bloque_enlaces = scrapertools.find_single_match(data, '<ul class="pelilist">(.*?)end .page-box') - if item.contentType != "movie": - matches = scrapertools.find_multiple_matches(bloque_enlaces, - '<a href="([^"]+)".*?src="([^"]+)".*?28px;">([^<]+)<\/h2><span>([^<]+)<\/span>') + + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) + data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") + + # logger.debug("data %s " % data) + pattern = '<ul class="%s">(.*?)</ul>' % "pagination" # item.pattern + pagination = scrapertools.find_single_match(data, pattern) + # logger.debug("pagination %s" % pagination) + if pagination: + pattern = 'Next</a></li><li><a href="(.*?)(\d+)">Last</a>' + url, last_page = scrapertools.find_single_match(pagination, pattern) + # logger.debug("data %s " % last_page) + list_pages = [] + for x in range(1, int(last_page) + 1): + list_pages.append("%s%s" % (url, x)) + # logger.debug("data %s%s" % (url, x)) + # logger.debug("list_pages %s" % list_pages) else: - matches = scrapertools.find_multiple_matches(bloque_enlaces, - '<a href="([^"]+)".*?src="([^"]+)".*?Descargar ([^<]+) gratis">.*?<\/h2><span>([^<]+)<\/span>') - for url, thumb, title, quality in matches: - try: - year = scrapertools.find_single_match(title, '(\d\d\d\d)') - except: - year = "" - title = unicode(title, "latin1").encode("utf8") - if "�" in title: - title = title.replace("�", "ñ") - title = re.sub(r'\(\d+\)|\d\d\d\d', '', title) - title_fan = title - title_item = "[COLOR red][B]" + title + "[/B][/COLOR]" - if "HD" in item.title and item.contentType != "movie": - title = "[COLOR red][B]" + title + "[/B][/COLOR]" - else: - title = "[COLOR red][B]" + title + "[/B][/COLOR]" + "[COLOR floralwhite] " + quality + "[/COLOR]" - itemlist.append( - Item(channel=item.channel, title=title, url=url, action="fanart", thumbnail=thumb, fanart=item.fanart, - extra=title_fan + "|" + title_item + "|" + year, contentType=item.contentType, folder=True)) - ## Paginación - next = scrapertools.find_single_match(data, 'href="([^"]+)">Next<\/a>') - if len(next) > 0: - url = next - itemlist.append( - Item(channel=item.channel, action="scraper", title="[COLOR darkred][B]siguiente[/B][/COLOR]", url=url, - thumbnail="http://imgur.com/D4ZgFri.png", fanart=item.fanart, extra=item.extra, - contentType=item.contentType, folder=True)) + list_pages = [item.url] + + for index, page in enumerate(list_pages): + logger.debug("Loading page %s/%s url=%s" % (index, len(list_pages), page)) + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page).data) + data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") + + pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern + data = scrapertools.get_match(data, pattern) + # logger.debug("data %s " % data) + + pattern = '<li[^>]*><a href="(?P<url>[^"]+).*?<img src="(?P<thumb>[^"]+)".*?<h2[^>]+>(?P<info>.*?)</h2>' + matches = re.compile(pattern, re.DOTALL).findall(data) + # logger.debug("data %s " % matches) + + for url, thumb, info in matches: + # logger.debug("info %s" % info) + + if "<span" in info: # new style + pattern = ".*?[^>]+>.*?Temporada\s*(?P<season>\d+)\s*Capitulo(?:s)?\s*(?P<episode>\d+)" \ + "(?:.*?(?P<episode2>\d+)?)<.+?<span[^>]+>(?P<lang>.*?)</span>\s*Calidad\s*<span[^>]+>" \ + "[\[]\s*(?P<quality>.*?)\s*[\]]</span>" + r = re.compile(pattern) + match = [m.groupdict() for m in r.finditer(info)][0] + + if match["episode2"]: + multi = True + title = "%s (%sx%s-%s) [%s][%s]" % (item.show, match["season"], str(match["episode"]).zfill(2), + str(match["episode2"]).zfill(2), match["lang"], + match["quality"]) + else: + multi = False + title = "%s (%sx%s) [%s][%s]" % (item.show, match["season"], str(match["episode"]).zfill(2), + match["lang"], match["quality"]) + + else: # old style + pattern = "\[(?P<quality>.*?)\].*?\[Cap.(?P<season>\d+)(?P<episode>\d{2})(?:_(?P<season2>\d+)" \ + "(?P<episode2>\d{2}))?.*?\].*?(?:\[(?P<lang>.*?)\])?" + + r = re.compile(pattern) + match = [m.groupdict() for m in r.finditer(info)][0] + # logger.debug("data %s" % match) + + str_lang = "" + if match["lang"] is not None: + str_lang = "[%s]" % match["lang"] + + if match["season2"] and match["episode2"]: + multi = True + if match["season"] == match["season2"]: + + title = "%s (%sx%s-%s) %s[%s]" % (item.show, match["season"], match["episode"], + match["episode2"], str_lang, match["quality"]) + else: + title = "%s (%sx%s-%sx%s) %s[%s]" % (item.show, match["season"], match["episode"], + match["season2"], match["episode2"], str_lang, + match["quality"]) + else: + title = "%s (%sx%s) %s[%s]" % (item.show, match["season"], match["episode"], str_lang, + match["quality"]) + multi = False + + itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumb, + quality=item.quality, multi=multi, contentSeason=match["season"], + contentEpisodeNumber=match["episode"])) + + # order list + if len(itemlist) > 1: + return sorted(itemlist, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) return itemlist - -def fanart(item): - logger.info() - itemlist = [] - year = item.extra.split("|")[2] - if item.contentType != "movie": - tipo_ps = "tv" - else: - tipo_ps = "movie" - url = item.url - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - title = item.extra.split("|")[0] - title_o = scrapertools.find_single_match(data, '<meta name="description"[^<]+original(.*?)&') - item.title = item.extra.split("|")[1] - title_imdb = re.sub(r'\[.*?\]', '', item.extra.split("|")[1]) - title = re.sub( - r"\(.*?\)|-Remastered|Black And Chrome Edition|V.extendida|Version Extendida|V.Extendida|HEVC|X\d+|x\d+|LINE|HD|1080p|Screeener|V.O|Hdrip|.*?--|3D|SBS|HOU", - "", title) - - sinopsis = scrapertools.find_single_match(data, 'Sinopsis<br \/>(.*?)<\/div>') - if sinopsis == "": - try: - sinopsis = scrapertools.find_single_match(data, 'sinopsis\'>(.*?)<\/div>') - except: - sinopsis = "" - if "Miniserie" in sinopsis: - tipo_ps = "tv" - year = scrapertools.find_single_match(sinopsis, 'de TV \((\d+)\)') - if year == "": - if item.contentType != "movie": - try: - year = scrapertools.find_single_match(data, '<strong>Estreno:<\/strong>(\d+)<\/span>') - except: - year = "" - else: - year = scrapertools.find_single_match(data, '<br \/>A.*?(\d+)<br \/>') - if year == "": - year = scrapertools.find_single_match(data, 'Estreno.*?\d+/\d+/(\d+)') - if year == "": - year = scrapertools.find_single_match(data, - '<div class=\'descripcion_top\'>.*?Año<br />.*?(\d\d\d\d)') - if year == "": - year = scrapertools.find_single_match(data, - '<meta name="description"[^<]+Año[^<]+\d\d\d\d') - if year == "": - year = scrapertools.find_single_match(data, '<h1><strong>.*?(\d\d\d\d).*?<') - if year == "": - year = " " - - infoLabels = {'title': title, 'sinopsis': sinopsis, 'year': year} - critica, rating_filma, year_f, sinopsis_f = filmaffinity(item, infoLabels) - if sinopsis == "": - sinopsis = sinopsis_f - if year == "": - year = year_f - otmdb = tmdb.Tmdb(texto_buscado=title, year=year, tipo=tipo_ps) - id = otmdb.result.get("id") - posterdb = otmdb.result.get("poster_path") - if posterdb == None: - otmdb = tmdb.Tmdb(texto_buscado=title, tipo=tipo_ps) - id = otmdb.result.get("id") - posterdb = otmdb.result.get("poster_path") - if posterdb == None: - if item.contentType != "movie": - urlbing_imdb = "http://www.bing.com/search?q=%s+%s+tv+series+site:imdb.com" % ( - title_imdb.replace(' ', '+'), year) - data = browser(urlbing_imdb) - data = re.sub(r"\n|\r|\t|\s{2}| |http://ssl-proxy.my-addr.org/myaddrproxy.php/", "", data) - subdata_imdb = scrapertools.find_single_match(data, - '<li class="b_algo">(.*?)h="ID.*?<strong>.*?TV Series') - else: - urlbing_imdb = "http://www.bing.com/search?q=%s+%s+site:imdb.com" % (title_imdb.replace(' ', '+'), year) - data = browser(urlbing_imdb) - data = re.sub(r"\n|\r|\t|\s{2}| |http://ssl-proxy.my-addr.org/myaddrproxy.php/", "", data) - subdata_imdb = scrapertools.find_single_match(data, '<li class="b_algo">(.*?)h="ID.*?<strong>') - try: - imdb_id = scrapertools.get_match(subdata_imdb, '<a href=.*?http.*?imdb.com/title/(.*?)/.*?"') - except: - try: - imdb_id = scrapertools.get_match(subdata_imdb, '<a href=.*?http.*?imdb.com/.*?/title/(.*?)/.*?"') - except: - imdb_id = "" - otmdb = tmdb.Tmdb(external_id=imdb_id, external_source="imdb_id", tipo=tipo_ps, idioma_busqueda="es") - id = otmdb.result.get("id") - posterdb = otmdb.result.get("poster_path") - if not posterdb: - if "(" in title_imdb: - title = scrapertools.find_single_match(title_imdb, '\(.*?\)') - if item.contentType != "movie": - urlbing_imdb = "http://www.bing.com/search?q=%s+%s+tv+series+site:imdb.com" % ( - title_imdb.replace(' ', '+'), year) - data = browser(urlbing_imdb) - data = re.sub(r"\n|\r|\t|\s{2}| |http://ssl-proxy.my-addr.org/myaddrproxy.php/", "", data) - subdata_imdb = scrapertools.find_single_match(data, - '<li class="b_algo">(.*?)h="ID.*?<strong>.*?TV Series') - else: - urlbing_imdb = "http://www.bing.com/search?q=%s+%s+site:imdb.com" % ( - title_imdb.replace(' ', '+'), year) - data = browser(urlbing_imdb) - data = re.sub(r"\n|\r|\t|\s{2}| |http://ssl-proxy.my-addr.org/myaddrproxy.php/", "", data) - subdata_imdb = scrapertools.find_single_match(data, '<li class="b_algo">(.*?)h="ID.*?<strong>') - try: - imdb_id = scrapertools.get_match(subdata_imdb, '<a href=.*?http.*?imdb.com/title/(.*?)/.*?"') - except: - try: - imdb_id = scrapertools.get_match(subdata_imdb, - '<a href=.*?http.*?imdb.com/.*?/title/(.*?)/.*?"') - except: - imdb_id = "" - otmdb = tmdb.Tmdb(external_id=imdb_id, external_source="imdb_id", tipo=tipo_ps, - idioma_busqueda="es") - id = otmdb.result.get("id") - posterdb = otmdb.result.get("poster_path") - if not posterdb: - id = tiw = rating = tagline = id_tvdb = "" - fanart_4 = fanart_2 = fanart_3 = item.fanart - rating = "Sin Puntuación" - posterdb = tvf = item.thumbnail - fanart_info = item.fanart - thumbnail_art = item.thumbnail - extra = str(fanart_2) + "|" + str(fanart_3) + "|" + str(fanart_4) + "|" + str(id) + "|" + str( - tvf) + "|" + str(id_tvdb) + "|" + str(tiw) + "|" + str(rating) - itemlist.append(Item(channel=item.channel, title=item.title, url=item.url, action="findvideos", - thumbnail=item.thumbnail, fanart=item.fanart, extra=extra, folder=True)) - else: - if tipo_ps != "movie": - action = "findvideos" - else: - action = "findvideos_enlaces" - id = tiw = rating = tagline = id_tvdb = "" - fanart_4 = fanart_2 = fanart_3 = item.fanart - rating = "Sin Puntuación" - posterdb = tvf = item.thumbnail - fanart_info = item.fanart - thumbnail_art = item.thumbnail - extra = str(fanart_2) + "|" + str(fanart_3) + "|" + str(fanart_4) + "|" + str(id) + "|" + str( - tvf) + "|" + str(id_tvdb) + "|" + str(tiw) + "|" + str(rating) - itemlist.append(Item(channel=item.channel, title=item.title, url=item.url, action=action, - thumbnail=item.thumbnail, fanart=item.fanart, extra=extra, - contentType=item.contentType, folder=True)) - if posterdb != item.thumbnail: - if not "null" in posterdb: - posterdb = "https://image.tmdb.org/t/p/original" + posterdb - else: - posterdb = item.thumbnail - - if otmdb.result.get("backdrop_path"): - fanart = "https://image.tmdb.org/t/p/original" + otmdb.result.get("backdrop_path") - else: - fanart = item.fanart - if sinopsis == "": - if otmdb.result.get("'overview'"): - sinopsis = otmdb.result.get("'overview'") - else: - sinopsis = "" - if otmdb.result.get("vote_average"): - rating = otmdb.result.get("vote_average") - else: - rating = "Sin puntuacíon" - imagenes = [] - itmdb = tmdb.Tmdb(id_Tmdb=id, tipo=tipo_ps) - images = itmdb.result.get("images") - for key, value in images.iteritems(): - for detail in value: - imagenes.append('https://image.tmdb.org/t/p/original' + detail["file_path"]) - if item.contentType != "movie": - if itmdb.result.get("number_of_seasons"): - season_number = itmdb.result.get("number_of_seasons") - else: - season_episode = "" - if itmdb.result.get("number_of_episodes"): - season_episode = itmdb.result.get("number_of_episodes") - else: - season_episode = "" - if itmdb.result.get("status"): - status = itmdb.result.get("status") - else: - status = "" - if status == "Ended": - status = "Finalizada" - else: - status = "En emisión" - tagline = str(status) + " (Temporadas:" + str(season_number) + ",Episodios:" + str(season_episode) + ")" - if itmdb.result.get("external_ids").get("tvdb_id"): - id_tvdb = itmdb.result.get("external_ids").get("tvdb_id") - else: - id_tvdb = "" - else: - id_tvdb = "" - if itmdb.result.get("tagline"): - tagline = itmdb.result.get("tagline") - else: - tagline = "" - if len(imagenes) >= 5: - fanart_info = imagenes[1] - fanart_2 = imagenes[2] - fanart_3 = imagenes[3] - fanart_4 = imagenes[4] - if fanart == item.fanart: - fanart = fanart_info - elif len(imagenes) == 4: - fanart_info = imagenes[1] - fanart_2 = imagenes[2] - fanart_3 = imagenes[3] - fanart_4 = imagenes[1] - if fanart == item.fanart: - fanart = fanart_info - elif len(imagenes) == 3: - fanart_info = imagenes[1] - fanart_2 = imagenes[2] - fanart_3 = imagenes[1] - fanart_4 = imagenes[0] - if fanart == item.fanart: - fanart = fanart_info - elif len(imagenes) == 2: - fanart_info = imagenes[1] - fanart_2 = imagenes[0] - fanart_3 = imagenes[1] - fanart_4 = imagenes[1] - if fanart == item.fanart: - fanart = fanart_info - else: - fanart_info = fanart - fanart_2 = fanart - fanart_3 = fanart - fanart_4 = fanart - images_fanarttv = fanartv(item, id_tvdb, id) - if item.contentType != "movie": - action = "findvideos" - if images_fanarttv: - try: - thumbnail_art = images_fanarttv.get("hdtvlogo")[0].get("url") - except: - try: - thumbnail_art = images_fanarttv.get("clearlogo")[0].get("url") - except: - thumbnail_art = posterdb - if images_fanarttv.get("tvbanner"): - tvf = images_fanarttv.get("tvbanner")[0].get("url") - elif images_fanarttv.get("tvthumb"): - tvf = images_fanarttv.get("tvthumb")[0].get("url") - elif images_fanarttv.get("tvposter"): - tvf = images_fanarttv.get("tvposter")[0].get("url") - else: - tvf = posterdb - if images_fanarttv.get("tvthumb"): - thumb_info = images_fanarttv.get("tvthumb")[0].get("url") - else: - thumb_info = thumbnail_art - - if images_fanarttv.get("hdclearart"): - tiw = images_fanarttv.get("hdclearart")[0].get("url") - elif images_fanarttv.get("characterart"): - tiw = images_fanarttv.get("characterart")[0].get("url") - elif images_fanarttv.get("hdtvlogo"): - tiw = images_fanarttv.get("hdtvlogo")[0].get("url") - else: - tiw = "" - else: - tiw = "" - tvf = thumbnail_info = thumbnail_art = posterdb - else: - action = "findvideos_enlaces" - if images_fanarttv: - if images_fanarttv.get("hdmovielogo"): - thumbnail_art = images_fanarttv.get("hdmovielogo")[0].get("url") - elif images_fanarttv.get("moviethumb"): - thumbnail_art = images_fanarttv.get("moviethumb")[0].get("url") - elif images_fanarttv.get("moviebanner"): - thumbnail_art = images_fanarttv.get("moviebanner")[0].get("url") - else: - thumbnail_art = posterdb - if images_fanarttv.get("moviedisc"): - tvf = images_fanarttv.get("moviedisc")[0].get("url") - elif images_fanarttv.get("hdmovielogo"): - tvf = images_fanarttv.get("hdmovielogo")[0].get("url") - else: - tvf = posterdb - if images_fanarttv.get("hdmovieclearart"): - tiw = images_fanarttv.get("hdmovieclearart")[0].get("url") - elif images_fanarttv.get("hdmovielogo"): - tiw = images_fanarttv.get("hdmovielogo")[0].get("url") - else: - tiw = "" - else: - tiw = "" - tvf = thumbnail_art = posterdb - extra = str(fanart_2) + "|" + str(fanart_3) + "|" + str(fanart_4) + "|" + str(id) + "|" + str(tvf) + "|" + str( - id_tvdb) + "|" + str(tiw) + "|" + str(rating) + "|" + tipo_ps - itemlist.append( - Item(channel=item.channel, title=item.title, url=item.url, action=action, thumbnail=thumbnail_art, - fanart=fanart, extra=extra, contentType=item.contentType, folder=True)) - title_info = "[COLOR indianred][B]Info[/B][/COLOR]" - extra = str(rating) + "|" + str(rating_filma) + "|" + str(id) + "|" + str(item.title) + "|" + str( - id_tvdb) + "|" + str(tagline) + "|" + str(sinopsis) + "|" + str(critica) + "|" + str(thumbnail_art) + "|" + str( - fanart_4) - itemlist.append(Item(channel=item.channel, action="info", title=title_info, url=item.url, thumbnail=posterdb, - fanart=fanart_info, extra=extra, contentType=item.contentType, folder=False)) - return itemlist - - def findvideos(item): logger.info() itemlist = [] - fanart = "" + + # Descarga la pagina data = httptools.downloadpage(item.url).data - if item.contentType != "movie": - itmdb = tmdb.Tmdb(id_Tmdb=item.extra.split("|")[3], tipo=item.extra.split("|")[8]) - season = itmdb.result.get("seasons") - check = "no" - bloque_enlaces = scrapertools.find_single_match(data, - '<ul class="buscar-list">(.*?)<\/ul><!-- end \.buscar-list -->') - if check == "no": - check_temp = scrapertools.find_single_match(bloque_enlaces, 'Temporada (\d+)') - if check_temp == "": - check_temp = 1 - if len(check_temp) == 1: - try: - check_temp = scrapertools.find_single_match(bloque_enlaces, 'Temporada (\d+) Capitulos') - check_temp = None - except: - pass - thumbnail = "" - if season: - for detail in season: - if str(detail["season_number"]) == check_temp: - if detail["poster_path"]: - thumbnail = "https://image.tmdb.org/t/p/original" + detail["poster_path"] - images_fanarttv = fanartv(item, item.extra.split("|")[5], item.extra.split("|")[3]) - if images_fanarttv: - season_f = images_fanarttv.get("showbackground") - if season_f: - for detail in season_f: - if str(detail["season"]) == check_temp: - if detail["url"]: - fanart = detail["url"] - if fanart == "": - fanart = item.extra.split("|")[0] - if thumbnail == "": - thumbnail = item.thumbnail - if check_temp: - itemlist.append( - Item(channel=item.channel, title="[COLOR red][B]Temporada " + check_temp + "[/B][/COLOR]", url="", - action="", thumbnail=thumbnail, fanart=fanart, folder=False)) - temp_bloque = scrapertools.find_multiple_matches(bloque_enlaces, - 'href="([^"]+).*?" title=".*?Temporada (\d+) Capitulo (\d+).*?Serie <strong style="color:red;background:none;">(.*?)<\/strong>.*?Calidad <span style="color:red;background:none;">(\[.*?\])<\/span>.*?<span>.*?<span>(.*?)<\/span>.*?Descargar') - if temp_bloque != "": - for url, temp, capi, check_capi, calidad, peso in temp_bloque: - if "Capitulos" in check_capi: - extra = item.extra + "|" + check_capi + "|" + temp - title = scrapertools.find_single_match(check_capi, '-.*?(Capitulos.*)') - title = " [COLOR red][B]" + title + "[/B][/COLOR]" - else: - extra = item.extra + "|" + "Nocapi" + "|" + temp + "|" + capi - title = " [COLOR red][B]Capítulo " + capi + "[/B][/COLOR]" - if temp != check_temp: - check_temp = temp - check = "yes" - for detail in season: - if detail["season_number"]: - if str(detail["season_number"]) == temp: - if detail["poster_path"]: - thumbnail = "https://image.tmdb.org/t/p/original" + detail["poster_path"] - else: - thumbnail = "" - else: - thumbail = "" - if images_fanarttv: - season_f = images_fanarttv.get("showbackground") - if season_f: - for detail in season_f: - if str(detail["season"]) == check_temp: - if detail["season"]: - fanart = detail["url"] - if fanart == "": - fanart = item.extra.split("|")[0] - if thumbnail == "": - thumbnail = item.thumbnail - itemlist.append( - Item(channel=item.channel, title="[COLOR red][B]Temporada " + temp + "[/B][/COLOR]", url="", - action="", thumbnail=thumbnail, fanart=fanart, folder=False)) + item.plot = scrapertools.find_single_match(data, '<div class="post-entry" style="height:300px;">(.*?)</div>') + item.plot = scrapertools.htmlclean(item.plot).strip() + item.contentPlot = item.plot - itemlist.append( - Item(channel=item.channel, title=title, url=url, action="findvideos_enlaces", thumbnail=thumbnail, - fanart=item.extra.split("|")[0], extra=extra, contentType=item.contentType, folder=True)) - else: - temp_bloque = scrapertools.find_multiple_matches(bloque_enlaces, - 'href="([^"]+).*?Temporada (\d+) Capitulo (\d+).*?Calidad.*?\[(.*?)\]<\/span>.*?<span>.*?<span>(.*?)<\/span>') - for url, capi, calidad, peso in temp_bloque: - itemlist.append( - Item(channel=item.channel, title=" [COLOR red][B]Capítulo " + capi + "[/B][/COLOR]", - url="", action="findvideos_enlaces", thumbnail=item.extra.split("|")[4], - fanart=item.extra.split("|")[0], folder=True)) + link = scrapertools.find_single_match(data, 'href.*?=.*?"http:\/\/(?:tumejorserie|tumejorjuego).*?link=([^"]+)"') + if link != "": + link = host + link + logger.info("torrent=" + link) + itemlist.append( + Item(channel=item.channel, action="play", server="torrent", title="Vídeo en torrent", fulltitle=item.title, + url=link, thumbnail=servertools.guess_server_thumbnail("torrent"), plot=item.plot, folder=False, + parentContent=item)) - ## Paginación - next = scrapertools.find_single_match(data, 'href="([^"]+)">Next<\/a>') - if len(next) > 0: - url = next + patron = '<div class=\"box1\"[^<]+<img[^<]+<\/div[^<]+<div class="box2">([^<]+)<\/div[^<]+<div class="box3">([^<]+)' + patron += '<\/div[^<]+<div class="box4">([^<]+)<\/div[^<]+<div class="box5"><a href=(.*?) rel.*?' + patron += '<\/div[^<]+<div class="box6">([^<]+)<' + + #patron = "<div class=\"box1\"[^<]+<img[^<]+</div[^<]+" + #patron += '<div class="box2">([^<]+)</div[^<]+' + #patron += '<div class="box3">([^<]+)</div[^<]+' + #patron += '<div class="box4">([^<]+)</div[^<]+' + #patron += '<div class="box5">(.*?)</div[^<]+' + #patron += '<div class="box6">([^<]+)<' + matches = re.compile(patron, re.DOTALL).findall(data) + scrapertools.printMatches(matches) + + itemlist_ver = [] + itemlist_descargar = [] + + for servername, idioma, calidad, scrapedurl, comentarios in matches: + title = "Mirror en " + servername + " (" + calidad + ")" + " (" + idioma + ")" + servername = servername.replace("uploaded", "uploadedto").replace("1fichier", "onefichier") + if comentarios.strip() != "": + title = title + " (" + comentarios.strip() + ")" + url = urlparse.urljoin(item.url, scrapedurl) + mostrar_server = servertools.is_server_enabled(servername) + if mostrar_server: + thumbnail = servertools.guess_server_thumbnail(title) + plot = "" + logger.debug("title=[" + title + "], url=[" + url + "], thumbnail=[" + thumbnail + "]") + action = "play" + if "partes" in title: + action = "extract_url" + new_item = Item(channel=item.channel, action=action, title=title, fulltitle=title, url=url, + thumbnail=thumbnail, plot=plot, parentContent=item, server = servername) + if comentarios.startswith("Ver en"): + itemlist_ver.append(new_item) + else: + itemlist_descargar.append(new_item) + + for new_item in itemlist_ver: + itemlist.append(new_item) + + for new_item in itemlist_descargar: + itemlist.append(new_item) - itemlist.append( - Item(channel=item.channel, action="findvideos", title="[COLOR darkred][B]siguiente[/B][/COLOR]", - url=url, thumbnail="http://imgur.com/D4ZgFri.png", fanart=item.fanart, extra=item.extra, - contentType=item.contentType, folder=True)) return itemlist -def findvideos_enlaces(item): +def extract_url(item): logger.info() - itemlist = [] - check_epi2 = "" - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data, 'window.location.href = "([^"]+)"').strip() + itemlist = servertools.find_video_items(data=item.url) - try: + for videoitem in itemlist: + videoitem.title = "Enlace encontrado en " + videoitem.server + " (" + scrapertools.get_filename_from_url( + videoitem.url) + ")" + videoitem.fulltitle = item.fulltitle + videoitem.thumbnail = item.thumbnail + videoitem.channel = item.channel - if not url.endswith(".torrent"): - url = httptools.downloadpage(url, follow_redirects=False) - url = url.headers.get("location") - - if not url.endswith(".torrent"): - url = httptools.downloadpage(url, follow_redirects=False) - url = url.headers.get("location") - else: - url = httptools.downloadpage(url, follow_redirects=False) - url = url.headers.get("location") - torrents_path = config.get_videolibrary_path() + '/torrents' - - if not os.path.exists(torrents_path): - os.mkdir(torrents_path) - try: - urllib.URLopener.version = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0' - urllib.urlretrieve(url, torrents_path + "/temp.torrent") - pepe = open(torrents_path + "/temp.torrent", "rb").read() - except: - pepe = "" - if "used CloudFlare" in pepe: - try: - urllib.urlretrieve("http://anonymouse.org/cgi-bin/anon-www.cgi/" + url.strip(), - torrents_path + "/temp.torrent") - pepe = open(torrents_path + "/temp.torrent", "rb").read() - except: - pepe = "" - torrent = decode(pepe) - - try: - name = torrent["info"]["name"] - sizet = torrent["info"]['length'] - sizet = convert_size(sizet) - except: - name = "no disponible" - try: - check_video = scrapertools.find_multiple_matches(str(torrent["info"]["files"]), "'length': (\d+)}") - - size = max([int(i) for i in check_video]) - - for file in torrent["info"]["files"]: - manolo = "%r - %d bytes" % ("/".join(file["path"]), file["length"]) - if str(size) in manolo: - video = manolo - size = convert_size(size) - ext_v = re.sub(r"-.*? bytes|.*?\[.*?\].|'|.*?COM.|.*?\[.*?\]|\(.*?\)|.*?\.", "", video) - try: - os.remove(torrents_path + "/temp.torrent") - except: - pass - except: - size = sizet - ext_v = re.sub(r"-.*? bytes|.*?\[.*?\].|'|.*?COM.|.*?\.es.|.*?\[.*?\]|.*?\(.*?\)\.|.*?\.", "", name) - try: - os.remove(torrents_path + "/temp.torrent") - except: - pass - except: - size = "en estos momentos..." - ext_v = "no disponible" - if "rar" in ext_v: - ext_v = ext_v + " -- No reproducible" - if item.contentType != "movie": - fanart = item.extra.split("|")[1] - else: - fanart = item.extra.split("|")[0] - itemlist.append(Item(channel=item.channel, - title="[COLOR orangered][B]Torrent[/B][/COLOR] " + "[COLOR lemonchiffon]( Video [/COLOR]" + "[COLOR lemonchiffon]" + ext_v + "--" + size + " )[/COLOR]", - url=url, action="play", server="torrent", thumbnail=item.extra.split("|")[4], fanart=fanart, - folder=False)) - - if item.contentType != "movie": - if "Capitulos" in item.extra.split("|")[9]: - epis = scrapertools.find_multiple_matches(item.extra.split("|")[9], 'Capitulos (\d+) al (\d+)') - for epi1, epi2 in epis: - len_epis = int(epi2) - int(epi1) - if len_epis == 1: - extra = item.extra + "|" + epi1 - check_epi2 = "ok" - title_info = " Info Cap." + epi1 - title_info = "[COLOR indianred]" + title_info + "[/COLOR]" - itemlist.append(Item(channel=item.channel, action="info_capitulos", title=title_info, url=item.url, - thumbnail=item.extra.split("|")[6], fanart=item.extra.split("|")[1], - extra=extra, folder=False)) - else: - check_epi2 = "" - epis_len = range(int(epi1), int(epi2) + 1) - extra = item.extra + "|" + str(epis_len) - title_info = " Info Capítulos" - title_info = "[COLOR indianred]" + title_info + "[/COLOR]" - itemlist.append(Item(channel=item.channel, action="capitulos", title=title_info, url=item.url, - thumbnail=item.extra.split("|")[6], fanart=item.extra.split("|")[1], - extra=extra, folder=True)) - else: - title_info = " Info" - title_info = "[COLOR indianred]" + title_info + "[/COLOR]" - itemlist.append(Item(channel=item.channel, action="info_capitulos", title=title_info, url=item.url, - thumbnail=item.extra.split("|")[6], fanart=item.extra.split("|")[1], extra=item.extra, - folder=False)) - if check_epi2 == "ok": - extra = item.extra + "|" + epi2 - title_info = " Info Cap." + epi2 - title_info = "[COLOR indianred]" + title_info + "[/COLOR]" - itemlist.append(Item(channel=item.channel, action="info_capitulos", title=title_info, url=item.url, - thumbnail=item.extra.split("|")[6], fanart=item.extra.split("|")[1], extra=extra, - folder=False)) - dd = scrapertools.find_single_match(data, 'DESCARGAS DIRECTA(.*?)VER ONLINE') - if dd: - extra = item.extra + "|" + dd - itemlist.append(Item(channel=item.channel, title="[COLOR floralwhite][B]Descarga directa y online[/B][/COLOR]", - url=item.url, action="dd_y_o", thumbnail="http://imgur.com/as7Ie6p.png", - fanart=item.extra.split("|")[1], contentType=item.contentType, extra=extra, folder=True)) return itemlist -def dd_y_o(item): +def play(item): logger.info() - itemlist = [] - if item.contentType == "movie": - data = item.extra.split("|")[9] + + if item.server != "torrent": + itemlist = servertools.find_video_items(data=item.url) + + for videoitem in itemlist: + videoitem.title = "Enlace encontrado en " + videoitem.server + " (" + scrapertools.get_filename_from_url( + videoitem.url) + ")" + videoitem.fulltitle = item.fulltitle + videoitem.thumbnail = item.thumbnail + videoitem.channel = item.channel else: - data = item.extra.split("|")[12] - enlaces = scrapertools.find_multiple_matches(data, - "class=\"box1\"><img src='([^']+)'.*?<div class=\"box2\">([^<]+)<\/div>.*?>([^<]+)<\/div>.*?>([^<]+)<\/div>.*?><a href='([^']+)'.*?Des") - for thumb, server_name, idioma, calidad, url_d in enlaces: - videolist = servertools.find_video_items(data=url_d) - for video in videolist: - itemlist.append(Item(channel=item.channel, url=video.url, server=video.server, - title="[COLOR floralwhite][B]" + server_name + "[/B][/COLOR]", thumbnail=thumb, - fanart=item.extra.split("|")[2], action="play", folder=False)) + itemlist = [item] + return itemlist - - -def capitulos(item): - logger.info() - itemlist = [] - url = item.url - Join_extras = "|".join(item.extra.split("|")[0:11]) - capis = item.extra.split("|")[11] - capis = re.sub(r'\[|\]', '', capis) - capis = [int(k) for k in capis.split(',')] - for i in capis: - extra = Join_extras + "|" + str(i) - itemlist.append(Item(channel=item.channel, action="info_capitulos", - title="[COLOR indianred]Info Cap." + str(i) + "[/COLOR]", url=item.url, - thumbnail=item.thumbnail, fanart=item.fanart, extra=extra, folder=False)) - return itemlist - - -def info(item): - logger.info() - itemlist = [] - url = item.url - rating_tmdba_tvdb = item.extra.split("|")[0] - if item.extra.split("|")[6] == "": - rating_tmdba_tvdb = "Sin puntuación" - rating_filma = item.extra.split("|")[1] - filma = "http://s6.postimg.org/6yhe5fgy9/filma.png" - title = item.extra.split("|")[3] - title = title.replace("%20", " ") - try: - if "." in rating_tmdba_tvdb: - check_rat_tmdba = scrapertools.get_match(rating_tmdba_tvdb, '(\d+).') - else: - check_rat_tmdba = rating_tmdba_tvdb - if int(check_rat_tmdba) >= 5 and int(check_rat_tmdba) < 8: - rating = "[COLOR springgreen][B]" + rating_tmdba_tvdb + "[/B][/COLOR]" - elif int(check_rat_tmdba) >= 8 or rating_tmdba_tvdb == 10: - rating = "[COLOR yellow][B]" + rating_tmdba_tvdb + "[/B][/COLOR]" - else: - rating = "[COLOR crimson][B]" + rating_tmdba_tvdb + "[/B][/COLOR]" - print "lolaymaue" - except: - rating = "[COLOR crimson][B]" + rating_tmdba_tvdb + "[/B][/COLOR]" - if "10." in rating: - rating = re.sub(r'10\.\d+', '10', rating) - try: - check_rat_filma = scrapertools.get_match(rating_filma, '(\d)') - print "paco" - print check_rat_filma - if int(check_rat_filma) >= 5 and int(check_rat_filma) < 8: - print "dios" - print check_rat_filma - rating_filma = "[COLOR springgreen][B]" + rating_filma + "[/B][/COLOR]" - elif int(check_rat_filma) >= 8: - - print check_rat_filma - rating_filma = "[COLOR yellow][B]" + rating_filma + "[/B][/COLOR]" - else: - rating_filma = "[COLOR crimson][B]" + rating_filma + "[/B][/COLOR]" - print "rojo??" - print check_rat_filma - except: - rating_filma = "[COLOR crimson][B]" + rating_filma + "[/B][/COLOR]" - plot = item.extra.split("|")[6] - plot = "[COLOR moccasin][B]" + plot + "[/B][/COLOR]" - plot = re.sub(r"\\|<br />", "", plot) - if item.extra.split("|")[5] != "": - tagline = item.extra.split("|")[5] - if tagline == "\"\"": - tagline = " " - tagline = "[COLOR aquamarine][B]" + tagline + "[/B][/COLOR]" - else: - tagline = "" - if item.contentType != "movie": - icon = "http://s6.postimg.org/hzcjag975/tvdb.png" - else: - icon = "http://imgur.com/SenkyxF.png" - - foto = item.extra.split("|")[9] - if not "tmdb" in foto: - foto = "" - if item.extra.split("|")[7] != "": - critica = item.extra.split("|")[7] - else: - critica = "Esta serie no tiene críticas..." - - photo = item.extra.split("|")[8].replace(" ", "%20") - if ".jpg" in photo: - photo = "" - # Tambien te puede interesar - peliculas = [] - if item.contentType != "movie": - url_tpi = "http://api.themoviedb.org/3/tv/" + item.extra.split("|")[ - 2] + "/recommendations?api_key=" + api_key + "&language=es" - data_tpi = httptools.downloadpage(url_tpi).data - tpi = scrapertools.find_multiple_matches(data_tpi, - 'id":(.*?),.*?"original_name":"(.*?)",.*?"poster_path":(.*?),"popularity"') - else: - url_tpi = "http://api.themoviedb.org/3/movie/" + item.extra.split("|")[ - 2] + "/recommendations?api_key=" + api_key + "&language=es" - data_tpi = httptools.downloadpage(url_tpi).data - tpi = scrapertools.find_multiple_matches(data_tpi, - 'id":(.*?),.*?"original_title":"(.*?)",.*?"poster_path":(.*?),"popularity"') - - for idp, peli, thumb in tpi: - - thumb = re.sub(r'"|}', '', thumb) - if "null" in thumb: - thumb = "http://s6.postimg.org/tw1vhymj5/noposter.png" - else: - thumb = "https://image.tmdb.org/t/p/original" + thumb - peliculas.append([idp, peli, thumb]) - - extra = "" + "|" + item.extra.split("|")[2] + "|" + item.extra.split("|")[2] + "|" + item.extra.split("|")[ - 6] + "|" + "" - infoLabels = {'title': title, 'plot': plot, 'thumbnail': photo, 'fanart': foto, 'tagline': tagline, - 'rating': rating} - item_info = item.clone(info=infoLabels, icon=icon, extra=extra, rating=rating, rating_filma=rating_filma, - critica=critica, contentType=item.contentType, thumb_busqueda="http://imgur.com/j0A9lnu.png") - from channels import infoplus - infoplus.start(item_info, peliculas) - - -def info_capitulos(item, images={}): - logger.info() - url = "https://api.themoviedb.org/3/tv/" + item.extra.split("|")[3] + "/season/" + item.extra.split("|")[ - 10] + "/episode/" + item.extra.split("|")[11] + "?api_key=" + api_key + "&language=es" - if "/0" in url: - url = url.replace("/0", "/") - from core import jsontools - data = jsontools.load(scrapertools.downloadpage(url)) - foto = item.extra.split("|")[6] - if not ".png" in foto: - foto = "http://imgur.com/j0A9lnu.png" - if data: - if data.get("name"): - title = data.get("name") - else: - title = "" - title = "[COLOR red][B]" + title + "[/B][/COLOR]" - if data.get("still_path"): - image = "https://image.tmdb.org/t/p/original" + data.get("still_path") - else: - image = "http://imgur.com/ZiEAVOD.png" - if data.get("overview"): - plot = data.get("overview") - else: - plot = "Sin informacion del capítulo aún..." - plot = "[COLOR floralwhite][B]" + plot + "[/B][/COLOR]" - if data.get("vote_average"): - rating = data.get("vote_average") - else: - rating = 0 - try: - - if rating >= 5 and rating < 8: - rating = "[COLOR yellow]Puntuación[/COLOR] " + "[COLOR springgreen][B]" + str(rating) + "[/B][/COLOR]" - elif rating >= 8 and rating < 10: - rating = "[COLOR yellow]Puntuación[/COLOR] " + "[COLOR yellow][B]" + str(rating) + "[/B][/COLOR]" - elif rating == 10: - rating = "[COLOR yellow]Puntuación[/COLOR] " + "[COLOR orangered][B]" + str(rating) + "[/B][/COLOR]" - else: - rating = "[COLOR yellow]Puntuación[/COLOR] " + "[COLOR crimson][B]" + str(rating) + "[/B][/COLOR]" - except: - rating = "[COLOR yellow]Puntuación[/COLOR] " + "[COLOR crimson][B]" + str(rating) + "[/B][/COLOR]" - if "10." in rating: - rating = re.sub(r'10\.\d+', '10', rating) - - - else: - - title = "[COLOR red][B]LO SENTIMOS...[/B][/COLOR]" - plot = "Este capitulo no tiene informacion..." - plot = "[COLOR yellow][B]" + plot + "[/B][/COLOR]" - image = "http://s6.postimg.org/ub7pb76c1/noinfo.png" - foto = "http://s6.postimg.org/nm3gk1xox/noinfosup2.png" - rating = "" - - ventana = TextBox2(title=title, plot=plot, thumbnail=image, fanart=foto, rating=rating) - ventana.doModal() - - -class TextBox2(xbmcgui.WindowDialog): - """ Create a skinned textbox window """ - - def __init__(self, *args, **kwargs): - self.getTitle = kwargs.get('title') - self.getPlot = kwargs.get('plot') - self.getThumbnail = kwargs.get('thumbnail') - self.getFanart = kwargs.get('fanart') - self.getRating = kwargs.get('rating') - - self.background = xbmcgui.ControlImage(70, 20, 1150, 630, 'http://imgur.com/sDp4M2R.jpg') - self.title = xbmcgui.ControlTextBox(120, 60, 430, 50) - self.rating = xbmcgui.ControlTextBox(145, 112, 1030, 45) - self.plot = xbmcgui.ControlTextBox(120, 150, 1056, 100) - self.thumbnail = xbmcgui.ControlImage(120, 300, 1056, 300, self.getThumbnail) - self.fanart = xbmcgui.ControlImage(780, 43, 390, 100, self.getFanart) - - self.addControl(self.background) - self.background.setAnimations( - [('conditional', 'effect=slide start=1000% end=0% time=1500 condition=true tween=bounce',), - ('WindowClose', 'effect=slide delay=800 start=0% end=1000% time=800 condition=true',)]) - self.addControl(self.thumbnail) - self.thumbnail.setAnimations([('conditional', - 'effect=zoom start=0% end=100% delay=2700 time=1500 condition=true tween=elastic easing=inout',), - ('WindowClose', 'effect=slide end=0,700% time=300 condition=true',)]) - self.addControl(self.plot) - self.plot.setAnimations( - [('conditional', 'effect=zoom delay=2000 center=auto start=0 end=100 time=800 condition=true ',), ( - 'conditional', - 'effect=rotate delay=2000 center=auto aceleration=6000 start=0% end=360% time=800 condition=true',), - ('WindowClose', 'effect=zoom center=auto start=100% end=-0% time=600 condition=true',)]) - self.addControl(self.fanart) - self.fanart.setAnimations( - [('WindowOpen', 'effect=slide start=0,-700 delay=1000 time=2500 tween=bounce condition=true',), ( - 'conditional', - 'effect=rotate center=auto start=0% end=360% delay=3000 time=2500 tween=bounce condition=true',), - ('WindowClose', 'effect=slide end=0,-700% time=1000 condition=true',)]) - self.addControl(self.title) - self.title.setText(self.getTitle) - self.title.setAnimations( - [('conditional', 'effect=slide start=-1500% end=0% delay=1000 time=2000 condition=true tween=elastic',), - ('WindowClose', 'effect=slide start=0% end=-1500% time=800 condition=true',)]) - self.addControl(self.rating) - self.rating.setText(self.getRating) - self.rating.setAnimations( - [('conditional', 'effect=fade start=0% end=100% delay=3000 time=1500 condition=true',), - ('WindowClose', 'effect=slide end=0,-700% time=600 condition=true',)]) - xbmc.sleep(200) - - try: - self.plot.autoScroll(7000, 6000, 30000) - except: - - xbmc.executebuiltin( - 'Notification([COLOR red][B]Actualiza Kodi a su última versión[/B][/COLOR], [COLOR skyblue]para mejor info[/COLOR],8000,"https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/kodi-icon.png")') - self.plot.setText(self.getPlot) - - def get(self): - self.show() - - def onAction(self, action): - if action == ACTION_PREVIOUS_MENU or action.getId() == ACTION_GESTURE_SWIPE_LEFT or action == 110 or action == 92: - self.close() - - -def test(): - return True - - -def tokenize(text, match=re.compile("([idel])|(\d+):|(-?\d+)").match): - i = 0 - while i < len(text): - m = match(text, i) - s = m.group(m.lastindex) - i = m.end() - if m.lastindex == 2: - yield "s" - yield text[i:i + int(s)] - i = i + int(s) - else: - yield s - - -def decode_item(next, token): - if token == "i": - # integer: "i" value "e" - data = int(next()) - if next() != "e": - raise ValueError - elif token == "s": - # string: "s" value (virtual tokens) - data = next() - elif token == "l" or token == "d": - # container: "l" (or "d") values "e" - data = [] - tok = next() - while tok != "e": - data.append(decode_item(next, tok)) - tok = next() - if token == "d": - data = dict(zip(data[0::2], data[1::2])) - else: - raise ValueError - return data - - -def decode(text): - try: - src = tokenize(text) - data = decode_item(src.next, src.next()) - for token in src: # look for more tokens - raise SyntaxError("trailing junk") - except (AttributeError, ValueError, StopIteration): - try: - data = data - except: - data = src - - return data - - -def convert_size(size): - import math - if (size == 0): - return '0B' - size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") - i = int(math.floor(math.log(size, 1024))) - p = math.pow(1024, i) - s = round(size / p, 2) - return '%s %s' % (s, size_name[i]) - - -def fanartv(item, id_tvdb, id, images={}): - headers = [['Content-Type', 'application/json']] - from core import jsontools - if item.contentType == "movie": - url = "http://webservice.fanart.tv/v3/movies/%s?api_key=cab16e262d72fea6a6843d679aa10300" \ - % id - else: - url = "http://webservice.fanart.tv/v3/tv/%s?api_key=cab16e262d72fea6a6843d679aa10300" % id_tvdb - try: - data = jsontools.load(scrapertools.downloadpage(url, headers=headers)) - if data and not "error message" in data: - for key, value in data.items(): - if key not in ["name", "tmdb_id", "imdb_id", "thetvdb_id"]: - images[key] = value - else: - images = [] - - except: - images = [] - return images - - -def filmaffinity(item, infoLabels): - title = infoLabels["title"].replace(" ", "+") - try: - year = infoLabels["year"] - except: - year = "" - sinopsis = infoLabels["sinopsis"] - - if year == "": - if item.contentType != "movie": - tipo = "serie" - url_bing = "http://www.bing.com/search?q=%s+Serie+de+tv+site:filmaffinity.com" % title - else: - tipo = "película" - url_bing = "http://www.bing.com/search?q=%s+site:filmaffinity.com" % title - try: - data = browser(url_bing) - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - if "myaddrproxy.php" in data: - subdata_bing = scrapertools.get_match(data, - 'li class="b_algo"><div class="b_title"><h2>(<a href="/myaddrproxy.php/http/www.filmaffinity.com/es/film.*?)"') - subdata_bing = re.sub(r'\/myaddrproxy.php\/http\/', '', subdata_bing) - else: - subdata_bing = scrapertools.get_match(data, - 'li class="b_algo"><h2>(<a href="http://www.filmaffinity.com/.*?/film.*?)"') - - url_filma = scrapertools.get_match(subdata_bing, '<a href="([^"]+)') - if not "http" in url_filma: - try: - data = httptools.downloadpage("http://" + url_filma, cookies=False, timeout=1).data - except: - data = httptools.downloadpage("http://" + url_filma, cookies=False, timeout=1).data - else: - try: - data = httptools.downloadpage(url_filma, cookies=False, timeout=1).data - except: - data = httptools.downloadpage(url_filma, cookies=False, timeout=1).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - except: - pass - else: - tipo = "Pelicula" - url = "http://www.filmaffinity.com/es/advsearch.php?stext={0}&stype%5B%5D=title&country=&genre=&fromyear={1}&toyear={1}".format( - title, year) - data = httptools.downloadpage(url, cookies=False).data - url_filmaf = scrapertools.find_single_match(data, '<div class="mc-poster">\s*<a title="[^"]*" href="([^"]+)"') - if url_filmaf: - url_filmaf = "http://www.filmaffinity.com%s" % url_filmaf - data = httptools.downloadpage(url_filmaf, cookies=False).data - else: - if item.contentType != "movie": - tipo = "serie" - url_bing = "http://www.bing.com/search?q=%s+Serie+de+tv+site:filmaffinity.com" % title - else: - tipo = "película" - url_bing = "http://www.bing.com/search?q=%s+site:filmaffinity.com" % title - try: - data = browser(url_bing) - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - if "myaddrproxy.php" in data: - subdata_bing = scrapertools.get_match(data, - 'li class="b_algo"><div class="b_title"><h2>(<a href="/myaddrproxy.php/http/www.filmaffinity.com/es/film.*?)"') - subdata_bing = re.sub(r'\/myaddrproxy.php\/http\/', '', subdata_bing) - else: - subdata_bing = scrapertools.get_match(data, - 'li class="b_algo"><h2>(<a href="http://www.filmaffinity.com/.*?/film.*?)"') - - url_filma = scrapertools.get_match(subdata_bing, '<a href="([^"]+)') - if not "http" in url_filma: - data = httptools.downloadpage("http://" + url_filma, cookies=False).data - else: - data = httptools.downloadpage(url_filma, cookies=False).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - except: - pass - sinopsis_f = scrapertools.find_single_match(data, '<dd itemprop="description">(.*?)</dd>') - sinopsis_f = sinopsis_f.replace("<br><br />", "\n") - sinopsis_f = re.sub(r"\(FILMAFFINITY\)<br />", "", sinopsis_f) - try: - year_f = scrapertools.get_match(data, '<dt>Año</dt>.*?>(\d+)</dd>') - except: - year_f = "" - try: - rating_filma = scrapertools.get_match(data, 'itemprop="ratingValue" content="(.*?)">') - except: - rating_filma = "Sin puntuacion" - critica = "" - patron = '<div itemprop="reviewBody">(.*?)</div>.*?itemprop="author">(.*?)\s*<i alt="([^"]+)"' - matches_reviews = scrapertools.find_multiple_matches(data, patron) - - if matches_reviews: - for review, autor, valoracion in matches_reviews: - review = dhe(scrapertools.htmlclean(review)) - review += "\n" + autor + "[CR]" - review = re.sub(r'Puntuac.*?\)', '', review) - if "positiva" in valoracion: - critica += "[COLOR green][B]%s[/B][/COLOR]\n" % review - elif "neutral" in valoracion: - critica += "[COLOR yellow][B]%s[/B][/COLOR]\n" % review - else: - critica += "[COLOR red][B]%s[/B][/COLOR]\n" % review - else: - critica = "[COLOR floralwhite][B]Esta %s no tiene críticas todavía...[/B][/COLOR]" % tipo - - return critica, rating_filma, year_f, sinopsis_f diff --git a/plugin.video.alfa/channels/trailertools.py b/plugin.video.alfa/channels/trailertools.py index d92c3b9d..9f592c78 100755 --- a/plugin.video.alfa/channels/trailertools.py +++ b/plugin.video.alfa/channels/trailertools.py @@ -542,7 +542,7 @@ try: elif item.action == "play" and not self.item.windowed: for window in window_select: window.close() - retorna = platformtools.play_video(item) + retorna = platformtools.play_video(item, force_direct=True) if not retorna: while True: xbmc.sleep(1000) diff --git a/plugin.video.alfa/channels/tubehentai.json b/plugin.video.alfa/channels/tubehentai.json index 7a724688..49bd6fc2 100755 --- a/plugin.video.alfa/channels/tubehentai.json +++ b/plugin.video.alfa/channels/tubehentai.json @@ -3,7 +3,7 @@ "name": "tubehentai", "active": true, "adult": true, - "language": "es", + "language": ["*"], "banner": "tubehentai.png", "thumbnail": "tubehentai.png", "version": 1, diff --git a/plugin.video.alfa/channels/tupornotv.json b/plugin.video.alfa/channels/tupornotv.json index ba5e7769..4502963d 100755 --- a/plugin.video.alfa/channels/tupornotv.json +++ b/plugin.video.alfa/channels/tupornotv.json @@ -3,7 +3,7 @@ "name": "tuporno.tv", "active": true, "adult": true, - "language": "es", + "language": ["*"], "banner": "tupornotv.png", "thumbnail": "tupornotv.png", "version": 1, diff --git a/plugin.video.alfa/channels/tvmoviedb.json b/plugin.video.alfa/channels/tvmoviedb.json index cc476ca8..dfff7b67 100755 --- a/plugin.video.alfa/channels/tvmoviedb.json +++ b/plugin.video.alfa/channels/tvmoviedb.json @@ -3,7 +3,7 @@ "name": "TvMovieDB", "active": true, "adult": false, - "language": "es", + "language": ["*"], "thumbnail": "http://i.imgur.com/HA7fvgD.png", "version": 1, "changes": [ diff --git a/plugin.video.alfa/channels/tvseriesdk.json b/plugin.video.alfa/channels/tvseriesdk.json index 142994b6..cddcc681 100644 --- a/plugin.video.alfa/channels/tvseriesdk.json +++ b/plugin.video.alfa/channels/tvseriesdk.json @@ -3,12 +3,11 @@ "name": "TVSeriesdk", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "https://s13.postimg.org/jrvqmqfnb/tvseriesdk.png", "banner": "https://s16.postimg.org/r6mbel0f9/tvseriesdk-banner.png", "version": 1, "categories": [ - "latino", "tvshow" ], "settings": [ diff --git a/plugin.video.alfa/channels/tvseriesdk.py b/plugin.video.alfa/channels/tvseriesdk.py index 44b9e6b9..26a9771c 100644 --- a/plugin.video.alfa/channels/tvseriesdk.py +++ b/plugin.video.alfa/channels/tvseriesdk.py @@ -4,7 +4,7 @@ # -*- By the Alfa Develop Group -*- import re - +from channelselector import get_thumb from core import httptools from core import scrapertools from core import servertools @@ -66,7 +66,7 @@ def list_all(item): plot=plot, contentErieName=contentSerieName )) - itemlist = get_thumb(templist) + itemlist = serie_thumb(templist) # Paginación if url_next_page: itemlist.append(item.clone(title="Siguiente >>", url=url_next_page, next_page=next_page, i=item.i)) @@ -110,7 +110,7 @@ def episodios(item): return itemlist -def get_thumb(itemlist): +def serie_thumb(itemlist): logger.info() for item in itemlist: data = get_source(item.url) @@ -135,7 +135,7 @@ def search_list(item): next_page = scrapertools.find_single_match(data, '<link rel=next href=(.*?) />') if next_page: itemlist.append(Item(channel=item.channel, action="search_list", title='>> Pagina Siguiente', url=next_page, - thumbnail=config.get_thumb("thumb_next.png"))) + thumbnail = get_thumb('thumb_next.png'))) return itemlist diff --git a/plugin.video.alfa/channels/tvvip.json b/plugin.video.alfa/channels/tvvip.json deleted file mode 100755 index cccf69ed..00000000 --- a/plugin.video.alfa/channels/tvvip.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "id": "tvvip", - "name": "TV-VIP", - "active": false, - "adult": false, - "language": "es", - "banner": "http://i.imgur.com/wyRk5AG.png", - "thumbnail": "http://i.imgur.com/gNHVlI4.png", - "version": 1, - "changes": [ - { - "date": "15/03/2017", - "description": "limpieza código" - }, - { - "date": "04/01/2017", - "description": "Se desactiva el canal hasta posible arreglo." - } - ], - "categories": [ - "movie", - "tvshow", - "documentary" - ], - "settings": [ - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en busqueda global", - "default": true, - "enabled": true, - "visible": true - } - ] -} \ No newline at end of file diff --git a/plugin.video.alfa/channels/tvvip.py b/plugin.video.alfa/channels/tvvip.py deleted file mode 100755 index 27eb31dc..00000000 --- a/plugin.video.alfa/channels/tvvip.py +++ /dev/null @@ -1,805 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import re -import unicodedata -import urllib - -from core import jsontools -from core import scrapertools -from core.item import Item -from platformcode import config, logger - -host = "http://tv-vip.com" -headers = [['User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0'], - ['Accept', 'application/json, text/javascript, */*; q=0.01'], - ['Accept-Language', 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3'], - ['Accept-Encoding', 'gzip, deflate'], - ['Connection', 'keep-alive'], - ['DNT', '1'], - ['Referer', 'http://tv-vip.com']] - -header_string = "|User-Agent=Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0" \ - "&Referer=http://tv-vip.com&Cookie=" - - -def mainlist(item): - logger.info() - item.viewmode = "movie" - itemlist = [] - - data = scrapertools.anti_cloudflare("http://tv-vip.com/json/playlist/home/index.json", host=host, headers=headers) - - head = header_string + get_cookie_value() - itemlist.append(Item(channel=item.channel, title="Películas", action="submenu", - thumbnail="http://tv-vip.com/json/playlist/peliculas/thumbnail.jpg" + head, - fanart="http://tv-vip.com/json/playlist/peliculas/background.jpg" + head, viewmode="movie")) - itemlist.append(Item(channel=item.channel, title="Series", action="submenu", - thumbnail="http://tv-vip.com/json/playlist/series/poster.jpg" + head, - fanart="http://tv-vip.com/json/playlist/series/background.jpg" + head, viewmode="movie")) - itemlist.append(Item(channel=item.channel, title="Versión Original", action="entradasconlistas", - url="http://tv-vip.com/json/playlist/version-original/index.json", - thumbnail="http://tv-vip.com/json/playlist/version-original/thumbnail.jpg" + head, - fanart="http://tv-vip.com/json/playlist/version-original/background.jpg" + head, - viewmode="movie_with_plot")) - itemlist.append(Item(channel=item.channel, title="Documentales", action="entradasconlistas", - url="http://tv-vip.com/json/playlist/documentales/index.json", - thumbnail="http://tv-vip.com/json/playlist/documentales/thumbnail.jpg" + head, - fanart="http://tv-vip.com/json/playlist/documentales/background.jpg" + head, - viewmode="movie_with_plot")) - itemlist.append(Item(channel=item.channel, title="Películas Infantiles", action="entradasconlistas", - url="http://tv-vip.com/json/playlist/peliculas-infantiles/index.json", - thumbnail="http://tv-vip.com/json/playlist/peliculas-infantiles/thumbnail.jpg" + head, - fanart="http://tv-vip.com/json/playlist/peliculas-infantiles/background.jpg" + head, - viewmode="movie_with_plot")) - itemlist.append(Item(channel=item.channel, title="Series Infantiles", action="entradasconlistas", - url="http://tv-vip.com/json/playlist/series-infantiles/index.json", - thumbnail="http://tv-vip.com/json/playlist/series-infantiles/thumbnail.jpg" + head, - fanart="http://tv-vip.com/json/playlist/series-infantiles/background.jpg" + head, - viewmode="movie_with_plot")) - itemlist.append(Item(channel=item.channel, title="Buscar...", action="search", - thumbnail="http://i.imgur.com/gNHVlI4.png", fanart="http://i.imgur.com/9loVksV.png")) - - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "%20") - if item.title == "Buscar...": item.extra = "local" - item.url = "http://tv-vip.com/video-prod/s/search?q=%s&n=100" % texto - - try: - return busqueda(item, texto) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def busqueda(item, texto): - logger.info() - itemlist = [] - - data = scrapertools.anti_cloudflare(item.url, host=host, headers=headers) - data = jsontools.load(data) - head = header_string + get_cookie_value() - for child in data["objectList"]: - infolabels = {} - - infolabels['year'] = child['year'] - if child['tags']: infolabels['genre'] = ', '.join([x.strip() for x in child['tags']]) - infolabels['rating'] = child['rate'].replace(',', '.') - infolabels['votes'] = child['rateCount'] - if child['cast']: infolabels['cast'] = child['cast'].split(",") - infolabels['director'] = child['director'] - - if 'playListChilds' not in child: - infolabels['plot'] = child['description'] - type = "repo" - fulltitle = unicodedata.normalize('NFD', unicode(child['name'], 'utf-8')) \ - .encode('ASCII', 'ignore').decode("utf-8") - title = child['name'] - infolabels['duration'] = child['duration'] - if child['height'] < 720: - quality = "[B] [SD][/B]" - elif child['height'] < 1080: - quality = "[B] [720p][/B]" - elif child['height'] >= 1080: - quality = "[B] [1080p][/B]" - if child['name'] == "": - title = child['id'].rsplit(".", 1)[0] - else: - title = child['name'] - if child['year']: - title += " (" + child['year'] + ")" - title += quality - else: - type = "playlist" - infolabels['plot'] = "Contiene:\n" + "\n".join(child['playListChilds']) + "\n".join(child['repoChilds']) - fulltitle = child['id'] - title = "[COLOR red][LISTA][/COLOR] " + child['id'].replace('-', ' ').capitalize() + " ([COLOR gold]" + \ - str(child['number']) + "[/COLOR])" - - # En caso de búsqueda global se filtran los resultados - if item.extra != "local": - if "+" in texto: texto = "|".join(texto.split("+")) - if not re.search(r'(?i)' + texto, title, flags=re.DOTALL): continue - - url = "http://tv-vip.com/json/%s/%s/index.json" % (type, child["id"]) - # Fanart - if child['hashBackground']: - fanart = "http://tv-vip.com/json/%s/%s/background.jpg" % (type, child["id"]) - else: - fanart = "http://tv-vip.com/json/%s/%s/thumbnail.jpg" % (type, child["id"]) - # Thumbnail - if child['hasPoster']: - thumbnail = "http://tv-vip.com/json/%s/%s/poster.jpg" % (type, child["id"]) - else: - thumbnail = fanart - thumbnail += head - fanart += head - - if type == 'playlist': - itemlist.insert(0, Item(channel=item.channel, action="entradasconlistas", title=bbcode_kodi2html(title), - url=url, thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, - infoLabels=infolabels, viewmode="movie_with_plot", folder=True)) - else: - itemlist.append(Item(channel=item.channel, action="findvideos", title=bbcode_kodi2html(title), url=url, - thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, contentTitle=fulltitle, - context="05", infoLabels=infolabels, viewmode="movie_with_plot", folder=True)) - - return itemlist - - -def submenu(item): - logger.info() - itemlist = [] - data = scrapertools.anti_cloudflare("http://tv-vip.com/json/playlist/home/index.json", host=host, headers=headers) - head = header_string + get_cookie_value() - if item.title == "Series": - itemlist.append(Item(channel=item.channel, title="Nuevos Capítulos", action="episodios", - url="http://tv-vip.com/json/playlist/nuevos-capitulos/index.json", - thumbnail="http://tv-vip.com/json/playlist/nuevos-capitulos/background.jpg" + head, - fanart="http://tv-vip.com/json/playlist/nuevos-capitulos/background.jpg" + head, - viewmode="movie")) - itemlist.append(Item(channel=item.channel, title="Más Vistas", action="series", - url="http://tv-vip.com/json/playlist/top-series/index.json", - thumbnail="http://tv-vip.com/json/playlist/top-series/thumbnail.jpg" + head, - fanart="http://tv-vip.com/json/playlist/top-series/background.jpg" + head, - contentTitle="Series", viewmode="movie_with_plot")) - itemlist.append(Item(channel=item.channel, title="Últimas Series", action="series", - url="http://tv-vip.com/json/playlist/series/index.json", - thumbnail=item.thumbnail, fanart=item.fanart, contentTitle="Series", - viewmode="movie_with_plot")) - itemlist.append(Item(channel=item.channel, title="Lista de Series A-Z", action="series", - url="http://tv-vip.com/json/playlist/series/index.json", thumbnail=item.thumbnail, - fanart=item.fanart, contentTitle="Series", viewmode="movie_with_plot")) - else: - itemlist.append(Item(channel=item.channel, title="Novedades", action="entradas", - url="http://tv-vip.com/json/playlist/000-novedades/index.json", - thumbnail="http://tv-vip.com/json/playlist/ultimas-peliculas/thumbnail.jpg" + head, - fanart="http://tv-vip.com/json/playlist/ultimas-peliculas/background.jpg" + head, - viewmode="movie_with_plot")) - itemlist.append(Item(channel=item.channel, title="Más vistas", action="entradas", - url="http://tv-vip.com/json/playlist/peliculas-mas-vistas/index.json", - thumbnail="http://tv-vip.com/json/playlist/peliculas-mas-vistas/thumbnail.jpg" + head, - fanart="http://tv-vip.com/json/playlist/peliculas-mas-vistas/background.jpg" + head, - viewmode="movie_with_plot")) - itemlist.append(Item(channel=item.channel, title="Categorías", action="cat", - url="http://tv-vip.com/json/playlist/peliculas/index.json", - thumbnail=item.thumbnail, fanart=item.fanart)) - itemlist.append(Item(channel=item.channel, title="Películas 3D", action="entradasconlistas", - url="http://tv-vip.com/json/playlist/3D/index.json", - thumbnail="http://tv-vip.com/json/playlist/3D/thumbnail.jpg" + head, - fanart="http://tv-vip.com/json/playlist/3D/background.jpg" + head, - viewmode="movie_with_plot")) - return itemlist - - -def cat(item): - logger.info() - itemlist = [] - - data = scrapertools.anti_cloudflare(item.url, host=host, headers=headers) - data = jsontools.load(data) - head = header_string + get_cookie_value() - exception = ["peliculas-mas-vistas", "ultimas-peliculas"] - for child in data["sortedPlaylistChilds"]: - if child["id"] not in exception: - url = "http://tv-vip.com/json/playlist/%s/index.json" % child["id"] - # Fanart - if child['hashBackground']: - fanart = "http://tv-vip.com/json/playlist/%s/background.jpg" % child["id"] - else: - fanart = "http://tv-vip.com/json/playlist/%s/thumbnail.jpg" % child["id"] - # Thumbnail - thumbnail = "http://tv-vip.com/json/playlist/%s/thumbnail.jpg" % child["id"] - thumbnail += head - fanart += head - title = child['id'].replace('-', ' ').capitalize().replace("Manga", "Animación/Cine Oriental") - title += " ([COLOR gold]" + str(child['number']) + "[/COLOR])" - itemlist.append( - Item(channel=item.channel, action="entradasconlistas", title=bbcode_kodi2html(title), url=url, - thumbnail=thumbnail, fanart=fanart, folder=True)) - - return itemlist - - -def entradas(item): - logger.info() - itemlist = [] - if item.title == "Nuevos Capítulos": - context = "5" - else: - context = "05" - data = scrapertools.anti_cloudflare(item.url, host=host, headers=headers) - data = jsontools.load(data) - head = header_string + get_cookie_value() - for child in data["sortedRepoChilds"]: - infolabels = {} - - infolabels['plot'] = child['description'] - infolabels['year'] = child['year'] - if child['tags']: infolabels['genre'] = ', '.join([x.strip() for x in child['tags']]) - infolabels['rating'] = child['rate'].replace(',', '.') - infolabels['votes'] = child['rateCount'] - infolabels['duration'] = child['duration'] - if child['cast']: infolabels['cast'] = child['cast'].split(",") - infolabels['director'] = child['director'] - url = "http://tv-vip.com/json/repo/%s/index.json" % child["id"] - # Fanart - if child['hashBackground']: - fanart = "http://tv-vip.com/json/repo/%s/background.jpg" % child["id"] - else: - fanart = "http://tv-vip.com/json/repo/%s/thumbnail.jpg" % child["id"] - # Thumbnail - if child['hasPoster']: - thumbnail = "http://tv-vip.com/json/repo/%s/poster.jpg" % child["id"] - else: - thumbnail = fanart - thumbnail += head - fanart += head - - if child['height'] < 720: - quality = "[B] [SD][/B]" - elif child['height'] < 1080: - quality = "[B] [720p][/B]" - elif child['height'] >= 1080: - quality = "[B] [1080p][/B]" - fulltitle = unicodedata.normalize('NFD', unicode(child['name'], 'utf-8')).encode('ASCII', 'ignore') \ - .decode("utf-8") - if child['name'] == "": - title = child['id'].rsplit(".", 1)[0] - else: - title = child['name'] - if child['year']: - title += " (" + child['year'] + ")" - title += quality - - itemlist.append(Item(channel=item.channel, action="findvideos", server="", title=title, url=url, - thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, infoLabels=infolabels, - contentTitle=fulltitle, context=context)) - - return itemlist - - -def entradasconlistas(item): - logger.info() - itemlist = [] - - data = scrapertools.anti_cloudflare(item.url, host=host, headers=headers) - data = jsontools.load(data) - head = header_string + get_cookie_value() - # Si hay alguna lista - contentSerie = False - contentList = False - if data['playListChilds']: - itemlist.append(Item(channel=item.channel, title="**LISTAS**", action="", text_color="red", text_bold=True, - folder=False)) - for child in data['sortedPlaylistChilds']: - infolabels = {} - - infolabels['plot'] = "Contiene:\n" + "\n".join(child['playListChilds']) + "\n".join(child['repoChilds']) - if child['seasonNumber'] and not contentList and re.search(r'(?i)temporada', child['id']): - infolabels['season'] = child['seasonNumber'] - contentSerie = True - else: - contentSerie = False - contentList = True - title = child['id'].replace('-', ' ').capitalize() + " ([COLOR gold]" + str(child['number']) + "[/COLOR])" - url = "http://tv-vip.com/json/playlist/%s/index.json" % child["id"] - thumbnail = "http://tv-vip.com/json/playlist/%s/thumbnail.jpg" % child["id"] - if child['hashBackground']: - fanart = "http://tv-vip.com/json/playlist/%s/background.jpg" % child["id"] - else: - fanart = "http://tv-vip.com/json/playlist/%s/thumbnail.jpg" % child["id"] - - thumbnail += head - fanart += head - itemlist.append(Item(channel=item.channel, action="entradasconlistas", title=bbcode_kodi2html(title), - url=url, thumbnail=thumbnail, fanart=fanart, fulltitle=child['id'], - infoLabels=infolabels, viewmode="movie_with_plot")) - else: - contentList = True - if data["sortedRepoChilds"] and len(itemlist) > 0: - itemlist.append(Item(channel=item.channel, title="**VÍDEOS**", action="", text_color="blue", text_bold=True, - folder=False)) - - for child in data["sortedRepoChilds"]: - infolabels = {} - - infolabels['plot'] = child['description'] - infolabels['year'] = data['year'] - if child['tags']: infolabels['genre'] = ', '.join([x.strip() for x in child['tags']]) - infolabels['rating'] = child['rate'].replace(',', '.') - infolabels['votes'] = child['rateCount'] - infolabels['duration'] = child['duration'] - if child['cast']: infolabels['cast'] = child['cast'].split(",") - infolabels['director'] = child['director'] - url = "http://tv-vip.com/json/repo/%s/index.json" % child["id"] - # Fanart - if child['hashBackground']: - fanart = "http://tv-vip.com/json/repo/%s/background.jpg" % child["id"] - else: - fanart = "http://tv-vip.com/json/repo/%s/thumbnail.jpg" % child["id"] - # Thumbnail - if child['hasPoster']: - thumbnail = "http://tv-vip.com/json/repo/%s/poster.jpg" % child["id"] - else: - thumbnail = fanart - thumbnail += head - fanart += head - if child['height'] < 720: - quality = "[B] [SD][/B]" - elif child['height'] < 1080: - quality = "[B] [720p][/B]" - elif child['height'] >= 1080: - quality = "[B] [1080p][/B]" - fulltitle = unicodedata.normalize('NFD', unicode(child['name'], 'utf-8')).encode('ASCII', 'ignore') \ - .decode("utf-8") - if child['name'] == "": - title = child['id'].rsplit(".", 1)[0] - else: - title = child['name'] - if child['year']: - title += " (" + child['year'] + ")" - title += quality - - itemlist.append(Item(channel=item.channel, action="findvideos", title=bbcode_kodi2html(title), url=url, - thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, infoLabels=infolabels, - contentTitle=fulltitle, context="05", viewmode="movie_with_plot", folder=True)) - - # Se añade item para añadir la lista de vídeos a la videoteca - if data['sortedRepoChilds'] and len(itemlist) > 0 and contentList: - if config.get_videolibrary_support(): - itemlist.append(Item(channel=item.channel, text_color="green", title="Añadir esta lista a la videoteca", - url=item.url, action="listas")) - elif contentSerie: - if config.get_videolibrary_support(): - itemlist.append(Item(channel=item.channel, title="Añadir esta serie a la videoteca", url=item.url, - action="series_library", fulltitle=data['name'], show=data['name'], - text_color="green")) - - return itemlist - - -def series(item): - logger.info() - itemlist = [] - - data = scrapertools.anti_cloudflare(item.url, host=host, headers=headers) - data = jsontools.load(data) - head = header_string + get_cookie_value() - exception = ["top-series", "nuevos-capitulos"] - for child in data["sortedPlaylistChilds"]: - if child["id"] not in exception: - infolabels = {} - - infolabels['plot'] = child['description'] - infolabels['year'] = child['year'] - if child['tags']: infolabels['genre'] = ', '.join([x.strip() for x in child['tags']]) - infolabels['rating'] = child['rate'].replace(',', '.') - infolabels['votes'] = child['rateCount'] - if child['cast']: infolabels['cast'] = child['cast'].split(",") - infolabels['director'] = child['director'] - infolabels['mediatype'] = "episode" - if child['seasonNumber']: infolabels['season'] = child['seasonNumber'] - url = "http://tv-vip.com/json/playlist/%s/index.json" % child["id"] - # Fanart - if child['hashBackground']: - fanart = "http://tv-vip.com/json/playlist/%s/background.jpg" % child["id"] - else: - fanart = "http://tv-vip.com/json/playlist/%s/thumbnail.jpg" % child["id"] - # Thumbnail - if child['hasPoster']: - thumbnail = "http://tv-vip.com/json/playlist/%s/poster.jpg" % child["id"] - else: - thumbnail = fanart - thumbnail += head - fanart += head - - if item.contentTitle == "Series": - if child['name'] != "": - fulltitle = unicodedata.normalize('NFD', unicode(child['name'].split(" Temporada")[0], 'utf-8')) \ - .encode('ASCII', 'ignore').decode("utf-8") - fulltitle = fulltitle.replace('-', '') - title = child['name'] + " (" + child['year'] + ")" - else: - title = fulltitle = child['id'].capitalize() - if "Temporada" not in title: - title += " [Temporadas: [COLOR gold]" + str(child['numberOfSeasons']) + "[/COLOR]]" - elif item.title == "Más Vistas": - title = title.replace("- Temporada", "--- Temporada") - else: - if data['name'] != "": - fulltitle = unicodedata.normalize('NFD', unicode(data['name'], 'utf-8')).encode('ASCII', 'ignore') \ - .decode("utf-8") - if child['seasonNumber']: - title = data['name'] + " --- Temporada " + child['seasonNumber'] + \ - " [COLOR gold](" + str(child['number']) + ")[/COLOR]" - else: - title = child['name'] + " [COLOR gold](" + str(child['number']) + ")[/COLOR]" - else: - fulltitle = unicodedata.normalize('NFD', unicode(data['id'], 'utf-8')).encode('ASCII', 'ignore') \ - .decode("utf-8") - if child['seasonNumber']: - title = data['id'].capitalize() + " --- Temporada " + child['seasonNumber'] + \ - " [COLOR gold](" + str(child['number']) + ")[/COLOR]" - else: - title = data['id'].capitalize() + " [COLOR gold](" + str(child['number']) + ")[/COLOR]" - if not child['playListChilds']: - action = "episodios" - else: - action = "series" - itemlist.append(Item(channel=item.channel, action=action, title=bbcode_kodi2html(title), url=url, server="", - thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, infoLabels=infolabels, - contentTitle=fulltitle, context="25", viewmode="movie_with_plot", folder=True)) - if len(itemlist) == len(data["sortedPlaylistChilds"]) and item.contentTitle != "Series": - - itemlist.sort(key=lambda item: item.title, reverse=True) - if config.get_videolibrary_support(): - itemlist.append(Item(channel=item.channel, title="Añadir esta serie a la videoteca", url=item.url, - action="add_serie_to_library", show=data['name'], - text_color="green", extra="series_library")) - - if item.title == "Últimas Series": return itemlist - if item.title == "Lista de Series A-Z": itemlist.sort(key=lambda item: item.fulltitle) - - if data["sortedRepoChilds"] and len(itemlist) > 0: - itemlist.append(Item(channel=item.channel, title="**VÍDEOS RELACIONADOS/MISMA TEMÁTICA**", text_color="blue", - text_bold=True, action="", folder=False)) - for child in data["sortedRepoChilds"]: - infolabels = {} - - if child['description']: - infolabels['plot'] = data['description'] - else: - infolabels['plot'] = child['description'] - infolabels['year'] = data['year'] - if not child['tags']: - infolabels['genre'] = ', '.join([x.strip() for x in data['tags']]) - else: - infolabels['genre'] = ', '.join([x.strip() for x in child['tags']]) - infolabels['rating'] = child['rate'].replace(',', '.') - infolabels['duration'] = child['duration'] - if child['cast']: infolabels['cast'] = child['cast'].split(",") - infolabels['director'] = child['director'] - - url = "http://tv-vip.com/json/repo/%s/index.json" % child["id"] - # Fanart - if child['hashBackground']: - fanart = "http://tv-vip.com/json/repo/%s/background.jpg" % child["id"] - else: - fanart = "http://tv-vip.com/json/repo/%s/thumbnail.jpg" % child["id"] - # Thumbnail - if child['hasPoster']: - thumbnail = "http://tv-vip.com/json/repo/%s/poster.jpg" % child["id"] - else: - thumbnail = fanart - thumbnail += head - fanart += head - - if child['height'] < 720: - quality = "[B] [SD][/B]" - elif child['height'] < 1080: - quality = "[B] [720p][/B]" - elif child['height'] >= 1080: - quality = "[B] [1080p][/B]" - fulltitle = unicodedata.normalize('NFD', unicode(child['name'], 'utf-8')).encode('ASCII', 'ignore') \ - .decode("utf-8") - - if child['name'] == "": - title = child['id'].rsplit(".", 1)[0] - else: - title = child['name'] - if child['year']: - title += " (" + child['year'] + ")" - title += quality - - itemlist.append(Item(channel=item.channel, action="findvideos", title=bbcode_kodi2html(title), url=url, - server="", thumbnail=thumbnail, fanart=fanart, fulltitle=fulltitle, infoLabels=infolabels, - contentTitle=fulltitle, context="25", viewmode="movie_with_plot", folder=True)) - if item.extra == "new": - itemlist.sort(key=lambda item: item.title, reverse=True) - - return itemlist - - -def episodios(item): - logger.info() - logger.info("categoriaaa es " + item.tostring()) - itemlist = [] - # Redirección para actualización de videoteca - if item.extra == "series_library": - itemlist = series_library(item) - return itemlist - - data = scrapertools.anti_cloudflare(item.url, host=host, headers=headers) - data = jsontools.load(data) - head = header_string + get_cookie_value() - # Se prueba un método u otro porque algunas series no están bien listadas - if data["sortedRepoChilds"]: - for child in data["sortedRepoChilds"]: - if item.infoLabels: - item.infoLabels['duration'] = str(child['duration']) - item.infoLabels['season'] = str(data['seasonNumber']) - item.infoLabels['episode'] = str(child['episode']) - item.infoLabels['mediatype'] = "episode" - contentTitle = item.fulltitle + "|" + str(data['seasonNumber']) + "|" + str(child['episode']) - # En caso de venir del apartado nuevos capítulos se redirige a la función series para mostrar los demás - if item.title == "Nuevos Capítulos": - url = "http://tv-vip.com/json/playlist/%s/index.json" % child["season"] - action = "series" - extra = "new" - else: - url = "http://tv-vip.com/json/repo/%s/index.json" % child["id"] - action = "findvideos" - extra = "" - if child['hasPoster']: - thumbnail = "http://tv-vip.com/json/repo/%s/poster.jpg" % child["id"] - else: - thumbnail = "http://tv-vip.com/json/repo/%s/thumbnail.jpg" % child["id"] - thumbnail += head - try: - title = fulltitle = child['name'].rsplit(" ", 1)[0] + " - " + child['name'].rsplit(" ", 1)[1] - except: - title = fulltitle = child['id'] - itemlist.append(item.clone(action=action, server="", title=title, url=url, thumbnail=thumbnail, - fanart=item.fanart, fulltitle=fulltitle, contentTitle=contentTitle, context="35", - viewmode="movie", extra=extra, show=item.fulltitle, folder=True)) - else: - for child in data["repoChilds"]: - url = "http://tv-vip.com/json/repo/%s/index.json" % child - if data['hasPoster']: - thumbnail = "http://tv-vip.com/json/repo/%s/poster.jpg" % child - else: - thumbnail = "http://tv-vip.com/json/repo/%s/thumbnail.jpg" % child - thumbnail += head - title = fulltitle = child.capitalize().replace('_', ' ') - itemlist.append(item.clone(action="findvideos", server="", title=title, url=url, thumbnail=thumbnail, - fanart=item.fanart, fulltitle=fulltitle, contentTitle=item.fulltitle, - context="25", show=item.fulltitle, folder=True)) - - # Opción de añadir a la videoteca en casos de series de una única temporada - if len(itemlist) > 0 and not "---" in item.title and item.title != "Nuevos Capítulos": - if config.get_videolibrary_support() and item.show == "": - if "-" in item.title: - show = item.title.split('-')[0] - else: - show = item.title.split('(')[0] - itemlist.append(Item(channel=item.channel, title="Añadir esta serie a la videoteca", text_color="green", - url=item.url, action="add_serie_to_library", show=show, extra="series_library")) - return itemlist - - -def series_library(item): - logger.info() - # Funcion unicamente para añadir/actualizar series a la libreria - lista_episodios = [] - show = item.show.strip() - - data_serie = scrapertools.anti_cloudflare(item.url, host=host, headers=headers) - data_serie = jsontools.load(data_serie) - # Para series que en la web se listan divididas por temporadas - if data_serie["sortedPlaylistChilds"]: - for season_name in data_serie["sortedPlaylistChilds"]: - url_season = "http://tv-vip.com/json/playlist/%s/index.json" % season_name['id'] - data = scrapertools.anti_cloudflare(url_season, host=host, headers=headers) - data = jsontools.load(data) - - if data["sortedRepoChilds"]: - for child in data["sortedRepoChilds"]: - url = "http://tv-vip.com/json/repo/%s/index.json" % child["id"] - fulltitle = child['name'].rsplit(" ", 1)[0] + " - " + child['name'].rsplit(" ", 1)[1] - try: - check_filename = scrapertools.get_season_and_episode(fulltitle) - except: - fulltitle += " " + str(data['seasonNumber']) + "x00" - lista_episodios.append(Item(channel=item.channel, action="findvideos", server="", - title=fulltitle, extra=url, url=item.url, fulltitle=fulltitle, - contentTitle=fulltitle, show=show)) - else: - for child in data["repoChilds"]: - url = "http://tv-vip.com/json/repo/%s/index.json" % child - fulltitle = child.capitalize().replace('_', ' ') - try: - check_filename = scrapertools.get_season_and_episode(fulltitle) - except: - fulltitle += " " + str(data['seasonNumber']) + "x00" - lista_episodios.append(Item(channel=item.channel, action="findvideos", server="", - title=fulltitle, extra=url, url=item.url, contentTitle=fulltitle, - fulltitle=fulltitle, show=show)) - # Para series directas de una sola temporada - else: - data = data_serie - if data["sortedRepoChilds"]: - for child in data["sortedRepoChilds"]: - url = "http://tv-vip.com/json/repo/%s/index.json" % child["id"] - fulltitle = child['name'].rsplit(" ", 1)[0] + " - " + child['name'].rsplit(" ", 1)[1] - try: - check_filename = scrapertools.get_season_and_episode(fulltitle) - except: - fulltitle += " 1x00" - lista_episodios.append(Item(channel=item.channel, action="findvideos", server="", title=fulltitle, - contentTitle=fulltitle, url=item.url, extra=url, fulltitle=fulltitle, - show=show)) - else: - for child in data["repoChilds"]: - url = "http://tv-vip.com/json/repo/%s/index.json" % child - fulltitle = child.capitalize().replace('_', ' ') - try: - check_filename = scrapertools.get_season_and_episode(fulltitle) - except: - fulltitle += " 1x00" - lista_episodios.append(Item(channel=item.channel, action="findvideos", server="", title=fulltitle, - contentTitle=fulltitle, url=item.url, extra=url, fulltitle=fulltitle, - show=show)) - - return lista_episodios - - -def findvideos(item): - logger.info() - itemlist = [] - - # En caso de llamarse a la función desde una serie de la videoteca - if item.extra.startswith("http"): item.url = item.extra - data = scrapertools.anti_cloudflare(item.url, host=host, headers=headers) - data = jsontools.load(data) - id = urllib.quote(data['id']) - for child in data["profiles"].keys(): - videopath = urllib.quote(data["profiles"][child]['videoUri']) - for i in range(0, len(data["profiles"][child]['servers'])): - url = data["profiles"][child]['servers'][i]['url'] + videopath - size = " " + data["profiles"][child]["sizeHuman"] - resolution = " [" + (data["profiles"][child]['videoResolution']) + "]" - title = "Ver vídeo en " + resolution.replace('1920x1080', 'HD-1080p') - if i == 0: - title += size + " [COLOR purple]Mirror " + str(i + 1) + "[/COLOR]" - else: - title += size + " [COLOR green]Mirror " + str(i + 1) + "[/COLOR]" - # Para poner enlaces de mayor calidad al comienzo de la lista - if data["profiles"][child]["profileId"] == "default": - itemlist.insert(i, item.clone(action="play", server="directo", title=bbcode_kodi2html(title), url=url, - contentTitle=item.fulltitle, viewmode="list", extra=id, folder=False)) - else: - itemlist.append(item.clone(action="play", server="directo", title=bbcode_kodi2html(title), url=url, - contentTitle=item.fulltitle, viewmode="list", extra=id, folder=False)) - - itemlist.append(item.clone(channel="trailertools", action="buscartrailer", title="Buscar Tráiler", - text_color="magenta")) - if len(itemlist) > 0 and item.extra == "": - if config.get_videolibrary_support(): - itemlist.append(Item(channel=item.channel, title="Añadir enlaces a la videoteca", text_color="green", - contentTitle=item.fulltitle, url=item.url, action="add_pelicula_to_library", - infoLabels={'title': item.fulltitle}, extra="findvideos", fulltitle=item.fulltitle)) - - return itemlist - - -def play(item): - import time - import requests - logger.info() - itemlist = [] - - cookie = get_cookie_value() - headers_play = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0', - 'Accept': 'application/json, text/javascript, */*; q=0.01', - 'Accept-Language': 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3', - 'Accept-Encoding': 'gzip, deflate', - 'Connection': 'keep-alive', - 'DNT': '1', - 'Referer': 'http://tv-vip.com/film/' + item.extra + '/', - 'Cookie': cookie} - - head = "|User-Agent=" + headers_play['User-Agent'] + "&Referer=" + headers_play['Referer'] + "&Cookie=" + \ - headers_play['Cookie'] - uri = scrapertools.find_single_match(item.url, '(/transcoder[\w\W]+)') - uri_request = "http://tv-vip.com/video-prod/s/uri?uri=%s&_=%s" % (uri, int(time.time())) - - data = requests.get(uri_request, headers=headers_play) - data = jsontools.load(data.text) - url = item.url.replace("/transcoder/", "/s/transcoder/") + "?tt=" + str(data['tt']) + \ - "&mm=" + data['mm'] + "&bb=" + data['bb'] + head - itemlist.append(item.clone(action="play", server="directo", url=url, folder=False)) - return itemlist - - -def listas(item): - logger.info() - # Para añadir listas a la videoteca en carpeta CINE - itemlist = [] - data = scrapertools.anti_cloudflare(item.url, host=host, headers=headers) - data = jsontools.load(data) - head = header_string + get_cookie_value() - for child in data["sortedRepoChilds"]: - infolabels = {} - - # Fanart - if child['hashBackground']: - fanart = "http://tv-vip.com/json/repo/%s/background.jpg" % child["id"] - else: - fanart = "http://tv-vip.com/json/repo/%s/thumbnail.jpg" % child["id"] - # Thumbnail - if child['hasPoster']: - thumbnail = "http://tv-vip.com/json/repo/%s/poster.jpg" % child["id"] - else: - thumbnail = fanart - thumbnail += head - fanart += head - - url = "http://tv-vip.com/json/repo/%s/index.json" % child["id"] - if child['name'] == "": - title = scrapertools.slugify(child['id'].rsplit(".", 1)[0]) - else: - title = scrapertools.slugify(child['name']) - title = title.replace('-', ' ').replace('_', ' ').capitalize() - infolabels['title'] = title - try: - from core import videolibrarytools - 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) - error = False - except: - error = True - import traceback - logger.error(traceback.format_exc()) - - if not error: - itemlist.append(Item(channel=item.channel, title='Lista añadida correctamente a la videoteca', - action="", folder=False)) - else: - itemlist.append(Item(channel=item.channel, title='ERROR. Han ocurrido uno o varios errores en el proceso', - action="", folder=False)) - - return itemlist - - -def get_cookie_value(): - cookies = os.path.join(config.get_data_path(), 'cookies', 'tv-vip.com.dat') - cookiedatafile = open(cookies, 'r') - cookiedata = cookiedatafile.read() - cookiedatafile.close() - cfduid = scrapertools.find_single_match(cookiedata, "tv-vip.*?__cfduid\s+([A-Za-z0-9\+\=]+)") - cfduid = "__cfduid=" + cfduid - return cfduid - - -def bbcode_kodi2html(text): - if config.get_platform().startswith("plex") or config.get_platform().startswith("mediaserver"): - import re - text = re.sub(r'\[COLOR\s([^\]]+)\]', - r'<span style="color: \1">', - text) - text = text.replace('[/COLOR]', '</span>') \ - .replace('[CR]', '<br>') \ - .replace('[B]', '<strong>') \ - .replace('[/B]', '</strong>') \ - .replace('"color: white"', '"color: auto"') - - return text diff --git a/plugin.video.alfa/channels/ultrapeliculashd.json b/plugin.video.alfa/channels/ultrapeliculashd.json index 24a4c8b6..e9970d58 100755 --- a/plugin.video.alfa/channels/ultrapeliculashd.json +++ b/plugin.video.alfa/channels/ultrapeliculashd.json @@ -1,7 +1,7 @@ { "id": "ultrapeliculashd", "name": "UltraPeliculasHD", - "language": "es", + "language": ["lat"], "active": true, "adult": false, "banner": "https://s9.postimg.org/5yxsq205r/ultrapeliculashd_banner.png", @@ -18,7 +18,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/ultrapeliculashd.py b/plugin.video.alfa/channels/ultrapeliculashd.py index 07451cb2..6edd1ea3 100755 --- a/plugin.video.alfa/channels/ultrapeliculashd.py +++ b/plugin.video.alfa/channels/ultrapeliculashd.py @@ -194,8 +194,25 @@ def findvideos(item): patron = '<iframe class=metaframe rptss src=(.*?) frameborder=0 allowfullscreen><\/iframe>' matches = matches = re.compile(patron, re.DOTALL).findall(data) - for videoitem in matches: - itemlist.extend(servertools.find_video_items(data=videoitem)) + + for video_url in matches: + + # TODO Reparar directos + # if 'stream' in video_url: + # data = httptools.downloadpage('https:'+video_url).data + # new_url=scrapertools.find_single_match(data, 'iframe src="(.*?)"') + # new_data = httptools.downloadpage(new_url).data + # logger.debug(new_data) + # + # url, quality = scrapertools.find_single_match(new_data, "file:'(.*?)',label:'(.*?)'") + # headers_string = '|Referer=%s' % url + # url = url.replace('download', 'preview')+headers_string + # sub = scrapertools.find_single_match(new_data, "file:.*?'(.*?srt)'") + # new_item = (Item(title=item.title, url=url, quality=quality, server='directo', + # subtitle=sub)) + # itemlist.append(new_item) + # else: + itemlist.extend(servertools.find_video_items(data=video_url)) for videoitem in itemlist: videoitem.channel = item.channel @@ -206,6 +223,7 @@ def findvideos(item): if 'youtube' in videoitem.url: videoitem.title = '[COLOR orange]Trailer en Youtube[/COLOR]' + if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findvideos': itemlist.append( Item(channel=item.channel, title='[COLOR yellow]Añadir esta pelicula a la videoteca[/COLOR]', url=item.url, diff --git a/plugin.video.alfa/channels/unsoloclic.json b/plugin.video.alfa/channels/unsoloclic.json index c41c0fea..2494c67a 100755 --- a/plugin.video.alfa/channels/unsoloclic.json +++ b/plugin.video.alfa/channels/unsoloclic.json @@ -3,7 +3,7 @@ "name": "Unsoloclic", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "banner": "unsoloclic.png", "thumbnail": "unsoloclic.png", "version": 1, diff --git a/plugin.video.alfa/channels/vepelis.json b/plugin.video.alfa/channels/vepelis.json index be41cc37..535de3d5 100755 --- a/plugin.video.alfa/channels/vepelis.json +++ b/plugin.video.alfa/channels/vepelis.json @@ -3,7 +3,7 @@ "name": "VePelis", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "banner": "vepelis.png", "thumbnail": "vepelis.png", "version": 1, @@ -18,7 +18,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/vepelis.py b/plugin.video.alfa/channels/vepelis.py index 4097510a..574cce96 100755 --- a/plugin.video.alfa/channels/vepelis.py +++ b/plugin.video.alfa/channels/vepelis.py @@ -4,6 +4,9 @@ import re import urlparse from core import scrapertools +from core import httptools +from core import servertools +from core import tmdb from core.item import Item from platformcode import config, logger @@ -25,8 +28,8 @@ def mainlist(item): url="http://www.vepelis.com/pelicula/ultimas-peliculas/ultimas/actualizadas", extra="http://www.vepelis.com/pelicula/ultimas-peliculas/ultimas/actualizadas")) itemlist.append(Item(channel=item.channel, title="Por Genero", action="generos", url="http://www.vepelis.com/")) - itemlist.append( - Item(channel=item.channel, title="Por Orden Alfabetico", action="alfabetico", url="http://www.vepelis.com/")) + itemlist.append(Item(channel=item.channel, title="Por Orden Alfabetico", action="alfabetico", + url="http://www.vepelis.com/")) itemlist.append(Item(channel=item.channel, title="Buscar", action="search", url="http://www.vepelis.com/")) return itemlist @@ -35,12 +38,16 @@ def listarpeliculas(item): logger.info() # Descarga la página - data = scrapertools.cachePage(item.url) + data = httptools.downloadpage(item.url).data extra = item.extra # Extrae las entradas de la pagina seleccionada - '''<td class="DarkText" align="center" valign="top" width="100px" height="160px" style="background-color:#1e1e1e;" onmouseover="this.style.backgroundColor='#000000'" onmouseout="this.style.backgroundColor='#1e1e1e'"><p style="margin-bottom: 3px;border-bottom:#ABABAB 1px solid"> - <a href="http://www.peliculasaudiolatino.com/movies/Larry_Crowne.html"><img src="http://www.peliculasaudiolatino.com/poster/85x115/peliculas/movieimg/movie1317696842.jpg" alt="Larry Crowne" border="0" height="115" width="85"></a>''' + '''<td class="DarkText" align="center" valign="top" width="100px" height="160px" + style="background-color:#1e1e1e;" onmouseover="this.style.backgroundColor='#000000'" + onmouseout="this.style.backgroundColor='#1e1e1e'"><p style="margin-bottom: 3px;border-bottom:#ABABAB 1px solid"> + <a href="http://www.peliculasaudiolatino.com/movies/Larry_Crowne.html"><img + src="http://www.peliculasaudiolatino.com/poster/85x115/peliculas/movieimg/movie1317696842.jpg" + alt="Larry Crowne" border="0" height="115" width="85"></a>''' patron = '<td class=.*?<a ' patron += 'href="([^"]+)"><img src="([^"]+)" alt="([^"]+)"' matches = re.compile(patron, re.DOTALL).findall(data) @@ -54,9 +61,8 @@ def listarpeliculas(item): logger.info(scrapedtitle) # Añade al listado - itemlist.append( - Item(channel=item.channel, action="findvideos", title=scrapedtitle, fulltitle=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot, extra=extra, folder=True)) + itemlist.append(Item(channel=item.channel, action="findvideos", title=scrapedtitle, fulltitle=scrapedtitle, + url=scrapedurl, thumbnail=scrapedthumbnail, plot=scrapedplot, extra=extra, folder=True)) # Extrae la marca de siguiente página patron = 'Anterior.*? :: <a href="/../../.*?/page/([^"]+)">Siguiente ' @@ -69,8 +75,8 @@ def listarpeliculas(item): scrapedplot = "" itemlist.append( - Item(channel=item.channel, action="listarpeliculas", title=scrapedtitle, fulltitle=scrapedtitle, - url=scrapedurl, thumbnail=scrapedthumbnail, plot=scrapedplot, extra=extra, folder=True)) + Item(channel=item.channel, action="listarpeliculas", title=scrapedtitle, fulltitle=scrapedtitle, + url=scrapedurl, thumbnail=scrapedthumbnail, plot=scrapedplot, extra=extra, folder=True)) return itemlist @@ -78,77 +84,26 @@ def listarpeliculas(item): def findvideos(item): logger.info() # Descarga la página - data = scrapertools.cachePage(item.url) - title = item.title - scrapedthumbnail = item.thumbnail itemlist = [] - patron = '<li><a href="#ms.*?">([^"]+)</a></li>.*?<iframe src="(.*?)"' - matches = re.compile(patron, re.DOTALL).findall(data) - # itemlist.append( Item(channel=item.channel, action="play", title=title , fulltitle=item.fulltitle, url=item.url , thumbnail=scrapedthumbnail , folder=False) ) + data = httptools.downloadpage(item.url).data - for match in matches: - url = match[1] - title = "SERVIDOR: " + match[0] - title = unicode(title, "iso-8859-1", errors="replace").encode("utf-8") - itemlist.append(Item(channel=item.channel, action="play", title=title, fulltitle=item.fulltitle, url=url, - thumbnail=scrapedthumbnail, folder=False)) + itemlist.extend(servertools.find_video_items(data=data)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - - from core import servertools - itemlist = servertools.find_video_items(data=item.url) for videoitem in itemlist: videoitem.channel = item.channel - videoitem.action = "play" - videoitem.folder = False + videoitem.quality = item.quality + videoitem.language = item.language + videoitem.action = 'play' return itemlist - # data2 = scrapertools.cache_page(item.url) - # data2 = data2.replace("http://www.peliculasaudiolatino.com/show/mv.php?url=","http://www.megavideo.com/?v=") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/show/videobb.php?url=","http://www.videobb.com/watch_video.php?v=") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/show/vidbux.php?url=","http://www.vidbux.com/") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/show/vidxden.php?url=","http://www.vidxden.com/") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/show/videozer.php?url=","http://www.videozer.com/video/") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/v/pl/play.php?url=","http://www.putlocker.com/embed/") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/v/mv/play.php?url=","http://www.modovideo.com/frame.php?v=") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/v/ss/play.php?url=","http://www.sockshare.com/embed/") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/v/vb/play.php?url=","http://vidbull.com/") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/show/sockshare.php?url=","http://www.sockshare.com/embed/") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/show/moevide.php?url=","http://moevideo.net/?page=video&uid=") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/show/novamov.php?url=","http://www.novamov.com/video/") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/show/movshare.php?url=","http://www.movshare.net/video/") - # data2 = data2.replace("http://www.peliculasaudiolatino.com/show/divxstage.php?url=","http://www.divxstage.net/video/") - # listavideos = servertools.findvideos(data2) -# for video in listavideos: -# invalid = video[1] -# invalid = invalid[0:8] -# if invalid!= "FN3WE43K" and invalid!="9CC3F8&e": -# scrapedtitle = item.title+video[0] -# videourl = item.url -# server = video[2] -# if (DEBUG): logger.info("title=["+scrapedtitle+"], url=["+videourl+"]") -# logger.info("url=" + item.url) - -# Añade al listado de XBMC -# itemlist.append( Item(channel=item.channel, action="play", title=scrapedtitle , fulltitle=item.fulltitle, url=videourl , server=server , folder=False) ) -# itemlist.append( Item(channel=item.channel, action="play" , title=item.title , url=item.url, thumbnail="", plot="", server=item.url)) - - -# return itemlist - def generos(item): logger.info() itemlist = [] # Descarga la página - data = scrapertools.cachePage(item.url) + data = httptools.downloadpage(item.url).data patron = '>.*?<li><a title="(.*?)" href="(.*?)"' matches = re.compile(patron, re.DOTALL).findall(data) @@ -179,12 +134,12 @@ def generos(item): def alfabetico(item): logger.info() - + # TODO Hacer esto correctamente extra = item.url itemlist = [] itemlist.append( - Item(channel=item.channel, action="listado2", title="0-9", url="http://www.vepelis.com/letra/09.html", - extra="http://www.vepelis.com/letra/09.html")) + Item(channel=item.channel, action="listado2", title="0-9", url="http://www.vepelis.com/letra/09.html", + extra="http://www.vepelis.com/letra/09.html")) itemlist.append(Item(channel=item.channel, action="listado2", title="A", url="http://www.vepelis.com/letra/a.html", extra="http://www.vepelis.com/letra/a.html")) itemlist.append(Item(channel=item.channel, action="listado2", title="B", url="http://www.vepelis.com/letra/b.html", @@ -247,38 +202,29 @@ def listado2(item): itemlist = [] # Descarga la página - data = scrapertools.cachePage(item.url) + data = httptools.downloadpage(item.url).data + data = re.sub(r'"|\n|\r|\t| |<br>|\s{2,}', "", data) - patron = '<h2 class="titpeli.*?<a href="([^"]+)" title="([^"]+)".*?peli_img_img">.*?<img src="([^"]+)".*?<strong>Idioma</strong>:.*?/>([^"]+)</div>.*?<strong>Calidad</strong>: ([^"]+)</div>' + patron = '<h2 class=titpeli.*?<a href=(.*?) title=(.*?)>.*?peli_img_img>.*?<img src=(.*?) alt.*?' + patron += '<p>(.*?)<.*?Genero.*?:.*?(\d{4})<.*?png\/>(.*?)<.*?: (.*?)<' matches = re.compile(patron, re.DOTALL).findall(data) - for match in matches: - scrapedurl = match[0] # urlparse.urljoin("",match[0]) - scrapedtitle = match[1] + ' - ' + match[4] - scrapedtitle = unicode(scrapedtitle, "iso-8859-1", errors="replace").encode("utf-8") - scrapedthumbnail = match[2] - # scrapedplot = match[0] - # itemlist.append( Item(channel=item.channel, action="findvideos", title=scrapedtitle , fulltitle=scrapedtitle, url=scrapedurl , thumbnail=scrapedthumbnail , plot=scrapedplot , folder=True) ) - itemlist.append( - Item(channel=item.channel, action="findvideos", title=scrapedtitle, fulltitle=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, folder=True)) + for scrapedurl, scrapedtitle, scrapedthumbnail, scrapedplot, year, language, quality in matches: + language = language.strip() + itemlist.append(Item(channel=item.channel, action="findvideos", title=scrapedtitle, fulltitle=scrapedtitle, + url=scrapedurl, thumbnail=scrapedthumbnail, plot=scrapedplot, language=language, + quality=quality, infoLabels={'year': year})) - # if extra<>"": - # Extrae la marca de siguiente página - # patron = 'page=(.*?)"><span><b>' + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) patron = '<span><b>(.*?)</b></span>' matches = re.compile(patron, re.DOTALL).findall(data) - # if DEBUG: scrapertools.printMatches(matches) for match in matches: - # if len(matches)>0: nu = int(match[0]) + 1 scrapedurl = extra + "?page=" + str(nu) scrapedtitle = "!Pagina Siguiente ->" scrapedthumbnail = "" - scrapedplot = "" - itemlist.append( - Item(channel=item.channel, action="listado2", title=scrapedtitle, fulltitle=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, extra=extra, folder=True)) + itemlist.append(Item(channel=item.channel, action="listado2", title=scrapedtitle, fulltitle=scrapedtitle, + url=scrapedurl, thumbnail=scrapedthumbnail, extra=extra, folder=True)) return itemlist diff --git a/plugin.video.alfa/channels/ver-peliculas.json b/plugin.video.alfa/channels/ver-peliculas.json index ba3889f4..994e7b40 100644 --- a/plugin.video.alfa/channels/ver-peliculas.json +++ b/plugin.video.alfa/channels/ver-peliculas.json @@ -5,11 +5,10 @@ "name": "Ver-peliculas", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "version": 1, "categories": [ - "movie", - "latino" + "movie" ], "settings": [ { diff --git a/plugin.video.alfa/channels/ver-peliculas.py b/plugin.video.alfa/channels/ver-peliculas.py index fcbd3059..17ada3f9 100644 --- a/plugin.video.alfa/channels/ver-peliculas.py +++ b/plugin.video.alfa/channels/ver-peliculas.py @@ -172,13 +172,15 @@ def findvideos(item): duplicated = [] data = get_source(item.url) + logger.debug(data) video_info = scrapertools.find_single_match(data, "load_player\('(.*?)','(.*?)'\);") - movie_info = scrapertools.find_single_match(item.url, 'http:\/\/ver-peliculas\.org\/peliculas\/(\d+)-(.*?)-\d{' - '4}-online\.') - movie_id = movie_info[0] - movie_name = movie_info[1] + movie_info = scrapertools.find_single_match(item.url, + 'http:\/\/ver-peliculas\.(io|org)\/peliculas\/(\d+)-(.*?)-\d{4}-online\.') + movie_host = movie_info[0] + movie_id = movie_info[1] + movie_name = movie_info[2] sub = video_info[1] - url_base = 'http://ver-peliculas.org/core/api.php?id=%s&slug=%s' % (movie_id, movie_name) + url_base = 'http://ver-peliculas.%s/core/api.php?id=%s&slug=%s' % (movie_host, movie_id, movie_name) data = httptools.downloadpage(url_base).data json_data = jsontools.load(data) video_list = json_data['lista'] diff --git a/plugin.video.alfa/channels/vernovelasonline.json b/plugin.video.alfa/channels/vernovelasonline.json index 617a9a61..f861a05c 100644 --- a/plugin.video.alfa/channels/vernovelasonline.json +++ b/plugin.video.alfa/channels/vernovelasonline.json @@ -3,7 +3,7 @@ "name": "Ver Novelas Online", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "https://s16.postimg.org/g4lzydrmd/vernovelasonline1.png", "banner": "https://s16.postimg.org/w44nhxno5/vernovelasonline2.png", "version": 1, @@ -14,8 +14,7 @@ } ], "categories": [ - "tvshow", - "latino" + "tvshow" ], "settings": [ { diff --git a/plugin.video.alfa/channels/verpeliculasnuevas.json b/plugin.video.alfa/channels/verpeliculasnuevas.json index cd9b7b88..b2d502c7 100755 --- a/plugin.video.alfa/channels/verpeliculasnuevas.json +++ b/plugin.video.alfa/channels/verpeliculasnuevas.json @@ -3,10 +3,7 @@ "name": "VerPeliculasNuevas", "active": true, "adult": false, - "language": "es", - "compatible": { - "addon_version": "4.3" - }, + "language": ["cast", "lat"], "banner": "https://s23.postimg.org/4uyyz6w4b/verpeliculasnuevas_banner.png", "thumbnail": "https://s27.postimg.org/atgs5erab/verpeliculasnuevas.png", "version": 1, @@ -33,7 +30,6 @@ } ], "categories": [ - "latino", "movie" ], "settings": [ diff --git a/plugin.video.alfa/channels/verpelis.json b/plugin.video.alfa/channels/verpelis.json index 51de7929..4ce5372b 100644 --- a/plugin.video.alfa/channels/verpelis.json +++ b/plugin.video.alfa/channels/verpelis.json @@ -3,7 +3,7 @@ "name": "Ver-pelis", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "http://imgur.com/lmYQgOu.png", "version": 1, "changes": [ diff --git a/plugin.video.alfa/channels/verseriesonlinetv.json b/plugin.video.alfa/channels/verseriesonlinetv.json index d8b5201c..620f28d9 100755 --- a/plugin.video.alfa/channels/verseriesonlinetv.json +++ b/plugin.video.alfa/channels/verseriesonlinetv.json @@ -3,7 +3,7 @@ "name": "Veriesonlinetv", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "banner": "verseriesonlinetv.png", "thumbnail": "http://s6.postimg.org/gl0ok4t01/verserieslogo.png", "version": 1, diff --git a/plugin.video.alfa/channels/verseriesonlinetv.py b/plugin.video.alfa/channels/verseriesonlinetv.py index b1660dcd..7271af05 100755 --- a/plugin.video.alfa/channels/verseriesonlinetv.py +++ b/plugin.video.alfa/channels/verseriesonlinetv.py @@ -611,7 +611,7 @@ def findvideos(item): patron = '<td><a href="([^"]+)".*?<img src="([^"]+)" title="([^<]+)" .*?<td>([^<]+)</td>.*?<td>([^<]+)</td>' matches = re.compile(patron, re.DOTALL).findall(data) print matches - for scrapedurl, scrapedthumbnail, scrapedserver, scrapedidioma, scrapedcalidad in matches: + for scrapedurl, scrapedthumbnail, scrapedserver, language, quality in matches: server = scrapertools.get_match(scrapedserver, '(.*?)[.]') icon_server = os.path.join(config.get_runtime_path(), "resources", "images", "servers", @@ -623,16 +623,18 @@ def findvideos(item): if not os.path.exists(icon_server): icon_server = scrapedthumbnail + #TODO eliminar esta seccion scrapedserver = scrapedserver.replace(scrapedserver, "[COLOR darkorange][B]" + "[" + scrapedserver + "]" + "[/B][/COLOR]") - scrapedidioma = scrapedidioma.replace(scrapedidioma, - "[COLOR lawngreen][B]" + "--" + scrapedidioma + "--" + "[/B][/COLOR]") - scrapedcalidad = scrapedcalidad.replace(scrapedcalidad, - "[COLOR floralwhite][B]" + scrapedcalidad + "[/B][/COLOR]") + language = language.replace(language, + "[COLOR lawngreen][B]" + "--" + language + "--" + "[/B][/COLOR]") + quality = quality.replace(quality, + "[COLOR floralwhite][B]" + quality + "[/B][/COLOR]") - title = scrapedserver + scrapedidioma + scrapedcalidad + title = scrapedserver + language + quality itemlist.append(Item(channel=item.channel, title=title, action="play", url=scrapedurl, thumbnail=icon_server, - fanart=item.show.split("|")[6], extra=item.thumbnail, folder=True)) + fanart=item.show.split("|")[6], extra=item.thumbnail, language= language, + quality=quality)) return itemlist diff --git a/plugin.video.alfa/channels/verseriesynovelas.json b/plugin.video.alfa/channels/verseriesynovelas.json deleted file mode 100755 index 5ee0e6cb..00000000 --- a/plugin.video.alfa/channels/verseriesynovelas.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "id": "verseriesynovelas", - "name": "Ver Series y Novelas", - "active": false, - "adult": false, - "language": "es", - "banner": "verseriesynovelas.png", - "thumbnail": "http://i.imgur.com/ZhQknRE.png", - "version": 1, - "changes": [ - { - "date": "17/05/2017", - "description": "Canal desactivado por cambio de dominio, a la espera de si lo arreglan" - }, - { - "date": "15/03/2017", - "description": "limpieza código" - }, - { - "date": "16/02/2017", - "description": "Ligeros cambios para mejorar la carga de enlaces" - }, - { - "date": "11/10/2016", - "description": "Reparado por cambios en la web, ahora necesita registro" - } - ], - "categories": [ - "latino", - "vos", - "tvshow" - ], - "settings": [ - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en busqueda global", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_series", - "type": "bool", - "label": "Incluir en Novedades - Series", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "modo_grafico", - "type": "bool", - "label": "Buscar información extra", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "perfil", - "type": "list", - "label": "Perfil de color", - "default": 2, - "enabled": true, - "visible": true, - "lvalues": [ - "Perfil 3", - "Perfil 2", - "Perfil 1" - ] - }, - { - "id": "verseriesynovelasuser", - "type": "text", - "label": "@30014", - "default": "", - "enabled": true, - "visible": true - }, - { - "id": "verseriesynovelaspassword", - "label": "@30015", - "type": "text", - "default": "", - "enabled": "!eq(-1,'')", - "hidden": true, - "visible": true - } - ] -} \ No newline at end of file diff --git a/plugin.video.alfa/channels/verseriesynovelas.py b/plugin.video.alfa/channels/verseriesynovelas.py deleted file mode 100755 index b9664db5..00000000 --- a/plugin.video.alfa/channels/verseriesynovelas.py +++ /dev/null @@ -1,393 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger - -# Configuracion del canal -__modo_grafico__ = config.get_setting('modo_grafico', 'verseriesynovelas') -__perfil__ = config.get_setting('perfil', 'verseriesynovelas') - -# Fijar perfil de color -perfil = [['0xFFFFE6CC', '0xFFFFCE9C', '0xFF994D00'], - ['0xFFA5F6AF', '0xFF5FDA6D', '0xFF11811E'], - ['0xFF58D3F7', '0xFF2E9AFE', '0xFF2E64FE']] -color1, color2, color3 = perfil[__perfil__] - - -def login(check_login=True): - logger.info() - - try: - user = config.get_setting("verseriesynovelasuser", "verseriesynovelas") - password = config.get_setting("verseriesynovelaspassword", "verseriesynovelas") - if user == "" and password == "": - return False, "Para ver los enlaces de este canal es necesario registrarse en www.verseriesynovelas.tv" - elif user == "" or password == "": - return False, "Usuario o contraseña en blanco. Revisa tus credenciales" - if check_login: - data = httptools.downloadpage("http://www.verseriesynovelas.tv/").data - if user in data: - return True, "" - - post = "log=%s&pwd=%s&redirect_to=http://www.verseriesynovelas.tv/wp-admin/&action=login" % (user, password) - data = httptools.downloadpage("http://www.verseriesynovelas.tv/iniciar-sesion", post=post).data - if "La contraseña que has introducido" in data: - logger.error("Error en el login") - return False, "Contraseña errónea. Comprueba tus credenciales" - elif "Nombre de usuario no válido" in data: - logger.error("Error en el login") - return False, "Nombre de usuario no válido. Comprueba tus credenciales" - else: - logger.info("Login correcto") - return True, "" - except: - import traceback - logger.error(traceback.format_exc()) - return False, "Error durante el login. Comprueba tus credenciales" - - -def mainlist(item): - logger.info() - itemlist = [] - item.text_color = color1 - - logueado, error_message = login() - - if not logueado: - itemlist.append(item.clone(title=error_message, action="", text_color="darkorange")) - else: - itemlist.append( - item.clone(title="Nuevos Capítulos", action="novedades", fanart="http://i.imgur.com/9loVksV.png", - url="http://www.verseriesynovelas.tv/archivos/nuevo")) - itemlist.append(item.clone(title="Últimas Series", action="ultimas", fanart="http://i.imgur.com/9loVksV.png", - url="http://www.verseriesynovelas.tv/")) - itemlist.append( - item.clone(title="Lista de Series A-Z", action="indices", fanart="http://i.imgur.com/9loVksV.png", - url="http://www.verseriesynovelas.tv/")) - itemlist.append(item.clone(title="Categorías", action="indices", fanart="http://i.imgur.com/9loVksV.png", - url="http://www.verseriesynovelas.tv/")) - itemlist.append(item.clone(title="", action="")) - itemlist.append(item.clone(title="Buscar...", action="search", fanart="http://i.imgur.com/9loVksV.png")) - itemlist.append(item.clone(title="Configurar canal...", action="configuracion", text_color="gold", folder=False)) - - return itemlist - - -def configuracion(item): - from platformcode import platformtools - ret = platformtools.show_channel_settings() - platformtools.itemlist_refresh() - return ret - - -def indices(item): - logger.info() - - itemlist = [] - data = httptools.downloadpage(item.url).data - data = data.replace("\n", "").replace("\t", "") - - if "Categorías" in item.title: - bloque = scrapertools.find_single_match(data, '<span>Seleccion tu categoria</span>(.*?)</section>') - matches = scrapertools.find_multiple_matches(bloque, '<li.*?<a href="([^"]+)">(.*?)</a>') - for url, title in matches: - itemlist.append(item.clone(action="ultimas", title=title, url=url)) - else: - bloque = scrapertools.find_single_match(data, '<ul class="alfabetico">(.*?)</ul>') - matches = scrapertools.find_multiple_matches(bloque, '<li.*?<a href="([^"]+)".*?>(.*?)</a>') - for url, title in matches: - itemlist.append(item.clone(action="ultimas", title=title, url=url)) - - return itemlist - - -def search(item, texto): - logger.info() - item.url = "http://www.verseriesynovelas.tv/archivos/h1/?s=" + texto - if "Buscar..." in item.title: - return ultimas(item, texto) - else: - try: - return busqueda(item, texto) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def busqueda(item, texto=""): - logger.info() - itemlist = [] - item.text_color = color2 - - data = httptools.downloadpage(item.url).data - data = data.replace("\n", "").replace("\t", "") - - bloque = scrapertools.find_single_match(data, '<ul class="list-paginacion">(.*?)</section>') - bloque = scrapertools.find_multiple_matches(bloque, '<li><a href=(.*?)</li>') - for match in bloque: - patron = '([^"]+)".*?<img class="fade" src="([^"]+)".*?<h2>(.*?)</h2>' - matches = scrapertools.find_multiple_matches(match, patron) - for scrapedurl, scrapedthumbnail, scrapedtitle in matches: - # fix para el buscador para que no muestre entradas con texto que no es correcto - if unicode(texto, "utf8").lower().encode("utf8") not in \ - unicode(scrapedtitle, "utf8").lower().encode("utf8"): - continue - - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle).replace(" online", "") - titleinfo = re.sub(r'(?i)((primera|segunda|tercera|cuarta|quinta|sexta) temporada)', "Temporada", - scrapedtitle) - titleinfo = titleinfo.split("Temporada")[0].strip() - titleinfo = re.sub(r'(\(\d{4}\))|(\(\d{4}\s*-\s*\d{4}\))', '', titleinfo) - - itemlist.append(item.clone(action="episodios", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fulltitle=scrapedtitle, show=titleinfo, - contentType="tvshow", contentTitle=titleinfo)) - # Paginación - next_page = scrapertools.find_single_match(data, '<a class="nextpostslink".*?href="([^"]+)">') - if next_page != "": - itemlist.append(item.clone(title=">> Siguiente", url=next_page)) - - return itemlist - - -def newest(categoria): - logger.info() - itemlist = [] - item = Item() - try: - if categoria == 'series': - item.channel = "verseriesynovelas" - item.extra = "newest" - item.url = "http://www.verseriesynovelas.tv/archivos/nuevo" - item.action = "novedades" - itemlist = novedades(item) - - if itemlist[-1].action == "novedades": - itemlist.pop() - - # Se captura la excepción, para no interrumpir al canal novedades si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("{0}".format(line)) - return [] - - return itemlist - - -def novedades(item): - logger.info() - itemlist = [] - item.text_color = color2 - - data = httptools.downloadpage(item.url).data - data = data.replace("\n", "").replace("\t", "") - - bloque = scrapertools.find_single_match(data, '<section class="list-galeria">(.*?)</section>') - bloque = scrapertools.find_multiple_matches(bloque, '<li><a href=(.*?)</a></li>') - for match in bloque: - patron = '([^"]+)".*?<img class="fade" src="([^"]+)".*?title="(?:ver |)([^"]+)"' - matches = scrapertools.find_multiple_matches(match, patron) - for scrapedurl, scrapedthumbnail, scrapedtitle in matches: - titleinfo = scrapertools.decodeHtmlentities(scrapedtitle) - try: - titleinfo = re.split("Temporada", titleinfo, flags=re.IGNORECASE)[0] - except: - try: - titleinfo = re.split("Capitulo", titleinfo, flags=re.IGNORECASE)[0] - except: - pass - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle) + " " - if item.extra != "newest": - contentTitle = titleinfo - else: - contentTitle = re.sub(r'(?i)(temporada |episodios |capítulo |capitulo )', '', scrapedtitle) - - if "ES.png" in match: - scrapedtitle += "[CAST]" - if "SUB.png" in match: - scrapedtitle += "[VOSE]" - if "LA.png" in match: - scrapedtitle += "[LAT]" - if "EN.png" in match: - scrapedtitle += "[V.O]" - itemlist.append(item.clone(action="findvideos", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fulltitle=titleinfo, show=titleinfo, - contentTitle=contentTitle, context=["buscar_trailer"], contentType="tvshow")) - - if item.extra != "newest": - try: - from core import tmdb - tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) - except: - pass - - # Paginación - next_page = scrapertools.find_single_match(data, '<a class="nextpostslink".*?href="([^"]+)">') - if next_page != "": - itemlist.append(item.clone(title=">> Siguiente", url=next_page, text_color=color3)) - - return itemlist - - -def ultimas(item, texto=""): - logger.info() - itemlist = [] - item.text_color = color2 - - data = httptools.downloadpage(item.url).data - data = data.replace("\n", "").replace("\t", "") - - bloque = scrapertools.find_single_match(data, '<ul class="list-paginacion">(.*?)</section>') - bloque = scrapertools.find_multiple_matches(bloque, '<li><a href=(.*?)</li>') - for match in bloque: - patron = '([^"]+)".*?<img class="fade" src="([^"]+)".*?<h2>(.*?)</h2>' - matches = scrapertools.find_multiple_matches(match, patron) - for scrapedurl, scrapedthumbnail, scrapedtitle in matches: - # fix para el buscador para que no muestre entradas con texto que no es correcto - if unicode(texto, "utf8").lower().encode("utf8") not in \ - unicode(scrapedtitle, "utf8").lower().encode("utf8"): - continue - - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle).replace(" online", "") - titleinfo = re.sub(r'(?i)((primera|segunda|tercera|cuarta|quinta|sexta) temporada)', "Temporada", - scrapedtitle) - titleinfo = titleinfo.split("Temporada")[0].strip() - titleinfo = re.sub(r'(\(\d{4}\))|(\(\d{4}\s*-\s*\d{4}\))', '', titleinfo) - - itemlist.append(item.clone(action="episodios", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fulltitle=titleinfo, - contentTitle=titleinfo, context=["buscar_trailer"], show=titleinfo, - contentType="tvshow")) - - try: - from core import tmdb - tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) - except: - pass - - # Paginación - next_page = scrapertools.find_single_match(data, '<a class="nextpostslink".*?href="([^"]+)">') - if next_page != "": - itemlist.append(item.clone(title=">> Siguiente", url=next_page, text_color=color3)) - - return itemlist - - -def episodios(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - data = data.replace("\n", "").replace("\t", "") - - plot = scrapertools.find_single_match(data, '<p><p>(.*?)</p>') - item.plot = scrapertools.htmlclean(plot) - bloque = scrapertools.find_multiple_matches(data, '<td data-th="Temporada"(.*?)</div>') - for match in bloque: - matches = scrapertools.find_multiple_matches(match, '.*?href="([^"]+)".*?title="([^"]+)"') - for scrapedurl, scrapedtitle in matches: - try: - season, episode = scrapertools.find_single_match(scrapedtitle, '(\d+)(?:×|x)(\d+)') - item.infoLabels['season'] = season - item.infoLabels['episode'] = episode - contentType = "episode" - except: - try: - episode = scrapertools.find_single_match(scrapedtitle, '(?i)(?:Capitulo|Capítulo|Episodio)\s*(\d+)') - item.infoLabels['season'] = "1" - item.infoLabels['episode'] = episode - contentType = "episode" - except: - contentType = "tvshow" - - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle) + " " - scrapedtitle = scrapedtitle.replace('Temporada', '') - if "ES.png" in match: - scrapedtitle += "[CAST]" - if "SUB.png" in match: - scrapedtitle += "[VOSE]" - if "LA.png" in match: - scrapedtitle += "[LAT]" - if "EN.png" in match: - scrapedtitle += "[V.O]" - - itemlist.append(item.clone(action="findvideos", title=scrapedtitle, url=scrapedurl, - fulltitle=scrapedtitle, contentType=contentType)) - - itemlist.reverse() - if itemlist and item.extra != "episodios": - try: - from core import tmdb - tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) - except: - pass - itemlist.append(item.clone(channel="trailertools", title="Buscar Tráiler", action="buscartrailer", context="", - text_color="magenta")) - if item.category != "" and config.get_videolibrary_support(): - itemlist.append(Item(channel=item.channel, title="Añadir esta temporada a la videoteca", url=item.url, - action="add_serie_to_library", extra="episodios", text_color="green", show=item.show)) - - return itemlist - - -def findvideos(item): - logger.info() - itemlist = [] - item.text_color = color3 - - if item.extra == "newest" and item.extra != "episodios": - try: - from core import tmdb - tmdb.set_infoLabels_item(item, __modo_grafico__) - except: - pass - - data = httptools.downloadpage(item.url).data - if "valida el captcha" in data: - logueado, error = login(check_login=False) - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - - bloque = scrapertools.find_multiple_matches(data, '<tr><td data-th="Idioma">(.*?)</div>') - for match in bloque: - patron = 'data-th="Calidad">(.*?)<.*?' \ - '"Servidor".*?src="http://www.google.com/s2/favicons\?domain=(.*?)\.' \ - '.*?<td data-th="Enlace"><a href="(http://www.verseriesynovelas.tv/link/enlaces.php.*?)"' - matches = scrapertools.find_multiple_matches(match, patron) - for quality, server, url in matches: - video_data = httptools.downloadpage(url).data - url_redirect = scrapertools.find_single_match(video_data, - 'href="(http://www.verseriesynovelas.tv/link/enlace.php\?u=[^"]+)"') - location = httptools.downloadpage(url_redirect, follow_redirects=False, only_headers=True).headers[ - "location"] - - title = "Ver vídeo en %s [" + quality + "]" - if "Español.png" in match: - title += " [CAST]" - if "VOS.png" in match: - title += " [VOSE]" - if "Latino.png" in match: - title += " [LAT]" - if "VO.png" in match: - title += " [V.O]" - itemlist.append(item.clone(action="play", title=url, url=location)) - - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server) - - if not itemlist: - itemlist.append(item.clone(action="", title="No se ha encontrado ningún enlace")) - if item.extra != "episodios": - url_lista = scrapertools.find_single_match(data, '<a class="regresar" href="([^"]+)"') - if url_lista != "": - itemlist.append(item.clone(action="episodios", title="Ir a la Lista de Capítulos", url=url_lista, - text_color="red", context="")) - - return itemlist diff --git a/plugin.video.alfa/channels/vertelenovelas.json b/plugin.video.alfa/channels/vertelenovelas.json index 60bc382d..3f10d17b 100755 --- a/plugin.video.alfa/channels/vertelenovelas.json +++ b/plugin.video.alfa/channels/vertelenovelas.json @@ -3,7 +3,7 @@ "name": "Ver Telenovelas", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "thumbnail": "vertelenovelas.png", "banner": "vertelenovelas.png", "version": 1, diff --git a/plugin.video.alfa/channels/videolibrary.json b/plugin.video.alfa/channels/videolibrary.json index a98b0999..0d0f11ae 100755 --- a/plugin.video.alfa/channels/videolibrary.json +++ b/plugin.video.alfa/channels/videolibrary.json @@ -3,7 +3,7 @@ "name": "Videoteca", "active": false, "adult": false, - "language": "es", + "language": ["*"], "version": 1, "changes": [ { diff --git a/plugin.video.alfa/channels/vidz7.json b/plugin.video.alfa/channels/vidz7.json index 26cbfd3b..00585931 100755 --- a/plugin.video.alfa/channels/vidz7.json +++ b/plugin.video.alfa/channels/vidz7.json @@ -3,7 +3,7 @@ "name": "Vidz7", "active": true, "adult": true, - "language": "es", + "language": ["*"], "banner": "https://www.dropbox.com/s/182r0wby3ohnxkc/bannermenu.jpg?dl=1", "thumbnail": "https://www.dropbox.com/s/7z31b4ixve2ge0l/thumbnail.png?dl=1", "version": 1, diff --git a/plugin.video.alfa/channels/vixto.json b/plugin.video.alfa/channels/vixto.json index 2107c89c..a23a7fa4 100755 --- a/plugin.video.alfa/channels/vixto.json +++ b/plugin.video.alfa/channels/vixto.json @@ -3,7 +3,7 @@ "name": "Vixto", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "banner": "vixto.png", "thumbnail": "http://i.imgur.com/y4c4HT2.png", "version": 1, @@ -22,7 +22,6 @@ } ], "categories": [ - "latino", "movie", "tvshow", "vos" diff --git a/plugin.video.alfa/channels/vixto.py b/plugin.video.alfa/channels/vixto.py index 5f8ed3de..6337d4d6 100755 --- a/plugin.video.alfa/channels/vixto.py +++ b/plugin.video.alfa/channels/vixto.py @@ -298,7 +298,7 @@ def findvideos(item): if filtro_enlaces != 1: list_enlaces = bloque_enlaces(data, filtro_idioma, dict_idiomas, "Descarga Directa", item) if list_enlaces: - itemlist.append(item.clone(action="", title="Enlaces Descarga", text_color=color1, + itemlist.append(item.clone(action="", title="Enlaces Descargas", text_color=color1, text_bold=True)) itemlist.extend(list_enlaces) @@ -344,12 +344,13 @@ def bloque_enlaces(data, filtro_idioma, dict_idiomas, tipo, item): title = " Mirror en " + server + " (" + language + ") (Calidad " + calidad.strip() + ")" if filtro_idioma == 3 or item.filtro: lista_enlaces.append(item.clone(title=title, action="play", server=server, text_color=color2, - url=scrapedurl, idioma=language, orden=orden)) + url=scrapedurl, idioma=language, orden=orden, language=language)) else: idioma = dict_idiomas[language] if idioma == filtro_idioma: lista_enlaces.append(item.clone(title=title, text_color=color2, action="play", - url=scrapedurl, server=server, idioma=language, orden=orden)) + url=scrapedurl, server=server, idioma=language, orden=orden, + language=language)) else: if language not in filtrados: filtrados.append(language) diff --git a/plugin.video.alfa/channels/vseries.json b/plugin.video.alfa/channels/vseries.json index 702417d1..3de8186b 100755 --- a/plugin.video.alfa/channels/vseries.json +++ b/plugin.video.alfa/channels/vseries.json @@ -3,7 +3,7 @@ "name": "V Serie", "active": false, "adult": false, - "language": "es", + "language": ["cast", "lat"], "banner": "vseries.png", "thumbnail": "vseries.png", "version": 1, diff --git a/plugin.video.alfa/channels/wopelis.json b/plugin.video.alfa/channels/wopelis.json index d017496e..dfe6ffbb 100755 --- a/plugin.video.alfa/channels/wopelis.json +++ b/plugin.video.alfa/channels/wopelis.json @@ -3,7 +3,7 @@ "name": "WoPelis", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "banner": "https://github.com/master-1970/resources/raw/master/images/bannermenu/wopelis.png", "fanart": "https://github.com/master-1970/resources/raw/master/images/fanart/wopelis.png", "thumbnail": "https://github.com/master-1970/resources/raw/master/images/squares/wopelis.png", diff --git a/plugin.video.alfa/channels/x18hentai.json b/plugin.video.alfa/channels/x18hentai.json index 4a03b57e..59e75360 100755 --- a/plugin.video.alfa/channels/x18hentai.json +++ b/plugin.video.alfa/channels/x18hentai.json @@ -3,7 +3,7 @@ "name": "18HentaiOnline", "active": true, "adult": true, - "language": "es", + "language": ["*"], "banner": "https://s32.postimg.org/lafs9vgxh/18hentaionline_banner.png", "thumbnail": "https://s32.postimg.org/fui7jdg9x/18hentaionline.png", "version": 1, diff --git a/plugin.video.alfa/channels/xdvideos.json b/plugin.video.alfa/channels/xdvideos.json index f85eca1d..50b5ce23 100755 --- a/plugin.video.alfa/channels/xdvideos.json +++ b/plugin.video.alfa/channels/xdvideos.json @@ -3,7 +3,7 @@ "name": "XDVideos", "active": true, "adult": false, - "language": "es", + "language": ["lat"], "thumbnail": "http://i.imgur.com/vKcZxXS.png", "version": 1, "changes": [ @@ -13,7 +13,6 @@ } ], "categories": [ - "tvshow", - "latino" + "tvshow" ] } \ No newline at end of file diff --git a/plugin.video.alfa/channels/xdvideos.py b/plugin.video.alfa/channels/xdvideos.py index c743960f..3e362671 100755 --- a/plugin.video.alfa/channels/xdvideos.py +++ b/plugin.video.alfa/channels/xdvideos.py @@ -11,6 +11,7 @@ from core.item import Item from platformcode import logger host = "http://xdvideos.org/" +hosts = "http://xdvideos.org/dragon-ball-super/" def mainlist(item): @@ -21,6 +22,8 @@ def mainlist(item): itemlist.append(Item(channel=item.channel, action="categorias", title="Categorias", url=host, thumbnail=thumb_series)) + itemlist.append(Item(channel=item.channel, action="episodios", title="Dragon Ball Super", url=hosts, + thumbnail=thumb_series)) return itemlist diff --git a/plugin.video.alfa/channels/xhamster.json b/plugin.video.alfa/channels/xhamster.json index 1958c90f..e2b31355 100755 --- a/plugin.video.alfa/channels/xhamster.json +++ b/plugin.video.alfa/channels/xhamster.json @@ -3,7 +3,7 @@ "name": "xhamster", "active": true, "adult": true, - "language": "es", + "language": ["*"], "banner": "xhamster.png", "thumbnail": "xhamster.png", "version": 1, diff --git a/plugin.video.alfa/channels/xtheatre.json b/plugin.video.alfa/channels/xtheatre.json index 16282d08..b3cbe0d3 100644 --- a/plugin.video.alfa/channels/xtheatre.json +++ b/plugin.video.alfa/channels/xtheatre.json @@ -3,7 +3,7 @@ "name": "xTheatre", "active": true, "adult": true, - "language": "es", + "language": ["*"], "fanart": "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/adults/xthearebg.jpg", "thumbnail": "https://xtheatre.net/wp-content/uploads/xtlogo.jpg", "banner": "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/adults/xthearebm.png", diff --git a/plugin.video.alfa/channels/yaske.json b/plugin.video.alfa/channels/yaske.json index c0d02237..de44f7df 100644 --- a/plugin.video.alfa/channels/yaske.json +++ b/plugin.video.alfa/channels/yaske.json @@ -3,7 +3,7 @@ "name": "Yaske", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "banner": "yaske.png", "fanart": "https://github.com/master-1970/resources/raw/master/images/fanart/yaske.png", "thumbnail": "yaske.png", @@ -43,11 +43,18 @@ } ], "categories": [ - "latino", "direct", "movie" ], "settings": [ + { + "id": "include_in_global_search", + "type": "bool", + "label": "Incluir en busqueda global", + "default": true, + "enabled": true, + "visible": true + }, { "id": "include_in_newest_peliculas", "type": "bool", diff --git a/plugin.video.alfa/channels/yaske.py b/plugin.video.alfa/channels/yaske.py index 22942b9e..74024bc4 100644 --- a/plugin.video.alfa/channels/yaske.py +++ b/plugin.video.alfa/channels/yaske.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- -import base64 import re from core import channeltools from core import httptools from core import scrapertoolsV2 +from core import scrapertools from core import servertools from core import tmdb from core.item import Item @@ -27,22 +27,13 @@ def mainlist(item): thumbnail = "https://raw.githubusercontent.com/master-1970/resources/master/images/genres/4/verdes/%s.png" itemlist.append(item.clone(title="Novedades", action="peliculas", text_bold=True, viewcontent='movies', - url=HOST + "/ultimas-y-actualizadas", + url=HOST, thumbnail=thumbnail % 'novedades', viewmode="movie_with_plot")) itemlist.append(item.clone(title="Estrenos", action="peliculas", text_bold=True, - url=HOST + "/genre/premieres", thumbnail=thumbnail % 'estrenos')) - itemlist.append(item.clone(title="", folder=False)) - - itemlist.append(Item(channel=item.channel, title="Filtrar por:", fanart=fanart_host, folder=False, - text_color=color3, text_bold=True, thumbnail=thumbnail_host)) - itemlist.append(item.clone(title=" Género", action="menu_buscar_contenido", text_color=color1, text_italic=True, - extra="genre", thumbnail=thumbnail % 'generos', viewmode="thumbnails")) - itemlist.append(item.clone(title=" Idioma", action="menu_buscar_contenido", text_color=color1, text_italic=True, - extra="audio", thumbnail=thumbnail % 'idiomas')) - itemlist.append(item.clone(title=" Calidad", action="menu_buscar_contenido", text_color=color1, text_italic=True, - extra="quality", thumbnail=thumbnail % 'calidad')) - itemlist.append(item.clone(title=" Año", action="menu_buscar_contenido", text_color=color1, text_italic=True, - extra="year", thumbnail=thumbnail % 'year')) + url=HOST + "/premiere", thumbnail=thumbnail % 'estrenos')) + itemlist.append(item.clone(title="Género", action="menu_buscar_contenido", text_bold=True,thumbnail=thumbnail % 'generos', viewmode="thumbnails", + url=HOST + )) itemlist.append(item.clone(title="", folder=False)) itemlist.append(item.clone(title="Buscar por título", action="search", thumbnail=thumbnail % 'buscar')) @@ -55,8 +46,7 @@ def search(item, texto): itemlist = [] try: - # http://www.yaske.ro/search/?q=los+pitufos - item.url = HOST + "/search/?q=" + texto.replace(' ', '+') + item.url = HOST + "/search/?query=" + texto.replace(' ', '+') item.extra = "" itemlist.extend(peliculas(item)) if itemlist[-1].title == ">> Página siguiente": @@ -80,9 +70,9 @@ def newest(categoria): item = Item() try: if categoria == 'peliculas': - item.url = HOST + "/ultimas-y-actualizadas" + item.url = HOST elif categoria == 'infantiles': - item.url = HOST + "/search/?q=&genre%5B%5D=animation" + item.url = HOST + "/genre/16/" else: return [] @@ -103,59 +93,46 @@ def newest(categoria): def peliculas(item): logger.info() itemlist = [] - url_next_page = "" data = httptools.downloadpage(item.url).data data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - patron = '<article class.*?' - patron += '<a href="([^"]+)">.*?' - patron += '<img src="([^"]+)".*?' - patron += '<aside class="item-control down">(.*?)</aside>.*?' - patron += '<small class="pull-right text-muted">([^<]+)</small>.*?' - patron += '<h2 class.*?>([^<]+)</h2>' + patron = 'class="post-item-image btn-play-item".*?' + patron += 'href="([^"]+)">.*?' + patron += '<img data-original="([^"]+)".*?' + patron += 'glyphicon-calendar"></i>([^<]+).*?' + patron += 'post-item-flags"> (.*?)</div.*?' + patron += 'text-muted f-14">(.*?)</h3' - matches = re.compile(patron, re.DOTALL).findall(data) + matches = scrapertools.find_multiple_matches(data, patron) - # Paginacion - if item.next_page != 'b': - if len(matches) > 30: - url_next_page = item.url - matches = matches[:30] - next_page = 'b' - else: - matches = matches[30:] - next_page = 'a' - patron_next_page = 'Anteriores</a> <a href="([^"]+)" class="btn btn-default ".*?Siguiente' - matches_next_page = re.compile(patron_next_page, re.DOTALL).findall(data) - if len(matches_next_page) > 0: - url_next_page = matches_next_page[0] - - for scrapedurl, scrapedthumbnail, idiomas, year, scrapedtitle in matches: - patronidiomas = "<img src='([^']+)'" - matchesidiomas = re.compile(patronidiomas, re.DOTALL).findall(idiomas) + patron_next_page = 'href="([^"]+)"> »' + matches_next_page = scrapertools.find_single_match(data, patron_next_page) + if len(matches_next_page) > 0: + url_next_page = item.url + matches_next_page + for scrapedurl, scrapedthumbnail, year, idiomas, scrapedtitle in matches: + year = year.strip() + patronidiomas = '<img src="([^"]+)"' + matchesidiomas = scrapertools.find_multiple_matches(idiomas, patronidiomas) idiomas_disponibles = [] for idioma in matchesidiomas: - if idioma.endswith("la_la.png"): + if idioma.endswith("/la.png"): idiomas_disponibles.append("LAT") - elif idioma.endswith("en_en.png"): + elif idioma.endswith("/en.png"): idiomas_disponibles.append("VO") - elif idioma.endswith("en_es.png"): + elif idioma.endswith("/en_es.png"): idiomas_disponibles.append("VOSE") - elif idioma.endswith("es_es.png"): + elif idioma.endswith("/es.png"): idiomas_disponibles.append("ESP") if idiomas_disponibles: idiomas_disponibles = "[" + "/".join(idiomas_disponibles) + "]" - - contentTitle = scrapertoolsV2.decodeHtmlentities(scrapedtitle.strip()) + contentTitle = scrapertoolsV2.htmlclean(scrapedtitle.strip()) title = "%s %s" % (contentTitle, idiomas_disponibles) - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=scrapedurl, thumbnail=scrapedthumbnail, contentTitle=contentTitle, infoLabels={"year": year}, text_color=color1)) - # Obtenemos los datos basicos de todas las peliculas mediante multihilos tmdb.set_infoLabels(itemlist) @@ -163,48 +140,32 @@ def peliculas(item): if url_next_page: itemlist.append( Item(channel=item.channel, action="peliculas", title=">> Página siguiente", thumbnail=thumbnail_host, - url=url_next_page, next_page=next_page, folder=True, text_color=color3, text_bold=True)) + url=url_next_page, folder=True, text_color=color3, text_bold=True)) return itemlist def menu_buscar_contenido(item): logger.info(item) + itemlist = [] data = httptools.downloadpage(item.url).data - patron = '<select name="' + item.extra + '(.*?)</select>' - data = scrapertoolsV2.get_match(data, patron) - + patron = 'Generos.*?</ul>' + data = scrapertools.find_single_match(data, patron) # Extrae las entradas - patron = "<option value='([^']+)'>([^<]+)</option>" - matches = re.compile(patron, re.DOTALL).findall(data) - - itemlist = [] - for scrapedvalue, scrapedtitle in matches: - thumbnail = "" - - if item.extra == 'genre': - if scrapedtitle.strip() in ['Documental', 'Short', 'News']: - continue - - url = HOST + "/search/?q=&genre%5B%5D=" + scrapedvalue - filename = scrapedtitle.lower().replace(' ', '%20') - if filename == "ciencia%20ficción": - filename = "ciencia%20ficcion" - thumbnail = "https://raw.githubusercontent.com/master-1970/resources/master/images/genres/4/verdes/%s.png" \ - % filename - - elif item.extra == 'year': - url = HOST + "/search/?q=&year=" + scrapedvalue - thumbnail = item.thumbnail - else: - # http://www.yaske.ro/search/?q=&quality%5B%5D=c9 - # http://www.yaske.ro/search/?q=&audio%5B%5D=es - url = HOST + "/search/?q=&" + item.extra + "%5B%5D=" + scrapedvalue - thumbnail = item.thumbnail - - itemlist.append(Item(channel=item.channel, action="peliculas", title=scrapedtitle, url=url, text_color=color1, - thumbnail=thumbnail, contentType='movie', folder=True, viewmode="movie_with_plot")) + patron = 'href="([^"]+)">([^<]+)' + matches = scrapertools.find_multiple_matches(data, patron) + for scrapedurl, scrapedtitle in matches: + url = HOST + scrapedurl + itemlist.append(Item(channel = item.channel, + action = "peliculas", + title = scrapedtitle, + url = url, + text_color = color1, + contentType = 'movie', + folder = True, + viewmode = "movie_with_plot" + )) if item.extra in ['genre', 'audio', 'year']: return sorted(itemlist, key=lambda i: i.title.lower(), reverse=item.extra == 'year') @@ -214,29 +175,28 @@ def menu_buscar_contenido(item): def findvideos(item): logger.info() - itemlist = list() - sublist = list() + itemlist = [] + sublist = [] # Descarga la página - data = httptools.downloadpage(item.url).data - + url = "http://widget.olimpo.link/playlist/?tmdb=" + scrapertools.find_single_match(item.url, 'yaske.ro/([0-9]+)') + data = httptools.downloadpage(url).data if not item.plot: item.plot = scrapertoolsV2.find_single_match(data, '>Sinopsis</dt> <dd>([^<]+)</dd>') item.plot = scrapertoolsV2.decodeHtmlentities(item.plot) - patron = '<option value="([^"]+)"[^>]+' - patron += '>([^<]+).*?</i>([^<]+)' - matches = re.compile(patron, re.DOTALL).findall(data) + patron = '(/embed/[^"]+).*?' + patron += 'quality text-overflow ">([^<]+).*?' + patron += 'title="([^"]+)' + matches = scrapertools.find_multiple_matches(data, patron) - for url, idioma, calidad in matches: - if 'yaske' in url: + for url, calidad, idioma in matches: + if 'embed' in url: + url = "http://widget.olimpo.link" + url data = httptools.downloadpage(url).data - url_enc = scrapertoolsV2.find_single_match(data, "eval.*?'(.*?)'") - url_dec = base64.b64decode(url_enc) - url = scrapertoolsV2.find_single_match(url_dec, 'iframe src="(.*?)"') - sublist.append(item.clone(action="play", url=url, folder=False, text_color=color1, quality=calidad.strip(), + url = scrapertools.find_single_match(data, 'iframe src="([^"]+)') + sublist.append(item.clone(channel=item.channel, action="play", url=url, folder=False, text_color=color1, quality=calidad.strip(), language=idioma.strip())) - sublist = servertools.get_servers_itemlist(sublist, lambda i: "Ver en %s %s" % (i.server, i.quality), True) # Añadir servidores encontrados, agrupandolos por idioma diff --git a/plugin.video.alfa/channels/yespornplease.json b/plugin.video.alfa/channels/yespornplease.json new file mode 100644 index 00000000..674d0d1c --- /dev/null +++ b/plugin.video.alfa/channels/yespornplease.json @@ -0,0 +1,29 @@ +{ + "id": "yespornplease", + "name": "YesPornPlease", + "active": true, + "adult": true, + "language": ["*"], + "thumbnail": "yespornplease.png", + "banner": "yespornplease.png", + "version": 1, + "changes": [ + { + "date": "27/08/2017", + "description": "Canal creado" + } + ], + "categories": [ + "adult" + ], + "settings": [ + { + "id": "include_in_global_search", + "type": "bool", + "label": "Incluir en busqueda global", + "default": true, + "enabled": true, + "visible": true + } + ] +} \ No newline at end of file diff --git a/plugin.video.alfa/channels/yespornplease.py b/plugin.video.alfa/channels/yespornplease.py new file mode 100644 index 00000000..015bf1d1 --- /dev/null +++ b/plugin.video.alfa/channels/yespornplease.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- + +import re + +from core import httptools +from core.item import Item +from platformcode import logger +from urlparse import urljoin +from core import servertools + + +HOST="http://yespornplease.com" + +def mainlist(item): + logger.info() + itemlist = [] + itemlist.append(item.clone(action="links", title="Novedades", url=HOST)) + itemlist.append(item.clone(action="categories", title="Categorías", url=urljoin(HOST, "categories"))) + itemlist.append(item.clone(action="search", title="Buscar", url=urljoin(HOST, "search"))) + return itemlist + + +def search(item, texto): + logger.info("texto = %s" %(texto)) + + item.url = urljoin(HOST, "search&q=" + texto) + try: + return links(item) + # Se captura la excepción, para no interrumpir al buscador global si un canal falla + except: + import sys + for line in sys.exc_info(): + logger.error("%s" % line) + return [] + +def categories(item): + logger.info() + data = httptools.downloadpage(item.url).data + + result = [] + + categories = re.findall("href=[\"'](?P<url>/search[^\"']+).*?>(?P<name>[^<>]+)</div>.*?badge[^>]+>(?P<counter>\d+)", data, re.DOTALL | re.MULTILINE) + for url, name, counter in categories: + result.append(item.clone(action = "links", title = "%s (%s videos)" % (name, counter), url = urljoin(item.url, url))) + + return result + +def get_page(url): + page = re.search("p=(\d+)", url) + if page: + return int(page.group(1)) + return 1 + +def get_page_url(url, page): + logger.debug("URL: %s to page %d" % (url, page)) + resultURL = re.sub("([&\?]p=)(?:\d+)", "\g<1>%d" % page, url) + if resultURL == url: + resultURL += ("&" if "?" in url else "?") + "p=%d" % (page) + + logger.debug("Result: %s" % (resultURL)) + return resultURL + + +def links(item): + logger.info() + data = httptools.downloadpage(item.url).data + + reExpr = "<img\s+src=['\"](?P<img>[^'\"]+)[^>]+title[^'\"]*['\"](?P<title>[^\"]+)[^>]+id[^'\"]*['\"](?P<id>[^'\"]+)[^>]*>(?:[^<]*<[^>]+>(?P<quality>[^<]+)<)?[^<]*<[^>]*duration[^>]*>(?P<duration>[^<]+)" + reResults = re.findall(reExpr, data, re.MULTILINE | re.DOTALL) + result = [] + + for img, title, vID, quality, duration in reResults: + logger.info("[link] %(title)s [%(quality)s] [%(duration)s]: %(vid)s (%(img)s" % ({"title": title, "duration": duration, "vid": vID, "img": img, "quality": quality if quality else "--"})) + + formattedQuality = "" + if quality: + formattedQuality += " [%s]" % (quality) + + titleFormatted = "%(title)s%(quality)s [%(duration)s]" % ({"title": title, "quality": formattedQuality, "duration": duration}) + result.append(item.clone(action = "play", title = titleFormatted, url = urljoin(item.url, "/view/%s" % (vID)), thumbnail = urljoin(item.url, img), vID = vID)) + + # Has pagination + paginationOccurences = data.count('class="prevnext"') + if paginationOccurences: + page = get_page(item.url) + logger.info("Page " + str(page) + " Ocurrences: " + str(paginationOccurences)) + if page > 1: + result.append(item.clone(action = "links", title = "<< Anterior", url = get_page_url(item.url, page - 1))) + + if paginationOccurences > 1 or page == 1: + result.append(item.clone(action = "links", title = "Siguiente >>", url = get_page_url(item.url, page + 1))) + + + return result + +def play(item): + logger.info(item) + embededURL = urljoin(item.url, "/e/%s/width-650/height-400/autoplay-0/" % (item.vID)) + itemlist = servertools.find_video_items(item.clone(url = embededURL)) + return itemlist diff --git a/plugin.video.alfa/channels/zentorrents.json b/plugin.video.alfa/channels/zentorrents.json index aefc1bad..163d220d 100755 --- a/plugin.video.alfa/channels/zentorrents.json +++ b/plugin.video.alfa/channels/zentorrents.json @@ -3,7 +3,7 @@ "name": "Zentorrent", "active": true, "adult": false, - "language": "es", + "language": ["cast"], "banner": "zentorrents.png", "thumbnail": "http://s6.postimg.org/9zv90yjip/zentorrentlogo.jpg", "version": 1, diff --git a/plugin.video.alfa/channels/zpeliculas.json b/plugin.video.alfa/channels/zpeliculas.json index 41ad30c6..8478ece5 100755 --- a/plugin.video.alfa/channels/zpeliculas.json +++ b/plugin.video.alfa/channels/zpeliculas.json @@ -3,7 +3,7 @@ "name": "Zpeliculas", "active": true, "adult": false, - "language": "es", + "language": ["cast", "lat"], "banner": "zpeliculas.png", "thumbnail": "zpeliculas.png", "version": 1, diff --git a/plugin.video.alfa/channelselector.py b/plugin.video.alfa/channelselector.py index 8c791b81..5ba3619a 100644 --- a/plugin.video.alfa/channelselector.py +++ b/plugin.video.alfa/channelselector.py @@ -61,17 +61,17 @@ def getchanneltypes(view="thumb_"): logger.info() # Lista de categorias - channel_types = ["movie", "tvshow", "anime", "documentary", "vos", "direct", "torrent", "latino"] + channel_types = ["movie", "tvshow", "anime", "documentary", "vos", "direct", "torrent"] dict_types_lang = {'movie': config.get_localized_string(30122), 'tvshow': config.get_localized_string(30123), 'anime': config.get_localized_string(30124), 'documentary': config.get_localized_string(30125), 'vos': config.get_localized_string(30136), 'adult': config.get_localized_string(30126), - 'latino': config.get_localized_string(30127), 'direct': config.get_localized_string(30137)} + 'direct': config.get_localized_string(30137)} if config.get_setting("adult_mode") != 0: channel_types.append("adult") - channel_language = config.get_setting("channel_language") - logger.info("channel_language=" + channel_language) + channel_language = config.get_setting("channel_language", default="all") + logger.info("channel_language=%s" % channel_language) # Ahora construye el itemlist ordenadamente itemlist = list() @@ -81,11 +81,11 @@ def getchanneltypes(view="thumb_"): viewmode="thumbnails")) for channel_type in channel_types: - logger.info("channel_type=" + channel_type) + logger.info("channel_type=%s" % channel_type) title = dict_types_lang.get(channel_type, channel_type) itemlist.append(Item(title=title, channel="channelselector", action="filterchannels", category=title, channel_type=channel_type, viewmode="thumbnails", - thumbnail=get_thumb("channels_" + channel_type + ".png", view))) + thumbnail=get_thumb("channels_%s.png" % channel_type, view))) return itemlist @@ -103,19 +103,16 @@ def filterchannels(category, view="thumb_"): # Lee la lista de canales channel_path = os.path.join(config.get_runtime_path(), "channels", '*.json') - logger.info("channel_path=" + channel_path) + logger.info("channel_path=%s" % channel_path) channel_files = glob.glob(channel_path) - logger.info("channel_files encontrados " + str(len(channel_files))) + logger.info("channel_files encontrados %s" % (len(channel_files))) - channel_language = config.get_setting("channel_language") - logger.info("channel_language=" + channel_language) - if channel_language == "": - channel_language = "all" - logger.info("channel_language=" + channel_language) + channel_language = config.get_setting("channel_language", default="all") + logger.info("channel_language=%s" % channel_language) for channel_path in channel_files: - logger.info("channel=" + channel_path) + logger.info("channel=%s" % channel_path) channel = os.path.basename(channel_path).replace(".json", "") @@ -129,7 +126,7 @@ def filterchannels(category, view="thumb_"): # Si no es un canal lo saltamos if not channel_parameters["channel"]: continue - logger.info("channel_parameters=" + repr(channel_parameters)) + logger.info("channel_parameters=%s" % repr(channel_parameters)) # Si prefiere el banner y el canal lo tiene, cambia ahora de idea if view == "banner_" and "banner" in channel_parameters: @@ -159,8 +156,11 @@ def filterchannels(category, view="thumb_"): continue # Se salta el canal si está en un idioma filtrado - if channel_language != "all" \ - and channel_parameters["language"] != config.get_setting("channel_language"): + # Se muestran todos los canales si se elige "all" en el filtrado de idioma + # Se muestran sólo los idiomas filtrados, cast o lat + # Los canales de adultos se mostrarán siempre que estén activos + if channel_language != "all" and channel_language not in channel_parameters["language"] \ + and "*" not in channel_parameters["language"]: continue # Se salta el canal si está en una categoria filtrado @@ -181,7 +181,7 @@ def filterchannels(category, view="thumb_"): version=channel_parameters["version"], context=context)) except: - logger.error("Se ha producido un error al leer los datos del canal " + channel) + logger.error("Se ha producido un error al leer los datos del canal '%s'" % channel) import traceback logger.error(traceback.format_exc()) diff --git a/plugin.video.alfa/core/channeltools.py b/plugin.video.alfa/core/channeltools.py index 98235c24..967ce790 100755 --- a/plugin.video.alfa/core/channeltools.py +++ b/plugin.video.alfa/core/channeltools.py @@ -38,7 +38,7 @@ def get_channel_parameters(channel_name): # si no existe el key se declaran valor por defecto para que no de fallos en las funciones que lo llaman channel_parameters["update_url"] = channel_parameters.get("update_url", DEFAULT_UPDATE_URL) - channel_parameters["language"] = channel_parameters.get("language", "all") + channel_parameters["language"] = channel_parameters.get("language", ["all"]) channel_parameters["adult"] = channel_parameters.get("adult", False) channel_parameters["active"] = channel_parameters.get("active", False) channel_parameters["include_in_global_search"] = channel_parameters.get("include_in_global_search", diff --git a/plugin.video.alfa/core/scrapertools.py b/plugin.video.alfa/core/scrapertools.py index dccc692e..86b97cb5 100755 --- a/plugin.video.alfa/core/scrapertools.py +++ b/plugin.video.alfa/core/scrapertools.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- # -------------------------------------------------------------------------------- # Scraper tools for reading and processing web elements # -------------------------------------------------------------------------------- @@ -214,6 +214,7 @@ def htmlclean(cadena): cadena = cadena.replace("<tr>", "") cadena = cadena.replace("</tr>", "") cadena = cadena.replace("<![CDATA[", "") + cadena = cadena.replace("<wbr>", "") cadena = cadena.replace("<Br />", " ") cadena = cadena.replace("<BR />", " ") cadena = cadena.replace("<Br>", " ") diff --git a/plugin.video.alfa/core/scrapertoolsV2.py b/plugin.video.alfa/core/scrapertoolsV2.py index fffa278a..dd9e1b14 100755 --- a/plugin.video.alfa/core/scrapertoolsV2.py +++ b/plugin.video.alfa/core/scrapertoolsV2.py @@ -81,6 +81,7 @@ def htmlclean(cadena): cadena = cadena.replace("<tr>", "") cadena = cadena.replace("</tr>", "") cadena = cadena.replace("<![CDATA[", "") + cadena = cadena.replace("<wbr>", "") cadena = cadena.replace("<Br />", " ") cadena = cadena.replace("<BR />", " ") cadena = cadena.replace("<Br>", " ") diff --git a/plugin.video.alfa/core/tvdb.py b/plugin.video.alfa/core/tvdb.py index cbf3aa7e..8de73e71 100755 --- a/plugin.video.alfa/core/tvdb.py +++ b/plugin.video.alfa/core/tvdb.py @@ -350,7 +350,7 @@ class Tvdb: if not self.list_results and config.get_setting("tvdb_retry_eng", "videolibrary"): from platformcode import platformtools platformtools.dialog_notification("No se ha encontrado en idioma '%s'" % DEFAULT_LANG, - "Se busca en idioma 'en'") + "Se busca en idioma 'en'", sound=False) self.__get_by_id(kwargs.get('tvdb_id', ''), "en") self.lang = "en" diff --git a/plugin.video.alfa/platformcode/keymaptools.py b/plugin.video.alfa/platformcode/keymaptools.py new file mode 100644 index 00000000..5d6ecbf2 --- /dev/null +++ b/plugin.video.alfa/platformcode/keymaptools.py @@ -0,0 +1,173 @@ +# -*- coding: utf-8 -*- + +from threading import Timer + +import xbmc +import xbmcaddon +import xbmcgui +from core import filetools +from platformcode import config + + +class KeyListener(xbmcgui.WindowXMLDialog): + TIMEOUT = 10 + + def __new__(cls): + gui_api = tuple(map(int, xbmcaddon.Addon('xbmc.gui').getAddonInfo('version').split('.'))) + if gui_api >= (5, 11, 0): + filenname = "DialogNotification.xml" + else: + filenname = "DialogKaiToast.xml" + return super(KeyListener, cls).__new__(cls, filenname, "") + + def __init__(self): + self.key = None + + def onInit(self): + try: + self.getControl(401).addLabel("Presiona la tecla a usar para abrir la ventana") + self.getControl(402).addLabel("Tienes %s segundos" % self.TIMEOUT) + except AttributeError: + self.getControl(401).setLabel("Presiona la tecla a usar para abrir la ventana") + self.getControl(402).setLabel("Tienes %s segundos" % self.TIMEOUT) + + def onAction(self, action): + code = action.getButtonCode() + if code == 0: + self.key = None + else: + self.key = str(code) + self.close() + + @staticmethod + def record_key(): + dialog = KeyListener() + timeout = Timer(KeyListener.TIMEOUT, dialog.close) + timeout.start() + dialog.doModal() + timeout.cancel() + key = dialog.key + del dialog + return key + + +def set_key(): + saved_key = config.get_setting("shortcut_key") + new_key = KeyListener().record_key() + + if new_key and saved_key != new_key: + from core import filetools + from platformcode import platformtools + import xbmc + file_xml = "special://profile/keymaps/alfa.xml" + data = '<keymap><global><keyboard><key id="%s">' % new_key + 'runplugin(plugin://' \ + 'plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAia2V5bWFwIiwNCiAgICAib3BlbiI6IHRydWUNCn0=)</key></keyboard></global></keymap>' + filetools.write(xbmc.translatePath(file_xml), data) + platformtools.dialog_notification("Tecla guardada", "Reinicia Kodi para que se apliquen los cambios") + + config.set_setting("shortcut_key", new_key) + # file_idioma = filetools.join(config.get_runtime_path(), 'resources', 'language', 'Spanish', 'strings.xml') + # data = filetools.read(file_idioma) + # value_xml = scrapertools.find_single_match(data, '<string id="31100">([^<]+)<') + # if "tecla" in value_xml: + # data = data.replace(value_xml, 'Cambiar tecla/botón para abrir la ventana (Guardada: %s)' % new_key) + # elif "key" in value_xml: + # data = data.replace(value_xml, 'Change key/button to open the window (Saved: %s)' % new_key) + # else: + # data = data.replace(value_xml, + # 'Cambiamento di chiave/pulsante per aprire la finestra (Salvato: %s)' % new_key) + # filetools.write(file_idioma, data) + + return + + +MAIN_MENU = { + "news": {"label": "Novedades", + "icon": filetools.join(config.get_runtime_path(), "resources", "media", "general", "default", + "thumb_news.png"), "order": 0}, + "channels": {"label": "Canales", + "icon": filetools.join(config.get_runtime_path(), "resources", "media", "general", "default", + "thumb_channels.png"), "order": 1}, + "search": {"label": "Buscador", + "icon": filetools.join(config.get_runtime_path(), "resources", "media", "general", "default", + "thumb_search.png"), "order": 2}, + "favorites": {"label": "Favoritos", + "icon": filetools.join(config.get_runtime_path(), "resources", "media", "general", "default", + "thumb_favorites.png"), "order": 3}, + "videolibrary": {"label": "Videoteca", + "icon": filetools.join(config.get_runtime_path(), "resources", "media", "general", "default", + "thumb_videolibrary.png"), "order": 4}, + "downloads": {"label": "Descargas", + "icon": filetools.join(config.get_runtime_path(), "resources", "media", "general", "default", + "thumb_downloads.png"), "order": 5}, + "settings": {"label": "Configuración", + "icon": filetools.join(config.get_runtime_path(), "resources", "media", "general", "default", + "thumb_setting_0.png"), "order": 6}, +} + + +class Main(xbmcgui.WindowXMLDialog): + def __init__(self, *args, **kwargs): + self.items = [] + + def onInit(self): + self.setCoordinateResolution(2) + + for menuentry in MAIN_MENU.keys(): + item = xbmcgui.ListItem(MAIN_MENU[menuentry]["label"]) + item.setProperty("thumb", str(MAIN_MENU[menuentry]["icon"])) + item.setProperty("identifier", str(menuentry)) + item.setProperty("order", str(MAIN_MENU[menuentry]["order"])) + self.items.append(item) + + self.items.sort(key=lambda it: it.getProperty("order")) + self.getControl(32500).addItems(self.items) + self.setFocusId(32500) + + def onClick(self, control_id): + if control_id == 32500: + identifier = self.getControl(32500).getSelectedItem().getProperty("identifier") + if identifier == "news": + xbmc.executebuiltin('Dialog.Close(all,true)') + xbmc.executebuiltin( + 'ActivateWindow(10025, "plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJuZXdzIg0KfQ==")') + elif identifier == "channels": + xbmc.executebuiltin('Dialog.Close(all,true)') + xbmc.executebuiltin( + 'ActivateWindow(10025, "plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAiZ2V0Y2hhbm5lbHR5cGVzIiwgDQogICAgImNoYW5uZWwiOiAiY2hhbm5lbHNlbGVjdG9yIg0KfQ==")') + elif identifier == "search": + xbmc.executebuiltin('Dialog.Close(all,true)') + xbmc.executebuiltin( + 'ActivateWindow(10025, "plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJzZWFyY2giDQp9")') + elif identifier == "favorites": + xbmc.executebuiltin('Dialog.Close(all,true)') + xbmc.executebuiltin( + 'ActivateWindow(10025, "plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJmYXZvcml0ZXMiDQp9")') + elif identifier == "videolibrary": + xbmc.executebuiltin('Dialog.Close(all,true)') + xbmc.executebuiltin( + 'ActivateWindow(10025, "plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJ2aWRlb2xpYnJhcnkiDQp9")') + elif identifier == "downloads": + xbmc.executebuiltin('Dialog.Close(all,true)') + xbmc.executebuiltin( + 'ActivateWindow(10025, "plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJkb3dubG9hZHMiDQp9")') + elif identifier == "settings": + xbmc.executebuiltin('Dialog.Close(all,true)') + xbmc.executebuiltin( + 'ActivateWindow(10025, "plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJzZXR0aW5nIg0KfQ==")') + + + def onAction(self, action): + # exit + if action.getId() in [xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK]: + # main.close() + xbmc.executebuiltin('Dialog.Close(all,true)') + + if action.getId() == xbmcgui.ACTION_CONTEXT_MENU: + config.open_settings() + + +def open_shortcut_menu(): + main = Main('ShortCutMenu.xml', config.get_runtime_path()) + main.doModal() + del main diff --git a/plugin.video.alfa/platformcode/launcher.py b/plugin.video.alfa/platformcode/launcher.py index 763a44e4..22c0da65 100755 --- a/plugin.video.alfa/platformcode/launcher.py +++ b/plugin.video.alfa/platformcode/launcher.py @@ -42,14 +42,13 @@ def run(item=None): logger.info(item.tostring()) try: - # If item has no action, stops here if item.action == "": logger.info("Item sin accion") return # Action for main menu in channelselector - if item.action == "getmainlist": + elif item.action == "getmainlist": import channelselector # # Check for updates only on first screen @@ -121,6 +120,13 @@ def run(item=None): play_from_library(item) return + elif item.action == "keymap": + from platformcode import keymaptools + if item.open: + return keymaptools.open_shortcut_menu() + else: + return keymaptools.set_key() + # Action in certain channel specified in "action" and "channel" parameters else: diff --git a/plugin.video.alfa/platformcode/platformtools.py b/plugin.video.alfa/platformcode/platformtools.py index 61e6f7b7..36209879 100644 --- a/plugin.video.alfa/platformcode/platformtools.py +++ b/plugin.video.alfa/platformcode/platformtools.py @@ -131,17 +131,26 @@ def render_items(itemlist, parent_item): else: icon_image = "DefaultVideo.png" - # Creamos el listitem - listitem = xbmcgui.ListItem(item.title, iconImage=icon_image, thumbnailImage=item.thumbnail) - # Ponemos el fanart if item.fanart: - listitem.setProperty('fanart_image', item.fanart) + fanart = item.fanart else: - listitem.setProperty('fanart_image', os.path.join(config.get_runtime_path(), "fanart.jpg")) + fanart = os.path.join(config.get_runtime_path(), "fanart.jpg") - # TODO: ¿Se puede eliminar esta linea? yo no he visto que haga ningun efecto. - xbmcplugin.setPluginFanart(int(sys.argv[1]), os.path.join(config.get_runtime_path(), "fanart.jpg")) + # Creamos el listitem + listitem = xbmcgui.ListItem(item.title) + + # values icon, thumb or poster are skin dependent.. so we set all to avoid problems + # if not exists thumb it's used icon value + if config.get_platform(True)['num_version'] >= 16.0: + listitem.setArt({'icon': icon_image, 'thumb': item.thumbnail, 'poster': item.thumbnail, 'fanart': fanart}) + else: + listitem.setIconImage(icon_image) + listitem.setThumbnailImage(item.thumbnail) + listitem.setProperty('fanart_image', fanart) + + # No need it, use fanart instead + # xbmcplugin.setPluginFanart(int(sys.argv[1]), os.path.join(config.get_runtime_path(), "fanart.jpg")) # Esta opcion es para poder utilizar el xbmcplugin.setResolvedUrl() # if item.isPlayable == True or (config.get_setting("player_mode") == 1 and item.action == "play"): @@ -157,7 +166,10 @@ def render_items(itemlist, parent_item): context_commands = set_context_commands(item, parent_item) # Añadimos el item - listitem.addContextMenuItems(context_commands, replaceItems=True) + if config.get_platform(True)['num_version'] >= 17.0: + listitem.addContextMenuItems(context_commands) + else: + listitem.addContextMenuItems(context_commands, replaceItems=True) if not item.totalItems: item.totalItems = 0 @@ -166,7 +178,7 @@ def render_items(itemlist, parent_item): totalItems=item.totalItems) # Fijar los tipos de vistas... - if config.get_setting("forceview") == True: + if config.get_setting("forceview"): # ...forzamos segun el viewcontent xbmcplugin.setContent(int(sys.argv[1]), parent_item.viewcontent) # logger.debug(parent_item) @@ -184,7 +196,7 @@ def render_items(itemlist, parent_item): xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) # Fijar la vista - if config.get_setting("forceview") == True: + if config.get_setting("forceview"): viewmode_id = get_viewmode_id(parent_item) xbmc.executebuiltin("Container.SetViewMode(%s)" % viewmode_id) @@ -256,10 +268,6 @@ def set_infolabels(listitem, item, player=False): elif not player: listitem.setInfo("video", {"Title": item.title}) - # Añadido para Kodi Krypton (v17) - if config.get_platform(True)['num_version'] >= 17.0: - listitem.setArt({"poster": item.thumbnail}) - def set_context_commands(item, parent_item): """ @@ -452,13 +460,18 @@ def is_playing(): return xbmc.Player().isPlaying() -def play_video(item, strm=False): +def play_video(item, strm=False, force_direct=False): logger.info() # logger.debug(item.tostring('\n')) if item.channel == 'downloads': logger.info("Reproducir video local: %s [%s]" % (item.title, item.url)) - xlistitem = xbmcgui.ListItem(path=item.url, thumbnailImage=item.thumbnail) + xlistitem = xbmcgui.ListItem(path=item.url) + if config.get_platform(True)['num_version'] >= 16.0: + xlistitem.setArt({"thumb": item.thumbnail}) + else: + xlistitem.setThumbnailImage(item.thumbnail) + set_infolabels(xlistitem, item, True) xbmc.Player().play(item.url, xlistitem) return @@ -491,9 +504,16 @@ def play_video(item, strm=False): # se obtiene la información del video. if not item.contentThumbnail: - xlistitem = xbmcgui.ListItem(path=mediaurl, thumbnailImage=item.thumbnail) + thumb = item.thumbnail else: - xlistitem = xbmcgui.ListItem(path=mediaurl, thumbnailImage=item.contentThumbnail) + thumb = item.contentThumbnail + + xlistitem = xbmcgui.ListItem(path=item.url) + if config.get_platform(True)['num_version'] >= 16.0: + xlistitem.setArt({"thumb": thumb}) + else: + xlistitem.setThumbnailImage(thumb) + set_infolabels(xlistitem, item, True) # si se trata de un vídeo en formato mpd, se configura el listitem para reproducirlo @@ -503,7 +523,17 @@ def play_video(item, strm=False): xlistitem.setProperty('inputstream.adaptive.manifest_type', 'mpd') # se lanza el reproductor - set_player(item, xlistitem, mediaurl, view, strm) + if force_direct: # cuando viene de una ventana y no directamente de la base del addon + # Añadimos el listitem a una lista de reproducción (playlist) + playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) + playlist.clear() + playlist.add(mediaurl, xlistitem) + + # Reproduce + xbmc_player = xbmc.Player() + xbmc_player.play(playlist, xlistitem) + else: + set_player(item, xlistitem, mediaurl, view, strm) def stop_video(): @@ -685,7 +715,14 @@ def set_opcion(item, seleccion, opciones, video_urls): if seleccion == -1: # Para evitar el error "Uno o más elementos fallaron" al cancelar la selección desde fichero strm - listitem = xbmcgui.ListItem(item.title, iconImage="DefaultVideo.png", thumbnailImage=item.thumbnail) + listitem = xbmcgui.ListItem(item.title) + + if config.get_platform(True)['num_version'] >= 16.0: + listitem.setArt({'icon':"DefaultVideo.png", 'thumb': item.thumbnail}) + else: + listitem.setIconImage("DefaultVideo.png") + listitem.setThumbnailImage(item.thumbnail) + xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, listitem) # "Descargar" diff --git a/plugin.video.alfa/resources/language/Catalan/strings.xml b/plugin.video.alfa/resources/language/Catalan/strings.xml deleted file mode 100755 index 28265ad6..00000000 --- a/plugin.video.alfa/resources/language/Catalan/strings.xml +++ /dev/null @@ -1,263 +0,0 @@ -<?xml reprodueixsion="1.0" encoding="UTF-8" standalone="yes"?> -<strings> - <!-- Los id disponibles son de 30000 a 30999 --> - - <!-- ======================================= --> - <!-- De 30000 a 30049: Configuració --> - <!-- ======================================= --> - - <!-- Comunes --> - <string id="30000"></string> - <string id="30001">Comprova actualitzacions:</string> - <string id="30004">Actualitza automàticament els canals:</string> - <string id="30201">Actualitza la videoteca en obrir l'XBMC</string> - <string id="30002">Activa el mode per adults:</string> - <string id="30003">Genera un log detallat:</string> - <string id="30043">Força el mode de vista:</string> - - <!-- Acció por defecte quan tries un vídeo --> - <string id="30005">Acció quan es selecciona un vídeo:</string> - <string id="30006">Demana què fer</string> - <string id="30007">Reprodueix</string> - <string id="30008">Reprodueix en qualitat alta</string> - <string id="30009"></string> - - <!-- Tipus de logos para els canals --> - <string id="30010">Logos dels canals:</string> - <string id="30011">Pòster (vertical)</string> - <string id="30012">Bàner (horitzontal)</string> - <string id="30200">Quadrat</string> - <!-- Compte premium --> - <string id="30014">Usuari:</string> - <string id="30015">Contrasenya:</string> - <string id="30031">Qualitat de vídeos (FLV)</string> - <string id="30032">Qualitat Normal (SD)</string> - <string id="30033">Qualitat Alta (HD)(si existeix)</string> - - <string id="30034">Usuari pàgines privades:</string> - <string id="30035">Contrasenya pàgines privades:</string> - - <!-- Altres --> - <string id="30017">Directori de descàrregues:</string> - <string id="30018">Directori de la llista descàrregues:</string> - <string id="30030">Directori de preferits:</string> - <string id="30067">Directori de la videoteca:</string> - <string id="30020">Tria Qualitat més alta (Youtube)</string> - <string id="30021">Activa els subtítols:</string> - <string id="30022"></string> - <string id="30066"></string> - <string id="30024">Nom de cerques a desar:</string> - - <string id="30019">Filtrar canals per idioma:</string> - - <string id="30025">Qualsevol idioma</string> - <string id="30026">Espanyol</string> - <string id="30027">Anglès</string> - <string id="30028">Italià</string> - <string id="30029">Portuguès</string> - <string id="30016">Català</string> - <string id="30023">Eusquera</string> - <string id="30036">Gallec</string> - <string id="30037">Valencià</string> - - <string id="30038">Mode de memòria cau:</string> - <string id="30039">Automàtic</string> - <string id="30040">Tot a la memòria cau</string> - <string id="30041">Res a la memòria cau</string> - <string id="30042">Directori de la memòria cau:</string> - <string id="30043">Tria la millor vista (Només Confluence):</string> - - <string id="30044">Mode de reproducció:</string> - - <string id="30013"></string> - <string id="30048">Nom del canal</string> - <string id="30049">Logo del canal</string> - <string id="30045">URL/fitxer amb els vídeos</string> - <string id="30047">Elements per pàgina</string> - - <!-- Filtros --> - <string id="30068">Filtrar per servidors: </string> - <string id="30069">Llista Blanca: </string> - <string id="30070">Llista Negra: </string> - <string id="30071">Per posar diversos servidors utilitza "," com a separador </string> - - <!-- =============================================================== --> - <!-- De 30050 a 30099: Mensajes informativos - error --> - <!-- =============================================================== --> - <string id="30050">No es pot connectar amb el servidor</string> - <string id="30051">El lloc web no funciona correctament (error http %d)</string> - <string id="30052">Megavídeo té un límit de reproducció de 72 minuts</string> - <string id="30053">Per evitar que els vídeos es tallin en aquest temps</string> - <string id="30054">necessites un compte Premium</string> - <string id="30055">Vídeo no disponible</string> - <string id="30056">No s'han pogut localitzar vídeos a la pàgina del lloc web</string> - <string id="30057">El vídeo ja no està a %s</string> - <string id="30058">Prova a un altre servidor o a un altre canal</string> - <string id="30059">Error al lloc web</string> - <string id="30060">No es pot accedir per un error en el lloc web</string> - <string id="30061">La qualitat triada no està disponible o el vídeo ha estat esborrat</string> - <string id="30062">Prova a reproduir en una altra qualitat</string> - <string id="30063">Canal descarregat i actualitzat!</string> - <string id="30064">Llista de canals actualitzada!</string> - <string id="30065">Servidor no suportat</string> - - <!-- =============================================================== --> - <!-- De 30100 a 30149: Canals genéricos (buscatr, descargas, etc.) --> - <!-- =============================================================== --> - <string id="30100">Configuració</string> - <string id="30101">Descàrregues</string> - <string id="30102">Preferits</string> - <string id="30103">Cerca</string> - <string id="30104">Ajuda</string> - - <string id="30105">S'ha tret de preferits</string> - <string id="30106">S'ha tret de la llista de les descàrregues</string> - <string id="30107">Ha tornat a la llista de les descàrregues</string> - <string id="30108">S'ha afegit a preferits</string> - <string id="30109">S'ha afegit a la llista de les descàrregues</string> - <string id="30110">Cerca tràiler per a</string> - <string id="30111">Torna a fer la cerca de tràiler per a</string> - <string id="30112">Introdueix el títol a cercar</string> - <string id="30113">Modifica el títol actual per a refinar la cerca</string> - <string id="30114">No s'ha trobat el tràiler</string> - <string id="30115">El tràiler per a %s</string> - <string id="30116">no s'ha pogut localitzar.</string> - <string id="30117">vols refinar la cerca amb el teclat?</string> - <string id="30135">s'ha afegit a la videoteca</string> - - <string id="30130">Novetats</string> - <string id="30118">Canals</string> - <string id="30119">Selecciona una Categoria</string> - <string id="30120">Selecciona un Idioma</string> - <string id="30121">Tots</string> - <string id="30122">Pel·lícules</string> - <string id="30123">Sèries</string> - <string id="30124">Anime</string> - <string id="30125">Documentals</string> - <string id="30126">Adults</string> - <string id="30137">Directos</string> - <string id="30127">Llatí</string> - <string id="30128">Cerca de tràilers</string> - <string id="30129">Adult</string> - <string id="30131">Videoteca</string> - <string id="30132">Temàtics</string> - <string id="30133">Infantil</string> - <string id="30134">Els nous</string> - - <!-- =============================================================== --> - <!-- De 30150 a 30199: Menú acción / contextual --> - <!-- =============================================================== --> - <string id="30150">Reprodueix en qualitat alta</string> - <string id="30151">Reprodueix el vídeo</string> - <string id="30152">Reprodueix en qualitat baixa</string> - <string id="30153">Descarrega</string> - <string id="30154">Treu de preferits</string> - <string id="30155">Afegeix a preferits</string> - <string id="30156">Treu de la llista de descàrregues</string> - <string id="30157">Afegeix a llista de descàrregues</string> - <string id="30158"></string> - <string id="30159">Esborra la descàrrega definitivament</string> - <string id="30160">Passa de nou a llista de descàrregues</string> - <string id="30161">Afegeix a la videoteca</string> - <string id="30162">Cerca el tràiler</string> - <string id="30163">Tria una opció</string> - <string id="30164">Esborra aquest fitxer</string> - <!-- =============================================================== --> - <!-- De 30200 a 30999: Canals individuals --> - <!-- =============================================================== --> - <!-- Context menú strings --> - <string id="30300">Elimina aquesta cerca</string> - <string id="30301">Desa aquest canal als preferits</string> - <string id="30302">Elimina aquest canal dels preferits</string> - <string id="30303">Canvia el nom al títol d'aquest canal</string> - - <!-- Megalive menú strings --> - <string id="30401">Mur de canals</string> - <string id="30402">Categories</string> - <string id="30403">Canals Preferits</string> - <string id="30404">Veure Canal por Codi(ID)</string> - <string id="30405">Introdueix el codi del canal</string> - - <!-- Justin.tv Category menú strings --> - <string id="30406">Afegeix a Jtv preferits</string> - <string id="30407">Elimina de Jtv Preferits</string> - <string id="30408"> (fitxers)</string> - <string id="30409">llistar vídeos arxivats</string> - <string id="30410">reprodueix el canal en directe</string> - <string id="30411">El canal no existeix o no està en línia</string> - <string id="30412">El canal no té vídeos arxivats</string> - <string id="30413">Fitxer de vídeos</string> - <string id="30414">Canals en directe</string> - <string id="30415">Introdueix Nom/ID del Canal</string> - <string id="30416">Preferits</string> - <string id="30417">Cerca</string> - <string id="30418">Usuari Justin.tv</string> - <string id="30419">Tots els Idiomes</string> - <string id="30420">Filtro de Idioma(s)</string> - <string id="30421">Tots</string> - <string id="30422">Introdueix el login de Justin TV</string> - <string id="30423">El canal [%s] està desconnectat en aquest moment</string> - <string id="30424">Contrasenya Justin.tv</string> - - <!-- =============================================================== --> - <!-- Subtítols --> - <!-- =============================================================== --> - - <string id="30431">Tria la font dels subtítols :</string> - <string id="30432">Carpeta</string> - <string id="30433">Fitxer</string> - <string id="30434">Teclat</string> - <string id="30435">Directori de subtítols</string> - <string id="30436">Subtítol a carregar</string> - <string id="30437">introdueix direcció</string> - - <!-- LetMeWatchThis --> - <string id="40001">Pel·lícules - Novetats</string> - <string id="40002">Sèries - Novetats</string> - <string id="40003">Pàgina següent</string> - - <!-- =============================================================== --> - <!-- Category strings --> - <!-- =============================================================== --> - <string id="30500">Comptes</string> - <string id="30501">Rutes</string> - <string id="30502">Altres</string> - - <!-- TVShack strings --> - <string id="30900">TVShack</string> - <string id="30901">Sèries TV (VO)</string> - <string id="30902">Pel·lícules (VO)</string> - <string id="30903">Documentals (VO)</string> - <string id="30904">Anime (VO)</string> - <string id="30905">Música</string> - <string id="30906">Cerca Global en TVShack</string> - <string id="30907">No s'han trobat resultats de cerca</string> - <string id="30908">Sèrie - %s (%s episodis)</string> - <string id="30909">Sèrie - </string> - - <string id="30910">Cinema - %s (%s)</string> - <string id="30911">"Música - "</string> - <string id="30912">Llegint %s...</string> - <string id="30913">No s'ha trobat res que llistar</string> - <string id="30914">episodi</string> - <string id="30915">episodis</string> - <string id="30916">cançó</string> - <string id="30917">cançons</string> - <string id="30918"> (Nou)</string> - <string id="30919"> (Nous continguts)</string> - - <string id="30920">AFEGIR TOTS ELS EPISODIS A LA VIDEOTECA</string> - - <!-- =============================================================== --> - <!-- Configuració RSS (IAMM, XTreamer y otros) --> - <!-- =============================================================== --> - <string id="31000">Traductor de mitjà activat:</string> - <string id="30140">Títol</string> - <string id="30165">Prem OK per canviar...</string> - <string id="30166">Desa els canvis</string> - <string id="30167">Surt</string> - <string id="30168">Canvis aplicats</string> - <string id="30169">Cerca</string> - <string id="30170">Actualitza canals:</string> -</strings> - diff --git a/plugin.video.alfa/resources/language/English/strings.po b/plugin.video.alfa/resources/language/English/strings.po new file mode 100644 index 00000000..9623bdf3 --- /dev/null +++ b/plugin.video.alfa/resources/language/English/strings.po @@ -0,0 +1,264 @@ +# Kodi Media Center language file +# strings 30000 thru 30999 reserved for plugins and plugin settings +# +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +# empty string with id 30000 + +msgctxt "#30001" +msgid "Check for updates:" +msgstr "" + +msgctxt "#30002" +msgid "Enable adult mode:" +msgstr "" + +msgctxt "#30003" +msgid "Enable debug logging:" +msgstr "" + +msgctxt "#30043" +msgid "Force view mode:" +msgstr "" + +msgctxt "#30004" +msgid "Automatic update channels:" +msgstr "" + +msgctxt "#30005" +msgid "Default play setting:" +msgstr "" + +msgctxt "#30006" +msgid "Ask" +msgstr "" + +msgctxt "#30007" +msgid "Watch in low quality" +msgstr "" + +msgctxt "#30008" +msgid "Watch in high quality" +msgstr "" + +# empty string with id 30009 + +msgctxt "#30010" +msgid "Channel icons view:" +msgstr "" + +msgctxt "#30011" +msgid "Poster (vertical)" +msgstr "" + +msgctxt "#30012" +msgid "Banner (horizontal)" +msgstr "" + +msgctxt "#30200" +msgid "Square" +msgstr "" + +# empty string with id 30013 + +msgctxt "#30014" +msgid "Username:" +msgstr "" + +msgctxt "#30015" +msgid "Password:" +msgstr "" + +# empty string with id 30016 + +msgctxt "#30017" +msgid "Download path:" +msgstr "" + +msgctxt "#30018" +msgid "Download list path:" +msgstr "" + +msgctxt "#30067" +msgid "Videolibrary path:" +msgstr "" + +msgctxt "#30019" +msgid "Filter channels by language:" +msgstr "" + +msgctxt "#30044" +msgid "Play mode:" +msgstr "" + +msgctxt "#30068" +msgid "Filter by servers:" +msgstr "" + +msgctxt "#30050" +msgid "Server connection error" +msgstr "" + +msgctxt "#30051" +msgid "Website error message (http code %d)" +msgstr "" + +msgctxt "#30055" +msgid "Video not available" +msgstr "" + +msgctxt "#30057" +msgid "The video has been removed from %s" +msgstr "" + +msgctxt "#30058" +msgid "Try another server or channel" +msgstr "" + +msgctxt "#30065" +msgid "Unsopported Server" +msgstr "" + +msgctxt "#30100" +msgid "Configuration" +msgstr "" + +msgctxt "#30101" +msgid "Downloads" +msgstr "" + +msgctxt "#30102" +msgid "Favorites" +msgstr "" + +msgctxt "#30103" +msgid "Global search" +msgstr "" + +msgctxt "#30104" +msgid "Help" +msgstr "" + +msgctxt "#30105" +msgid "Removed from favorites" +msgstr "" + +msgctxt "#30108" +msgid "added to favorites" +msgstr "" + +msgctxt "#30109" +msgid "added to download list" +msgstr "" + +msgctxt "#30112" +msgid "Enter title to search" +msgstr "" + +msgctxt "#30135" +msgid "added to the videolibrary" +msgstr "" + +msgctxt "#30130" +msgid "Recent" +msgstr "" + +msgctxt "#30118" +msgid "Channels" +msgstr "" + +msgctxt "#30119" +msgid "Choose a Category" +msgstr "" + +msgctxt "#30121" +msgid "All" +msgstr "" + +msgctxt "#30122" +msgid "Movies" +msgstr "" + +msgctxt "#30123" +msgid "TV Shows" +msgstr "" + +msgctxt "#30124" +msgid "Anime" +msgstr "" + +msgctxt "#30125" +msgid "Documentaries" +msgstr "" + +msgctxt "#30136" +msgid "Original version" +msgstr "" + +msgctxt "#30126" +msgid "Adult" +msgstr "" + +msgctxt "#30137" +msgid "Direct" +msgstr "" + +msgctxt "#30131" +msgid "Videolibrary" +msgstr "" + +msgctxt "#30151" +msgid "Watch the video" +msgstr "" + +msgctxt "#30153" +msgid "Download" +msgstr "" + +msgctxt "#30154" +msgid "Remove from favorites" +msgstr "" + +msgctxt "#30155" +msgid "Add to favorites" +msgstr "" + +msgctxt "#30161" +msgid "Add to videolibrary" +msgstr "" + +msgctxt "#30162" +msgid "Search for trailer" +msgstr "" + +msgctxt "#30163" +msgid "Choose an option" +msgstr "" + +msgctxt "#30164" +msgid "Delete this file" +msgstr "" + +msgctxt "#30501" +msgid "Paths" +msgstr "" + +msgctxt "#30998" +msgid "Shortcut" +msgstr "" + +msgctxt "#30999" +msgid "Add key to open Shortcut" +msgstr "" \ No newline at end of file diff --git a/plugin.video.alfa/resources/language/English/strings.xml b/plugin.video.alfa/resources/language/English/strings.xml deleted file mode 100755 index 784ad0af..00000000 --- a/plugin.video.alfa/resources/language/English/strings.xml +++ /dev/null @@ -1,268 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<strings> - <!-- Available id from 30000 to 30999 --> - - <!-- ======================================= --> - <!-- 30000 to 30049: Configuration --> - <!-- ======================================= --> - - <!-- Commons --> - <string id="30000"></string> - <string id="30001">Check for updates:</string> - <string id="30004">Automatic update channels:</string> - <string id="30201">Update library each time XBMC opens</string> - <string id="30002">Enable adult mode:</string> - <string id="30003">Enable debug logging:</string> - <string id="30043">Force view mode:</string> - - <!-- Default action when you select a video --> - <string id="30005">Default play setting:</string> - <string id="30006">Ask</string> - <string id="30007">Watch in low quality</string> - <string id="30008">Watch in high quality</string> - <string id="30009"></string> - - <!-- Logo visualization for channels --> - <string id="30010">Channel icons view:</string> - <string id="30011">Poster (vertical)</string> - <string id="30012">Banner (horizontal)</string> - <string id="30200">Square</string> - - <!-- premium account --> - <string id="30014">Username:</string> - <string id="30015">Password:</string> - <string id="30031">Video Quality (FLV)</string> - <string id="30032">Standard Definition (SD)</string> - <string id="30033">High Definition (HD)(when available)</string> - - <string id="30034">Private pages login:</string> - <string id="30035">Private pages password:</string> - - <!-- Other --> - <string id="30017">Download path:</string> - <string id="30018">Download list path:</string> - <string id="30030">Favorites path:</string> - <string id="30067">Library path:</string> - <string id="30020">Highest Quality (Youtube)</string> - <string id="30021">Enable Subtitle:</string> - <string id="30022"></string> - <string id="30066"></string> - <string id="30024">Number of searches to save:</string> - - <string id="30019">Filter channels by language:</string> - <string id="30025">All languages</string> - <string id="30026">Spanish</string> - <string id="30027">English</string> - <string id="30028">Italian</string> - <string id="30029">Portuguese</string> - <string id="30046">French</string> - <string id="30016">Catalán</string> - <string id="30023">Euskera</string> - <string id="30036">Gallego</string> - <string id="30037">Valenciano</string> - - <string id="30038">Cache mode:</string> - <string id="30039">Auto</string> - <string id="30040">Cache all</string> - <string id="30041">Cache nothing</string> - <string id="30042">Cache path:</string> - - <string id="30044">Play mode:</string> - - <string id="30013"></string> - <string id="30048">Channel name</string> - <string id="30049">Channel logo</string> - <string id="30045">Video list URL / file</string> - <string id="30047">Elements per page</string> - - <!-- Filtros --> - <string id="30068">Filter by servers:</string> - <string id="30069">White List:</string> - <string id="30070">Black List:</string> - <string id="30071">To add several servers use "," as separator</string> - - - <!-- =============================================================== --> - <!-- 30050 to 30099: Info / error messages --> - <!-- =============================================================== --> - <string id="30050">Server connection error</string> <!-- No se puede conectar con el servidor --> - <string id="30051">Website error message (http code %d)</string> <!-- El sitio web no funciona correctamente (error http %d) --> - <string id="30052">Megavideo have a watching time restriction of 72 min.</string> <!-- Megavideo tiene un límite de reproducción de 72 minutos --> - <string id="30053">for free users. The limit does not apply to users</string> <!-- Para evitar que los vídeos se corten pasado ese tiempo --> - <string id="30054">logged in to a premium account.</string> <!-- necesitas una cuenta Premium --> - <string id="30055">Video not available</string> <!-- Vídeo no disponible --> - <string id="30056">There are no videos available on the web page</string> <!-- No se han podido localizar videos en la página del sitio web --> - <string id="30057">The video has been removed from %s</string> <!-- El vídeo ya no está en %s --> - <string id="30058">Try another server or channel</string> <!-- Prueba en otro servidor o en otro canal --> - <string id="30059">Website error</string> <!-- Error en el sitio web --> - <string id="30060">Loading canceled due to a website error</string> <!-- No se puede acceder por un error en el sitio web --> - <string id="30061">Quality not available or video removed</string> <!-- La calidad elegida no esta disponible o el video ha sido borrado --> - <string id="30062">Try another quality</string> <!-- Prueba a reproducir en otra calidad --> - <string id="30063">This channel has been downloaded and updated!</string> - <string id="30064">¡Channel list has been updated!</string> - - <string id="30065">Unsopported Server</string> - - <!-- =============================================================== --> - <!-- 30100 to 30149: Generic channels (Search, downloads, etc.) --> - <!-- =============================================================== --> - <string id="30100">Configuration</string> <!-- Configuración --> - <string id="30101">Downloads</string> <!-- Descargas --> - <string id="30102">Favorites</string> <!-- Favoritos --> - <string id="30103">Global search</string> <!-- Buscador --> - <string id="30104">Help</string> <!-- Ayuda --> - - <string id="30105">Removed from favorites</string> <!-- Se ha quitado de favoritos --> - <string id="30106">Removed from download list</string> <!-- Se ha quitado de la lista de descargas --> - <string id="30107">Moved back to download list</string> <!-- Ha pasado de nuevo a la lista de descargas --> - <string id="30108">added to favorites</string> <!-- se ha añadido a favoritos --> - <string id="30109">added to download list</string> <!-- se ha añadido a la lista de descargas --> - <string id="30110">Search trailer for</string> - <string id="30111">Retry trailer search for</string><!-- Reintentar búsqueda de trailer para --> - <string id="30112">Enter title to search</string> <!-- Introduce el Titulo a buscar --> - <string id="30113">Modify actual title to refine the search</string> <!-- Modifica el titulo para refinar la búsqueda --> - <string id="30114">Trailer not found</string> <!-- Trailer no encontrado --> - <string id="30115">Trailer for %s</string> <!-- El Trailer para %s --> - <string id="30116">cannot be found.</string> <!-- no se ha podido localizar. --> - <string id="30117">Do you want to refine the search using the keyboard?</string> <!-- ¿Quieres refinar la búsqueda con el teclado? --> - <string id="30135">added to the library</string> - - <string id="30130">Recent</string> - <string id="30118">Channels</string> - <string id="30119">Choose a Category</string> - <string id="30120">Choose a Language</string> - <string id="30121">All</string> - <string id="30122">Movies</string> - <string id="30123">TV Shows</string> - <string id="30124">Anime</string> - <string id="30125">Documentaries</string> - <string id="30136">Original version</string> - <string id="30126">Adult</string> - <string id="30137">Direct</string> - <string id="30127">Latin</string> - <string id="30128">Search Trailers</string> - <string id="30129">Adult</string> - <string id="30131">Library</string> - <string id="30132">Temáticos</string> - <string id="30133">Internet</string> - <string id="30134">Los nuevos</string> - - <!-- =============================================================== --> - <!-- 30150 to 30199: Action menu / contextual menu --> - <!-- =============================================================== --> - <string id="30150">Watch in high quality</string> <!-- Ver en calidad alta --> - <string id="30151">Watch the video</string> <!-- Ver en calidad normal --> - <string id="30152">Watch in low quality</string> <!-- Ver en calidad baja --> - <string id="30153">Download</string> <!-- Descargar --> - <string id="30154">Remove from favorites</string> <!-- Quitar de favoritos --> - <string id="30155">Add to favorites</string> <!-- Añadir a favoritos --> - <string id="30156">Remove from download list</string> <!-- Quitar de lista de descargas --> - <string id="30157">Add to download list</string><!-- Añadir a lista de descargas --> - <string id="30158"></string> <!-- Enviar a JDownloader --> - <string id="30159">Remove from download list forever</string> <!-- Borrar descarga definitivamente --> - <string id="30160">Move to download list again</string> <!-- Pasar de nuevo a lista de descargas --> - <string id="30161">Add to library</string> <!-- Añadir a Videoteca --> - <string id="30162">Search for trailer</string> <!-- Buscar Trailer --> - <string id="30163">Choose an option</string> <!-- Elige una opción --> - <string id="30164">Delete this file</string> - - <!-- =============================================================== --> - <!-- 30100 to 30999: Individual channels --> - <!-- =============================================================== --> - - <!-- Context menu strings --> - <string id="30300">Delete saved search</string> - <string id="30301">Add channel live to favorites</string> - <string id="30302">Remove from favorites channel live</string> - <string id="30303">Rename title channel live</string> - - <!-- Megalive menu strings --> - <string id="30401">channels wall</string> - <string id="30402">Categories</string> - <string id="30403">Favorites channels </string> - <string id="30404">Play channel Live by ID</string> - <string id="30405">Input channel ID code</string> - - <!-- Justin.tv Category menu strings --> - <string id="30406">Add to Jtv Favorites</string> - <string id="30407">Remove from Jtv Favorites</string> - <string id="30408"> (archives)</string> - <string id="30409">Video channels archives</string> - <string id="30410">Watch channels live</string> - <string id="30411">The channel does not exist or is offline</string> - <string id="30412">The channel no have archived videos</string> - <string id="30413">Archived Videos</string> - <string id="30414">Channels Live</string> - <string id="30415">Enter Channel Name</string> - <string id="30416">Favorites</string> - <string id="30417">Search</string> - <string id="30418">Justin tv Login</string> - <string id="30419">All Languages</string> - <string id="30420">Filter by Language(s)</string> - <string id="30421">All</string> - <string id="30422"> Enter Justin tv Login</string> - <string id="30423">The channel [%s] is offline in this moment</string> - <string id="30424">Justin.tv Password</string> - - <!-- =============================================================== --> - <!-- Subtitulos --> - <!-- =============================================================== --> - <string id="30430">Subtitles</string> - <string id="30431">Choice Subtitle source :</string> - <string id="30432">Folder</string> - <string id="30433">File</string> - <string id="30434">Keyboard</string> - <string id="30435">Subtitles Directory</string> - <string id="30436">Subtitle file</string> - <string id="30437">taping the Addres</string> - - <!-- =============================================================== --> - <!-- Setting Category strings --> - <!-- =============================================================== --> - <string id="30500">Login</string> - <string id="30501">Path</string> - <string id="30502">Other</string> - <string id="30503">Filters</string> - - <!-- LetMeWatchThis --> - <string id="40001">Movies - Just added</string> - <string id="40002">TV Shows - Just added</string> - <string id="40003">!Next page</string> - - <!-- TVShack strings --> - <string id="30900">TVShack</string> - <string id="30901">Series TV (VO)</string> - <string id="30902">Películas (VO)</string> - <string id="30903">Documentales (VO)</string> - <string id="30904">Anime (VO)</string> - <string id="30905">Música</string> - <string id="30906">Busqueda Global en TVShack</string> - <string id="30907">No se produjeron resultados de búsqueda</string> - <string id="30908">Serie - %s (%s episodios)</string> - <string id="30909">Serie - </string> - - <string id="30910">Cine - %s (%s)</string> - <string id="30911">"Música - "</string> - <string id="30912">Leyendo %s...</string> - <string id="30913">No se encontró nada que listar</string> - <string id="30914">episodio</string> - <string id="30915">episodios</string> - <string id="30916">canción</string> - <string id="30917">canciones</string> - <string id="30918"> (Nuevo)</string> - <string id="30919"> (Nuevos contenidos)</string> - - <string id="30920">AÑADIR TODOS LOS EPISODIOS A LA VIDEOTECA</string> - - <!-- =============================================================== --> - <!-- Configuracion RSS (IAMM, XTreamer y otros) --> - <!-- =============================================================== --> - <string id="31000">Media translate activated:</string> - <string id="30140">Title</string> - <string id="30165">Press OK for change...</string> - <string id="30166">Salvar cambios</string> - <string id="30167">Salir</string> - <string id="30168">Cambios aplicados</string> - <string id="30169">Buscar</string> - <string id="30170">Actualizar canales:</string> -</strings> diff --git a/plugin.video.alfa/resources/language/Italian/strings.xml b/plugin.video.alfa/resources/language/Italian/strings.xml deleted file mode 100755 index 24ca5ed1..00000000 --- a/plugin.video.alfa/resources/language/Italian/strings.xml +++ /dev/null @@ -1,266 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<strings> - <!-- Available id from 30000 to 30999 --> - - <!-- ======================================= --> - <!-- 30000 to 30049: Configurazione --> - <!-- ======================================= --> - - <!-- Comandi --> - <string id="30000"></string> - <string id="30001">Controlla aggiornamenti:</string> - <string id="30004">Aggiornamento automatico canali:</string> - <string id="30201">Actualizar la videoteca al abrir XBMC</string> - <string id="30002">Abilita modalità adult:</string> - <string id="30003">Abilita logging di debug:</string> - <string id="30043">Forza modalità di visualizzazione:</string> - - <!-- Azioni predefinite quando si seleziona un video --> - <string id="30005">Impostazioni predefinite di riproduzione:</string> - <string id="30006">Chiedi</string> - <string id="30007">Guarda in bassa qualità</string> - <string id="30008">Guarda in alta qualità</string> - <string id="30009"></string> - - <!-- Visualizzazione logo dei canali --> - <string id="30010">Visualizzazione icone dei canali:</string> - <string id="30011">Poster (verticale)</string> - <string id="30012">Banner (orizzontale)</string> - <string id="30200">Square</string> - - <!-- Account premium --> - <string id="30014">Nome utente:</string> - <string id="30015">Password:</string> - <string id="30031">Qualità video (FLV)</string> - <string id="30032">Definizione standard (SD)</string> - <string id="30033">Alta Definizione (HD)(quando disponibile)</string> - - <string id="30034">Login pagine private:</string> - <string id="30035">Password pagine private:</string> - - <!-- Altro --> - <string id="30017">Percorso download:</string> - <string id="30018">Percorso lista download:</string> - <string id="30030">Percorso preferiti:</string> - <string id="30067">Percorso di libreria:</string> - <string id="30020">Qualità migliore (Youtube)</string> - <string id="30021">Abilita sottotitoli:</string> - <string id="30022"></string> - <string id="30066"></string> - <string id="30024">Numero di ricerche da salvare:</string> - - <string id="30019">Filtra canali per lingua:</string> - <string id="30025">Tutte le lingue</string> - <string id="30026">Spanish</string> - <string id="30027">English</string> - <string id="30028">Italiano</string> - <string id="30029">Portuguese</string> - <string id="30046">French</string> - <string id="30016">Catalán</string> - <string id="30023">Euskera</string> - <string id="30036">Gallego</string> - <string id="30037">Valenciano</string> - - <string id="30038">Modalità cache:</string> - <string id="30039">Auto</string> - <string id="30040">Tutti i cache</string> - <string id="30041">Nessun cache</string> - <string id="30042">Percorso cache:</string> - - <string id="30044">Modalità riproduzione:</string> - - <string id="30013"></string> - <string id="30048">Channel name</string> - <string id="30049">Channel logo</string> - <string id="30045">Video list URL / file</string> - <string id="30047">Elements per page</string> - - <!-- Filtri --> - <string id="30068">Filtro per server:</string> - <string id="30069">White List:</string> - <string id="30070">Blacklist:</string> - <string id="30071">Per mettere più server che utilizzano "," come separatore</string> - - <!-- =============================================================== --> - <!-- 30050 to 30099: Info / Messaggi d' errore --> - <!-- =============================================================== --> - <string id="30050">Errore connessione server</string> <!-- No se puede conectar con el servidor --> - <string id="30051">Messaggio d'errore sito web (codice http %d)</string> <!-- El sitio web no funciona correctamente (error http %d) --> - <string id="30052">Megavideo ha un limite di 72 minuti</string> <!-- Megavideo tiene un límite de reproducción de 72 minutos --> - <string id="30053">Per utenti free. Il limite non è applicato agli utenti</string> <!-- Para evitar que los vídeos se corten pasado ese tiempo --> - <string id="30054">Necessita il login in un account premium</string> <!-- necesitas una cuenta Premium --> - <string id="30055">Video non disponibile</string> <!-- Vídeo no disponible --> - <string id="30056">Non ci sono video disponibili nella pagina web</string> <!-- No se han podido localizar videos en la página del sitio web --> - <string id="30057">Il video è stato rimosso da %s</string> <!-- El vídeo ya no está en %s --> - <string id="30058">Prova un altro server o canale</string> <!-- Prueba en otro servidor o en otro canal --> - <string id="30059">Errore sito web</string> <!-- Error en el sitio web --> - <string id="30060">Impossibile accedere a causa di un errore del sito</string> <!-- No se puede acceder por un error en el sitio web --> - <string id="30061">Qualità non disponibile o video rimosso</string> <!-- La calidad elegida no esta disponible o el video ha sido borrado --> - <string id="30062">Prova un' altra qualità</string> <!-- Prueba a reproducir en otra calidad --> - <string id="30063">Questo canale è state scaricato ed aggiornato!</string> - <string id="30064">Lista ¡Channel aggiornata!</string> - - <string id="30065">Server non supportato</string> - - <!-- =============================================================== --> - <!-- 30100 to 30149: Canali generici (Ricerca, downloads, etc.) --> - <!-- =============================================================== --> - <string id="30100">Configurazione</string> <!-- Configuración --> - <string id="30101">Downloads</string> <!-- Descargas --> - <string id="30102">Preferiti</string> <!-- Favoritos --> - <string id="30103">Ricerca globale</string> <!-- Buscador --> - <string id="30104">Aiuto</string> <!-- Ayuda --> - - <string id="30105">Rimosso dai preferiti</string> <!-- Se ha quitado de favoritos --> - <string id="30106">Rimosso dalla lista download</string> <!-- Se ha quitado de la lista de descargas --> - <string id="30107">Spostato nella lista download</string> <!-- Ha pasado de nuevo a la lista de descargas --> - <string id="30108">Aggiunto ai preferiti</string> <!-- se ha añadido a favoritos --> - <string id="30109">Aggiunto alla lista download</string> <!-- se ha añadido a la lista de descargas --> - <string id="30110">Cerco trailer per</string> - <string id="30111">Riprova ricerca trailer</string><!-- Reintentar búsqueda de trailer para --> - <string id="30112">Inserisci titolo da cercare</string> <!-- Introduce el Titulo a buscar --> - <string id="30113">Modifica titolo attuale per affinare la ricerca</string> <!-- Modifica el titulo para refinar la búsqueda --> - <string id="30114">Trailer non trovato</string> <!-- Trailer no encontrado --> - <string id="30115">Trailer per %s</string> <!-- El Trailer para %s --> - <string id="30116">Non può essere trovato</string> <!-- no se ha podido localizar. --> - <string id="30117">Vuoi refiner la ricerca utilizzando la tastiera?</string> <!-- ¿Quieres refinar la búsqueda con el teclado? --> - <string id="30135">Aggiunto alla libreria</string> - - <string id="30130">Nuovo</string> - <string id="30118">Canali</string> - <string id="30119">Scegli una categoria</string> - <string id="30120">Scegli una lingua</string> - <string id="30121">Tutto</string> - <string id="30122">Film</string> - <string id="30123">Show televisivi</string> - <string id="30124">Anime</string> - <string id="30125">Documentari</string> - <string id="30136">Versioni originali</string> - <string id="30126">Adulti</string> - <string id="30137">Direct</string> - <string id="30127">Latino</string> - <string id="30128">Cerca trailer</string> - <string id="30129">Adulto</string> - <string id="30131">Libreria</string> - <string id="30132">Tema</string> - <string id="30133">Internet</string> - <string id="30134">Nuovi</string> - - <!-- =============================================================== --> - <!-- 30150 to 30199: Menù azioni / Menù contestuale --> - <!-- =============================================================== --> - <string id="30150">Guarda in alta qualità</string> <!-- Ver en calidad alta --> - <string id="30151">Guarda il video</string> <!-- Ver en calidad normal --> - <string id="30152">Guarda in bassa qualità</string> <!-- Ver en calidad baja --> - <string id="30153">Download</string> <!-- Descargar --> - <string id="30154">Rimuovi dai preferiti</string> <!-- Quitar de favoritos --> - <string id="30155">Aggiungi ai preferiti</string> <!-- Añadir a favoritos --> - <string id="30156">Rimuovi dalla lista download</string> <!-- Quitar de lista de descargas --> - <string id="30157">Aggiunto alla lista download</string><!-- Añadir a lista de descargas --> - <string id="30158"></string> <!-- Enviar a JDownloader --> - <string id="30159">Rimuovi dalla lista download definitivamente</string> <!-- Borrar descarga definitivamente --> - <string id="30160">Sposta nuovamente nella lista download</string> <!-- Pasar de nuevo a lista de descargas --> - <string id="30161">Aggiungi alla videoteca</string> <!-- Añadir a Videoteca --> - <string id="30162">Cerca trailer</string> <!-- Buscar Trailer --> - <string id="30163">Scegli un' opzione</string> <!-- Elige una opción --> - <string id="30164">Cancella questo file</string> - - <!-- =============================================================== --> - <!-- 30100 to 30999: Canali individuali --> - <!-- =============================================================== --> - - <!-- Stringhe menù contestuale --> - <string id="30300">Cancella ricerche salvate</string> - <string id="30301">Aggingi il canale in diretta ai preferiti</string> - <string id="30302">Rimuovi il canale in diretta ai preferiti</string> - <string id="30303">Rinomina titolo del canale in diretta</string> - - <!-- Stringhe menù Megalive --> - <string id="30401">channels wall</string> - <string id="30402">Categories</string> - <string id="30403">Favorites channels </string> - <string id="30404">Play channel Live by ID</string> - <string id="30405">Input channel ID code</string> - - <!-- Stringhe menù categorie Justin.tv --> - <string id="30406">Aggiungi ai preferiti Jtv</string> - <string id="30407">Rimuovi dai preferiti Jtv</string> - <string id="30408"> (Archivi)</string> - <string id="30409">Archivi canali video</string> - <string id="30410">Guarda canale in diretta</string> - <string id="30411">Il canale non esiste o è offline</string> - <string id="30412">Il canale non ha archivi video</string> - <string id="30413">Video archiviati</string> - <string id="30414">Canali in diretta</string> - <string id="30415">Inserisci nome canale</string> - <string id="30416">Preferiti</string> - <string id="30417">Ricerca</string> - <string id="30418">Login Justin tv</string> - <string id="30419">Tutte le lingue</string> - <string id="30420">Filtra per lingua(e)</string> - <string id="30421">Tutto</string> - <string id="30422">Inserisci Login Justin tv</string> - <string id="30423">Il canale [%s] è offline in questo momento</string> - <string id="30424">Password Justin.tv</string> - - <!-- =============================================================== --> - <!-- Sottotitoli --> - <!-- =============================================================== --> - <string id="30430">Sottotitoli</string> - <string id="30431">Scelta fonte sottotitoli :</string> - <string id="30432">Cartella</string> - <string id="30433">File</string> - <string id="30434">Tastiera</string> - <string id="30435">Directory sottotitoli</string> - <string id="30436">File sottotitoli</string> - <string id="30437">Premi l' indirizzo</string> - - <!-- =============================================================== --> - <!-- Stringhe categoria impostazioni --> - <!-- =============================================================== --> - <string id="30500">Login</string> - <string id="30501">Percorso</string> - <string id="30502">Altro</string> - - <!-- Lasciatemi guardare questo --> - <string id="40001">Film - Appena aggiunti</string> - <string id="40002">Show televisivi - Appena aggiunti</string> - <string id="40003">Pagina successiva</string> - - <!-- Stringhe TVShack --> - <string id="30900">TVShack</string> - <string id="30901">Serie TV (VO)</string> - <string id="30902">Film (VO)</string> - <string id="30903">Documentari (VO)</string> - <string id="30904">Anime (VO)</string> - <string id="30905">Musica</string> - <string id="30906">Ricerca globale in TVShack</string> - <string id="30907">Non sono stati trovati risultati per la ricerca</string> - <string id="30908">Serie - %s (%s episodios)</string> - <string id="30909">Serie - </string> - - <string id="30910">Cinema - %s (%s)</string> - <string id="30911">"Musica - "</string> - <string id="30912">Lettura %s...</string> - <string id="30913">Non è stato trovato nella lista</string> - <string id="30914">Episodio</string> - <string id="30915">Episodi</string> - <string id="30916">Canzone</string> - <string id="30917">Canzoni</string> - <string id="30918">(Nuovo)</string> - <string id="30919">(Nuovi contenuti)</string> - - <string id="30920">Aggiungi tutti gli episodi alla libreria</string> - - <!-- =============================================================== --> - <!-- Configurazione RSS (IAMM, XTreamer e altri) --> - <!-- =============================================================== --> - <string id="31000">Traduttore attivato:</string> - <string id="30140">Titolo</string> - <string id="30165">Premi OK per modificare…</string> - <string id="30166">Salva le modifiche</string> - <string id="30167">Lascia</string> - <string id="30168">Modifiche applicate</string> - <string id="30169">Cerca</string> - <string id="30170">Aggiornamento canali:</string> -</strings> diff --git a/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po b/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po new file mode 100644 index 00000000..bc41ec1b --- /dev/null +++ b/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po @@ -0,0 +1,264 @@ +# Kodi Media Center language file +# strings 30000 thru 30999 reserved for plugins and plugin settings +# +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Spanish) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +# empty string with id 30000 + +msgctxt "#30001" +msgid "Check for updates:" +msgstr "Comprobar actualizaciones:" + +msgctxt "#30002" +msgid "Enable adult mode:" +msgstr "Mostrar canales para adultos" + +msgctxt "#30003" +msgid "Enable debug logging:" +msgstr "Generar log detallado:" + +msgctxt "#30043" +msgid "Force view mode:" +msgstr "Forzar el modo de vista:" + +msgctxt "#30004" +msgid "Automatic update channels:" +msgstr "Actualizar automáticamente canales:" + +msgctxt "#30005" +msgid "Default play setting:" +msgstr "Accion al seleccionar vídeo:" + +msgctxt "#30006" +msgid "Ask" +msgstr "Preguntar" + +msgctxt "#30007" +msgid "Watch in low quality" +msgstr "Ver en calidad baja" + +msgctxt "#30008" +msgid "Watch in high quality" +msgstr "Ver en calidad alta" + +# empty string with id 30009 + +msgctxt "#30010" +msgid "Channel icons view:" +msgstr "Logos de canales:" + +msgctxt "#30011" +msgid "Poster (vertical)" +msgstr "Poster (vertical)" + +msgctxt "#30012" +msgid "Banner (horizontal)" +msgstr "Banner (horizontal)" + +msgctxt "#30200" +msgid "Square" +msgstr "Cuadrado" + +# empty string with id 30013 + +msgctxt "#30014" +msgid "Username:" +msgstr "Usuario:" + +msgctxt "#30015" +msgid "Password:" +msgstr "Password:" + +# empty string with id 30016 + +msgctxt "#30017" +msgid "Download path:" +msgstr "Directorio de descargas:" + +msgctxt "#30018" +msgid "Download list path:" +msgstr "Directorio de lista descargas:" + +msgctxt "#30067" +msgid "Videolibrary path:" +msgstr "Directorio de la videoteca:" + +msgctxt "#30019" +msgid "Filter channels by language:" +msgstr "Filtrar canales por idioma:" + +msgctxt "#30044" +msgid "Play mode:" +msgstr "Modo de reproducción:" + +msgctxt "#30068" +msgid "Filter by servers:" +msgstr "Filtrar por servidores:" + +msgctxt "#30050" +msgid "Server connection error" +msgstr "No se puede conectar con el servidor" + +msgctxt "#30051" +msgid "Website error message (http code %d)" +msgstr "El sitio web no funciona correctamente (error http %d)" + +msgctxt "#30055" +msgid "Video not available" +msgstr "Vídeo no disponible" + +msgctxt "#30057" +msgid "The video has been removed from %s" +msgstr "No se puede acceder al vídeo en %s" + +msgctxt "#30058" +msgid "Try another server or channel" +msgstr "Prueba en otro servidor o en otro canal" + +msgctxt "#30065" +msgid "Unsopported Server" +msgstr "Servidor no soportado" + +msgctxt "#30100" +msgid "Configuration" +msgstr "Configuración" + +msgctxt "#30101" +msgid "Downloads" +msgstr "Descargas" + +msgctxt "#30102" +msgid "Favorites" +msgstr "Favoritos" + +msgctxt "#30103" +msgid "Global search" +msgstr "Buscador" + +msgctxt "#30104" +msgid "Help" +msgstr "Ayuda" + +msgctxt "#30105" +msgid "Removed from favorites" +msgstr "Se ha quitado de favoritos" + +msgctxt "#30108" +msgid "added to favorites" +msgstr "se ha añadido a favoritos" + +msgctxt "#30109" +msgid "added to download list" +msgstr "se ha añadido a la lista de descargas" + +msgctxt "#30112" +msgid "Enter title to search" +msgstr "Introduce el título a buscar" + +msgctxt "#30135" +msgid "added to the videolibrary" +msgstr "se ha añadido a la videoteca" + +msgctxt "#30130" +msgid "Recent" +msgstr "Novedades" + +msgctxt "#30118" +msgid "Channels" +msgstr "Canales" + +msgctxt "#30119" +msgid "Choose a Category" +msgstr "Seleccione una Categoría" + +msgctxt "#30121" +msgid "All" +msgstr "Todos" + +msgctxt "#30122" +msgid "Movies" +msgstr "Películas" + +msgctxt "#30123" +msgid "TV Shows" +msgstr "Series" + +msgctxt "#30124" +msgid "Anime" +msgstr "Anime" + +msgctxt "#30125" +msgid "Documentaries" +msgstr "Documentales" + +msgctxt "#30136" +msgid "Original version" +msgstr "Versión original" + +msgctxt "#30126" +msgid "Adult" +msgstr "" + +msgctxt "#30137" +msgid "Direct" +msgstr "Directos" + +msgctxt "#30131" +msgid "Videolibrary" +msgstr "Videoteca" + +msgctxt "#30151" +msgid "Watch the video" +msgstr "Ver el vídeo" + +msgctxt "#30153" +msgid "Download" +msgstr "Descargar" + +msgctxt "#30154" +msgid "Remove from favorites" +msgstr "Quitar de favoritos" + +msgctxt "#30155" +msgid "Add to favorites" +msgstr "Añadir a favoritos" + +msgctxt "#30161" +msgid "Add to videolibrary" +msgstr "Añadir a videoteca" + +msgctxt "#30162" +msgid "Search for trailer" +msgstr "Buscar trailer" + +msgctxt "#30163" +msgid "Choose an option" +msgstr "Elige una opción" + +msgctxt "#30164" +msgid "Delete this file" +msgstr "Borrar este fichero" + +msgctxt "#30501" +msgid "Paths" +msgstr "Rutas" + +msgctxt "#30998" +msgid "Shortcut" +msgstr "Acceso directo" + +msgctxt "#30999" +msgid "Add key to open Shortcut" +msgstr "Añadir tecla para acceso directo" \ No newline at end of file diff --git a/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po b/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po new file mode 100644 index 00000000..bc41ec1b --- /dev/null +++ b/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po @@ -0,0 +1,264 @@ +# Kodi Media Center language file +# strings 30000 thru 30999 reserved for plugins and plugin settings +# +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Spanish) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +# empty string with id 30000 + +msgctxt "#30001" +msgid "Check for updates:" +msgstr "Comprobar actualizaciones:" + +msgctxt "#30002" +msgid "Enable adult mode:" +msgstr "Mostrar canales para adultos" + +msgctxt "#30003" +msgid "Enable debug logging:" +msgstr "Generar log detallado:" + +msgctxt "#30043" +msgid "Force view mode:" +msgstr "Forzar el modo de vista:" + +msgctxt "#30004" +msgid "Automatic update channels:" +msgstr "Actualizar automáticamente canales:" + +msgctxt "#30005" +msgid "Default play setting:" +msgstr "Accion al seleccionar vídeo:" + +msgctxt "#30006" +msgid "Ask" +msgstr "Preguntar" + +msgctxt "#30007" +msgid "Watch in low quality" +msgstr "Ver en calidad baja" + +msgctxt "#30008" +msgid "Watch in high quality" +msgstr "Ver en calidad alta" + +# empty string with id 30009 + +msgctxt "#30010" +msgid "Channel icons view:" +msgstr "Logos de canales:" + +msgctxt "#30011" +msgid "Poster (vertical)" +msgstr "Poster (vertical)" + +msgctxt "#30012" +msgid "Banner (horizontal)" +msgstr "Banner (horizontal)" + +msgctxt "#30200" +msgid "Square" +msgstr "Cuadrado" + +# empty string with id 30013 + +msgctxt "#30014" +msgid "Username:" +msgstr "Usuario:" + +msgctxt "#30015" +msgid "Password:" +msgstr "Password:" + +# empty string with id 30016 + +msgctxt "#30017" +msgid "Download path:" +msgstr "Directorio de descargas:" + +msgctxt "#30018" +msgid "Download list path:" +msgstr "Directorio de lista descargas:" + +msgctxt "#30067" +msgid "Videolibrary path:" +msgstr "Directorio de la videoteca:" + +msgctxt "#30019" +msgid "Filter channels by language:" +msgstr "Filtrar canales por idioma:" + +msgctxt "#30044" +msgid "Play mode:" +msgstr "Modo de reproducción:" + +msgctxt "#30068" +msgid "Filter by servers:" +msgstr "Filtrar por servidores:" + +msgctxt "#30050" +msgid "Server connection error" +msgstr "No se puede conectar con el servidor" + +msgctxt "#30051" +msgid "Website error message (http code %d)" +msgstr "El sitio web no funciona correctamente (error http %d)" + +msgctxt "#30055" +msgid "Video not available" +msgstr "Vídeo no disponible" + +msgctxt "#30057" +msgid "The video has been removed from %s" +msgstr "No se puede acceder al vídeo en %s" + +msgctxt "#30058" +msgid "Try another server or channel" +msgstr "Prueba en otro servidor o en otro canal" + +msgctxt "#30065" +msgid "Unsopported Server" +msgstr "Servidor no soportado" + +msgctxt "#30100" +msgid "Configuration" +msgstr "Configuración" + +msgctxt "#30101" +msgid "Downloads" +msgstr "Descargas" + +msgctxt "#30102" +msgid "Favorites" +msgstr "Favoritos" + +msgctxt "#30103" +msgid "Global search" +msgstr "Buscador" + +msgctxt "#30104" +msgid "Help" +msgstr "Ayuda" + +msgctxt "#30105" +msgid "Removed from favorites" +msgstr "Se ha quitado de favoritos" + +msgctxt "#30108" +msgid "added to favorites" +msgstr "se ha añadido a favoritos" + +msgctxt "#30109" +msgid "added to download list" +msgstr "se ha añadido a la lista de descargas" + +msgctxt "#30112" +msgid "Enter title to search" +msgstr "Introduce el título a buscar" + +msgctxt "#30135" +msgid "added to the videolibrary" +msgstr "se ha añadido a la videoteca" + +msgctxt "#30130" +msgid "Recent" +msgstr "Novedades" + +msgctxt "#30118" +msgid "Channels" +msgstr "Canales" + +msgctxt "#30119" +msgid "Choose a Category" +msgstr "Seleccione una Categoría" + +msgctxt "#30121" +msgid "All" +msgstr "Todos" + +msgctxt "#30122" +msgid "Movies" +msgstr "Películas" + +msgctxt "#30123" +msgid "TV Shows" +msgstr "Series" + +msgctxt "#30124" +msgid "Anime" +msgstr "Anime" + +msgctxt "#30125" +msgid "Documentaries" +msgstr "Documentales" + +msgctxt "#30136" +msgid "Original version" +msgstr "Versión original" + +msgctxt "#30126" +msgid "Adult" +msgstr "" + +msgctxt "#30137" +msgid "Direct" +msgstr "Directos" + +msgctxt "#30131" +msgid "Videolibrary" +msgstr "Videoteca" + +msgctxt "#30151" +msgid "Watch the video" +msgstr "Ver el vídeo" + +msgctxt "#30153" +msgid "Download" +msgstr "Descargar" + +msgctxt "#30154" +msgid "Remove from favorites" +msgstr "Quitar de favoritos" + +msgctxt "#30155" +msgid "Add to favorites" +msgstr "Añadir a favoritos" + +msgctxt "#30161" +msgid "Add to videolibrary" +msgstr "Añadir a videoteca" + +msgctxt "#30162" +msgid "Search for trailer" +msgstr "Buscar trailer" + +msgctxt "#30163" +msgid "Choose an option" +msgstr "Elige una opción" + +msgctxt "#30164" +msgid "Delete this file" +msgstr "Borrar este fichero" + +msgctxt "#30501" +msgid "Paths" +msgstr "Rutas" + +msgctxt "#30998" +msgid "Shortcut" +msgstr "Acceso directo" + +msgctxt "#30999" +msgid "Add key to open Shortcut" +msgstr "Añadir tecla para acceso directo" \ No newline at end of file diff --git a/plugin.video.alfa/resources/language/Spanish (mexico)/strings.xml b/plugin.video.alfa/resources/language/Spanish (mexico)/strings.xml deleted file mode 100755 index 6d28556e..00000000 --- a/plugin.video.alfa/resources/language/Spanish (mexico)/strings.xml +++ /dev/null @@ -1,266 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<strings> - <!-- Los id disponibles son de 30000 a 30999 --> - - <!-- ======================================= --> - <!-- De 30000 a 30049: Configuración --> - <!-- ======================================= --> - - <!-- Comunes --> - <string id="30000"></string> - <string id="30001">Comprobar actualizaciones:</string> - <string id="30004">Actualizar automáticamente canales:</string> - <string id="30201">Actualizar la videoteca al abrir XBMC</string> - <string id="30002">Mostrar canales para adultos</string> - <string id="30003">Generar log detallado:</string> - <string id="30043">Forzar el modo de vista:</string> - - <!-- Acción por defecto cuando eliges un video --> - <string id="30005">Accion al seleccionar vídeo:</string> - <string id="30006">Preguntar</string> - <string id="30007">Ver en calidad baja</string> - <string id="30008">Ver en calidad alta</string> - <string id="30009"></string> - - <!-- Tipos de logos para los canales --> - <string id="30010">Logos de canales:</string> - <string id="30011">Poster (vertical)</string> - <string id="30012">Banner (horizontal)</string> - <string id="30200">Cuadrado</string> - - <!-- Cuenta premium --> - <string id="30014">Usuario:</string> - <string id="30015">Password:</string> - <string id="30031">Calidad de videos (FLV)</string> - <string id="30032">Calidad Normal (SD)</string> - <string id="30033">Calidad Alta (HD)(si existe)</string> - - <string id="30034">Usuario páginas privadas:</string> - <string id="30035">Password páginas privadas:</string> - - <!-- Otras --> - <string id="30017">Directorio de descargas:</string> - <string id="30018">Directorio de lista descargas:</string> - <string id="30030">Directorio de favoritos:</string> - <string id="30067">Directorio de la videoteca:</string> - <string id="30020">Elegir Calidad mas alta (Youtube)</string> - <string id="30021">Activar Subtitulo:</string> - <string id="30022"></string> - <string id="30066"></string> - <string id="30024">Numero de busquedas a salvar:</string> - - <string id="30019">Filtrar canales por idioma:</string> - <string id="30025">Cualquier idioma</string> - <string id="30026">Español</string> - <string id="30027">Inglés</string> - <string id="30028">Italiano</string> - <string id="30029">Portugués</string> - <string id="30046">Francés</string> - <string id="30016">Catalán</string> - <string id="30023">Euskera</string> - <string id="30036">Gallego</string> - <string id="30037">Valenciano</string> - - <string id="30038">Modo de cache:</string> - <string id="30039">Automático</string> - <string id="30040">Cachear todo</string> - <string id="30041">No cachear nada</string> - <string id="30042">Directorio de cache:</string> - - <string id="30044">Modo de reproducción:</string> - - <string id="30013"></string> - <string id="30048">Nombre del canal</string> - <string id="30049">Logo del canal</string> - <string id="30045">URL/fichero con los vídeos</string> - <string id="30047">Elementos por página</string> - - <!-- Filtros --> - <string id="30068">Filtrar por servidores:</string> - <string id="30069">Lista Blanca:</string> - <string id="30070">Lista Negra:</string> - <string id="30071">Para poner varios servidores utiliza "," como separador</string> - - - <!-- =============================================================== --> - <!-- De 30050 a 30099: Mensajes informativos - error --> - <!-- =============================================================== --> - <string id="30050">No se puede conectar con el servidor</string> - <string id="30051">El sitio web no funciona correctamente (error http %d)</string> - <string id="30052">Megavideo tiene un límite de reproducción de 72 minutos</string> - <string id="30053">Para evitar que los vídeos se corten pasado ese tiempo</string> - <string id="30054">necesitas una cuenta Premium</string> - <string id="30055">Vídeo no disponible</string> - <string id="30056">No se han podido localizar videos en la página del sitio web</string> - <string id="30057">No se puede acceder al vídeo en %s</string> - <string id="30058">Prueba en otro servidor o en otro canal</string> - <string id="30059">Error en el sitio web</string> - <string id="30060">No se puede acceder por un error en el sitio web</string> - <string id="30061">La calidad elegida no esta disponible o el video ha sido borrado</string> - <string id="30062">Prueba a reproducir en otra calidad</string> - <string id="30063">¡Canal descargado y actualizado!</string> - <string id="30064">¡Lista de canales actualizada!</string> - <string id="30065">Servidor no soportado</string> - - <!-- =============================================================== --> - <!-- De 30100 a 30149: Canales genéricos (buscador, descargas, etc.) --> - <!-- =============================================================== --> - <string id="30100">Configuración</string> - <string id="30101">Descargas</string> - <string id="30102">Favoritos</string> - <string id="30103">Buscador</string> - <string id="30104">Ayuda</string> - - <string id="30105">Se ha quitado de favoritos</string> - <string id="30106">Se ha quitado de la lista de descargas</string> - <string id="30107">Ha pasado de nuevo a la lista de descargas</string> - <string id="30108">se ha añadido a favoritos</string> - <string id="30109">se ha añadido a la lista de descargas</string> - <string id="30110">Buscar trailer para</string> - <string id="30111">Reintentar búsqueda de trailer para</string> - <string id="30112">Introduce el título a buscar</string> - <string id="30113">Modifica el titulo actual para refinar la búsqueda</string> - <string id="30114">Trailer no encontrado</string> - <string id="30115">El Trailer para %s</string> - <string id="30116">no se ha podido localizar.</string> - <string id="30117">¿Quieres refinar la búsqueda con el teclado?</string> - <string id="30135">se ha añadido a la videoteca</string> - - <string id="30130">Novedades</string> - <string id="30118">Canales</string> - <string id="30119">Seleccione una Categoría</string> - <string id="30120">Seleccione un Idioma</string> - <string id="30121">Todos</string> - <string id="30122">Películas</string> - <string id="30123">Series</string> - <string id="30124">Anime</string> - <string id="30125">Documentales</string> - <string id="30126">Adultos</string> - <string id="30136">Versión original</string> - <string id="30137">Directos</string> - <string id="30127">Latino</string> - <string id="30128">Buscador de Trailers</string> - <string id="30129">Adultos</string> - <string id="30131">Videoteca</string> - <string id="30132">Temáticos</string> - <string id="30133">Internet</string> - <string id="30134">Los nuevos</string> - - <!-- =============================================================== --> - <!-- De 30150 a 30199: Menú acción / contextual --> - <!-- =============================================================== --> - <string id="30150">Ver en calidad alta</string> - <string id="30151">Ver el vídeo</string> - <string id="30152">Ver en calidad baja</string> - <string id="30153">Descargar</string> - <string id="30154">Quitar de favoritos</string> - <string id="30155">Añadir a favoritos</string> - <string id="30156">Quitar de lista de descargas</string> - <string id="30157">Añadir a lista de descargas</string> - <string id="30158"></string> - <string id="30159">Borrar descarga definitivamente</string> - <string id="30160">Pasar de nuevo a lista de descargas</string> - <string id="30161">Añadir a videoteca</string> - <string id="30162">Buscar trailer</string> - <string id="30163">Elige una opción</string> - <string id="30164">Borrar este fichero</string> - <!-- =============================================================== --> - <!-- De 30200 a 30999: Canales individuales --> - <!-- =============================================================== --> - <!-- Context menu strings --> - <string id="30300">Eliminar esta busqueda</string> - <string id="30301">Guardar este canal en favoritos</string> - <string id="30302">Eliminar este canal de favoritos</string> - <string id="30303">Renombrar el título de este canal</string> - - <!-- Megalive menu strings --> - <string id="30401">Muralla de canales</string> - <string id="30402">Categorías</string> - <string id="30403">Canales Favoritos</string> - <string id="30404">Ver Canal por Codigo(ID)</string> - <string id="30405">Introduce el còdigo del canal</string> - - <!-- Justin.tv Category menu strings --> - <string id="30406">Añadir a Jtv favoritos</string> - <string id="30407">Remover de Jtv Favoritos</string> - <string id="30408"> (archivos)</string> - <string id="30409">listar videos archivados</string> - <string id="30410">ver el canal en vivo</string> - <string id="30411">El canal no existe o no esta en linea</string> - <string id="30412">El canal no tiene videos archivados</string> - <string id="30413">Archivo de videos</string> - <string id="30414">Canales en Vivo</string> - <string id="30415">Introducir Nombre/ID del Canal</string> - <string id="30416">Favoritos</string> - <string id="30417">Buscar</string> - <string id="30418">Usuario Justin.tv</string> - <string id="30419">Todos los Idiomas</string> - <string id="30420">Filtro de Idioma(s)</string> - <string id="30421">Todos</string> - <string id="30422">Ingrese el login de Justin TV</string> - <string id="30423">El canal [%s] esta desconectado en este momento</string> - <string id="30424">Password Justin.tv</string> - - <!-- =============================================================== --> - <!-- Subtitulos --> - <!-- =============================================================== --> - - <string id="30431">Elija la fuente de los subtitulos :</string> - <string id="30432">Folder</string> - <string id="30433">Archivo</string> - <string id="30434">Teclado</string> - <string id="30435">Directorio de subtitulos</string> - <string id="30436">Subtitulo a cargar</string> - <string id="30437">introducir direccion</string> - - <!-- LetMeWatchThis --> - <string id="40001">Películas - Novedades</string> - <string id="40002">Series - Novedades</string> - <string id="40003">!Página siguiente</string> - - <!-- =============================================================== --> - <!-- Category strings --> - <!-- =============================================================== --> - <string id="30500">Cuentas</string> - <string id="30501">Rutas</string> - <string id="30502">Otros</string> - <string id="30503">Filtros</string> - - <!-- TVShack strings --> - <string id="30900">TVShack</string> - <string id="30901">Series TV (VO)</string> - <string id="30902">Películas (VO)</string> - <string id="30903">Documentales (VO)</string> - <string id="30904">Anime (VO)</string> - <string id="30905">Música</string> - <string id="30906">Busqueda Global en TVShack</string> - <string id="30907">No se produjeron resultados de búsqueda</string> - <string id="30908">Serie - %s (%s episodios)</string> - <string id="30909">Serie - </string> - - <string id="30910">Cine - %s (%s)</string> - <string id="30911">"Música - "</string> - <string id="30912">Leyendo %s...</string> - <string id="30913">No se encontró nada que listar</string> - <string id="30914">episodio</string> - <string id="30915">episodios</string> - <string id="30916">canción</string> - <string id="30917">canciones</string> - <string id="30918"> (Nuevo)</string> - <string id="30919"> (Nuevos contenidos)</string> - - <string id="30920">AÑADIR TODOS LOS EPISODIOS A LA VIDEOTECA</string> - - <!-- =============================================================== --> - <!-- Configuracion RSS (IAMM, XTreamer y otros) --> - <!-- =============================================================== --> - <string id="31000">Media translate activado:</string> - <string id="30140">Título</string> - <string id="30165">Pulse OK para cambiar...</string> - <string id="30166">Salvar cambios</string> - <string id="30167">Salir</string> - <string id="30168">Cambios aplicados</string> - <string id="30169">Buscar</string> - <string id="30170">Actualizar canales:</string> -</strings> - diff --git a/plugin.video.alfa/resources/language/Spanish/strings.po b/plugin.video.alfa/resources/language/Spanish/strings.po new file mode 100644 index 00000000..bc41ec1b --- /dev/null +++ b/plugin.video.alfa/resources/language/Spanish/strings.po @@ -0,0 +1,264 @@ +# Kodi Media Center language file +# strings 30000 thru 30999 reserved for plugins and plugin settings +# +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Spanish) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +# empty string with id 30000 + +msgctxt "#30001" +msgid "Check for updates:" +msgstr "Comprobar actualizaciones:" + +msgctxt "#30002" +msgid "Enable adult mode:" +msgstr "Mostrar canales para adultos" + +msgctxt "#30003" +msgid "Enable debug logging:" +msgstr "Generar log detallado:" + +msgctxt "#30043" +msgid "Force view mode:" +msgstr "Forzar el modo de vista:" + +msgctxt "#30004" +msgid "Automatic update channels:" +msgstr "Actualizar automáticamente canales:" + +msgctxt "#30005" +msgid "Default play setting:" +msgstr "Accion al seleccionar vídeo:" + +msgctxt "#30006" +msgid "Ask" +msgstr "Preguntar" + +msgctxt "#30007" +msgid "Watch in low quality" +msgstr "Ver en calidad baja" + +msgctxt "#30008" +msgid "Watch in high quality" +msgstr "Ver en calidad alta" + +# empty string with id 30009 + +msgctxt "#30010" +msgid "Channel icons view:" +msgstr "Logos de canales:" + +msgctxt "#30011" +msgid "Poster (vertical)" +msgstr "Poster (vertical)" + +msgctxt "#30012" +msgid "Banner (horizontal)" +msgstr "Banner (horizontal)" + +msgctxt "#30200" +msgid "Square" +msgstr "Cuadrado" + +# empty string with id 30013 + +msgctxt "#30014" +msgid "Username:" +msgstr "Usuario:" + +msgctxt "#30015" +msgid "Password:" +msgstr "Password:" + +# empty string with id 30016 + +msgctxt "#30017" +msgid "Download path:" +msgstr "Directorio de descargas:" + +msgctxt "#30018" +msgid "Download list path:" +msgstr "Directorio de lista descargas:" + +msgctxt "#30067" +msgid "Videolibrary path:" +msgstr "Directorio de la videoteca:" + +msgctxt "#30019" +msgid "Filter channels by language:" +msgstr "Filtrar canales por idioma:" + +msgctxt "#30044" +msgid "Play mode:" +msgstr "Modo de reproducción:" + +msgctxt "#30068" +msgid "Filter by servers:" +msgstr "Filtrar por servidores:" + +msgctxt "#30050" +msgid "Server connection error" +msgstr "No se puede conectar con el servidor" + +msgctxt "#30051" +msgid "Website error message (http code %d)" +msgstr "El sitio web no funciona correctamente (error http %d)" + +msgctxt "#30055" +msgid "Video not available" +msgstr "Vídeo no disponible" + +msgctxt "#30057" +msgid "The video has been removed from %s" +msgstr "No se puede acceder al vídeo en %s" + +msgctxt "#30058" +msgid "Try another server or channel" +msgstr "Prueba en otro servidor o en otro canal" + +msgctxt "#30065" +msgid "Unsopported Server" +msgstr "Servidor no soportado" + +msgctxt "#30100" +msgid "Configuration" +msgstr "Configuración" + +msgctxt "#30101" +msgid "Downloads" +msgstr "Descargas" + +msgctxt "#30102" +msgid "Favorites" +msgstr "Favoritos" + +msgctxt "#30103" +msgid "Global search" +msgstr "Buscador" + +msgctxt "#30104" +msgid "Help" +msgstr "Ayuda" + +msgctxt "#30105" +msgid "Removed from favorites" +msgstr "Se ha quitado de favoritos" + +msgctxt "#30108" +msgid "added to favorites" +msgstr "se ha añadido a favoritos" + +msgctxt "#30109" +msgid "added to download list" +msgstr "se ha añadido a la lista de descargas" + +msgctxt "#30112" +msgid "Enter title to search" +msgstr "Introduce el título a buscar" + +msgctxt "#30135" +msgid "added to the videolibrary" +msgstr "se ha añadido a la videoteca" + +msgctxt "#30130" +msgid "Recent" +msgstr "Novedades" + +msgctxt "#30118" +msgid "Channels" +msgstr "Canales" + +msgctxt "#30119" +msgid "Choose a Category" +msgstr "Seleccione una Categoría" + +msgctxt "#30121" +msgid "All" +msgstr "Todos" + +msgctxt "#30122" +msgid "Movies" +msgstr "Películas" + +msgctxt "#30123" +msgid "TV Shows" +msgstr "Series" + +msgctxt "#30124" +msgid "Anime" +msgstr "Anime" + +msgctxt "#30125" +msgid "Documentaries" +msgstr "Documentales" + +msgctxt "#30136" +msgid "Original version" +msgstr "Versión original" + +msgctxt "#30126" +msgid "Adult" +msgstr "" + +msgctxt "#30137" +msgid "Direct" +msgstr "Directos" + +msgctxt "#30131" +msgid "Videolibrary" +msgstr "Videoteca" + +msgctxt "#30151" +msgid "Watch the video" +msgstr "Ver el vídeo" + +msgctxt "#30153" +msgid "Download" +msgstr "Descargar" + +msgctxt "#30154" +msgid "Remove from favorites" +msgstr "Quitar de favoritos" + +msgctxt "#30155" +msgid "Add to favorites" +msgstr "Añadir a favoritos" + +msgctxt "#30161" +msgid "Add to videolibrary" +msgstr "Añadir a videoteca" + +msgctxt "#30162" +msgid "Search for trailer" +msgstr "Buscar trailer" + +msgctxt "#30163" +msgid "Choose an option" +msgstr "Elige una opción" + +msgctxt "#30164" +msgid "Delete this file" +msgstr "Borrar este fichero" + +msgctxt "#30501" +msgid "Paths" +msgstr "Rutas" + +msgctxt "#30998" +msgid "Shortcut" +msgstr "Acceso directo" + +msgctxt "#30999" +msgid "Add key to open Shortcut" +msgstr "Añadir tecla para acceso directo" \ No newline at end of file diff --git a/plugin.video.alfa/resources/language/Spanish/strings.xml b/plugin.video.alfa/resources/language/Spanish/strings.xml deleted file mode 100755 index 6d28556e..00000000 --- a/plugin.video.alfa/resources/language/Spanish/strings.xml +++ /dev/null @@ -1,266 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<strings> - <!-- Los id disponibles son de 30000 a 30999 --> - - <!-- ======================================= --> - <!-- De 30000 a 30049: Configuración --> - <!-- ======================================= --> - - <!-- Comunes --> - <string id="30000"></string> - <string id="30001">Comprobar actualizaciones:</string> - <string id="30004">Actualizar automáticamente canales:</string> - <string id="30201">Actualizar la videoteca al abrir XBMC</string> - <string id="30002">Mostrar canales para adultos</string> - <string id="30003">Generar log detallado:</string> - <string id="30043">Forzar el modo de vista:</string> - - <!-- Acción por defecto cuando eliges un video --> - <string id="30005">Accion al seleccionar vídeo:</string> - <string id="30006">Preguntar</string> - <string id="30007">Ver en calidad baja</string> - <string id="30008">Ver en calidad alta</string> - <string id="30009"></string> - - <!-- Tipos de logos para los canales --> - <string id="30010">Logos de canales:</string> - <string id="30011">Poster (vertical)</string> - <string id="30012">Banner (horizontal)</string> - <string id="30200">Cuadrado</string> - - <!-- Cuenta premium --> - <string id="30014">Usuario:</string> - <string id="30015">Password:</string> - <string id="30031">Calidad de videos (FLV)</string> - <string id="30032">Calidad Normal (SD)</string> - <string id="30033">Calidad Alta (HD)(si existe)</string> - - <string id="30034">Usuario páginas privadas:</string> - <string id="30035">Password páginas privadas:</string> - - <!-- Otras --> - <string id="30017">Directorio de descargas:</string> - <string id="30018">Directorio de lista descargas:</string> - <string id="30030">Directorio de favoritos:</string> - <string id="30067">Directorio de la videoteca:</string> - <string id="30020">Elegir Calidad mas alta (Youtube)</string> - <string id="30021">Activar Subtitulo:</string> - <string id="30022"></string> - <string id="30066"></string> - <string id="30024">Numero de busquedas a salvar:</string> - - <string id="30019">Filtrar canales por idioma:</string> - <string id="30025">Cualquier idioma</string> - <string id="30026">Español</string> - <string id="30027">Inglés</string> - <string id="30028">Italiano</string> - <string id="30029">Portugués</string> - <string id="30046">Francés</string> - <string id="30016">Catalán</string> - <string id="30023">Euskera</string> - <string id="30036">Gallego</string> - <string id="30037">Valenciano</string> - - <string id="30038">Modo de cache:</string> - <string id="30039">Automático</string> - <string id="30040">Cachear todo</string> - <string id="30041">No cachear nada</string> - <string id="30042">Directorio de cache:</string> - - <string id="30044">Modo de reproducción:</string> - - <string id="30013"></string> - <string id="30048">Nombre del canal</string> - <string id="30049">Logo del canal</string> - <string id="30045">URL/fichero con los vídeos</string> - <string id="30047">Elementos por página</string> - - <!-- Filtros --> - <string id="30068">Filtrar por servidores:</string> - <string id="30069">Lista Blanca:</string> - <string id="30070">Lista Negra:</string> - <string id="30071">Para poner varios servidores utiliza "," como separador</string> - - - <!-- =============================================================== --> - <!-- De 30050 a 30099: Mensajes informativos - error --> - <!-- =============================================================== --> - <string id="30050">No se puede conectar con el servidor</string> - <string id="30051">El sitio web no funciona correctamente (error http %d)</string> - <string id="30052">Megavideo tiene un límite de reproducción de 72 minutos</string> - <string id="30053">Para evitar que los vídeos se corten pasado ese tiempo</string> - <string id="30054">necesitas una cuenta Premium</string> - <string id="30055">Vídeo no disponible</string> - <string id="30056">No se han podido localizar videos en la página del sitio web</string> - <string id="30057">No se puede acceder al vídeo en %s</string> - <string id="30058">Prueba en otro servidor o en otro canal</string> - <string id="30059">Error en el sitio web</string> - <string id="30060">No se puede acceder por un error en el sitio web</string> - <string id="30061">La calidad elegida no esta disponible o el video ha sido borrado</string> - <string id="30062">Prueba a reproducir en otra calidad</string> - <string id="30063">¡Canal descargado y actualizado!</string> - <string id="30064">¡Lista de canales actualizada!</string> - <string id="30065">Servidor no soportado</string> - - <!-- =============================================================== --> - <!-- De 30100 a 30149: Canales genéricos (buscador, descargas, etc.) --> - <!-- =============================================================== --> - <string id="30100">Configuración</string> - <string id="30101">Descargas</string> - <string id="30102">Favoritos</string> - <string id="30103">Buscador</string> - <string id="30104">Ayuda</string> - - <string id="30105">Se ha quitado de favoritos</string> - <string id="30106">Se ha quitado de la lista de descargas</string> - <string id="30107">Ha pasado de nuevo a la lista de descargas</string> - <string id="30108">se ha añadido a favoritos</string> - <string id="30109">se ha añadido a la lista de descargas</string> - <string id="30110">Buscar trailer para</string> - <string id="30111">Reintentar búsqueda de trailer para</string> - <string id="30112">Introduce el título a buscar</string> - <string id="30113">Modifica el titulo actual para refinar la búsqueda</string> - <string id="30114">Trailer no encontrado</string> - <string id="30115">El Trailer para %s</string> - <string id="30116">no se ha podido localizar.</string> - <string id="30117">¿Quieres refinar la búsqueda con el teclado?</string> - <string id="30135">se ha añadido a la videoteca</string> - - <string id="30130">Novedades</string> - <string id="30118">Canales</string> - <string id="30119">Seleccione una Categoría</string> - <string id="30120">Seleccione un Idioma</string> - <string id="30121">Todos</string> - <string id="30122">Películas</string> - <string id="30123">Series</string> - <string id="30124">Anime</string> - <string id="30125">Documentales</string> - <string id="30126">Adultos</string> - <string id="30136">Versión original</string> - <string id="30137">Directos</string> - <string id="30127">Latino</string> - <string id="30128">Buscador de Trailers</string> - <string id="30129">Adultos</string> - <string id="30131">Videoteca</string> - <string id="30132">Temáticos</string> - <string id="30133">Internet</string> - <string id="30134">Los nuevos</string> - - <!-- =============================================================== --> - <!-- De 30150 a 30199: Menú acción / contextual --> - <!-- =============================================================== --> - <string id="30150">Ver en calidad alta</string> - <string id="30151">Ver el vídeo</string> - <string id="30152">Ver en calidad baja</string> - <string id="30153">Descargar</string> - <string id="30154">Quitar de favoritos</string> - <string id="30155">Añadir a favoritos</string> - <string id="30156">Quitar de lista de descargas</string> - <string id="30157">Añadir a lista de descargas</string> - <string id="30158"></string> - <string id="30159">Borrar descarga definitivamente</string> - <string id="30160">Pasar de nuevo a lista de descargas</string> - <string id="30161">Añadir a videoteca</string> - <string id="30162">Buscar trailer</string> - <string id="30163">Elige una opción</string> - <string id="30164">Borrar este fichero</string> - <!-- =============================================================== --> - <!-- De 30200 a 30999: Canales individuales --> - <!-- =============================================================== --> - <!-- Context menu strings --> - <string id="30300">Eliminar esta busqueda</string> - <string id="30301">Guardar este canal en favoritos</string> - <string id="30302">Eliminar este canal de favoritos</string> - <string id="30303">Renombrar el título de este canal</string> - - <!-- Megalive menu strings --> - <string id="30401">Muralla de canales</string> - <string id="30402">Categorías</string> - <string id="30403">Canales Favoritos</string> - <string id="30404">Ver Canal por Codigo(ID)</string> - <string id="30405">Introduce el còdigo del canal</string> - - <!-- Justin.tv Category menu strings --> - <string id="30406">Añadir a Jtv favoritos</string> - <string id="30407">Remover de Jtv Favoritos</string> - <string id="30408"> (archivos)</string> - <string id="30409">listar videos archivados</string> - <string id="30410">ver el canal en vivo</string> - <string id="30411">El canal no existe o no esta en linea</string> - <string id="30412">El canal no tiene videos archivados</string> - <string id="30413">Archivo de videos</string> - <string id="30414">Canales en Vivo</string> - <string id="30415">Introducir Nombre/ID del Canal</string> - <string id="30416">Favoritos</string> - <string id="30417">Buscar</string> - <string id="30418">Usuario Justin.tv</string> - <string id="30419">Todos los Idiomas</string> - <string id="30420">Filtro de Idioma(s)</string> - <string id="30421">Todos</string> - <string id="30422">Ingrese el login de Justin TV</string> - <string id="30423">El canal [%s] esta desconectado en este momento</string> - <string id="30424">Password Justin.tv</string> - - <!-- =============================================================== --> - <!-- Subtitulos --> - <!-- =============================================================== --> - - <string id="30431">Elija la fuente de los subtitulos :</string> - <string id="30432">Folder</string> - <string id="30433">Archivo</string> - <string id="30434">Teclado</string> - <string id="30435">Directorio de subtitulos</string> - <string id="30436">Subtitulo a cargar</string> - <string id="30437">introducir direccion</string> - - <!-- LetMeWatchThis --> - <string id="40001">Películas - Novedades</string> - <string id="40002">Series - Novedades</string> - <string id="40003">!Página siguiente</string> - - <!-- =============================================================== --> - <!-- Category strings --> - <!-- =============================================================== --> - <string id="30500">Cuentas</string> - <string id="30501">Rutas</string> - <string id="30502">Otros</string> - <string id="30503">Filtros</string> - - <!-- TVShack strings --> - <string id="30900">TVShack</string> - <string id="30901">Series TV (VO)</string> - <string id="30902">Películas (VO)</string> - <string id="30903">Documentales (VO)</string> - <string id="30904">Anime (VO)</string> - <string id="30905">Música</string> - <string id="30906">Busqueda Global en TVShack</string> - <string id="30907">No se produjeron resultados de búsqueda</string> - <string id="30908">Serie - %s (%s episodios)</string> - <string id="30909">Serie - </string> - - <string id="30910">Cine - %s (%s)</string> - <string id="30911">"Música - "</string> - <string id="30912">Leyendo %s...</string> - <string id="30913">No se encontró nada que listar</string> - <string id="30914">episodio</string> - <string id="30915">episodios</string> - <string id="30916">canción</string> - <string id="30917">canciones</string> - <string id="30918"> (Nuevo)</string> - <string id="30919"> (Nuevos contenidos)</string> - - <string id="30920">AÑADIR TODOS LOS EPISODIOS A LA VIDEOTECA</string> - - <!-- =============================================================== --> - <!-- Configuracion RSS (IAMM, XTreamer y otros) --> - <!-- =============================================================== --> - <string id="31000">Media translate activado:</string> - <string id="30140">Título</string> - <string id="30165">Pulse OK para cambiar...</string> - <string id="30166">Salvar cambios</string> - <string id="30167">Salir</string> - <string id="30168">Cambios aplicados</string> - <string id="30169">Buscar</string> - <string id="30170">Actualizar canales:</string> -</strings> - diff --git a/plugin.video.alfa/resources/media/channels/banner/yespornplease.png b/plugin.video.alfa/resources/media/channels/banner/yespornplease.png new file mode 100644 index 00000000..07084bd7 Binary files /dev/null and b/plugin.video.alfa/resources/media/channels/banner/yespornplease.png differ diff --git a/plugin.video.alfa/resources/media/channels/thumb/yespornplease.png b/plugin.video.alfa/resources/media/channels/thumb/yespornplease.png new file mode 100644 index 00000000..20c30eec Binary files /dev/null and b/plugin.video.alfa/resources/media/channels/thumb/yespornplease.png differ diff --git a/plugin.video.alfa/resources/media/servers/server_vshare.png b/plugin.video.alfa/resources/media/servers/server_vshare.png new file mode 100644 index 00000000..769a9a11 Binary files /dev/null and b/plugin.video.alfa/resources/media/servers/server_vshare.png differ diff --git a/plugin.video.alfa/resources/settings.xml b/plugin.video.alfa/resources/settings.xml old mode 100644 new mode 100755 index b5bbd959..61ce12cd --- a/plugin.video.alfa/resources/settings.xml +++ b/plugin.video.alfa/resources/settings.xml @@ -4,7 +4,7 @@ <setting id="player_mode" type="enum" values="Direct|SetResolvedUrl|Built-In|Download and Play" label="30044" default="0"/> <setting id="default_action" type="enum" lvalues="30006|30007|30008" label="30005" default="0"/> <setting id="thumbnail_type" type="enum" lvalues="30011|30012|30200" label="30010" default="2"/> - <setting id="channel_language" type="labelenum" values="all|es|en|it" label="30019" default="all"/> + <setting id="channel_language" type="labelenum" values="all|cast|lat" label="30019" default="all"/> <setting id="forceview" type="bool" label="30043" default="false"/> <setting id="debug" type="bool" label="30003" default="false"/> <setting label="Uso de servidores" type="lsep"/> @@ -19,12 +19,6 @@ <setting id="adult_request_password" type="bool" label="Solicitar contraseña para abrir canales de adultos" enable="!eq(-1,0)+!eq(-2,)" default="true"/> <setting id="adult_aux_new_password1" type="text" label="Nueva contraseña:" option="hidden" enable="!eq(-3,)" default=""/> <setting id="adult_aux_new_password2" type="text" label="Confirmar nueva contraseña:" option="hidden" enable="!eq(-1,)" default=""/> - - <!--<setting type="sep"/>--> - <!--<setting label="Actualizaciones" type="lsep"/>--> - <!--<setting id="plugin_updates_available" type="number" label="Number of updates available" default="0" visible="false"/>--> - <!--<setting id="check_for_plugin_updates" type="bool" label="30001" default="true"/>--> - <!--<setting id="check_for_channel_updates" type="bool" label="30004" default="true"/>--> </category> <!-- Path downloads and subtitles --> @@ -45,9 +39,12 @@ <setting id="videolibrary_kodi" type="bool" label="Autoconfigurar videoteca de XBMC/Kodi para contenido de Alfa" enable="lt(-1,2)+eq(0,false)" default="false"/> </category> - <category label="Otros"><!--30503 --> + <category label="Otros"> <setting label="Info de películas/series en menú contextual" type="lsep"/> <setting id="infoplus" type="bool" label="Mostrar opción Infoplus:" default="true"/> <setting id="extended_info" type="bool" label="Mostrar opción ExtendedInfo (Necesario addon externo):" default="false"/> - </category> + + <setting label="Botones/Teclas de acceso (Cambios requieren reiniciar Kodi)" type="lsep"/> + <setting id="shortcut_key" type="action" label="30999" action="RunPlugin(plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAia2V5bWFwIg0KfQ==)" /> + </category> </settings> diff --git a/plugin.video.alfa/resources/skins/Default/720p/ShortCutMenu.xml b/plugin.video.alfa/resources/skins/Default/720p/ShortCutMenu.xml new file mode 100644 index 00000000..a0e50b28 --- /dev/null +++ b/plugin.video.alfa/resources/skins/Default/720p/ShortCutMenu.xml @@ -0,0 +1,229 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<window> + <depth>0.52</depth> + <coordinates> + <left>147</left> + <top>180</top> + </coordinates> + <defaultcontrol always="true">32500</defaultcontrol> + <animation type="WindowOpen" reversible="false"> + <effect type="zoom" start="80" end="100" center="960,540" delay="160" tween="back" time="240" /> + <effect type="fade" delay="160" end="100" time="240" /> + </animation> + <animation type="WindowClose" reversible="false"> + <effect type="zoom" start="100" end="80" center="960,540" easing="in" tween="back" time="240" /> + <effect type="fade" start="100" end="0" time="240" /> + </animation> + <controls> + <control type="image"> + <left>0</left> + <top>0</top> + <width>969</width> + <height>283</height> + <texture border="2">Shortcut/dialog-bg-solid.png</texture> + </control> + <control type="image"> + <left>0</left> + <top>0</top> + <width>969</width> + <height>70</height> + <texture colordiffuse="FF12B2E7" border="2">Shortcut/white70.png</texture> + </control> + <control type="label" id="30000"> + <textoffsetx>70</textoffsetx> + <left>-30</left> + <top>0</top> + <width>969</width> + <height>70</height> + <font>font20_title</font> + <label>Alfa - $ADDON[plugin.video.alfa 30998]</label> + <align>left</align> + <aligny>center</aligny> + <shadowcolor>black</shadowcolor> + </control> + <control type="button"> + <left>-1920</left> + <top>-1080</top> + <width>5760</width> + <height>3240</height> + <texturefocus>-</texturefocus> + <texturenofocus>-</texturenofocus> + <onclick>Action(close)</onclick> + </control> + <control type="button"> + <description>button overlay to avoid closing in dialog area</description> + <left>0</left> + <top>0</top> + <width>969</width> + <height>283</height> + <texturefocus>-</texturefocus> + <texturenofocus>-</texturenofocus> + <onclick>noop</onclick> + </control> + <control type="radiobutton" id="32501"> + <left>969</left> + <top>11</top> + <width>48</width> + <height>48</height> + <radiowidth>48</radiowidth> + <radioheight>48</radioheight> + <texturefocus>-</texturefocus> + <texturenofocus>-</texturenofocus> + <label></label> + <animation effect="slide" end="-70,0" time="0" condition="true">Conditional</animation> + <textureradioofffocus colordiffuse="EEFFFFFF">Shortcut/close.png</textureradioofffocus> + <textureradiooffnofocus colordiffuse="EEFFFFFF">Shortcut/logo.png</textureradiooffnofocus> + <textureradioonfocus colordiffuse="EEFFFFFF">Shortcut/close.png</textureradioonfocus> + <textureradioonnofocus colordiffuse="EEFFFFFF">Shortcut/logo.png</textureradioonnofocus> + <onclick>Action(close)</onclick> + <onup>32500</onup> + <ondown>32500</ondown> + </control> + <control type="group"> + <control type="group"> + <control type="image"> + <left>-21</left> + <top>50</top> + <width>1011</width> + <height>253</height> + <texture border="40">Shortcut/dialogbutton-nofo.png</texture> + </control> + <control type="list" id="32500"> + <left>-139</left> + <top>55</top> + <width>980</width> + <height>220</height> + <onup>32501</onup> + <ondown>61</ondown> + <orientation>horizontal</orientation> + <scrolltime>200</scrolltime> + <pagecontrol>61</pagecontrol> + <animation effect="slide" start="0,0" end="10,0" time="0" condition="true">Conditional</animation> + <animation effect="slide" end="120,0" time="0" condition="!Control.IsVisible(5)">Conditional</animation> + <itemlayout height="225" width="323"> + <top>2</top> + <control type="image"> + <top>5</top> + <left>10</left> + <width>347</width> + <height>260</height> + <texture border="40">Shortcut/button-nofo.png</texture> + </control> + <control type="image"> + <left>30</left> + <top>149</top> + <width>306</width> + <height>75</height> + <texture colordiffuse="60FFFFFF">Shortcut/black.png</texture> + </control> + <control type="image"> + <left>95</left> + <top>23</top> + <width>160</width> + <height>130</height> + <texture>$INFO[ListItem.Property(thumb)]</texture> + <aspectratio>keep</aspectratio> + <align>center</align> + </control> + <control type="image"> + <left>329</left> + <top>24</top> + <width>50</width> + <height>50</height> + <aspectratio>keep</aspectratio> + <texture>$INFO[ListItem.Overlay]</texture> + </control> + <control type="textbox"> + <left>25</left> + <top>146</top> + <width>300</width> + <height>74</height> + <label>[COLOR grey]$INFO[ListItem.Label][/COLOR]</label> + <shadowcolor>text_shadow</shadowcolor> + <font>font12</font> + <align>center</align> + <aligny>center</aligny> + </control> + </itemlayout> + <focusedlayout height="225" width="323"> + <control type="group"> + <depth>0.10</depth> + <animation type="Focus" reversible="false"> + <effect type="zoom" center="auto" start="100" end="108" time="250" tween="sine" /> + </animation> + <animation type="UnFocus" reversible="false"> + <effect type="zoom" center="auto" start="108" end="100" time="150" tween="sine" /> + </animation> + <top>2</top> + <control type="image"> + <width>340</width> + <height>245</height> + <texture border="40">Shortcut/button-nofo.png</texture> + <animation effect="fade" start="0" end="100" time="0">Unfocus</animation> + <animation effect="fade" start="100" end="0" time="0">Focus</animation> + </control> + <control type="image"> + <width>340</width> + <height>237</height> + <texture border="40" colordiffuse="FF12B2E7">Shortcut/button-fo.png</texture> + <animation effect="fade" start="100" end="0" time="0">Unfocus</animation> + </control> + <control type="image"> + <left>5</left> + <top>24</top> + <width>50</width> + <height>50</height> + <aspectratio>keep</aspectratio> + <texture>$INFO[ListItem.Overlay]</texture> + </control> + <control type="image"> + <left>23</left> + <top>149</top> + <width>298</width> + <height>75</height> + <texture colordiffuse="60FFFFFF">Shortcut/black.png</texture> + </control> + <control type="image"> + <left>95</left> + <top>23</top> + <width>160</width> + <height>130</height> + <texture>$INFO[ListItem.Property(thumb)]</texture> + <aspectratio>keep</aspectratio> + <align>center</align> + </control> + <control type="textbox"> + <left>25</left> + <top>146</top> + <width>300</width> + <height>74</height> + <font>font12</font> + <label>$INFO[ListItem.Label]</label> + <align>center</align> + <aligny>center</aligny> + </control> + </control> + </focusedlayout> + </control> + <control type="scrollbar" id="61"> + <left>-122</left> + <top>280</top> + <width>972</width> + <height>15</height> + <texturesliderbackground colordiffuse="FFE6E6E6">Shortcut/white.png</texturesliderbackground> + <texturesliderbar colordiffuse="FF12D2E7">Shortcut/white.png</texturesliderbar> + <texturesliderbarfocus colordiffuse="FF12B2E7">Shortcut/white.png</texturesliderbarfocus> + <textureslidernib>-</textureslidernib> + <textureslidernibfocus>-</textureslidernibfocus> + <showonepage>false</showonepage> + <orientation>horizontal</orientation> + <onleft>32500</onleft> + <onright>32500</onright> + <ondown>32500</ondown> + <onup>32500</onup> + <animation effect="slide" end="120,0" time="0" condition="!Control.IsVisible(5)">Conditional</animation> + </control> + </control> + </control> + </controls> +</window> diff --git a/plugin.video.alfa/resources/skins/Default/media/Shortcut/button-fo.png b/plugin.video.alfa/resources/skins/Default/media/Shortcut/button-fo.png new file mode 100755 index 00000000..a161d6ef Binary files /dev/null and b/plugin.video.alfa/resources/skins/Default/media/Shortcut/button-fo.png differ diff --git a/plugin.video.alfa/resources/skins/Default/media/Shortcut/close.png b/plugin.video.alfa/resources/skins/Default/media/Shortcut/close.png new file mode 100755 index 00000000..0a144666 Binary files /dev/null and b/plugin.video.alfa/resources/skins/Default/media/Shortcut/close.png differ diff --git a/plugin.video.alfa/resources/skins/Default/media/Shortcut/dialog-bg-solid-white.png b/plugin.video.alfa/resources/skins/Default/media/Shortcut/dialog-bg-solid-white.png new file mode 100755 index 00000000..225aae63 Binary files /dev/null and b/plugin.video.alfa/resources/skins/Default/media/Shortcut/dialog-bg-solid-white.png differ diff --git a/plugin.video.alfa/resources/skins/Default/media/Shortcut/dialog-bg-solid.png b/plugin.video.alfa/resources/skins/Default/media/Shortcut/dialog-bg-solid.png new file mode 100755 index 00000000..e8c13ebd Binary files /dev/null and b/plugin.video.alfa/resources/skins/Default/media/Shortcut/dialog-bg-solid.png differ diff --git a/plugin.video.alfa/resources/skins/Default/media/Shortcut/logo.png b/plugin.video.alfa/resources/skins/Default/media/Shortcut/logo.png new file mode 100755 index 00000000..d8a680fe Binary files /dev/null and b/plugin.video.alfa/resources/skins/Default/media/Shortcut/logo.png differ diff --git a/plugin.video.alfa/resources/skins/Default/media/Shortcut/white.png b/plugin.video.alfa/resources/skins/Default/media/Shortcut/white.png new file mode 100755 index 00000000..528c66f6 Binary files /dev/null and b/plugin.video.alfa/resources/skins/Default/media/Shortcut/white.png differ diff --git a/plugin.video.alfa/resources/skins/Default/media/Shortcut/white70.png b/plugin.video.alfa/resources/skins/Default/media/Shortcut/white70.png new file mode 100755 index 00000000..d428a73a Binary files /dev/null and b/plugin.video.alfa/resources/skins/Default/media/Shortcut/white70.png differ diff --git a/plugin.video.alfa/servers/raptu.json b/plugin.video.alfa/servers/bitp.json old mode 100755 new mode 100644 similarity index 64% rename from plugin.video.alfa/servers/raptu.json rename to plugin.video.alfa/servers/bitp.json index 088063bd..aeb7c8be --- a/plugin.video.alfa/servers/raptu.json +++ b/plugin.video.alfa/servers/bitp.json @@ -1,53 +1,53 @@ -{ - "active": true, - "changes": [ - { - "date": "09/05/2017", - "description": "Agregado otro tipo de url de los videos y detección de subtítulos" - }, - { - "date": "16/02/2017", - "description": "Primera versión" - } - ], - "find_videos": { - "ignore_urls": [], - "patterns": [ - { - "pattern": "raptu.com/(?:\\?v=|embed/|e/)([A-z0-9]+)", - "url": "https://raptu.com/embed/\\1" - } - ] - }, - "free": true, - "id": "raptu", - "name": "raptu", - "settings": [ - { - "default": false, - "enabled": true, - "id": "black_list", - "label": "Incluir en lista negra", - "type": "bool", - "visible": true - }, - { - "default": 0, - "enabled": true, - "id": "favorites_servers_list", - "label": "Incluir en lista de favoritos", - "lvalues": [ - "No", - "1", - "2", - "3", - "4", - "5" - ], - "type": "list", - "visible": false - } - ], - "thumbnail": "http://i.imgur.com/quVK1j0.png?1", - "version": 1 -} \ No newline at end of file +{ + "active": true, + "changes": [ + { + "date": "18/09/2017", + "description": "Versión inicial" + } + ], + "find_videos": { + "ignore_urls": [], + "patterns": [ + { + "pattern": "https://www.bitporno.com/e/([A-z0-9]+)", + "url": "https://www.bitporno.com/e/\\1" + }, + { + "pattern": "raptu.com/(?:\\?v=|embed/|e/)([A-z0-9]+)", + "url": "https://www.bitporno.com/e/\\1" + } + ] + }, + "free": true, + "id": "bitp", + "name": "bitp", + "settings": [ + { + "default": false, + "enabled": true, + "id": "black_list", + "label": "Incluir en lista negra", + "type": "bool", + "visible": true + }, + { + "default": 0, + "enabled": true, + "id": "favorites_servers_list", + "label": "Incluir en lista de favoritos", + "lvalues": [ + "No", + "1", + "2", + "3", + "4", + "5" + ], + "type": "list", + "visible": false + } + ], + "thumbnail": "https://s26.postimg.org/maiur9tmx/bitp1.png", + "version": 1 +} diff --git a/plugin.video.alfa/servers/bitp.py b/plugin.video.alfa/servers/bitp.py new file mode 100644 index 00000000..7ca99b97 --- /dev/null +++ b/plugin.video.alfa/servers/bitp.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------ +# Alfa addon - KODI Plugin +# Conector para bitporno +# https://github.com/alfa-addon +# ------------------------------------------------------------ + +from core import httptools +from core import scrapertools +from platformcode import logger + + +def test_video_exists(page_url): + logger.info("(page_url='%s')" % page_url) + data = httptools.downloadpage(page_url).data + if "Object not found" in data or "no longer exists" in data or '"sources": [false]' in data: + return False, "[bitp] El archivo no existe o ha sido borrado" + + return True, "" + + +def get_video_url(page_url, user="", password="", video_password=""): + logger.info("(page_url='%s')" % page_url) + video_urls = [] + data = httptools.downloadpage(page_url).data + videourl = scrapertools.find_multiple_matches(data, 'file":"([^"]+).*?label":"([^"]+)') + scrapertools.printMatches(videourl) + for scrapedurl, scrapedquality in videourl: + if "loadthumb" in scrapedurl: + continue + scrapedurl = scrapedurl.replace("\\","") + video_urls.append([scrapedquality + " [bitp]", scrapedurl]) + video_urls.sort(key=lambda it: int(it[0].split("p ", 1)[0])) + return video_urls diff --git a/plugin.video.alfa/servers/cloudy.json b/plugin.video.alfa/servers/cloudy.json index e6ad3b7a..a0d0f523 100755 --- a/plugin.video.alfa/servers/cloudy.json +++ b/plugin.video.alfa/servers/cloudy.json @@ -15,7 +15,7 @@ "patterns": [ { "pattern": "cloudy.ec/(?:embed.php\\?id=|v/)([A-z0-9]+)", - "url": "https://www.cloudy.ec/embed.php?id=\\1" + "url": "https://www.cloudy.ec/embed.php?id=\\1&playerPage=1" } ] }, @@ -49,4 +49,4 @@ } ], "version": 1 -} \ No newline at end of file +} diff --git a/plugin.video.alfa/servers/fastplay.py b/plugin.video.alfa/servers/fastplay.py index 1d958299..91a36a94 100755 --- a/plugin.video.alfa/servers/fastplay.py +++ b/plugin.video.alfa/servers/fastplay.py @@ -8,10 +8,12 @@ from platformcode import logger def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) - data = httptools.downloadpage(page_url).data + data = httptools.downloadpage(page_url) - if "Object not found" in data or "longer exists on our servers" in data: + if "Object not found" in data.data or "longer exists on our servers" in data.data: return False, "[Fastplay] El archivo no existe o ha sido borrado" + if data.code == 500: + return False, "[Fastplay] Error interno del servidor" return True, "" diff --git a/plugin.video.alfa/servers/fileserve.py b/plugin.video.alfa/servers/fileserve.py deleted file mode 100755 index 90d89d08..00000000 --- a/plugin.video.alfa/servers/fileserve.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from core import scrapertools -from platformcode import logger - - -def test_video_exists(page_url): - logger.info("(page_url='%s')" % page_url) - - # Existe: http://www.fileserve.com/file/E5Y5R5E - # No existe: - data = scrapertools.cache_page(page_url) - patron = '<div class="panel file_download">[^<]+<img src="/images/down_arrow.gif"[^<]+<h1>([^<]+)<' - matches = re.compile(patron, re.DOTALL).findall(data) - - if len(matches) > 0: - return True, "" - else: - patron = '<li class="title"><h1>(File not available)</h1>' - matches = re.compile(patron, re.DOTALL).findall(data) - if len(matches) > 0: - return False, "El archivo ya no está disponible<br/>en fileserve o ha sido borrado" - - return True, "" - - -def get_video_url(page_url, premium=False, user="", password="", video_password=""): - logger.info("(page_url='%s')" % page_url) - - video_urls = [] - - if premium: - # Accede a la home para precargar la cookie - data = scrapertools.cache_page("http://fileserve.com/index.php") - - # Hace el login - url = "http://fileserve.com/login.php" - post = "loginUserName=%s&loginUserPassword=%s&autoLogin=on&ppp=102&loginFormSubmit=Login" % (user, password) - data = scrapertools.cache_page(url, post=post) - - location = scrapertools.get_header_from_response(page_url, header_to_get="location") - logger.info("location=" + location) - - if location.startswith("http"): - extension = location[-4:] - video_urls.append(["%s (Premium) [fileserve]" % extension, location]) - - for video_url in video_urls: - logger.info("%s - %s" % (video_url[0], video_url[1])) - - return video_urls diff --git a/plugin.video.alfa/servers/flashx.json b/plugin.video.alfa/servers/flashx.json index af46c3c0..ce0c3633 100644 --- a/plugin.video.alfa/servers/flashx.json +++ b/plugin.video.alfa/servers/flashx.json @@ -19,7 +19,7 @@ "patterns": [ { "pattern": "flashx.(?:tv|pw)/(?:embed.php\\?c=|embed-|playvid-|)([A-z0-9]+)", - "url": "https://www.flashx.tv/playvid-\\1.html" + "url": "https://www.flashx.tv/\\1.html" } ] }, diff --git a/plugin.video.alfa/servers/flashx.py b/plugin.video.alfa/servers/flashx.py index e15d493c..69ad0430 100644 --- a/plugin.video.alfa/servers/flashx.py +++ b/plugin.video.alfa/servers/flashx.py @@ -27,105 +27,76 @@ def test_video_exists(page_url): def get_video_url(page_url, premium=False, user="", password="", video_password=""): logger.info("url=" + page_url) - # Lo pide una vez - data = httptools.downloadpage(page_url, cookies=False).data + headers = {'Host': 'www.flashx.tv', + 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.5', + 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', + 'Cookie': ''} + data = httptools.downloadpage(page_url, headers=headers, replace_headers=True).data + flashx_id = scrapertools.find_single_match(data, 'name="id" value="([^"]+)"') + fname = scrapertools.find_single_match(data, 'name="fname" value="([^"]+)"') + hash_f = scrapertools.find_single_match(data, 'name="hash" value="([^"]+)"') + post = 'op=download1&usr_login=&id=%s&fname=%s&referer=&hash=%s&imhuman=Proceed to the video' % ( + flashx_id, urllib.quote(fname), hash_f) + wait_time = scrapertools.find_single_match(data, "<span id='xxc2'>(\d+)") + + headers['Referer'] = "https://www.flashx.tv/" + headers['Accept'] = "*/*" + headers['Host'] = "www.flashx.tv" + + coding_url = 'https://www.flashx.tv/flashx.php?fxfx=5' + headers['X-Requested-With'] = 'XMLHttpRequest' + httptools.downloadpage(coding_url, headers=headers, replace_headers=True) + + try: + time.sleep(int(wait_time) + 1) + except: + time.sleep(6) + + headers.pop('X-Requested-With') + headers['Content-Type'] = 'application/x-www-form-urlencoded' + data = httptools.downloadpage('https://www.flashx.tv/dl?playnow', post, headers, replace_headers=True).data + # Si salta aviso, se carga la pagina de comprobacion y luego la inicial + # LICENSE GPL3, de alfa-addon: https://github.com/alfa-addon/ ES OBLIGATORIO AÑADIR ESTAS LÍNEAS if "You try to access this video with Kodi" in data: url_reload = scrapertools.find_single_match(data, 'try to reload the page.*?href="([^"]+)"') - url_reload = "http://www.flashx.tv" + url_reload[1:] try: data = httptools.downloadpage(url_reload, cookies=False).data - data = httptools.downloadpage(page_url, cookies=False).data + data = httptools.downloadpage('https://www.flashx.tv/dl?playnow', post, headers, replace_headers=True).data + # LICENSE GPL3, de alfa-addon: https://github.com/alfa-addon/ ES OBLIGATORIO AÑADIR ESTAS LÍNEAS + except: + pass + + matches = scrapertools.find_multiple_matches(data, "(eval\(function\(p,a,c,k.*?)\s+</script>") + video_urls = [] + for match in matches: + try: + match = jsunpack.unpack(match) + match = match.replace("\\'", "'") + + # {src:\'https://bigcdn.flashx1.tv/cdn25/5k7xmlcjfuvvjuw5lx6jnu2vt7gw4ab43yvy7gmkvhnocksv44krbtawabta/normal.mp4\',type:\'video/mp4\',label:\'SD\',res:360}, + media_urls = scrapertools.find_multiple_matches(match, "{src:'([^']+)'.*?,label:'([^']+)'") + subtitle = "" + for media_url, label in media_urls: + if media_url.endswith(".srt") and label == "Spanish": + try: + from core import filetools + data = scrapertools.downloadpage(media_url) + subtitle = os.path.join(config.get_data_path(), 'sub_flashx.srt') + filetools.write(subtitle, data) + except: + import traceback + logger.info("Error al descargar el subtítulo: " + traceback.format_exc()) + + for media_url, label in media_urls: + if not media_url.endswith("png") and not media_url.endswith(".srt"): + video_urls.append(["." + media_url.rsplit('.', 1)[1] + " [flashx]", media_url, 0, subtitle]) + + for video_url in video_urls: + logger.info("%s - %s" % (video_url[0], video_url[1])) except: pass - matches = scrapertools.find_multiple_matches(data, "<script type='text/javascript'>(.*?)</script>") - m = "" - for n, m in enumerate(matches): - if m.startswith("eval"): - try: - m = jsunpack.unpack(m) - fake = (scrapertools.find_single_match(m, "(\w{40,})") == "") - if fake: - m = "" - else: - break - except: - m = "" - match = m - if "sources:[{file:" not in match: - page_url = page_url.replace("playvid-", "") - - headers = {'Host': 'www.flashx.tv', - 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36', - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Language': 'en-US,en;q=0.5', - 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', - 'Cookie': ''} - data = httptools.downloadpage(page_url, headers=headers, replace_headers=True).data - flashx_id = scrapertools.find_single_match(data, 'name="id" value="([^"]+)"') - fname = scrapertools.find_single_match(data, 'name="fname" value="([^"]+)"') - hash_f = scrapertools.find_single_match(data, 'name="hash" value="([^"]+)"') - post = 'op=download1&usr_login=&id=%s&fname=%s&referer=&hash=%s&imhuman=Proceed+to+video' % ( - flashx_id, urllib.quote(fname), hash_f) - wait_time = scrapertools.find_single_match(data, "<span id='xxc2'>(\d+)") - - file_id = scrapertools.find_single_match(data, "'file_id', '([^']+)'") - headers['Referer'] = "https://www.flashx.tv/" - headers['Accept'] = "*/*" - coding_url = 'https://www.flashx.tv/counter.cgi?fx=%s' % base64.encodestring(file_id) - headers['Host'] = "www.flashx.tv" - - coding_url = 'https://www.flashx.tv/flashx.php?fxfx=3' - headers['X-Requested-With'] = 'XMLHttpRequest' - coding = httptools.downloadpage(coding_url, headers=headers, replace_headers=True).data - - try: - time.sleep(int(wait_time) + 1) - except: - time.sleep(6) - - headers.pop('X-Requested-With') - headers['Content-Type'] = 'application/x-www-form-urlencoded' - data = httptools.downloadpage('https://www.flashx.tv/dl?playthis', post, headers, replace_headers=True).data - matches = scrapertools.find_multiple_matches(data, "(eval\(function\(p,a,c,k.*?)\s+</script>") - for match in matches: - if match.startswith("eval"): - try: - match = jsunpack.unpack(match) - fake = (scrapertools.find_single_match(match, "(\w{40,})") == "") - if fake: - match = "" - else: - break - except: - match = "" - - if not match: - match = data - - # Extrae la URL - # {file:"http://f11-play.flashx.tv/luq4gfc7gxixexzw6v4lhz4xqslgqmqku7gxjf4bk43u4qvwzsadrjsozxoa/video1.mp4"} - video_urls = [] - match = match.replace("\\", "").replace('\"', "\'") - media_urls = scrapertools.find_multiple_matches(match, "{src:'([^']+)'.*?,label:'([^']+)'") - subtitle = "" - for media_url, label in media_urls: - if media_url.endswith(".srt") and label == "Spanish": - try: - from core import filetools - data = scrapertools.downloadpage(media_url) - subtitle = os.path.join(config.get_data_path(), 'sub_flashx.srt') - filetools.write(subtitle, data) - except: - import traceback - logger.info("Error al descargar el subtítulo: " + traceback.format_exc()) - - for media_url, label in media_urls: - if not media_url.endswith("png") and not media_url.endswith(".srt"): - video_urls.append(["." + media_url.rsplit('.', 1)[1] + " [flashx]", media_url, 0, subtitle]) - - for video_url in video_urls: - logger.info("%s - %s" % (video_url[0], video_url[1])) - return video_urls diff --git a/plugin.video.alfa/servers/fourshared.json b/plugin.video.alfa/servers/fourshared.json index dd0c1050..e5aa9ad6 100755 --- a/plugin.video.alfa/servers/fourshared.json +++ b/plugin.video.alfa/servers/fourshared.json @@ -7,9 +7,9 @@ } ], "find_videos": { - "ignore_urls": { - "value": "http://www.4shared.com/flash/player.swf" - }, + "ignore_urls": [ + "http://www.4shared.com/flash/player.swf" + ], "patterns": [ { "pattern": "(http://www.4shared.com/embed/[A-Z0-9a-z]+/[A-Z0-9a-z]+)", diff --git a/plugin.video.alfa/servers/gvideo.json b/plugin.video.alfa/servers/gvideo.json index 4e487d03..c185fcf8 100644 --- a/plugin.video.alfa/servers/gvideo.json +++ b/plugin.video.alfa/servers/gvideo.json @@ -16,6 +16,10 @@ { "pattern": "(?s)https://drive.google.com/file/d/([^/]+)/preview", "url": "http://docs.google.com/get_video_info?docid=\\1" + }, + { + "pattern": "(?s)\"https://(?!docs)(.*?).googleusercontent.com/([^\"]+)", + "url": "https://\\1.googleusercontent.com/\\2" } ] }, @@ -48,5 +52,6 @@ "visible": false } ], + "thumbnail": "https://s11.postimg.org/giobzkprz/logo-google1.png", "version": 1 -} \ No newline at end of file +} diff --git a/plugin.video.alfa/servers/gvideo.py b/plugin.video.alfa/servers/gvideo.py index 575af8de..6e49c989 100644 --- a/plugin.video.alfa/servers/gvideo.py +++ b/plugin.video.alfa/servers/gvideo.py @@ -4,14 +4,20 @@ import urllib from core import httptools from core import scrapertools +from platformcode import logger def test_video_exists(page_url): + + if 'googleusercontent' in page_url: + return True, "" response = httptools.downloadpage(page_url, cookies=False, headers={"Referer": page_url}) if "no+existe" in response.data: return False, "[gvideo] El video no existe o ha sido borrado" if "Se+ha+excedido+el" in response.data: return False, "[gvideo] Se ha excedido el número de reproducciones permitidas" + if "No+tienes+permiso" in response.data: + return False, "[gvideo] No tienes permiso para acceder a este video" return True, "" @@ -19,22 +25,36 @@ def test_video_exists(page_url): def get_video_url(page_url, user="", password="", video_password=""): video_urls = [] urls = [] - response = httptools.downloadpage(page_url, cookies=False, headers={"Referer": page_url}) - cookies = "" - cookie = response.headers["set-cookie"].split("HttpOnly, ") - for c in cookie: - cookies += c.split(";", 1)[0] + "; " - data = response.data.decode('unicode-escape') - data = urllib.unquote_plus(urllib.unquote_plus(data)) - headers_string = "|Cookie=" + cookies - url_streams = scrapertools.find_single_match(data, 'url_encoded_fmt_stream_map=(.*)') - streams = scrapertools.find_multiple_matches(url_streams, - 'itag=(\d+)&url=(.*?)(?:;.*?quality=.*?(?:,|&)|&quality=.*?(?:,|&))') + streams =[] + logger.debug('page_url: %s'%page_url) + if 'googleusercontent' in page_url: + data = httptools.downloadpage(page_url, follow_redirects = False, headers={"Referer": page_url}) + url=data.headers['location'] + quality = scrapertools.find_single_match (url, '.itag=(\d+).') + + streams.append((quality, url)) + headers_string="" + + else: + response = httptools.downloadpage(page_url, cookies=False, headers={"Referer": page_url}) + cookies = "" + cookie = response.headers["set-cookie"].split("HttpOnly, ") + for c in cookie: + cookies += c.split(";", 1)[0] + "; " + data = response.data.decode('unicode-escape') + data = urllib.unquote_plus(urllib.unquote_plus(data)) + logger.info("Intel88 %s" %data) + headers_string = "|Cookie=" + cookies + url_streams = scrapertools.find_single_match(data, 'url_encoded_fmt_stream_map=(.*)') + streams = scrapertools.find_multiple_matches(url_streams, + 'itag=(\d+)&url=(.*?)(?:;.*?quality=.*?(?:,|&)|&quality=.*?(?:,|&))') + itags = {'18': '360p', '22': '720p', '34': '360p', '35': '480p', '37': '1080p', '43': '360p', '59': '480p'} for itag, video_url in streams: if not video_url in urls: video_url += headers_string video_urls.append([itags[itag], video_url]) urls.append(video_url) - video_urls.sort(key=lambda video_urls: int(video_urls[0].replace("p", ""))) + video_urls.sort(key=lambda video_urls: int(video_urls[0].replace("p", ""))) + return video_urls diff --git a/plugin.video.alfa/servers/kingvid.py b/plugin.video.alfa/servers/kingvid.py index 956bd6ff..b669ccca 100755 --- a/plugin.video.alfa/servers/kingvid.py +++ b/plugin.video.alfa/servers/kingvid.py @@ -10,8 +10,8 @@ def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) data = httptools.downloadpage(page_url).data - if "<title>watch " in data.lower(): - return False, "[kingvid] El archivo no existe o ha sido borrado" + if "watch " in data.lower() or "File was deleted" in data: + return False, "[kingvid] El archivo no existe o ha sido borrado" return True, "" @@ -19,7 +19,7 @@ def test_video_exists(page_url): def get_video_url(page_url, premium=False, user="", password="", video_password=""): logger.info("(page_url='%s')" % page_url) - data = httptools.downloadpage(page_url).data + data = httptools.downloadpage(page_url, add_referer = True).data match = scrapertools.find_single_match(data, "") data = jsunpack.unpack(match) diff --git a/plugin.video.alfa/servers/mailru.json b/plugin.video.alfa/servers/mailru.json index b7d1d70d..e29ef6d4 100755 --- a/plugin.video.alfa/servers/mailru.json +++ b/plugin.video.alfa/servers/mailru.json @@ -52,5 +52,6 @@ "visible": false } ], + "thumbnail": "https://s26.postimg.org/6ebn509jd/mailru1.png", "version": 1 -} \ No newline at end of file +} diff --git a/plugin.video.alfa/servers/mp4upload.json b/plugin.video.alfa/servers/mp4upload.json index 8bd80293..a69a26e2 100755 --- a/plugin.video.alfa/servers/mp4upload.json +++ b/plugin.video.alfa/servers/mp4upload.json @@ -7,9 +7,9 @@ } ], "find_videos": { - "ignore_urls": { - "value": "http://www.mp4upload.com/embed/embed" - }, + "ignore_urls": [ + "http://www.mp4upload.com/embed/embed" + ], "patterns": [ { "pattern": "mp4upload.com/embed-([A-Za-z0-9]+)", diff --git a/plugin.video.alfa/servers/okru.json b/plugin.video.alfa/servers/okru.json index c4c38b3d..8985c4ab 100755 --- a/plugin.video.alfa/servers/okru.json +++ b/plugin.video.alfa/servers/okru.json @@ -28,7 +28,12 @@ ] }, "free": true, - "id": "okru", + "id": { + "value": [ + "okru", + "ok.ru" + ] + }, "name": "okru", "settings": [ { diff --git a/plugin.video.alfa/servers/openload.py b/plugin.video.alfa/servers/openload.py index 9baff26c..692f57c3 100644 --- a/plugin.video.alfa/servers/openload.py +++ b/plugin.video.alfa/servers/openload.py @@ -49,10 +49,11 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= var_r = scrapertools.find_single_match(text_decode, "window\.[A-z]+\s*=\s*['\"]([^'\"]+)['\"]") var_encodes = scrapertools.find_multiple_matches(data, 'id="%s[^"]*">([^<]+)<' % var_r) - numeros = scrapertools.find_multiple_matches(data, - '_[A-f0-9]+x[A-f0-9]+\s*(?:=|\^)\s*([0-9]{4,}|0x[A-f0-9]{4,})') + numeros = scrapertools.find_single_match(data, '_[A-f0-9]+x[A-f0-9]+\s*(?:=|\^)\s*([0-9]{4,}|0x[A-f0-9]{4,})') op1, op2 = scrapertools.find_single_match(data, '\(0x(\d),0x(\d)\);') - idparse = scrapertools.find_single_match(data, "\^parseInt\('([0-9]+)'") + idparse, hexparse = scrapertools.find_multiple_matches(data, "parseInt\('([0-9]+)'") + # numeros = [numeros, str(int(hexparse, 8))] + rangos, rangos2 = scrapertools.find_single_match(data, "\)-([0-9]+).0x4\)/\(([0-9]+)") videourl = "" for encode in var_encodes: text_decode = "" @@ -81,11 +82,12 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= if value3 < index1: break - value4 = value2 ^ decode1[j % (mult / 8)] ^ int(idparse,8) - for n in numeros: - if not n.isdigit(): - n = int(n, 16) - value4 ^= int(n) + # value4 = value2 ^ decode1[j % (mult / 8)] ^ int(idparse,8) + # for n in numeros: + # if not n.isdigit(): + # n = int(n, 16) + # value4 ^= int(n) + value4 = value2 ^ decode1[(j % 9)] ^ (int(idparse, 8) - int(rangos) + 4) / (int(rangos2) - 8) ^ int(hexparse, 8) value5 = index1 * 2 + 127 for h in range(4): valorfinal = (value4 >> 8 * h) & (value5) diff --git a/plugin.video.alfa/servers/pelismundo.json b/plugin.video.alfa/servers/pelismundo.json new file mode 100644 index 00000000..1d9e3395 --- /dev/null +++ b/plugin.video.alfa/servers/pelismundo.json @@ -0,0 +1,49 @@ +{ + "active": true, + "changes": [ + { + "date": "18/09/2017", + "description": "Versión inicial" + } + ], + "find_videos": { + "ignore_urls": [], + "patterns": [ + { + "pattern": "http://www.pelismundo.com/gkvip/vip/playervip3/.*?id=([A-z0-9]+)", + "url": "http://www.pelismundo.com/gkvip/vip/playervip3/player.php?id=\\1" + } + ] + }, + "free": true, + "id": "pelismundo", + "name": "pelismundo", + "settings": [ + { + "default": false, + "enabled": true, + "id": "black_list", + "label": "Incluir en lista negra", + "type": "bool", + "visible": true + }, + { + "default": 0, + "enabled": true, + "id": "favorites_servers_list", + "label": "Incluir en lista de favoritos", + "lvalues": [ + "No", + "1", + "2", + "3", + "4", + "5" + ], + "type": "list", + "visible": false + } + ], + "thumbnail": "https://s26.postimg.org/72c9mr3ux/pelismundo1.png", + "version": 1 +} diff --git a/plugin.video.alfa/servers/pelismundo.py b/plugin.video.alfa/servers/pelismundo.py new file mode 100644 index 00000000..19778c45 --- /dev/null +++ b/plugin.video.alfa/servers/pelismundo.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------ +# Alfa addon - KODI Plugin +# Conector para pelismundo +# https://github.com/alfa-addon +# ------------------------------------------------------------ + +from core import httptools +from core import scrapertools +from platformcode import logger + + +def test_video_exists(page_url): + logger.info("(page_url='%s')" % page_url) + data = httptools.downloadpage(page_url, add_referer = True).data + if "Object not found" in data or "no longer exists" in data or '"sources": [false]' in data or 'sources: []' in data: + return False, "[pelismundo] El archivo no existe o ha sido borrado" + + return True, "" + + +def get_video_url(page_url, user="", password="", video_password=""): + logger.info("(page_url='%s')" % page_url) + video_urls = [] + data = httptools.downloadpage(page_url, add_referer = True).data + patron = 'sources.*?}],' + bloque = scrapertools.find_single_match(data, patron) + patron = 'file.*?"([^"]+)".*?label:"([^"]+)"' + match = scrapertools.find_multiple_matches(bloque, patron) + for scrapedurl, scrapedquality in match: + video_urls.append([scrapedquality + " [pelismundo]", scrapedurl]) + #video_urls.sort(key=lambda it: int(it[0].split("p ", 1)[0])) + return video_urls diff --git a/plugin.video.alfa/servers/rapidvideo.json b/plugin.video.alfa/servers/rapidvideo.json index d96ff0bb..a462660e 100755 --- a/plugin.video.alfa/servers/rapidvideo.json +++ b/plugin.video.alfa/servers/rapidvideo.json @@ -18,7 +18,7 @@ "ignore_urls": [], "patterns": [ { - "pattern": "rapidvideo.(?:org|com)/(?:\\?v=|e/|embed/)([A-z0-9]+)", + "pattern": "rapidvideo.(?:org|com)/(?:\\?v=|e/|embed/|v/)([A-z0-9]+)", "url": "https://www.rapidvideo.com/e/\\1" } ] @@ -52,5 +52,6 @@ "visible": false } ], + "thumbnail": "https://s26.postimg.org/y5arjad1l/rapidvideo1.png", "version": 1 -} \ No newline at end of file +} diff --git a/plugin.video.alfa/servers/rapidvideo.py b/plugin.video.alfa/servers/rapidvideo.py index 5aad58d3..a0e591e4 100755 --- a/plugin.video.alfa/servers/rapidvideo.py +++ b/plugin.video.alfa/servers/rapidvideo.py @@ -30,11 +30,14 @@ def test_video_exists(page_url): def get_video_url(page_url, premium=False, user="", password="", video_password=""): logger.info("url=" + page_url) video_urls = [] - data = httptools.downloadpage(page_url).data - urls = scrapertools.find_multiple_matches(data, '"file":"([^"]+)","label":"[^"]*","res":"([^"]+)"') - for mediaurl, res in urls: - ext = scrapertools.get_filename_from_url(mediaurl)[-4:] - video_urls.append(['%s %sp [rapidvideo]' % (ext, res), mediaurl.replace("\\", "")]) + patron = 'https://www.rapidvideo.com/e/[^"]+' + match = scrapertools.find_multiple_matches(data, patron) + for url1 in match: + res = scrapertools.find_single_match(url1, '=(\w+)') + data = httptools.downloadpage(url1).data + url = scrapertools.find_single_match(data, 'source src="([^"]+)') + ext = scrapertools.get_filename_from_url(url)[-4:] + video_urls.append(['%s %s [rapidvideo]' % (ext, res), url]) return video_urls diff --git a/plugin.video.alfa/servers/raptu.py b/plugin.video.alfa/servers/raptu.py deleted file mode 100755 index d833e279..00000000 --- a/plugin.video.alfa/servers/raptu.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- - -from core import httptools -from core import scrapertools -from platformcode import logger - - -def test_video_exists(page_url): - logger.info("(page_url='%s')" % page_url) - try: - response = httptools.downloadpage(page_url) - except: - pass - - if not response.data or "urlopen error [Errno 1]" in str(response.code): - from platformcode import config - if config.is_xbmc(): - return False, "[Raptu] Este conector solo funciona a partir de Kodi 17" - elif config.get_platform() == "plex": - return False, "[Raptu] Este conector no funciona con tu versión de Plex, intenta actualizarla" - elif config.get_platform() == "mediaserver": - return False, "[Raptu] Este conector requiere actualizar python a la versión 2.7.9 o superior" - - if "Object not found" in response.data: - return False, "[Raptu] El archivo no existe o ha sido borrado" - - return True, "" - - -def get_video_url(page_url, premium=False, user="", password="", video_password=""): - logger.info("(page_url='%s')" % page_url) - - data = httptools.downloadpage(page_url).data - video_urls = [] - # Detección de subtítulos - subtitulo = "" - videos = scrapertools.find_multiple_matches(data, '"file"\s*:\s*"([^"]+)","label"\s*:\s*"([^"]+)"') - for video_url, calidad in videos: - video_url = video_url.replace("\\", "") - extension = scrapertools.get_filename_from_url(video_url)[-4:] - if ".srt" in extension: - subtitulo = "https://www.raptu.com" + video_url - else: - video_urls.append(["%s %s [raptu]" % (extension, calidad), video_url, 0, subtitulo]) - - try: - video_urls.sort(key=lambda it: int(it[0].split("p ", 1)[0].rsplit(" ")[1])) - except: - pass - for video_url in video_urls: - logger.info(" %s - %s" % (video_url[0], video_url[1])) - - return video_urls diff --git a/plugin.video.alfa/servers/redirects.json b/plugin.video.alfa/servers/redirects.json deleted file mode 100755 index 5df20bd9..00000000 --- a/plugin.video.alfa/servers/redirects.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "active": true, - "changes": [ - { - "date": "26/05/2016", - "description": "Versión incial" - } - ], - "find_videos": { - "ignore_urls": [], - "patterns": [ - { - "pattern": "(https://animeflv.net/embed_izanagi.php\\?key=.+?),", - "url": "\\1" - }, - { - "pattern": "(https://s1.animeflv.com/gdrive.php?id=.+?)\\\\\\\\", - "url": "\\1" - }, - { - "pattern": "(http://www.animeid..{2,3}/embed/.+?/)", - "url": "\\1" - }, - { - "pattern": "(https://jkanime.net/jk.php\\?u=stream/jkmedia.+?)\\s", - "url": "\\1" - } - ] - }, - "free": true, - "id": "redirects", - "name": "redirects", - "settings": [ - { - "default": false, - "enabled": true, - "id": "black_list", - "label": "Incluir en lista negra", - "type": "bool", - "visible": true - }, - { - "default": 0, - "enabled": true, - "id": "favorites_servers_list", - "label": "Incluir en lista de favoritos", - "lvalues": [ - "No", - "1", - "2", - "3", - "4", - "5" - ], - "type": "list", - "visible": false - } - ], - "version": 1 -} \ No newline at end of file diff --git a/plugin.video.alfa/servers/redirects.py b/plugin.video.alfa/servers/redirects.py deleted file mode 100755 index 247819aa..00000000 --- a/plugin.video.alfa/servers/redirects.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urllib2 - -from core import scrapertools - - -def get_video_url(page_url, premium=False, user="", password="", video_password=""): - video_urls = [] - if 'jkanime' in page_url: - request_headers = { - "Accept-Language": "en-US,en;q=0.5", - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0", - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", - "Connection": "keep-alive" - } - jk_url = page_url.replace("/jk.php?u=stream/", "/stream/") - request = urllib2.Request(jk_url, headers=request_headers) - response = urllib2.urlopen(request) - video_urls.append([".mp4 [redirects]", response.geturl()]) - else: - headers = [] - headers.append(["User-Agent", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36"]) - headers.append(["Accept-Encoding", "gzip,deflate,sdch"]) - page_url = page_url.replace("https://animeflv.net/embed_izanagi.php?key=", - "https://s2.animeflv.net/izanagi.php?id=") - page_url = page_url.replace("http://animeflv.net/embed_yotta.php?key=", - "https://s1.animeflv.com/gdrive.php?id=") - data = scrapertools.cache_page(page_url, headers=headers) - data = data.replace("\\\\", "") - data = data.replace("\\/", "/") - patronvideos = '"file":"(.+?)"' - matches = re.compile(patronvideos, re.DOTALL).findall(data) - for match in matches: - video_urls.append([".mp4 [redirects]", match]) - - patronvideos = '(http://www.animeid.+?)"' - matches = re.compile(patronvideos, re.DOTALL).findall(data) - for match in matches: - response = urllib2.urlopen(match) - video_urls.append([".mp4 [redirects]", response.geturl()]) - - return video_urls diff --git a/plugin.video.alfa/servers/streamango.py b/plugin.video.alfa/servers/streamango.py index 95bfa1cc..a08f765c 100755 --- a/plugin.video.alfa/servers/streamango.py +++ b/plugin.video.alfa/servers/streamango.py @@ -21,14 +21,54 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= data = httptools.downloadpage(page_url).data video_urls = [] - matches = scrapertools.find_multiple_matches(data, 'type:"video/([^"]+)",src:"([^"]+)",height:(\d+)') - for ext, media_url, calidad in matches: + + matches = scrapertools.find_multiple_matches(data, "type:\"video/([^\"]+)\",src:d\('([^']+)',(.*?)\).+?height:(\d+)") + + for ext, encoded, code, quality in matches: + + media_url = decode(encoded, int(code)) + if not media_url.startswith("http"): media_url = "http:" + media_url - video_urls.append([".%s %sp [streamango]" % (ext, calidad), media_url]) + video_urls.append([".%s %sp [streamango]" % (ext, quality), media_url]) video_urls.reverse() for video_url in video_urls: logger.info("%s - %s" % (video_url[0], video_url[1])) return video_urls + + +def decode(encoded, code): + logger.info("encoded '%s', code '%s'" % (encoded, code)) + + _0x59b81a = "" + k = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + k = k[::-1] + + count = 0 + + for index in range(0, len(encoded) - 1): + while count <= len(encoded) - 1: + _0x4a2f3a = k.index(encoded[count]) + count += 1 + _0x29d5bf = k.index(encoded[count]) + count += 1 + _0x3b6833 = k.index(encoded[count]) + count += 1 + _0x426d70 = k.index(encoded[count]) + count += 1 + + _0x2e4782 = ((_0x4a2f3a << 2) | (_0x29d5bf >> 4)) + _0x2c0540 = (((_0x29d5bf & 15) << 4) | (_0x3b6833 >> 2)) + _0x5a46ef = ((_0x3b6833 & 3) << 6) | _0x426d70 + _0x2e4782 = _0x2e4782 ^ code + + _0x59b81a = str(_0x59b81a) + chr(_0x2e4782) + + if _0x3b6833 != 64: + _0x59b81a = str(_0x59b81a) + chr(_0x2c0540) + if _0x3b6833 != 64: + _0x59b81a = str(_0x59b81a) + chr(_0x5a46ef) + + return _0x59b81a diff --git a/plugin.video.alfa/servers/streamcherry.py b/plugin.video.alfa/servers/streamcherry.py index 76987bee..5aa5f7e0 100644 --- a/plugin.video.alfa/servers/streamcherry.py +++ b/plugin.video.alfa/servers/streamcherry.py @@ -26,12 +26,16 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= data = httptools.downloadpage(page_url).data video_urls = [] - matches = scrapertools.find_multiple_matches(data, 'type\s*:\s*"([^"]+)"\s*,\s*src:"([^"]+)",height\s*:\s*(\d+)') - for ext, media_url, calidad in matches: - ext = ext.replace("video/", "") + + matches = scrapertools.find_multiple_matches(data, "type:\"video/([^\"]+)\",src:d\('([^']+)',(.*?)\).+?height:(\d+)") + + for ext, encoded, code, quality in matches: + + media_url = decode(encoded, int(code)) + if not media_url.startswith("http"): - media_url = "http:%s" % media_url - video_urls.append([".%s %sp [streamcherry]" % (ext, calidad), media_url]) + media_url = "http:" + media_url + video_urls.append([".%s %sp [streamcherry]" % (ext, quality), media_url]) video_urls.reverse() for video_url in video_urls: @@ -40,23 +44,36 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= return video_urls -# Encuentra vídeos del servidor en el texto pasado -def find_videos(data): - encontrados = set() - devuelve = [] +def decode(encoded, code): + logger.info("encoded '%s', code '%s'" % (encoded, code)) - patronvideos = 'streamcherry.com/(?:embed|f)/([A-z0-9]+)' - logger.info("#" + patronvideos + "#") - matches = re.compile(patronvideos, re.DOTALL).findall(data) + _0x59b81a = "" + k = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + k = k[::-1] - for match in matches: - titulo = "[streamcherry]" - url = "http://streamcherry.com/embed/%s" % match - if url not in encontrados: - logger.info(" url=" + url) - devuelve.append([titulo, url, 'streamcherry']) - encontrados.add(url) - else: - logger.info(" url duplicada=" + url) + count = 0 - return devuelve + for index in range(0, len(encoded) - 1): + while count <= len(encoded) - 1: + _0x4a2f3a = k.index(encoded[count]) + count += 1 + _0x29d5bf = k.index(encoded[count]) + count += 1 + _0x3b6833 = k.index(encoded[count]) + count += 1 + _0x426d70 = k.index(encoded[count]) + count += 1 + + _0x2e4782 = ((_0x4a2f3a << 2) | (_0x29d5bf >> 4)) + _0x2c0540 = (((_0x29d5bf & 15) << 4) | (_0x3b6833 >> 2)) + _0x5a46ef = ((_0x3b6833 & 3) << 6) | _0x426d70 + _0x2e4782 = _0x2e4782 ^ code + + _0x59b81a = str(_0x59b81a) + chr(_0x2e4782) + + if _0x3b6833 != 64: + _0x59b81a = str(_0x59b81a) + chr(_0x2c0540) + if _0x3b6833 != 64: + _0x59b81a = str(_0x59b81a) + chr(_0x5a46ef) + + return _0x59b81a diff --git a/plugin.video.alfa/servers/streamcloud.json b/plugin.video.alfa/servers/streamcloud.json index ffce0565..bd3291a2 100755 --- a/plugin.video.alfa/servers/streamcloud.json +++ b/plugin.video.alfa/servers/streamcloud.json @@ -11,23 +11,21 @@ } ], "find_videos": { - "ignore_urls": { - "value": [ - "http://streamcloud.eu/stylesheets", - "http://streamcloud.eu/control", - "http://streamcloud.eu/xupload", - "http://streamcloud.eu/js", - "http://streamcloud.eu/favicon", - "http://streamcloud.eu/reward", - "http://streamcloud.eu/login", - "http://streamcloud.eu/deliver", - "http://streamcloud.eu/faq", - "http://streamcloud.eu/tos", - "http://streamcloud.eu/checkfiles", - "http://streamcloud.eu/contact", - "http://streamcloud.eu/serve" - ] - }, + "ignore_urls": [ + "http://streamcloud.eu/stylesheets", + "http://streamcloud.eu/control", + "http://streamcloud.eu/xupload", + "http://streamcloud.eu/js", + "http://streamcloud.eu/favicon", + "http://streamcloud.eu/reward", + "http://streamcloud.eu/login", + "http://streamcloud.eu/deliver", + "http://streamcloud.eu/faq", + "http://streamcloud.eu/tos", + "http://streamcloud.eu/checkfiles", + "http://streamcloud.eu/contact", + "http://streamcloud.eu/serve" + ], "patterns": [ { "pattern": "(streamcloud.eu/[a-z0-9]+)", diff --git a/plugin.video.alfa/servers/streaminto.json b/plugin.video.alfa/servers/streaminto.json index 51f1d5ee..c9e60e71 100755 --- a/plugin.video.alfa/servers/streaminto.json +++ b/plugin.video.alfa/servers/streaminto.json @@ -11,22 +11,20 @@ } ], "find_videos": { - "ignore_urls": { - "value": [ - "http://streamin.to/embed-theme.html", - "http://streamin.to/embed-jquery.html", - "http://streamin.to/embed-s.html", - "http://streamin.to/embed-images.html", - "http://streamin.to/embed-faq.html", - "http://streamin.to/embed-embed.html", - "http://streamin.to/embed-ri.html", - "http://streamin.to/embed-d.html", - "http://streamin.to/embed-css.html", - "http://streamin.to/embed-js.html", - "http://streamin.to/embed-player.html", - "http://streamin.to/embed-cgi.html" - ] - }, + "ignore_urls": [ + "http://streamin.to/embed-theme.html", + "http://streamin.to/embed-jquery.html", + "http://streamin.to/embed-s.html", + "http://streamin.to/embed-images.html", + "http://streamin.to/embed-faq.html", + "http://streamin.to/embed-embed.html", + "http://streamin.to/embed-ri.html", + "http://streamin.to/embed-d.html", + "http://streamin.to/embed-css.html", + "http://streamin.to/embed-js.html", + "http://streamin.to/embed-player.html", + "http://streamin.to/embed-cgi.html" + ], "patterns": [ { "pattern": "streamin.to/(?:embed-)?([a-z0-9A-Z]+)", diff --git a/plugin.video.alfa/servers/streamplay.py b/plugin.video.alfa/servers/streamplay.py index aa5d3651..32860478 100644 --- a/plugin.video.alfa/servers/streamplay.py +++ b/plugin.video.alfa/servers/streamplay.py @@ -32,11 +32,15 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= data = scrapertools.find_single_match(data.replace('"', "'"), "sources\s*=[^\[]*\[([^\]]+)\]") matches = scrapertools.find_multiple_matches(data, "[src|file]:'([^']+)'") + if len(matches) == 0: + matches = scrapertools.find_multiple_matches(data, "[^',]+") video_urls = [] for video_url in matches: + if video_url.endswith(".mpd"): + continue _hash = scrapertools.find_single_match(video_url, '[A-z0-9\_\-]{40,}') hash = _hash[::-1] - hash = hash.replace(hash[2:3],"",1) + hash = hash.replace(hash[1:2], "", 1) video_url = video_url.replace(_hash, hash) filename = scrapertools.get_filename_from_url(video_url)[-4:] @@ -56,107 +60,3 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= logger.info(" %s - %s" % (video_url[0], video_url[1])) return video_urls - - -def decrypt(h, k): - import base64 - - if len(h) % 4: - h += "=" * (4 - len(h) % 4) - sig = [] - h = base64.b64decode(h.replace("-", "+").replace("_", "/")) - for c in range(len(h)): - sig += [ord(h[c])] - - sec = [] - for c in range(len(k)): - sec += [ord(k[c])] - - dig = range(256) - g = 0 - v = 128 - for b in range(len(sec)): - a = (v + (sec[b] & 15)) % 256 - c = dig[(g)] - dig[g] = dig[a] - dig[a] = c - g += 1 - - a = (v + (sec[b] >> 4 & 15)) % 256 - c = dig[g] - dig[g] = dig[a] - dig[a] = c - g += 1 - - k = 0 - q = 1 - p = 0 - n = 0 - for b in range(512): - k = (k + q) % 256 - n = (p + dig[(n + dig[k]) % 256]) % 256 - p = (k + p + dig[n]) % 256 - c = dig[k] - dig[k] = dig[n] - dig[n] = c - - q = 3 - for a in range(v): - b = 255 - a - if dig[a] > dig[b]: - c = dig[a] - dig[a] = dig[b] - dig[b] = c - - k = 0 - for b in range(512): - k = (k + q) % 256 - n = (p + dig[(n + dig[k]) % 256]) % 256 - p = (k + p + dig[n]) % 256 - c = dig[k] - dig[k] = dig[n] - dig[n] = c - - q = 5 - for a in range(v): - b = 255 - a - if dig[a] > dig[b]: - c = dig[a] - dig[a] = dig[b] - dig[b] = c - - k = 0 - for b in range(512): - k = (k + q) % 256 - n = (p + dig[(n + dig[k]) % 256]) % 256 - p = (k + p + dig[n]) % 256 - c = dig[k] - dig[k] = dig[n] - dig[n] = c - - q = 7 - k = 0 - u = 0 - d = [] - for b in range(len(dig)): - k = (k + q) % 256 - n = (p + dig[(n + dig[k]) % 256]) % 256 - p = (k + p + dig[n]) % 256 - c = dig[k] - dig[k] = dig[n] - dig[n] = c - u = dig[(n + dig[(k + dig[(u + p) % 256]) % 256]) % 256] - d += [u] - - c = [] - for f in range(len(d)): - try: - c += [(256 + (sig[f] - d[f])) % 256] - except: - break - - h = "" - for s in c: - h += chr(s) - - return h diff --git a/plugin.video.alfa/servers/thevideome.json b/plugin.video.alfa/servers/thevideome.json index b5fac37f..b353ed66 100755 --- a/plugin.video.alfa/servers/thevideome.json +++ b/plugin.video.alfa/servers/thevideome.json @@ -14,7 +14,7 @@ "ignore_urls": [], "patterns": [ { - "pattern": "thevideo.me/(?:embed-|)([A-z0-9]+)", + "pattern": "(?:thevideo.me|tvad.me)/(?:embed-|)([A-z0-9]+)", "url": "http://thevideo.me/embed-\\1.html" } ] @@ -48,5 +48,6 @@ "visible": false } ], + "thumbnail": "https://s26.postimg.org/fzmu2c761/thevideo.me1.png", "version": 1 -} \ No newline at end of file +} diff --git a/plugin.video.alfa/servers/uploadedto.json b/plugin.video.alfa/servers/uploadedto.json index 39fa4b80..fa8cc12f 100755 --- a/plugin.video.alfa/servers/uploadedto.json +++ b/plugin.video.alfa/servers/uploadedto.json @@ -7,7 +7,9 @@ } ], "find_videos": { - "ignore_urls": [], + "ignore_urls": [ + "http://uploaded.net/file/ref" + ], "patterns": [ { "pattern": "(?:ul|uploaded).(?:net|to)/(?:file/|f/)?([a-zA-Z0-9]+)", diff --git a/plugin.video.alfa/servers/uptobox.py b/plugin.video.alfa/servers/uptobox.py index afcb5559..d563ca52 100755 --- a/plugin.video.alfa/servers/uptobox.py +++ b/plugin.video.alfa/servers/uptobox.py @@ -2,6 +2,7 @@ import urllib +from core import httptools from core import scrapertools from platformcode import logger @@ -9,11 +10,11 @@ from platformcode import logger def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) - data = scrapertools.cache_page(page_url) + data = httptools.downloadpage(page_url).data if "Streaming link:" in data: return True, "" - elif "Unfortunately, the file you want is not available." in data: + elif "Unfortunately, the file you want is not available." in data or "Unfortunately, the video you want to see is not available" in data: return False, "[Uptobox] El archivo no existe o ha sido borrado" wait = scrapertools.find_single_match(data, "You have to wait ([0-9]+) (minute|second)") if len(wait) > 0: @@ -27,20 +28,20 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= logger.info("(page_url='%s')" % page_url) # Si el enlace es directo de upstream if "uptobox" not in page_url: - data = scrapertools.cache_page(page_url) + data = httptools.downloadpage(page_url).data if "Video not found" in data: page_url = page_url.replace("uptostream.com/iframe/", "uptobox.com/") - data = scrapertools.cache_page(page_url) + data = httptools.downloadpage(page_url).data video_urls = uptobox(page_url, data) else: video_urls = uptostream(data) else: - data = scrapertools.cache_page(page_url) + data = httptools.downloadpage(page_url).data # Si el archivo tiene enlace de streaming se redirige a upstream if "Streaming link:" in data: page_url = "http://uptostream.com/iframe/" + scrapertools.find_single_match(page_url, 'uptobox.com/([a-z0-9]+)') - data = scrapertools.cache_page(page_url) + data = httptools.downloadpage(page_url).data video_urls = uptostream(data) else: # Si no lo tiene se utiliza la descarga normal @@ -76,7 +77,7 @@ def uptobox(url, data): for inputname, inputvalue in matches: post += inputname + "=" + inputvalue + "&" - data = scrapertools.cache_page(url, post=post[:-1]) + data = httptools.downloadpage(url, post=post[:-1]).data media = scrapertools.find_single_match(data, '\s*') # Solo es necesario codificar la ultima parte de la url url_strip = urllib.quote(media.rsplit('/', 1)[1]) diff --git a/plugin.video.alfa/servers/vidlox.py b/plugin.video.alfa/servers/vidlox.py index 492cd93b..6dfd69f8 100644 --- a/plugin.video.alfa/servers/vidlox.py +++ b/plugin.video.alfa/servers/vidlox.py @@ -13,7 +13,7 @@ from platformcode import logger def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) data = httptools.downloadpage(page_url).data - if "borrado" in data: + if "borrado" in data or "Deleted" in data: return False, "[vidlox] El fichero ha sido borrado" return True, "" diff --git a/plugin.video.alfa/servers/vidoza.py b/plugin.video.alfa/servers/vidoza.py index 88bca7f8..eacec9e5 100755 --- a/plugin.video.alfa/servers/vidoza.py +++ b/plugin.video.alfa/servers/vidoza.py @@ -7,11 +7,10 @@ from platformcode import logger def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) - data = httptools.downloadpage(page_url).data - if "Page not found" in data: - return False, "[vidoza] El archivo no existe o ha sido borrado" - elif "Video is processing now" in data: + if "Page not found" in data or "File was deleted" in data: + return False, "[vidoza] El archivo no existe o ha sido borrado" + elif "processing" in data: return False, "[vidoza] El vídeo se está procesando" return True, "" @@ -19,9 +18,7 @@ def test_video_exists(page_url): def get_video_url(page_url, premium=False, user="", password="", video_password=""): logger.info("(page_url='%s')" % page_url) - data = httptools.downloadpage(page_url).data - video_urls = [] matches = scrapertools.find_multiple_matches(data, 'file\s*:\s*"([^"]+)"\s*,\s*label:"([^"]+)"') for media_url, calidad in matches: diff --git a/plugin.video.alfa/servers/vidspot.json b/plugin.video.alfa/servers/vidspot.json index 8760788d..6e49bb6b 100755 --- a/plugin.video.alfa/servers/vidspot.json +++ b/plugin.video.alfa/servers/vidspot.json @@ -7,40 +7,38 @@ } ], "find_videos": { - "ignore_urls": { - "value": [ - "http://vidspot.net/embed-theme.html", - "http://vidspot.net/embed-jquery.html", - "http://vidspot.net/embed-s.html", - "http://vidspot.net/embed-images.html", - "http://vidspot.net/embed-faq.html", - "http://vidspot.net/embed-embed.html", - "http://vidspot.net/embed-ri.html", - "http://vidspot.net/embed-d.html", - "http://vidspot.net/embed-css.html", - "http://vidspot.net/embed-js.html", - "http://vidspot.net/embed-player.html", - "http://vidspot.net/embed-cgi.html", - "http://vidspot.net/embed-i.html", - "http://vidspot.net/images", - "http://vidspot.net/theme", - "http://vidspot.net/xupload", - "http://vidspot.net/s", - "http://vidspot.net/js", - "http://vidspot.net/jquery", - "http://vidspot.net/login", - "http://vidspot.net/make", - "http://vidspot.net/i", - "http://vidspot.net/faq", - "http://vidspot.net/tos", - "http://vidspot.net/premium", - "http://vidspot.net/checkfiles", - "http://vidspot.net/privacy", - "http://vidspot.net/refund", - "http://vidspot.net/links", - "http://vidspot.net/contact" - ] - }, + "ignore_urls": [ + "http://vidspot.net/embed-theme.html", + "http://vidspot.net/embed-jquery.html", + "http://vidspot.net/embed-s.html", + "http://vidspot.net/embed-images.html", + "http://vidspot.net/embed-faq.html", + "http://vidspot.net/embed-embed.html", + "http://vidspot.net/embed-ri.html", + "http://vidspot.net/embed-d.html", + "http://vidspot.net/embed-css.html", + "http://vidspot.net/embed-js.html", + "http://vidspot.net/embed-player.html", + "http://vidspot.net/embed-cgi.html", + "http://vidspot.net/embed-i.html", + "http://vidspot.net/images", + "http://vidspot.net/theme", + "http://vidspot.net/xupload", + "http://vidspot.net/s", + "http://vidspot.net/js", + "http://vidspot.net/jquery", + "http://vidspot.net/login", + "http://vidspot.net/make", + "http://vidspot.net/i", + "http://vidspot.net/faq", + "http://vidspot.net/tos", + "http://vidspot.net/premium", + "http://vidspot.net/checkfiles", + "http://vidspot.net/privacy", + "http://vidspot.net/refund", + "http://vidspot.net/links", + "http://vidspot.net/contact" + ], "patterns": [ { "pattern": "vidspot.(?:net/|php\\?id=)(?:embed-)?([a-z0-9]+)", diff --git a/plugin.video.alfa/servers/vimeo.json b/plugin.video.alfa/servers/vimeo.json index 60bd2e8f..9d1e1fa1 100755 --- a/plugin.video.alfa/servers/vimeo.json +++ b/plugin.video.alfa/servers/vimeo.json @@ -48,5 +48,6 @@ "visible": false } ], + "thumbnail": "https://s26.postimg.org/vo685y2bt/vimeo1.png", "version": 1 -} \ No newline at end of file +} diff --git a/plugin.video.alfa/servers/vimpleru.json b/plugin.video.alfa/servers/vimpleru.json index 2952ce5a..137d518d 100755 --- a/plugin.video.alfa/servers/vimpleru.json +++ b/plugin.video.alfa/servers/vimpleru.json @@ -20,7 +20,12 @@ ] }, "free": true, - "id": "vimpleru", + "id": { + "value": [ + "vimpleru", + "vimple" + ] + }, "name": "vimpleru", "settings": [ { diff --git a/plugin.video.alfa/servers/fileserve.json b/plugin.video.alfa/servers/vshare.json old mode 100755 new mode 100644 similarity index 71% rename from plugin.video.alfa/servers/fileserve.json rename to plugin.video.alfa/servers/vshare.json index 9138b3a1..5e6f2c48 --- a/plugin.video.alfa/servers/fileserve.json +++ b/plugin.video.alfa/servers/vshare.json @@ -1,23 +1,24 @@ { - "active": false, + "active": true, "changes": [ { - "date": "25/03/2016", + "date": "27/08/2017", "description": "Versión incial" } ], "find_videos": { - "ignore_urls": [], "patterns": [ { - "pattern": "http://www.fileserve.com/file/([A-Z0-9a-z]{7}])", - "url": "http://www.fileserve.com/file/\\1" + "pattern": "(http://vshare.io/v/[\\w]+[^\"']*)[\"']", + "url": "\\1" } ] }, - "free": false, - "id": "fileserve", - "name": "fileserve", + "free": true, + "id": [ + "vshare" + ], + "name": "vshare", "settings": [ { "default": false, @@ -44,5 +45,6 @@ "visible": false } ], + "thumbnail": "server_vshare.png", "version": 1 -} \ No newline at end of file +} diff --git a/plugin.video.alfa/servers/vshare.py b/plugin.video.alfa/servers/vshare.py new file mode 100644 index 00000000..d475229b --- /dev/null +++ b/plugin.video.alfa/servers/vshare.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- + +import re + +from core import httptools +from core import scrapertools +from platformcode import logger +from lib import jsunpack + + +def test_video_exists(page_url): + logger.info("(page_url='%s')" % page_url) + + if httptools.downloadpage(page_url).code != 200: + return False, "El archivo no existe en vShare o ha sido borrado." + else: + return True, "" + + +def get_video_url(page_url, premium=False, user="", password="", video_password=""): + logger.info("url = " + page_url) + + data = httptools.downloadpage(page_url).data + + flowplayer = re.search("url: [\"']([^\"']+)", data) + if flowplayer: + return [["FLV", flowplayer.group(1)]] + + jsUnpack = jsunpack.unpack(data) + logger.debug(jsUnpack) + + video_urls = [] + + fields = re.search("\[([^\]]+).*?parseInt\(value\)-(\d+)", jsUnpack) + if fields: + logger.debug("Values: " + fields.group(1)) + logger.debug("Substract: " + fields.group(2)) + substract = int(fields.group(2)) + + arrayResult = [chr(int(value) - substract) for value in fields.group(1).split(",")] + strResult = "".join(arrayResult) + logger.debug(strResult) + + videoSources = re.findall("[^\"']+)[^>]+label=[\"'](?P