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

This commit is contained in:
unknown
2018-08-02 08:53:06 -03:00
42 changed files with 3934 additions and 452 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.6" provider-name="Alfa Addon">
<addon id="plugin.video.alfa" name="Alfa" version="2.6.1" provider-name="Alfa Addon">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
<import addon="script.module.libtorrent" optional="true"/>
@@ -19,10 +19,11 @@
</assets>
<news>[B]Estos son los cambios para esta versión:[/B]
[COLOR green][B]Canales agregados y arreglos[/B][/COLOR]
¤ goovie ¤ retroseriestv
¤ pelisr ¤ planetadocumental
¤ mejortorrent ¤ alltorrent
¤ veseriesonline ¤ seriesblanco
¤ dospelis ¤ goodpelis
¤ pelisr ¤ sonpelis
¤ jawcloud ¤ estream
¤ pelisplusco ¤ hdfull
¤ cinemahd
¤ arreglos internos

View File

@@ -1,7 +1,7 @@
{
"id": "alltorrent",
"name": "Alltorrent",
"active": true,
"active": false,
"adult": false,
"language": ["cast"],
"thumbnail": "altorrent.png",

View File

@@ -126,6 +126,7 @@ def listado(item):
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 = re.sub(r'\??\s?\d*?\&.*', '', title).title().strip()
item_local.from_title = title #Guardamos esta etiqueta para posible desambiguación de título
item_local.contentType = "movie"
item_local.contentTitle = title
@@ -139,8 +140,8 @@ def listado(item):
itemlist.append(item_local.clone()) #Pintar pantalla
if not item.category: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
#if not item.category: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
# return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
#Pasamos a TMDB la lista completa Itemlist
tmdb.set_infoLabels(itemlist, True)
@@ -264,7 +265,16 @@ def findvideos(item):
return itemlist
def actualizar_titulos(item):
logger.info()
item = generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
#Volvemos a la siguiente acción en el canal
return item
def search(item, texto):
logger.info()
texto = texto.replace(" ", "+")

View File

@@ -7,7 +7,8 @@
"thumbnail": "https://s21.postimg.cc/b43i3ljav/animeshd.png",
"banner": "https://s4.postimg.cc/lulxulmql/animeshd-banner.png",
"categories": [
"anime"
"anime",
"vos"
],
"settings": [
{

View File

@@ -3,10 +3,11 @@
"name": "AnimeYT",
"active": true,
"adult": false,
"language": "es",
"language": "cast, lat",
"thumbnail": "http://i.imgur.com/dHpupFk.png",
"categories": [
"anime"
"anime",
"vos"
],
"settings": [
{

View File

@@ -7,6 +7,7 @@
"thumbnail": "cinehindi.png",
"banner": "http://i.imgur.com/cau9TVe.png",
"categories": [
"movie"
"movie",
"vos"
]
}

View File

@@ -59,18 +59,22 @@ def list_all(item):
itemlist = []
data = get_source(item.url)
full_data = data
data = scrapertools.find_single_match(data, '<ul class=MovieList NoLmtxt.*?</ul>')
if item.section == 'alpha':
patron = '<span class=Num>\d+.*?<a href=(.*?) class.*?<img src=(.*?) alt=.*?<strong>(.*?)</strong>.*?'
patron += '<td>(\d{4})</td>'
matches = re.compile(patron, re.DOTALL).findall(full_data)
else:
patron = '<article id=post-.*?<a href=(.*?)>.*?<img src=(.*?) alt=.*?'
patron += '<h3 class=Title>(.*?)<\/h3>.*?<span class=Year>(.*?)<\/span>'
data = get_source(item.url)
matches = re.compile(patron, re.DOTALL).findall(data)
patron += '<h3 class=Title>(.*?)<\/h3>(?:</a>|<span class=Year>(.*?)<\/span>)'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedthumbnail, scrapedtitle, year in matches:
url = scrapedurl
if year == '':
year = '-'
if "|" in scrapedtitle:
scrapedtitle= scrapedtitle.split("|")
contentTitle = scrapedtitle[0].strip()
@@ -92,7 +96,7 @@ def list_all(item):
# Paginación
url_next_page = scrapertools.find_single_match(data,'<a class=next.*?href=(.*?)>')
url_next_page = scrapertools.find_single_match(full_data,'<a class=next.*?href=(.*?)>')
if url_next_page:
itemlist.append(item.clone(title="Siguiente >>", url=url_next_page, action='list_all'))
return itemlist
@@ -102,14 +106,13 @@ def section(item):
itemlist = []
data = get_source(host)
action = 'list_all'
if item.section == 'quality':
patron = 'menu-item-object-category.*?menu-item-\d+><a href=(.*?)>(.*?)<\/a>'
patron = 'menu-item-object-category.*?menu-item-\d+ menu-category-list><a href=(.*?)>(.*?)<\/a>'
elif item.section == 'genre':
patron = '<a href=(http:.*?) class=Button STPb>(.*?)</a>'
patron = '<a href=([^ ]+) class=Button STPb>(.*?)</a>'
elif item.section == 'year':
patron = 'custom menu-item-15\d+><a href=(.*?\?s.*?)>(\d{4})<\/a><\/li>'
patron = '<li><a href=([^>]+)>(\d{4})<\/a><\/li>'
elif item.section == 'alpha':
patron = '<li><a href=(.*?letters.*?)>(.*?)</a>'
action = 'list_all'

View File

@@ -7,7 +7,8 @@
"thumbnail": "https://s14.postimg.cc/ibh4znkox/doramasmp4.png",
"banner": "",
"categories": [
"tvshow"
"tvshow",
"vos"
],
"settings": [
{

View File

@@ -0,0 +1,79 @@
{
"id": "dospelis",
"name": "DosPelis",
"active": true,
"adult": false,
"language": ["lat", "cast", "vose"],
"thumbnail": "https://www.dospelis.com/wp-content/uploads/2018/07/dospelislogo.png",
"banner": "",
"categories": [
"movie",
"tvshow",
"vos"
],
"settings": [
{
"id": "include_in_global_search",
"type": "bool",
"label": "Incluir en busqueda global",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "filter_languages",
"type": "list",
"label": "Mostrar enlaces en idioma...",
"default": 0,
"enabled": true,
"visible": true,
"lvalues": [
"No filtrar",
"Latino",
"Castellano",
"VOSE"
]
},
{
"id": "include_in_newest_peliculas",
"type": "bool",
"label": "Incluir en Novedades - Peliculas",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "include_in_newest_infantiles",
"type": "bool",
"label": "Incluir en Novedades - Infantiles",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "include_in_newest_terror",
"type": "bool",
"label": "Incluir en Novedades - terror",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "comprueba_enlaces",
"type": "bool",
"label": "Verificar si los enlaces existen",
"default": false,
"enabled": true,
"visible": true
},
{
"id": "comprueba_enlaces_num",
"type": "list",
"label": "Número de enlaces a verificar",
"default": 1,
"enabled": true,
"visible": "eq(-1,true)",
"lvalues": [ "5", "10", "15", "20" ]
}
]
}

View File

@@ -0,0 +1,345 @@
# -*- coding: utf-8 -*-
# -*- Channel DosPelis -*-
# -*- Created for Alfa-addon -*-
# -*- By the Alfa Develop Group -*-
import re
import urllib
import base64
from channelselector import get_thumb
from core import httptools
from core import jsontools
from core import scrapertools
from core import servertools
from core import tmdb
from lib import jsunpack
from core.item import Item
from channels import filtertools
from channels import autoplay
from platformcode import config, logger
IDIOMAS = {'mx': 'Latino', 'dk':'Latino', 'es': 'Castellano', 'en': 'VOSE', 'gb':'VOSE'}
list_language = IDIOMAS.values()
list_quality = []
list_servers = [
'directo',
'openload',
]
__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'dospelis')
__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'dospelis')
host = 'https://dospelis.com/'
def mainlist(item):
logger.info()
autoplay.init(item.channel, list_servers, list_quality)
itemlist = []
itemlist.append(Item(channel=item.channel, title='Peliculas', action='menu_movies',
thumbnail= get_thumb('movies', auto=True)))
itemlist.append(Item(channel=item.channel, title='Series', url=host+'tvshows', action='list_all', type='tvshows',
thumbnail= get_thumb('tvshows', auto=True)))
itemlist.append(
item.clone(title="Buscar", action="search", url=host + '?s=', thumbnail=get_thumb("search", auto=True),
extra='movie'))
autoplay.show_option(item.channel, itemlist)
return itemlist
def menu_movies(item):
logger.info()
itemlist=[]
itemlist.append(Item(channel=item.channel, title='Todas', url=host + 'movies', action='list_all',
thumbnail=get_thumb('all', auto=True), type='movies'))
itemlist.append(Item(channel=item.channel, title='Genero', action='section',
thumbnail=get_thumb('genres', auto=True), type='movies'))
itemlist.append(Item(channel=item.channel, title='Por Año', action='section',
thumbnail=get_thumb('year', auto=True), type='movies'))
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 get_language(lang_data):
logger.info()
language = []
lang_list = scrapertools.find_multiple_matches(lang_data, '/flags/(.*?).png\)')
for lang in lang_list:
if lang == 'en':
lang = 'vose'
if lang not in language:
language.append(lang)
return language
def section(item):
logger.info()
itemlist=[]
duplicados=[]
data = get_source(host+'/'+item.type)
if 'Genero' in item.title:
patron = '<li class=cat-item cat-item-\d+><a href=(.*?) >(.*?)/i>'
elif 'Año' in item.title:
patron = '<li><a href=(.*?release.*?)>(.*?)</a>'
elif 'Calidad' in item.title:
patron = 'menu-item-object-dtquality menu-item-\d+><a href=(.*?)>(.*?)</a>'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedtitle in matches:
title = scrapedtitle
plot=''
if 'Genero' in item.title:
quantity = scrapertools.find_single_match(scrapedtitle,'</a> <i>(.*?)<')
title = scrapertools.find_single_match(scrapedtitle,'(.*?)</')
title = title
plot = '%s elementos' % quantity.replace('.','')
else:
title = scrapedtitle
if title not in duplicados:
itemlist.append(Item(channel=item.channel, url=scrapedurl, title=title, plot=plot, action='list_all',
type=item.type))
duplicados.append(title)
return itemlist
def list_all(item):
logger.info()
itemlist = []
data = get_source(item.url)
if item.type == 'movies':
patron = '<article id=post-\d+ class=item movies><div class=poster><img src=(.*?) alt=(.*?)>.*?quality>(.*?)'
patron += '</span><\/div><a href=(.*?)>.*?<\/h3><span>(.*?)<\/span><\/div>.*?flags(.*?)metadata'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedthumbnail, scrapedtitle, quality, scrapedurl, year, lang_data in matches:
title = '%s [%s] [%s]' % (scrapedtitle, year, quality)
contentTitle = scrapedtitle
thumbnail = scrapedthumbnail
url = scrapedurl
language = get_language(lang_data)
itemlist.append(item.clone(action='findvideos',
title=title,
url=url,
thumbnail=thumbnail,
contentTitle=contentTitle,
language=language,
quality=quality,
infoLabels={'year':year}))
elif item.type == 'tvshows':
patron = '<article id=post-\d+ class=item tvshows><div class=poster><img src=(.*?) alt=(.*?)>.*?'
patron += '<a href=(.*?)>.*?<\/h3><span>(.*?)<\/span><\/div>'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedthumbnail, scrapedtitle, scrapedurl, year in matches:
title = scrapedtitle
contentSerieName = scrapedtitle
thumbnail = scrapedthumbnail
url = scrapedurl
itemlist.append(item.clone(action='seasons',
title=title,
url=url,
thumbnail=thumbnail,
contentSerieName=contentSerieName,
infoLabels={'year':year}))
tmdb.set_infoLabels(itemlist, seekTmdb=True)
# Paginación
#url_next_page = scrapertools.find_single_match(data,"<a class='arrow_pag' href=([^>]+)><i id='nextpagination'")
url_next_page = scrapertools.find_single_match(data,"<link rel=next href=([^ ]+) />")
if url_next_page:
itemlist.append(item.clone(title="Siguiente >>", url=url_next_page, action='list_all'))
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 season in matches:
season = season.lower().replace('temporada','')
infoLabels['season']=season
title = 'Temporada %s' % season
itemlist.append(Item(channel=item.channel, title=title, url=item.url, action='episodesxseasons',
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 += episodesxseasons(tempitem)
return itemlist
def episodesxseasons(item):
logger.info()
itemlist = []
data=get_source(item.url)
patron='class=numerando>%s - (\d+)</div><div class=episodiotitle><a href=(.*?)>(.*?)<' % item.infoLabels['season']
matches = re.compile(patron, re.DOTALL).findall(data)
infoLabels = item.infoLabels
for scrapedepisode, scrapedurl, scrapedtitle in matches:
infoLabels['episode'] = scrapedepisode
url = scrapedurl
title = '%sx%s - %s' % (infoLabels['season'], infoLabels['episode'], scrapedtitle)
itemlist.append(Item(channel=item.channel, title= title, url=url, action='findvideos', infoLabels=infoLabels))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
return itemlist
def findvideos(item):
logger.info()
itemlist = []
data = get_source(item.url)
patron = 'id=option-(\d+).*?rptss src=(.*?) frameborder'
matches = re.compile(patron, re.DOTALL).findall(data)
lang=''
for option, scrapedurl in matches:
lang = scrapertools.find_single_match(data, 'href=#option-%s>.*?/flags/(.*?).png' % option)
quality = ''
if lang not in IDIOMAS:
lang = 'en'
title = '%s %s'
itemlist.append(
Item(channel=item.channel, url=scrapedurl, title=title, action='play', quality=quality, language=IDIOMAS[lang],
infoLabels=item.infoLabels))
itemlist = servertools.get_servers_itemlist(itemlist, lambda x: x.title % (x.server.capitalize(), x.language))
# Requerido para Filtrar enlaces
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)
itemlist = sorted(itemlist, key=lambda it: it.language)
if item.contentType != 'episode':
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
def search(item, texto):
logger.info()
texto = texto.replace(" ", "+")
item.url = item.url + texto
if texto != '':
return search_results(item)
else:
return []
def search_results(item):
logger.info()
itemlist=[]
data=get_source(item.url)
patron = '<article>.*?<a href=(.*?)><img src=(.*?) alt=(.*?) />.*?meta.*?year>(.*?)<(.*?)<p>(.*?)</p>'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedthumb, scrapedtitle, year, lang_data, scrapedplot in matches:
title = scrapedtitle
url = scrapedurl
thumbnail = scrapedthumb
plot = scrapedplot
language = get_language(lang_data)
if language:
action = 'findvideos'
else:
action = 'seasons'
new_item=Item(channel=item.channel, title=title, url=url, thumbnail=thumbnail, plot=plot,
action=action,
language=language, infoLabels={'year':year})
if new_item.action == 'findvideos':
new_item.contentTitle = new_item.title
else:
new_item.contentSerieName = new_item.title
itemlist.append(new_item)
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
return itemlist
def newest(categoria):
logger.info()
itemlist = []
item = Item()
try:
if categoria in ['peliculas']:
item.url = host + 'movies/'
elif categoria == 'infantiles':
item.url = host + 'genre/animacion/'
elif categoria == 'terror':
item.url = host + 'genre/terror/'
item.type='movies'
itemlist = list_all(item)
if itemlist[-1].title == 'Siguiente >>':
itemlist.pop()
except:
import sys
for line in sys.exc_info():
logger.error("{0}".format(line))
return []
return itemlist

View File

@@ -173,6 +173,7 @@ def listado(item):
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 = 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
if "/serie" in scrapedurl or "/serie" in item.url:
@@ -215,8 +216,8 @@ def listado(item):
itemlist.append(item_local.clone()) #Pintar pantalla
if not item.category: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
#if not item.category: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
# return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
#Pasamos a TMDB la lista completa Itemlist
tmdb.set_infoLabels(itemlist, True)
@@ -339,6 +340,15 @@ def findvideos(item):
return itemlist
def actualizar_titulos(item):
logger.info()
item = generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
#Volvemos a la siguiente acción en el canal
return item
def search(item, texto):
logger.info("search:" + texto)
# texto = texto.replace(" ", "+")

View File

@@ -0,0 +1,54 @@
{
"id": "goodpelis",
"name": "GoodPelis",
"active": true,
"adult": false,
"language": ["lat"],
"thumbnail": "http://goodpelis.net/wp-content/uploads/2017/11/Logo-GP.png",
"banner": "",
"categories": [
"movie"
],
"settings": [
{
"id": "include_in_global_search",
"type": "bool",
"label": "Incluir en busqueda global",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "include_in_newest_latino",
"type": "bool",
"label": "Incluir en Novedades - Latino",
"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": true,
"enabled": true,
"visible": true
},
{
"id": "include_in_newest_terror",
"type": "bool",
"label": "Incluir en Novedades - Terror",
"default": true,
"enabled": true,
"visible": true
}
]
}

View File

@@ -0,0 +1,354 @@
# -*- coding: utf-8 -*-
# -*- Channel GoodPelis -*-
# -*- Created for Alfa-addon -*-
# -*- By the Alfa Develop Group -*-
import re
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 = 'https://goodpelis.net/'
def mainlist(item):
logger.info()
itemlist = []
itemlist.append(item.clone(title="Peliculas",
action="menu_peliculas",
thumbnail=get_thumb('movies', auto=True),
))
# itemlist.append(item.clone(title="Series",
# action="menu_series",
# thumbnail=get_thumb('tvshows', auto=True),
# ))
itemlist.append(item.clone(title="Buscar", action="search",
thumbnail=get_thumb('search', auto=True),
url=host + '?s='
))
return itemlist
def menu_peliculas(item):
logger.info()
itemlist = []
itemlist.append(item.clone(title="Todas",
action="list_all",
thumbnail=get_thumb('all', auto=True),
url=host + 'page/1/?s'
))
itemlist.append(item.clone(title="Generos",
action="seccion",
url=host + 'page/1/?s',
thumbnail=get_thumb('genres', auto=True),
seccion='generos-pelicula'
))
itemlist.append(item.clone(title="Por Año",
action="seccion",
url=host + 'page/1/?s',
thumbnail=get_thumb('year', auto=True),
seccion='fecha-estreno'
))
itemlist.append(item.clone(title="Calidad",
action="seccion",
url=host + 'page/1/?s',
thumbnail=get_thumb('quality', auto=True),
seccion='calidad'
))
return itemlist
def menu_series(item):
logger.info()
itemlist = []
itemlist.append(item.clone(title="Todas",
action="list_all", thumbnail=get_thumb('all', auto=True),
url=host + 'series/page/1/',
))
itemlist.append(item.clone(title="Generos",
action="seccion",
url=host + 'series/page/1/',
thumbnail=get_thumb('genres', auto=True),
seccion='generos-serie'
))
itemlist.append(item.clone(title="Por Año",
action="seccion",
url=host + 'series/page/1/',
thumbnail=get_thumb('year', auto=True),
seccion='series-lanzamiento'
))
return itemlist
def list_all(item):
logger.info()
itemlist = []
data = get_source(item.url)
patron = 'class=item.*?<a href=(.*?)><div class=image.*?<img src=(.*?) alt=(.*?) (?:\(\d{4}|width).*?'
patron += 'fixyear><h2>.*?<\/h2>.*?<span class=year>(.*?)<\/span><\/div>(.*?)<\/div>'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedyear, scrapedquality in matches:
url = scrapedurl
action = 'findvideos'
thumbnail = scrapedthumbnail
plot = ''
contentSerieName = ''
contentTitle = scrapedtitle
title = contentTitle
quality = 'Full HD'
if scrapedquality != '':
quality = scrapertools.find_single_match(scrapedquality, 'calidad2>(.*?)<')
title = contentTitle + ' (%s)' % quality
year = scrapedyear
if 'series' in item.url or 'series' in url:
action = 'seasons'
contentSerieName = contentTitle
quality = ''
new_item = Item(channel=item.channel,
action=action,
title=title,
url=url,
thumbnail=thumbnail,
plot=plot,
quality=quality,
infoLabels={'year': year}
)
if 'series' not in item.url:
new_item.contentTitle = contentTitle
else:
new_item.contentSerieName = contentSerieName
if 'temporada' not in url:
itemlist.append(new_item)
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
# Paginacion
if itemlist != []:
next_page = scrapertools.find_single_match(data,
'<div class=pag_b><a href=(.*?)>Siguiente</a>')
if next_page != '':
itemlist.append(Item(channel=item.channel,
action="list_all",
title='Siguiente >>>',
url=next_page,
))
return itemlist
def seccion(item):
logger.info()
itemlist = []
data = get_source(item.url)
if item.seccion == 'generos-pelicula':
patron = '<li class=cat-item cat-item-.*?><a href=(.*?)>(.*?<\/a> <span>.*?)<\/span><\/li>'
elif item.seccion == 'generos-serie':
patron = '<li class=cat-item cat-item-.*?><a href=(.*?\/series-genero\/.*?)>(.*?<\/a> <span>.*?)<\/span><\/li>'
elif item.seccion in ['fecha-estreno', 'series-lanzamiento']:
patron = '<li><a href=%sfecha-estreno(.*?)>(.*?)<\/a>' % host
elif item.seccion == 'calidad':
patron = '<li><a href=%scalidad(.*?)>(.*?)<\/a>' % host
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedtitle in matches:
thumbnail = ''
if 'generos' in item.seccion:
cantidad = scrapertools.find_single_match(scrapedtitle, '<span>(\d+)')
title = scrapertools.find_single_match(scrapedtitle, '(.*?)<')
url = scrapedurl
title = scrapertools.decodeHtmlentities(title)
title = title + ' (%s)' % cantidad
elif item.seccion in ['series-lanzamiento', 'fecha-estreno', 'calidad']:
title = scrapedtitle
url = '%s%s%s' % (host, item.seccion, scrapedurl)
itemlist.append(item.clone(action='list_all',
title=title,
url=url,
thumbnail=thumbnail
))
return itemlist
def seasons(item):
logger.info()
itemlist = []
data = get_source(item.url)
patron = '<span class=title>.*?- Temporada (.*?)<\/span>'
matches = re.compile(patron, re.DOTALL).findall(data)
for temporada in matches:
title = 'Temporada %s' % temporada
contentSeasonNumber = temporada
item.infoLabels['season'] = contentSeasonNumber
itemlist.append(item.clone(action='episodiosxtemp',
title=title,
contentSeasonNumber=contentSeasonNumber
))
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,
contentSeasonNumber=contentSeasonNumber
))
return itemlist
def episodios(item):
logger.info()
itemlist = []
data = get_source(item.url)
patron = '<li><div class=numerando>(\d+).*?x.*?(\d+)<\/div>.*?<a href=(.*?)> (.*?)<\/a>.*?<\/i>'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedtemp, scrapedep, scrapedurl, scrapedtitle in matches:
temporada = scrapedtemp
title = temporada + 'x%s %s' % (scrapedep, scrapedtitle)
url = scrapedurl
contentEpisodeNumber = scrapedep
item.infoLabels['episode'] = contentEpisodeNumber
itemlist.append(item.clone(action='findvideos',
title=title,
url=url,
contentEpisodeNumber=contentEpisodeNumber,
))
return itemlist
def episodiosxtemp(item):
logger.info()
itemlist = []
data = get_source(item.url)
temporada = item.contentSeasonNumber
patron = '<li><div class=numerando>%s.*?x.*?(\d+)<\/div>.*?<a href=(.*?)> (.*?)<\/a>.*?<\/i>' % temporada
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedep, scrapedurl, scrapedtitle in matches:
title = temporada + 'x%s %s' % (scrapedep, scrapedtitle)
url = scrapedurl
contentEpisodeNumber = scrapedep
item.infoLabels['episode'] = contentEpisodeNumber
itemlist.append(item.clone(action='findvideos',
title=title,
url=url,
contentEpisodeNumber=contentEpisodeNumber,
))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
return itemlist
def findvideos(item):
logger.info()
url_list = []
itemlist = []
duplicados = []
data = get_source(item.url)
src = data
patron = '<(?:iframe|IFRAME).*?(?:src|SRC)=(.*?) (?:scrolling|frameborder|FRAMEBORDER)'
matches = re.compile(patron, re.DOTALL).findall(data)
for url in matches:
lang = 'LAT'
quality = item.quality
title = '[%s] [%s]'
if url != '':
itemlist.append(item.clone(title=title, url=url, action='play', language=lang))
itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % (i.server, i.language))
if item.infoLabels['mediatype'] == 'movie':
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
def search(item, texto):
logger.info()
texto = texto.replace(" ", "+")
item.url = item.url + texto
try:
if texto != '':
return list_all(item)
else:
return []
except:
import sys
for line in sys.exc_info():
logger.error("%s" % line)
return []
def newest(categoria):
logger.info()
itemlist = []
item = Item()
try:
if categoria in ['peliculas', 'latino']:
item.url = host + 'page/1/?s'
elif categoria == 'infantiles':
item.url = host + 'category/animacion/'
elif categoria == 'terror':
item.url = host + 'category/terror/'
itemlist = list_all(item)
if itemlist[-1].title == 'Siguiente >>>':
itemlist.pop()
except:
import sys
for line in sys.exc_info():
logger.error("{0}".format(line))
return []
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

View File

@@ -333,13 +333,14 @@ def listado(item):
item_local.contentSerieName = title.strip()
item_local.title = title.strip() #Salvamos el título
item_local.from_title = title.strip() #Guardamos esta etiqueta para posible desambiguación de título
item_local.infoLabels['year'] = "-" #Reseteamos el año para que TMDB nos lo de
#Agrega el item local a la lista itemlist
itemlist.append(item_local.clone())
if not item.category and result_mode == 0: #Si este campo no existe, viene de la primera pasada de una búsqueda global
return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorrar tiempo
#if not item.category and result_mode == 0: #Si este campo no existe, viene de la primera pasada de una búsqueda global
# return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorrar tiempo
#Pasamos a TMDB la lista completa Itemlist
tmdb.set_infoLabels(itemlist, __modo_grafico__)
@@ -813,14 +814,11 @@ def episodios(item):
def actualizar_titulos(item):
logger.info()
itemlist = []
from platformcode import launcher
item = generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
#Volvemos a la siguiente acción en el canal
return launcher.run(item)
return item
def search(item, texto):

View File

@@ -517,10 +517,10 @@ def findvideos(item):
url=url_targets, thumbnail=item.thumbnail, show=item.show, folder=False))
title_label = " ( [COLOR green][B]Tráiler[/B][/COLOR] )"
it1.append(
item.clone(channel="trailertools", action="buscartrailer", title=title_label, contentTitle=item.show, url=item.url,
Item(channel="trailertools", action="buscartrailer", title=title_label, contentTitle=item.show, url=item.url,
thumbnail=item.thumbnail, show=item.show))
it1.append(Item(channel=item.channel, action="set_status", title=title, fulltitle=title, url=url_targets,
thumbnail=item.thumbnail, show=item.show, folder=True))
thumbnail=item.thumbnail, show=item.show, language=item.language, folder=True))
data_js = httptools.downloadpage("%s/templates/hdfull/js/jquery.hdfull.view.min.js" % host).data
key = scrapertools.find_single_match(data_js, 'JSON.parse\(atob.*?substrings\((.*?)\)')
data_js = httptools.downloadpage("%s/js/providers.js" % host).data
@@ -566,8 +566,8 @@ def findvideos(item):
if account:
url += "###" + id + ";" + type
it2.append(
item.clone(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail,
plot=plot, fanart=fanart, show=item.show, folder=True, infoLabels=infolabels,
Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail,
plot=plot, fanart=fanart, show=item.show, folder=True, infoLabels=infolabels, language=idioma,
contentTitle=item.contentTitle, contentType=item.contentType, tipo=option, tipo1=option1, idioma=idioma))
it2 = servertools.get_servers_itemlist(it2, lambda i: i.title % i.server.capitalize())
it2.sort(key=lambda it: (it.tipo1, it.idioma, it.server))

