Merge remote-tracking branch 'origin/master'

This commit is contained in:
Intel1
2018-09-19 08:17:36 -05:00
35 changed files with 2275 additions and 368 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.7.3" provider-name="Alfa Addon">
<addon id="plugin.video.alfa" name="Alfa" version="2.7.4" provider-name="Alfa Addon">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
<import addon="script.module.libtorrent" optional="true"/>
@@ -19,17 +19,17 @@
</assets>
<news>[B]Estos son los cambios para esta versión:[/B]
[COLOR green][B]Canales agregados y arreglos[/B][/COLOR]
¤ allcalidad ¤ cinecalidad
¤ repelis ¤ cumlouder
¤ porntrex ¤ crunchyroll
¤ pedropolis ¤ pepecine
¤ repelis ¤ thevid
¤ vevio ¤ danimados
¤ sipeliculas ¤ cinecalidad
¤ locopelis ¤ pelisipad
¤ divxtotal ¤ elitetorrent
¤ estrenosgo ¤ grantorrent
¤ mejortorrent1 ¤ newpct1
¤ danimados ¤ fanpelis
¤ repelis
¤ tvvip ¤ zonatorrent
¤ maxipelis24 ¤ wikiseries
¤ arreglos internos
¤ Agradecimientos a @angedam, @chivmalev, @alaquepasa por colaborar en ésta versión
¤ Agradecimientos a @angedam y @chivmalev por colaborar en ésta versión
</news>
<description lang="es">Navega con Kodi por páginas web para ver sus videos de manera fácil.</description>

View File

@@ -161,6 +161,7 @@ def findvideos(item):
itemlist.extend(servertools.find_video_items(data=data))
for videoitem in itemlist:
videoitem.channel = item.channel
videoitem.title = '[%s]' % videoitem.server.capitalize()
return itemlist

View File

@@ -324,7 +324,7 @@ def findvideos(item):
url = server_url[server_id] + video_id + '.html'
elif server_id == 'BitTorrent':
import urllib
base_url = '%sprotect/v.php' % host
base_url = '%s/protect/v.php' % host
post = {'i':video_id, 'title':item.title}
post = urllib.urlencode(post)
headers = {'Referer':item.url}

View File

@@ -519,17 +519,35 @@ def findvideos(item):
item, itemlist = generictools.post_tmdb_findvideos(item, itemlist)
#Ahora tratamos los enlaces .torrent
for scrapedurl in matches: #leemos los torrents con la diferentes calidades
for scrapedurl in matches: #leemos los torrents con la diferentes calidades
#Generamos una copia de Item para trabajar sobre ella
item_local = item.clone()
#Buscamos si ya tiene tamaño, si no, los buscamos en el archivo .torrent
size = scrapertools.find_single_match(item_local.quality, '\s\[(\d+,?\d*?\s\w\s?[b|B])\]')
if not size:
size = generictools.get_torrent_size(item_local.url) #Buscamos el tamaño en el .torrent
if size:
item_local.title = re.sub(r'\s\[\d+,?\d*?\s\w[b|B]\]', '', item_local.title) #Quitamos size de título, si lo traía
item_local.title = '%s [%s]' % (item_local.title, size) #Agregamos size al final del título
size = size.replace('GB', 'G B').replace('Gb', 'G b').replace('MB', 'M B').replace('Mb', 'M b')
item_local.quality = re.sub(r'\s\[\d+,?\d*?\s\w\s?[b|B]\]', '', item_local.quality) #Quitamos size de calidad, si lo traía
item_local.quality = '%s [%s]' % (item_local.quality, size) #Agregamos size al final de la calidad
#Ahora pintamos el link del Torrent
item_local.url = scrapedurl
if host not in item_local.url and host.replace('https', 'http') not in item_local.url :
item_local.url = host + item_local.url
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title) #Quitamos etiquetas vacías
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language))
#Preparamos título y calidad, quitamos etiquetas vacías
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title)
item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title)
item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.quality)
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.quality)
item_local.quality = item_local.quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.alive = "??" #Calidad del link sin verificar
item_local.action = "play" #Visualizar vídeo
item_local.server = "torrent" #Seridor Torrent

View File

@@ -171,8 +171,11 @@ def listado(item):
#Limpiamos el título de la basura innecesaria
title = title.replace("Dual", "").replace("dual", "").replace("Subtitulada", "").replace("subtitulada", "").replace("Subt", "").replace("subt", "").replace("Sub", "").replace("sub", "").replace("(Proper)", "").replace("(proper)", "").replace("Proper", "").replace("proper", "").replace("#", "").replace("(Latino)", "").replace("Latino", "")
title = title.replace("- HDRip", "").replace("(HDRip)", "").replace("- Hdrip", "").replace("(microHD)", "").replace("(DVDRip)", "").replace("(HDRip)", "").replace("(BR-LINE)", "").replace("(HDTS-SCREENER)", "").replace("(BDRip)", "").replace("(BR-Screener)", "").replace("(DVDScreener)", "").replace("TS-Screener", "").replace(" TS", "").replace(" Ts", "")
title = title.replace("- HDRip", "").replace("(HDRip)", "").replace("- Hdrip", "").replace("(microHD)", "").replace("(DVDRip)", "").replace("(HDRip)", "").replace("(BR-LINE)", "").replace("(HDTS-SCREENER)", "").replace("(BDRip)", "").replace("(BR-Screener)", "").replace("(DVDScreener)", "").replace("TS-Screener", "").replace(" TS", "").replace(" Ts", "").replace("temporada", "").replace("Temporada", "").replace("capitulo", "").replace("Capitulo", "")
title = re.sub(r'(?:\d+)?x.?\s?\d+', '', title)
title = re.sub(r'\??\s?\d*?\&.*', '', title).title().strip()
item_local.from_title = title #Guardamos esta etiqueta para posible desambiguación de título
if item_local.extra == "peliculas": #preparamos Item para películas
@@ -190,16 +193,17 @@ def listado(item):
item_local.contentType = "episode"
item_local.extra = "series"
epi_mult = scrapertools.find_single_match(item_local.url, r'cap.*?-\d+-al-(\d+)')
item_local.contentSeason = scrapertools.find_single_match(item_local.url, r'temp.*?-(\d+)')
item_local.contentSeason = scrapertools.find_single_match(item_local.url, r'temporada-(\d+)')
item_local.contentEpisodeNumber = scrapertools.find_single_match(item_local.url, r'cap.*?-(\d+)')
if not item_local.contentSeason:
item_local.contentSeason = scrapertools.find_single_match(item_local.url, r'-(\d+)[x|X]\d+')
if not item_local.contentEpisodeNumber:
item_local.contentEpisodeNumber = scrapertools.find_single_match(item_local.url, r'-\d+[x|X](\d+)')
if item_local.contentSeason < 1:
item_local.contentSeason = 1
if not item_local.contentSeason or item_local.contentSeason < 1:
item_local.contentSeason = 0
if item_local.contentEpisodeNumber < 1:
item_local.contentEpisodeNumber = 1
item_local.contentSerieName = title
if epi_mult:
title = "%sx%s al %s -" % (item_local.contentSeason, str(item_local.contentEpisodeNumber).zfill(2), str(epi_mult).zfill(2)) #Creamos un título con el rango de episodios
@@ -269,11 +273,11 @@ def findvideos(item):
#data = unicode(data, "utf-8", errors="replace")
#Añadimos el tamaño para todos
size = scrapertools.find_single_match(item.quality, '\s\[(\d+,?\d*?\s\w[b|B]s)\]')
size = scrapertools.find_single_match(item.quality, '\s\[(\d+,?\d*?\s\w\s?[b|B]s)\]')
if size:
item.title = re.sub('\s\[\d+,?\d*?\s\w[b|B]s\]', '', item.title) #Quitamos size de título, si lo traía
item.title = '%s [%s]' % (item.title, size) #Agregamos size al final del título
item.quality = re.sub('\s\[\d+,?\d*?\s\w[b|B]s\]', '', item.quality) #Quitamos size de calidad, si lo traía
item.quality = re.sub('\s\[\d+,?\d*?\s\w\s?[b|B]s\]', '', item.quality) #Quitamos size de calidad, si lo traía
patron_t = '<div class="enlace_descarga".*?<a href="(.*?\.torrent)"'
link_torrent = scrapertools.find_single_match(data, patron_t)
@@ -299,9 +303,11 @@ def findvideos(item):
#Llamamos al método para crear el título general del vídeo, con toda la información obtenida de TMDB
item, itemlist = generictools.post_tmdb_findvideos(item, itemlist)
if not size:
size = generictools.get_torrent_size(link_torrent) #Buscamos el tamaño en el .torrent
if size:
item.quality = '%s [%s]' % (item.quality, size) #Agregamos size al final de calidad
item.quality = item.quality.replace("G", "G ").replace("M", "M ") #Se evita la palabra reservada en Unify
item.quality = item.quality.replace("GB", "G B").replace("MB", "M B") #Se evita la palabra reservada en Unify
#Generamos una copia de Item para trabajar sobre ella
item_local = item.clone()
@@ -313,8 +319,15 @@ def findvideos(item):
item_local.quality += "[Torrent]"
item_local.url = link_torrent
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title) #Quitamos etiquetas vacías
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
#Preparamos título y calidad, quitamos etiquetas vacías
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title)
item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title)
item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.quality)
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.quality)
item_local.quality = item_local.quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.alive = "??" #Calidad del link sin verificar
item_local.action = "play" #Visualizar vídeo
item_local.server = "torrent" #Seridor Torrent

