diff --git a/mediaserver/HTTPAndWSServer.py b/mediaserver/HTTPAndWSServer.py index 04529a28..8786a8e7 100644 --- a/mediaserver/HTTPAndWSServer.py +++ b/mediaserver/HTTPAndWSServer.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- +import os import random import re import threading import time import traceback +from platformcode import platformtools from BaseHTTPServer import HTTPServer from HTTPWebSocketsHandler import HTTPWebSocketsHandler diff --git a/mediaserver/alfa.py b/mediaserver/alfa.py index e53fe499..f61ab910 100644 --- a/mediaserver/alfa.py +++ b/mediaserver/alfa.py @@ -8,6 +8,8 @@ import sys import threading import time from functools import wraps +# Requerido para el ejecutable en windows +import SimpleHTTPServer sys.dont_write_bytecode = True from platformcode import config diff --git a/mediaserver/genera.bat b/mediaserver/genera.bat new file mode 100644 index 00000000..648884ce --- /dev/null +++ b/mediaserver/genera.bat @@ -0,0 +1,5 @@ +REM Genera los archivos para el ejecutable en windows de Alfa Mediaserver +python setup.py py2exe -p channels,servers,lib,platformcode +xcopy lib dist\lib /y /s /i +xcopy platformcode dist\platformcode /y /s /i +xcopy resources dist\resources /y /s /i diff --git a/mediaserver/platformcode/config.py b/mediaserver/platformcode/config.py index e8b82980..042271fe 100644 --- a/mediaserver/platformcode/config.py +++ b/mediaserver/platformcode/config.py @@ -14,7 +14,7 @@ settings_dic = {} adult_setting = {} -def get_addon_version(linea_inicio=0, total_lineas=2): +def get_addon_version(linea_inicio=0, total_lineas=2, with_fix=False): ''' Devuelve el número de de versión del addon, obtenido desde el archivo addon.xml ''' @@ -271,6 +271,14 @@ def get_localized_string(code): return dev +def get_localized_category(categ): + categories = {'movie': get_localized_string(30122), 'tvshow': get_localized_string(30123), + 'anime': get_localized_string(30124), 'documentary': get_localized_string(30125), + 'vos': get_localized_string(30136), 'adult': get_localized_string(30126), + 'direct': get_localized_string(30137), 'torrent': get_localized_string(70015)} + return categories[categ] if categ in categories else categ + + def get_videolibrary_path(): value = get_setting("videolibrarypath") if value == "": diff --git a/mediaserver/platformcode/controllers/__init__.py b/mediaserver/platformcode/controllers/__init__.py index bc031b42..41b7e8ae 100644 --- a/mediaserver/platformcode/controllers/__init__.py +++ b/mediaserver/platformcode/controllers/__init__.py @@ -7,12 +7,12 @@ import os from inspect import isclass from controller import Controller -from platformcode import logger +from platformcode import config, logger def load_controllers(): controllers = [] - path = os.path.split(__file__)[0] + path = os.path.join(config.get_runtime_path(),"platformcode\controllers") for fname in os.listdir(path): mod, ext = os.path.splitext(fname) fname = os.path.join(path, fname) diff --git a/mediaserver/setup.py b/mediaserver/setup.py new file mode 100644 index 00000000..34d9a062 --- /dev/null +++ b/mediaserver/setup.py @@ -0,0 +1,18 @@ +# setup.py +# Para crear el ejecutable de Alfa mediaserver en windows +# Se usa py2exe +# Linea de comandos para la creacion: python setup.py py2exe -p channels,servers,lib,platformcode +from distutils.core import setup +import glob +import py2exe + +setup(packages=['channels','servers','lib','platformcode','platformcode/controllers'], + data_files=[("channels",glob.glob("channels\\*.py")), + ("channels",glob.glob("channels\\*.json")), + ("servers",glob.glob("servers\\*.py")), + ("servers",glob.glob("servers\\*.json")), + ("",glob.glob("addon.xml")), + ], + console=["alfa.py"] + ) + diff --git a/plugin.video.alfa/addon.xml b/plugin.video.alfa/addon.xml index da32f019..37d3ce29 100755 --- a/plugin.video.alfa/addon.xml +++ b/plugin.video.alfa/addon.xml @@ -1,5 +1,5 @@ - + @@ -19,12 +19,12 @@ [B]Estos son los cambios para esta versión:[/B] [COLOR green][B]Canales agregados y arreglos[/B][/COLOR] - ¤ dospelis ¤ goodpelis - ¤ pelisr ¤ sonpelis - ¤ jawcloud ¤ estream - ¤ pelisplusco ¤ hdfull - ¤ cinemahd - + ¤ elitetorrent ¤ grantorrent + ¤ newpct1 ¤ seriesanimadas + ¤ seriesblanco ¤ rapidvideo + ¤ watchvideo ¤ pelispedia + ¤ beeg + ¤ arreglos internos ¤ Agradecimientos a @angedam por colaborar en ésta versión diff --git a/plugin.video.alfa/channels/alltorrent.json b/plugin.video.alfa/channels/alltorrent.json deleted file mode 100755 index ae9bbebe..00000000 --- a/plugin.video.alfa/channels/alltorrent.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "id": "alltorrent", - "name": "Alltorrent", - "active": false, - "adult": false, - "language": ["cast"], - "thumbnail": "altorrent.png", - "fanart": "altorrent.jpg", - "categories": [ - "torrent", - "movie" - ], - "settings": [ - { - "id": "modo_grafico", - "type": "bool", - "label": "Buscar información extra", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en busqueda global", - "default": false, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_torrent", - "type": "bool", - "label": "Incluir en Novedades - Torrent", - "default": true, - "enabled": true, - "visible": true - } - ] -} \ No newline at end of file diff --git a/plugin.video.alfa/channels/alltorrent.py b/plugin.video.alfa/channels/alltorrent.py deleted file mode 100755 index 2f9ec7cd..00000000 --- a/plugin.video.alfa/channels/alltorrent.py +++ /dev/null @@ -1,314 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import sys -import urllib -import urlparse - -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 -from lib import generictools - -host = 'http://alltorrent.net/' -__modo_grafico__ = config.get_setting('modo_grafico', 'alltorrent') - - -def mainlist(item): - logger.info() - itemlist = [] - - thumb_pelis = get_thumb("channels_movie.png") - thumb_pelis_hd = get_thumb("channels_movie_hd.png") - thumb_series = get_thumb("channels_tvshow.png") - thumb_series_hd = get_thumb("channels_tvshow_hd.png") - thumb_buscar = get_thumb("search.png") - - itemlist.append(item.clone(title="[COLOR springgreen][B]Todas Las Películas[/B][/COLOR]", action="listado", - url=host, thumbnail=thumb_pelis, extra="pelicula")) - itemlist.append(item.clone(title="[COLOR springgreen] Incluyen 1080p[/COLOR]", action="listado", - url=host + "rezolucia/1080p/", thumbnail=thumb_pelis_hd, extra="pelicula")) - itemlist.append(item.clone(title="[COLOR springgreen] Incluyen 720p[/COLOR]", action="listado", - url=host + "rezolucia/720p/", thumbnail=thumb_pelis_hd, extra="pelicula")) - itemlist.append(item.clone(title="[COLOR springgreen] Incluyen Hdrip[/COLOR]", action="listado", - url=host + "rezolucia/hdrip/", thumbnail=thumb_pelis, extra="pelicula")) - itemlist.append(item.clone(title="[COLOR springgreen] Incluyen 3D[/COLOR]", action="listado", - url=host + "rezolucia/3d/", thumbnail=thumb_pelis_hd, extra="pelicula")) - itemlist.append(item.clone(title="[COLOR floralwhite][B]Buscar[/B][/COLOR]", action="search", thumbnail=thumb_buscar, - extra="titulo")) - itemlist.append(item.clone(title="[COLOR oldlace] Por Título[/COLOR]", action="search", thumbnail=thumb_buscar, - extra="titulo")) - itemlist.append(item.clone(title="[COLOR oldlace] Por Año[/COLOR]", action="search", thumbnail=thumb_buscar, - extra="año")) - itemlist.append(item.clone(title="[COLOR oldlace] Por Rating Imdb[/COLOR]", action="search", thumbnail=thumb_buscar, - extra="rating")) - - return itemlist - - -def listado(item): - logger.info() - itemlist = [] - - # Descarga la página - data = '' - try: - data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item.url).data) - except: - pass - - if not data and item.extra != "año": #Si la web está caída salimos sin dar error - logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data) - itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log')) - return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos - elif not data and item.extra == "año": #cuando no hay datos para un año, da error. Tratamos de evitar el error - return itemlist - - patron = '
([^"]+)<\/a>\s?<\/div>
(.*?)<\/div><\/div><\/div>' - #data = scrapertools.find_single_match(data, patron) - matches = re.compile(patron, re.DOTALL).findall(data) - if not matches and not '') + patron = '
  • .*?src="([^"]+)".*? data-original-title=" (\d+x\d+).*?' matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedinfo, lang_data in matches: - + for lang_data, scrapedurl, scrapedthumbnail, scrapedinfo, in matches: url = host+scrapedurl thumbnail = scrapedthumbnail scrapedinfo = scrapedinfo.split('x') season = scrapedinfo[0] episode = scrapedinfo[1] + scrapedtitle = scrapertools.find_single_match(url, 'capitulo/([^/]+)/').replace("-", " ") title = '%s - %sx%s' % (scrapedtitle, season, episode ) title, language = add_language(title, lang_data) itemlist.append(Item(channel=item.channel, @@ -244,7 +241,7 @@ def new_episodes(item): def add_language(title, string): logger.info() - languages = scrapertools.find_multiple_matches(string, '/banderas/(.*?).png') + languages = scrapertools.find_multiple_matches(string, '/language/(.*?).png') language = [] for lang in languages: @@ -269,34 +266,38 @@ def findvideos(item): itemlist = [] data = get_source(item.url) - - patron = "|\s{2,}', "", data) - patron = ".*?src=(.*?) style.*?value=(.*?)>" + data = get_source(item.url) + + patron = '
    .*?src="([^"]+)".*?alt="([^"]+)"' + matches = re.compile(patron, re.DOTALL).findall(data) matches = re.compile(patron, re.DOTALL).findall(data) @@ -344,10 +334,10 @@ def search_results(item): def search(item, texto): logger.info() - import urllib - if texto != '': - post = {'query':texto} - post = urllib.urlencode(post) - item.post = post + texto = texto.replace(" ", "+") + item.url = item.url + texto - return search_results(item) + if texto != '': + return list_all(item) + else: + return [] \ No newline at end of file diff --git a/plugin.video.alfa/channels/seriesverde.json b/plugin.video.alfa/channels/seriesverde.json deleted file mode 100644 index a407338a..00000000 --- a/plugin.video.alfa/channels/seriesverde.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "id": "seriesverde", - "name": "SeriesVerde", - "active": false, - "adult": false, - "language": ["cast", "lat"], - "thumbnail": "https://s33.postimg.cc/96dhv4trj/seriesverde.png", - "banner": "", - "categories": [ - "tvshow" - ], - "settings": [ - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en busqueda global", - "default": false, - "enabled": false, - "visible": false - }, - { - "id": "filter_languages", - "type": "list", - "label": "Mostrar enlaces en idioma...", - "default": 0, - "enabled": true, - "visible": true, - "lvalues": [ - "No filtrar", - "Cast", - "Lat", - "VOSE", - "VO" - ] - } - ] -} diff --git a/plugin.video.alfa/channels/seriesverde.py b/plugin.video.alfa/channels/seriesverde.py deleted file mode 100644 index ce8598d6..00000000 --- a/plugin.video.alfa/channels/seriesverde.py +++ /dev/null @@ -1,321 +0,0 @@ -# -*- coding: utf-8 -*- -# -*- Channel SeriesVerde -*- -# -*- Created for Alfa-addon -*- -# -*- By the Alfa Develop Group -*- - -import re - -from channels import autoplay -from channels import filtertools -from core import httptools -from core import scrapertools -from core import servertools -from core import tmdb -from core.item import Item -from platformcode import config, logger -from channelselector import get_thumb - -host = 'http://seriesverde.com/' - -IDIOMAS = {'es': 'Cast', 'la': 'Lat', 'vos': 'VOSE', 'vo': 'VO'} -list_language = IDIOMAS.values() -list_quality = ['SD', 'Micro-HD-720p', '720p', 'HDitunes', 'Micro-HD-1080p' ] -list_servers = ['powvideo','yourupload', 'openload', 'gamovideo', 'flashx', 'clipwatching', 'streamango', 'streamcloud'] - - -def mainlist(item): - logger.info() - - autoplay.init(item.channel, list_servers, list_quality) - - itemlist = [] - - itemlist.append(Item(channel=item.channel, - title="Todas", - action="list_all", - thumbnail=get_thumb('all', auto=True), - url=host + 'listado/', - )) - - itemlist.append(Item(channel=item.channel, - title="Generos", - action="section", - thumbnail=get_thumb('genres', auto=True), - url=host, - )) - - itemlist.append(Item(channel=item.channel, - title="A - Z", - action="section", - thumbnail=get_thumb('alphabet', auto=True), - url=host+'listado/', )) - - itemlist.append(Item(channel=item.channel, - title="Buscar", - action="search", - thumbnail=get_thumb('search', auto=True))) - - itemlist = filtertools.show_option(itemlist, item.channel, list_language, list_quality) - autoplay.show_option(item.channel, itemlist) - - return itemlist - - -def get_source(url): - logger.info() - data = httptools.downloadpage(url).data - data = re.sub(r'"|\n|\r|\t| |
    |\s{2,}', "", data) - return data - - -def list_all(item): - logger.info() - - itemlist = [] - data = get_source(item.url) - contentSerieName = '' - - patron = "
    .*?src='(.*?)' title='(.*?)'" - matches = re.compile(patron, re.DOTALL).findall(data) - - - for scrapedurl, scrapedthumbnail, scrapedtitle in matches: - - url = host + scrapedurl - thumbnail = scrapedthumbnail - title = scrapertools.decodeHtmlentities(scrapedtitle) - - itemlist.append(Item(channel=item.channel, - action='seasons', - title=title, - url=url, - thumbnail=thumbnail, - contentTitle=scrapedtitle, - contentSerieName=contentSerieName, - context=filtertools.context(item, list_language, list_quality), - )) - - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) - - # #Paginacion - - if itemlist != []: - base_page = scrapertools.find_single_match(item.url,'(.*?)?') - next_page = scrapertools.find_single_match(data, '>>') - if next_page != '': - itemlist.append(Item(channel=item.channel, - action="lista", - title='Siguiente >>>', - url=base_page+next_page, - thumbnail='https://s16.postimg.cc/9okdu7hhx/siguiente.png', - )) - return itemlist - - -def section(item): - logger.info() - - itemlist = [] - data = get_source(item.url) - if item.title == 'Generos': - patron = '
  • (.*?)
  • ' - elif item.title == 'A - Z': - patron = "(.*?)" - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, scrapedtitle in matches: - - if item.title == 'Generos': - url = host + scrapedurl - else: - url = scrapedurl - title = scrapedtitle - itemlist.append(Item(channel=item.channel, - action='list_all', - title=title, - url=url - )) - return itemlist - -def seasons(item): - logger.info() - itemlist = [] - data = get_source(item.url) - - patron = '.*?Temporada (\d+) ' - matches = re.compile(patron, re.DOTALL).findall(data) - infoLabels=item.infoLabels - for scrapedseason in matches: - url = item.url - title = 'Temporada %s' % scrapedseason - contentSeasonNumber = scrapedseason - infoLabels['season'] = contentSeasonNumber - thumbnail = item.thumbnail - itemlist.append(Item(channel=item.channel, - action="episodesxseason", - title=title, - url=url, - thumbnail=thumbnail, - contentSeasonNumber=contentSeasonNumber, - infoLabels=infoLabels - )) - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) - if config.get_videolibrary_support() and len(itemlist) > 0: - itemlist.append(Item(channel=item.channel, - title='[COLOR yellow]Añadir esta serie a la videoteca[/COLOR]', - url=item.url, - action="add_serie_to_library", - extra="episodios", - contentSerieName=item.contentSerieName, - )) - - return itemlist - - -def episodios(item): - logger.info() - itemlist = [] - templist = seasons(item) - for tempitem in templist: - itemlist += episodesxseason(tempitem) - return itemlist - - -def episodesxseason(item): - logger.info() - itemlist = [] - data = get_source(item.url) - season = item.contentSeasonNumber - season_data = scrapertools.find_single_match(data, '
    |\s{2,}', "", data) - patron = ".*?src=(.*?) style.*?value=(.*?)>" - - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, scrapedthumb, scrapedtitle in matches: - itemlist.append(Item(channel=item.channel, - title=scrapedtitle, - url=host+scrapedurl, - action="seasons", - thumbnail=scrapedthumb, - contentSerieName=scrapedtitle, - context=filtertools.context(item, list_language, list_quality) - )) - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) - - return itemlist - - -def search(item, texto): - logger.info() - import urllib - if texto != '': - post = {'query':texto} - post = urllib.urlencode(post) - item.post = post - - return search_results(item) diff --git a/plugin.video.alfa/channels/setting.py b/plugin.video.alfa/channels/setting.py index 806558e9..4ba74103 100644 --- a/plugin.video.alfa/channels/setting.py +++ b/plugin.video.alfa/channels/setting.py @@ -293,15 +293,22 @@ def submenu_tools(item): logger.info() itemlist = list() - #Herramientas de testeo masivo + # Herramientas personalizadas import os - test_path = os.path.join(config.get_runtime_path(), "channels/test.py") - if filetools.exists(test_path): - itemlist.append(Item(title='Testear canales y servidores ...', channel="test", action="mainlist")) - itemlist.append( - Item(channel=CHANNELNAME, action="", title="", folder=False, thumbnail=get_thumb("setting_0.png"))) + channel_custom = os.path.join(config.get_runtime_path(), 'channels', 'custom.py') + if not filetools.exists(channel_custom): + user_custom = os.path.join(config.get_data_path(), 'custom.py') + if filetools.exists(user_custom): + filetools.copy(user_custom, channel_custom, silent=True) + if filetools.exists(channel_custom): + itemlist.append(Item(channel='custom', action='mainlist', title='Custom Channel')) + itemlist.append(Item(channel=CHANNELNAME, action="check_quickfixes", folder=False, + title="Comprobar actualizaciones urgentes", plot="Versión actual: %s" % config.get_addon_version() )) + itemlist.append(Item(channel=CHANNELNAME, action="", title="", folder=False, + thumbnail=get_thumb("setting_0.png"))) + itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60564), action="", folder=False, thumbnail=get_thumb("channels.png"))) itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60565), action="conf_tools", @@ -322,6 +329,13 @@ def submenu_tools(item): return itemlist +def check_quickfixes(item): + logger.info() + + from platformcode import updater + return updater.check_addon_updates(verbose=True) + + def conf_tools(item): logger.info() @@ -553,7 +567,7 @@ def channels_onoff(item): # Diálogo para pre-seleccionar # ---------------------------- - preselecciones = ['Pre-seleccionar activados actualmente', 'Pre-seleccionar todos', 'No pre-seleccionar ninguno'] + preselecciones = [config.get_localized_string(70517), config.get_localized_string(70518), config.get_localized_string(70519)] ret = platformtools.dialog_select(config.get_localized_string(60545), preselecciones) if ret == -1: return False # pedido cancel if ret == 2: preselect = [] diff --git a/plugin.video.alfa/channels/submityouflicks.py b/plugin.video.alfa/channels/submityouflicks.py index 7cc69abc..a329f349 100755 --- a/plugin.video.alfa/channels/submityouflicks.py +++ b/plugin.video.alfa/channels/submityouflicks.py @@ -3,6 +3,7 @@ import re import urlparse +from core import httptools from core import scrapertools from core.item import Item from platformcode import logger @@ -16,7 +17,6 @@ def mainlist(item): viewmode="movie")) itemlist.append(Item(channel=item.channel, action="search", title="Buscar", url="http://www.submityourflicks.com/index.php?mode=search&q=%s&submit=Search")) - return itemlist @@ -37,18 +37,6 @@ def search(item, texto): def videos(item): logger.info() itemlist = [] - - ''' -
    -
    - - - - NEXT") if next_page_url != "": url = urlparse.urljoin(item.url, next_page_url) itemlist.append(Item(channel=item.channel, action="videos", title=">> Página siguiente", url=url, folder=True, viewmode="movie")) - return itemlist def play(item): logger.info() - - data = scrapertools.cache_page(item.url) - - media_url = scrapertools.find_single_match(data, 'file\:\s*"([^"]+)"') + data = httptools.downloadpage(item.url).data + media_url = "https:" + scrapertools.find_single_match(data, 'source src="([^"]+)"') itemlist = [] itemlist.append(Item(channel=item.channel, action="play", title=item.title, fulltitle=item.fulltitle, url=media_url, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - + thumbnail=item.thumbnail, show=item.title, server="directo", folder=False)) return itemlist diff --git a/plugin.video.alfa/channels/trailertools.py b/plugin.video.alfa/channels/trailertools.py index e4336ba1..f1221b10 100755 --- a/plugin.video.alfa/channels/trailertools.py +++ b/plugin.video.alfa/channels/trailertools.py @@ -46,7 +46,7 @@ def buscartrailer(item, trailers=[]): item.contentTitle = item.contentTitle.strip() elif keyboard: fulltitle = re.sub('\[\/*(B|I|COLOR)\s*[^\]]*\]', '', item.fulltitle.strip()) - item.contentTitle = platformtools.dialog_input(default=fulltitle, heading="Introduce el título a buscar") + item.contentTitle = platformtools.dialog_input(default=fulltitle, heading=config.get_localized_string(70505)) if item.contentTitle is None: item.contentTitle = fulltitle else: @@ -86,21 +86,21 @@ def buscartrailer(item, trailers=[]): title = "[COLOR green]%s[/COLOR]" else: title = "%s" - itemlist.append(item.clone(title=title % "Búsqueda en Youtube", action="youtube_search", + itemlist.append(item.clone(title=title % config.get_localized_string(70507), action="youtube_search", text_color="green")) - itemlist.append(item.clone(title=title % "Búsqueda en Filmaffinity", + itemlist.append(item.clone(title=title % config.get_localized_string(70024), action="filmaffinity_search", text_color="green")) # Si se trata de una serie, no se incluye la opción de buscar en Abandomoviez if not item.show and not item.infoLabels['tvshowtitle']: - itemlist.append(item.clone(title=title % "Búsqueda en Abandomoviez", + itemlist.append(item.clone(title=title % config.get_localized_string(70508), action="abandomoviez_search", text_color="green")) - itemlist.append(item.clone(title=title % "Búsqueda en Jayhap (Youtube, Vimeo & Dailymotion)", + itemlist.append(item.clone(title=title % config.get_localized_string(70509), action="jayhap_search", text_color="green")) if item.contextual: global window_select, result select = Select("DialogSelect.xml", config.get_runtime_path(), item=item, itemlist=itemlist, - caption="Buscando: " + item.contentTitle) + caption=config.get_localized_string(70506) + item.contentTitle) window_select.append(select) select.doModal() @@ -177,11 +177,11 @@ def youtube_search(item): 'Siguiente') if next_page != "": next_page = urlparse.urljoin("https://www.youtube.com", next_page) - itemlist.append(item.clone(title=">> Siguiente", action="youtube_search", extra="youtube", page=next_page, + itemlist.append(item.clone(title=config.get_localized_string(70502), action="youtube_search", extra="youtube", page=next_page, thumbnail="", text_color="")) if not itemlist: - itemlist.append(item.clone(title="La búsqueda no ha dado resultados (%s)" % titulo, + itemlist.append(item.clone(title=config.get_localized_string(70501) % titulo, action="", thumbnail="", text_color="")) if keyboard: @@ -189,7 +189,7 @@ def youtube_search(item): title = "[COLOR green]%s[/COLOR]" else: title = "%s" - itemlist.append(item.clone(title=title % "Búsqueda Manual en Youtube", action="manual_search", + itemlist.append(item.clone(title=title % config.get_localized_string(70510), action="manual_search", text_color="green", thumbnail="", extra="youtube")) return itemlist @@ -232,11 +232,11 @@ def abandomoviez_search(item): next_page = scrapertools.find_single_match(data, 'Siguiente') if next_page != "": next_page = urlparse.urljoin("http://www.abandomoviez.net/%s" % item.prefix, next_page) - itemlist.append(item.clone(title=">> Siguiente", action="abandomoviez_search", page=next_page, thumbnail="", + itemlist.append(item.clone(title=config.get_localized_string(70502), action="abandomoviez_search", page=next_page, thumbnail="", text_color="")) if not itemlist: - itemlist.append(item.clone(title="La búsqueda no ha dado resultados", action="", thumbnail="", + itemlist.append(item.clone(title=config.get_localized_string(70501), action="", thumbnail="", text_color="")) if keyboard: @@ -244,7 +244,7 @@ def abandomoviez_search(item): title = "[COLOR green]%s[/COLOR]" else: title = "%s" - itemlist.append(item.clone(title=title % "Búsqueda Manual en Abandomoviez", + itemlist.append(item.clone(title=title % config.get_localized_string(70511), action="manual_search", thumbnail="", text_color="green", extra="abandomoviez")) return itemlist @@ -256,13 +256,13 @@ def search_links_abando(item): data = scrapertools.downloadpage(item.url) itemlist = [] if "Lo sentimos, no tenemos trailer" in data: - itemlist.append(item.clone(title="No hay ningún vídeo disponible", action="", text_color="")) + itemlist.append(item.clone(title=config.get_localized_string(70503), action="", text_color="")) else: if item.contextual: - progreso = platformtools.dialog_progress("Buscando en abandomoviez", "Cargando trailers...") + progreso = platformtools.dialog_progress(config.get_localized_string(70512), config.get_localized_string(70504)) progreso.update(10) i = 0 - message = "Cargando trailers..." + message = config.get_localized_string(70504) patron = '
    (.*?)' matches = scrapertools.find_multiple_matches(data, patron) @@ -304,7 +304,7 @@ def search_links_abando(item): title = "[COLOR green]%s[/COLOR]" else: title = "%s" - itemlist.append(item.clone(title=title % "Búsqueda Manual en Abandomoviez", + itemlist.append(item.clone(title=title % config.get_localized_string(70511), action="manual_search", thumbnail="", text_color="green", extra="abandomoviez")) return itemlist @@ -349,11 +349,11 @@ def filmaffinity_search(item): next_page = scrapertools.find_single_match(data, '>>') if next_page != "": next_page = urlparse.urljoin("http://www.filmaffinity.com/es/", next_page) - itemlist.append(item.clone(title=">> Siguiente", page=next_page, action="filmaffinity_search", thumbnail="", + itemlist.append(item.clone(title=config.get_localized_string(70502), page=next_page, action="filmaffinity_search", thumbnail="", text_color="")) if not itemlist: - itemlist.append(item.clone(title="La búsqueda no ha dado resultados (%s)" % item.contentTitle, + itemlist.append(item.clone(title=config.get_localized_string(70501) % item.contentTitle, action="", thumbnail="", text_color="")) if keyboard: @@ -361,7 +361,7 @@ def filmaffinity_search(item): title = "[COLOR green]%s[/COLOR]" else: title = "%s" - itemlist.append(item.clone(title=title % "Búsqueda Manual en Filmaffinity", + itemlist.append(item.clone(title=title % config.get_localized_string(70513), action="manual_search", text_color="green", thumbnail="", extra="filmaffinity")) return itemlist @@ -373,7 +373,7 @@ def search_links_filmaff(item): itemlist = [] data = scrapertools.downloadpage(item.url) if not 'Genres(.*?)') matches = scrapertools.find_multiple_matches(bloque, ' value="([^"]+)"\s*>\s*([^<]+)<') if matches: list_controls.append({'id': 'labelgenre', 'enabled': True, 'type': 'label', 'visible': True, - 'label': 'Selecciona uno, ninguno o más de un género', 'color': '0xFFC52020'}) + 'label': config.get_localized_string(70451), 'color': '0xFFC52020'}) lista = [] for valor, titulo in matches: titulo = generos_spa.get(titulo, titulo) @@ -1054,10 +1054,10 @@ def filtro_imdb(item): bloque = scrapertools.find_single_match(data, '

    Countries

    (.*?)Less-Common') matches = scrapertools.find_multiple_matches(bloque, ' value="([^"]+)"\s*>([^<]+)<') if matches: - list_controls.append({'id': 'pais', 'label': 'País', 'enabled': True, 'color': '0xFFFF8000', + list_controls.append({'id': 'pais', 'label': config.get_localized_string(70466), 'enabled': True, 'color': '0xFFFF8000', 'type': 'list', 'default': -1, 'visible': True}) list_controls[-1]['lvalues'] = [] - list_controls[-1]['lvalues'].append('Cualquiera') + list_controls[-1]['lvalues'].append(config.get_localized_string(70450)) valores['pais'] = [] valores['pais'].append('') for valor, titulo in matches: @@ -1067,13 +1067,10 @@ def filtro_imdb(item): except: pass - list_controls.append({'id': 'votos', 'label': 'Número mínimo de votos', 'enabled': True, - 'type': 'text', 'default': '10000', 'visible': True, 'color': '0xFFF4FA58'}) - - list_controls.append({'id': 'orden', 'label': 'Ordenar por', 'enabled': True, 'color': '0xFF25AA48', + list_controls.append({'id': 'orden', 'label': config.get_localized_string(70455), 'enabled': True, 'color': '0xFF25AA48', 'type': 'list', 'default': -1, 'visible': True}) - orden = ['Popularidad Desc', 'Popularidad Asc', 'Año Desc', 'Año Asc', 'Valoración Desc', 'Valoración Asc', - 'Título [A-Z]', 'Título [Z-A]'] + orden = [config.get_localized_string(70456), config.get_localized_string(70457), config.get_localized_string(70458), config.get_localized_string(70459), config.get_localized_string(70460), config.get_localized_string(70461), + config.get_localized_string(70462), config.get_localized_string(70463)] orden_imdb = ['moviemeter,asc', 'moviemeter,desc', 'year,desc', 'year,asc', 'user_rating,desc', 'user_rating,asc', 'alpha,asc', 'alpha,desc'] @@ -1083,7 +1080,7 @@ def filtro_imdb(item): list_controls[-1]['lvalues'].insert(0, tipo_orden) valores['orden'].insert(0, orden_imdb[i]) - list_controls.append({'id': 'save', 'label': 'Establecer como filtro por defecto', 'enabled': True, + list_controls.append({'id': 'save', 'label': config.get_localized_string(70464), 'enabled': True, 'type': 'bool', 'default': False, 'visible': True}) item.valores = valores @@ -1130,12 +1127,12 @@ def indices_imdb(item): itemlist = [] from datetime import datetime if config.get_localized_string(70032) in item.title: - generos_spa = {'Action': 'Accion', 'Adventure': 'Aventura', 'Animation': 'Animacion', 'Biography': 'Biografía', - 'Comedy': 'Comedia', 'Crime': 'Crimen', 'Documentary': 'Documental', 'Family': 'Familia', - 'Fantasy': 'Fantasia', 'Film-Noir': 'Cine Negro', 'Game-Show': 'Concursos', - 'History': 'Historia', 'Horror': 'Terror', 'Music': 'Música', 'Mistery': 'Intriga', - 'News': 'Noticias', 'Reality-TV': 'Reality', 'Sci-Fi': 'Ciencia Ficcion', 'Sport': 'Deportes', - 'Talk-Show': 'Entrevistas', 'War': 'Cine Bélico'} + generos_spa = {'Action': config.get_localized_string(70394), 'Adventure': config.get_localized_string(60267), 'Animation': config.get_localized_string(60268), 'Biography': config.get_localized_string(70403), 'Thriller': config.get_localized_string(70410), + 'Comedy': config.get_localized_string(60270), 'Crime': config.get_localized_string(60271), 'Documentary': config.get_localized_string(70396), 'Family': config.get_localized_string(70399), 'Romance': config.get_localized_string(70409), + 'Fantasy': config.get_localized_string(60274), 'Film-Noir': config.get_localized_string(70400), 'Game-Show': config.get_localized_string(70401), 'Drama': config.get_localized_string(70412), 'Western': config.get_localized_string(70411), + 'History': config.get_localized_string(70405), 'Horror': config.get_localized_string(70013), 'Music': config.get_localized_string(70404), 'Musical': config.get_localized_string(70408),'Mystery': config.get_localized_string(70402), + 'News': config.get_localized_string(60279), 'Reality-TV': config.get_localized_string(70406), 'Sci-Fi': config.get_localized_string(70397), 'Sport': config.get_localized_string(70395), + 'Talk-Show': config.get_localized_string(70398), 'War': config.get_localized_string(70407)} data = httptools.downloadpage("http://www.imdb.com/search/title", cookies=False).data bloque = scrapertools.find_single_match(data, '

    Genres

    (.*?)') matches = scrapertools.find_multiple_matches(bloque, ' value="([^"]+)"\s*>\s*([^<]+)<') @@ -1616,9 +1613,9 @@ def filtro_fa(item): if valores_guardados: dict_values = valores_guardados - list_controls.append({'id': 'yearsdesde', 'label': 'Año desde:', 'enabled': True, + list_controls.append({'id': 'yearsdesde', 'label': config.get_localized_string(70452), 'enabled': True, 'type': 'list', 'default': -1, 'visible': True}) - list_controls.append({'id': 'yearshasta', 'label': 'Año hasta:', 'enabled': True, + list_controls.append({'id': 'yearshasta', 'label': config.get_localized_string(70453), 'enabled': True, 'type': 'list', 'default': -1, 'visible': True}) list_controls[0]['lvalues'] = [] list_controls[1]['lvalues'] = [] @@ -1628,8 +1625,8 @@ def filtro_fa(item): list_controls[0]['lvalues'].append(str(i)) list_controls[1]['lvalues'].append(str(i)) valores['years'].append(str(i)) - list_controls[0]['lvalues'].append('Cualquiera') - list_controls[1]['lvalues'].append('Cualquiera') + list_controls[0]['lvalues'].append(config.get_localized_string(70450)) + list_controls[1]['lvalues'].append(config.get_localized_string(70450)) valores['years'].append('') data = httptools.downloadpage("http://m.filmaffinity.com/%s/topgen.php" % langf).data @@ -1640,7 +1637,7 @@ def filtro_fa(item): bloque = scrapertools.find_single_match(data, 'name="genre">.*?(.*?)') matches = scrapertools.find_multiple_matches(bloque, '') if matches: - list_controls.append({'id': 'genero', 'label': 'Selecciona un género', 'enabled': True, + list_controls.append({'id': 'genero', 'label': config.get_localized_string(70467), 'enabled': True, 'type': 'list', 'default': -1, 'visible': True}) list_controls[2]['lvalues'] = [] list_controls[2]['lvalues'].append("Todos") @@ -1659,7 +1656,7 @@ def filtro_fa(item): bloque = scrapertools.find_single_match(data, 'name="country">.*?(.*?)') matches = scrapertools.find_multiple_matches(bloque, '') if matches: - list_controls.append({'id': 'pais', 'label': 'País', 'enabled': True, + list_controls.append({'id': 'pais', 'label': config.get_localized_string(70466), 'enabled': True, 'type': 'list', 'default': -1, 'visible': True}) list_controls[-1]['lvalues'] = [] list_controls[-1]['lvalues'].append('Todos') @@ -1673,7 +1670,7 @@ def filtro_fa(item): list_controls.append({'id': 'espacio', 'label': '', 'enabled': False, 'type': 'label', 'default': None, 'visible': True}) - list_controls.append({'id': 'save', 'label': 'Establecer como filtro por defecto', 'enabled': True, + list_controls.append({'id': 'save', 'label': config.get_localized_string(70464), 'enabled': True, 'type': 'bool', 'default': False, 'visible': True}) item.valores = valores @@ -1863,7 +1860,7 @@ def votar_fa(item): dict_values = None if item.voto: dict_values = {'voto': item.voto} - list_controls.append({'id': 'voto', 'label': 'Indica tu voto:', 'enabled': True, + list_controls.append({'id': 'voto', 'label': config.get_localized_string(70468), 'enabled': True, 'type': 'list', 'default': 0, 'visible': True}) list_controls[0]['lvalues'] = ['No vista'] valores['voto'] = ["-1"] @@ -2184,9 +2181,9 @@ def acciones_trakt(item): elif data and not item.url.endswith("lists"): data = jsontools.load(data) if data and "page=1" in item.url and item.order: - valores = {'rank': 'Por defecto', 'added': 'Añadido', 'title': 'Título', 'released': 'Estreno', - 'runtime': 'Duración', 'popularity': 'Popularidad', 'percentage': 'Valoración', - 'votes': 'Votos', 'asc': 'ascendente', 'desc': 'descendente'} + valores = {'rank': config.get_localized_string(70003), 'added': config.get_localized_string(70469), 'title': config.get_localized_string(60320), 'released': config.get_localized_string(70470), + 'runtime': config.get_localized_string(70471), 'popularity': config.get_localized_string(70472), 'percentage': config.get_localized_string(70473), + 'votes': config.get_localized_string(70474), 'asc': config.get_localized_string(70475), 'desc': config.get_localized_string(70476)} orden = valores[item.order] + " " + valores[item.how] itemlist.append(item.clone(title=config.get_localized_string(70349) % orden, action="order_list", text_color=color4)) @@ -2267,13 +2264,13 @@ def order_list(item): dict_values = {'orderby': valores1.index(item.order), 'orderhow': valores2.index(item.how)} - list_controls.append({'id': 'orderby', 'label': 'Ordenar por:', 'enabled': True, + list_controls.append({'id': 'orderby', 'label': config.get_localized_string(70455), 'enabled': True, 'type': 'list', 'default': 0, 'visible': True}) list_controls.append({'id': 'orderhow', 'label': 'De forma:', 'enabled': True, 'type': 'list', 'default': 0, 'visible': True}) - list_controls[0]['lvalues'] = ['Por defecto', 'Añadido', 'Título', 'Estreno', 'Duración', 'Popularidad', - 'Valoración', 'Votos'] - list_controls[1]['lvalues'] = ['Ascendente', 'Descendente'] + list_controls[0]['lvalues'] = [config.get_localized_string(70003), config.get_localized_string(70469), config.get_localized_string(60230), config.get_localized_string(70470), config.get_localized_string(70471), config.get_localized_string(70472), + config.get_localized_string(70473), config.get_localized_string(70474)] + list_controls[1]['lvalues'] = [config.get_localized_string(70477), config.get_localized_string(70478)] return platformtools.show_channel_settings(list_controls=list_controls, dict_values=dict_values, caption=config.get_localized_string(70320), item=item, callback='order_trakt') @@ -2494,8 +2491,8 @@ def detalles_mal(item): itemlist.append( item.clone(title=config.get_localized_string(70321) % score, action="menu_mal", contentTitle=title_mal)) elif item.login and config.is_xbmc(): - status = {'1': 'Viendo Actualmente', '2': 'Completados', '3': 'En pausa', '4': 'Descartados', - '6': 'Previstos para ver'} + status = {'1': config.get_localized_string(70479), '2': config.get_localized_string(70480), '3': config.get_localized_string(70384), '4': config.get_localized_string(70385), + '6': config.get_localized_string(70481)} estado = scrapertools.find_single_match(data, 'myinfo_updateInfo".*?option selected="selected" value="(\d+)"') try: estado = status[estado] @@ -2995,7 +2992,7 @@ def info_anidb(item, itemlist, url): if abrev != title: title += " [%s]" % abrev estado = estado.replace("complete", config.get_localized_string(70378)).replace("finished", config.get_localized_string(70379)) \ - .replace("stalled", "Pausa").replace("dropped", "Abandonada") + .replace("stalled", config.get_localized_string(70380)).replace("dropped", config.get_localized_string(70381)) title += " [COLOR %s](%s)[/COLOR] %s/%s [%s]" % (color6, estado, epis, epi_total, source) itemlist.append(Item(channel=item.channel, title=title, infoLabels=infoLabels, action="", thumbnail=thumbnail, text_color=color4)) @@ -3012,22 +3009,22 @@ def filtro_mal(item): if valores_guardados: dict_values = valores_guardados - list_controls.append({'id': 'keyword', 'label': 'Palabra Clave', 'enabled': True, + list_controls.append({'id': 'keyword', 'label': config.get_localized_string(70465), 'enabled': True, 'type': 'text', 'default': '', 'visible': True}) - list_controls.append({'id': 'tipo', 'label': 'Tipo', 'enabled': True, + list_controls.append({'id': 'tipo', 'label': config.get_localized_string(70482), 'enabled': True, 'type': 'list', 'default': -1, 'visible': True}) - list_controls[1]['lvalues'] = ['Especial', 'OVA', 'Película', 'Serie', 'Cualquiera'] + list_controls[1]['lvalues'] = [config.get_localized_string(70483), config.get_localized_string(70484), config.get_localized_string(60244), config.get_localized_string(70136), config.get_localized_string(70450)] valores["tipo"] = ['4', '2', '3', '1', '0'] - list_controls.append({'id': 'valoracion', 'label': 'Valoración', 'enabled': True, + list_controls.append({'id': 'valoracion', 'label': config.get_localized_string(70473), 'enabled': True, 'type': 'list', 'default': -1, 'visible': True}) - list_controls[2]['lvalues'] = ['(1) Grotesca', '(2) Horrible', '(3) Muy mala', '(4) Mala', - '(5) Regular', '(6) Pasable', '(7) Buena', '(8) Muy buena', - '(9) Genial', '(10) Obra maestra', 'Cualquiera'] + list_controls[2]['lvalues'] = [config.get_localized_string(70486), config.get_localized_string(70487), config.get_localized_string(70488), config.get_localized_string(70489), + config.get_localized_string(70490), config.get_localized_string(70491), config.get_localized_string(70492), config.get_localized_string(70493), + config.get_localized_string(70494), config.get_localized_string(70495), config.get_localized_string(70450)] valores["valoracion"] = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '0'] - list_controls.append({'id': 'estado', 'label': 'Estado', 'enabled': True, + list_controls.append({'id': 'estado', 'label': config.get_localized_string(70485), 'enabled': True, 'type': 'list', 'default': -1, 'visible': True}) - list_controls[3]['lvalues'] = ['Por estrenar', 'En emisión', 'Terminada', 'Cualquiera'] + list_controls[3]['lvalues'] = ['Por estrenar', config.get_localized_string(60264), config.get_localized_string(70379), config.get_localized_string(70450)] valores["estado"] = ['3', '1', '2', '0'] try: @@ -3037,7 +3034,7 @@ def filtro_mal(item): generos = scrapertools.find_multiple_matches(data, patron) if generos: list_controls.append({'id': 'labelgenre', 'enabled': True, 'type': 'label', 'default': None, - 'label': 'Selecciona uno, ninguno o más de un género', + 'label': config.get_localized_string(70451), 'visible': True, 'color': '0xFFC52020'}) for value, genre in generos: list_controls.append({'id': 'genre' + value, 'label': genre, 'enabled': True, @@ -3047,7 +3044,7 @@ def filtro_mal(item): list_controls.append({'id': 'espacio', 'label': '', 'enabled': False, 'type': 'label', 'default': None, 'visible': True}) - list_controls.append({'id': 'save', 'label': 'Establecer como filtro por defecto', 'enabled': True, + list_controls.append({'id': 'save', 'label': config.get_localized_string(70464), 'enabled': True, 'type': 'bool', 'default': False, 'visible': True}) item.valores = valores @@ -3231,8 +3228,8 @@ def menu_mal(item): data = httptools.downloadpage(item.url).data try: - status = {'1': 'Viendo Actualmente', '2': 'Completados', '3': 'En pausa', '4': 'Descartados', - '6': 'Previstos para ver'} + status = {'1': config.get_localized_string(70479), '2': config.get_localized_string(70480), '3': config.get_localized_string(70384), '4': config.get_localized_string(70385), + '6': config.get_localized_string(70481)} button, estado = scrapertools.find_single_match(data, 'myinfo_updateInfo"(.*?)>.*?option selected="selected" value="(\d+)"') if "disabled" in button: @@ -3249,9 +3246,9 @@ def menu_mal(item): if "lista" in title_estado: item.lista = True - itemlist.append(item.clone(title=config.get_localized_string(70390) % (item.contentTitle, title_estado), action="")) - status = {'1': 'Viendo Actualmente', '2': 'Completados', '3': 'En pausa', '4': 'Descartados', - '6': 'Previstos para ver'} + itemlist.append(item.clone(title="Anime: %s%s" % (item.contentTitle, title_estado), action="")) + status = {'1': config.get_localized_string(70479), '2': config.get_localized_string(70480), '3': config.get_localized_string(70384), '4': config.get_localized_string(70385), + '6': config.get_localized_string(70481)} for key, value in status.items(): if not value in title_estado: itemlist.append( diff --git a/plugin.video.alfa/channels/videolibrary.json b/plugin.video.alfa/channels/videolibrary.json index a68b173f..4afa81bd 100755 --- a/plugin.video.alfa/channels/videolibrary.json +++ b/plugin.video.alfa/channels/videolibrary.json @@ -44,7 +44,9 @@ "00:00", "04:00", "08:00", - "12:00" + "12:00", + "16:00", + "20:00" ] }, { @@ -303,6 +305,12 @@ "default": true, "enabled": "eq(-1,TheTvDB.com)", "visible": true + }, + { + "id": "verify_playcount", + "type": "bool", + "label": "Verificación de los contadores de vídeos vistos/no vistos (desmarcar para verificar)", + "default": false } ] } \ No newline at end of file diff --git a/plugin.video.alfa/channels/videolibrary.py b/plugin.video.alfa/channels/videolibrary.py index 0ac027d6..ff1e58ad 100644 --- a/plugin.video.alfa/channels/videolibrary.py +++ b/plugin.video.alfa/channels/videolibrary.py @@ -127,19 +127,23 @@ def list_tvshows(item): pass head_nfo, item_tvshow = videolibrarytools.read_nfo(tvshow_path) - item_tvshow.title = item_tvshow.contentTitle - item_tvshow.path = raiz - item_tvshow.nfo = tvshow_path - - # Menu contextual: Marcar como visto/no visto - visto = item_tvshow.library_playcounts.get(item_tvshow.contentTitle, 0) - item_tvshow.infoLabels["playcount"] = visto - if visto > 0: - texto_visto = config.get_localized_string(60020) - contador = 0 - else: - texto_visto = config.get_localized_string(60021) - contador = 1 + try: #A veces da errores aleatorios, por no encontrar el .nfo. Probablemente problemas de timing + item_tvshow.title = item_tvshow.contentTitle + item_tvshow.path = raiz + item_tvshow.nfo = tvshow_path + # Menu contextual: Marcar como visto/no visto + visto = item_tvshow.library_playcounts.get(item_tvshow.contentTitle, 0) + item_tvshow.infoLabels["playcount"] = visto + if visto > 0: + texto_visto = config.get_localized_string(60020) + contador = 0 + else: + texto_visto = config.get_localized_string(60021) + contador = 1 + + except: + logger.error('No encuentra: ' + str(tvshow_path)) + continue # Menu contextual: Buscar automáticamente nuevos episodios o no if item_tvshow.active and int(item_tvshow.active) > 0: @@ -319,6 +323,7 @@ def get_episodes(item): def findvideos(item): + from channels import autoplay logger.info() # logger.debug("item:\n" + item.tostring('\n')) @@ -326,6 +331,9 @@ def findvideos(item): list_canales = {} item_local = None + # Desactiva autoplay + autoplay.set_status(False) + if not item.contentTitle or not item.strm_path: logger.debug("No se pueden buscar videos por falta de parametros") return [] @@ -465,6 +473,8 @@ def findvideos(item): itemlist.append(server) # return sorted(itemlist, key=lambda it: it.title.lower()) + autoplay.play_multi_channel(item, itemlist) + return itemlist @@ -541,6 +551,70 @@ def update_tvshow(item): p_dialog.close() +def verify_playcount_series(item, path): + logger.info() + + """ + Este método revisa y repara el PlayCount de una serie que se haya desincronizado de la lista real de episodios en su carpeta. Las entradas de episodios, temporadas o serie que falten, son creado con la marca de "no visto". Posteriormente se envia a verificar los contadores de Temporadas y Serie + + En el retorno envía de estado de True si se actualizado o False si no, normalmente por error. Con este estado, el caller puede actualizar el estado de la opción "verify_playcount" en "videolibrary.py". La intención de este método es la de dar una pasada que repare todos los errores y luego desactivarse. Se puede volver a activar en el menú de Videoteca de Alfa. + + """ + #logger.debug("item:\n" + item.tostring('\n')) + + #Si no ha hecho nunca la verificación, lo forzamos + estado = config.get_setting("verify_playcount", "videolibrary") + if not estado or estado == False: + estado = True #Si no ha hecho nunca la verificación, lo forzamos + else: + estado = False + + if item.contentType == 'movie': #Esto es solo para Series + return (item, False) + if filetools.exists(path): + nfo_path = filetools.join(path, "tvshow.nfo") + head_nfo, it = videolibrarytools.read_nfo(nfo_path) #Obtenemos el .nfo de la Serie + if not hasattr(it, 'library_playcounts') or not it.library_playcounts: #Si el .nfo no tiene library_playcounts se lo creamos + logger.error('** No tiene PlayCount') + it.library_playcounts = {} + + # Obtenemos los archivos de los episodios + raiz, carpetas_series, ficheros = filetools.walk(path).next() + # Crear un item en la lista para cada strm encontrado + estado_update = False + for i in ficheros: + if i.endswith('.strm'): + season_episode = scrapertools.get_season_and_episode(i) + if not season_episode: + # El fichero no incluye el numero de temporada y episodio + continue + season, episode = season_episode.split("x") + if season_episode not in it.library_playcounts: #No está incluido el episodio + it.library_playcounts.update({season_episode: 0}) #actualizamos el playCount del .nfo + estado_update = True #Marcamos que hemos actualizado algo + + if 'season %s' % season not in it.library_playcounts: #No está incluida la Temporada + it.library_playcounts.update({'season %s' % season: 0}) #actualizamos el playCount del .nfo + estado_update = True #Marcamos que hemos actualizado algo + + if it.contentSerieName not in it.library_playcounts: #No está incluida la Serie + it.library_playcounts.update({item.contentSerieName: 0}) #actualizamos el playCount del .nfo + estado_update = True #Marcamos que hemos actualizado algo + + if estado_update: + logger.error('** Estado de actualización: ' + str(estado) + ' / PlayCount: ' + str(it.library_playcounts)) + estado = estado_update + # se comprueba que si todos los episodios de una temporada están marcados, se marque tb la temporada + for key, value in it.library_playcounts.iteritems(): + if key.startswith("season"): + season = scrapertools.find_single_match(key, 'season (\d+)') #Obtenemos en núm. de Temporada + it = check_season_playcount(it, season) + # Guardamos los cambios en item.nfo + if filetools.write(nfo_path, head_nfo + it.tojson()): + return (it, estado) + return (item, False) + + def mark_content_as_watched2(item): logger.info() # logger.debug("item:\n" + item.tostring('\n')) diff --git a/plugin.video.alfa/channels/yaske.json b/plugin.video.alfa/channels/yaske.json deleted file mode 100644 index a28e4e4f..00000000 --- a/plugin.video.alfa/channels/yaske.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "id": "yaske", - "name": "Yaske", - "active": true, - "adult": false, - "language": ["cast", "lat"], - "banner": "yaske.png", - "fanart": "https://github.com/master-1970/resources/raw/master/images/fanart/yaske.png", - "thumbnail": "yaske.png", - "categories": [ - "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", - "label": "Incluir en Novedades - Peliculas", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_infantiles", - "type": "bool", - "label": "Incluir en Novedades - Infantiles", - "default": false, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_terror", - "type": "bool", - "label": "Incluir en Novedades - terror", - "default": true, - "enabled": true, - "visible": true - } - ] -} diff --git a/plugin.video.alfa/channels/yaske.py b/plugin.video.alfa/channels/yaske.py deleted file mode 100644 index b81aa810..00000000 --- a/plugin.video.alfa/channels/yaske.py +++ /dev/null @@ -1,349 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urllib -import unicodedata - -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 - -idiomas1 = {"/es.png":"CAST","/en_es.png":"VOSE","/la.png":"LAT","/en.png":"ENG"} -domain = "yaske.ro" -HOST = "http://www." + domain -HOST_MOVIES = "http://peliculas." + domain + "/now_playing/" -HOST_TVSHOWS = "http://series." + domain + "/popular/" -HOST_TVSHOWS_TPL = "http://series." + domain + "/tpl" -parameters = channeltools.get_channel_parameters('yaske') -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 = color2 - item.fanart = fanart_host - thumbnail = "https://raw.githubusercontent.com/master-1970/resources/master/images/genres/4/verdes/%s.png" - - itemlist.append(item.clone(title="Peliculas", text_bold=True, viewcontent='movies', - thumbnail=thumbnail % 'novedades', viewmode="movie_with_plot")) - itemlist.append(item.clone(title=" Novedades", action="peliculas", viewcontent='movies', - url=HOST_MOVIES, - thumbnail=thumbnail % 'novedades', viewmode="movie_with_plot")) - itemlist.append(item.clone(title=" Estrenos", action="peliculas", - url=HOST + "/premiere", thumbnail=thumbnail % 'estrenos')) - itemlist.append(item.clone(title=" Género", action="menu_buscar_contenido", thumbnail=thumbnail % 'generos', viewmode="thumbnails", - url=HOST - )) - itemlist.append(item.clone(title=" Buscar película", action="search", thumbnail=thumbnail % 'buscar', - type = "movie" )) - - itemlist.append(item.clone(title="Series", text_bold=True, viewcontent='movies', - thumbnail=thumbnail % 'novedades', viewmode="movie_with_plot")) - itemlist.append(item.clone(title=" Novedades", action="series", viewcontent='movies', - url=HOST_TVSHOWS, - thumbnail=thumbnail % 'novedades', viewmode="movie_with_plot")) - itemlist.append(item.clone(title=" Buscar serie", action="search", thumbnail=thumbnail % 'buscar', - type = "tvshow" )) - - return itemlist - - -def series(item): - logger.info() - itemlist = [] - url_p = scrapertools.find_single_match(item.url, '(.*?).page=') - page = scrapertools.find_single_match(item.url, 'page=([0-9]+)') - if not page: - page = 1 - url_p = item.url - else: - page = int(page) + 1 - if "search" in item.url: - url_p += "&page=%s" %page - else: - url_p += "?page=%s" %page - data = httptools.downloadpage(url_p).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - patron = '(?s)class="post-item-image btn-play-item".*?' - patron += 'href="(http://series[^"]+)">.*?' - patron += '0: - itemlist.append( - Item(channel=item.channel, action="series", title=">> Página siguiente", thumbnail=thumbnail_host, - url=url_p, folder=True, text_color=color3, text_bold=True)) - return itemlist - - -def temporadas(item): - logger.info() - itemlist = [] - post = [] - data = httptools.downloadpage(item.url).data - patron = 'media-object" src="([^"]+).*?' - patron += 'media-heading">([^<]+).*?' - patron += '(.*?)
    ' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedthumbnail, scrapedtitle, scrapedcapitulos in matches: - id = scrapertools.find_single_match(item.url, "yaske.ro/([0-9]+)") - season = scrapertools.find_single_match(scrapedtitle, "[0-9]+") - title = scrapedtitle + " (%s)" %scrapedcapitulos.replace("","").replace("\n","") - post = {"data[season]" : season, "data[id]" : id, "name" : "list_episodes" , "both" : "0", "type" : "template"} - post = urllib.urlencode(post) - item.infoLabels["season"] = season - itemlist.append(item.clone(action = "capitulos", - post = post, - title = title, - url = HOST_TVSHOWS_TPL - )) - tmdb.set_infoLabels(itemlist) - if config.get_videolibrary_support(): - itemlist.append(Item(channel=item.channel, title ="")) - itemlist.append(item.clone(action = "add_serie_to_library", - channel = item.channel, - extra = "episodios", - title = '[COLOR yellow]Añadir esta serie a la videoteca[/COLOR]', - url = item.url - )) - return itemlist - -def episodios(item): - logger.info() - itemlist = [] - templist = temporadas(item) - for tempitem in templist: - itemlist += capitulos(tempitem) - return itemlist - - -def capitulos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url, post=item.post).data - data = data.replace("","") - patron = 'href=."([^"]+).*?' - patron += 'media-heading.">([^<]+).*?' - patron += 'fecha de emisi.*?: ([^<]+)' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedtitle, scrapeddate in matches: - scrapedtitle = scrapedtitle + " (%s)" %scrapeddate - episode = scrapertools.find_single_match(scrapedurl, "capitulo-([0-9]+)") - query = item.contentSerieName + " " + scrapertools.find_single_match(scrapedtitle, "\w+") - item.infoLabels["episode"] = episode - itemlist.append(item.clone(action = "findvideos", - title = scrapedtitle.decode("unicode-escape"), - query = query.replace(" ","+"), - url = scrapedurl.replace("\\","") - )) - tmdb.set_infoLabels(itemlist) - return itemlist - - -def search(item, texto): - logger.info() - itemlist = [] - try: - item.url = HOST + "/search/?query=" + texto.replace(' ', '+') - item.extra = "" - if item.type == "movie": - itemlist.extend(peliculas(item)) - else: - itemlist.extend(series(item)) - if itemlist[-1].title == ">> Página siguiente": - item_pag = itemlist[-1] - itemlist = sorted(itemlist[:-1], key=lambda Item: Item.contentTitle) - itemlist.append(item_pag) - else: - itemlist = sorted(itemlist, key=lambda Item: Item.contentTitle) - return itemlist - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def newest(categoria): - logger.info() - item = Item() - try: - if categoria == 'peliculas': - item.url = HOST - elif categoria == 'infantiles': - item.url = HOST + "/genre/16/" - elif categoria == 'terror': - item.url = HOST + "/genre/27/" - 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: - import sys - for line in sys.exc_info(): - logger.error("{0}".format(line)) - return [] - - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - url_p = scrapertools.find_single_match(item.url, '(.*?).page=') - page = scrapertools.find_single_match(item.url, 'page=([0-9]+)') - if not page: - page = 1 - url_p = item.url - else: - page = int(page) + 1 - if "search" in item.url: - url_p += "&page=%s" %page - else: - url_p += "?page=%s" %page - data = httptools.downloadpage(url_p).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - patron = '(?s)class="post-item-image btn-play-item".*?' - patron += 'href="([^"]+)">.*?' - patron += '0: - itemlist.append( - Item(channel=item.channel, action="peliculas", title=">> Página siguiente", thumbnail=thumbnail_host, - url=url_p, 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 = 'Generos.*?' - data = scrapertools.find_single_match(data, patron) - 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" - )) - return itemlist - - -def findvideos(item): - logger.info() - itemlist = [] - sublist = [] - data = httptools.downloadpage(item.url).data - patron = '(?s)id="online".*?server="([^"]+)"' - mserver = scrapertools.find_single_match(data, patron) - if not item.query: - item.query = scrapertools.find_single_match(item.url, "peliculas.*?/[0-9]+/([^/]+)").replace("-","+") - url_m = "http://olimpo.link/?q=%s&server=%s" %(item.query, mserver) - patron = 'class="favicon.*?domain=(?:www\.|)([^\.]+).*?text-overflow.*?href="([^"]+).*?' - patron += '\[([^\]]+)\].*?\[([^\]]+)\]' - data = httptools.downloadpage(url_m).data - matches = scrapertools.find_multiple_matches(data, patron) - page = 2 - while len(matches)>0: - for server, url, idioma, calidad in matches: - if "drive" in server: - server = "gvideo" - sublist.append(item.clone(action="play", url=url, folder=False, text_color=color1, quality=calidad.strip(), - language=idioma.strip(), - server = server, - title="Ver en %s %s" %(server, calidad) - )) - data = httptools.downloadpage(url_m + "&page=%s" %page).data - matches = scrapertools.find_multiple_matches(data, patron) - page +=1 - sublist = sorted(sublist, key=lambda Item: Item.quality + Item.server) - for k in ["Español", "Latino", "Ingles - Sub Español", "Ingles"]: - lista_idioma = filter(lambda i: i.language == k, sublist) - if lista_idioma: - itemlist.append(item.clone(title=k, folder=False, infoLabels = "", - text_color=color2, text_bold=True, thumbnail=thumbnail_host)) - itemlist.extend(lista_idioma) - - tmdb.set_infoLabels(itemlist, True) - # Insertar items "Buscar trailer" y "Añadir a la videoteca" - if itemlist and item.extra != "library": - title = "%s [Buscar trailer]" % (item.contentTitle) - itemlist.insert(0, item.clone(channel="trailertools", action="buscartrailer", - text_color=color3, title=title, viewmode="list")) - - if config.get_videolibrary_support(): - itemlist.append(Item(channel=item.channel, title="Añadir película a la videoteca", - action="add_pelicula_to_library", url=item.url, text_color="green", - contentTitle=item.contentTitle, extra="library", thumbnail=thumbnail_host)) - return itemlist - -def play(item): - logger.info() - itemlist = [] - ddd = httptools.downloadpage(item.url).data - url = "http://olimpo.link" + scrapertools.find_single_match(ddd, '