View File

@@ -340,7 +340,15 @@ def listado(item):
item_local.url = url
item_local.contentType = "season"
else:
real_title, item_local.contentSeason, item_local.quality = scrapertools.find_single_match(scrapedurl, patron_title_se)
try:
real_title, item_local.contentSeason, item_local.quality = scrapertools.find_single_match(scrapedurl, patron_title_se)
except:
real_title = ''
item_local.action = "findvideos"
item_local.contentType = "episode"
item_local.contentSeason = 1
item_local.contentEpisodeNumber = 1
item_local.quality = ''
item_local.contentSerieName = real_title.replace("-", " ").capitalize()
if not item_local.contentSeason:
@@ -448,6 +456,7 @@ def listado(item):
elif item_local.contentType != "episode":
item_local.title = title
item_local.title = item_local.contentSerieName
item_local.from_title = title #Guardamos esta etiqueta para posible desambiguación de título
if "saga" in item_local.contentTitle.lower() or "saga" in item_local.contentSerieName.lower():
item_local.contentTitle = item_local.contentTitle.replace("Saga ", "").replace("Saga", "")
@@ -681,6 +690,7 @@ def listado_busqueda(item):
title = title.replace("4k-hdr", "").replace("4K-HDR", "").replace("hdr", "").replace("HDR", "").replace("4k", "").replace("4K", "")
title = title.replace("(", "").replace(")", "").replace("[", "").replace("]", "").strip()
item_local.title = title
item_local.from_title = title #Guardamos esta etiqueta para posible desambiguación de título
if "Peliculas" in scrapedtype or "Variados" in scrapedtype:
item_local.action = "findvideos"
@@ -711,8 +721,8 @@ def listado_busqueda(item):
#logger.debug(item_local)
if not category: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
#if not category: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
# return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
#Llamamos a TMDB para que complete InfoLabels desde itemlist. Mejor desde itemlist porque envía las queries en paralelo
tmdb.set_infoLabels(itemlist, __modo_grafico__)
@@ -966,14 +976,11 @@ def episodios(item):
def actualizar_titulos(item):
logger.info()
itemlist = []
from platformcode import launcher
item = generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
#Volvemos a la siguiente acción en el canal
return launcher.run(item)
return item
def search(item, texto):

View File

@@ -476,7 +476,9 @@ def listado(item):
# Limpiamos títulos, Sacamos datos de calidad, audio y lenguaje
title = re.sub('\r\n', '', scrapedtitle).decode('iso-8859-1').encode('utf8').strip()
#title = re.sub('\r\n', '', scrapedtitle).decode('utf-8').encode('utf-8').strip()
title_alt = re.sub('\r\n', '', scrapedtitle_alt).decode('iso-8859-1').encode('utf8').strip()
#title_alt = re.sub('\r\n', '', scrapedtitle_alt).decode('utf-8').encode('utf-8').strip()
title = title.replace("á", "a").replace("é", "e").replace("í", "i").replace("ó", "o").replace("ú", "u").replace("ü", "u").replace("�", "ñ").replace("ñ", "ñ").replace(".", " ")
title_alt = title_alt.replace("á", "a").replace("é", "e").replace("í", "i").replace("ó", "o").replace("ú", "u").replace("ü", "u").replace("�", "ñ").replace("ñ", "ñ")
@@ -485,7 +487,7 @@ def listado(item):
#Determinamos y marcamos idiomas distintos del castellano
item_local.language = []
if "[vos" in title.lower() or "v.o.s" in title.lower() or "vo" in title.lower() or ".com/pelicula/" in scrapedurl or ".com/series-vo" in scrapedurl or "-vo/" in scrapedurl or "vos" in calidad.lower() or "vose" in calidad.lower() or "v.o.s" in calidad.lower() or "sub" in calidad.lower() or ".com/peliculas-vo" in item.url:
if "[vos" in title.lower() or "v.o.s" in title.lower() or "vo" in title.lower() or "subs" in title.lower() or ".com/pelicula/" in scrapedurl or ".com/series-vo" in scrapedurl or "-vo/" in scrapedurl or "vos" in calidad.lower() or "vose" in calidad.lower() or "v.o.s" in calidad.lower() or "sub" in calidad.lower() or ".com/peliculas-vo" in item.url:
item_local.language += ["VOS"]
title = title.replace(" [Subs. integrados]", "").replace(" [subs. Integrados]", "").replace(" [VOSE", "").replace(" [VOS", "").replace(" (V.O.S.E)", "").replace(" VO", "").replace("Subtitulos", "")
if "latino" in title.lower() or "argentina" in title.lower() or "-latino/" in scrapedurl or "latino" in calidad.lower() or "argentina" in calidad.lower():
@@ -557,9 +559,9 @@ def listado(item):
title = re.sub(r' \d+x\d+', '', title)
title = re.sub(r' x\d+', '', title)
title = title.replace("Ver online ", "").replace("Descarga Serie HD ", "").replace("Descargar Serie HD ", "").replace("Descarga Serie ", "").replace("Descargar Serie ", "").replace("Ver en linea ", "").replace("Ver en linea", "").replace("HD ", "").replace("(Proper)", "").replace("RatDVD", "").replace("DVDRiP", "").replace("DVDRIP", "").replace("DVDRip", "").replace("DVDR", "").replace("DVD9", "").replace("DVD", "").replace("DVBRIP", "").replace("DVB", "").replace("LINE", "").replace("- ES ", "").replace("ES ", "").replace("COMPLETA", "").replace("(", "-").replace(")", "-").replace(".", " ").strip()
title = title.replace("Ver online ", "").replace("Descarga Serie HD ", "").replace("Descargar Serie HD ", "").replace("Descarga Serie ", "").replace("Descargar Serie ", "").replace("Ver en linea ", "").replace("Ver en linea", "").replace("en Full HD", "").replace("en hd ", "").replace("en HD ", "").replace("HD ", "").replace("(Proper)", "").replace("RatDVD", "").replace("DVDRiP", "").replace("DVDRIP", "").replace("DVDRip", "").replace("DVDR", "").replace("DVD9", "").replace("DVD", "").replace("DVBRIP", "").replace("DVB", "").replace("LINE", "").replace("calidad", " ").replace("- ES ", "").replace("ES ", "").replace("COMPLETA", "").replace("(", "-").replace(")", "-").replace(".", " ").strip()
title = title.replace("Descargar torrent ", "").replace("Descarga Gratis ", "").replace("Descargar Estreno ", "").replace("Descargar Estrenos ", "").replace("Pelicula en latino ", "").replace("Descargar Pelicula ", "").replace("Descargar Peliculas ", "").replace("Descargar peliculas ", "").replace("Descargar Todas ", "").replace("Descargar Otras ", "").replace("Descargar ", "").replace("Descarga ", "").replace("Bajar ", "").replace("HDRIP ", "").replace("HDRiP ", "").replace("HDRip ", "").replace("RIP ", "").replace("Rip", "").replace("RiP", "").replace("XviD", "").replace("AC3 5.1", "").replace("AC3", "").replace("1080p ", "").replace("720p ", "").replace("DVD-Screener ", "").replace("TS-Screener ", "").replace("Screener ", "").replace("BdRemux ", "").replace("BR ", "").replace("4KULTRA", "").replace("FULLBluRay", "").replace("FullBluRay", "").replace("BluRay", "").replace("Bonus Disc", "").replace("de Cine ", "").replace("TeleCine ", "").replace("latino", "").replace("Latino", "").replace("argentina", "").replace("Argentina", "").strip()
title = title.replace("Descargar torrent ", "").replace("Descarga Gratis", "").replace("Descarga gratis", "").replace("Descargar Gratis", "").replace("Descargar gratis", "").replace("en gratis", "").replace("gratis gratis", "").replace("Gratisgratis", "").replace("Descargar Estreno ", "").replace("Descargar Estrenos ", "").replace("Pelicula en latino ", "").replace("Descargar Pelicula ", "").replace("Descargar pelicula ", "").replace("Descargar Peliculas ", "").replace("Descargar peliculas ", "").replace("Descargar Todas ", "").replace("Descargar Otras ", "").replace("Descargar ", "").replace("Descarga ", "").replace("Descargar ", "").replace("Decargar ", "").replace("Bajar ", "").replace("HDRIP ", "").replace("HDRiP ", "").replace("HDRip ", "").replace("RIP ", "").replace("Rip", "").replace("RiP", "").replace("XviD", "").replace("AC3 5.1", "").replace("AC3", "").replace("1080p ", "").replace("720p ", "").replace("DVD-Screener ", "").replace("TS-Screener ", "").replace("Screener ", "").replace("BdRemux ", "").replace("BR ", "").replace("4KULTRA", "").replace("FULLBluRay", "").replace("FullBluRay", "").replace("en BluRay", "").replace("BluRay en", "").replace("Bluray en", "").replace("BluRay", "").replace("Bonus Disc", "").replace("de Cine ", "").replace("TeleCine ", "").replace("latino", "").replace("Latino", "").replace("argentina", "").replace("Argentina", "").replace("++Sub", "").replace("+-+Sub", "").strip()
if title.endswith("torrent gratis"): title = title[:-15]
if title.endswith("gratis"): title = title[:-7]
@@ -586,6 +588,7 @@ def listado(item):
#Limpieza final del título y guardado en las variables según su tipo de contenido
title = scrapertools.remove_htmltags(title)
item_local.title = title
item_local.from_title = title #Guardamos esta etiqueta para posible desambiguación de título
if item_local.contentType == "movie":
item_local.contentTitle = title
else:
@@ -609,6 +612,8 @@ def listado(item):
#Agrega el item local a la lista itemlist
itemlist.append(item_local.clone())
#logger.debug(item_local)
#Pasamos a TMDB la lista completa Itemlist
tmdb.set_infoLabels(itemlist, __modo_grafico__)
@@ -920,13 +925,14 @@ def listado_busqueda(item):
# Limpiamos títulos, Sacamos datos de calidad, audio y lenguaje
title = re.sub('\r\n', '', scrapedtitle).decode('iso-8859-1').encode('utf8').strip()
#title = re.sub('\r\n', '', scrapedtitle).decode('utf-8').encode('utf-8').strip()
title = title.replace("á", "a").replace("é", "e").replace("í", "i").replace("ó", "o").replace("ú", "u").replace("ü", "u").replace("�", "ñ").replace("ñ", "ñ")
item_local.quality = scrapertools.htmlclean(calidad)
#Determinamos y marcamos idiomas distintos del castellano
item_local.language = []
if "[vos" in title.lower() or "v.o.s" in title.lower() or "vo" in title.lower() or ".com/pelicula/" in url or ".com/series-vo" in url or "-vo/" in url or "vos" in calidad.lower() or "vose" in calidad.lower() or "v.o.s" in calidad.lower() or "sub" in calidad.lower() or ".com/peliculas-vo" in item.url:
if "[vos" in title.lower() or "v.o.s" in title.lower() or "vo" in title.lower() or "subs" in title.lower() or ".com/pelicula/" in url or ".com/series-vo" in url or "-vo/" in url or "vos" in calidad.lower() or "vose" in calidad.lower() or "v.o.s" in calidad.lower() or "sub" in calidad.lower() or ".com/peliculas-vo" in item.url:
item_local.language += ["VOS"]
title = title.replace(" [Subs. integrados]", "").replace(" [subs. Integrados]", "").replace(" [VOSE", "").replace(" [VOS", "").replace(" (V.O.S.E)", "").replace(" VO", "").replace("Subtitulos", "")
if "latino" in title.lower() or "argentina" in title.lower() or "-latino/" in url or "latino" in calidad.lower() or "argentina" in calidad.lower():
@@ -986,7 +992,7 @@ def listado_busqueda(item):
title_subs += ["[Miniserie]"]
#Limpiamos restos en título
title = title.replace("Castellano", "").replace("castellano", "").replace("inglés", "").replace("ingles", "").replace("Inglés", "").replace("Ingles", "").replace("Ing", "").replace("Eng", "").replace("Calidad", "").replace("de la Serie", "")
title = title.replace("Castellano", "").replace("castellano", "").replace("inglés", "").replace("ingles", "").replace("Inglés", "").replace("Ingles", "").replace("Ingl", "").replace("Engl", "").replace("Calidad", "").replace("de la Serie", "")
#Limpiamos cabeceras y colas del título
title = re.sub(r'Descargar\s\w+\-\w+', '', title)
@@ -996,9 +1002,9 @@ def listado_busqueda(item):
title = re.sub(r' \d+x\d+', '', title)
title = re.sub(r' x\d+', '', title)
title = title.replace("Ver online ", "").replace("Descarga Serie HD ", "").replace("Descargar Serie HD ", "").replace("Descarga Serie ", "").replace("Descargar Serie ", "").replace("Ver en linea ", "").replace("Ver en linea", "").replace("HD ", "").replace("(Proper)", "").replace("RatDVD", "").replace("DVDRiP", "").replace("DVDRIP", "").replace("DVDRip", "").replace("DVDR", "").replace("DVD9", "").replace("DVD", "").replace("DVBRIP", "").replace("DVB", "").replace("LINE", "").replace("- ES ", "").replace("ES ", "").replace("COMPLETA", "").replace("(", "-").replace(")", "-").replace(".", " ").strip()
title = title.replace("Ver online ", "").replace("Descarga Serie HD ", "").replace("Descargar Serie HD ", "").replace("Descarga Serie ", "").replace("Descargar Serie ", "").replace("Ver en linea ", "").replace("Ver en linea", "").replace("en Full HD", "").replace("en hd ", "").replace("en HD ", "").replace("HD ", "").replace("(Proper)", "").replace("RatDVD", "").replace("DVDRiP", "").replace("DVDRIP", "").replace("DVDRip", "").replace("DVDR", "").replace("DVD9", "").replace("DVD", "").replace("DVBRIP", "").replace("DVB", "").replace("LINE", "").replace("calidad", " ").replace("- ES ", "").replace("ES ", "").replace("COMPLETA", "").replace("(", "-").replace(")", "-").replace(".", " ").strip()
title = title.replace("Descargar torrent ", "").replace("Descarga Gratis ", "").replace("Descargar Estreno ", "").replace("Descargar Estrenos ", "").replace("Pelicula en latino ", "").replace("Descargar Pelicula ", "").replace("Descargar Peliculas ", "").replace("Descargar peliculas ", "").replace("Descargar Todas ", "").replace("Descargar Otras ", "").replace("Descargar ", "").replace("Descarga ", "").replace("Bajar ", "").replace("HDRIP ", "").replace("HDRiP ", "").replace("HDRip ", "").replace("RIP ", "").replace("Rip", "").replace("RiP", "").replace("XviD", "").replace("AC3 5.1", "").replace("AC3", "").replace("1080p ", "").replace("720p ", "").replace("DVD-Screener ", "").replace("TS-Screener ", "").replace("Screener ", "").replace("BdRemux ", "").replace("BR ", "").replace("4KULTRA", "").replace("FULLBluRay", "").replace("FullBluRay", "").replace("BluRay", "").replace("Bonus Disc", "").replace("de Cine ", "").replace("TeleCine ", "").replace("latino", "").replace("Latino", "").replace("argentina", "").replace("Argentina", "").strip()
title = title.replace("Descargar torrent ", "").replace("Descarga Gratis", "").replace("Descarga gratis", "").replace("Descargar Gratis", "").replace("Descargar gratis", "").replace("en gratis", "").replace("gratis gratis", "").replace("Gratisgratis", "").replace("Descargar Estreno ", "").replace("Descargar Estrenos ", "").replace("Pelicula en latino ", "").replace("Descargar Pelicula ", "").replace("Descargar pelicula ", "").replace("Descargar Peliculas ", "").replace("Descargar peliculas ", "").replace("Descargar Todas ", "").replace("Descargar Otras ", "").replace("Descargar ", "").replace("Descarga ", "").replace("Descargar ", "").replace("Decargar ", "").replace("Bajar ", "").replace("HDRIP ", "").replace("HDRiP ", "").replace("HDRip ", "").replace("RIP ", "").replace("Rip", "").replace("RiP", "").replace("XviD", "").replace("AC3 5.1", "").replace("AC3", "").replace("1080p ", "").replace("720p ", "").replace("DVD-Screener ", "").replace("TS-Screener ", "").replace("Screener ", "").replace("BdRemux ", "").replace("BR ", "").replace("4KULTRA", "").replace("FULLBluRay", "").replace("FullBluRay", "").replace("en BluRay", "").replace("BluRay en", "").replace("Bluray en", "").replace("BluRay", "").replace("Bonus Disc", "").replace("de Cine ", "").replace("TeleCine ", "").replace("latino", "").replace("Latino", "").replace("argentina", "").replace("Argentina", "").replace("++Sub", "").replace("+-+Sub", "").strip()
if "pelisyseries.com" in host and item_local.contentType == "tvshow":
titulo = ''
@@ -1045,6 +1051,7 @@ def listado_busqueda(item):
#Limpieza final del título y guardado en las variables según su tipo de contenido
item_local.title = title
item_local.from_title = title #Guardamos esta etiqueta para posible desambiguación de título
if item_local.contentType == "movie":
item_local.contentTitle = title
size = scrapedsize.replace(".", ",")
@@ -1126,8 +1133,8 @@ def listado_busqueda(item):
#Agrega el item local a la lista itemlist
itemlist.append(item_local.clone())
if not item.category_new: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
#if not item.category_new: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
# return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
#Pasamos a TMDB la lista completa Itemlist
tmdb.set_infoLabels(itemlist, __modo_grafico__)
@@ -1791,14 +1798,11 @@ def episodios(item):
def actualizar_titulos(item):
logger.info()
itemlist = []
from platformcode import launcher
item = generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
#Volvemos a la siguiente acción en el canal
return launcher.run(item)
return item
def search(item, texto):