View File

@@ -682,7 +682,7 @@ def findvideos(item):
#Ahora tratamos los enlaces .torrent
itemlist_alt = [] #Usamos una lista intermedia para poder ordenar los episodios
if matches_torrent:
for scrapedurl, scrapedquality, scrapedlang in matches_torrent: #leemos los torrents con la diferentes calidades
for scrapedurl, scrapedquality, scrapedlang in matches_torrent: #leemos los torrents con la diferentes calidades
#Generamos una copia de Item para trabajar sobre ella
item_local = item.clone()
@@ -756,9 +756,19 @@ def findvideos(item):
#Ahora pintamos el link del Torrent
item_local.url = host + scrapedtorrent
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (quality, str(item_local.language)) #Preparamos título de Torrent
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title) #Quitamos etiquetas vacías
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
size = generictools.get_torrent_size(item_local.url) #Buscamos el tamaño en el .torrent
if size:
quality += ' [%s]' % size
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (quality, str(item_local.language))
#Preparamos título y calidad, quitamos etiquetas vacías
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title)
item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title)
item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', quality)
quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', quality)
quality = quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.alive = "??" #Calidad del link sin verificar
item_local.action = "play" #Visualizar vídeo
item_local.server = "torrent" #Seridor Torrent
@@ -896,8 +906,15 @@ def findvideos(item):
#Ahora pintamos el link Directo
item_local.url = enlace
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title) #Quitamos etiquetas vacías
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
#Preparamos título y calidad, quitamos etiquetas vacías
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title)
item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title)
item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', quality)
quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', quality)
quality = quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.action = "play" #Visualizar vídeo
item_local.server = servidor #Seridor Directo

View File

@@ -474,14 +474,17 @@ def findvideos(item):
#Añadimos la duración, que estará en item.quility
if scrapertools.find_single_match(item.quality, '(\[\d+:\d+)') and not scrapertools.find_single_match(item_local.quality, '(\[\d+:\d+)'):
item_local.quality = '%s [/COLOR][COLOR white][%s h]' % (item_local.quality, scrapertools.find_single_match(item.quality, '(\d+:\d+)'))
#if size and item_local.contentType != "episode":
if not size:
size = generictools.get_torrent_size(scrapedurl) #Buscamos el tamaño en el .torrent
if size:
size = size.replace(".", ",").replace("B,", " B").replace("b,", " b")
if '[/COLOR][COLOR white]' in item_local.quality:
item_local.quality = '%s [%s]' % (item_local.quality, size)
else:
item_local.quality = '%s [/COLOR][COLOR white][%s]' % (item_local.quality, size)
if item_local.action == 'show_result': #Viene de una búsqueda global
if item_local.action == 'show_result': #Viene de una búsqueda global
channel = item_local.channel.capitalize()
if item_local.from_channel:
channel = item_local.from_channel.capitalize()
@@ -491,8 +494,15 @@ def findvideos(item):
if scrapedurl:
item_local.url = scrapedurl
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title).strip() #Quitamos etiquetas vacías
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title).strip() #Quitamos colores vacíos
#Preparamos título y calidad, quitamos etiquetas vacías
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title)
item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title)
item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.quality)
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.quality)
item_local.quality = item_local.quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.alive = "??" #Calidad del link sin verificar
item_local.action = "play" #Visualizar vídeo
item_local.server = "torrent" #Seridor Torrent

2
plugin.video.alfa/channels/locopelis.py Executable file → Normal file
View File

@@ -355,7 +355,7 @@ def findvideos(item):
new_url = get_link(get_source(item.url))
new_url = get_link(get_source(new_url))
video_id = scrapertools.find_single_match(new_url, 'http.*?h=(\w+)')
new_url = '%s%s' % (host, 'playeropstream/api.php')
new_url = '%s%s' % (host.replace('.com','.tv'), 'playeropstream/api.php')
post = {'h': video_id}
post = urllib.urlencode(post)
data = httptools.downloadpage(new_url, post=post).data

View File

@@ -0,0 +1,12 @@
{
"id": "maxipelis24",
"name": "Maxipelis24",
"active": true,
"adult": false,
"language": ["lat"],
"thumbnail": "maxipelis24.png",
"banner": "",
"categories": [
"movie"
]
}

View File

@@ -0,0 +1,125 @@
# -*- coding: utf-8 -*-
import re
import urlparse
import urllib
from core import servertools
from core import httptools
from core import scrapertools
from core.item import Item
from platformcode import config, logger
from channelselector import get_thumb
host="http://maxipelis24.com"
def mainlist(item):
logger.info()
itemlist = []
itemlist.append(Item(channel=item.channel, title="peliculas", action="movies", url=host, thumbnail=get_thumb('movies', auto=True)))
itemlist.append(Item(channel=item.channel, action="category", title="Año de Estreno", url=host, cat='year', thumbnail=get_thumb('year', auto=True)))
itemlist.append(Item(channel=item.channel, action="category", title="Géneros", url=host, cat='genre', thumbnail=get_thumb('genres', auto=True)))
itemlist.append(Item(channel=item.channel, action="category", title="Calidad", url=host, cat='quality', thumbnail=get_thumb("quality", auto=True)))
itemlist.append(Item(channel=item.channel, title="Buscar", action="search", url=host+"?s=", thumbnail=get_thumb("search", auto=True)))
return itemlist
def search(item, texto):
logger.info()
texto = texto.replace(" ", "+")
item.url = host + "?s=" + texto
if texto != '':
return movies(item)
def category(item):
logger.info()
itemlist = []
data = httptools.downloadpage(item.url).data
data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;","", data)
if item.cat == 'genre':
data = scrapertools.find_single_match(data, '<h3>Géneros.*?</div>')
patron = '<a href="([^"]+)">([^<]+)<'
elif item.cat == 'year':
data = scrapertools.find_single_match(data, '<h3>Año de estreno.*?</div>')
patron = 'li><a href="([^"]+)">([^<]+).*?<'
elif item.cat == 'quality':
data = scrapertools.find_single_match(data, '<h3>Calidad.*?</div>')
patron = 'li><a href="([^"]+)">([^<]+)<'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl , scrapedtitle in matches:
itemlist.append(Item(channel=item.channel, action='movies', title=scrapedtitle, url=scrapedurl, type='cat', first=0))
return itemlist
def movies(item):
logger.info()
itemlist = []
data = httptools.downloadpage(item.url).data
data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;","", data)
patron = '<div id="mt.+?href="([^"]+)".+?'
patron += '<img src="([^"]+)" alt="([^"]+)".+?'
patron += '<span class="imdb">.*?>([^<]+)<.*?'
patron += '<span class="ttx">([^<]+).*?'
patron += 'class="year">([^<]+).+?class="calidad2">([^<]+)<'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, img, scrapedtitle, ranking, resto, year, quality in matches:
plot = scrapertools.htmlclean(resto).strip()
title = '%s [COLOR yellow](%s)[/COLOR] [COLOR red][%s][/COLOR]'% (scrapedtitle, ranking, quality)
itemlist.append(Item(channel=item.channel,
title=title,
url=scrapedurl,
action="findvideos",
plot=plot,
thumbnail=img,
contentTitle = scrapedtitle,
contentType = "movie",
quality=quality))
#Paginacion
next_page = '<div class="pag_.*?href="([^"]+)">Siguiente<'
matches = re.compile(next_page, re.DOTALL).findall(data)
if matches:
url = urlparse.urljoin(item.url, matches[0])
itemlist.append(Item(channel=item.channel, action = "movies", title = "Página siguiente >>",url = url))
return itemlist
def findvideos(item):
logger.info()
itemlist=[]
data = httptools.downloadpage(item.url).data
data = scrapertools.get_match(data, '<div id="contenedor">(.*?)</div></div></div>')
# Busca los enlaces a los videos
listavideos = servertools.findvideos(data)
for video in listavideos:
videotitle = scrapertools.unescape(video[0])
url = video[1]
server = video[2]
itemlist.append(Item(channel=item.channel, action="play", server=server, title=videotitle, url=url,
thumbnail=item.thumbnail, plot=item.plot, fulltitle=item.title, folder=False))
# Opción "Añadir esta película a la biblioteca de KODI"
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,
thumbnail=item.thumbnail
))
return itemlist

View File

