Merge remote-tracking branch 'alfa-addon/master' into explora

This commit is contained in:
unknown
2018-07-20 20:54:28 -03:00
15 changed files with 283 additions and 27 deletions

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.alfa" name="Alfa" version="2.5.26" provider-name="Alfa Addon">
<addon id="plugin.video.alfa" name="Alfa" version="2.5.28" provider-name="Alfa Addon">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
<import addon="script.module.libtorrent" optional="true"/>

View File

@@ -8,7 +8,7 @@
"banner": "",
"version": 1,
"categories": [
"movies"
"movie"
],
"settings": [
{

View File

@@ -8,7 +8,7 @@
"banner": "",
"version": 1,
"categories": [
"movies"
"movie"
],
"settings": [
{

View File

@@ -8,7 +8,7 @@
"banner": "",
"version": 1,
"categories": [
"movies"
"movie"
],
"settings": [
{

View File

@@ -810,19 +810,19 @@ def episodios(item):
# Carga la página
try:
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
data_alt = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
except: #Algún error de proceso, salimos
logger.error("ERROR 01: EPISODIOS: La Web no responde o la URL es erronea" + item.url)
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
return itemlist
#Datos para crear el Post. Usado para documentales
total_capis = scrapertools.find_single_match(data, "<input type='hidden' name='total_capis' value='(\d+)'>")
tabla = scrapertools.find_single_match(data, "<input type='hidden' name='tabla' value='([^']+)'>")
titulo_post = scrapertools.find_single_match(data, "<input type='hidden' name='titulo' value='([^']+)'>")
total_capis = scrapertools.find_single_match(data_alt, "<input type='hidden' name='total_capis' value='(\d+)'>")
tabla = scrapertools.find_single_match(data_alt, "<input type='hidden' name='tabla' value='([^']+)'>")
titulo_post = scrapertools.find_single_match(data_alt, "<input type='hidden' name='titulo' value='([^']+)'>")
# Selecciona en tramo que nos interesa
data = scrapertools.find_single_match(data,
data = scrapertools.find_single_match(data_alt,
"(<form name='episodios' action='secciones.php\?sec=descargas\&ap=contar_varios' method='post'>.*?)</form>")
# Prepara el patrón de búsqueda de: URL, título, fechas y dos valores mas sin uso
@@ -836,9 +836,9 @@ def episodios(item):
matches = re.compile(patron, re.DOTALL).findall(data)
if not matches: #error
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
item = generictools.web_intervenida(item, data_alt) #Verificamos que no haya sido clausurada
if item.intervencion: #Sí ha sido clausurada judicialmente
item, itemlist = generictools.post_tmdb_findvideos(item, itemlist) #Llamamos al método para el pintado del error
item, itemlist = generictools.post_tmdb_episodios(item, itemlist) #Llamamos al método para el pintado del error
return itemlist #Salimos
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)

View File

@@ -529,10 +529,9 @@ def listado_busqueda(item):
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
cnt_next += 1
# busca series y Novedades
patron = '<tr.*?><a href="([^"]+)" style="[^>]+>([^<]+)<\/a>' #url
patron += '<span style="[^"]+">\(([^>]+)\)<\/a><\/td>' #título
patron += '<td align="[^"]+" width="[^"]+">([^>]+)<\/td><\/tr>' #calidad y tipo de contenido
patron = '<a href="([^"]+)" style="[^>]+>([^<]+)<\/a>' #url y título
patron += '<span style="[^"]+">\(([^>]+)?\)<\/a><\/td>' #calidad
patron += '<td align="[^"]+" width="[^"]+">([^>]+)<\/td><\/tr>' #tipo de contenido
matches_alt = scrapertools.find_multiple_matches(data, patron)
i = 0
@@ -846,8 +845,7 @@ def findvideos(item):
def episodios(item):
logger.info()
itemlist = []
logger.debug(item)
# Obtener la información actualizada de la Serie. TMDB es imprescindible para Videoteca
if not item.infoLabels['tmdb_id']:
tmdb.set_infoLabels(item, True)

View File

@@ -11,7 +11,6 @@
"tvshow",
"anime",
"torrent",
"latino",
"documentary",
"vos",
"direct"
@@ -117,7 +116,7 @@
"id": "clonenewpct1_excluir1_enlaces_veronline",
"type": "list",
"label": "Excluir Servidores para Ver Online",
"default": 9,
"default": 22,
"max_excl": 5,
"enabled": true,
"visible": "!eq(-3,'No')",

View File

@@ -9,7 +9,7 @@
"categories": [
"movie",
"direct",
"VOS"
"vos"
],
"settings":[
{

View File

@@ -119,6 +119,8 @@ def series(item):
# response = httptools.downloadpage(url, post, follow_redirects=False).data
# url = scrapertools.find_single_match(response, '<meta http-equiv="refresh".*?url=([^"]+)"')
data = httptools.downloadpage(item.url).data
pos = data.find('[')
if pos > 0: data = data[pos:]
lista = jsontools.load(data)
logger.debug(lista)
@@ -178,6 +180,8 @@ def episodios(item):
# url = scrapertools.find_single_match(response, '<meta http-equiv="refresh".*?url=([^"]+)"')
logger.debug(item)
data = httptools.downloadpage(item.url).data
pos = data.find('[')
if pos > 0: data = data[pos:]
data = jsontools.load(data)
@@ -248,6 +252,8 @@ def pelis(item):
# response = httptools.downloadpage(url, post, follow_redirects=False).data
# url = scrapertools.find_single_match(response, '<meta http-equiv="refresh".*?url=([^"]+)"')
data = httptools.downloadpage(item.url).data
pos = data.find('[')
if pos > 0: data = data[pos:]
lista = jsontools.load(data)
if item.extra == "next":

View File

@@ -7,7 +7,7 @@
"thumbnail": "https://s32.postimg.cc/gh8lhbkb9/seodiv.png",
"banner": "https://s31.postimg.cc/klwjzp7t7/seodiv_banner.png",
"categories": [
"tvshows"
"tvshow"
],
"settings": [
{

View File

@@ -0,0 +1,244 @@
# -*- coding: utf-8 -*-
# -*- Channel VeSeriesOnline -*-
# -*- 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
list_language = ['Lat', 'Cast', 'VOSE', 'VO']
list_quality = []
list_servers = ['openload', 'netutv', 'streamango', 'streamix', 'powvideo', 'gamovideo']
host = 'http://www.veseriesonline.com/'
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 + 'archivos/h1/',
))
itemlist.append(Item(channel=item.channel,
title="Buscar",
action="search",
url=host+'?s=',
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|&nbsp;|<br>|\s{2,}', "", data)
return data
def list_all(item):
logger.info()
itemlist = []
data = get_source(item.url)
patron = "<article class=movie>.*?href=(.*?) class.*?src=(.*?) style.*?<h2>(.*?)</h2>"
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedthumbnail, scrapedtitle in matches:
episode = ''
url = scrapedurl
thumbnail = scrapedthumbnail
if 'Temporada' in scrapedtitle:
episode = scrapertools.find_single_match(scrapedtitle, '.*?Temporada (\d+x\d+)')
scrapedtitle = scrapertools.find_single_match(scrapedtitle, '(.*?) Temporada')
scrapedtitle = scrapedtitle.replace(' Online','')
contentSerieName = scrapedtitle
if episode != '':
title = '%s - %s' % (scrapedtitle, episode)
else:
title = scrapedtitle
itemlist.append(Item(channel=item.channel,
action='seasons',
title=title,
url=url,
thumbnail=thumbnail,
contentTitle=scrapedtitle,
context=filtertools.context(item, list_language, list_quality),
contentSerieName=contentSerieName,
))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
if itemlist != []:
next_page = scrapertools.find_single_match(data ,"<a href='([^']+)' class='pagination__link'>&rsaquo;</a>")
if next_page != '':
itemlist.append(Item(channel=item.channel,
action="list_all",
title='Siguiente >>>',
url=next_page,
thumbnail='https://s16.postimg.cc/9okdu7hhx/siguiente.png',
))
return itemlist
def search(item, texto):
logger.info()
texto = texto.replace(" ", "+")
item.url = item.url + texto
if texto != '':
return list_all(item)
def seasons(item):
logger.info()
itemlist = []
data = get_source(item.url)
patron = 'itemprop=season.*?<a href=(.*?) rel=bookmark.*?src=(.*?)>.*?;>(.*?)<'
matches = re.compile(patron, re.DOTALL).findall(data)
if len(matches) == 0:
patron = '<article class=movie>.*?href=(.*?) class.*?src=(.*?) style.*?title=.*?(Temporada \d+) alt'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedthumb, scrapedtitle in matches:
infoLabels = item.infoLabels
infoLabels['season'] = scrapertools.find_single_match(scrapedtitle, 'Temporada (\d+)')
itemlist.append(Item(channel=item.channel, title=scrapedtitle, url=scrapedurl, action='episodesxseason',
thumbnail=scrapedthumb, infoLabels=infoLabels))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
itemlist = itemlist [::-1]
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,
extra1='library'))
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)
patron = '<li class=series-cat><a target=_blank href=(.*?) class.*?'
patron += 'title=.*?;(\d+).*?<span>(.*?)</span><span class=flags(.*?)</a></li>'
matches = re.compile(patron, re.DOTALL).findall(data)
infoLabels = item.infoLabels
for scrapedurl, scrapedepi, scrapedtitle, lang_data in matches:
language = []
if 'lang-lat>' in lang_data:
language.append('Lat')
if 'lang-spa>' in lang_data:
language.append('Cast')
if 'lang-engsub>' in lang_data:
language.append('VOSE')
if 'lang-eng>' in lang_data:
language.append('VO')
title = '%sx%s - %s %s' % (infoLabels['season'], scrapedepi, scrapedtitle, language)
infoLabels['episode'] = scrapedepi
itemlist.append(Item(channel=item.channel, title=title, url=scrapedurl, action='findvideos', language=language,
infoLabels=infoLabels))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
itemlist = filtertools.get_links(itemlist, item, list_language)
return itemlist
def findvideos(item):
logger.info()
itemlist = []
data = get_source(item.url)
video_id = scrapertools.find_single_match(data, 'getEnlaces\((\d+)\)')
links_url = '%s%s%s' % (host,'/link/repro.php/',video_id)
online_url = '%s%s%s' % (host, '/link/enlaces_online.php/', video_id)
# listado de opciones links_url
data = get_source(links_url)
patron = 'content ><h2>(.*?)</h2>.*?class=video.*?src=(.*?) scrolling'
matches = re.compile(patron, re.DOTALL).findall(data)
for lang_data, scrapedurl in matches:
if 'Latino' in lang_data:
language = 'Lat'
elif 'Español' in lang_data:
language = 'Cast'
else:
language = 'VOSE'
hidden_url = scrapedurl.replace('/i/', '/r/')
data = get_source(hidden_url)
url = scrapertools.find_single_match(data, ':url content=(.*?)>')
title = '%s '+ '[%s]' % language
if url != '':
itemlist.append(Item(channel=item.channel, title=title, url=url, action='play', language=language,
infoLabels=item.infoLabels))
# listado de enlaces online_url
data = get_source(online_url)
patron = '<i class=lang-(.*?)>.*?href=(.*?) '
matches = re.compile(patron, re.DOTALL).findall(data)
scrapertools.printMatches(matches)
for lang_data, scrapedurl in matches:
if 'lat' in lang_data:
language = 'Lat'
elif 'spa' in lang_data:
language = 'Cast'
elif 'eng' in lang_data:
language = 'VOSE'
else:
language = 'VO'
video_id = scrapertools.find_single_match(scrapedurl, 'index.php/(\d+)/')
new_url = '%s%s%s%s' % (host, 'ext/index-include.php?id=', video_id, '&tipo=1')
data = get_source(new_url)
video_url = scrapertools.find_single_match(data, '<div class=container><a href=(.*?)>')
video_url = video_url.replace('enlace.php', 'r')
data = httptools.downloadpage(video_url, follow_redirects=False)
url = data.headers['location']
title = '%s '+ '[%s]' % language
if url != '':
itemlist.append(Item(channel=item.channel, title=title, url=url, action='play', language=language,
infoLabels=item.infoLabels))
itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize())
# Requerido para FilterTools
itemlist = filtertools.get_links(itemlist, item, list_language)
# Requerido para AutoPlay
autoplay.start(itemlist, item)
return sorted(itemlist, key=lambda it: it.language)

Binary file not shown.

View File

@@ -417,6 +417,8 @@ def post_tmdb_episodios(item, itemlist):
del item.url_alt
if item.title_from_channel:
del item.title_from_channel
if item.ow_force:
del item.ow_force
for item_local in itemlist: #Recorremos el Itemlist generado por el canal
if item_local.add_videolibrary:
@@ -443,6 +445,8 @@ def post_tmdb_episodios(item, itemlist):
del item_local.channel_host
if item_local.intervencion:
del item_local.intervencion
if item_local.ow_force:
del item_local.ow_force
#logger.debug(item_local)
#Ajustamos el nombre de la categoría si es un clone de NewPct1
@@ -1036,10 +1040,10 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, overwrite=False, path=F
- ow_force: indicador para la acción de "videolibrary_service.py". Puede crear la variable item.ow_force:
- force: indica al canal que analize toda la serie y que videolibrary_service la reescriba
- auto: indica a videolibrary_service que la reescriba
- no: no acción especial para videolibrary_service
- no: no acción para videolibrary_service, solo redirige en visionado de videolibrary
ejemplo: ('1', 'mejortorrent', 'mejortorrent1', 'http://www.mejortorrent.com/', 'https://mejortorrent1.com/', 'auto')
La llamada recibe el parámetro Item, el .nfoy los devuleve actualizados, así como opcionalmente el parámetro "overwrite· que puede forzar la reescritura de todos los archivos de la serie
La llamada recibe el parámetro Item, el .nfo y los devuleve actualizados, así como opcionalmente el parámetro "overwrite· que puede forzar la reescritura de todos los archivos de la serie, y el parámetro "path" si viene de videolibrary_service
"""
if not it:
@@ -1078,12 +1082,15 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, overwrite=False, path=F
if item.contentType == "list": #Si viene de Videolibrary, le cambiamos ya el canal
if item.channel != channel_py:
item.channel = canal_des #Cambiamos el canal. Si es clone, lo hace el canal
if item.contentType not in content_inc:
continue #Salimos sin hacer nada más. item está casi vacío
if item.contentType not in content_inc and "*" not in content_inc: #Está el contenido el la lista de incluidos
continue
if item.contentType in content_exc: #Es esta nuestra entrada?
if item.contentType in content_exc: #Está el contenido excluido?
continue
if channel_enabled and canal_org != canal_des: #Si el canal está activo, puede ser solo...
continue #... una intervención que afecte solo a una región
if ow_force == 'no' and path != False: #Queremos que el canal solo visualice sin migración?
continue #Salimos sin tocas archivos
item.url = item.url.replace(url_org, url_des) #reemplzamos una parte de url
if patron1: #Hay expresión regex?
url = scrapertools.find_single_match(item.url, patron1) #La aplicamos a url
@@ -1117,6 +1124,7 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, overwrite=False, path=F
if ow_force in ['force', 'auto']: #Sobreescribir la series?
overwrite = ow_force_param #Sí, lo marcamos
if item.contentType in ['tvshow', 'season'] and it.library_urls:
if path == False:
TVSHOWS_PATH = item.path

View File

@@ -393,6 +393,7 @@ def verify_directories_created():
# Buscamos el archivo addon.xml del skin activo
skindir = filetools.join(xbmc.translatePath("special://home"), 'addons', xbmc.getSkinDir(),
'addon.xml')
if not os.path.isdir(skindir): return # No hace falta mostrar error en el log si no existe la carpeta
# Extraemos el nombre de la carpeta de resolución por defecto
folder = ""
data = filetools.read(skindir)

View File

@@ -2,7 +2,7 @@
import xbmcgui
from core.tmdb import Tmdb
from platformcode import logger
from platformcode import config, logger
ID_BUTTON_CLOSE = 10003
ID_BUTTON_PREVIOUS = 10025
@@ -217,7 +217,7 @@ class InfoWindow(xbmcgui.WindowXMLDialog):
self.getControl(10009).setLabel(self.result.get("language", "N/A"))
self.getControl(100010).setLabel(config.get_localized_string(60380))
self.getControl(100011).setLabel(self.result.get("puntuacion", "N/A"))
self.getControl(100012).setLabel(config.get_localized_string(60382)
self.getControl(100012).setLabel(config.get_localized_string(60382))
self.getControl(100013).setLabel(self.result.get("genre", "N/A"))
if self.result.get("season"):