View File

@@ -85,7 +85,8 @@ def search(item, texto):
def sub_search(item):
logger.info()
itemlist =[]
data = httptools.downloadpage(item.url, add_referer=True).data
headers = {'Referer':host, 'X-Requested-With': 'XMLHttpRequest'}
data = httptools.downloadpage(item.url, headers=headers).data
dict_data = jsontools.load(data)
list =dict_data["data"] [item.type]
if item.type == "m":

View File

@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# -*- Channel PoseidonHD -*-
# -*- Channel PelisR -*-
# -*- Created for Alfa-addon -*-
# -*- By the Alfa Develop Group -*-
@@ -31,8 +31,8 @@ list_servers = [
'rapidvideo'
]
__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'poseidonhd')
__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'poseidonhd')
__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'pelisr')
__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'pelisr')
host = 'https://pelisr.com/'
@@ -79,7 +79,6 @@ def get_source(url):
def get_language(lang_data):
logger.info()
language = []
logger.debug(lang_data)
lang_list = scrapertools.find_multiple_matches(lang_data, '/flags/(.*?).png\)')
for lang in lang_list:
if lang == 'en':
@@ -125,8 +124,6 @@ def list_all(item):
itemlist = []
data = get_source(item.url)
logger.debug(data)
#return
if item.type == 'movies':
patron = '<article id=post-\d+ class=item movies><div class=poster><img src=(.*?) alt=(.*?)>.*?quality>(.*?)'
@@ -185,7 +182,6 @@ def seasons(item):
itemlist=[]
data=get_source(item.url)
logger.debug(data)
patron='Temporada \d+'
matches = re.compile(patron, re.DOTALL).findall(data)
@@ -243,11 +239,9 @@ def findvideos(item):
from lib import generictools
itemlist = []
data = get_source(item.url)
logger.debug(data)
patron = 'id=option-(\d+).*?rptss src=(.*?) frameborder'
matches = re.compile(patron, re.DOTALL).findall(data)
for option, scrapedurl in matches:
logger.debug(scrapedurl)
lang = scrapertools.find_single_match(data, 'href=#option-%s>.*?/flags/(.*?).png' % option)
quality = ''
if lang not in IDIOMAS:
@@ -261,7 +255,6 @@ def findvideos(item):
elif 'wd=' in scrapedurl:
new_id = scrapertools.find_single_match(scrapedurl, 'wd=(.*?)&')
logger.debug('new_id %s' % new_id)
new_id = new_id[::-1]
new_url = 'https://pelisr.com/encri/?wr=%s' % new_id
headers = {'Referer': scrapedurl}

View File

@@ -2,10 +2,13 @@
import re
import urlparse
import urllib
from core import httptools
from core import scrapertools
from core import servertools
from core import tmdb
from core import jsontools
from core.item import Item
from platformcode import config, logger
@@ -316,40 +319,33 @@ def lasmas(item):
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
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 get_link(data):
new_url = scrapertools.find_single_match(data, '(?:IFRAME|iframe) src=(.*?) scrolling')
return new_url
def findvideos(item):
logger.info()
host = 'https://www.locopelis.tv/'
itemlist = []
data = httptools.downloadpage(item.url).data
anterior = scrapertools.find_single_match(data, '<a class="left" href="([^"]+)" title="Cap.tulo Anterior"></a>')
siguiente = scrapertools.find_single_match(data, '<a class="right" href="([^"]+)" title="Cap.tulo Siguiente"></a>')
titulo = scrapertools.find_single_match(data,
'<h1 class="tithd bold fs18px lnht30px ico_b pdtop10px">([^<]+)</h1> ')
existe = scrapertools.find_single_match(data, '<center>La pel.cula que quieres ver no existe.</center>')
from core import servertools
itemlist.extend(servertools.find_video_items(data=data))
for videoitem in itemlist:
if 'youtube' in videoitem.url:
itemlist.remove(videoitem)
for videoitem in itemlist:
videoitem.channel = item.channel
videoitem.action = "play"
videoitem.folder = False
videoitem.fanart = item.fanart
videoitem.title = titulo + " " + videoitem.server
if item.extra2 != 'todos':
data = httptools.downloadpage(anterior).data
existe = scrapertools.find_single_match(data, '<center>La pel.cula que quieres ver no existe.</center>')
if not existe:
itemlist.append(Item(channel=item.channel, action="findvideos", title='Capitulo Anterior', url=anterior,
thumbnail='https://s1.postimg.cc/dbq8gvldb/anterior.png', folder=True))
data = httptools.downloadpage(siguiente).data
existe = scrapertools.find_single_match(data, '<center>La pel.cula que quieres ver no existe.</center>')
if not existe:
itemlist.append(Item(channel=item.channel, action="findvideos", title='Capitulo Siguiente', url=siguiente,
thumbnail='https://s16.postimg.cc/9okdu7hhx/siguiente.png', folder=True))
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')
post = {'h': video_id}
post = urllib.urlencode(post)
data = httptools.downloadpage(new_url, post=post).data
json_data = jsontools.load(data)
url = json_data['url']
server = servertools.get_server_from_url(url)
title = '%s' % server
itemlist.append(Item(channel=item.channel, title=title, url=url, action='play',
server=server, infoLabels=item.infoLabels))
return itemlist

View File