@@ -845,18 +845,21 @@ def findvideos(item):
# Poner la calidad, si es necesario
if not item_local.quality:
item_local.quality = ''
if scrapertools.find_single_match(data, '<b>Formato:<\/b>&\w+;\s?([^<]+)<br>'):
item_local.quality = scrapertools.find_single_match(data, '<b>Formato:<\/b>&\w+;\s?([^<]+)<br>')
elif "hdtv" in item_local.url.lower() or "720p" in item_local.url.lower() or "1080p" in item_local.url.lower() or "4k" in item_local.url.lower():
item_local.quality = scrapertools.find_single_match(item_local.url, '.*?_([H|7|1|4].*?)\.torrent')
item_local.quality = item_local.quality.replace("_", " ")
# Extrae el tamaño del vídeo
if scrapertools.find_single_match(data, '<b>Tama.*?:<\/b>&\w+;\s?([^<]+B)<?'):
size = scrapertools.find_single_match(data, '<b>Tama.*?:<\/b>&\w+;\s?([^<]+B)<?')
else:
size = scrapertools.find_single_match(item_local.url, '(\d{1,3},\d{1,2}?\w+)\.torrent')
size = size.upper().replace(".", ",").replace("G", " G ").replace("M", " M ") #sustituimos . por , porque Unify lo borra
if not size:
size = generictools.get_torrent_size(item_local.url) #Buscamos el tamaño en el .torrent
if size:
item_local.title = re.sub('\s\[\d+,?\d*?\s\w[b|B]\]', '', item_local.title) #Quitamos size de título, si lo traía
item_local.title = '%s [%s]' % (item_local.title, size) #Agregamos size al final del título
@@ -866,8 +869,15 @@ def findvideos(item):
#Ahora pintamos el link del Torrent, si lo hay
if item_local.url: # Hay Torrent ?
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title) #Quitamos etiquetas vacías
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
#Preparamos título y calidad, quitamos etiquetas vacías
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title)
item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title)
item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.quality)
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.quality)
item_local.quality = item_local.quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.alive = "??" #Calidad del link sin verificar
item_local.action = "play" #Visualizar vídeo
item_local.server = "torrent" #Seridor Torrent

View File

@@ -1368,12 +1368,14 @@ def findvideos(item):
size = scrapertools.find_single_match(data, '<div class="fichas-box"><div class="entry-right"><div style="[^"]+"><span class="[^"]+"><strong>Size:<\/strong>?\s(\d+?\.?\d*?\s\w[b|B])<\/span>')
size = size.replace(".", ",") #sustituimos . por , porque Unify lo borra
if not size:
size = scrapertools.find_single_match(item.quality, '\s\[(\d+,?\d*?\s\w[b|B])\]')
size = scrapertools.find_single_match(item.quality, '\s\[(\d+,?\d*?\s\w\s?[b|B])\]')
if not size:
size = generictools.get_torrent_size(item.url) #Buscamos el tamaño en el .torrent
if size:
item.title = re.sub(r'\s\[\d+,?\d*?\s\w[b|B]\]', '', item.title) #Quitamos size de título, si lo traía
item.title = '%s [%s]' % (item.title, size) #Agregamos size al final del título
size = size.replace('GB', 'G B').replace('Gb', 'G b').replace('MB', 'M B').replace('Mb', 'M b')
item.quality = re.sub(r'\s\[\d+,?\d*?\s\w[b|B]\]', '', item.quality) #Quitamos size de calidad, si lo traía
item.quality = re.sub(r'\s\[\d+,?\d*?\s\w\s?[b|B]\]', '', item.quality) #Quitamos size de calidad, si lo traía
#Llamamos al método para crear el título general del vídeo, con toda la información obtenida de TMDB
item, itemlist = generictools.post_tmdb_findvideos(item, itemlist)
@@ -1399,8 +1401,15 @@ def findvideos(item):
else:
quality = item_local.quality
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (quality, str(item_local.language)) #Preparamos título de Torrent
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title).strip() #Quitamos etiquetas vacías
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title).strip() #Quitamos colores vacíos
#Preparamos título y calidad, quitamos etiquetas vacías
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title)
item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title)
item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', quality)
quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', quality)
quality = quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.alive = "??" #Calidad del link sin verificar
item_local.action = "play" #Visualizar vídeo
item_local.server = "torrent" #Servidor
@@ -1485,9 +1494,15 @@ def findvideos(item):
item_local.action = "play"
item_local.server = servidor
item_local.url = enlace
item_local.title = item_local.title.replace("[]", "").strip()
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title).strip()
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title).strip()
#Preparamos título y calidad, quitamos etiquetas vacías
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title)
item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title)
item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.quality)
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.quality)
item_local.quality = item_local.quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
itemlist.append(item_local.clone())
except:
@@ -1582,9 +1597,16 @@ def findvideos(item):
item_local.action = "play"
item_local.server = servidor
item_local.url = enlace
item_local.title = parte_title.replace("[]", "").strip()
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title).strip()
item_local.title = re.sub(r'\[COLOR \w+\]-\[\/COLOR\]', '', item_local.title).strip()
item_local.title = parte_title.strip()
#Preparamos título y calidad, quitamos etiquetas vacías
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title)
item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title)
item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.quality)
item_local.quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.quality)
item_local.quality = item_local.quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
itemlist.append(item_local.clone())
except:

View File

@@ -89,6 +89,7 @@ def search(item, texto):
logger.info()
texto = texto.replace(" ", "+")
item.url = host + "/search/%s" % texto
if item.contentType == '': item.contentType = 'movie'
try:
return scraper(item)
# Se captura la excepción, para no interrumpir al buscador global si un canal falla

2
plugin.video.alfa/channels/pelisipad.py Executable file → Normal file
View File

@@ -519,6 +519,7 @@ def findvideos(item):
if item.video_urls:
import random
import base64
item.video_urls.sort(key=lambda it: (it[1], random.random()), reverse=True)
i = 0
actual_quality = ""
@@ -534,6 +535,7 @@ def findvideos(item):
title += " [COLOR green]Mirror %s[/COLOR] - %s" % (str(i + 1), item.fulltitle)
url = vid % "%s" % base64.b64decode("dHQ9MTQ4MDE5MDQ1MSZtbT1NRzZkclhFand6QmVzbmxSMHNZYXhBJmJiPUUwb1dVVVgx"
"WTBCQTdhWENpeU9paUE=")
url += '|User-Agent=%s' % httptools.get_user_agent
itemlist.append(item.clone(title=title, action="play", url=url, video_urls=""))
i += 1

View File

@@ -356,7 +356,7 @@ def get_links_by_language(item, data):
patron = 'data-source=(.*?)data.*?srt=(.*?)data-iframe.*?Opci.*?<.*?hidden>[^\(]\((.*?)\)'
matches = re.compile(patron, re.DOTALL).findall(data)
if language in IDIOMAS:
language == IDIOMAS[language]
language = IDIOMAS[language]
for url, sub, quality in matches:
if 'http' not in url:
@@ -403,7 +403,7 @@ def findvideos(item):
i.quality) )
# Requerido para FilterTools
itemlist = filtertools.get_links(video_list, item, list_language)
video_list = filtertools.get_links(video_list, item, list_language)
# Requerido para AutoPlay

View File