@@ -23,38 +23,38 @@ def mainlist(item):
item.channel = "search"
itemlist = []
context = [{"title": "Elegir canales incluidos", "action": "setting_channel", "channel": item.channel}]
itemlist.append(Item(channel=item.channel, action="sub_menu", title="Buscar en canales", context=context,
context = [{"title": config.get_localized_string(60412), "action": "setting_channel", "channel": item.channel}]
itemlist.append(Item(channel=item.channel, action="sub_menu", title=config.get_localized_string(70305), context=context,
thumbnail=get_thumb("search.png")))
itemlist.append(Item(channel=item.channel, action='genres_menu', title='Películas por Generos', type='movie',
itemlist.append(Item(channel=item.channel, action='genres_menu', title=config.get_localized_string(70306), type='movie',
thumbnail=get_thumb("genres.png")))
itemlist.append (Item(channel=item.channel, action='discover_list', title='Películas mas populares',
itemlist.append (Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70307),
context=context, search_type='list', list_type='movie/popular',
thumbnail=get_thumb("popular.png")))
itemlist.append(Item(channel=item.channel, action='discover_list', title='Películas mejor valoradas',
itemlist.append(Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70308),
context=context, search_type='list', list_type='movie/top_rated',
thumbnail=get_thumb("top_rated.png")))
itemlist.append(
Item(channel=item.channel, action='discover_list', title='Películas Ahora en cines', context=context,
Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70309), context=context,
search_type='list', list_type='movie/now_playing',
thumbnail=get_thumb("now_playing.png")))
itemlist.append(Item(channel=item.channel, action='genres_menu', title='Series por Generos', type='tv',
itemlist.append(Item(channel=item.channel, action='genres_menu', title=config.get_localized_string(70310), type='tv',
thumbnail=get_thumb("genres.png")))
itemlist.append(
Item(channel=item.channel, action='discover_list', title='Series mas populares', context=context,
Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70311), context=context,
search_type='list',list_type='tv/popular', thumbnail=get_thumb("popular.png")))
itemlist.append(Item(channel=item.channel, action='discover_list', title='Series en emisión', context=context,
itemlist.append(Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70312), context=context,
search_type='list', list_type='tv/on_the_air', thumbnail=get_thumb("on_the_air.png")))
itemlist.append(Item(channel=item.channel, action='discover_list', title='Series mejor valoradas', context=context,
itemlist.append(Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70313), context=context,
search_type='list', list_type='tv/top_rated', thumbnail=get_thumb("top_rated.png")))
@@ -619,7 +619,7 @@ def discover_list(item):
#if not 'similar' in item.list_type:
# itemlist.append(item.clone(title='Pagina Siguente', page=next_page))
#else:
itemlist.append(Item(channel=item.channel, action='discover_list', title='Pagina Siguente',
itemlist.append(Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70065),
search_type=item.search_type, list_type=item.list_type, type=item.type, page=next_page))
return itemlist

View File

@@ -7,7 +7,8 @@
"thumbnail": "https://s22.postimg.cc/nucz720sx/image.png",
"banner": "",
"categories": [
"tvshow"
"tvshow",
"vos"
],
"settings": [
{

View File

@@ -296,16 +296,8 @@ def submenu_tools(item):
#Herramientas de testeo masivo
import os
test_path = os.path.join(config.get_runtime_path(), "channels/test.py")
if filetools.exists(test_path):
itemlist.append(Item(channel=CHANNELNAME, title="Herramientas de Testeo masivo", action="", folder=False,
thumbnail=get_thumb("channels.png")))
itemlist.append(Item(title='- Testear canales ...', channel="test", action="channel_test_selected"))
itemlist.append(Item(title='- Testear servidores ...', channel="test", action="server_test_selected"))
itemlist.append(Item(title='- Testear todos los canales!', channel="test", action="channel_test_all"))
itemlist.append(Item(title='- Testear todos los servidores!', channel="test", action="server_test_all"))
itemlist.append(Item(title='- Testear novedades!', channel="test", action="news_test_all"))
itemlist.append(Item(title='- Upload tests to web!', channel="test", action="web_update_tests"))
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")))
@@ -335,6 +327,9 @@ def conf_tools(item):
# Activar o desactivar canales
if item.extra == "channels_onoff":
if config.get_platform(True)['num_version'] >= 17.0: # A partir de Kodi 16 se puede usar multiselect, y de 17 con preselect
return channels_onoff(item)
import channelselector
from core import channeltools
@@ -537,6 +532,60 @@ def conf_tools(item):
return itemlist
def channels_onoff(item):
import channelselector, xbmcgui
from core import channeltools
# Cargar lista de opciones
# ------------------------
lista = []; ids = []
channels_list = channelselector.filterchannels('allchannelstatus')
for channel in channels_list:
channel_parameters = channeltools.get_channel_parameters(channel.channel)
lbl = '%s' % channel_parameters['language']
# ~ lbl += ' %s' % [config.get_localized_category(categ) for categ in channel_parameters['categories']]
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)
# Diálogo para pre-seleccionar
# ----------------------------
preselecciones = ['Pre-seleccionar activados actualmente', 'Pre-seleccionar todos', 'No pre-seleccionar ninguno']
ret = platformtools.dialog_select(config.get_localized_string(60545), preselecciones)
if ret == -1: return False # pedido cancel
if ret == 2: preselect = []
elif ret == 1: preselect = range(len(ids))
else:
preselect = []
for i, canal in enumerate(ids):
channel_status = config.get_setting('enabled', canal)
if channel_status is None: channel_status = True
if channel_status:
preselect.append(i)
# Diálogo para seleccionar
# ------------------------
ret = xbmcgui.Dialog().multiselect(config.get_localized_string(60545), lista, preselect=preselect, useDetails=True)
if ret == None: return False # pedido cancel
seleccionados = [ids[i] for i in ret]
# Guardar cambios en canales activados
# ------------------------------------
for canal in ids:
channel_status = config.get_setting('enabled', canal)
if channel_status is None: channel_status = True
if channel_status and canal not in seleccionados:
config.set_setting('enabled', False, canal)
elif not channel_status and canal in seleccionados:
config.set_setting('enabled', True, canal)
return False
def channel_status(item, dict_values):
try:
for k in dict_values:

View File

@@ -0,0 +1,54 @@
{
"id": "sonpelishd",
"name": "SonPelisHD",
"active": true,
"adult": false,
"language": ["lat"],
"thumbnail": "https://sonpelishd.com/wp-content/uploads/2017/02/logo-web-sphd-4.png",
"banner": "",
"categories": [
"movie"
],
"settings": [
{
"id": "include_in_global_search",
"type": "bool",
"label": "Incluir en busqueda global",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "include_in_newest_latino",
"type": "bool",
"label": "Incluir en Novedades - Latino",
"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": true,
"enabled": true,
"visible": true
},
{
"id": "include_in_newest_terror",
"type": "bool",
"label": "Incluir en Novedades - Terror",
"default": true,
"enabled": true,
"visible": true
}
]
}

View File

@@ -0,0 +1,353 @@
# -*- coding: utf-8 -*-
# -*- Channel SonPelisHD -*-
# -*- Created for Alfa-addon -*-
# -*- By the Alfa Develop Group -*-
import re
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 = 'https://sonpelishd.com/'
def mainlist(item):
logger.info()
itemlist = []
itemlist.append(item.clone(title="Peliculas",
action="menu_peliculas",
thumbnail=get_thumb('movies', auto=True),
))
# itemlist.append(item.clone(title="Series",
# action="menu_series",
# thumbnail=get_thumb('tvshows', auto=True),
# ))
itemlist.append(item.clone(title="Buscar", action="search",
thumbnail=get_thumb('search', auto=True),
url=host + '?s='
))
return itemlist
def menu_peliculas(item):
logger.info()
itemlist = []
itemlist.append(item.clone(title="Todas",
action="list_all",
thumbnail=get_thumb('all', auto=True),
url=host + 'page/1/?s'
))
itemlist.append(item.clone(title="Generos",
action="seccion",
url=host + 'page/1/?s',
thumbnail=get_thumb('genres', auto=True),
seccion='generos-pelicula'
))
itemlist.append(item.clone(title="Por Año",
action="seccion",
url=host + 'page/1/?s',
thumbnail=get_thumb('year', auto=True),
seccion='fecha-estreno'
))
itemlist.append(item.clone(title="Calidad",
action="seccion",
url=host + 'page/1/?s',
thumbnail=get_thumb('quality', auto=True),
seccion='calidad'
))
return itemlist
def menu_series(item):
logger.info()
itemlist = []
itemlist.append(item.clone(title="Todas",
action="list_all", thumbnail=get_thumb('all', auto=True),
url=host + 'series/page/1/',
))
itemlist.append(item.clone(title="Generos",
action="seccion",
url=host + 'series/page/1/',
thumbnail=get_thumb('genres', auto=True),
seccion='generos-serie'
))
itemlist.append(item.clone(title="Por Año",
action="seccion",
url=host + 'series/page/1/',
thumbnail=get_thumb('year', auto=True),
seccion='series-lanzamiento'
))
return itemlist
def list_all(item):
logger.info()
itemlist = []
data = get_source(item.url)
patron = 'class=item.*?<a href=(.*?)><div class=image.*?<img src=(.*?) alt=(.*?) (?:\(\d{4}|width).*?'
patron += 'fixyear><h2>.*?<\/h2>.*?<span class=year>(.*?)<\/span><\/div>(.*?)<\/div>'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedyear, scrapedquality in matches:
url = scrapedurl
action = 'findvideos'
thumbnail = scrapedthumbnail
plot = ''
contentSerieName = ''
contentTitle = scrapedtitle
title = contentTitle
quality = 'Full HD'
if scrapedquality != '':
quality = scrapertools.find_single_match(scrapedquality, 'calidad2>(.*?)<')
title = contentTitle + ' (%s)' % quality
year = scrapedyear
if 'series' in item.url or 'series' in url:
action = 'seasons'
contentSerieName = contentTitle
quality = ''
new_item = Item(channel=item.channel,
action=action,
title=title,
url=url,
thumbnail=thumbnail,
plot=plot,
quality=quality,
infoLabels={'year': year}
)
if 'series' not in item.url:
new_item.contentTitle = contentTitle
else:
new_item.contentSerieName = contentSerieName
itemlist.append(new_item)
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
# Paginacion
if itemlist != []:
next_page = scrapertools.find_single_match(data,
'<div class=pag_b><a href=(.*?)>Siguiente</a>')
if next_page != '':
itemlist.append(Item(channel=item.channel,
action="list_all",
title='Siguiente >>>',
url=next_page,
))
return itemlist
def seccion(item):
logger.info()
itemlist = []
data = get_source(item.url)
if item.seccion == 'generos-pelicula':
patron = '<li class=cat-item cat-item-.*?><a href=(.*?)>(.*?<\/a> <span>.*?)<\/span><\/li>'
elif item.seccion == 'generos-serie':
patron = '<li class=cat-item cat-item-.*?><a href=(.*?\/series-genero\/.*?)>(.*?<\/a> <span>.*?)<\/span><\/li>'
elif item.seccion in ['fecha-estreno', 'series-lanzamiento']:
patron = '<li><a href=https://sonpelishd.com/fecha-estreno(.*?)>(.*?)<\/a>'
elif item.seccion == 'calidad':
patron = '<li><a href=https://sonpelishd.com/calidad(.*?)>(.*?)<\/a>'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedtitle in matches:
thumbnail = ''
if 'generos' in item.seccion:
cantidad = re.sub(r'.*?<\/a> <span>', '', scrapedtitle)
title = re.sub(r'<\/a> <span>|\d|\.', '', scrapedtitle)
url = scrapedurl
title = scrapertools.decodeHtmlentities(title)
title = title + ' (%s)' % cantidad
elif item.seccion in ['series-lanzamiento', 'fecha-estreno', 'calidad']:
title = scrapedtitle
url = 'https://sonpelishd.com/%s%s' % (item.seccion, scrapedurl)
itemlist.append(item.clone(action='list_all',
title=title,
url=url,
thumbnail=thumbnail
))
return itemlist
def seasons(item):
logger.info()
itemlist = []
data = get_source(item.url)
patron = '<span class=title>.*?- Temporada (.*?)<\/span>'
matches = re.compile(patron, re.DOTALL).findall(data)
for temporada in matches:
title = 'Temporada %s' % temporada
contentSeasonNumber = temporada
item.infoLabels['season'] = contentSeasonNumber
itemlist.append(item.clone(action='episodiosxtemp',
title=title,
contentSeasonNumber=contentSeasonNumber
))
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,
contentSeasonNumber=contentSeasonNumber
))
return itemlist
def episodios(item):
logger.info()
itemlist = []
data = get_source(item.url)
patron = '<li><div class=numerando>(\d+).*?x.*?(\d+)<\/div>.*?<a href=(.*?)> (.*?)<\/a>.*?<\/i>'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedtemp, scrapedep, scrapedurl, scrapedtitle in matches:
temporada = scrapedtemp
title = temporada + 'x%s %s' % (scrapedep, scrapedtitle)
url = scrapedurl
contentEpisodeNumber = scrapedep
item.infoLabels['episode'] = contentEpisodeNumber
itemlist.append(item.clone(action='findvideos',
title=title,
url=url,
contentEpisodeNumber=contentEpisodeNumber,
))
return itemlist
def episodiosxtemp(item):
logger.info()
itemlist = []
data = get_source(item.url)
temporada = item.contentSeasonNumber
patron = '<li><div class=numerando>%s.*?x.*?(\d+)<\/div>.*?<a href=(.*?)> (.*?)<\/a>.*?<\/i>' % temporada
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedep, scrapedurl, scrapedtitle in matches:
title = temporada + 'x%s %s' % (scrapedep, scrapedtitle)
url = scrapedurl
contentEpisodeNumber = scrapedep
item.infoLabels['episode'] = contentEpisodeNumber
itemlist.append(item.clone(action='findvideos',
title=title,
url=url,
contentEpisodeNumber=contentEpisodeNumber,
))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
return itemlist
def findvideos(item):
logger.info()
url_list = []
itemlist = []
duplicados = []
data = get_source(item.url)
src = data
patron = '<iframe src=(.*?) scrolling'
matches = re.compile(patron, re.DOTALL).findall(data)
for url in matches:
lang = 'LAT'
quality = item.quality
title = '[%s] [%s]'
if url != '':
itemlist.append(item.clone(title=title, url=url, action='play', language=lang))
itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % (i.server, i.language))
if item.infoLabels['mediatype'] == 'movie':
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
def search(item, texto):
logger.info()
texto = texto.replace(" ", "+")
item.url = item.url + texto
try:
if texto != '':
return list_all(item)
else:
return []
except:
import sys
for line in sys.exc_info():
logger.error("%s" % line)
return []
def newest(categoria):
logger.info()
itemlist = []
item = Item()
try:
if categoria in ['peliculas', 'latino']:
item.url = host + 'page/1/?s'
elif categoria == 'infantiles':
item.url = host + 'category/animacion/'
elif categoria == 'terror':
item.url = host + 'category/terror/'
itemlist = list_all(item)
if itemlist[-1].title == 'Siguiente >>>':
itemlist.pop()
except:
import sys
for line in sys.exc_info():
logger.error("{0}".format(line))
return []
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

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{
"id": "zentorrents",
"name": "Zentorrent",
"active": true,
"active": false,
"adult": false,
"language": ["cast"],
"banner": "zentorrents.png",

View File

@@ -63,11 +63,6 @@ def getchanneltypes(view="thumb_"):
# Lista de categorias
channel_types = ["movie", "tvshow", "anime", "documentary", "vos", "direct", "torrent"]
dict_types_lang = {'movie': config.get_localized_string(30122), 'tvshow': config.get_localized_string(30123),
'anime': config.get_localized_string(30124), 'documentary': config.get_localized_string(30125),
'vos': config.get_localized_string(30136), 'adult': config.get_localized_string(30126),
'direct': config.get_localized_string(30137)}
if config.get_setting("adult_mode") != 0:
channel_types.append("adult")
@@ -83,7 +78,7 @@ def getchanneltypes(view="thumb_"):
for channel_type in channel_types:
logger.info("channel_type=%s" % channel_type)
title = dict_types_lang.get(channel_type, channel_type)
title = config.get_localized_category(channel_type)
itemlist.append(Item(title=title, channel="channelselector", action="filterchannels", category=title,
channel_type=channel_type, viewmode="thumbnails",
thumbnail=get_thumb("channels_%s.png" % channel_type, view)))

View File

@@ -1541,8 +1541,15 @@ class Tmdb(object):
else:
ret_infoLabels['plot'] = self.get_sinopsis()
elif k == 'runtime':
elif k == 'runtime': #Duration for movies
ret_infoLabels['duration'] = int(v) * 60
elif k == 'episode_run_time': #Duration for episodes
try:
for v_alt in v: #It comes as a list (?!)
ret_infoLabels['duration'] = int(v_alt) * 60
except:
pass
elif k == 'release_date':
ret_infoLabels['year'] = int(v[:4])

View File

@@ -73,7 +73,7 @@ def find_and_set_infoLabels(item):
p_dialog = None
if not item.contentSeason:
p_dialog = platformtools.dialog_progress_bg("Buscando información de la serie", "Espere por favor...")
p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(60296), config.get_localized_string(60293))
global otvdb_global
tvdb_result = None
@@ -95,17 +95,17 @@ def find_and_set_infoLabels(item):
otvdb_global = Tvdb(tvdb_id=item.infoLabels['tvdb_id'])
if not item.contentSeason:
p_dialog.update(50, "Buscando información de la serie", "Obteniendo resultados...")
p_dialog.update(50, config.get_localized_string(60296), config.get_localized_string(60295))
results, info_load = otvdb_global.get_list_results()
logger.debug("results es %s" % results)
if not item.contentSeason:
p_dialog.update(100, "Buscando información de la serie", "Encontrados %s posibles coincidencias" % len(results))
p_dialog.update(100, config.get_localized_string(60296), config.get_localized_string(60297) % len(results))
p_dialog.close()
if len(results) > 1:
tvdb_result = platformtools.show_video_info(results, item=item, scraper=Tvdb,
caption="[%s]: Selecciona la serie correcta" % title)
caption=config.get_localized_string(60298) % title)
elif len(results) > 0:
tvdb_result = results[0]
@@ -344,8 +344,8 @@ class Tvdb:
self.__get_by_id(kwargs.get('tvdb_id', ''))
if not self.list_results and config.get_setting("tvdb_retry_eng", "videolibrary"):
from platformcode import platformtools
platformtools.dialog_notification("No se ha encontrado en idioma '%s'" % DEFAULT_LANG,
"Se busca en idioma 'en'", sound=False)
platformtools.dialog_notification(config.get_localized_string(60299) % DEFAULT_LANG,
config.get_localized_string(60302), sound=False)
self.__get_by_id(kwargs.get('tvdb_id', ''), "en")
self.lang = "en"
@@ -354,8 +354,8 @@ class Tvdb:
self.__search(kwargs.get('search', ''), kwargs.get('imdb_id', ''), kwargs.get('zap2it_id', ''))
if not self.list_results and config.get_setting("tvdb_retry_eng", "videolibrary"):
from platformcode import platformtools
platformtools.dialog_notification("No se ha encontrado en idioma '%s'" % DEFAULT_LANG,
"Se busca en idioma 'en'")
platformtools.dialog_notification(config.get_localized_string(60299) % DEFAULT_LANG,
config.get_localized_string(60302))
self.__search(kwargs.get('search', ''), kwargs.get('imdb_id', ''), kwargs.get('zap2it_id', ''), "en")
self.lang = "en"
@@ -365,7 +365,7 @@ class Tvdb:
buscando = kwargs.get('tvdb_id', '')
else:
buscando = kwargs.get('search', '')
msg = "La busqueda de %s no dio resultados." % buscando
msg = config.get_localized_string(70266) % buscando
logger.debug(msg)
@classmethod

View File

@@ -545,9 +545,9 @@ def add_movie(item):
#Si se cancela la segunda pantalla, la variable "scraper_return" estará en False. El usuario no quiere seguir
from lib import generictools
generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
if item.tmdb_stat:
del item.tmdb_stat #Limpiamos el status para que no se grabe en la Videoteca
item = generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
#if item.tmdb_stat:
# del item.tmdb_stat #Limpiamos el status para que no se grabe en la Videoteca
new_item = item.clone(action="findvideos")
insertados, sobreescritos, fallidos = save_movie(new_item)
@@ -613,9 +613,9 @@ def add_tvshow(item, channel=None):
#Si se cancela la segunda pantalla, la variable "scraper_return" estará en False. El usuario no quiere seguir
from lib import generictools
generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
if item.tmdb_stat:
del item.tmdb_stat #Limpiamos el status para que no se grabe en la Videoteca
item = generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
#if item.tmdb_stat:
# del item.tmdb_stat #Limpiamos el status para que no se grabe en la Videoteca
# Obtiene el listado de episodios
itemlist = getattr(channel, item.action)(item)

View File

@@ -20,7 +20,7 @@ from core import servertools
from core import channeltools
from core import filetools
from core.item import Item
from platformcode import config, logger
from platformcode import config, logger, platformtools
from core import tmdb
channel_py = "newpct1"
@@ -69,25 +69,42 @@ def update_title(item):
if item.from_action:
item.action = item.from_action
del item.from_action
if item.from_title:
item.title = item.from_title
del item.from_title
elif item.contentType != "movie":
item.add_videolibrary = True #Estamos Añadiendo a la Videoteca. Indicador para control de uso de los Canales
if item.contentType == "movie":
if item.channel == channel_py: #Si es una peli de NewPct1, ponemos el nombre del clone
item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
if item.channel_host: #Borramos ya el indicador para que no se guarde en la Videoteca
del item.channel_host
if item.contentTitle:
item.contentTitle = re.sub(r' -%s-' % item.category, '', item.contentTitle)
item.title = re.sub(r' -%s-' % item.category, '', item.title)
if item.from_update:
if item.from_title_tmdb: #Si se salvó el título del contenido devuelto por TMDB, se restaura.
item.title = item.from_title_tmdb
else:
item.add_videolibrary = True #Estamos Añadiendo a la Videoteca. Indicador para control de uso de los Canales
if item.add_videolibrary:
if item.contentType == "movie":
if item.from_title_tmdb: #Si se salvó el título del contenido devuelto por TMDB, se restaura.
item.title = item.from_title_tmdb
del item.add_videolibrary
if item.channel_host: #Borramos ya el indicador para que no se guarde en la Videoteca
del item.channel_host
if item.contentTitle:
item.contentTitle = re.sub(r' -%s-' % item.category, '', item.contentTitle)
item.title = re.sub(r' -%s-' % item.category, '', item.title)
if item.contentType == 'movie':
from_title_tmdb = item.contentTitle
else:
from_title_tmdb = item.contentSerieName
#Sólo ejecutamos este código si no se ha hecho antes en el Canal. Por ejemplo, si se ha llamado desde Episodios,
#Sólo ejecutamos este código si no se ha hecho antes en el Canal. Por ejemplo, si se ha llamado desde Episodios o Findvideos,
#ya no se ejecutará al Añadia a Videoteca, aunque desde el canal se podrá llamar tantas veces como se quiera,
#o hasta que encuentre un título no ambiguo
if not item.tmdb_stat:
if item.tmdb_stat:
if item.from_title_tmdb: del item.from_title_tmdb
if item.from_title: del item.from_title
item.from_update = True
del item.from_update
if item.contentType == "movie":
if item.channel == channel_py: #Si es una peli de NewPct1, ponemos el nombre del clone
item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
else:
new_item = item.clone() #Salvamos el Item inicial para restaurarlo si el usuario cancela
if item.contentType == "movie":
if item.channel == channel_py: #Si es una peli de NewPct1, ponemos el nombre del clone
item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
#Borramos los IDs y el año para forzar a TMDB que nos pregunte
if item.infoLabels['tmdb_id'] or item.infoLabels['tmdb_id'] == None: item.infoLabels['tmdb_id'] = ''
if item.infoLabels['tvdb_id'] or item.infoLabels['tvdb_id'] == None: item.infoLabels['tvdb_id'] = ''
@@ -95,6 +112,16 @@ def update_title(item):
if item.infoLabels['season']: del item.infoLabels['season'] #Funciona mal con num. de Temporada. Luego lo restauramos
item.infoLabels['year'] = '-'
if item.from_title:
if item.from_title_tmdb:
if scrapertools.find_single_match(item.from_title_tmdb, '^(?:\[COLOR \w+\])?(.*?)(?:\[)'):
from_title_tmdb = scrapertools.find_single_match(item.from_title_tmdb, '^(?:\[COLOR \w+\])?(.*?)(?:\[)').strip()
item.title = item.title.replace(from_title_tmdb, item.from_title)
item.infoLabels['title'] = item.from_title
if item.from_title_tmdb: del item.from_title_tmdb
if not item.from_update and item.from_title: del item.from_title
if item.contentSerieName: #Copiamos el título para que sirva de referencia en menú "Completar Información"
item.infoLabels['originaltitle'] = item.contentSerieName
item.contentTitle = item.contentSerieName
@@ -109,57 +136,67 @@ def update_title(item):
#Si el usuario ha cambiado los datos en "Completar Información" hay que ver el título definitivo en TMDB
if not item.infoLabels['tmdb_id']:
if item.contentSerieName:
item.contentSerieName = item.contentTitle #Se pone título nuevo
item.infoLabels['noscrap_id'] = '' #Se resetea, por si acaso
item.infoLabels['year'] = '-' #Se resetea, por si acaso
scraper_return = scraper.find_and_set_infoLabels(item) #Se intenta de nuevo
item.contentSerieName = item.contentTitle #Se pone título nuevo
item.infoLabels['noscrap_id'] = '' #Se resetea, por si acaso
item.infoLabels['year'] = '-' #Se resetea, por si acaso
scraper_return = scraper.find_and_set_infoLabels(item) #Se intenta de nuevo
#Parece que el usuario ha cancelado de nuevo. Restituimos los datos a la situación inicial
if not scraper_return or not item.infoLabels['tmdb_id']:
item = new_item.clone()
else:
item.tmdb_stat = True #Marcamos Item como procesado correctamente por TMDB (pasada 2)
item.tmdb_stat = True #Marcamos Item como procesado correctamente por TMDB (pasada 2)
else:
item.tmdb_stat = True #Marcamos Item como procesado correctamente por TMDB (pasada 1)
item.tmdb_stat = True #Marcamos Item como procesado correctamente por TMDB (pasada 1)
#Si el usuario ha seleccionado una opción distinta o cambiado algo, ajustamos los títulos
if item.contentType != 'movie' or item.from_update:
item.channel = new_item.channel #Restuaramos el nombre del canal, por si lo habíamos cambiado
if item.tmdb_stat == True:
if new_item.contentSerieName: #Si es serie...
if config.get_setting("filter_languages", item.channel) >= 0:
item.title_from_channel = new_item.contentSerieName #Guardo el título incial para Filtertools
item.contentSerieName = new_item.contentSerieName #Guardo el título incial para Filtertools
else:
item.title = item.title.replace(new_item.contentSerieName, item.contentTitle)
item.title = item.title.replace(new_item.contentSerieName, item.contentTitle).replace(from_title_tmdb, item.contentTitle)
item.contentSerieName = item.contentTitle
if new_item.contentSeason: item.contentSeason = new_item.contentSeason #Restauramos Temporada
if item.infoLabels['title']: del item.infoLabels['title'] #Borramos título de peli (es serie)
else: #Si es película...
item.title = item.title.replace(new_item.contentTitle, item.contentTitle)
if new_item.infoLabels['year']: #Actualizamos el Año en el título
else: #Si es película...
item.title = item.title.replace(new_item.contentTitle, item.contentTitle).replace(from_title_tmdb, item.contentTitle)
if new_item.infoLabels['year']: #Actualizamos el Año en el título
item.title = item.title.replace(str(new_item.infoLabels['year']), str(item.infoLabels['year']))
if new_item.infoLabels['rating']: #Actualizamos en Rating en el título
rating_old = ''
if new_item.infoLabels['rating'] and new_item.infoLabels['rating'] != '0.0':
rating_old = float(new_item.infoLabels['rating'])
rating_old = round(rating_old, 1)
rating_new = ''
if item.infoLabels['rating'] and item.infoLabels['rating'] != '0.0':
rating_new = float(item.infoLabels['rating'])
rating_new = round(rating_new, 1)
item.title = item.title.replace("[" + str(rating_old) + "]", "[" + str(rating_new) + "]")
if item.wanted: #Actualizamos Wanted, si existe
if new_item.infoLabels['rating']: #Actualizamos en Rating en el título
try:
rating_old = ''
if new_item.infoLabels['rating'] and new_item.infoLabels['rating'] != '0.0':
rating_old = float(new_item.infoLabels['rating'])
rating_old = round(rating_old, 1)
rating_new = ''
if item.infoLabels['rating'] and item.infoLabels['rating'] != '0.0':
rating_new = float(item.infoLabels['rating'])
rating_new = round(rating_new, 1)
item.title = item.title.replace("[" + str(rating_old) + "]", "[" + str(rating_new) + "]")
except:
pass
if item.wanted: #Actualizamos Wanted, si existe
item.wanted = item.contentTitle
if new_item.contentSeason: #Restauramos el núm. de Temporada después de TMDB
if new_item.contentSeason: #Restauramos el núm. de Temporada después de TMDB
item.contentSeason = new_item.contentSeason
if item.from_update:
item.from_update = True
del item.from_update
platformtools.itemlist_update(item)
#Para evitar el "efecto memoria" de TMDB, se le llama con un título ficticio para que resetee los buffers
if item.contentSerieName:
new_item.infoLabels['tmdb_id'] = '289' #una serie no ambigua
new_item.infoLabels['tmdb_id'] = '289' #una serie no ambigua
else:
new_item.infoLabels['tmdb_id'] = '111' #una peli no ambigua
new_item.infoLabels['tmdb_id'] = '111' #una peli no ambigua
new_item.infoLabels['year'] = '-'
if new_item.contentSeason:
del new_item.infoLabels['season'] #Funciona mal con num. de Temporada
del new_item.infoLabels['season'] #Funciona mal con num. de Temporada
scraper_return = scraper.find_and_set_infoLabels(new_item)
#logger.debug(item)
@@ -241,10 +278,16 @@ def post_tmdb_listado(item, itemlist):
item_local.title_subs = []
del item_local.title_subs
if item_local.from_title:
if item_local.contentType == 'movie':
item_local.contentTitle = item_local.from_title
else:
item_local.contentSerieName = item_local.from_title
#Preparamos el Rating del vídeo
rating = ''
try:
if item_local.infoLabels['rating'] and item_local.infoLabels['rating'] != '0.0':
if item_local.infoLabels['rating'] and item_local.infoLabels['rating'] != 0.0:
rating = float(item_local.infoLabels['rating'])
rating = round(rating, 1)
except:
@@ -502,7 +545,7 @@ def post_tmdb_episodios(item, itemlist):
#Preparamos el Rating del vídeo
rating = ''
try:
if item_local.infoLabels['rating'] and item_local.infoLabels['rating'] != '0.0':
if item_local.infoLabels['rating'] and item_local.infoLabels['rating'] != 0.0:
rating = float(item_local.infoLabels['rating'])
rating = round(rating, 1)
except:
@@ -572,7 +615,7 @@ def post_tmdb_episodios(item, itemlist):
logger.error("ERROR 07: EPISODIOS: Num de Temporada fuera de rango " + " / TEMPORADA: " + str(item_local.contentSeason) + " / " + str(item_local.contentEpisodeNumber) + " / MAX_TEMPORADAS: " + str(num_temporada_max) + " / LISTA_TEMPORADAS: " + str(num_episodios_lista))
#Permitimos la actualización de los títulos, bien para uso inmediato, o para añadir a la videoteca
itemlist.append(item.clone(title="** [COLOR yelow]Actualizar Títulos - vista previa videoteca[/COLOR] **", action="actualizar_titulos", tmdb_stat=False, from_action=item.action, from_title=item.title))
itemlist.append(item.clone(title="** [COLOR yelow]Actualizar Títulos - vista previa videoteca[/COLOR] **", action="actualizar_titulos", tmdb_stat=False, from_action=item.action, from_title_tmdb=item.title, from_update=True))
#Borro num. Temporada si no viene de menú de Añadir a Videoteca y no está actualizando la Videoteca
if not item.library_playcounts: #si no está actualizando la Videoteca
@@ -716,7 +759,7 @@ def post_tmdb_findvideos(item, itemlist):
rating = '' #Ponemos el rating
try:
if item.infoLabels['rating'] and item.infoLabels['rating'] != '0.0':
if item.infoLabels['rating'] and item.infoLabels['rating'] != 0.0:
rating = float(item.infoLabels['rating'])
rating = round(rating, 1)
except:
@@ -733,15 +776,18 @@ def post_tmdb_findvideos(item, itemlist):
elif item.contentChannel == 'videolibrary': #No hay, viene de la Videoteca? buscamos en la DB
#Leo de la BD de Kodi la duración de la película o episodio. En "from_fields" se pueden poner las columnas que se quiera
nun_records = 0
if item.contentType == 'movie':
nun_records, records = get_field_from_kodi_DB(item, from_fields='c11') #Leo de la BD de Kodi la duración de la película
else:
nun_records, records = get_field_from_kodi_DB(item, from_fields='c09') #Leo de la BD de Kodi la duración del episodio
try:
if item.contentType == 'movie':
nun_records, records = get_field_from_kodi_DB(item, from_fields='c11') #Leo de la BD de Kodi la duración de la película
else:
nun_records, records = get_field_from_kodi_DB(item, from_fields='c09') #Leo de la BD de Kodi la duración del episodio
except:
pass
if nun_records > 0: #Hay registros?
#Es un array, busco el campo del registro: añadir en el FOR un fieldX por nueva columna
for strFileName, field1 in records:
tiempo = field1
try: #calculamos el timepo en hh:mm
tiempo_final = int(tiempo) #lo convierto a int, pero puede se null
if tiempo_final > 0: #Si el tiempo está a 0, pasamos
@@ -749,7 +795,8 @@ def post_tmdb_findvideos(item, itemlist):
tiempo_final = tiempo_final / 60 #Lo transformo a minutos
horas = tiempo_final / 60 #Lo transformo a horas
resto = tiempo_final - (horas * 60) #guardo el resto de minutos de la hora
item.quality += ' [%s:%s]' % (str(horas).zfill(2), str(resto).zfill(2)) #Lo agrego a Calidad del Servidor
if not scrapertools.find_single_match(item.quality, '(\[\d+:\d+\])'): #si ya tiene la duración, pasamos
item.quality += ' [%s:%s]' % (str(horas).zfill(2), str(resto).zfill(2)) #Lo agrego a Calidad del Servidor
except:
pass
@@ -768,7 +815,7 @@ def post_tmdb_findvideos(item, itemlist):
title = '%s al %s - ' % (title, scrapertools.find_single_match(item.title, 'al (\d+)'))
else:
title = '%s %s' % (title, item.infoLabels['episodio_titulo']) #Título Episodio
title_gen = '%s, %s [COLOR yellow][%s][/COLOR] [%s] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR] [%s]' % (title, item.contentSerieName, item.infoLabels['year'], rating, item.quality, str(item.language), scrapertools.find_single_match(item.title, '\s\[(\d+,?\d*?\s\w[b|B])\]')) #Rating, Calidad, Idioma, Tamaño
title_gen = '%s, %s [COLOR yellow][%s][/COLOR] [%s] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR] [%s]' % (title, item.contentSerieName, item.infoLabels['year'], rating, item.quality, str(item.language), scrapertools.find_single_match(item.title, '\s\[(\d+,?\d*?\s\w[b|B])\]')) #Rating, Calidad, Idioma, Tamaño
if item.infoLabels['status'] and item.infoLabels['status'].lower() == "ended":
title_gen = '[TERM.] %s' % title_gen #Marca cuando la Serie está terminada y no va a haber más producción
item.title = title_gen
@@ -803,8 +850,11 @@ def post_tmdb_findvideos(item, itemlist):
itemlist.append(item.clone(action="", server = "", title=title_gen)) #Título con todos los datos del vídeo
#agregamos la opción de Añadir a Videoteca para péliculas (no series)
if item.contentType == 'movie' and item.contentChannel != "videolibrary":
itemlist.append(item.clone(title="**-[COLOR yellow] Añadir a la videoteca [/COLOR]-**", action="add_pelicula_to_library", extra="películas", from_title=title_videoteca))
if item.contentType == 'movie' and item.contentChannel != "videolibrary":
#Permitimos la actualización de los títulos, bien para uso inmediato, o para añadir a la videoteca
itemlist.append(item.clone(title="** [COLOR yelow]Actualizar Títulos - vista previa videoteca[/COLOR] **", action="actualizar_titulos", extra="películas", tmdb_stat=False, from_action=item.action, from_title_tmdb=item.title, from_update=True))
itemlist.append(item.clone(title="**-[COLOR yellow] Añadir a la videoteca [/COLOR]-**", action="add_pelicula_to_library", extra="películas", from_action=item.action, from_title_tmdb=item.title))
#Añadimos la opción de ver trailers
if item.contentChannel != "videolibrary":
@@ -833,11 +883,16 @@ def get_field_from_kodi_DB(item, from_fields='*', files='file'):
FOLDER_MOVIES = config.get_setting("folder_movies")
FOLDER_TVSHOWS = config.get_setting("folder_tvshows")
VIDEOLIBRARY_PATH = config.get_videolibrary_config_path()
VIDEOLIBRARY_REAL_PATH = config.get_videolibrary_path()
if item.contentType == 'movie': #Agrego la carpeta correspondiente al path de la Videoteca
path = filetools.join(VIDEOLIBRARY_PATH, FOLDER_MOVIES)
path = filetools.join(VIDEOLIBRARY_REAL_PATH, FOLDER_MOVIES)
path2 = filetools.join(VIDEOLIBRARY_PATH, FOLDER_MOVIES)
folder = FOLDER_MOVIES
else:
path = filetools.join(VIDEOLIBRARY_PATH, FOLDER_TVSHOWS)
path = filetools.join(VIDEOLIBRARY_REAL_PATH, FOLDER_TVSHOWS)
path2 = filetools.join(VIDEOLIBRARY_PATH, FOLDER_TVSHOWS)
folder = FOLDER_TVSHOWS
raiz, carpetas, ficheros = filetools.walk(path).next() #listo las series o películas en la Videoteca
carpetas = [filetools.join(path, f) for f in carpetas] #agrego la carpeta del contenido al path
@@ -845,10 +900,11 @@ def get_field_from_kodi_DB(item, from_fields='*', files='file'):
if item.contentType == 'movie' and (item.contentTitle.lower() in carpeta or item.contentTitle in carpeta): #Películas?
path = carpeta #Almacenamos la carpeta en el path
break
elif item.contentType in ['tvshow', 'season', 'episode'] and (item.contentSerieName.lower() in carpeta or item.contentSerieName in carpeta): #Series?
elif item.contentType in ['tvshow', 'season', 'episode'] and (item.contentSerieName.lower() in carpeta or item.contentSerieName in carpeta): #Series?
path = carpeta #Almacenamos la carpeta en el path
break
path2 += '/%s/' % scrapertools.find_single_match(path, '%s.(.*?\s\[.*?\])' % folder) #Agregamos la carpeta de la Serie o Películas, formato Android
file_search = '%' #Por defecto busca todos los archivos de la carpeta
if files == 'file': #Si se ha pedido son un archivo (defecto), se busca
if item.contentType == 'episode': #Si es episodio, se pone el nombre, si no de deja %
@@ -865,7 +921,7 @@ def get_field_from_kodi_DB(item, from_fields='*', files='file'):
else:
contentType = "movie_view" #Marco la tabla de BBDD de Kodi Video
path1 = path.replace("\\\\", "\\") #para la SQL solo necesito la carpeta
path2 = path.replace("\\", "/") #Formato no Windows
path2 = path2.replace("\\", "/") #Formato no Windows
#Ejecutmos la sentencia SQL
if not from_fields:
@@ -1105,7 +1161,8 @@ def web_intervenida(item, data, desactivar=True):
#Guardamos los cambios hechos en el .json
try:
if item.channel != channel_py:
disabled = config.set_setting('enabled', False, item.channel)
disabled = config.set_setting('enabled', False, item.channel) #Desactivamos el canal
disabled = config.set_setting('include_in_global_search', False, item.channel) #Lo sacamos de las búquedas globales
channel_path = filetools.join(config.get_runtime_path(), "channels", item.channel + ".json")
with open(channel_path, 'w') as outfile: #Grabamos el .json actualizado
json.dump(json_data, outfile, sort_keys = True, indent = 2, ensure_ascii = False)

View File

@@ -299,6 +299,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_config_path():
value = get_setting("videolibrarypath")

View File

@@ -59,6 +59,10 @@ def dialog_select(heading, _list):
return xbmcgui.Dialog().select(heading, _list)
def dialog_multiselect(heading, _list, autoclose=0, preselect=[], useDetails=False):
return xbmcgui.Dialog().multiselect(heading, _list, autoclose=autoclose, preselect=preselect, useDetails=useDetails)
def dialog_progress(heading, line1, line2=" ", line3=" "):
dialog = xbmcgui.DialogProgress()
dialog.create(heading, line1, line2, line3)
@@ -496,19 +500,6 @@ def set_context_commands(item, parent_item):
(sys.argv[0], item.clone(channel="favorites", action="addFavourite",
from_channel=item.channel,
from_action=item.action).tourl())))
#Herramientas de desarrollador
from core import filetools
test_path = os.path.join(config.get_runtime_path(), "channels/test.py")
if parent_item.action == 'filterchannels' and item.action == 'mainlist' and filetools.exists(test_path):
channel_parameters = channeltools.get_channel_parameters(item.channel)
context_commands.append(("TESTEAR ESTE CANAL",
"XBMC.RunPlugin(%s?%s)" %
(sys.argv[0],
Item(channel='test', action='channel_test',
config=channel_parameters['channel']).tourl())))
# Buscar en otros canales
if item.contentType in ['movie', 'tvshow'] and item.channel != 'search':
@@ -522,7 +513,6 @@ def set_context_commands(item, parent_item):
item.clone(channel='search',
action="do_search",
from_channel=item.channel,
contextual=True).tourl())))
if item.contentType == 'tvshow':
mediatype = 'tv'
@@ -606,7 +596,6 @@ def set_context_commands(item, parent_item):
"XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(channel='side_menu',
action="open_menu",
parent=parent_item.tourl()).tourl(
))))
return context_commands

View File

@@ -3867,4 +3867,414 @@ msgstr " "
msgctxt "#70291"
msgid "Error, during conversion"
msgstr ""
# Servers ----
msgctxt "#70292"
msgid "[%s] File no longer exist on this server."
msgstr ""
msgctxt "#70293"
msgid "[%s] The file is processing or has been deleted."
msgstr ""
msgctxt "#70294"
msgid "[%s] Link Not valid."
msgstr ""
msgctxt "#70295"
msgid "[%s] Premium account needed."
msgstr ""
msgctxt "#70296"
msgid "[%s] Internal server error."
msgstr ""
msgctxt "#70297"
msgid "[%s] File is awaiting for moderation."
msgstr ""
msgctxt "#70298"
msgid "[%s] The number of allowed reproductions has been exceeded."
msgstr ""
msgctxt "#70299"
msgid "[%s] You do not have permission to access this file."
msgstr ""
msgctxt "#70300"
msgid "[%s] Too many connections to the server, try later."
msgstr ""
msgctxt "#70301"
msgid "[%s] File deleted for infringement."
msgstr ""
msgctxt "#70302"
msgid "[%s] This server only works from Kodi 17."
msgstr ""
msgctxt "#70303"
msgid "[%s] This server does not work with your version of Plex, try to update it."
msgstr ""
msgctxt "#70304"
msgid "[%s] This server requires updating python to version 2.7.9 or higher."
msgstr ""
# ============
msgctxt "#70305"
msgid "Search in channels"
msgstr ""
msgctxt "#70306"
msgid "Movies by Genre"
msgstr ""
msgctxt "#70307"
msgid "Most popular Movies"
msgstr ""
msgctxt "#70308"
msgid "Top rated Movies"
msgstr ""
msgctxt "#70309"
msgid "Movies Now in Theatres "
msgstr ""
msgctxt "#70310"
msgid "Series by Genre"
msgstr ""
msgctxt "#70311"
msgid "Series most polupar"
msgstr ""
msgctxt "#70312"
msgid "Series in progress"
msgstr ""
msgctxt "#70313"
msgid "Top rated Series"
msgstr ""
msgctxt "#70314"
msgid "Actors/Actresses"
msgstr ""
msgctxt "#70315"
msgid "Recommendations"
msgstr ""
msgctxt "#70316"
msgid "List of Images"
msgstr ""
msgctxt "#70317"
msgid "Listen to BSO - List of songs"
msgstr ""
msgctxt "#70318"
msgid "Manage yor trakt account"
msgstr ""
msgctxt "#70319"
msgid "Filming equipment"
msgstr ""
msgctxt "#70320"
msgid "Filter search"
msgstr ""
msgctxt "#70321"
msgid "[MAL] Add to your lists/%s"
msgstr ""
msgctxt "#70322"
msgid "[MAL] in your list of [COLOR %s]%s[/COLOR] Do you want to change?/%s"
msgstr ""
msgctxt "#70323"
msgid "[Trakt] Manage your account"
msgstr ""
msgctxt "#70324"
msgid "[FA] My vote: %s ---> Change?"
msgstr ""
msgctxt "#70325"
msgid "[FA] Vote %s"
msgstr ""
msgctxt "#70326"
msgid "[FA] Add or remove from a user list"
msgstr ""
msgctxt "#70327"
msgid "It's part of: %s"
msgstr ""
msgctxt "#70328"
msgid "%ss similarar"
msgstr ""
msgctxt "#70329"
msgid "User and/or passwords not configured"
msgstr ""
msgctxt "#70330"
msgid "Error in the user and/or password. Check your credentials"
msgstr ""
msgctxt "#70331"
msgid "Error during login. Check your credentials
msgstr ""
msgctxt "#70332"
msgid "My votes"
msgstr ""
msgctxt "#70333"
msgid "Add new list"
msgstr ""
msgctxt "#70334"
msgid "Action completed successfully"
msgstr ""
msgctxt "#70335"
msgid "Error, something has failed during the process"
msgstr ""
msgctxt "#70336"
msgid "Vote %s"
msgstr ""
msgctxt "#70337"
msgid "Vote completed successfully"
msgstr ""
msgctxt "#70338"
msgid "List created correctly"
msgstr ""
msgctxt "#70339"
msgid "Fanart.tv website not available. Retry"
msgstr ""
msgctxt "#70340"
msgid "No images available"
msgstr ""
msgctxt "#70341"
msgid "[Trakt] Mark %s as not seen"
msgstr ""
msgctxt "#70342"
msgid "[Trakt] Mark %s as seen"
msgstr ""
msgctxt "#70343"
msgid "[Trakt] Remove %s from your watchlist"
msgstr ""
msgctxt "#70344"
msgid "Add to %s your watchlist""
msgstr ""
msgctxt "#70345"
msgid "[Trakt] Remove %s from your collection"
msgstr ""
msgctxt "#70346"
msgid "[Trakt] Add %s to your collection
msgstr ""
msgctxt "#70347"
msgid "Action performed correctly"
msgstr ""
msgctxt "#70348"
msgid "An error occurred in process"
msgstr "Hubo error en el proceso"
msgctxt "#70349"
msgid "List sorted by %s. Change order?"
msgstr ""
msgctxt "#70350"
msgid "Search in alfa: %s"
msgstr ""
msgctxt "#70351"
msgid " Search alternative title: %s"
msgstr ""
msgctxt "#70352"
msgid " Search title in english: %s"
msgstr ""
msgctxt "#70353"
msgid "Vídeos (Episodes, Trailers...)"
msgstr ""
msgctxt "#70354"
msgid "Characters/Staff"
msgstr ""
msgctxt "#70355"
msgid "Prequel: %s"
msgstr ""
msgctxt "#70356"
msgid "Sequel: %s"
msgstr ""
msgctxt "#70357"
msgid "Alternative version: %s"
msgstr ""
msgctxt "#70358"
msgid "Recommendations TMDB"
msgstr ""
msgctxt "#70359"
msgid "Recommendations MyAnimeList"
msgstr ""
msgctxt "#70360"
msgid " [COLOR %s][Without subs in castellan][/COLOR]"
msgstr ""
msgctxt "#70361"
msgid ">> More Episodes"
msgstr ""
msgctxt "#70362"
msgid "Episodes"
msgstr ""
msgctxt "#70363"
msgid "Trailers/Promotions"
msgstr ""
msgctxt "#70364"
msgid "Winter"
msgstr ""
msgctxt "#70365"
msgid "Spring"
msgstr ""
msgctxt "#70366"
msgid "Summer"
msgstr ""
msgctxt "#70367"
msgid "Fall"
msgstr ""
msgctxt "#70368"
msgid "(New)"
msgstr ""
msgctxt "#70369"
msgid "(Continuation)"
msgstr ""
msgctxt "#70370"
msgid "Characters/Benders"
msgstr ""
msgctxt "#70371"
msgid "Principal"
msgstr ""
msgctxt "#70372"
msgid "Secondary"
msgstr ""
msgctxt "#70373"
msgid "Animes where it appears:"
msgstr ""
msgctxt "#70374"
msgid "Give voice to/in:"
msgstr ""
msgctxt "#70375"
msgid "Staff in animes:"
msgstr ""
msgctxt "#70376"
msgid "Info in AniDB [COLOR %s]%s[/COLOR]"
msgstr ""
msgctxt "#70377"
msgid " - [COLOR %s]Fansubs in spanish:[/COLOR]"
msgstr ""
msgctxt "#70378"
msgid "Complete"
msgstr ""
msgctxt "#70379"
msgid "Finished"
msgstr ""
msgctxt "#70380"
msgid "Stalled"
msgstr ""
msgctxt "#70381"
msgid "Dropped"
msgstr ""
msgctxt "#70381"
msgid "Myanimelist username and/or password blank"
msgstr ""
msgctxt "#70382"
msgid "Currently watching"
msgstr ""
msgctxt "#70383"
msgid "Completed"
msgstr ""
msgctxt "#70384"
msgid "Pause"
msgstr ""
msgctxt "#70385"
msgid "Descarted"
msgstr ""
msgctxt "#70386"
msgid "See later"
msgstr ""
msgctxt "#70387"
msgid "E = In emission | F = Completed | P = Coming soon"
msgstr ""
msgctxt "#70388"
msgid ". Available actions:"
msgstr ""
msgctxt "#70389"
msgid ". In your list [COLOR %s]%s[/COLOR]"
msgstr ""
msgctxt "#70390"
msgid "Anime: %s%s"
msgstr ""
msgctxt "#70391"
msgid "Add to list %s"
msgstr ""
msgctxt "#70392"
msgid "Rate with a [COLOR %s]%s[/ COLOR]"
msgstr ""