@@ -143,6 +143,85 @@ def settings(item):
def setting_channel(item):
if config.get_platform(True)['num_version'] >= 17.0: # A partir de Kodi 16 se puede usar multiselect, y de 17 con preselect
return setting_channel_new(item)
else:
return setting_channel_old(item)
def setting_channel_new(item):
import channelselector, xbmcgui
from core import channeltools
# Cargar lista de opciones (canales activos del usuario y que permitan búsqueda global)
# ------------------------
lista = []; ids = []; lista_lang = []
channels_list = channelselector.filterchannels('all')
for channel in channels_list:
channel_parameters = channeltools.get_channel_parameters(channel.channel)
# No incluir si en la configuracion del canal no existe "include_in_global_search"
if not channel_parameters['include_in_global_search']:
continue
lbl = '%s' % channel_parameters['language']
lbl += ' %s' % ', '.join(config.get_localized_category(categ) for categ in channel_parameters['categories'])
it = xbmcgui.ListItem(channel.title, lbl)
it.setArt({ 'thumb': channel.thumbnail, 'fanart': channel.fanart })
lista.append(it)
ids.append(channel.channel)
lista_lang.append(channel_parameters['language'])
# Diálogo para pre-seleccionar
# ----------------------------
preselecciones_std = ['Modificar selección actual', 'Modificar partiendo de Todos', 'Modificar partiendo de Ninguno', 'Modificar partiendo de Castellano', 'Modificar partiendo de Latino']
if item.action == 'setting_channel':
# Configuración de los canales incluídos en la búsqueda
preselecciones = preselecciones_std
presel_values = [1, 2, 3, 4, 5]
else:
# Llamada desde "buscar en otros canales" (se puede saltar la selección e ir directo a la búsqueda)
preselecciones = ['Buscar con la selección actual'] + preselecciones_std
presel_values = [0, 1, 2, 3, 4, 5]
ret = platformtools.dialog_select(config.get_localized_string(59994), preselecciones)
if ret == -1: return False # pedido cancel
if presel_values[ret] == 0: return True # continuar sin modificar
elif presel_values[ret] == 3: preselect = []
elif presel_values[ret] == 2: preselect = range(len(ids))
elif presel_values[ret] in [4, 5]:
busca = 'cast' if presel_values[ret] == 4 else 'lat'
preselect = []
for i, lg in enumerate(lista_lang):
if busca in lg or '*' in lg:
preselect.append(i)
else:
preselect = []
for i, canal in enumerate(ids):
channel_status = config.get_setting('include_in_global_search', canal)
if channel_status:
preselect.append(i)
# Diálogo para seleccionar
# ------------------------
ret = xbmcgui.Dialog().multiselect(config.get_localized_string(59994), lista, preselect=preselect, useDetails=True)
if ret == None: return False # pedido cancel
seleccionados = [ids[i] for i in ret]
# Guardar cambios en canales para la búsqueda
# -------------------------------------------
for canal in ids:
channel_status = config.get_setting('include_in_global_search', canal)
if channel_status is None: channel_status = True
if channel_status and canal not in seleccionados:
config.set_setting('include_in_global_search', False, canal)
elif not channel_status and canal in seleccionados:
config.set_setting('include_in_global_search', True, canal)
return True
def setting_channel_old(item):
channels_path = os.path.join(config.get_runtime_path(), "channels", '*.json')
channel_language = config.get_setting("channel_language", default="all")
@@ -204,6 +283,7 @@ def save_settings(item, dict_values):
config.set_setting("include_in_global_search", dict_values[v], v)
progreso.close()
return True
def cb_custom_button(item, dict_values):
@@ -354,8 +434,8 @@ def do_search(item, categories=None):
categories = ["Películas"]
setting_item = Item(channel=item.channel, title=config.get_localized_string(59994), folder=False,
thumbnail=get_thumb("search.png"))
setting_channel(setting_item)
if not setting_channel(setting_item):
return False
if categories is None:
categories = []
@@ -474,8 +554,8 @@ def do_search(item, categories=None):
# es compatible tanto con versiones antiguas de python como nuevas
if multithread:
pendent = [a for a in threads if a.isAlive()]
t = float(100) / len(pendent)
while pendent:
if len(pendent) > 0: t = float(100) / len(pendent)
while len(pendent) > 0:
index = (len(threads) - len(pendent)) + 1
percentage = int(math.ceil(index * t))

View File

@@ -620,7 +620,7 @@ def play(item):
data['a']['tt']) + \
"&mm=" + data['a']['mm'] + "&bb=" + data['a']['bb']
url += "|User-Agent=Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Mobile Safari/537.36"
url += "|User-Agent=%s" % httptools.get_user_agent
itemlist.append(item.clone(action="play", server="directo", url=url, folder=False))

14
plugin.video.alfa/channels/ultrapeliculashd.json Executable file → Normal file
View File

@@ -19,6 +19,20 @@
"enabled": true,
"visible": true
},
{
"id": "filter_languages",
"type": "list",
"label": "Mostrar enlaces en idioma...",
"default": 0,
"enabled": true,
"visible": true,
"lvalues": [
"No filtrar",
"LAT",
"CAST",
"VOSE"
]
},
{
"id": "include_in_newest_latino",
"type": "bool",

View File

@@ -8,6 +8,7 @@ from core import servertools
from core import jsontools
from core import tmdb
from core.item import Item
from channels import filtertools, autoplay
from platformcode import config, logger
host = 'http://www.ultrapeliculashd.com'
@@ -63,39 +64,51 @@ tcalidad = {'1080P': 'https://s21.postimg.cc/4h1s0t1wn/hd1080.png',
'720P': 'https://s12.postimg.cc/lthu7v4q5/hd720.png', "HD": "https://s27.postimg.cc/m2dhhkrur/image.png"}
IDIOMAS = {'Latino': 'LAT', 'Español': 'CAST', 'SUB':'VOSE'}
list_language = IDIOMAS.values()
list_quality = ['default', '1080p']
list_servers = ['openload','directo']
__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'ultrapeliculashd')
__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'ultrapeliculashd')
def mainlist(item):
logger.info()
autoplay.init(item.channel, list_servers, list_quality)
itemlist = []
itemlist.append(item.clone(title="Todas",
action="lista",
thumbnail='https://s18.postimg.cc/fwvaeo6qh/todas.png',
fanart='https://s18.postimg.cc/fwvaeo6qh/todas.png',
url=host + '/movies/'
))
itemlist.append(Item(channel=item.channel, title="Todas",
action="lista",
thumbnail='https://s18.postimg.cc/fwvaeo6qh/todas.png',
fanart='https://s18.postimg.cc/fwvaeo6qh/todas.png',
url=host + '/movies/'
))
itemlist.append(item.clone(title="Generos",
action="generos",
url=host,
thumbnail='https://s3.postimg.cc/5s9jg2wtf/generos.png',
fanart='https://s3.postimg.cc/5s9jg2wtf/generos.png'
))
itemlist.append(Item(channel=item.channel, title="Generos",
action="generos",
url=host,
thumbnail='https://s3.postimg.cc/5s9jg2wtf/generos.png',
fanart='https://s3.postimg.cc/5s9jg2wtf/generos.png'
))
itemlist.append(item.clone(title="Alfabetico",
action="seccion",
url=host,
thumbnail='https://s17.postimg.cc/fwi1y99en/a-z.png',
fanart='https://s17.postimg.cc/fwi1y99en/a-z.png',
extra='alfabetico'
))
itemlist.append(Item(channel=item.channel, title="Alfabetico",
action="seccion",
url=host,
thumbnail='https://s17.postimg.cc/fwi1y99en/a-z.png',
fanart='https://s17.postimg.cc/fwi1y99en/a-z.png',
extra='alfabetico'
))
itemlist.append(item.clone(title="Buscar",
action="search",
url=host + '/?s=',
thumbnail='https://s30.postimg.cc/pei7txpa9/buscar.png',
fanart='https://s30.postimg.cc/pei7txpa9/buscar.png'
))
itemlist.append(Item(channel=item.channel, title="Buscar",
action="search",
url=host + '/?s=',
thumbnail='https://s30.postimg.cc/pei7txpa9/buscar.png',
fanart='https://s30.postimg.cc/pei7txpa9/buscar.png'
))
autoplay.show_option(item.channel, itemlist)
return itemlist
@@ -160,13 +173,13 @@ def generos(item):
title = scrapedtitle
url = scrapedurl
if scrapedtitle not in ['PRÓXIMAMENTE', 'EN CINE']:
itemlist.append(item.clone(action="lista",
title=title,
fulltitle=item.title,
url=url,
thumbnail=thumbnail,
fanart=fanart
))
itemlist.append(Item(channel=item.channel, action="lista",
title=title,
fulltitle=item.title,
url=url,
thumbnail=thumbnail,
fanart=fanart
))
return itemlist
@@ -209,15 +222,33 @@ def alpha(item):
def findvideos(item):
from lib import jsunpack
logger.info()
itemlist = []
data = httptools.downloadpage(item.url).data
data = re.sub(r'"|\n|\r|\t|&nbsp;|<br>|\s{2,}', "", data)
patron = '<iframe.*?rptss src=(.*?) (?:width.*?|frameborder.*?) allowfullscreen><\/iframe>'
patron = '<div id=(option.*?) class=play.*?<iframe.*?'
patron += 'rptss src=(.*?) (?:width.*?|frameborder.*?) allowfullscreen><\/iframe>'
matches = re.compile(patron, re.DOTALL).findall(data)
for video_url in matches:
if 'stream' in video_url and 'streamango' not in video_url:
for option, video_url in matches:
language = scrapertools.find_single_match(data, '#%s>.*?-->(.*?)(?:\s|<)' % option)
if 'sub' in language.lower():
language = 'SUB'
language = IDIOMAS[language]
if 'ultrapeliculashd' in video_url:
new_data = httptools.downloadpage(video_url).data
new_data = re.sub(r'"|\n|\r|\t|&nbsp;|<br>|\s{2,}', "", new_data)
if 'drive' not in video_url:
quality= '1080p'
packed = scrapertools.find_single_match(new_data, '<script>(eval\(.*?)eval')
unpacked = jsunpack.unpack(packed)
url = scrapertools.find_single_match(unpacked, 'file:(http.?:.*?)\}')
else:
quality= '1080p'
url = scrapertools.find_single_match(new_data, '</div><iframe src=([^\s]+) webkitallowfullscreen')
elif 'stream' in video_url and 'streamango' not in video_url:
data = httptools.downloadpage('https:'+video_url).data
if not 'iframe' in video_url:
new_url=scrapertools.find_single_match(data, 'iframe src="(.*?)"')
@@ -233,26 +264,42 @@ def findvideos(item):
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, subtitle=sub, server='directo'))
new_item = (Item(title=item.title, url=url, quality=quality, subtitle=sub, server='directo',
language = language))
itemlist.append(new_item)
else:
itemlist.extend(servertools.find_video_items(data=video_url))
url = video_url
quality = 'default'
for videoitem in itemlist:
videoitem.channel = item.channel
videoitem.action = 'play'
videoitem.thumbnail = item.thumbnail
videoitem.infoLabels = item.infoLabels
videoitem.title = item.contentTitle + ' (' + videoitem.server + ')'
if 'youtube' in videoitem.url:
videoitem.title = '[COLOR orange]Trailer en Youtube[/COLOR]'
if not config.get_setting("unify"):
title = ' [%s] [%s]' % (quality, language)
else:
title = ''
itemlist = servertools.get_servers_itemlist(itemlist)
new_item = (Item(channel=item.channel, title='%s'+title, url=url, action='play', quality=quality,
language=language, infoLabels=item.infoLabels))
itemlist.append(new_item)
itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize())
if __comprueba_enlaces__:
itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__)
# Requerido para FilterTools
itemlist = filtertools.get_links(itemlist, item, list_language)
# Requerido para AutoPlay
autoplay.start(itemlist, item)
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 itemlist

View File

@@ -221,7 +221,7 @@ def findvideos(item):
language = ''
if 'latino' in link.lower():
language='Latino'
elif 'español' in link.lower():
elif 'espaÑol' in link.lower():
language = 'Español'
elif 'subtitulado' in link.lower():
language = 'VOSE'

View File

@@ -5,28 +5,59 @@
"adult": false,
"language": ["cast", "lat"],
"banner": "",
"thumbnail": "https://zonatorrent.org/wp-content/uploads/2017/04/zonatorrent-New-Logo.png",
"thumbnail": "zonatorrent.png",
"version": 1,
"categories": [
"torrent",
"movie"
"torrent",
"movie",
"tvshow",
"vos"
],
"settings": [
{
"id": "include_in_global_search",
"type": "bool",
"label": "Incluir en busqueda global",
"default": true,
"enabled": true,
"visible": true
},
{
"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": true,
"enabled": true,
"visible": true
},
{
"id": "modo_grafico",
"type": "bool",
"label": "Buscar información extra",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "timeout_downloadpage",
"type": "list",
"label": "Timeout (segs.) en descarga de páginas o verificación de servidores",
"default": 5,
"enabled": true,
"visible": true,
"lvalues": [
"None",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10"
]
},
{
"id": "seleccionar_ult_temporadda_activa",
"type": "bool",
"label": "Seleccionar para Videoteca si estará activa solo la última Temporada",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "include_in_newest_peliculas",

File diff suppressed because it is too large Load Diff

View File

@@ -24,9 +24,9 @@ def getmainlist(view="thumb_"):
thumbnail=get_thumb("channels.png", view), view=view,
category=config.get_localized_string(30119), viewmode="thumbnails"))
itemlist.append(Item(title='Mis enlaces', channel="alfavorites", action="mainlist",
thumbnail=get_thumb("favorites.png", view), view=view,
category='Mis enlaces', viewmode="thumbnails"))
itemlist.append(Item(title=config.get_localized_string(70527), channel="alfavorites", action="mainlist",
thumbnail=get_thumb("mylink.png", view), view=view,
category=config.get_localized_string(70527), viewmode="thumbnails"))
itemlist.append(Item(title=config.get_localized_string(30103), channel="search", action="mainlist",
thumbnail=get_thumb("search.png", view),
@@ -197,7 +197,7 @@ def filterchannels(category, view="thumb_"):
thumbnail=channel_parameters["thumbnail"], type="generic", viewmode="list"))
if category in ['movie', 'tvshow']:
titles = [config.get_localized_string(70028), config.get_localized_string(30985), config.get_localized_string(70527), config.get_localized_string(60264), config.get_localized_string(70528)]
titles = [config.get_localized_string(70028), config.get_localized_string(30985), config.get_localized_string(70559), config.get_localized_string(60264), config.get_localized_string(70560)]
ids = ['popular', 'top_rated', 'now_playing', 'on_the_air']
for x in range(0,3):
if x == 2 and category != 'movie':
@@ -267,4 +267,4 @@ def set_channel_info(parameters):
content = config.get_localized_category(cat)
info = '[COLOR yellow]Tipo de contenido:[/COLOR] %s\n\n[COLOR yellow]Idiomas:[/COLOR] %s' % (content, language)
return info
return info

3
plugin.video.alfa/core/httptools.py Executable file → Normal file
View File

@@ -56,6 +56,9 @@ default_headers["Accept-Encoding"] = "gzip"
HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT = config.get_setting('httptools_timeout', default=15)
if HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT == 0: HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT = None
def get_user_agent():
# Devuelve el user agent global para ser utilizado cuando es necesario para la url.
return default_headers["User-Agent"]
def get_url_headers(url):
domain_cookies = cj._cookies.get("." + urlparse.urlparse(url)[1], {}).get("/", {})

View File

@@ -319,7 +319,7 @@ def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda='es', lock=None):
__leer_datos(otmdb_global)
if lock:
if lock and lock.locked():
lock.release()
if item.infoLabels['episode']:

View File