View File

@@ -2535,10 +2535,10 @@ msgstr " Attendere finchè la serie sia aggiunta"
msgctxt "#60642"
msgid "Show option \"All Seasons\"."
msgstr "Mostra l'opzione \"Tutte le stagioni\""
msgstr "Mostra l'opzione \'Tutte le stagioni\'"
msgctxt "#60643"
msgid "Do not combine the seasons of the series""
msgid "Do not combine the seasons of the series"
msgstr "Non unire le stagioni delle serie"
msgctxt "#60644"
@@ -2967,7 +2967,7 @@ msgstr ">> Pagina successiva"
msgctxt "#70066"
msgid " Search title in spanish: %s"
msgstr "Cerca il suo titolo in italiano: %s""
msgstr "Cerca il suo titolo in italiano: %s"
msgctxt "#70067"
msgid "Info Seasons [%s]"
@@ -3852,3 +3852,413 @@ msgstr "default, puoi cambiarla di nuovo se vuoi.\n Scrivi 's', se hai capito: "
msgctxt "#70291"
msgid "Error, during conversion"
msgstr "Errore, in conversione"
# Servers ----
msgctxt "#70292"
msgid "[%s] File no longer exist on this server."
msgstr "[%s] Il file non è più presente nel server."
msgctxt "#70293"
msgid "[%s] The file is processing or has been deleted."
msgstr "[%s] Il file video è ancora in elaborazione o è stato rimosso."
msgctxt "#70294"
msgid "[%s] Link Not valid."
msgstr "[%s] URL Non valido."
msgctxt "#70295"
msgid "[%s] Premium account needed."
msgstr "[%s] É Necessario un account premium."
msgctxt "#70296"
msgid "[%s] Internal server error."
msgstr "[%s] Errore server interno."
msgctxt "#70297"
msgid "[%s] File is awaiting for moderation."
msgstr "[%s] Il File è in attesa di moderazione."
msgctxt "#70298"
msgid "[%s] The number of allowed reproductions has been exceeded."
msgstr "[%s] Il numero di riproduzioni concesse è stato superato."
msgctxt "#70299"
msgid "[%s] You do not have permission to access this file."
msgstr "[%s] Non hai il permesso per accedere a questo file."
msgctxt "#70300"
msgid "[%s] Too many connections to the server, try later."
msgstr "[%s] Troppe connessioni al server, riprova più tardi."
msgctxt "#70301"
msgid "[%s] File deleted for infringement."
msgstr "[%s] File rimosso per infrazione."
msgctxt "#70302"
msgid "[%s] This server only works from Kodi 17."
msgstr "[%s] Questo server funziona solo a partire da Kodi 17."
msgctxt "#70303"
msgid "[%s] This server does not work with your version of Plex, try to update it."
msgstr "[%s] Questo server non funziona con la tua versione di Plex, prova ad aggiornare Plex."
msgctxt "#70304"
msgid "[%s] This server requires updating python to version 2.7.9 or higher."
msgstr "[%s] Questo server richiede la versione 2.7.9 (O Maggiore) di Python."
# ============
msgctxt "#70305"
msgid "Search in channels"
msgstr "Cerca nei canali"
msgctxt "#70306"
msgid "Movies by Genre"
msgstr "Film per Genere"
msgctxt "#70307"
msgid "Most popular Movies"
msgstr "Film più popolari"
msgctxt "#70308"
msgid "Top rated Movies"
msgstr "Film più valutati"
msgctxt "#70309"
msgid "Movies Now in Theatres "
msgstr "Film ora in sala"
msgctxt "#70310"
msgid "Series by Genre"
msgstr "Serie per Genere"
msgctxt "#70311"
msgid "Series most polupar"
msgstr "Serie più popolari"
msgctxt "#70312"
msgid "Series in progress"
msgstr "Serie in uscita"
msgctxt "#70313"
msgid "Top rated Series"
msgstr "Serie Più valutate"
msgctxt "#70314"
msgid "Actors/Actresses"
msgstr "Attori/Attrici"
msgctxt "#70315"
msgid "Recommendations"
msgstr "Raccomandati"
msgctxt "#70316"
msgid "List of Images"
msgstr "Galleria di Immagini"
msgctxt "#70317"
msgid "Listen to BSO - List of songs"
msgstr "Ascolta BSO - Lista di canzoni"
msgctxt "#70318"
msgid "Manage yor trakt account"
msgstr "Gestisci il tuo account Trakt"
msgctxt "#70319"
msgid "Filming equipment"
msgstr "Filming crew"
msgctxt "#70320"
msgid "Filter search"
msgstr "Filtra la ricerca"
msgctxt "#70321"
msgid "[MAL] Add to your lists/%s"
msgstr "[MAL] Aggiungi alle tue liste/%s"
msgctxt "#70322"
msgid "[MAL] in your list of [COLOR %s]%s[/COLOR] Do you want to change?/%s"
msgstr "[MAL] Nella tua lista di [COLOR %s]%s[/COLOR]. Vuoi cambiare?/%s"
msgctxt "#70323"
msgid "[Trakt] Manage your account"
msgstr "[Trakt] Gestisci il tuo account"
msgctxt "#70324"
msgid "[FA] My vote: %s ---> Change?"
msgstr "[FA] il Mio voto: %s ---> Cambiare?"
msgctxt "#70325"
msgid "[FA] Vote %s"
msgstr "[FA] Vota %s"
msgctxt "#70326"
msgid "[FA] Add or remove from a user list"
msgstr "[FA] Aggiungi o rimuovi da un elenco utenti"
msgctxt "#70327"
msgid "It's part of: %s"
msgstr "E'parte di: %s"
msgctxt "#70328"
msgid "%ss similarar"
msgstr "%s simili"
msgctxt "#70329"
msgid "User and/or passwords not configured"
msgstr "Utente e/o password non configurati"
msgctxt "#70330"
msgid "Error in the user and/or password. Check your credentials"
msgstr "Errore in username e/o password. Controlla le tue credenziali"
msgctxt "#70331"
msgid "Error during login. Check your credentials
msgstr "Errore durante il login. Controlla le tue credenziali"
msgctxt "#70332"
msgid "My votes"
msgstr "I miei voti
msgctxt "#70333"
msgid "Add new list"
msgstr "Aggiungi una nuova lista"
msgctxt "#70334"
msgid "Action completed successfully"
msgstr "Azione completata con successo"
msgctxt "#70335"
msgid "Error, something has failed during the process"
msgstr "Errore, qualcosa è fallito durante il processo"
msgctxt "#70336"
msgid "Vote %s"
msgstr "Vota %s"
msgctxt "#70337"
msgid "Vote completed successfully"
msgstr "Voto inviato correttamente"
msgctxt "#70338"
msgid "List created correctly"
msgstr "Lista creata correttamente"
msgctxt "#70339"
msgid "Fanart.tv website not available. Retry"
msgstr "Sito Web di Fanart.tv non disponibile. Riprova"
msgctxt "#70340"
msgid "No images available"
msgstr "Non sono disponibili immagini"
msgctxt "#70341"
msgid "[Trakt] Mark %s as not seen"
msgstr "[Trakt] Segna %s come non vista"
msgctxt "#70342"
msgid "[Trakt] Mark %s as seen"
msgstr "[Trakt] Segna %s come vista"
msgctxt "#70343"
msgid "[Trakt] Remove %s from your watchlist"
msgstr "[Trakt] Rimuovi %s dalla tua watchlist"
msgctxt "#70344"
msgid "Add to %s your watchlist""
msgstr "[Trakt] Aggiungi %s alla tua watchlist"
msgctxt "#70345"
msgid "[Trakt] Remove %s from your collection"
msgstr "[Trakt] Rimuovi %s dalla tua collezione"
msgctxt "#70346"
msgid "[Trakt] Add %s to your collection
msgstr "[Trakt] Aggiungi %s alla tua collezione"
msgctxt "#70347"
msgid "Action performed correctly"
msgstr "Azione completata correttamente"
msgctxt "#70348"
msgid "An error occurred in process"
msgstr "Si è verificato un errore nel processo"
msgctxt "#70349"
msgid "List sorted by %s. Change order?"
msgstr "Lista ordinata per %s. Cambiare ordine?"
msgctxt "#70350"
msgid "Search in alfa: %s"
msgstr "Cerca in alfa: %s"
msgctxt "#70351"
msgid " Search alternative title: %s"
msgstr " Cerca titolo alternativo: %s"
msgctxt "#70352"
msgid " Search title in english: %s"
msgstr " Cerca titolo in inglese: %s"
msgctxt "#70353"
msgid "Vídeos (Episodes, Trailers...)"
msgstr "Vídeo (Episodi, Trailers...)"
msgctxt "#70354"
msgid "Characters/Staff"
msgstr "Personaggi/Staff"
msgctxt "#70355"
msgid "Prequel: %s"
msgstr "Prequel: %s"
msgctxt "#70356"
msgid "Sequel: %s"
msgstr "Sequel: %s"
msgctxt "#70357"
msgid "Alternative version: %s"
msgstr "Versione alternativa: %s"
msgctxt "#70358"
msgid "Recommendations TMDB"
msgstr "Raccomandazioni TMDB"
msgctxt "#70359"
msgid "Recommendations MyAnimeList"
msgstr "Raccomandazioni MyAnimeList"
msgctxt "#70360"
msgid " [COLOR %s][Without subs in castellan][/COLOR]"
msgstr " [COLOR %s][Senza subs in castigliano][/COLOR]"
msgctxt "#70361"
msgid ">> More Episodes"
msgstr ">> Altri Episodi"
msgctxt "#70362"
msgid "Episodes"
msgstr "Episodi"
msgctxt "#70363"
msgid "Trailers/Promotions"
msgstr "Trailers/Promozionali"
msgctxt "#70364"
msgid "Winter"
msgstr "Inverno"
msgctxt "#70365"
msgid "Spring"
msgstr "Primavera"
msgctxt "#70366"
msgid "Summer"
msgstr "Estate"
msgctxt "#70367"
msgid "Fall"
msgstr "Autunno"
msgctxt "#70368"
msgid "(New)"
msgstr "(Nuovi)"
msgctxt "#70369"
msgid "(Continuation)"
msgstr "(Continuazione)"
msgctxt "#70370"
msgid "Characters/Benders"
msgstr "Personaggi/Doppiatori"
msgctxt "#70371"
msgid "Principal"
msgstr "Principale"
msgctxt "#70372"
msgid "Secondary"
msgstr "Secondario"
msgctxt "#70373"
msgid "Animes where it appears:"
msgstr "Anime dove appare:"
msgctxt "#70374"
msgid "Give voice to/in:"
msgstr "Dai voce a/in:"
msgctxt "#70375"
msgid "Staff in animes:"
msgstr "Staff in anime:"
msgctxt "#70376"
msgid "Info in AniDB [COLOR %s]%s[/COLOR]"
msgstr "Info in AniDB [COLOR %s]%s[/COLOR]"
msgctxt "#70377"
msgid " - [COLOR %s]Fansubs in spanish:[/COLOR]"
msgstr " - [COLOR %s]Fansubs in spagnolo:[/COLOR]"
msgctxt "#70378"
msgid "Complete"
msgstr "Completa"
msgctxt "#70379"
msgid "Finished"
msgstr "Terminada"
msgctxt "#70380"
msgid "Stalled"
msgstr "In Pausa"
msgctxt "#70381"
msgid "Dropped"
msgstr "Abbandonata"
msgctxt "#70381"
msgid "Myanimelist username and/or password blank"
msgstr "Username e/o password di Myanimelist vuoti"
msgctxt "#70382"
msgid "Currently watching"
msgstr "In visione attualmente"
msgctxt "#70383"
msgid "Completed"
msgstr "Completati"
msgctxt "#70384"
msgid "Pause"
msgstr "in pausa"
msgctxt "#70385"
msgid "Descarted"
msgstr "Scartati"
msgctxt "#70386"
msgid "See later"
msgstr "Vedi dopo"
msgctxt "#70387"
msgid "E = In emission | F = Completed | P = Coming soon"
msgstr "E=In uscita | F=Completato | P=Prossimamente"
msgctxt "#70388"
msgid ". Available actions:"
msgstr ". Azioni disponibili:"
msgctxt "#70389"
msgid ". In your list [COLOR %s]%s[/COLOR]"
msgstr ". Nella tua lista [COLOR %s]%s[/COLOR]"
msgctxt "#70390"
msgid "Anime: %s%s"
msgstr "Anime: %s%s"
msgctxt "#70391"
msgid "Add to list %s"
msgstr "Aggiungi alla lista %s"
msgctxt "#70392"
msgid "Rate with a [COLOR %s]%s[/ COLOR]"
msgstr "Dai un punteggio con un [COLOR %s]%s[/COLOR]"

View File

@@ -303,7 +303,7 @@ msgstr "Populares"
msgctxt "#30985"
msgid "Top Rated"
msgstr "Top Rated"
msgstr "Mejor valoradas"
msgctxt "#30986"
msgid "Search by Collection"
@@ -503,7 +503,7 @@ msgstr "Filtrar servidores (Lista Negra)"
msgctxt "#60001"
msgid "Filter server (Black List)\nNo connection available that meets the requirements of the Black list.\nTry again by changing the filter in 'Server Configuration"
msgstr "Filtrar servidores (Lista Negra)\nNo hay enlaces disponibles que cumplan los requisitos de su Lista Negra.\nPruebe de nuevo modificando el fíltro en 'Configuracíon Servidores""
msgstr "Filtrar servidores (Lista Negra)\nNo hay enlaces disponibles que cumplan los requisitos de su Lista Negra.\nPruebe de nuevo modificando el fíltro en 'Configuracíon Servidores"
msgctxt "#60003"
msgid "Connecting with %s"
@@ -2207,7 +2207,7 @@ msgstr "Herramientas de canales"
msgctxt "#60549"
msgid "Check the files * _data.json"
msgstr "Comprobar archivos *_data.json","
msgstr "Comprobar archivos *_data.json"
msgctxt "#60550"
msgid "Servers locked"
@@ -2550,8 +2550,8 @@ msgid "Show option \"All Seasons\"."
msgstr "Mostrar la opción \"Todas las temporadas\""
msgctxt "#60643"
msgid "Do not combine the seasons of the series""
msgstr "No apilar temporadas de series""
msgid "Do not combine the seasons of the series"
msgstr "No apilar temporadas de series"
msgctxt "#60644"
msgid "Only if there is one season"
@@ -2858,12 +2858,12 @@ msgid "Search %s"
msgstr "Buscar %s"
msgctxt "#70036"
msgid "Search actor/actress"
msgstr "Buscar actor/actriz"
msgid " Search actor/actress"
msgstr " Buscar actor/actriz"
msgctxt "#70037"
msgid "Search director, writer..."
msgstr "Buscar director, guionista..."
msgid " Search director, writer..."
msgstr " Buscar director, guionista..."
msgctxt "#70038"
msgid "Custom Filter"
@@ -2895,7 +2895,7 @@ msgstr "Sagas y Colecciones"
msgctxt "#70045"
msgid "Movies/TV Shows/Documentaries by Themes"
msgstr "Películas/Series/Documentales por Temas""
msgstr "Películas/Series/Documentales por Temas"
msgctxt "#70046"
msgid "Search Movies/TV Shows"
@@ -2975,7 +2975,7 @@ msgstr "Buscar Series/Películas/Ovas"
msgctxt "#70065"
msgid ">> Next Page"
msgstr ">> Página siguiente""
msgstr ">> Página siguiente"
msgctxt "#70066"
msgid " Search title in spanish: %s"
@@ -3857,4 +3857,412 @@ msgctxt "#70291"
msgid "Error, during conversion"
msgstr "Error, en conversión"
# Servers ----
msgctxt "#70292"
msgid "[%s] File no longer exist on this server."
msgstr "[%s] El archivo ya no está presente en el servidor."
msgctxt "#70293"
msgid "[%s] The file is processing or has been deleted."
msgstr "[%s] El archivo de video todavía se está procesando o se ha eliminado."
msgctxt "#70294"
msgid "[%s] Link Not valid."
msgstr "[%s] Enlace no válido."
msgctxt "#70295"
msgid "[%s] Premium account needed."
msgstr "[%s] Debes tener una cuenta premium."
msgctxt "#70296"
msgid "[%s] Internal server error."
msgstr "[%s] Error interno del servidor."
msgctxt "#70297"
msgid "[%s] File is awaiting for moderation."
msgstr "[%s] El video está esperando por moderación."
msgctxt "#70298"
msgid "[%s] The number of allowed reproductions has been exceeded."
msgstr "[%s] Se ha excedido el número de reproducciones permitidas."
msgctxt "#70299"
msgid "[%s] You do not have permission to access this file."
msgstr "[%s] No tienes permiso para acceder a este video."
msgctxt "#70300"
msgid "[%s] Too many connections to the server, try later."
msgstr "[%s] Demasiadas conexiones al servidor, inténtelo después."
msgctxt "#70301"
msgid "[%s] File deleted for infringement."
msgstr "[%s] Archivo eliminado por infracción."
msgctxt "#70302"
msgid "[%s] This server only works from Kodi 17."
msgstr "[%s] Este conector solo funciona a partir de Kodi 17."
msgctxt "#70303"
msgid "[%s] This server does not work with your version of Plex, try to update it."
msgstr "[%s] Este conector no funciona con tu versión de Plex, intenta actualizarla."
msgctxt "#70304"
msgid "[%s] This server requires updating python to version 2.7.9 or higher."
msgstr "[%s] Este conector requiere actualizar python a la versión 2.7.9 o superior."
# ============
msgctxt "#70305"
msgid "Search in channels"
msgstr "Buscar en canales"
msgctxt "#70306"
msgid "Movies by Genre"
msgstr "Películas por Generos"
msgctxt "#70307"
msgid "Most popular Movies"
msgstr "Películas mas populares"
msgctxt "#70308"
msgid "Top rated Movies"
msgstr "Películas mejor valoradas"
msgctxt "#70309"
msgid "Movies Now in Theatres "
msgstr "Películas Ahora en cines"
msgctxt "#70310"
msgid "Series by Genre"
msgstr "Series por Generos"
msgctxt "#70311"
msgid "Series most polupar"
msgstr "Series mas populares"
msgctxt "#70312"
msgid "Series in progress"
msgstr "Series en emisión"
msgctxt "#70313"
msgid "Top rated Series"
msgstr "Series mejor valoradas"
msgctxt "#70314"
msgid "Actors/Actresses"
msgstr "Actores/Actrices"
msgctxt "#70315"
msgid "Recommendations"
msgstr "Recomendaciones"
msgctxt "#70316"
msgid "List of Images"
msgstr "Lista de Imágenes"
msgctxt "#70317"
msgid "Listen to BSO - List of songs"
msgstr "Escuchar BSO - Lista de canciones"
msgctxt "#70318"
msgid "Manage yor trakt account"
msgstr "Gestionar con tu cuenta Trakt"
msgctxt "#70319"
msgid "Filming equipment"
msgstr "Equipo de rodaje"
msgctxt "#70320"
msgid "Filter search"
msgstr "Filtra la búsqueda"
msgctxt "#70321"
msgid "[MAL] Add to your lists/%s"
msgstr "[MAL] Añadir a tus listas/%s"
msgctxt "#70322"
msgid "[MAL] in your list of [COLOR %s]%s[/COLOR] Do you want to change?/%s"
msgstr "[MAL] En tu lista de [COLOR %s]%s[/COLOR]. ¿Cambiar?/%s"
msgctxt "#70323"
msgid "[Trakt] Manage your account"
msgstr "[Trakt] Gestionar con tu cuenta"
msgctxt "#70324"
msgid "[FA] My vote: %s ---> Change?"
msgstr "[FA] Mi voto: %s ---> ¿Cambiar?"
msgctxt "#70325"
msgid "[FA] Vote %s"
msgstr "[FA] Votar %s"
msgctxt "#70326"
msgid "[FA] Add or remove from a user list"
msgstr "[FA] Añadir o quitar de una lista de usuario"
msgctxt "#70327"
msgid "It's part of: %s"
msgstr "Es parte de: %s"
msgctxt "#70328"
msgid "%ss similarar"
msgstr "%ss similares"
msgctxt "#70329"
msgid "User and/or passwords not configured"
msgstr "Usuario y/o contraseñas no configurados"
msgctxt "#70330"
msgid "Error in the user and/or password. Check your credentials"
msgstr "Error en el usuario y/o contraseña. Comprueba tus credenciales"
msgctxt "#70331"
msgid "Error during login. Check your credentials
msgstr "Error durante el login. Comprueba tus credenciales"
msgctxt "#70332"
msgid "My votes"
msgstr "Mis votaciones"
msgctxt "#70333"
msgid "Add new list"
msgstr "Añadir una nueva lista"
msgctxt "#70334"
msgid "Action completed successfully"
msgstr "Acción completada con éxito"
msgctxt "#70335"
msgid "Error, something has failed during the process"
msgstr "Error, algo ha fallado durante el proceso"
msgctxt "#70336"
msgid "Vote %s"
msgstr "Votar %s"
msgctxt "#70337"
msgid "Vote completed successfully"
msgstr "Voto contabilizado con éxito"
msgctxt "#70338"
msgid "List created correctly"
msgstr "Lista creada correctamente"
msgctxt "#70339"
msgid "Fanart.tv website not available. Retry"
msgstr "Web de Fanart.tv no disponible. Vuelve a intentarlo"
msgctxt "#70340"
msgid "No images available"
msgstr "No hay imágenes disponibles"
msgctxt "#70341"
msgid "[Trakt] Mark %s as not seen"
msgstr "[Trakt] Marcar %s como no vista"
msgctxt "#70342"
msgid "[Trakt] Mark %s as seen"
msgstr "[Trakt] Marcar %s como vista"
msgctxt "#70343"
msgid "[Trakt] Remove %s from your watchlist"
msgstr "[Trakt] Eliminar %s de tu watchlist"
msgctxt "#70344"
msgid "Add to %s your watchlist""
msgstr "[Trakt] Añadir %s a tu watchlist"
msgctxt "#70345"
msgid "[Trakt] Remove %s from your collection"
msgstr "[Trakt] Eliminar %s de tu colección"
msgctxt "#70346"
msgid "[Trakt] Add %s to your collection
msgstr "[Trakt] Añadir %s a tu colección"
msgctxt "#70347"
msgid "Action performed correctly"
msgstr "Acción realizada correctamente"
msgctxt "#70348"
msgid "An error occurred in process"
msgstr "Hubo error en el proceso"
msgctxt "#70349"
msgid "List sorted by %s. Change order?"
msgstr "Lista ordenada por %s. ¿Cambiar orden?"
msgctxt "#70350"
msgid "Search in alfa: %s"
msgstr "Buscar en alfa: %s"
msgctxt "#70351"
msgid " Search alternative title: %s"
msgstr " Buscar por título alternativo: %s"
msgctxt "#70352"
msgid " Search title in english: %s"
msgstr " Buscar por su título en inglés: %s"
msgctxt "#70353"
msgid "Vídeos (Episodes, Trailers...)"
msgstr "Vídeos (Episodios, Trailers...)"
msgctxt "#70354"
msgid "Characters/Staff"
msgstr "Personajes/Staff"
msgctxt "#70355"
msgid "Prequel: %s"
msgstr "Precuela: %s"
msgctxt "#70356"
msgid "Sequel: %s"
msgstr "Secuela: %s"
msgctxt "#70357"
msgid "Alternative version: %s"
msgstr "Versión alternativa: %s"
msgctxt "#70358"
msgid "Recommendations TMDB"
msgstr "Recomendaciones TMDB"
msgctxt "#70359"
msgid "Recommendations MyAnimeList"
msgstr "Recomendaciones MyAnimeList"
msgctxt "#70360"
msgid " [COLOR %s][Without subs in castellan][/COLOR]"
msgstr " [COLOR %s][Sin subs en castellano][/COLOR]"
msgctxt "#70361"
msgid ">> More Episodes"
msgstr ">> Más Episodios"
msgctxt "#70362"
msgid "Episodes"
msgstr "Episodios"
msgctxt "#70363"
msgid "Trailers/Promotions"
msgstr "Tráilers/Promocionales"
msgctxt "#70364"
msgid "Winter"
msgstr "Invierno"
msgctxt "#70365"
msgid "Spring"
msgstr "Primavera"
msgctxt "#70366"
msgid "Summer"
msgstr "Verano"
msgctxt "#70367"
msgid "Fall"
msgstr "Otoño"
msgctxt "#70368"
msgid "(New)"
msgstr "(Nuevos)"
msgctxt "#70369"
msgid "(Continuation)"
msgstr "(Continuación)"
msgctxt "#70370"
msgid "Characters/Benders"
msgstr "Personajes/Dobladores"
msgctxt "#70371"
msgid "Principal"
msgstr "Principal"
msgctxt "#70372"
msgid "Secondary"
msgstr "Secundario"
msgctxt "#70373"
msgid "Animes where it appears:"
msgstr "Animes donde aparece:"
msgctxt "#70374"
msgid "Give voice to/in:"
msgstr "Da voz a/en:"
msgctxt "#70375"
msgid "Staff in animes:"
msgstr "Staff en animes:"
msgctxt "#70376"
msgid "Info in AniDB [COLOR %s]%s[/COLOR]"
msgstr "Info en AniDB [COLOR %s]%s[/COLOR]"
msgctxt "#70377"
msgid " - [COLOR %s]Fansubs in spanish:[/COLOR]"
msgstr " - [COLOR %s]Fansubs en español:[/COLOR]"
msgctxt "#70378"
msgid "Complete"
msgstr "Completa"
msgctxt "#70379"
msgid "Finished"
msgstr "Terminada"
msgctxt "#70380"
msgid "Stalled"
msgstr "Pausa"
msgctxt "#70381"
msgid "Dropped"
msgstr "Abandonada"
msgctxt "#70381"
msgid "Myanimelist username and/or password blank"
msgstr "Usuario y/o contraseña de Myanimelist en blanco"
msgctxt "#70382"
msgid "Currently watching"
msgstr "Viendo actualmente"
msgctxt "#70383"
msgid "Completed"
msgstr "Completados"
msgctxt "#70384"
msgid "Pause"
msgstr "En pausa"
msgctxt "#70385"
msgid "Descarted"
msgstr "Descartados"
msgctxt "#70386"
msgid "See later"
msgstr "Ver más adelante"
msgctxt "#70387"
msgid "E = In emission | F = Completed | P = Coming soon"
msgstr "E=En emisión | F=Finalizado | P=Próximamente"
msgctxt "#70388"
msgid ". Available actions:"
msgstr ". Acciones disponibles:"
msgctxt "#70389"
msgid ". In your list [COLOR %s]%s[/COLOR]"
msgstr ". En tu lista [COLOR %s]%s[/COLOR]"
msgctxt "#70390"
msgid "Anime: %s%s"
msgstr "Anime: %s%s"
msgctxt "#70391"
msgid "Add to list %s"
msgstr "Añadir a lista %s"
msgctxt "#70392"
msgid "Rate with a [COLOR %s]%s[/ COLOR]"
msgstr "Puntuar con un [COLOR %s]%s[/COLOR]"

View File

@@ -303,7 +303,7 @@ msgstr "Populares"
msgctxt "#30985"
msgid "Top Rated"
msgstr "Top Rated"
msgstr "Mejor valoradas"
msgctxt "#30986"
msgid "Search by Collection"
@@ -503,7 +503,7 @@ msgstr "Filtrar servidores (Lista Negra)"
msgctxt "#60001"
msgid "Filter server (Black List)\nNo connection available that meets the requirements of the Black list.\nTry again by changing the filter in 'Server Configuration"
msgstr "Filtrar servidores (Lista Negra)\nNo hay enlaces disponibles que cumplan los requisitos de su Lista Negra.\nPruebe de nuevo modificando el fíltro en 'Configuracíon Servidores""
msgstr "Filtrar servidores (Lista Negra)\nNo hay enlaces disponibles que cumplan los requisitos de su Lista Negra.\nPruebe de nuevo modificando el fíltro en 'Configuracíon Servidores"
msgctxt "#60003"
msgid "Connecting with %s"
@@ -2207,7 +2207,7 @@ msgstr "Herramientas de canales"
msgctxt "#60549"
msgid "Check the files * _data.json"
msgstr "Comprobar archivos *_data.json","
msgstr "Comprobar archivos *_data.json"
msgctxt "#60550"
msgid "Servers locked"
@@ -2550,8 +2550,8 @@ msgid "Show option \"All Seasons\"."
msgstr "Mostrar la opción \"Todas las temporadas\""
msgctxt "#60643"
msgid "Do not combine the seasons of the series""
msgstr "No apilar temporadas de series""
msgid "Do not combine the seasons of the series"
msgstr "No apilar temporadas de series"
msgctxt "#60644"
msgid "Only if there is one season"
@@ -2858,12 +2858,12 @@ msgid "Search %s"
msgstr "Buscar %s"
msgctxt "#70036"
msgid "Search actor/actress"
msgstr "Buscar actor/actriz"
msgid " Search actor/actress"
msgstr " Buscar actor/actriz"
msgctxt "#70037"
msgid "Search director, writer..."
msgstr "Buscar director, guionista..."
msgid " Search director, writer..."
msgstr " Buscar director, guionista..."
msgctxt "#70038"
msgid "Custom Filter"
@@ -2895,7 +2895,7 @@ msgstr "Sagas y Colecciones"
msgctxt "#70045"
msgid "Movies/TV Shows/Documentaries by Themes"
msgstr "Películas/Series/Documentales por Temas""
msgstr "Películas/Series/Documentales por Temas"
msgctxt "#70046"
msgid "Search Movies/TV Shows"
@@ -2975,7 +2975,7 @@ msgstr "Buscar Series/Películas/Ovas"
msgctxt "#70065"
msgid ">> Next Page"
msgstr ">> Página siguiente""
msgstr ">> Página siguiente"
msgctxt "#70066"
msgid " Search title in spanish: %s"
@@ -3857,4 +3857,412 @@ msgctxt "#70291"
msgid "Error, during conversion"
msgstr "Error, en conversión"
# Servers ----
msgctxt "#70292"
msgid "[%s] File no longer exist on this server."
msgstr "[%s] El archivo ya no está presente en el servidor."
msgctxt "#70293"
msgid "[%s] The file is processing or has been deleted."
msgstr "[%s] El archivo de video todavía se está procesando o se ha eliminado."
msgctxt "#70294"
msgid "[%s] Link Not valid."
msgstr "[%s] Enlace no válido."
msgctxt "#70295"
msgid "[%s] Premium account needed."
msgstr "[%s] Debes tener una cuenta premium."
msgctxt "#70296"
msgid "[%s] Internal server error."
msgstr "[%s] Error interno del servidor."
msgctxt "#70297"
msgid "[%s] File is awaiting for moderation."
msgstr "[%s] El video está esperando por moderación."
msgctxt "#70298"
msgid "[%s] The number of allowed reproductions has been exceeded."
msgstr "[%s] Se ha excedido el número de reproducciones permitidas."
msgctxt "#70299"
msgid "[%s] You do not have permission to access this file."
msgstr "[%s] No tienes permiso para acceder a este video."
msgctxt "#70300"
msgid "[%s] Too many connections to the server, try later."
msgstr "[%s] Demasiadas conexiones al servidor, inténtelo después."
msgctxt "#70301"
msgid "[%s] File deleted for infringement."
msgstr "[%s] Archivo eliminado por infracción."
msgctxt "#70302"
msgid "[%s] This server only works from Kodi 17."
msgstr "[%s] Este conector solo funciona a partir de Kodi 17."
msgctxt "#70303"
msgid "[%s] This server does not work with your version of Plex, try to update it."
msgstr "[%s] Este conector no funciona con tu versión de Plex, intenta actualizarla."
msgctxt "#70304"
msgid "[%s] This server requires updating python to version 2.7.9 or higher."
msgstr "[%s] Este conector requiere actualizar python a la versión 2.7.9 o superior."
# ============
msgctxt "#70305"
msgid "Search in channels"
msgstr "Buscar en canales"
msgctxt "#70306"
msgid "Movies by Genre"
msgstr "Películas por Generos"
msgctxt "#70307"
msgid "Most popular Movies"
msgstr "Películas mas populares"
msgctxt "#70308"
msgid "Top rated Movies"
msgstr "Películas mejor valoradas"
msgctxt "#70309"
msgid "Movies Now in Theatres "
msgstr "Películas Ahora en cines"
msgctxt "#70310"
msgid "Series by Genre"
msgstr "Series por Generos"
msgctxt "#70311"
msgid "Series most polupar"
msgstr "Series mas populares"
msgctxt "#70312"
msgid "Series in progress"
msgstr "Series en emisión"
msgctxt "#70313"
msgid "Top rated Series"
msgstr "Series mejor valoradas"
msgctxt "#70314"
msgid "Actors/Actresses"
msgstr "Actores/Actrices"
msgctxt "#70315"
msgid "Recommendations"
msgstr "Recomendaciones"
msgctxt "#70316"
msgid "List of Images"
msgstr "Lista de Imágenes"
msgctxt "#70317"
msgid "Listen to BSO - List of songs"
msgstr "Escuchar BSO - Lista de canciones"
msgctxt "#70318"
msgid "Manage yor trakt account"
msgstr "Gestionar con tu cuenta Trakt"
msgctxt "#70319"
msgid "Filming equipment"
msgstr "Equipo de rodaje"
msgctxt "#70320"
msgid "Filter search"
msgstr "Filtra la búsqueda"
msgctxt "#70321"
msgid "[MAL] Add to your lists/%s"
msgstr "[MAL] Añadir a tus listas/%s"
msgctxt "#70322"
msgid "[MAL] in your list of [COLOR %s]%s[/COLOR] Do you want to change?/%s"
msgstr "[MAL] En tu lista de [COLOR %s]%s[/COLOR]. ¿Cambiar?/%s"
msgctxt "#70323"
msgid "[Trakt] Manage your account"
msgstr "[Trakt] Gestionar con tu cuenta"
msgctxt "#70324"
msgid "[FA] My vote: %s ---> Change?"
msgstr "[FA] Mi voto: %s ---> ¿Cambiar?"
msgctxt "#70325"
msgid "[FA] Vote %s"
msgstr "[FA] Votar %s"
msgctxt "#70326"
msgid "[FA] Add or remove from a user list"
msgstr "[FA] Añadir o quitar de una lista de usuario"
msgctxt "#70327"
msgid "It's part of: %s"
msgstr "Es parte de: %s"
msgctxt "#70328"
msgid "%ss similarar"
msgstr "%ss similares"
msgctxt "#70329"
msgid "User and/or passwords not configured"
msgstr "Usuario y/o contraseñas no configurados"
msgctxt "#70330"
msgid "Error in the user and/or password. Check your credentials"
msgstr "Error en el usuario y/o contraseña. Comprueba tus credenciales"
msgctxt "#70331"
msgid "Error during login. Check your credentials
msgstr "Error durante el login. Comprueba tus credenciales"
msgctxt "#70332"
msgid "My votes"
msgstr "Mis votaciones"
msgctxt "#70333"
msgid "Add new list"
msgstr "Añadir una nueva lista"
msgctxt "#70334"
msgid "Action completed successfully"
msgstr "Acción completada con éxito"
msgctxt "#70335"
msgid "Error, something has failed during the process"
msgstr "Error, algo ha fallado durante el proceso"
msgctxt "#70336"
msgid "Vote %s"
msgstr "Votar %s"
msgctxt "#70337"
msgid "Vote completed successfully"
msgstr "Voto contabilizado con éxito"
msgctxt "#70338"
msgid "List created correctly"
msgstr "Lista creada correctamente"
msgctxt "#70339"
msgid "Fanart.tv website not available. Retry"
msgstr "Web de Fanart.tv no disponible. Vuelve a intentarlo"
msgctxt "#70340"
msgid "No images available"
msgstr "No hay imágenes disponibles"
msgctxt "#70341"
msgid "[Trakt] Mark %s as not seen"
msgstr "[Trakt] Marcar %s como no vista"
msgctxt "#70342"
msgid "[Trakt] Mark %s as seen"
msgstr "[Trakt] Marcar %s como vista"
msgctxt "#70343"
msgid "[Trakt] Remove %s from your watchlist"
msgstr "[Trakt] Eliminar %s de tu watchlist"
msgctxt "#70344"
msgid "Add to %s your watchlist""
msgstr "[Trakt] Añadir %s a tu watchlist"
msgctxt "#70345"
msgid "[Trakt] Remove %s from your collection"
msgstr "[Trakt] Eliminar %s de tu colección"
msgctxt "#70346"
msgid "[Trakt] Add %s to your collection
msgstr "[Trakt] Añadir %s a tu colección"
msgctxt "#70347"
msgid "Action performed correctly"
msgstr "Acción realizada correctamente"
msgctxt "#70348"
msgid "An error occurred in process"
msgstr "Hubo error en el proceso"
msgctxt "#70349"
msgid "List sorted by %s. Change order?"
msgstr "Lista ordenada por %s. ¿Cambiar orden?"
msgctxt "#70350"
msgid "Search in alfa: %s"
msgstr "Buscar en alfa: %s"
msgctxt "#70351"
msgid " Search alternative title: %s"
msgstr " Buscar por título alternativo: %s"
msgctxt "#70352"
msgid " Search title in english: %s"
msgstr " Buscar por su título en inglés: %s"
msgctxt "#70353"
msgid "Vídeos (Episodes, Trailers...)"
msgstr "Vídeos (Episodios, Trailers...)"
msgctxt "#70354"
msgid "Characters/Staff"
msgstr "Personajes/Staff"
msgctxt "#70355"
msgid "Prequel: %s"
msgstr "Precuela: %s"
msgctxt "#70356"
msgid "Sequel: %s"
msgstr "Secuela: %s"
msgctxt "#70357"
msgid "Alternative version: %s"
msgstr "Versión alternativa: %s"
msgctxt "#70358"
msgid "Recommendations TMDB"
msgstr "Recomendaciones TMDB"
msgctxt "#70359"
msgid "Recommendations MyAnimeList"
msgstr "Recomendaciones MyAnimeList"
msgctxt "#70360"
msgid " [COLOR %s][Without subs in castellan][/COLOR]"
msgstr " [COLOR %s][Sin subs en castellano][/COLOR]"
msgctxt "#70361"
msgid ">> More Episodes"
msgstr ">> Más Episodios"
msgctxt "#70362"
msgid "Episodes"
msgstr "Episodios"
msgctxt "#70363"
msgid "Trailers/Promotions"
msgstr "Tráilers/Promocionales"
msgctxt "#70364"
msgid "Winter"
msgstr "Invierno"
msgctxt "#70365"
msgid "Spring"
msgstr "Primavera"
msgctxt "#70366"
msgid "Summer"
msgstr "Verano"
msgctxt "#70367"
msgid "Fall"
msgstr "Otoño"
msgctxt "#70368"
msgid "(New)"
msgstr "(Nuevos)"
msgctxt "#70369"
msgid "(Continuation)"
msgstr "(Continuación)"
msgctxt "#70370"
msgid "Characters/Benders"
msgstr "Personajes/Dobladores"
msgctxt "#70371"
msgid "Principal"
msgstr "Principal"
msgctxt "#70372"
msgid "Secondary"
msgstr "Secundario"
msgctxt "#70373"
msgid "Animes where it appears:"
msgstr "Animes donde aparece:"
msgctxt "#70374"
msgid "Give voice to/in:"
msgstr "Da voz a/en:"
msgctxt "#70375"
msgid "Staff in animes:"
msgstr "Staff en animes:"
msgctxt "#70376"
msgid "Info in AniDB [COLOR %s]%s[/COLOR]"
msgstr "Info en AniDB [COLOR %s]%s[/COLOR]"
msgctxt "#70377"
msgid " - [COLOR %s]Fansubs in spanish:[/COLOR]"
msgstr " - [COLOR %s]Fansubs en español:[/COLOR]"
msgctxt "#70378"
msgid "Complete"
msgstr "Completa"
msgctxt "#70379"
msgid "Finished"
msgstr "Terminada"
msgctxt "#70380"
msgid "Stalled"
msgstr "Pausa"
msgctxt "#70381"
msgid "Dropped"
msgstr "Abandonada"
msgctxt "#70381"
msgid "Myanimelist username and/or password blank"
msgstr "Usuario y/o contraseña de Myanimelist en blanco"
msgctxt "#70382"
msgid "Currently watching"
msgstr "Viendo actualmente"
msgctxt "#70383"
msgid "Completed"
msgstr "Completados"
msgctxt "#70384"
msgid "Pause"
msgstr "En pausa"
msgctxt "#70385"
msgid "Descarted"
msgstr "Descartados"
msgctxt "#70386"
msgid "See later"
msgstr "Ver más adelante"
msgctxt "#70387"
msgid "E = In emission | F = Completed | P = Coming soon"
msgstr "E=En emisión | F=Finalizado | P=Próximamente"
msgctxt "#70388"
msgid ". Available actions:"
msgstr ". Acciones disponibles:"
msgctxt "#70389"
msgid ". In your list [COLOR %s]%s[/COLOR]"
msgstr ". En tu lista [COLOR %s]%s[/COLOR]"
msgctxt "#70390"
msgid "Anime: %s%s"
msgstr "Anime: %s%s"
msgctxt "#70391"
msgid "Add to list %s"
msgstr "Añadir a lista %s"
msgctxt "#70392"
msgid "Rate with a [COLOR %s]%s[/ COLOR]"
msgstr "Puntuar con un [COLOR %s]%s[/COLOR]"

View File

@@ -303,7 +303,7 @@ msgstr "Populares"
msgctxt "#30985"
msgid "Top Rated"
msgstr "Top Rated"
msgstr "Mejor valoradas"
msgctxt "#30986"
msgid "Search by Collection"
@@ -503,7 +503,7 @@ msgstr "Filtrar servidores (Lista Negra)"
msgctxt "#60001"
msgid "Filter server (Black List)\nNo connection available that meets the requirements of the Black list.\nTry again by changing the filter in 'Server Configuration"
msgstr "Filtrar servidores (Lista Negra)\nNo hay enlaces disponibles que cumplan los requisitos de su Lista Negra.\nPruebe de nuevo modificando el fíltro en 'Configuracíon Servidores""
msgstr "Filtrar servidores (Lista Negra)\nNo hay enlaces disponibles que cumplan los requisitos de su Lista Negra.\nPruebe de nuevo modificando el fíltro en 'Configuracíon Servidores"
msgctxt "#60003"
msgid "Connecting with %s"
@@ -2207,7 +2207,7 @@ msgstr "Herramientas de canales"
msgctxt "#60549"
msgid "Check the files * _data.json"
msgstr "Comprobar archivos *_data.json","
msgstr "Comprobar archivos *_data.json"
msgctxt "#60550"
msgid "Servers locked"
@@ -2550,8 +2550,8 @@ msgid "Show option \"All Seasons\"."
msgstr "Mostrar la opción \"Todas las temporadas\""
msgctxt "#60643"
msgid "Do not combine the seasons of the series""
msgstr "No apilar temporadas de series""
msgid "Do not combine the seasons of the series"
msgstr "No apilar temporadas de series"
msgctxt "#60644"
msgid "Only if there is one season"
@@ -2858,12 +2858,12 @@ msgid "Search %s"
msgstr "Buscar %s"
msgctxt "#70036"
msgid "Search actor/actress"
msgstr "Buscar actor/actriz"
msgid " Search actor/actress"
msgstr " Buscar actor/actriz"
msgctxt "#70037"
msgid "Search director, writer..."
msgstr "Buscar director, guionista..."
msgid " Search director, writer..."
msgstr " Buscar director, guionista..."
msgctxt "#70038"
msgid "Custom Filter"
@@ -2895,7 +2895,7 @@ msgstr "Sagas y Colecciones"
msgctxt "#70045"
msgid "Movies/TV Shows/Documentaries by Themes"
msgstr "Películas/Series/Documentales por Temas""
msgstr "Películas/Series/Documentales por Temas"
msgctxt "#70046"
msgid "Search Movies/TV Shows"
@@ -2975,7 +2975,7 @@ msgstr "Buscar Series/Películas/Ovas"
msgctxt "#70065"
msgid ">> Next Page"
msgstr ">> Página siguiente""
msgstr ">> Página siguiente"
msgctxt "#70066"
msgid " Search title in spanish: %s"
@@ -3857,4 +3857,412 @@ msgctxt "#70291"
msgid "Error, during conversion"
msgstr "Error, en conversión"
# Servers ----
msgctxt "#70292"
msgid "[%s] File no longer exist on this server."
msgstr "[%s] El archivo ya no está presente en el servidor."
msgctxt "#70293"
msgid "[%s] The file is processing or has been deleted."
msgstr "[%s] El archivo de video todavía se está procesando o se ha eliminado."
msgctxt "#70294"
msgid "[%s] Link Not valid."
msgstr "[%s] Enlace no válido."
msgctxt "#70295"
msgid "[%s] Premium account needed."
msgstr "[%s] Debes tener una cuenta premium."
msgctxt "#70296"
msgid "[%s] Internal server error."
msgstr "[%s] Error interno del servidor."
msgctxt "#70297"
msgid "[%s] File is awaiting for moderation."
msgstr "[%s] El video está esperando por moderación."
msgctxt "#70298"
msgid "[%s] The number of allowed reproductions has been exceeded."
msgstr "[%s] Se ha excedido el número de reproducciones permitidas."
msgctxt "#70299"
msgid "[%s] You do not have permission to access this file."
msgstr "[%s] No tienes permiso para acceder a este video."
msgctxt "#70300"
msgid "[%s] Too many connections to the server, try later."
msgstr "[%s] Demasiadas conexiones al servidor, inténtelo después."
msgctxt "#70301"
msgid "[%s] File deleted for infringement."
msgstr "[%s] Archivo eliminado por infracción."
msgctxt "#70302"
msgid "[%s] This server only works from Kodi 17."
msgstr "[%s] Este conector solo funciona a partir de Kodi 17."
msgctxt "#70303"
msgid "[%s] This server does not work with your version of Plex, try to update it."
msgstr "[%s] Este conector no funciona con tu versión de Plex, intenta actualizarla."
msgctxt "#70304"
msgid "[%s] This server requires updating python to version 2.7.9 or higher."
msgstr "[%s] Este conector requiere actualizar python a la versión 2.7.9 o superior."
# ============
msgctxt "#70305"
msgid "Search in channels"
msgstr "Buscar en canales"
msgctxt "#70306"
msgid "Movies by Genre"
msgstr "Películas por Generos"
msgctxt "#70307"
msgid "Most popular Movies"
msgstr "Películas mas populares"
msgctxt "#70308"
msgid "Top rated Movies"
msgstr "Películas mejor valoradas"
msgctxt "#70309"
msgid "Movies Now in Theatres "
msgstr "Películas Ahora en cines"
msgctxt "#70310"
msgid "Series by Genre"
msgstr "Series por Generos"
msgctxt "#70311"
msgid "Series most polupar"
msgstr "Series mas populares"
msgctxt "#70312"
msgid "Series in progress"
msgstr "Series en emisión"
msgctxt "#70313"
msgid "Top rated Series"
msgstr "Series mejor valoradas"
msgctxt "#70314"
msgid "Actors/Actresses"
msgstr "Actores/Actrices"
msgctxt "#70315"
msgid "Recommendations"
msgstr "Recomendaciones"
msgctxt "#70316"
msgid "List of Images"
msgstr "Lista de Imágenes"
msgctxt "#70317"
msgid "Listen to BSO - List of songs"
msgstr "Escuchar BSO - Lista de canciones"
msgctxt "#70318"
msgid "Manage yor trakt account"
msgstr "Gestionar con tu cuenta Trakt"
msgctxt "#70319"
msgid "Filming equipment"
msgstr "Equipo de rodaje"
msgctxt "#70320"
msgid "Filter search"
msgstr "Filtra la búsqueda"
msgctxt "#70321"
msgid "[MAL] Add to your lists/%s"
msgstr "[MAL] Añadir a tus listas/%s"
msgctxt "#70322"
msgid "[MAL] in your list of [COLOR %s]%s[/COLOR] Do you want to change?/%s"
msgstr "[MAL] En tu lista de [COLOR %s]%s[/COLOR]. ¿Cambiar?/%s"
msgctxt "#70323"
msgid "[Trakt] Manage your account"
msgstr "[Trakt] Gestionar con tu cuenta"
msgctxt "#70324"
msgid "[FA] My vote: %s ---> Change?"
msgstr "[FA] Mi voto: %s ---> ¿Cambiar?"
msgctxt "#70325"
msgid "[FA] Vote %s"
msgstr "[FA] Votar %s"
msgctxt "#70326"
msgid "[FA] Add or remove from a user list"
msgstr "[FA] Añadir o quitar de una lista de usuario"
msgctxt "#70327"
msgid "It's part of: %s"
msgstr "Es parte de: %s"
msgctxt "#70328"
msgid "%ss similarar"
msgstr "%ss similares"
msgctxt "#70329"
msgid "User and/or passwords not configured"
msgstr "Usuario y/o contraseñas no configurados"
msgctxt "#70330"
msgid "Error in the user and/or password. Check your credentials"
msgstr "Error en el usuario y/o contraseña. Comprueba tus credenciales"
msgctxt "#70331"
msgid "Error during login. Check your credentials
msgstr "Error durante el login. Comprueba tus credenciales"
msgctxt "#70332"
msgid "My votes"
msgstr "Mis votaciones"
msgctxt "#70333"
msgid "Add new list"
msgstr "Añadir una nueva lista"
msgctxt "#70334"
msgid "Action completed successfully"
msgstr "Acción completada con éxito"
msgctxt "#70335"
msgid "Error, something has failed during the process"
msgstr "Error, algo ha fallado durante el proceso"
msgctxt "#70336"
msgid "Vote %s"
msgstr "Votar %s"
msgctxt "#70337"
msgid "Vote completed successfully"
msgstr "Voto contabilizado con éxito"
msgctxt "#70338"
msgid "List created correctly"
msgstr "Lista creada correctamente"
msgctxt "#70339"
msgid "Fanart.tv website not available. Retry"
msgstr "Web de Fanart.tv no disponible. Vuelve a intentarlo"
msgctxt "#70340"
msgid "No images available"
msgstr "No hay imágenes disponibles"
msgctxt "#70341"
msgid "[Trakt] Mark %s as not seen"
msgstr "[Trakt] Marcar %s como no vista"
msgctxt "#70342"
msgid "[Trakt] Mark %s as seen"
msgstr "[Trakt] Marcar %s como vista"
msgctxt "#70343"
msgid "[Trakt] Remove %s from your watchlist"
msgstr "[Trakt] Eliminar %s de tu watchlist"
msgctxt "#70344"
msgid "Add to %s your watchlist""
msgstr "[Trakt] Añadir %s a tu watchlist"
msgctxt "#70345"
msgid "[Trakt] Remove %s from your collection"
msgstr "[Trakt] Eliminar %s de tu colección"
msgctxt "#70346"
msgid "[Trakt] Add %s to your collection
msgstr "[Trakt] Añadir %s a tu colección"
msgctxt "#70347"
msgid "Action performed correctly"
msgstr "Acción realizada correctamente"
msgctxt "#70348"
msgid "An error occurred in process"
msgstr "Hubo error en el proceso"
msgctxt "#70349"
msgid "List sorted by %s. Change order?"
msgstr "Lista ordenada por %s. ¿Cambiar orden?"
msgctxt "#70350"
msgid "Search in alfa: %s"
msgstr "Buscar en alfa: %s"
msgctxt "#70351"
msgid " Search alternative title: %s"
msgstr " Buscar por título alternativo: %s"
msgctxt "#70352"
msgid " Search title in english: %s"
msgstr " Buscar por su título en inglés: %s"
msgctxt "#70353"
msgid "Vídeos (Episodes, Trailers...)"
msgstr "Vídeos (Episodios, Trailers...)"
msgctxt "#70354"
msgid "Characters/Staff"
msgstr "Personajes/Staff"
msgctxt "#70355"
msgid "Prequel: %s"
msgstr "Precuela: %s"
msgctxt "#70356"
msgid "Sequel: %s"
msgstr "Secuela: %s"
msgctxt "#70357"
msgid "Alternative version: %s"
msgstr "Versión alternativa: %s"
msgctxt "#70358"
msgid "Recommendations TMDB"
msgstr "Recomendaciones TMDB"
msgctxt "#70359"
msgid "Recommendations MyAnimeList"
msgstr "Recomendaciones MyAnimeList"
msgctxt "#70360"
msgid " [COLOR %s][Without subs in castellan][/COLOR]"
msgstr " [COLOR %s][Sin subs en castellano][/COLOR]"
msgctxt "#70361"
msgid ">> More Episodes"
msgstr ">> Más Episodios"
msgctxt "#70362"
msgid "Episodes"
msgstr "Episodios"
msgctxt "#70363"
msgid "Trailers/Promotions"
msgstr "Tráilers/Promocionales"
msgctxt "#70364"
msgid "Winter"
msgstr "Invierno"
msgctxt "#70365"
msgid "Spring"
msgstr "Primavera"
msgctxt "#70366"
msgid "Summer"
msgstr "Verano"
msgctxt "#70367"
msgid "Fall"
msgstr "Otoño"
msgctxt "#70368"
msgid "(New)"
msgstr "(Nuevos)"
msgctxt "#70369"
msgid "(Continuation)"
msgstr "(Continuación)"
msgctxt "#70370"
msgid "Characters/Benders"
msgstr "Personajes/Dobladores"
msgctxt "#70371"
msgid "Principal"
msgstr "Principal"
msgctxt "#70372"
msgid "Secondary"
msgstr "Secundario"
msgctxt "#70373"
msgid "Animes where it appears:"
msgstr "Animes donde aparece:"
msgctxt "#70374"
msgid "Give voice to/in:"
msgstr "Da voz a/en:"
msgctxt "#70375"
msgid "Staff in animes:"
msgstr "Staff en animes:"
msgctxt "#70376"
msgid "Info in AniDB [COLOR %s]%s[/COLOR]"
msgstr "Info en AniDB [COLOR %s]%s[/COLOR]"
msgctxt "#70377"
msgid " - [COLOR %s]Fansubs in spanish:[/COLOR]"
msgstr " - [COLOR %s]Fansubs en español:[/COLOR]"
msgctxt "#70378"
msgid "Complete"
msgstr "Completa"
msgctxt "#70379"
msgid "Finished"
msgstr "Terminada"
msgctxt "#70380"
msgid "Stalled"
msgstr "Pausa"
msgctxt "#70381"
msgid "Dropped"
msgstr "Abandonada"
msgctxt "#70381"
msgid "Myanimelist username and/or password blank"
msgstr "Usuario y/o contraseña de Myanimelist en blanco"
msgctxt "#70382"
msgid "Currently watching"
msgstr "Viendo actualmente"
msgctxt "#70383"
msgid "Completed"
msgstr "Completados"
msgctxt "#70384"
msgid "Pause"
msgstr "En pausa"
msgctxt "#70385"
msgid "Descarted"
msgstr "Descartados"
msgctxt "#70386"
msgid "See later"
msgstr "Ver más adelante"
msgctxt "#70387"
msgid "E = In emission | F = Completed | P = Coming soon"
msgstr "E=En emisión | F=Finalizado | P=Próximamente"
msgctxt "#70388"
msgid ". Available actions:"
msgstr ". Acciones disponibles:"
msgctxt "#70389"
msgid ". In your list [COLOR %s]%s[/COLOR]"
msgstr ". En tu lista [COLOR %s]%s[/COLOR]"
msgctxt "#70390"
msgid "Anime: %s%s"
msgstr "Anime: %s%s"
msgctxt "#70391"
msgid "Add to list %s"
msgstr "Añadir a lista %s"
msgctxt "#70392"
msgid "Rate with a [COLOR %s]%s[/ COLOR]"
msgstr "Puntuar con un [COLOR %s]%s[/COLOR]"

View File

@@ -6,6 +6,10 @@
{
"pattern": "https://estream.to/embed-([a-z0-9]+).html",
"url": "https://estream.to/\\1.html"
},
{
"pattern": "https://estream.xyz/embed-([a-z0-9]+).html",
"url": "https://estream.to/\\1.html"
}
]
},

View File

@@ -0,0 +1,42 @@
{
"active": true,
"find_videos": {
"ignore_urls": [],
"patterns": [
{
"pattern": "(jawcloud.co/embed-([A-z0-9]+))",
"url": "https://\\1.html"
}
]
},
"free": true,
"id": "jawcloud",
"name": "jawcloud",
"settings": [
{
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"type": "bool",
"visible": true
},
{
"default": 0,
"enabled": true,
"id": "favorites_servers_list",
"label": "@60655",
"lvalues": [
"No",
"1",
"2",
"3",
"4",
"5"
],
"type": "list",
"visible": false
}
],
"thumbnail": "https://s8.postimg.cc/b64mzlgxh/jawcloud1.png"
}

View File

@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from core import httptools
from core import scrapertools
from platformcode import logger
def test_video_exists(page_url):
logger.info("(page_url='%s')" % page_url)
return True, ""
def get_video_url(page_url, user="", password="", video_password=""):
logger.info("(page_url='%s')" % page_url)
data = httptools.downloadpage(page_url).data
video_urls = []
videourl = scrapertools.find_single_match(data, 'source src="([^"]+)')
video_urls.append([".MP4 [jawcloud]", videourl])
return video_urls