@@ -8,6 +8,7 @@
# ------------------------------------------------------------
import re
import os
import sys
import urllib
import urlparse
@@ -236,8 +237,7 @@ def post_tmdb_listado(item, itemlist):
del item.channel_alt
if item.url_alt:
del item.url_alt
if item.extra2:
del item.extra2
#Ajustamos el nombre de la categoría
if not item.category_new:
item.category_new = ''
@@ -389,8 +389,8 @@ def post_tmdb_listado(item, itemlist):
if item_local.infoLabels['episodio_titulo']:
item_local.infoLabels['episodio_titulo'] = item_local.infoLabels['episodio_titulo'].replace(" []", "").strip()
title = title.replace("--", "").replace(" []", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip()
title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', title).strip()
title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', title).strip()
title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', title).strip()
title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', title).strip()
if item.category_new == "newest": #Viene de Novedades. Marcamos el título con el nombre del canal
title += ' -%s-' % scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
@@ -766,6 +766,7 @@ def post_tmdb_episodios(item, itemlist):
#Si no está el título del episodio, pero sí está en "title", lo rescatamos
if not item_local.infoLabels['episodio_titulo'] and item_local.infoLabels['title'].lower() != item_local.infoLabels['tvshowtitle'].lower():
item_local.infoLabels['episodio_titulo'] = item_local.infoLabels['title']
item_local.infoLabels['episodio_titulo'] = item_local.infoLabels['episodio_titulo'].replace('GB', 'G B').replace('MB', 'M B')
#Preparamos el título para que sea compatible con Añadir Serie a Videoteca
if "Temporada" in item_local.title: #Compatibilizamos "Temporada" con Unify
@@ -792,8 +793,8 @@ def post_tmdb_episodios(item, itemlist):
item_local.infoLabels['episodio_titulo'] = item_local.infoLabels['episodio_titulo'].replace(" []", "").strip()
item_local.infoLabels['title'] = item_local.infoLabels['title'].replace(" []", "").strip()
item_local.title = item_local.title.replace(" []", "").strip()
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title).strip()
item_local.title = re.sub(r'\s\[COLOR \w+\]-\[\/COLOR\]', '', item_local.title).strip()
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?-?\s?\]?\]\[\/COLOR\]', '', item_local.title).strip()
item_local.title = re.sub(r'\s?\[COLOR \w+\]-?\s?\[\/COLOR\]', '', item_local.title).strip()
#Si la información de num. total de episodios de TMDB no es correcta, tratamos de calcularla
if num_episodios < item_local.contentEpisodeNumber:
@@ -1054,8 +1055,8 @@ def post_tmdb_findvideos(item, itemlist):
title_gen = item.title
#Limpiamos etiquetas vacías
title_gen = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', title_gen).strip() #Quitamos etiquetas vacías
title_gen = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', title_gen).strip() #Quitamos colores vacíos
title_gen = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', title_gen).strip() #Quitamos etiquetas vacías
title_gen = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', title_gen).strip() #Quitamos colores vacíos
title_gen = title_gen.replace(" []", "").strip() #Quitamos etiquetas vacías
title_videoteca = title_gen #Salvamos el título para Videoteca
@@ -1103,7 +1104,131 @@ def post_tmdb_findvideos(item, itemlist):
return (item, itemlist)
def get_torrent_size(url):
logger.info()
"""
Módulo extraido del antiguo canal ZenTorrent
Calcula el tamaño de los archivos que contienen un .torrent. Descarga el archivo .torrent en una carpeta,
lo lee y descodifica. Si contiene múltiples archivos, suma el tamaño de todos ellos
Llamada: generictools.get_torrent_size(url)
Entrada: url: url del archivo .torrent
Salida: size: str con el tamaño y tipo de medida ( MB, GB, etc)
"""
def convert_size(size):
import math
if (size == 0):
return '0B'
size_name = ("B", "KB", "M B", "G B", "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 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 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
#Móludo principal
size = ""
try:
torrents_path = config.get_videolibrary_path() + '/torrents' #path para dejar el .torrent
if not os.path.exists(torrents_path):
os.mkdir(torrents_path) #si no está la carpeta la creamos
urllib.URLopener.version = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0'
urllib.urlretrieve(url, torrents_path + "/generictools.torrent") #desacargamos el .torrent a la carpeta
torrent_file = open(torrents_path + "/generictools.torrent", "rb").read() #leemos el .torrent
if "used CloudFlare" in torrent_file: #Si tiene CloudFlare, usamos este proceso
try:
urllib.urlretrieve("http://anonymouse.org/cgi-bin/anon-www.cgi/" + url.strip(),
torrents_path + "/generictools.torrent")
torrent_file = open(torrents_path + "/generictools.torrent", "rb").read()
except:
torrent_file = ""
torrent = decode(torrent_file) #decodificamos el .torrent
#si sólo tiene un archivo, tomamos la longitud y la convertimos a una unidad legible, si no dará error
try:
sizet = torrent["info"]['length']
size = convert_size(sizet)
except:
pass
#si tiene múltiples archivos sumamos la longitud de todos
if not size:
check_video = scrapertools.find_multiple_matches(str(torrent["info"]["files"]), "'length': (\d+)}")
sizet = sum([int(i) for i in check_video])
size = convert_size(sizet)
except:
logger.error('ERROR al buscar el tamaño de un .Torrent: ' + url)
try:
os.remove(torrents_path + "/generictools.torrent") #borramos el .torrent
except:
pass
#logger.debug(url + ' / ' + size)
return size
def get_field_from_kodi_DB(item, from_fields='*', files='file'):
logger.info()
"""

View File

@@ -516,7 +516,7 @@ def set_context_commands(item, parent_item):
from_action=item.action).tourl())))
# Añadir a Alfavoritos (Mis enlaces)
if item.channel not in ["favorites", "videolibrary", "help", ""] and parent_item.channel != "favorites":
context_commands.append(('[COLOR blue]Guardar enlace[/COLOR]', "XBMC.RunPlugin(%s?%s)" %
context_commands.append(('[COLOR blue]%s[/COLOR]' % config.get_localized_string(70557), "XBMC.RunPlugin(%s?%s)" %
(sys.argv[0], item.clone(channel="alfavorites", action="addFavourite",
from_channel=item.channel,
from_action=item.action).tourl())))
@@ -538,7 +538,7 @@ def set_context_commands(item, parent_item):
mediatype = 'tv'
else:
mediatype = item.contentType
context_commands.append(("[COLOR yellow]Buscar Similares[/COLOR]", "XBMC.Container.Update (%s?%s)" % (
context_commands.append(("[COLOR yellow]%s[/COLOR]" % config.get_localized_string(70561), "XBMC.Container.Update (%s?%s)" % (
sys.argv[0], item.clone(channel='search', action='discover_list', search_type='list', page='1',
list_type='%s/%s/similar' % (mediatype,item.infoLabels['tmdb_id'])).tourl())))
@@ -1044,6 +1044,8 @@ def torrent_client_installed(show_tuple=False):
def play_torrent(item, xlistitem, mediaurl):
logger.info()
import time
# Opciones disponibles para Reproducir torrents
torrent_options = list()
torrent_options.append(["Cliente interno (necesario libtorrent)"])
@@ -1066,28 +1068,32 @@ def play_torrent(item, xlistitem, mediaurl):
# Plugins externos
if seleccion > 1:
#### Compatibilidad con Kodi 18: evita cuelgues/cancelaciones cuando el .torrent se lanza desde pantalla convencional
if xbmc.getCondVisibility('Window.IsMedia'):
xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, xlistitem) #Preparamos el entorno para evutar error Kod1 18
time.sleep(1) #Dejamos que se ejecute
mediaurl = urllib.quote_plus(item.url)
if ("quasar" in torrent_options[seleccion][1] or "elementum" in torrent_options[seleccion][1]) and item.infoLabels['tmdb_id']: #Llamada con más parámetros para completar el título
if item.contentType == 'episode' and "elementum" not in torrent_options[seleccion][1]:
mediaurl += "&episode=%s&library=&season=%s&show=%s&tmdb=%s&type=episode" % (item.infoLabels['episode'], item.infoLabels['season'], item.infoLabels['tmdb_id'], item.infoLabels['tmdb_id'])
elif item.contentType == 'movie':
mediaurl += "&library=&tmdb=%s&type=movie" % (item.infoLabels['tmdb_id'])
xbmc.executebuiltin("PlayMedia(" + torrent_options[seleccion][1] % mediaurl + ")")
if "quasar" in torrent_options[seleccion][1] or "elementum" in torrent_options[seleccion][1]: #Seleccionamos que clientes torrent soportamos
if item.strm_path: #Sólo si es de Videoteca
import time
time_limit = time.time() + 150 #Marcamos el timepo máx. de buffering
while not is_playing() and time.time() < time_limit: #Esperamos mientra buffera
time.sleep(5) #Repetimos cada intervalo
#logger.debug(str(time_limit))
if is_playing(): #Ha terminado de bufferar o ha cancelado
from platformcode import xbmc_videolibrary
xbmc_videolibrary.mark_auto_as_watched(item) #Marcamos como visto al terminar
#logger.debug("Llamado el marcado")
#else:
#logger.debug("Video cancelado o timeout")
xbmc.executebuiltin("PlayMedia(" + torrent_options[seleccion][1] % mediaurl + ")")
#Seleccionamos que clientes torrent soportamos para el marcado de vídeos vistos
if "quasar" in torrent_options[seleccion][1] or "elementum" in torrent_options[seleccion][1]:
time_limit = time.time() + 150 #Marcamos el timepo máx. de buffering
while not is_playing() and time.time() < time_limit: #Esperamos mientra buffera
time.sleep(5) #Repetimos cada intervalo
#logger.debug(str(time_limit))
if item.strm_path and is_playing(): #Sólo si es de Videoteca
from platformcode import xbmc_videolibrary
xbmc_videolibrary.mark_auto_as_watched(item) #Marcamos como visto al terminar
#logger.debug("Llamado el marcado")
if seleccion == 1:
from platformcode import mct

View File

@@ -1734,7 +1734,7 @@ msgid "[COLOR %s]Filter configuration for TV series...[/COLOR]"
msgstr ""
msgctxt "#60430"
msgid "FILTRO: Delete '%s'"
msgid "FILTER: Delete '%s'"
msgstr ""
msgctxt "#60431"
@@ -4804,14 +4804,142 @@ msgid "Verification of counters of videos seen / not seen (uncheck to verify)"
msgstr ""
msgctxt "#70527"
msgid "Now in Theatres "
msgid "My links"
msgstr ""
msgctxt "#70528"
msgid "Movies by Genre"
msgid "Default folder"
msgstr ""
msgctxt "#70529"
msgid "tv show"
msgid "Repeated link"
msgstr ""
msgctxt "#70530"
msgid "You already have this link in the folder"
msgstr ""
msgctxt "#70531"
msgid "Saved link"
msgstr ""
msgctxt "#70532"
msgid "Folder: %s"
msgstr ""
msgctxt "#70533"
msgid "Rename folder"
msgstr ""
msgctxt "#70534"
msgid "Delete folder"
msgstr ""
msgctxt "#70535"
msgid "Move up all"
msgstr ""
msgctxt "#70536"
msgid "Move up"
msgstr ""
msgctxt "#70537"
msgid "Move down"
msgstr ""
msgctxt "#70538"
msgid "Move down all"
msgstr ""
msgctxt "#70539"
msgid "* Create different folders to store your favorite links within Icarus. [CR]"
msgstr ""
msgctxt "#70540"
msgid "* To add links to folders, access the context menu from any point in Icarus.[CR]"
msgstr ""
msgctxt "#70541"
msgid "* The links can be channels, sections within the channels, searches, and even movies and series although for the latter it is preferable to use the video library."
msgstr ""
msgctxt "#70542"
msgid "Create new folder ..."
msgstr "Creaa nuova cartella ..."
msgctxt "#70543"
msgid "Move to another folder"
msgstr ""
msgctxt "#70544"
msgid "Change title"
msgstr ""
msgctxt "#70545"
msgid "Change color"
msgstr ""
msgctxt "#70546"
msgid "Save link in:"
msgstr ""
msgctxt "#70547"
msgid "Change thumbnail"
msgstr ""
msgctxt "#70548"
msgid "Delete link"
msgstr ""
msgctxt "#70549"
msgid "Select folder"
msgstr ""
msgctxt "#70550"
msgid "Create new folder"
msgstr ""
msgctxt "#70551"
msgid "Folder name"
msgstr ""
msgctxt "#70552"
msgid "Delete the folder and links it contains?"
msgstr ""
msgctxt "#70553"
msgid "Change link title"
msgstr ""
msgctxt "#70554"
msgid "Select thumbnail:"
msgstr ""
msgctxt "#70555"
msgid "Move link to:"
msgstr ""
msgctxt "#70556"
msgid "%d links in folder"
msgstr ""
msgctxt "#70557"
msgid "Save link"
msgstr ""
msgctxt "#70558"
msgid "Select color:"
msgstr ""
msgctxt "#70559"
msgid "Now in Theatres "
msgstr ""
msgctxt "#70560"
msgid "Movies by Genre"
msgstr "
msgctxt "#70561"
msgid "Search Similar
msgstr ""

View File

@@ -4792,14 +4792,143 @@ msgid "Verification of counters of videos seen / not seen (uncheck to verify)"
msgstr "Verifica dei contatori di video visti/non visti (deselezionare per verificare)"
msgctxt "#70527"
msgid "My links"
msgstr "I Miei Link"
msgctxt "#70528"
msgid "Default folder"
msgstr "Cartella di Default"
msgctxt "#70529"
msgid "Repeated link"
msgstr "Link ripetuto"
msgctxt "#70530"
msgid "You already have this link in the folder"
msgstr "C'è già un link nella cartella"
msgctxt "#70531"
msgid "Saved link"
msgstr "Link salvato"
msgctxt "#70532"
msgid "Folder: %s"
msgstr "Cartella: %s"
msgctxt "#70533"
msgid "Rename folder"
msgstr "Cambia nome alla cartella"
msgctxt "#70534"
msgid "Delete folder"
msgstr "Elimina la cartella"
msgctxt "#70535"
msgid "Move up all"
msgstr "Sposta tutto in alto"
msgctxt "#70536"
msgid "Move up"
msgstr "Sposta in su"
msgctxt "#70537"
msgid "Move down"
msgstr "Sposta in giù"
msgctxt "#70538"
msgid "Move down all"
msgstr "Sposta tutto in basso"
msgctxt "#70539"
msgid "* Create different folders to store your favorite links within Icarus. [CR]"
msgstr "* Crea diverse cartelle per memorizzare i tuoi collegamenti preferiti all'interno di Icarus."
msgctxt "#70540"
msgid "* To add links to folders, access the context menu from any point in Icarus.[CR]"
msgstr "* Per aggiungere collegamenti alle cartelle accedi al menu contestuale da qualsiasi punto di Icarus."
msgctxt "#70541"
msgid "* The links can be channels, sections within the channels, searches, and even movies and series although for the latter it is preferable to use the video library."
msgstr "* I collegamenti possono essere canali, sezioni all'interno dei canali, ricerche e persino film e serie, sebbene per quest'ultimo sia preferibile utilizzare la videoteca."
msgctxt "#70542"
msgid "Create new folder ..."
msgstr "Crea nuova cartella ..."
msgctxt "#70543"
msgid "Move to another folder"
msgstr "Sposta in altra cartella"
msgctxt "#70544"
msgid "Change title"
msgstr "Cambia titolo"
msgctxt "#70545"
msgid "Change color"
msgstr "Cambia colore"
msgctxt "#70546"
msgid "Save link in:"
msgstr "Salva link in:"
msgctxt "#70547"
msgid "Change thumbnail"
msgstr "Cambia thumbnail"
msgctxt "#70548"
msgid "Delete link"
msgstr "Elimina link"
msgctxt "#70549"
msgid "Select folder"
msgstr "Seleziona cartella"
msgctxt "#70550"
msgid "Create new folder"
msgstr "Crea nuova cartella"
msgctxt "#70551"
msgid "Folder name"
msgstr "Nome della cartella"
msgctxt "#70552"
msgid "Delete the folder and links it contains?"
msgstr "Eliminare la cartella con tutti i link?"
msgctxt "#70553"
msgid "Change link title"
msgstr "Cambia titolo del link"
msgctxt "#70554"
msgid "Select thumbnail:"
msgstr "Seleziona thumbnail:"
msgctxt "#70555"
msgid "Move link to:"
msgstr "Sposta link in:"
msgctxt "#70556"
msgid "%d links in folder"
msgstr "%d link nella cartella"
msgctxt "#70557"
msgid "Save link"
msgstr "Salva link"
msgctxt "#70558"
msgid "Select color:"
msgstr "Seleziona colore:"
msgctxt "#70559"
msgid "Now in Theatres "
msgstr "Oggi in Sala"
msgctxt "#70528"
msgctxt "#70560"
msgid "Movies by Genre"
msgstr "Per genere"
msgctxt "#70529"
msgid "tv show"
msgstr "serie"
msgctxt "#70561"
msgid "Search Similar
msgstr "Cerca Simili"

View File

@@ -1734,7 +1734,7 @@ msgid "[COLOR %s]Filter configuration for TV series...[/COLOR]"
msgstr "[COLOR %s]Configurar filtro para series...[/COLOR]"
msgctxt "#60430"
msgid "FILTRO: Delete '%s'"
msgid "FILTER: Delete '%s'"
msgstr "FILTRO: Borrar '%s'"
msgctxt "#60431"
@@ -4792,13 +4792,150 @@ msgid "Verification of counters of videos seen / not seen (uncheck to verify)"
msgstr "Verificación de los contadores de vídeos vistos/no vistos (desmarcar para verificar)"
msgctxt "#70527"
msgid "My links"
msgstr "Mis enlaces"
msgctxt "#70528"
msgid "Default folder"
msgstr "Carpeta por defecto"
msgctxt "#70529"
msgid "Repeated link"
msgstr "Enlace repetido"
msgctxt "#70530"
msgid "You already have this link in the folder"
msgstr "Ya tienes este enlace en la carpeta"
msgctxt "#70531"
msgid "Saved link"
msgstr "Guardado enlace"
msgctxt "#70532"
msgid "Folder: %s"
msgstr "Carpeta: %s"
msgctxt "#70533"
msgid "Rename folder"
msgstr "Cambiar nombre de la carpeta"
msgctxt "#70534"
msgid "Delete folder"
msgstr "Eliminar la carpeta"
msgctxt "#70535"
msgid "Move up all"
msgstr "Mover arriba del todo"
msgctxt "#70536"
msgid "Move up"
msgstr "Mover hacia arriba"
msgctxt "#70537"
msgid "Move down"
msgstr "Mover hacia abajo"
msgctxt "#70538"
msgid "Move down all"
msgstr "Mover abajo del todo"
msgctxt "#70539"
msgid "* Create different folders to store your favorite links within Icarus. [CR]"
msgstr "* Crea diferentes carpetas para guardar tus enlaces favoritos dentro de Icarus.[CR]]"
msgctxt "#70540"
msgid "* To add links to folders, access the context menu from any point in Icarus.[CR]"
msgstr "* Para añadir enlaces a las carpetas accede al menú contextual desde cualquier punto de Icarus.[CR]"
msgctxt "#70541"
msgid "* The links can be channels, sections within the channels, searches, and even movies and series although for the latter it is preferable to use the video library."
msgstr "* Los enlaces pueden ser canales, secciones dentro de los canales, búsquedas, e incluso películas y series aunque para esto último es preferible utilizar la videoteca."
msgctxt "#70542"
msgid "Create new folder ..."
msgstr "Crear nueva carpeta ..."
msgctxt "#70543"
msgid "Move to another folder"
msgstr "Mover a otra carpeta"
msgctxt "#70544"
msgid "Change title"
msgstr "Cambiar título"
msgctxt "#70545"
msgid "Change color"
msgstr "Cambiar color"
msgctxt "#70546"
msgid "Save link in:"
msgstr "Guardar enlace en:"
msgctxt "#70547"
msgid "Change thumbnail"
msgstr "Cambiar thumbnail"
msgctxt "#70548"
msgid "Delete link"
msgstr "Eliminar enlace"
msgctxt "#70549"
msgid "Select folder"
msgstr "Seleccionar carpeta"
msgctxt "#70550"
msgid "Create new folder"
msgstr "Crear nueva carpeta"
msgctxt "#70551"
msgid "Folder name"
msgstr "Nombre de la carpeta"
msgctxt "#70552"
msgid "Delete the folder and links it contains?"
msgstr "¿Borrar la carpeta y los enlaces que contiene?"
msgctxt "#70553"
msgid "Change link title"
msgstr "Cambiar título del enlace"
msgctxt "#70554"
msgid "Select thumbnail:"
msgstr "Seleccionar thumbnail:"
msgctxt "#70555"
msgid "Move link to:"
msgstr "Mover enlace a:"
msgctxt "#70556"
msgid "%d links in folder"
msgstr "%d enlaces en la carpeta"
msgctxt "#70557"
msgid "Save link"
msgstr "Guardar enlace"
msgctxt "#70558"
msgid "Select color:"
msgstr "Seleccionar color:"
msgctxt "#70559"
msgid "Now in Theatres "
msgstr "Ahora en cines"
msgctxt "#70528"
msgctxt "#70560"
msgid "Movies by Genre"
msgstr "Por generos"
msgctxt "#70529"
msgid "tv show"
msgstr "serie"
msgctxt "#70561"
msgid "Search Similar
msgstr "Buscar Similares"

View File

@@ -1734,7 +1734,7 @@ msgid "[COLOR %s]Filter configuration for TV series...[/COLOR]"
msgstr "[COLOR %s]Configurar filtro para series...[/COLOR]"
msgctxt "#60430"
msgid "FILTRO: Delete '%s'"
msgid "FILTER: Delete '%s'"
msgstr "FILTRO: Borrar '%s'"
msgctxt "#60431"
@@ -4792,13 +4792,150 @@ msgid "Verification of counters of videos seen / not seen (uncheck to verify)"
msgstr "Verificación de los contadores de vídeos vistos/no vistos (desmarcar para verificar)"
msgctxt "#70527"
msgid "My links"
msgstr "Mis enlaces"
msgctxt "#70528"
msgid "Default folder"
msgstr "Carpeta por defecto"
msgctxt "#70529"
msgid "Repeated link"
msgstr "Enlace repetido"
msgctxt "#70530"
msgid "You already have this link in the folder"
msgstr "Ya tienes este enlace en la carpeta"
msgctxt "#70531"
msgid "Saved link"
msgstr "Guardado enlace"
msgctxt "#70532"
msgid "Folder: %s"
msgstr "Carpeta: %s"
msgctxt "#70533"
msgid "Rename folder"
msgstr "Cambiar nombre de la carpeta"
msgctxt "#70534"
msgid "Delete folder"
msgstr "Eliminar la carpeta"
msgctxt "#70535"
msgid "Move up all"
msgstr "Mover arriba del todo"
msgctxt "#70536"
msgid "Move up"
msgstr "Mover hacia arriba"
msgctxt "#70537"
msgid "Move down"
msgstr "Mover hacia abajo"
msgctxt "#70538"
msgid "Move down all"
msgstr "Mover abajo del todo"
msgctxt "#70539"
msgid "* Create different folders to store your favorite links within Icarus. [CR]"
msgstr "* Crea diferentes carpetas para guardar tus enlaces favoritos dentro de Icarus.[CR]]"
msgctxt "#70540"
msgid "* To add links to folders, access the context menu from any point in Icarus.[CR]"
msgstr "* Para añadir enlaces a las carpetas accede al menú contextual desde cualquier punto de Icarus.[CR]"
msgctxt "#70541"
msgid "* The links can be channels, sections within the channels, searches, and even movies and series although for the latter it is preferable to use the video library."
msgstr "* Los enlaces pueden ser canales, secciones dentro de los canales, búsquedas, e incluso películas y series aunque para esto último es preferible utilizar la videoteca."
msgctxt "#70542"
msgid "Create new folder ..."
msgstr "Crear nueva carpeta ..."
msgctxt "#70543"
msgid "Move to another folder"
msgstr "Mover a otra carpeta"
msgctxt "#70544"
msgid "Change title"
msgstr "Cambiar título"
msgctxt "#70545"
msgid "Change color"
msgstr "Cambiar color"
msgctxt "#70546"
msgid "Save link in:"
msgstr "Guardar enlace en:"
msgctxt "#70547"
msgid "Change thumbnail"
msgstr "Cambiar thumbnail"
msgctxt "#70548"
msgid "Delete link"
msgstr "Eliminar enlace"
msgctxt "#70549"
msgid "Select folder"
msgstr "Seleccionar carpeta"
msgctxt "#70550"
msgid "Create new folder"
msgstr "Crear nueva carpeta"
msgctxt "#70551"
msgid "Folder name"
msgstr "Nombre de la carpeta"
msgctxt "#70552"
msgid "Delete the folder and links it contains?"
msgstr "¿Borrar la carpeta y los enlaces que contiene?"
msgctxt "#70553"
msgid "Change link title"
msgstr "Cambiar título del enlace"
msgctxt "#70554"
msgid "Select thumbnail:"
msgstr "Seleccionar thumbnail:"
msgctxt "#70555"
msgid "Move link to:"
msgstr "Mover enlace a:"
msgctxt "#70556"
msgid "%d links in folder"
msgstr "%d enlaces en la carpeta"
msgctxt "#70557"
msgid "Save link"
msgstr "Guardar enlace"
msgctxt "#70558"
msgid "Select color:"
msgstr "Seleccionar color:"
msgctxt "#70559"
msgid "Now in Theatres "
msgstr "Ahora en cines"
msgctxt "#70528"
msgctxt "#70560"
msgid "Movies by Genre"
msgstr "Por generos"
msgctxt "#70529"
msgid "tv show"
msgstr "serie"
msgctxt "#70561"
msgid "Search Similar
msgstr "Buscar Similares"

View File

@@ -1734,7 +1734,7 @@ msgid "[COLOR %s]Filter configuration for TV series...[/COLOR]"
msgstr "[COLOR %s]Configurar filtro para series...[/COLOR]"
msgctxt "#60430"
msgid "FILTRO: Delete '%s'"
msgid "FILTER: Delete '%s'"
msgstr "FILTRO: Borrar '%s'"
msgctxt "#60431"
@@ -4792,13 +4792,150 @@ msgid "Verification of counters of videos seen / not seen (uncheck to verify)"
msgstr "Verificación de los contadores de vídeos vistos/no vistos (desmarcar para verificar)"
msgctxt "#70527"
msgid "My links"
msgstr "Mis enlaces"
msgctxt "#70528"
msgid "Default folder"
msgstr "Carpeta por defecto"
msgctxt "#70529"
msgid "Repeated link"
msgstr "Enlace repetido"
msgctxt "#70530"
msgid "You already have this link in the folder"
msgstr "Ya tienes este enlace en la carpeta"
msgctxt "#70531"
msgid "Saved link"
msgstr "Guardado enlace"
msgctxt "#70532"
msgid "Folder: %s"
msgstr "Carpeta: %s"
msgctxt "#70533"
msgid "Rename folder"
msgstr "Cambiar nombre de la carpeta"
msgctxt "#70534"
msgid "Delete folder"
msgstr "Eliminar la carpeta"
msgctxt "#70535"
msgid "Move up all"
msgstr "Mover arriba del todo"
msgctxt "#70536"
msgid "Move up"
msgstr "Mover hacia arriba"
msgctxt "#70537"
msgid "Move down"
msgstr "Mover hacia abajo"
msgctxt "#70538"
msgid "Move down all"
msgstr "Mover abajo del todo"
msgctxt "#70539"
msgid "* Create different folders to store your favorite links within Icarus. [CR]"
msgstr "* Crea diferentes carpetas para guardar tus enlaces favoritos dentro de Icarus.[CR]]"
msgctxt "#70540"
msgid "* To add links to folders, access the context menu from any point in Icarus.[CR]"
msgstr "* Para añadir enlaces a las carpetas accede al menú contextual desde cualquier punto de Icarus.[CR]"
msgctxt "#70541"
msgid "* The links can be channels, sections within the channels, searches, and even movies and series although for the latter it is preferable to use the video library."
msgstr "* Los enlaces pueden ser canales, secciones dentro de los canales, búsquedas, e incluso películas y series aunque para esto último es preferible utilizar la videoteca."
msgctxt "#70542"
msgid "Create new folder ..."
msgstr "Crear nueva carpeta ..."
msgctxt "#70543"
msgid "Move to another folder"
msgstr "Mover a otra carpeta"
msgctxt "#70544"
msgid "Change title"
msgstr "Cambiar título"
msgctxt "#70545"
msgid "Change color"
msgstr "Cambiar color"
msgctxt "#70546"
msgid "Save link in:"
msgstr "Guardar enlace en:"
msgctxt "#70547"
msgid "Change thumbnail"
msgstr "Cambiar thumbnail"
msgctxt "#70548"
msgid "Delete link"
msgstr "Eliminar enlace"
msgctxt "#70549"
msgid "Select folder"
msgstr "Seleccionar carpeta"
msgctxt "#70550"
msgid "Create new folder"
msgstr "Crear nueva carpeta"
msgctxt "#70551"
msgid "Folder name"
msgstr "Nombre de la carpeta"
msgctxt "#70552"
msgid "Delete the folder and links it contains?"
msgstr "¿Borrar la carpeta y los enlaces que contiene?"
msgctxt "#70553"
msgid "Change link title"
msgstr "Cambiar título del enlace"
msgctxt "#70554"
msgid "Select thumbnail:"
msgstr "Seleccionar thumbnail:"
msgctxt "#70555"
msgid "Move link to:"
msgstr "Mover enlace a:"
msgctxt "#70556"
msgid "%d links in folder"
msgstr "%d enlaces en la carpeta"
msgctxt "#70557"
msgid "Save link"
msgstr "Guardar enlace"
msgctxt "#70558"
msgid "Select color:"
msgstr "Seleccionar color:"
msgctxt "#70559"
msgid "Now in Theatres "
msgstr "Ahora en cines"
msgctxt "#70528"
msgctxt "#70560"
msgid "Movies by Genre"
msgstr "Por generos"
msgctxt "#70529"
msgid "tv show"
msgstr "serie"
msgctxt "#70561"
msgid "Search Similar
msgstr "Buscar Similares"

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB