KoD 1.2
- aggiunto nuovo canale: guardaserie.cam - autoplay migliorato, ora i settaggi sono globali e non più per canale - adesso in onda riscritto, ora usa EPG (ringraziamo epg-guide.com) - Riprendi la visione di un film o episodio da server diversi (solo videoteca) - fix e ottimizzazioni varie
@@ -1,4 +1,4 @@
|
|||||||
<addon id="plugin.video.kod" name="Kodi on Demand" version="1.1" provider-name="KoD Team">
|
<addon id="plugin.video.kod" name="Kodi on Demand" version="1.2" provider-name="KoD Team">
|
||||||
<requires>
|
<requires>
|
||||||
<!-- <import addon="script.module.libtorrent" optional="true"/> -->
|
<!-- <import addon="script.module.libtorrent" optional="true"/> -->
|
||||||
<import addon="metadata.themoviedb.org"/>
|
<import addon="metadata.themoviedb.org"/>
|
||||||
@@ -18,9 +18,11 @@
|
|||||||
<screenshot>resources/media/themes/ss/2.png</screenshot>
|
<screenshot>resources/media/themes/ss/2.png</screenshot>
|
||||||
<screenshot>resources/media/themes/ss/3.png</screenshot>
|
<screenshot>resources/media/themes/ss/3.png</screenshot>
|
||||||
</assets>
|
</assets>
|
||||||
<news> - Ottimizzata e migliorata la ricerca globale
|
<news> - aggiunto nuovo canale: guardaserie.cam
|
||||||
- fix Mega
|
- autoplay migliorato, ora i settaggi sono globali e non più per canale
|
||||||
- altri cambiamenti minori</news>
|
- adesso in onda riscritto, ora usa EPG (ringraziamo epg-guide.com)
|
||||||
|
- Riprendi la visione di un film o episodio da server diversi (solo videoteca)
|
||||||
|
- fix e ottimizzazioni varie</news>
|
||||||
<description lang="it">Naviga velocemente sul web e guarda i contenuti presenti</description>
|
<description lang="it">Naviga velocemente sul web e guarda i contenuti presenti</description>
|
||||||
<disclaimer>[COLOR red]The owners and submitters to this addon do not host or distribute any of the content displayed by these addons nor do they have any affiliation with the content providers.[/COLOR]
|
<disclaimer>[COLOR red]The owners and submitters to this addon do not host or distribute any of the content displayed by these addons nor do they have any affiliation with the content providers.[/COLOR]
|
||||||
[COLOR yellow]Kodi © is a registered trademark of the XBMC Foundation. We are not connected to or in any other way affiliated with Kodi, Team Kodi, or the XBMC Foundation. Furthermore, any software, addons, or products offered by us will receive no support in official Kodi channels, including the Kodi forums and various social networks.[/COLOR]</disclaimer>
|
[COLOR yellow]Kodi © is a registered trademark of the XBMC Foundation. We are not connected to or in any other way affiliated with Kodi, Team Kodi, or the XBMC Foundation. Furthermore, any software, addons, or products offered by us will receive no support in official Kodi channels, including the Kodi forums and various social networks.[/COLOR]</disclaimer>
|
||||||
|
|||||||
@@ -24,10 +24,13 @@
|
|||||||
"filmstreaming01": "https://filmstreaming01.com",
|
"filmstreaming01": "https://filmstreaming01.com",
|
||||||
"guardaserie_stream": "https://guardaserie.store",
|
"guardaserie_stream": "https://guardaserie.store",
|
||||||
"guardaserieclick": "https://www.guardaserie.style",
|
"guardaserieclick": "https://www.guardaserie.style",
|
||||||
"hd4me": "https://hd4me.net",
|
"hd4me": "https://hd4me.net",
|
||||||
"ilgeniodellostreaming": "https://ilgeniodellostreaming.tw",
|
"netfreex": "https://www.netfreex.stream/",
|
||||||
|
"ilgeniodellostreaming": "https://ilgeniodellostreaming.tw",
|
||||||
"italiaserie": "https://italiaserie.org",
|
"italiaserie": "https://italiaserie.org",
|
||||||
"mondoserietv": "https://mondoserietv.com",
|
"mondoserietv": "https://mondoserietv.com",
|
||||||
|
"guardaserieIcu": "https://guardaserie.icu/",
|
||||||
|
"guardaserieCam": "https://guardaserie.cam",
|
||||||
"piratestreaming": "https://www.piratestreaming.biz",
|
"piratestreaming": "https://www.piratestreaming.biz",
|
||||||
"polpotv": "https://polpotv.club",
|
"polpotv": "https://polpotv.club",
|
||||||
"pufimovies": "https://pufimovies.com",
|
"pufimovies": "https://pufimovies.com",
|
||||||
|
|||||||
@@ -69,10 +69,6 @@ host = config.get_channel_url(findhost)
|
|||||||
host = config.get_channel_url()
|
host = config.get_channel_url()
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
# server di esempio...
|
|
||||||
list_servers = ['supervideo', 'streamcherry','rapidvideo', 'streamango', 'openload']
|
|
||||||
# quality di esempio
|
|
||||||
list_quality = ['default', 'HD', '3D', '4K', 'DVD', 'SD']
|
|
||||||
|
|
||||||
### fine variabili
|
### fine variabili
|
||||||
|
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ def findhost():
|
|||||||
host = config.get_channel_url(findhost)
|
host = config.get_channel_url(findhost)
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['mixdrop','vidoza','cloudvideo','vup','supervideo','gounlimited']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
@@ -80,13 +80,13 @@ def genres(item):
|
|||||||
blacklist = ['Altadefinizione01']
|
blacklist = ['Altadefinizione01']
|
||||||
if item.args == 'genres':
|
if item.args == 'genres':
|
||||||
patronBlock = r'<ul class="kategori_list">(?P<block>.*?)<div class="tab-pane fade" id="wtab2">'
|
patronBlock = r'<ul class="kategori_list">(?P<block>.*?)<div class="tab-pane fade" id="wtab2">'
|
||||||
patron = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>'
|
patronMenu = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>'
|
||||||
elif item.args == 'years':
|
elif item.args == 'years':
|
||||||
patronBlock = r'<ul class="anno_list">(?P<block>.*?)</a></li> </ul> </div>'
|
patronBlock = r'<ul class="anno_list">(?P<block>.*?)</a></li> </ul> </div>'
|
||||||
patron = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>'
|
patronMenu = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>'
|
||||||
elif item.args == 'orderalf':
|
elif item.args == 'orderalf':
|
||||||
patronBlock = r'<div class="movies-letter">(?P<block>.*?)<div class="clearfix">'
|
patronBlock = r'<div class="movies-letter">(?P<block>.*?)<div class="clearfix">'
|
||||||
patron = '<a title=.*?href="(?P<url>[^"]+)"><span>(?P<title>.*?)</span>'
|
patronMenu = '<a title=.*?href="(?P<url>[^"]+)"><span>(?P<title>.*?)</span>'
|
||||||
|
|
||||||
#debug = True
|
#debug = True
|
||||||
return locals()
|
return locals()
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ __channel__ = "altadefinizione01_link"
|
|||||||
host = config.get_channel_url()
|
host = config.get_channel_url()
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['mixdrop', 'vup', 'supervideo']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
# =========== home menu ===================
|
# =========== home menu ===================
|
||||||
@support.menu
|
@support.menu
|
||||||
@@ -102,4 +102,4 @@ def newest(categoria):
|
|||||||
|
|
||||||
def findvideos(item):
|
def findvideos(item):
|
||||||
support.log('findvideos', item)
|
support.log('findvideos', item)
|
||||||
return support.server(item, headers=headers)
|
return support.server(item, support.match(item, patron='<ul class="playernav">.*?</ul>', headers=headers).match)
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ def findhost():
|
|||||||
|
|
||||||
host = config.get_channel_url(findhost)
|
host = config.get_channel_url(findhost)
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
list_servers = ['mixdrop', 'vidcloud', 'vidoza', 'supervideo', 'hdload', 'mystream']
|
|
||||||
list_quality = ['1080p', '720p', '360p']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ from core import support
|
|||||||
|
|
||||||
host = support.config.get_channel_url()
|
host = support.config.get_channel_url()
|
||||||
|
|
||||||
list_servers = ['directo', 'vvvvid']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
|
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
@@ -142,10 +142,7 @@ def findvideos(item):
|
|||||||
if 'https' not in item.url:
|
if 'https' not in item.url:
|
||||||
url = support.match(item, url='https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/playlist.m3u')[1]
|
url = support.match(item, url='https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/playlist.m3u')[1]
|
||||||
url = url.split()[-1]
|
url = url.split()[-1]
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action= 'play', url= 'https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/' + url, server= 'directo'))
|
||||||
support.Item(action= 'play',
|
|
||||||
url= 'https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/' + url,
|
|
||||||
server= 'directo'))
|
|
||||||
|
|
||||||
elif 'adf.ly' in item.url:
|
elif 'adf.ly' in item.url:
|
||||||
from servers.decrypters import adfly
|
from servers.decrypters import adfly
|
||||||
@@ -170,11 +167,6 @@ def findvideos(item):
|
|||||||
elif url.startswith('/'): url = 'https:/' + url
|
elif url.startswith('/'): url = 'https:/' + url
|
||||||
|
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="play", title='Diretto', url=url, server='directo'))
|
||||||
support.Item(channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
title='Diretto',
|
|
||||||
url=url,
|
|
||||||
server='directo'))
|
|
||||||
|
|
||||||
return support.server(item, itemlist=itemlist)
|
return support.server(item, itemlist=itemlist)
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ host = support.config.get_channel_url()
|
|||||||
headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'],
|
headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'],
|
||||||
['Referer', host]]
|
['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['verystream','openload','rapidvideo','streamango']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
|
|||||||
@@ -9,9 +9,6 @@ host = support.config.get_channel_url()
|
|||||||
headers={'X-Requested-With': 'XMLHttpRequest'}
|
headers={'X-Requested-With': 'XMLHttpRequest'}
|
||||||
|
|
||||||
|
|
||||||
list_servers = ['directo', 'fembed', 'animeworld']
|
|
||||||
list_quality = ['default', '480p', '720p', '1080p']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
|
|
||||||
@@ -26,9 +23,10 @@ def mainlist(item):
|
|||||||
@support.scrape
|
@support.scrape
|
||||||
def search(item, texto):
|
def search(item, texto):
|
||||||
search = texto
|
search = texto
|
||||||
|
# debug = True
|
||||||
item.contentType = 'tvshow'
|
item.contentType = 'tvshow'
|
||||||
anime = True
|
anime = True
|
||||||
patron = r'<a href="(?P<url>[^"]+)"[^>]+> <span>(?P<title>[^<\(]+)(?:\s*\((?P<year>\d+)\))?(?:\s*\((?P<lang>[A-Za-z-]+)\))?'
|
patron = r'href="(?P<url>[^"]+)"[^>]*>(?P<title>[^<]+)(?:\((?P<lang>ITA)\))?(?:(?P<year>\((\d+)\)))?</a>.*?<p[^>]+>(?P<plot>[^<]+).*?<img src="(?P<thumbnail>[^"]+)'
|
||||||
action = 'check'
|
action = 'check'
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
@@ -53,15 +51,20 @@ def newest(categoria):
|
|||||||
|
|
||||||
@support.scrape
|
@support.scrape
|
||||||
def menu(item):
|
def menu(item):
|
||||||
patronMenu = r'<div class="col-md-13 bg-dark-as-box-shadow p-2 text-white text-center">(?P<title>[^"<]+)<(?P<url>.*?)(?:"lista-top"|"clearfix")'
|
patronMenu = r'<div class="col-md-13 bg-dark-as-box-shadow p-2 text-white text-center">(?P<title>[^"<]+)<(?P<other>.*?)(?:"lista-top"|"clearfix")'
|
||||||
action = 'peliculas'
|
action = 'peliculas'
|
||||||
item.args = 'top'
|
item.args = 'top'
|
||||||
|
def itemHook(item2):
|
||||||
|
item2.url = item.url
|
||||||
|
return item2
|
||||||
|
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
@support.scrape
|
@support.scrape
|
||||||
def peliculas(item):
|
def peliculas(item):
|
||||||
anime = True
|
anime = True
|
||||||
|
# debug = True
|
||||||
|
|
||||||
deflang= 'Sub-ITA'
|
deflang= 'Sub-ITA'
|
||||||
action = 'check'
|
action = 'check'
|
||||||
@@ -70,9 +73,8 @@ def peliculas(item):
|
|||||||
post = "page=" + str(item.page if item.page else 1) if item.page > 1 else None
|
post = "page=" + str(item.page if item.page else 1) if item.page > 1 else None
|
||||||
|
|
||||||
if item.args == 'top':
|
if item.args == 'top':
|
||||||
data=item.url
|
data = item.other
|
||||||
patron = r'light">(?P<title2>[^<]+)</div>\s(?P<title>[^<]+)[^>]+>[^>]+>\s<a href="(?P<url>[^"]+)">(?:<a[^>]+>|\s*)<img alt="[^"]+" src="(?P<thumb>[^"]+)"'
|
patron = r'light">(?P<title2>[^<]+)</div>\s(?P<title>[^<]+)[^>]+>[^>]+>\s<a href="(?P<url>[^"]+)">(?:<a[^>]+>|\s*)<img.*?src="(?P<thumb>[^"]+)"'
|
||||||
|
|
||||||
else:
|
else:
|
||||||
data = support.match(item, post=post, headers=headers).data
|
data = support.match(item, post=post, headers=headers).data
|
||||||
if item.args == 'updated':
|
if item.args == 'updated':
|
||||||
@@ -82,22 +84,14 @@ def peliculas(item):
|
|||||||
action = 'findvideos'
|
action = 'findvideos'
|
||||||
def itemlistHook(itemlist):
|
def itemlistHook(itemlist):
|
||||||
if page:
|
if page:
|
||||||
itemlist.append(
|
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'),page= page, thumbnail=support.thumb()))
|
||||||
support.Item(channel=item.channel,
|
|
||||||
action = item.action,
|
|
||||||
contentType=item.contentType,
|
|
||||||
title=support.typo(support.config.get_localized_string(30992), 'color kod bold'),
|
|
||||||
url=item.url,
|
|
||||||
page= page,
|
|
||||||
args=item.args,
|
|
||||||
thumbnail=support.thumb()))
|
|
||||||
return itemlist
|
return itemlist
|
||||||
else:
|
else:
|
||||||
pagination = ''
|
pagination = ''
|
||||||
if item.args == 'incorso':
|
if item.args == 'incorso':
|
||||||
patron = r'<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<(]+)(?:\s*\((?P<year>\d+)\))?(?:\s*\((?P<lang>[A-za-z-]+)\))?</a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<'
|
patron = r'<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<(]+)(?:\s*\((?P<year>\d+)\))?(?:\s*\((?P<lang>[A-za-z-]+)\))?</a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<'
|
||||||
else:
|
else:
|
||||||
patron = r'href="(?P<url>[^"]+)"[^>]+>[^>]+>(?P<title>.+?)(?:\((?P<lang>ITA)\))?(?:(?P<year>\((\d+)\)))?</span>'
|
patron = r'href="(?P<url>[^"]+)"[^>]*>(?P<title>[^<]+)(?:\((?P<lang>ITA)\))?(?:(?P<year>\((\d+)\)))?</a>.*?<p[^>]+>(?P<plot>[^<]+).*?<img src="(?P<thumbnail>[^"]+)'
|
||||||
|
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
@@ -131,17 +125,7 @@ def findvideos(item):
|
|||||||
if url:
|
if url:
|
||||||
links = support.match(url, patron=r'(?:<source type="[^"]+"\s*src=|file:\s*)"([^"]+)"', headers=headers, debug=False).matches
|
links = support.match(url, patron=r'(?:<source type="[^"]+"\s*src=|file:\s*)"([^"]+)"', headers=headers, debug=False).matches
|
||||||
for link in links:
|
for link in links:
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="play", title='Diretto', url=link, server='directo'))
|
||||||
support.Item(channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
title='Diretto',
|
|
||||||
quality='',
|
|
||||||
url=link,
|
|
||||||
server='directo',
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
show=item.show,
|
|
||||||
contentType=item.contentType,
|
|
||||||
folder=False))
|
|
||||||
return support.server(item, itemlist=itemlist)
|
return support.server(item, itemlist=itemlist)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "animesubita",
|
|
||||||
"name": "AnimeSubIta",
|
|
||||||
"active": false,
|
|
||||||
"language": ["sub-ita"],
|
|
||||||
"thumbnail": "animesubita.png",
|
|
||||||
"bannermenu": "animesubita.png",
|
|
||||||
"categories": ["anime", "vos"],
|
|
||||||
"settings": []
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# ------------------------------------------------------------
|
|
||||||
# Canale per AnimeSubIta
|
|
||||||
# ------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
from core import support
|
|
||||||
|
|
||||||
host = support.config.get_channel_url()
|
|
||||||
headers = {'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0'}
|
|
||||||
|
|
||||||
list_servers = ['directo']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
|
|
||||||
@support.menu
|
|
||||||
def mainlist(item):
|
|
||||||
anime = ['/lista-anime/',
|
|
||||||
('Ultimi Episodi',['/category/ultimi-episodi/', 'peliculas', 'updated']),
|
|
||||||
('in Corso',['/category/anime-in-corso/', 'peliculas', 'alt']),
|
|
||||||
('Generi',['/generi/', 'genres', 'alt'])]
|
|
||||||
return locals()
|
|
||||||
|
|
||||||
|
|
||||||
def newest(categoria):
|
|
||||||
support.log(categoria)
|
|
||||||
itemlist = []
|
|
||||||
item = support.Item()
|
|
||||||
try:
|
|
||||||
if categoria == "anime":
|
|
||||||
item.url = host
|
|
||||||
item.args = "updated"
|
|
||||||
itemlist = peliculas(item)
|
|
||||||
|
|
||||||
if itemlist[-1].action == "ultimiep":
|
|
||||||
itemlist.pop()
|
|
||||||
# Continua l'esecuzione in caso di errore
|
|
||||||
except:
|
|
||||||
import sys
|
|
||||||
for line in sys.exc_info():
|
|
||||||
support.logger.error("{0}".format(line))
|
|
||||||
return []
|
|
||||||
|
|
||||||
return itemlist
|
|
||||||
|
|
||||||
|
|
||||||
def search(item, texto):
|
|
||||||
support.log(texto)
|
|
||||||
item.url = host + "/?s=" + texto
|
|
||||||
item.args = 'alt'
|
|
||||||
try:
|
|
||||||
return peliculas(item)
|
|
||||||
# Continua la ricerca in caso di errore
|
|
||||||
except:
|
|
||||||
import sys
|
|
||||||
for line in sys.exc_info():
|
|
||||||
support.logger.error("%s" % line)
|
|
||||||
return []
|
|
||||||
|
|
||||||
|
|
||||||
@support.scrape
|
|
||||||
def genres(item):
|
|
||||||
blacklist= ['Anime In Corso','Ultimi Episodi']
|
|
||||||
patronMenu=r'<li><a title="[^"]+" href="(?P<url>[^"]+)">(?P<title>[^<]+)</a>'
|
|
||||||
action = 'peliculas'
|
|
||||||
return locals()
|
|
||||||
|
|
||||||
|
|
||||||
@support.scrape
|
|
||||||
def peliculas(item):
|
|
||||||
anime = True
|
|
||||||
if item.args == 'updated':
|
|
||||||
patron = r'<div class="post-thumbnail">\s*<a href="(?P<url>[^"]+)" title="(?P<title>.*?)\s*Episodio (?P<episode>\d+) (?P<lang>[a-zA-Z-\s]+)[^"]*"> <img[^src]+src="(?P<thumb>[^"]+)"'
|
|
||||||
patronNext = r'<link rel="next" href="([^"]+)"\s*/>'
|
|
||||||
action = 'findvideos'
|
|
||||||
elif item.args == 'alt':
|
|
||||||
patron = r'<div class="post-thumbnail">\s*<a href="(?P<url>[^"]+)" title="(?P<title>.*?)(?: [Oo][Aa][Vv])?(?:\s*(?P<lang>[Ss][Uu][Bb].[Ii][Tt][Aa]))[^"]+">\s*<img[^src]+src="(?P<thumb>[^"]+)"'
|
|
||||||
patronNext = r'<link rel="next" href="([^"]+)"\s*/>'
|
|
||||||
action = 'episodios'
|
|
||||||
else:
|
|
||||||
pagination = ''
|
|
||||||
patronBlock = r'<ul class="lcp_catlist"[^>]+>(?P<block>.*?)</ul>'
|
|
||||||
patron = r'<a href="(?P<url>[^"]+)"[^>]+>(?P<title>.*?)(?: [Oo][Aa][Vv])?(?:\s*(?P<lang>[Ss][Uu][Bb].[Ii][Tt][Aa])[^<]+)?</a>'
|
|
||||||
action = 'episodios'
|
|
||||||
return locals()
|
|
||||||
|
|
||||||
|
|
||||||
@support.scrape
|
|
||||||
def episodios(item):
|
|
||||||
anime = True
|
|
||||||
patron = r'<td style="[^"]*?">\s*.*?<strong>(?P<episode>[^<]+)</strong>\s*</td>\s*<td[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>\s*<img src="(?P<thumb>[^"]+?)"[^>]+>'
|
|
||||||
return locals()
|
|
||||||
|
|
||||||
|
|
||||||
def findvideos(item):
|
|
||||||
support.log(item)
|
|
||||||
itemlist = []
|
|
||||||
|
|
||||||
if item.args == 'updated':
|
|
||||||
ep = support.match(item.fulltitle, patron=r'(\d+)').match
|
|
||||||
item.url = support.re.sub(r'episodio-\d+-|oav-\d+-'+ep, '',item.url)
|
|
||||||
if 'streaming' not in item.url: item.url = item.url.replace('sub-ita','sub-ita-streaming')
|
|
||||||
item.url = support.match(item, patron= ep + r'[^>]+>[^>]+>[^>]+><a href="([^"]+)"').match
|
|
||||||
|
|
||||||
# post
|
|
||||||
url = host + '/' + support.match(item.url, patron=r'(episodio\d*.php.*?)"').match.replace('%3F','?').replace('%3D','=')
|
|
||||||
headers['Referer'] = url
|
|
||||||
cookies = ""
|
|
||||||
matches = support.re.compile('(.%s.*?)\n' % host.replace("http://", "").replace("www.", ""), support.re.DOTALL).findall(support.config.get_cookie_data())
|
|
||||||
for cookie in matches:
|
|
||||||
cookies += cookie.split('\t')[5] + "=" + cookie.split('\t')[6] + ";"
|
|
||||||
headers['Cookie'] = cookies[:-1]
|
|
||||||
|
|
||||||
url = support.match(url, patron=r'<source src="([^"]+)"[^>]+>').match
|
|
||||||
|
|
||||||
itemlist.append(
|
|
||||||
support.Item(channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
title='Diretto',
|
|
||||||
url=url + '|' + support.urllib.urlencode(headers),
|
|
||||||
server='directo'))
|
|
||||||
|
|
||||||
return support.server(item,itemlist=itemlist)
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "animetubeita",
|
|
||||||
"name": "AnimeTubeITA",
|
|
||||||
"active": false,
|
|
||||||
"language": ["sub-ita"],
|
|
||||||
"thumbnail": "animetubeita.png",
|
|
||||||
"bannermenu": "animetubeita.png",
|
|
||||||
"categories": ["anime","vos"],
|
|
||||||
"settings": []
|
|
||||||
}
|
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# ----------------------------------------------------------
|
|
||||||
# Canale per animetubeita
|
|
||||||
# ----------------------------------------------------------
|
|
||||||
import re
|
|
||||||
import urllib
|
|
||||||
from core import support
|
|
||||||
|
|
||||||
host = support.config.get_channel_url()
|
|
||||||
|
|
||||||
headers = {'Upgrade-Insecure-Requests': '1',
|
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0'}
|
|
||||||
|
|
||||||
list_servers = ['directo']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
@support.menu
|
|
||||||
def mainlist(item):
|
|
||||||
anime = [('Generi',['/generi', 'genres', 'genres']),
|
|
||||||
('Ordine Alfabetico',['/lista-anime', 'peliculas', 'list']),
|
|
||||||
('In Corso',['/category/serie-in-corso/', 'peliculas', 'in_progress'])
|
|
||||||
]
|
|
||||||
return locals()
|
|
||||||
|
|
||||||
@support.scrape
|
|
||||||
def genres(item):
|
|
||||||
blacklist = ['Ultimi Episodi', 'Serie in Corso']
|
|
||||||
patronMenu = r'<li[^>]+><a href="(?P<url>[^"]+)" >(?P<title>[^<]+)</a>'
|
|
||||||
action = 'peliculas'
|
|
||||||
return locals()
|
|
||||||
|
|
||||||
|
|
||||||
def search(item, text):
|
|
||||||
support.log(text)
|
|
||||||
item.url = host + '/lista-anime'
|
|
||||||
item.args = 'list'
|
|
||||||
item.search = text
|
|
||||||
try:
|
|
||||||
return peliculas(item)
|
|
||||||
except:
|
|
||||||
import sys
|
|
||||||
for line in sys.exc_info():
|
|
||||||
support.logger.error("%s" % line)
|
|
||||||
return []
|
|
||||||
|
|
||||||
|
|
||||||
def newest(categoria):
|
|
||||||
support.log(categoria)
|
|
||||||
item = support.Item()
|
|
||||||
try:
|
|
||||||
if categoria == "anime":
|
|
||||||
item.contentType='tvshow'
|
|
||||||
item.url = host
|
|
||||||
item.args = "last"
|
|
||||||
return peliculas(item)
|
|
||||||
# Continua la ricerca in caso di errore
|
|
||||||
except:
|
|
||||||
import sys
|
|
||||||
for line in sys.exc_info():
|
|
||||||
support.logger.error("{0}".format(line))
|
|
||||||
return []
|
|
||||||
|
|
||||||
|
|
||||||
@support.scrape
|
|
||||||
def peliculas(item):
|
|
||||||
anime = True
|
|
||||||
if not item.search: pagination = ''
|
|
||||||
action = 'episodios'
|
|
||||||
|
|
||||||
if item.args == 'list':
|
|
||||||
search = item.search
|
|
||||||
patronBlock = r'<ul class="page-list ">(?P<block>.*?)<div class="wprc-container'
|
|
||||||
patron = r'<li.*?class="page_.*?href="(?P<url>[^"]+)">(?P<title>.*?) Sub Ita'
|
|
||||||
elif item.args == 'last':
|
|
||||||
action = 'findvideos'
|
|
||||||
item.contentType='episode'
|
|
||||||
patronBlock = r'<div class="blocks">(?P<block>.*?)<div id="sidebar'
|
|
||||||
patron = r'<h2 class="title"><a href="(?P<url>[^"]+)" [^>]+>.*?<img.*?src="(?P<thumb>[^"]+)".*?<strong>Titolo</strong></td>.*?<td>(?P<title>.*?)\s*Episodio\s*(?P<episode>\d+)[^<]+</td>.*?<td><strong>Trama</strong></td>\s*<td>(?P<plot>[^<]+)<'
|
|
||||||
elif item.args in ['in_progress','genres']:
|
|
||||||
patronBlock = r'<div class="blocks">(?P<block>.*?)<div id="sidebar'
|
|
||||||
patron = r'<h2 class="title"><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.*?)\s* Sub Ita[^<]+</a></h2>.*?<img.*?src="(?P<thumb>.*?)".*?<td><strong>Trama</strong></td>.*?<td>(?P<plot>[^<]+)<'
|
|
||||||
patronNext = r'href="([^"]+)" >»'
|
|
||||||
else:
|
|
||||||
patronBlock = r'<div class="blocks">(?P<block>.*?)<div id="sidebar'
|
|
||||||
patron = r'<img.*?src="(?P<thumb>[^"]+)".*?<strong>Titolo</strong></td>.*?<td>\s*(?P<title>.*?)\s*Episodio[^<]+</td>.*?<td><strong>Trama</strong></td>\s*<td>(?P<plot>[^<]+)<.*?<a.*?href="(?P<url>[^"]+)"'
|
|
||||||
patronNext = r'href="([^"]+)" >»'
|
|
||||||
return locals()
|
|
||||||
|
|
||||||
|
|
||||||
@support.scrape
|
|
||||||
def episodios(item):
|
|
||||||
patronBlock = r'<h6>Episodio</h6>(?P<block>.*?)(?:<!--|</table>)'
|
|
||||||
patron = r'<strong>(?P<title>[^<]+)</strong>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><a href="http://link\.animetubeita\.com/2361078/(?P<url>[^"]+)"'
|
|
||||||
action = 'findvideos'
|
|
||||||
return locals()
|
|
||||||
|
|
||||||
|
|
||||||
def findvideos(item):
|
|
||||||
itemlist=[]
|
|
||||||
if item.args == 'last':
|
|
||||||
match = support.match(item, patron=r'href="(?P<url>[^"]+)"[^>]+><strong>DOWNLOAD & STREAMING</strong>').match
|
|
||||||
if match:
|
|
||||||
patronBlock = r'<h6>Episodio</h6>(?P<block>.*?)(?:<!--|</table>)'
|
|
||||||
patron = r'<a href="http://link\.animetubeita\.com/2361078/(?P<url>[^"]+)"'
|
|
||||||
match = support.match(match, patron=patron, patronBlock=patronBlock, headers=headers).match
|
|
||||||
else: return itemlist
|
|
||||||
|
|
||||||
if match: item.url = match[-1]
|
|
||||||
else: return itemlist
|
|
||||||
data = support.httptools.downloadpage(item.url, headers=headers).data
|
|
||||||
cookies = ""
|
|
||||||
matches = re.compile('(.animetubeita.com.*?)\n', re.DOTALL).findall(support.config.get_cookie_data())
|
|
||||||
for cookie in matches:
|
|
||||||
name = cookie.split('\t')[5]
|
|
||||||
value = cookie.split('\t')[6]
|
|
||||||
cookies += name + "=" + value + ";"
|
|
||||||
|
|
||||||
headers['Referer'] = item.url
|
|
||||||
headers['Cookie'] = cookies[:-1]
|
|
||||||
|
|
||||||
url = support.scrapertools.find_single_match(data, """<source src="([^"]+)" type='video/mp4'>""")
|
|
||||||
if not url: url = support.scrapertools.find_single_match(data, 'file: "([^"]+)"')
|
|
||||||
if url:
|
|
||||||
url += '|' + urllib.urlencode(headers)
|
|
||||||
itemlist.append(
|
|
||||||
support.Item(channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
title='diretto',
|
|
||||||
server='directo',
|
|
||||||
quality='',
|
|
||||||
url=url,
|
|
||||||
thumbnail=item.thumbnail,
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
show=item.show,
|
|
||||||
contentType=item.contentType,
|
|
||||||
folder=False))
|
|
||||||
return support.server(item, itemlist=itemlist)
|
|
||||||
@@ -7,8 +7,8 @@ from core import support
|
|||||||
|
|
||||||
host = support.config.get_channel_url()
|
host = support.config.get_channel_url()
|
||||||
|
|
||||||
list_servers = ['mixdrop', 'wstream', 'vupplayer', 'supervideo', 'cloudvideo', 'gounlimited']
|
|
||||||
list_quality = ['default','1080p', '720p', '480p', '360p']
|
|
||||||
|
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ def newest(categoria):
|
|||||||
except:
|
except:
|
||||||
import sys
|
import sys
|
||||||
for line in sys.exc_info():
|
for line in sys.exc_info():
|
||||||
support.log({0}.format(line))
|
support.log(line)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -108,16 +108,5 @@ def findvideos(item):
|
|||||||
itemlist = []
|
itemlist = []
|
||||||
if item.contentType != 'episode': item.contentType = 'movie'
|
if item.contentType != 'episode': item.contentType = 'movie'
|
||||||
video = support.match(html.data, patron=r'<source src="([^"]+)"').match
|
video = support.match(html.data, patron=r'<source src="([^"]+)"').match
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="play", title='Diretto', url=video, server='directo'))
|
||||||
support.Item(
|
|
||||||
channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
title='Diretto',
|
|
||||||
quality='',
|
|
||||||
url=video,
|
|
||||||
server='directo',
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
show=item.show,
|
|
||||||
contentType=item.contentType,
|
|
||||||
folder=False))
|
|
||||||
return support.server(item, itemlist=itemlist)
|
return support.server(item, itemlist=itemlist)
|
||||||
|
|||||||
@@ -3,16 +3,13 @@
|
|||||||
# Canale per animeworld
|
# Canale per animeworld
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
|
|
||||||
from core import support, jsontools
|
from core import support, jsontools
|
||||||
|
|
||||||
host = support.config.get_channel_url()
|
host = support.config.get_channel_url()
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
__channel__ = 'animeworld'
|
__channel__ = 'animeworld'
|
||||||
|
|
||||||
list_servers = ['directo', 'animeworld', 'vvvvid']
|
|
||||||
list_quality = ['default', '480p', '720p', '1080p']
|
|
||||||
|
|
||||||
|
|
||||||
def order():
|
def order():
|
||||||
# Seleziona l'ordinamento dei risultati
|
# Seleziona l'ordinamento dei risultati
|
||||||
@@ -35,6 +32,7 @@ def genres(item):
|
|||||||
action = 'peliculas'
|
action = 'peliculas'
|
||||||
patronBlock = r'<button class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown"> Generi <span.[^>]+>(?P<block>.*?)</ul>'
|
patronBlock = r'<button class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown"> Generi <span.[^>]+>(?P<block>.*?)</ul>'
|
||||||
patronMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)<\/label>'
|
patronMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)<\/label>'
|
||||||
|
|
||||||
def itemHook(item):
|
def itemHook(item):
|
||||||
item.url = host + '/filter?' + item.name + '=' + item.value + '&sort='
|
item.url = host + '/filter?' + item.name + '=' + item.value + '&sort='
|
||||||
return item
|
return item
|
||||||
@@ -45,7 +43,8 @@ def genres(item):
|
|||||||
def menu(item):
|
def menu(item):
|
||||||
action = 'submenu'
|
action = 'submenu'
|
||||||
patronBlock=r'<form class="filters.*?>(?P<block>.*?)</form>'
|
patronBlock=r'<form class="filters.*?>(?P<block>.*?)</form>'
|
||||||
patronMenu=r'<button class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown"> (?P<title>.*?) <span.[^>]+>(?P<url>.*?)</ul>'
|
patronMenu=r'<button class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown"> (?P<title>.*?) <span.[^>]+>(?P<other>.*?)</ul>'
|
||||||
|
|
||||||
def itemlistHook(itemlist):
|
def itemlistHook(itemlist):
|
||||||
item.title = support.typo('Tutti','bold')
|
item.title = support.typo('Tutti','bold')
|
||||||
item.action = 'peliculas'
|
item.action = 'peliculas'
|
||||||
@@ -57,7 +56,7 @@ def menu(item):
|
|||||||
@support.scrape
|
@support.scrape
|
||||||
def submenu(item):
|
def submenu(item):
|
||||||
action = 'peliculas'
|
action = 'peliculas'
|
||||||
data = item.url
|
data = item.other
|
||||||
patronMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)<\/label>'
|
patronMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)<\/label>'
|
||||||
def itemHook(item):
|
def itemHook(item):
|
||||||
item.url = host + '/filter?' + item.name + '=' + item.value + '&language[]=' + item.args + '&sort='
|
item.url = host + '/filter?' + item.name + '=' + item.value + '&language[]=' + item.args + '&sort='
|
||||||
@@ -157,20 +156,7 @@ def findvideos(item):
|
|||||||
|
|
||||||
if serverid == '18':
|
if serverid == '18':
|
||||||
url = support.match('%s/ajax/episode/serverPlayer?id=%s' % (host, ID), patron=r'source src="([^"]+)"', debug=False).match
|
url = support.match('%s/ajax/episode/serverPlayer?id=%s' % (host, ID), patron=r'source src="([^"]+)"', debug=False).match
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="play", title='diretto', url=url, server='directo'))
|
||||||
support.Item(
|
|
||||||
channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
title='diretto',
|
|
||||||
quality='',
|
|
||||||
url=url,
|
|
||||||
server='directo',
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
contentSerieName=item.contentSerieName,
|
|
||||||
contentTitle=item.contentTitle,
|
|
||||||
show=item.show,
|
|
||||||
contentType=item.contentType,
|
|
||||||
folder=False))
|
|
||||||
|
|
||||||
elif serverid == '26':
|
elif serverid == '26':
|
||||||
matches = support.match('%s/ajax/episode/serverPlayer?id=%s' % (host, item.url.split('/')[-1]), patron=r'<a href="([^"]+)"', ).matches
|
matches = support.match('%s/ajax/episode/serverPlayer?id=%s' % (host, item.url.split('/')[-1]), patron=r'<a href="([^"]+)"', ).matches
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ from core import support
|
|||||||
host = support.config.get_channel_url()
|
host = support.config.get_channel_url()
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['verystream', 'openload', 'wstream', 'speedvideo']
|
|
||||||
list_quality = ['HD', 'SD']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ from core.item import Item
|
|||||||
host = support.config.get_channel_url()
|
host = support.config.get_channel_url()
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['supervideo', 'streamcherry','rapidvideo', 'streamango', 'openload']
|
|
||||||
list_quality = ['default', 'HD', '3D', '4K', 'DVD', 'SD']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ from core import support
|
|||||||
host = support.config.get_channel_url() + '/cb01-anime-cartoon'
|
host = support.config.get_channel_url() + '/cb01-anime-cartoon'
|
||||||
|
|
||||||
Blacklist = ['AVVISO IMPORTANTE – CB01.ROCKS', 'Lista Alfabetica Completa Anime/Cartoon', 'CB01.UNO ▶ TROVA L’INDIRIZZO UFFICIALE','Lista Richieste Up & Re-Up']
|
Blacklist = ['AVVISO IMPORTANTE – CB01.ROCKS', 'Lista Alfabetica Completa Anime/Cartoon', 'CB01.UNO ▶ TROVA L’INDIRIZZO UFFICIALE','Lista Richieste Up & Re-Up']
|
||||||
list_servers = ['verystream', 'openload', 'streamango', 'thevideome']
|
|
||||||
list_quality = ['1080p', '720p', '480p', '360']
|
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
@@ -62,7 +62,7 @@ def peliculas(item):
|
|||||||
blacklist = Blacklist
|
blacklist = Blacklist
|
||||||
item.contentType = 'tvshow'
|
item.contentType = 'tvshow'
|
||||||
if item.args == 'newest':
|
if item.args == 'newest':
|
||||||
patron = r'<div id="blockvids">\s*<ul>\s*<li>\s*<a href="(?P<url>[^"]+)"[^>]+><img src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^\[]+)\[(?P<lang>[^\]]+)\]'
|
patron = r'<div id="blockvids">\s*<ul>\s*<li>\s*<a href="(?P<url>[^"]+)"[^>]+><img[^>]+src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^\[]+)\[(?P<lang>[^\]]+)\]'
|
||||||
else:
|
else:
|
||||||
patron = r'<div class="span4">\s*<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)"[^>]+><\/a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+> <h1>(?P<title>[^<\[]+)(?:\[(?P<lang>[^\]]+)\])?</h1></a>.*?-->(?:.*?<br />)?\s*(?P<plot>[^<]+)'
|
patron = r'<div class="span4">\s*<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)"[^>]+><\/a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+> <h1>(?P<title>[^<\[]+)(?:\[(?P<lang>[^\]]+)\])?</h1></a>.*?-->(?:.*?<br />)?\s*(?P<plot>[^<]+)'
|
||||||
patronNext = r'<link rel="next" href="([^"]+)"'
|
patronNext = r'<link rel="next" href="([^"]+)"'
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ def findhost():
|
|||||||
host = config.get_channel_url(findhost)
|
host = config.get_channel_url(findhost)
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['mixdrop', 'akstream', 'wstream', 'backin']
|
|
||||||
list_quality = ['HD', 'SD', 'default']
|
|
||||||
|
|
||||||
checklinks = config.get_setting('checklinks', 'cineblog01')
|
checklinks = config.get_setting('checklinks', 'cineblog01')
|
||||||
checklinks_number = config.get_setting('checklinks_number', 'cineblog01')
|
checklinks_number = config.get_setting('checklinks_number', 'cineblog01')
|
||||||
@@ -135,7 +135,7 @@ def episodios(item):
|
|||||||
data = support.match(item.url, headers=headers).data
|
data = support.match(item.url, headers=headers).data
|
||||||
support.log(data)
|
support.log(data)
|
||||||
if 'TUTTA LA ' in data:
|
if 'TUTTA LA ' in data:
|
||||||
folderUrl = scrapertools.find_single_match(data, 'TUTTA LA \w+\s+(?:–|-)\s+<a href="?([^" ]+)')
|
folderUrl = scrapertools.find_single_match(data, r'TUTTA LA \w+\s+(?:–|-)\s+<a href="?([^" ]+)')
|
||||||
data = httptools.downloadpage(folderUrl).data
|
data = httptools.downloadpage(folderUrl).data
|
||||||
patron = r'<a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)'
|
patron = r'<a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)'
|
||||||
sceneTitle = True
|
sceneTitle = True
|
||||||
@@ -181,18 +181,7 @@ def findvideos(item):
|
|||||||
matches = support.match(streaming, patron = r'<td><a.*?href=([^ ]+) [^>]+>([^<]+)<').matches
|
matches = support.match(streaming, patron = r'<td><a.*?href=([^ ]+) [^>]+>([^<]+)<').matches
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
logger.debug("##### findvideos %s ## %s ## %s ##" % (desc_txt, scrapedurl, scrapedtitle))
|
logger.debug("##### findvideos %s ## %s ## %s ##" % (desc_txt, scrapedurl, scrapedtitle))
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="play", title=scrapedtitle, url=scrapedurl, server=scrapedtitle, quality=quality))
|
||||||
Item(channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
title=scrapedtitle,
|
|
||||||
url=scrapedurl,
|
|
||||||
server=scrapedtitle,
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
thumbnail=item.thumbnail,
|
|
||||||
show=item.show,
|
|
||||||
quality=quality,
|
|
||||||
contentType=item.contentType,
|
|
||||||
folder=False))
|
|
||||||
|
|
||||||
support.log()
|
support.log()
|
||||||
|
|
||||||
@@ -213,7 +202,7 @@ def findvideos(item):
|
|||||||
|
|
||||||
itemlist = support.server(item, itemlist=itemlist)
|
itemlist = support.server(item, itemlist=itemlist)
|
||||||
# Extract the quality format
|
# Extract the quality format
|
||||||
patronvideos = '([\w.]+)</strong></div></td>'
|
patronvideos = r'([\w.]+)</strong></div></td>'
|
||||||
support.addQualityTag(item, itemlist, data, patronvideos)
|
support.addQualityTag(item, itemlist, data, patronvideos)
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -231,24 +220,13 @@ def findvid_serie(item):
|
|||||||
# Estrae i contenuti
|
# Estrae i contenuti
|
||||||
matches = support.match(html, patron=r'<a href=(?:")?([^ "]+)[^>]+>(?!<!--)(.*?)(?:</a>|<img)').matches
|
matches = support.match(html, patron=r'<a href=(?:")?([^ "]+)[^>]+>(?!<!--)(.*?)(?:</a>|<img)').matches
|
||||||
for url, server in matches:
|
for url, server in matches:
|
||||||
item = Item(channel=item.channel,
|
item = item.clone(action="play", title=server, url=url, server=server, quality=blktxt)
|
||||||
action="play",
|
|
||||||
title=server,
|
|
||||||
url=url,
|
|
||||||
server=server,
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
show=item.show,
|
|
||||||
quality=blktxt,
|
|
||||||
contentType=item.contentType,
|
|
||||||
folder=False)
|
|
||||||
if 'swzz' in item.url: item.url = support.swzz_get_url(item)
|
if 'swzz' in item.url: item.url = support.swzz_get_url(item)
|
||||||
itemlist.append(item)
|
itemlist.append(item)
|
||||||
|
|
||||||
support.log()
|
support.log()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
lnkblk = []
|
|
||||||
lnkblkp = []
|
|
||||||
|
|
||||||
data = re.sub(r'((?:<p>|<strong>)?[^\d]*\d*(?:×|Ã)[0-9]+[^<]+)', '' ,item.url)
|
data = re.sub(r'((?:<p>|<strong>)?[^\d]*\d*(?:×|Ã)[0-9]+[^<]+)', '' ,item.url)
|
||||||
|
|
||||||
@@ -267,4 +245,4 @@ def findvid_serie(item):
|
|||||||
|
|
||||||
def play(item):
|
def play(item):
|
||||||
support.log()
|
support.log()
|
||||||
return servertools.find_video_items(data=item.url)
|
return servertools.find_video_items(item, data=item.url)
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ from core import httptools, support, scrapertools
|
|||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import config
|
from platformcode import config
|
||||||
|
|
||||||
list_servers = ['akstream', 'wstream', 'backin', 'clipwatching', 'cloudvideo', 'verystream', 'onlystream', 'mixdrop']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
# rimanda a .today che contiene tutti link a .plus
|
# rimanda a .today che contiene tutti link a .plus
|
||||||
# def findhost():
|
# def findhost():
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ def menu(item):
|
|||||||
elif 'percorsi' in item.url:
|
elif 'percorsi' in item.url:
|
||||||
patron = r'<div class="cover_percorso">\s*<a href="(?P<url>[^"]+)">\s*<img src="(?P<thumb>[^"]+)"[^>]+>\s*[^>]+>(?P<title>.*?)<'
|
patron = r'<div class="cover_percorso">\s*<a href="(?P<url>[^"]+)">\s*<img src="(?P<thumb>[^"]+)"[^>]+>\s*[^>]+>(?P<title>.*?)<'
|
||||||
else:
|
else:
|
||||||
patron = r'<h2>\s*<a href="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)<'
|
patron = r'<h2>\s*<a href="(?P<url>[^,"]+),[^"]+"\s*>(?P<title>[^<]+)<'
|
||||||
patronNext = r'<div class="dx">\s*<a href="(.*?)">pagina suc'
|
patronNext = r'<div class="dx">\s*<a href="(.*?)">pagina suc'
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
@@ -68,14 +68,7 @@ def findvideos(item):
|
|||||||
matches = support.match(item, patron=r'filename: "(.*?)"').matches
|
matches = support.match(item, patron=r'filename: "(.*?)"').matches
|
||||||
|
|
||||||
for url in matches:
|
for url in matches:
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="play", title='Diretto', server='directo', url=host + url))
|
||||||
Item(
|
|
||||||
channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
title='Diretto',
|
|
||||||
server='directo',
|
|
||||||
url=host + url,
|
|
||||||
folder=False))
|
|
||||||
|
|
||||||
return support.server(item, itemlist=itemlist)
|
return support.server(item, itemlist=itemlist)
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ def newest(categoria):
|
|||||||
|
|
||||||
@support.scrape
|
@support.scrape
|
||||||
def peliculas(item):
|
def peliculas(item):
|
||||||
|
# debug = True
|
||||||
anime = True
|
anime = True
|
||||||
if 'movie' in item.url:
|
if 'movie' in item.url:
|
||||||
item.contentType = 'movie'
|
item.contentType = 'movie'
|
||||||
@@ -88,7 +89,7 @@ def peliculas(item):
|
|||||||
patronBlock = r'<div id="%s"[^>]+>(?P<block>.*?)<div class="vistaDettagliata"' % item.args[1]
|
patronBlock = r'<div id="%s"[^>]+>(?P<block>.*?)<div class="vistaDettagliata"' % item.args[1]
|
||||||
patron = r'<li>\s*<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)" class="thumb">[^>]+>[^>]+>[^>]+>\s*[EePp]+\s*(?P<episode>\d+)[^>]+>[^>]+>[^>]+>(?P<lang>[^<]*)<[^>]+>[^>]+>\s<img src="(?P<thumb>[^"]+)"'
|
patron = r'<li>\s*<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)" class="thumb">[^>]+>[^>]+>[^>]+>\s*[EePp]+\s*(?P<episode>\d+)[^>]+>[^>]+>[^>]+>(?P<lang>[^<]*)<[^>]+>[^>]+>\s<img src="(?P<thumb>[^"]+)"'
|
||||||
else:
|
else:
|
||||||
patron = r'<div class="showStreaming"> <b>(?P<title>[^<]+)[^>]+>[^>]+>\s*Stato streaming: (?:[^<]+)<[^>]+>[^>]+>\s*Lingua:[ ](?P<lang>ITA\/JAP|ITA|JAP|SUB ITA)?[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<div class="[^"]+" style="background: url\((?P<thumb>[^\)]+)\)'
|
patron = r'<div class="showStreaming"> <b>(?P<title>[^<]+)[^>]+>[^>]+>\s*<span>Lingua:\s*(?P<lang>[^>]+)?>[<>br\s]+a href="(?P<url>[^"]+)"[^>]+>.*?--image-url:url\(/*(?P<thumb>[^\)]+).*?Anno di inizio</b>:\s*(?P<year>[0-9]{4})'
|
||||||
patronNext = '<li class="currentPage">[^>]+><li[^<]+<a href="([^"]+)">'
|
patronNext = '<li class="currentPage">[^>]+><li[^<]+<a href="([^"]+)">'
|
||||||
|
|
||||||
return locals()
|
return locals()
|
||||||
@@ -120,14 +121,7 @@ def findvideos(item):
|
|||||||
return episodios(item)
|
return episodios(item)
|
||||||
|
|
||||||
if 'vvvvid' in matches.data:
|
if 'vvvvid' in matches.data:
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="play", title='VVVVID', url=support.match(matches.data, patron=r'(http://www.vvvvid[^"]+)').match, server='vvvvid'))
|
||||||
support.Item(channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
contentType=item.contentType,
|
|
||||||
title='vvvid',
|
|
||||||
url=support.match(matches.data, patron=r'(http://www.vvvvid[^"]+)').match,
|
|
||||||
server='vvvvid',
|
|
||||||
))
|
|
||||||
else:
|
else:
|
||||||
# matches.matches.sort()
|
# matches.matches.sort()
|
||||||
support.log('VIDEO')
|
support.log('VIDEO')
|
||||||
@@ -139,17 +133,7 @@ def findvideos(item):
|
|||||||
language = 'Sub-' + language
|
language = 'Sub-' + language
|
||||||
quality = url.split('/')[-1].split('?')[0]
|
quality = url.split('/')[-1].split('?')[0]
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="play", title=language, url=url, contentLanguage = language, quality = quality, order = quality.replace('p','').zfill(4), server='directo',))
|
||||||
support.Item(channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
contentType=item.contentType,
|
|
||||||
title=language,
|
|
||||||
url=url,
|
|
||||||
contentLanguage = language,
|
|
||||||
quality = quality,
|
|
||||||
order = quality.replace('p','').zfill(4),
|
|
||||||
server='directo',
|
|
||||||
))
|
|
||||||
|
|
||||||
itemlist.sort(key=lambda x: (x.title, x.order), reverse=False)
|
itemlist.sort(key=lambda x: (x.title, x.order), reverse=False)
|
||||||
return support.server(item, itemlist=itemlist)
|
return support.server(item, itemlist=itemlist)
|
||||||
@@ -15,15 +15,9 @@ def findhost():
|
|||||||
host = support.config.get_channel_url(findhost)
|
host = support.config.get_channel_url(findhost)
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
|
|
||||||
list_servers = ['akstream', 'wstream', 'mixdrop', 'vidtome', 'turbovid', 'speedvideo', 'flashx', 'nowvideo', 'deltabit']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
support.log()
|
support.log()
|
||||||
|
|
||||||
|
|
||||||
tvshow = []
|
tvshow = []
|
||||||
anime = ['/category/anime-cartoni-animati/']
|
anime = ['/category/anime-cartoni-animati/']
|
||||||
mix = [('Aggiornamenti {bullet bold} {TV}', ['/aggiornamento-episodi/', 'peliculas', 'newest']),
|
mix = [('Aggiornamenti {bullet bold} {TV}', ['/aggiornamento-episodi/', 'peliculas', 'newest']),
|
||||||
@@ -37,7 +31,7 @@ def mainlist(item):
|
|||||||
def peliculas(item):
|
def peliculas(item):
|
||||||
action = 'episodios'
|
action = 'episodios'
|
||||||
if item.args == 'newest':
|
if item.args == 'newest':
|
||||||
patron = r'<span class="serieTitle" style="font-size:20px">(?P<title>.*?)[^âÂÂâ][\s]*<a href="(?P<url>[^"]+)"[^>]*> ?(?P<episode>\d+x\d+-\d+|\d+x\d+) .*?[ ]?\(?(?P<lang>SUB ITA)?\)?</a>'
|
patron = r'<span class="serieTitle" style="font-size:20px">(?P<title>[^<]+)–\s*<a href="(?P<url>[^"]+)"[^>]*>\s?(?P<episode>\d+[×x]\d+-\d+|\d+[×x]\d+) (?P<title2>[^<]+)\s?\(?(?P<lang>SUB ITA)?\)?</a>'
|
||||||
pagination = ''
|
pagination = ''
|
||||||
else:
|
else:
|
||||||
patron = r'<div class="post-thumb">.*?\s<img src="(?P<thumb>[^"]+)".*?><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.+?)\s?(?: Serie Tv)?\s?\(?(?P<year>\d{4})?\)?<\/a><\/h2>'
|
patron = r'<div class="post-thumb">.*?\s<img src="(?P<thumb>[^"]+)".*?><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.+?)\s?(?: Serie Tv)?\s?\(?(?P<year>\d{4})?\)?<\/a><\/h2>'
|
||||||
@@ -55,7 +49,7 @@ def episodios(item):
|
|||||||
|
|
||||||
def itemHook(item):
|
def itemHook(item):
|
||||||
if not item.url:
|
if not item.url:
|
||||||
item.url =''
|
item.url = ''
|
||||||
return item
|
return item
|
||||||
|
|
||||||
return locals()
|
return locals()
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ from platformcode import config
|
|||||||
|
|
||||||
host = config.get_channel_url()
|
host = config.get_channel_url()
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
list_servers = ['wstream', 'upstream', 'flashx', 'vidoza', 'vidtome']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
@@ -100,7 +100,6 @@ def genres(item):
|
|||||||
|
|
||||||
def search(item, text):
|
def search(item, text):
|
||||||
support.log('search', item)
|
support.log('search', item)
|
||||||
itemlist = []
|
|
||||||
text = text.replace(' ', '+')
|
text = text.replace(' ', '+')
|
||||||
item.url = host + '?s=' + text
|
item.url = host + '?s=' + text
|
||||||
try:
|
try:
|
||||||
@@ -133,7 +132,7 @@ def newest(categoria):
|
|||||||
except:
|
except:
|
||||||
import sys
|
import sys
|
||||||
for line in sys.exc_info():
|
for line in sys.exc_info():
|
||||||
support.log('newest log: ', {0}.format(line))
|
support.log('newest log: ', line)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -163,16 +162,16 @@ def findvideos(item):
|
|||||||
titles = support.typo(series.upper().replace('-', ' '), 'bold color kod')
|
titles = support.typo(series.upper().replace('-', ' '), 'bold color kod')
|
||||||
goseries = support.typo("Vai alla Serie:", ' bold color kod')
|
goseries = support.typo("Vai alla Serie:", ' bold color kod')
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(channel=item.channel,
|
||||||
title=goseries + titles,
|
title=goseries + titles,
|
||||||
fulltitle=titles,
|
fulltitle=titles,
|
||||||
show=series,
|
show=series,
|
||||||
contentType='tvshow',
|
contentType='tvshow',
|
||||||
contentSerieName=series,
|
contentSerieName=series,
|
||||||
url=host+"/serietv/"+series,
|
url=host+"/serietv/"+series,
|
||||||
action='episodios',
|
action='episodios',
|
||||||
contentTitle=titles,
|
contentTitle=titles,
|
||||||
plot = "Vai alla Serie " + titles + " con tutte le puntate",
|
plot = "Vai alla Serie " + titles + " con tutte le puntate",
|
||||||
))
|
))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "filmigratis",
|
"id": "filmigratis",
|
||||||
"name": "Filmi Gratis",
|
"name": "Filmi Gratis",
|
||||||
"active": true,
|
"active": false,
|
||||||
"language": ["ita", "sub-ita"],
|
"language": ["ita", "sub-ita"],
|
||||||
"thumbnail": "filmigratis.png",
|
"thumbnail": "filmigratis.png",
|
||||||
"banner": "filmigratis.png",
|
"banner": "filmigratis.png",
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ from platformcode import config
|
|||||||
|
|
||||||
host = config.get_channel_url()
|
host = config.get_channel_url()
|
||||||
|
|
||||||
list_servers = ['verystream', 'openload', 'streamango', 'vidoza', 'okru']
|
|
||||||
list_quality = ['1080p', '720p', '480p', '360']
|
|
||||||
|
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ def findhost():
|
|||||||
|
|
||||||
host = config.get_channel_url(findhost)
|
host = config.get_channel_url(findhost)
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
list_servers = ['mixdrop', 'akvideo', 'wstream', 'onlystream', 'speedvideo']
|
|
||||||
list_quality = ['HD', 'SD']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "filmsenzalimiticc",
|
|
||||||
"name": "Filmsenzalimiti CC",
|
|
||||||
"active": false,
|
|
||||||
"language": ["ita"],
|
|
||||||
"thumbnail": "filmsenzalimiticc.png",
|
|
||||||
"banner": "",
|
|
||||||
"categories": ["movie","tvshow"],
|
|
||||||
"settings": [
|
|
||||||
{
|
|
||||||
"id": "include_in_global_search",
|
|
||||||
"type": "bool",
|
|
||||||
"label": "Includi ricerca globale",
|
|
||||||
"default": false,
|
|
||||||
"enabled": false,
|
|
||||||
"visible": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "include_in_newest_peliculas",
|
|
||||||
"type": "bool",
|
|
||||||
"label": "Includi in Novità - Film",
|
|
||||||
"default": true,
|
|
||||||
"enabled": true,
|
|
||||||
"visible": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "include_in_newest_series",
|
|
||||||
"type": "bool",
|
|
||||||
"label": "Includi in Novità - Serie TV",
|
|
||||||
"default": true,
|
|
||||||
"enabled": true,
|
|
||||||
"visible": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "checklinks",
|
|
||||||
"type": "bool",
|
|
||||||
"label": "Verifica se i link esistono",
|
|
||||||
"default": false,
|
|
||||||
"enabled": true,
|
|
||||||
"visible": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "checklinks_number",
|
|
||||||
"type": "list",
|
|
||||||
"label": "Numero de link da verificare",
|
|
||||||
"default": 1,
|
|
||||||
"enabled": true,
|
|
||||||
"visible": "eq(-1,true)",
|
|
||||||
"lvalues": [ "1", "3", "5", "10" ]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "filter_languages",
|
|
||||||
"type": "list",
|
|
||||||
"label": "Mostra link in lingua...",
|
|
||||||
"default": 0,
|
|
||||||
"enabled": true,
|
|
||||||
"visible": true,
|
|
||||||
"lvalues": ["Non filtrare","IT"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,317 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# ------------------------------------------------------------
|
|
||||||
# Canale per Filmsenzalimiti CC
|
|
||||||
# ------------------------------------------------------------
|
|
||||||
import re
|
|
||||||
|
|
||||||
try:
|
|
||||||
import urlparse
|
|
||||||
except:
|
|
||||||
import urllib.parse as urlparse
|
|
||||||
|
|
||||||
from core import scrapertools, servertools, httptools
|
|
||||||
from core import tmdb
|
|
||||||
from core.item import Item
|
|
||||||
from platformcode import config
|
|
||||||
from platformcode import logger
|
|
||||||
from specials import autoplay
|
|
||||||
|
|
||||||
# Necessario per Autoplay
|
|
||||||
host = config.get_channel_url()
|
|
||||||
|
|
||||||
IDIOMAS = {'Italiano': 'IT'}
|
|
||||||
list_language = IDIOMAS.values()
|
|
||||||
list_servers = ['verystream', 'openload', 'vidlox', 'youtube']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
# Necessario per Verifica Link
|
|
||||||
checklinks = config.get_setting('checklinks', 'filmsenzalimiticc')
|
|
||||||
checklinks_number = config.get_setting('checklinks_number', 'filmsenzalimiticc')
|
|
||||||
|
|
||||||
headers = [['Referer', host]]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def mainlist(item):
|
|
||||||
logger.info('[filmsenzalimiticc.py] mainlist')
|
|
||||||
|
|
||||||
autoplay.init(item.channel, list_servers, list_quality) # Necessario per Autoplay
|
|
||||||
|
|
||||||
# Menu Principale
|
|
||||||
itemlist = [Item(channel=item.channel,
|
|
||||||
action='video',
|
|
||||||
title='Film',
|
|
||||||
url=host,
|
|
||||||
contentType='movie',
|
|
||||||
thumbnail=''),
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action='sottomenu_film',
|
|
||||||
title='Categorie Film',
|
|
||||||
url=host,
|
|
||||||
contentType='movie',
|
|
||||||
thumbnail=''),
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action='video',
|
|
||||||
title='Serie TV',
|
|
||||||
url=host+'/serie-tv/',
|
|
||||||
contentType='tvshow',
|
|
||||||
thumbnail=''),
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action='sottomenu_serie',
|
|
||||||
title='[B]Categorie Serie TV[/B]',
|
|
||||||
thumbnail=''),
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action='search',
|
|
||||||
extra='tvshow',
|
|
||||||
title='[B]Cerca... (non funziona)[/B]',
|
|
||||||
thumbnail='')
|
|
||||||
]
|
|
||||||
|
|
||||||
autoplay.show_option(item.channel, itemlist) # Necessario per Autoplay (Menu Configurazione)
|
|
||||||
|
|
||||||
return itemlist
|
|
||||||
|
|
||||||
def search(item, texto):
|
|
||||||
logger.info('[filmsenzalimiticc.py] search')
|
|
||||||
|
|
||||||
item.url = host + '/?s=' + texto
|
|
||||||
|
|
||||||
try:
|
|
||||||
return video(item)
|
|
||||||
|
|
||||||
# Continua la ricerca in caso di errore .
|
|
||||||
except:
|
|
||||||
import sys
|
|
||||||
for line in sys.exc_info():
|
|
||||||
logger.error('%s' % line)
|
|
||||||
return []
|
|
||||||
|
|
||||||
def sottomenu_film(item):
|
|
||||||
logger.info('[filmsenzalimiticc.py] sottomenu_film')
|
|
||||||
itemlist = []
|
|
||||||
|
|
||||||
# Carica la pagina
|
|
||||||
data = httptools.downloadpage(item.url).data
|
|
||||||
|
|
||||||
# Estrae i contenuti
|
|
||||||
patron = "<li><a href='([^']+)'>(.*?)<"
|
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
|
||||||
itemlist.append(
|
|
||||||
Item(channel=__channel__,
|
|
||||||
action='video',
|
|
||||||
contentType=item.contentType,
|
|
||||||
title=scrapedtitle,
|
|
||||||
url=scrapedurl))
|
|
||||||
|
|
||||||
# Elimina le Serie al Sottomenù
|
|
||||||
itemlist.pop(3)
|
|
||||||
itemlist.pop(29)
|
|
||||||
itemlist.pop(29)
|
|
||||||
itemlist.pop(32)
|
|
||||||
|
|
||||||
return itemlist
|
|
||||||
|
|
||||||
def sottomenu_serie(item):
|
|
||||||
logger.info('[seriehd.py] sottomenu_serie')
|
|
||||||
itemlist = [
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action='video',
|
|
||||||
title='Serie TV HD',
|
|
||||||
url=host+'/watch-genre/serie-altadefinizione/',
|
|
||||||
contentType='tvshow',
|
|
||||||
thumbnail=''),
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action='video',
|
|
||||||
title='Miniserie',
|
|
||||||
url=host+'/watch-genre/miniserie/',
|
|
||||||
contentType='tvshow',
|
|
||||||
thumbnail=''),
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action='video',
|
|
||||||
title='Programmi TV',
|
|
||||||
url=host+'/watch-genre/programmi-tv/',
|
|
||||||
contentType='tvshow',
|
|
||||||
thumbnail='')
|
|
||||||
]
|
|
||||||
|
|
||||||
return itemlist
|
|
||||||
|
|
||||||
|
|
||||||
def video(item):
|
|
||||||
logger.info('[filmsenzalimiticc.py] video')
|
|
||||||
itemlist = []
|
|
||||||
|
|
||||||
# Carica la pagina
|
|
||||||
data = httptools.downloadpage(item.url).data.replace('\n','').replace('\t','')
|
|
||||||
|
|
||||||
# Estrae i contenuti
|
|
||||||
patron = r'<div class="mediaWrap mediaWrapAlt">.*?<a href="([^"]+)".*?src="([^"]+)".*?<p>([^"]+) (\(.*?)streaming<\/p>.*?<p>\s*(\S+).*?<\/p>'
|
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
|
||||||
|
|
||||||
for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedyear, scrapedquality in matches:
|
|
||||||
scrapedthumbnail = httptools.get_url_headers(scrapedthumbnail)
|
|
||||||
scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle)
|
|
||||||
scrapedyear = scrapertools.decodeHtmlentities(scrapedyear)
|
|
||||||
scrapedquality = scrapertools.decodeHtmlentities(scrapedquality)
|
|
||||||
|
|
||||||
year = scrapedyear.replace('(','').replace(')','')
|
|
||||||
infolabels = {}
|
|
||||||
if year:
|
|
||||||
infolabels['year'] = year
|
|
||||||
|
|
||||||
title = scrapedtitle + ' '+ scrapedyear +' [' + scrapedquality + ']'
|
|
||||||
|
|
||||||
# Seleziona fra Serie TV e Film
|
|
||||||
if item.contentType == 'movie':
|
|
||||||
azione = 'findvideos'
|
|
||||||
tipologia = 'movie'
|
|
||||||
if item.contentType == 'tvshow':
|
|
||||||
azione='episodios'
|
|
||||||
tipologia = 'tv'
|
|
||||||
|
|
||||||
itemlist.append(
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action=azione,
|
|
||||||
contentType=item.contentType,
|
|
||||||
title=title,
|
|
||||||
fulltitle=scrapedtitle,
|
|
||||||
text_color='azure',
|
|
||||||
url=scrapedurl,
|
|
||||||
thumbnail=scrapedthumbnail,
|
|
||||||
infoLabels=infolabels,
|
|
||||||
show=scrapedtitle))
|
|
||||||
|
|
||||||
# Next page
|
|
||||||
next_page = scrapertools.find_single_match(data, '<a class="nextpostslink".*?href="([^"]+)">')
|
|
||||||
|
|
||||||
if next_page != '':
|
|
||||||
itemlist.append(
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action='film',
|
|
||||||
title='[COLOR lightgreen]' + config.get_localized_string(30992) + '[/COLOR]',
|
|
||||||
url=next_page,
|
|
||||||
contentType=item.contentType,
|
|
||||||
thumbnail='http://2.bp.blogspot.com/-fE9tzwmjaeQ/UcM2apxDtjI/AAAAAAAAeeg/WKSGM2TADLM/s1600/pager+old.png'))
|
|
||||||
|
|
||||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
|
||||||
return itemlist
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def findvideos(item): # Questa def. deve sempre essere nominata findvideos
|
|
||||||
logger.info('[filmsenzalimiticc.py] findvideos')
|
|
||||||
itemlist = []
|
|
||||||
|
|
||||||
# Carica la pagina
|
|
||||||
data = httptools.downloadpage(item.url, headers=headers).data
|
|
||||||
|
|
||||||
# Aggira protectlink
|
|
||||||
if 'protectlink' in data:
|
|
||||||
urls = scrapertools.find_multiple_matches(data, r'<iframe src="[^=]+=(.*?)"')
|
|
||||||
for url in urls:
|
|
||||||
url= url.decode('base64')
|
|
||||||
if '\t' in url: #fix alcuni link presentano una tabulazione finale.
|
|
||||||
url = url[:-1]
|
|
||||||
data += '\t' + url
|
|
||||||
if 'nodmca' in data: #fix player Openload sezione Serie TV
|
|
||||||
page = httptools.downloadpage(url, headers=headers).data
|
|
||||||
data += '\t' + scrapertools.find_single_match(page,'<meta name="og:url" content="([^=]+)">')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
itemlist = servertools.find_video_items(data=data)
|
|
||||||
|
|
||||||
for videoitem in itemlist:
|
|
||||||
videoitem.title = item.fulltitle + ' - [[COLOR limegreen]'+videoitem.title+'[/COLOR] ]'
|
|
||||||
videoitem.fulltitle = item.fulltitle
|
|
||||||
videoitem.thumbnail = item.thumbnail
|
|
||||||
videoitem.show = item.show
|
|
||||||
videoitem.plot = item.plot
|
|
||||||
videoitem.channel = item.channel
|
|
||||||
videoitem.contentType = item.contentType
|
|
||||||
|
|
||||||
# Link Aggiungi alla Libreria
|
|
||||||
if item.contentType != 'episode':
|
|
||||||
if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findservers':
|
|
||||||
itemlist.append(
|
|
||||||
Item(channel=item.channel, title='[COLOR lightblue][B]Aggiungi alla videoteca[/B][/COLOR]', url=item.url,
|
|
||||||
action='add_pelicula_to_library', extra='findservers', contentTitle=item.contentTitle))
|
|
||||||
|
|
||||||
# Necessario per FilterTools
|
|
||||||
# itemlist = filtertools.get_links(itemlist, item, list_language)
|
|
||||||
|
|
||||||
# Necessario per AutoPlay
|
|
||||||
autoplay.start(itemlist, item)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return itemlist
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def episodios(item): # Questa def. deve sempre essere nominata episodios
|
|
||||||
logger.info('[filmsenzalimiticc.py] episodios')
|
|
||||||
itemlist = []
|
|
||||||
|
|
||||||
# Trova le Stagioni
|
|
||||||
|
|
||||||
# Carica la pagina
|
|
||||||
data = httptools.downloadpage(item.url, headers=headers).data
|
|
||||||
|
|
||||||
# Estrae i contenuti
|
|
||||||
patron = r'<iframe src="([^"]+)".*?>'
|
|
||||||
url = scrapertools.find_single_match(data, patron)
|
|
||||||
|
|
||||||
# Carica la pagina
|
|
||||||
data = httptools.downloadpage(url).data.replace('\t', '').replace('\n', '')
|
|
||||||
|
|
||||||
# Estrae i contenuti
|
|
||||||
section_stagione = scrapertools.find_single_match(data, r'Stagioni<\/a>(.*?)<\/ul>')
|
|
||||||
patron = r'<a href="([^"]+)" >.*?<\/i>\s(.*?)<\/a>'
|
|
||||||
seasons = re.compile(patron, re.DOTALL).findall(section_stagione)
|
|
||||||
|
|
||||||
for scrapedseason_url, scrapedseason in seasons:
|
|
||||||
|
|
||||||
# Trova gli Episodi
|
|
||||||
|
|
||||||
season_url = urlparse.urljoin(url, scrapedseason_url)
|
|
||||||
|
|
||||||
# Carica la pagina
|
|
||||||
data = httptools.downloadpage(season_url).data.replace('\t', '').replace('\n', '')
|
|
||||||
|
|
||||||
# Estrae i contenuti
|
|
||||||
section_episodio = scrapertools.find_single_match(data, r'Episodio<\/a>(.*?)<\/ul>')
|
|
||||||
patron = r'<a href="([^"]+)" >.*?<\/i>\s(.*?)<\/a>'
|
|
||||||
episodes = re.compile(patron, re.DOTALL).findall(section_episodio)
|
|
||||||
|
|
||||||
for scrapedepisode_url, scrapedepisode in episodes:
|
|
||||||
episode_url = urlparse.urljoin(url, scrapedepisode_url)
|
|
||||||
|
|
||||||
title = scrapedseason + 'x' + scrapedepisode.zfill(2)
|
|
||||||
|
|
||||||
itemlist.append(
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action='findvideos',
|
|
||||||
contentType='episode',
|
|
||||||
title=title,
|
|
||||||
url=episode_url,
|
|
||||||
fulltitle=title + ' - ' + item.show,
|
|
||||||
show=item.show,
|
|
||||||
thumbnail=item.thumbnail))
|
|
||||||
|
|
||||||
# Link Aggiungi alla Libreria
|
|
||||||
if config.get_videolibrary_support() and len(itemlist) != 0:
|
|
||||||
itemlist.append(
|
|
||||||
Item(channel=item.channel,
|
|
||||||
title='[COLOR lightblue][B]Aggiungi Serie alla videoteca[/B][/COLOR]',
|
|
||||||
url=item.url,
|
|
||||||
action='add_serie_to_library',
|
|
||||||
extra='episodios' + '###' + item.extra,
|
|
||||||
show=item.show))
|
|
||||||
|
|
||||||
return itemlist
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"id": "guardaserieCam",
|
||||||
|
"name": "GuardaSerie Cam",
|
||||||
|
"language": ["ita", "sub-ita"],
|
||||||
|
"active": true,
|
||||||
|
"thumbnail": "https://raw.githubusercontent.com/32Dexter/DexterRepo/master/media/guardaserie_live.png",
|
||||||
|
"banner": "",
|
||||||
|
"categories": ["tvshow"],
|
||||||
|
"not_active": ["include_in_newest"],
|
||||||
|
"settings": []
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Canale per 'guardaserie_live'
|
||||||
|
# By: Napster32
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Rev: 0.0
|
||||||
|
# Update 11-06-2020
|
||||||
|
# fix:
|
||||||
|
# 1. Emissione
|
||||||
|
|
||||||
|
# possibilità di miglioramento: inserire menu per genere - lista serie tv e gestire le novità
|
||||||
|
|
||||||
|
from core import support
|
||||||
|
from core.support import log
|
||||||
|
from platformcode import logger, config
|
||||||
|
|
||||||
|
host = config.get_channel_url()
|
||||||
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@support.menu
|
||||||
|
def mainlist(item):
|
||||||
|
tvshow = ['/serietv-streaming',
|
||||||
|
('Per Lettera', ['/serietv-streaming/A', 'list', 'Serie-Tv per Lettera'])
|
||||||
|
]
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
|
@support.scrape
|
||||||
|
def list(item):
|
||||||
|
patronMenu = r'<a title="(?P<title>[^"]+)" href="(?P<url>[^"]+)'
|
||||||
|
action = 'peliculas'
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
|
@support.scrape
|
||||||
|
def peliculas(item):
|
||||||
|
patron = r'<div class="mlnh-thumb"><a href="(?P<url>[^"]+).*?title="(?P<title>[^"]+).*?src="(?P<thumb>[^"]+).*?hdn">(?P<year>[0-9]{4})'
|
||||||
|
patronNext = 'pagenavi.*?<span>.</span>.*?<a href="([^"]+)'
|
||||||
|
action = 'episodios'
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
|
@support.scrape
|
||||||
|
def episodios(item):
|
||||||
|
patronBlock = r'<div class="tab-pane fade" id="season-(?P<season>.)"(?P<block>.*?)</div>'
|
||||||
|
patron = r'<a href="#" allowfullscreen data-link="(?P<url>[^"]+).*?title="(?P<title>[^"]+)(?P<lang>[sS][uU][bB]-?[iI][tT][aA])?\s*">(?P<episode>[^<]+)'
|
||||||
|
action = 'findvideos'
|
||||||
|
# debug = True
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
|
def search(item, text):
|
||||||
|
support.log('search', item)
|
||||||
|
item.contentType = 'tvshow'
|
||||||
|
itemlist = []
|
||||||
|
text = text.replace(' ', '+')
|
||||||
|
item.url = host + '/index.php?story=%s&do=search&subaction=search' % (text)
|
||||||
|
try:
|
||||||
|
return peliculas(item)
|
||||||
|
except:
|
||||||
|
import sys
|
||||||
|
for line in sys.exc_info():
|
||||||
|
log('search log:', line)
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
def findvideos(item):
|
||||||
|
logger.info("[guardaserie_live] findvideos")
|
||||||
|
return support.server(item, item.url)
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"id": "guardaserieIcu",
|
||||||
|
"name": "Guarda Serie Icu",
|
||||||
|
"language": ["ita", "sub-ita"],
|
||||||
|
"active": false,
|
||||||
|
"thumbnail": "https://raw.githubusercontent.com/32Dexter/DexterRepo/master/media/guarda_serie.jpg",
|
||||||
|
"banner": "",
|
||||||
|
"categories": ["tvshow"],
|
||||||
|
"not_active": ["include_in_newest"],
|
||||||
|
"settings": []
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Canale per 'Guarda_Serie'
|
||||||
|
# By: Napster32
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Rev: 0.0
|
||||||
|
# Update 11-06-2020
|
||||||
|
# fix:
|
||||||
|
# 1. Emissione
|
||||||
|
|
||||||
|
# possibilità di miglioramento: gestire le novità (sezione Ultimi episodi sul sito)
|
||||||
|
|
||||||
|
from core.support import log
|
||||||
|
from core import support
|
||||||
|
from platformcode import config
|
||||||
|
|
||||||
|
host = config.get_channel_url()
|
||||||
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@support.menu
|
||||||
|
def mainlist(item):
|
||||||
|
tvshow = ['/serie']
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
@support.scrape
|
||||||
|
def peliculas(item):
|
||||||
|
patronBlock = r'movies-list movies-list-full(?P<block>.*?)footer>'
|
||||||
|
patron = r'<div data-movie-id.*?a href="(?P<url>[^"]+).*?<img data-original="(?P<thumbnail>[^"]+).*?qtip-title">(?P<title>[^<]+).*?(?:rel="tag">(?P<year>[0-9]{4}))?</a>'
|
||||||
|
patronNext = '<li class=.active.>.*?href=.(.*?).>'
|
||||||
|
action = 'episodios'
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
@support.scrape
|
||||||
|
def episodios(item):
|
||||||
|
patronBlock = r'<strong>Stagione (?P<season>[0-9]+)(?P<block>.*?)</div></div>'
|
||||||
|
patron = r'<a href="(?P<url>[^"]+)">\s*Episodio\s*(?P<episode>[0-9]+)'
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
def search(item, text):
|
||||||
|
log(text)
|
||||||
|
itemlist = []
|
||||||
|
text = text.replace(' ', '+')
|
||||||
|
item.url = host + "/?s=" + text
|
||||||
|
try:
|
||||||
|
item.args = 'search'
|
||||||
|
return peliculas(item)
|
||||||
|
except:
|
||||||
|
import sys
|
||||||
|
for line in sys.exc_info():
|
||||||
|
log("%s" % line)
|
||||||
|
|
||||||
|
return []
|
||||||
|
|
||||||
|
def findvideos(item):
|
||||||
|
support.log('findvideos', item)
|
||||||
|
return support.server(item, headers=headers)
|
||||||
@@ -22,8 +22,6 @@ from core.support import log
|
|||||||
host = config.get_channel_url()
|
host = config.get_channel_url()
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['speedvideo', 'openload']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ from core import httptools, support
|
|||||||
host = support.config.get_channel_url()
|
host = support.config.get_channel_url()
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['mega']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ support.log('HOST',host)
|
|||||||
# host = 'https://ilcorsaronero.xyz'
|
# host = 'https://ilcorsaronero.xyz'
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['torrent']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
@@ -51,8 +51,7 @@ def peliculas(item):
|
|||||||
if item.args[1] in ['tvshow', 'anime', 'music', 'other']:
|
if item.args[1] in ['tvshow', 'anime', 'music', 'other']:
|
||||||
patron = r'>[^"<]+'
|
patron = r'>[^"<]+'
|
||||||
else:
|
else:
|
||||||
patron = r'>(?P<quality>[^"<]+)'
|
patron = r'>(?P<quality>[^"<]+)</td> <TD[^>]+><A class="tab" HREF="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<size>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<seed>[^<]+)'
|
||||||
patron += '</td> <TD[^>]+><A class="tab" HREF="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<size>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<seed>[^<]+)'
|
|
||||||
def itemHook(item):
|
def itemHook(item):
|
||||||
item.contentType = item.args[1]
|
item.contentType = item.args[1]
|
||||||
|
|
||||||
@@ -62,21 +61,13 @@ def peliculas(item):
|
|||||||
def itemlistHook(itemlist):
|
def itemlistHook(itemlist):
|
||||||
args = item.args
|
args = item.args
|
||||||
args[0] += 1
|
args[0] += 1
|
||||||
itemlist.append(
|
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), args=args, thumbnail=support.thumb()))
|
||||||
support.Item(channel=item.channel,
|
|
||||||
action = item.action,
|
|
||||||
contentType=item.contentType,
|
|
||||||
title=support.typo(support.config.get_localized_string(30992), 'color kod bold'),
|
|
||||||
url=item.url,
|
|
||||||
args=args,
|
|
||||||
thumbnail=support.thumb()))
|
|
||||||
return itemlist
|
return itemlist
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
def search(item, text):
|
def search(item, text):
|
||||||
support.log(item, text)
|
support.log(item, text)
|
||||||
itemlist = []
|
|
||||||
if 'all' in item.args:
|
if 'all' in item.args:
|
||||||
item.url += text
|
item.url += text
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -6,5 +6,5 @@
|
|||||||
"thumbnail": "ilgeniodellostreaming.png",
|
"thumbnail": "ilgeniodellostreaming.png",
|
||||||
"banner": "ilgeniodellostreaming.png",
|
"banner": "ilgeniodellostreaming.png",
|
||||||
"categories": ["movie", "tvshow", "anime", "vos"],
|
"categories": ["movie", "tvshow", "anime", "vos"],
|
||||||
"settings": []
|
"settings": ["include_in_newest_anime"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,16 +7,12 @@
|
|||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from core import scrapertools, httptools, support
|
from core import support
|
||||||
from core.support import log
|
from core.support import log
|
||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import config
|
from platformcode import config
|
||||||
|
|
||||||
host = config.get_channel_url()
|
host = config.get_channel_url()
|
||||||
|
|
||||||
list_servers = ['verystream', 'openload', 'streamango']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
|
|||||||
@@ -22,9 +22,6 @@ from platformcode import config
|
|||||||
host = config.get_channel_url()
|
host = config.get_channel_url()
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['speedvideo']
|
|
||||||
list_quality = []
|
|
||||||
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"id": "mediasetplay",
|
||||||
|
"name": "Mediaset Play",
|
||||||
|
"active": false,
|
||||||
|
"language": ["ita"],
|
||||||
|
"thumbnail": "mediasetplay.png",
|
||||||
|
"banner": "mediasetplay.png",
|
||||||
|
"categories": ["movie", "tvshow", "documentary", "live"],
|
||||||
|
"not_active": ["include_in_newest"],
|
||||||
|
"default_off": ["include_in_global_search"],
|
||||||
|
"settings": [],
|
||||||
|
"cloudflare": true
|
||||||
|
}
|
||||||
@@ -0,0 +1,230 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Canale per Mediaset Play
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from core import support, httptools
|
||||||
|
import sys
|
||||||
|
if sys.version_info[0] >= 3:
|
||||||
|
from concurrent import futures
|
||||||
|
from urllib.parse import urlencode, quote
|
||||||
|
else:
|
||||||
|
from concurrent_py2 import futures
|
||||||
|
from urllib import urlencode, quote
|
||||||
|
|
||||||
|
current_session = requests.Session()
|
||||||
|
data = {"cid": "dc4e7d82-89a5-4a96-acac-d3c7f2ca6d67", "platform": "pc", "appName": "web/mediasetplay-web/576ea90"}
|
||||||
|
res = current_session.post("https://api-ott-prod-fe.mediaset.net/PROD/play/idm/anonymous/login/v1.0", json=data, verify=False)
|
||||||
|
current_session.headers.update({'t-apigw': res.headers['t-apigw']})
|
||||||
|
current_session.headers.update({'t-cts': res.headers['t-cts']})
|
||||||
|
tracecid=res.json()['response']['traceCid']
|
||||||
|
cwid=res.json()['response']['cwId']
|
||||||
|
res = current_session.get("https://api.one.accedo.tv/session?appKey=59ad346f1de1c4000dfd09c5&uuid=sdd",verify=False)
|
||||||
|
current_session.headers.update({'x-session': res.json()['sessionKey']})
|
||||||
|
host = ''
|
||||||
|
entry = 'https://api.one.accedo.tv/content/entry/{id}?locale=it'
|
||||||
|
entries = 'https://api.one.accedo.tv/content/entries?id={id}&locale=it'
|
||||||
|
|
||||||
|
|
||||||
|
@support.menu
|
||||||
|
def mainlist(item):
|
||||||
|
top = [('Dirette {bold}', ['https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-stations?sort=ShortTitle', 'live'])]
|
||||||
|
|
||||||
|
menu = [('Film {bullet bold}', ['5acfcbc423eec6000d64a6bb', 'menu', ['Tutti','all','Cinema']]),
|
||||||
|
('Fiction / Serie TV {bullet bold}', ['5acfcb3c23eec6000d64a6a4', 'menu', ['Tutte','all','Fiction'], 'tvshow']),
|
||||||
|
('Programmi TV{ bullet bold}', ['', 'menu', ['Tutti','all','Programmi Tv'], 'tvshow']),
|
||||||
|
('Documentari {bullet bold}', ['5bfd17c423eec6001aec49f9', 'menu', ['Tutti','all','Documentari'], 'undefined']),
|
||||||
|
('Kids {bullet bold}', ['5acfcb8323eec6000d64a6b3', 'menu',['Tutti','all','Kids'], 'undefined']),
|
||||||
|
]
|
||||||
|
|
||||||
|
search = ''
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def search(item, text):
|
||||||
|
support.log(text)
|
||||||
|
item.search = text
|
||||||
|
if not item.args:
|
||||||
|
item.contentType = 'undefined'
|
||||||
|
item.args=['','all','']
|
||||||
|
itemlist = []
|
||||||
|
try:
|
||||||
|
itemlist += peliculas(item)
|
||||||
|
except:
|
||||||
|
import sys
|
||||||
|
for line in sys.exc_info():
|
||||||
|
support.logger.error("%s" % line)
|
||||||
|
return itemlist
|
||||||
|
|
||||||
|
def menu(item):
|
||||||
|
support.log()
|
||||||
|
itemlist = [item.clone(title=support.typo(item.args[0],'bullet bold'), url='', action='peliculas')]
|
||||||
|
if item.url:
|
||||||
|
json = get_from_id(item)
|
||||||
|
for it in json:
|
||||||
|
if 'uxReference' in it: itemlist.append(item.clone(title=support.typo(it['title'], 'submenu'), url=it['uxReference'], args = '', action='peliculas'))
|
||||||
|
itemlist.append(item.clone(title=support.typo('Cerca...','submenu bold'), url='', action ='search'))
|
||||||
|
return itemlist
|
||||||
|
|
||||||
|
def live(item):
|
||||||
|
support.log()
|
||||||
|
itemlist = []
|
||||||
|
json = current_session.get(item.url).json()['entries']
|
||||||
|
for it in json:
|
||||||
|
urls = []
|
||||||
|
if it['tuningInstruction'] and not it['mediasetstation$digitalOnly']:
|
||||||
|
guide=current_session.get('https://static3.mediasetplay.mediaset.it/apigw/nownext/' + it['callSign'] + '.json').json()['response']
|
||||||
|
plot = support.typo(guide['currentListing']['mediasetlisting$epgTitle'],'bold') + '\n' + guide['currentListing']['mediasetlisting$shortDescription'] + '\n' + guide['currentListing']['description'] + '\n\n' + support.typo('A Seguire:' + guide['nextListing']['mediasetlisting$epgTitle'], 'bold')
|
||||||
|
for key in it['tuningInstruction']['urn:theplatform:tv:location:any']: urls += key['publicUrls']
|
||||||
|
itemlist.append(item.clone(title=support.typo(it['title'], 'bold'),
|
||||||
|
fulltitle=it['title'],
|
||||||
|
show=it['title'],
|
||||||
|
contentTitle=it['title'],
|
||||||
|
thumbnail=it['thumbnails']['channel_logo-100x100']['url'],
|
||||||
|
forcethumb = True,
|
||||||
|
url=urls,
|
||||||
|
plot=plot,
|
||||||
|
action='play'))
|
||||||
|
return itemlist
|
||||||
|
|
||||||
|
def peliculas(item):
|
||||||
|
support.log()
|
||||||
|
itemlist = []
|
||||||
|
contentType = ''
|
||||||
|
json = get_programs(item)
|
||||||
|
for it in json:
|
||||||
|
if item.search.lower() in it['title'].lower():
|
||||||
|
if item.contentType == 'movie':
|
||||||
|
action = 'findvideos'
|
||||||
|
urls = []
|
||||||
|
if 'media' not in it: it = subBrand(it['mediasetprogram$brandId'])[-1]
|
||||||
|
if 'media' in it:
|
||||||
|
for key in it['media']:
|
||||||
|
urls.append(key['publicUrl'])
|
||||||
|
elif item.contentType == 'tvshow':
|
||||||
|
action = 'episodios'
|
||||||
|
urls = it['mediasetprogram$brandId']
|
||||||
|
else:
|
||||||
|
if 'media' in it:
|
||||||
|
action = 'findvideos'
|
||||||
|
contentType = 'movie'
|
||||||
|
urls = []
|
||||||
|
for key in it['media']:
|
||||||
|
urls.append(key['publicUrl'])
|
||||||
|
else:
|
||||||
|
action = 'episodios'
|
||||||
|
contentType = 'tvshow'
|
||||||
|
urls = it['mediasetprogram$brandId']
|
||||||
|
if urls:
|
||||||
|
itemlist.append(
|
||||||
|
item.clone(channel=item.channel,
|
||||||
|
action=action,
|
||||||
|
title=support.typo(it['title'], 'bold'),
|
||||||
|
fulltitle=it['title'],
|
||||||
|
show=it['title'],
|
||||||
|
contentType=contentType if contentType else item.contentType,
|
||||||
|
contentTitle=it['title'] if 'movie' in [contentType, item.contentType] else '',
|
||||||
|
contentSerieName=it['title'] if 'tvshow' in [contentType, item.contentType] else '',
|
||||||
|
thumbnail=it['thumbnails']['image_vertical-264x396']['url'],
|
||||||
|
fanart=it['thumbnails']['image_keyframe_poster-1280x720']['url'] if 'image_keyframe_poster-1280x720' in it['thumbnails'] else '',
|
||||||
|
plot=it['longDescription'] if 'longDescription' in it else it['description'] if 'description' in it else '',
|
||||||
|
url=urls))
|
||||||
|
return itemlist
|
||||||
|
|
||||||
|
def episodios(item):
|
||||||
|
support.log()
|
||||||
|
itemlist = []
|
||||||
|
subBrandId = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-brands?byCustomValue={brandId}{' + item.url + '}').json()['entries'][-1]['mediasetprogram$subBrandId']
|
||||||
|
json = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs?byCustomValue={subBrandId}{' + subBrandId + '}').json()['entries']
|
||||||
|
for it in json:
|
||||||
|
urls = []
|
||||||
|
if 'media' in it:
|
||||||
|
for key in it['media']:
|
||||||
|
urls.append(key['publicUrl'])
|
||||||
|
if urls:
|
||||||
|
title = it['title'].split('-')[-1].strip()
|
||||||
|
if it['tvSeasonNumber'] and it['tvSeasonEpisodeNumber']:
|
||||||
|
item.infoLabels['season'] = it['tvSeasonNumber']
|
||||||
|
item.infoLabels['episode'] = it['tvSeasonEpisodeNumber']
|
||||||
|
episode = '%dx%02d - ' % (it['tvSeasonNumber'], it['tvSeasonEpisodeNumber'])
|
||||||
|
else: episode = ''
|
||||||
|
itemlist.append(
|
||||||
|
item.clone(action='findvideos',
|
||||||
|
title=support.typo(episode + title, 'bold'),
|
||||||
|
fulltitle=title,
|
||||||
|
show=title,
|
||||||
|
contentType='episode',
|
||||||
|
contentSerieName = title,
|
||||||
|
thumbnail=it['thumbnails']['image_vertical-264x396']['url'],
|
||||||
|
fanart=it['thumbnails']['image_keyframe_poster-1280x720']['url'] if 'image_keyframe_poster-1280x720' in it['thumbnails'] else '',
|
||||||
|
plot=it['longDescription'] if 'longDescription' in it else it['description'],
|
||||||
|
url=urls))
|
||||||
|
support.videolibrary(itemlist, item)
|
||||||
|
return sorted(itemlist, key=lambda it: it.title)
|
||||||
|
|
||||||
|
def findvideos(item):
|
||||||
|
support.log()
|
||||||
|
itemlist = []
|
||||||
|
itemlist.append(support.Item(server = 'directo', title = 'Direct', url = item.url, action = 'play'))
|
||||||
|
return support.server(item, itemlist=itemlist, Download=False)
|
||||||
|
|
||||||
|
def play(item):
|
||||||
|
support.log()
|
||||||
|
for url in item.url:
|
||||||
|
url = httptools.downloadpage(url, allow_redirects=True).url
|
||||||
|
if '.mpd' in url: data = url
|
||||||
|
return support.servertools.find_video_items(item, data=data)
|
||||||
|
|
||||||
|
def subBrand(json):
|
||||||
|
support.log()
|
||||||
|
subBrandId = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-brands?byCustomValue={brandId}{' + json + '}').json()['entries'][-1]['mediasetprogram$subBrandId']
|
||||||
|
json = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs?byCustomValue={subBrandId}{' + subBrandId + '}').json()['entries']
|
||||||
|
return json
|
||||||
|
|
||||||
|
def get_from_id(item):
|
||||||
|
support.log()
|
||||||
|
json = current_session.get(entry.format(id=item.url)).json()
|
||||||
|
if 'components' in json:
|
||||||
|
id = quote(",".join(json["components"]))
|
||||||
|
json = current_session.get(entries.format(id=id)).json()
|
||||||
|
if 'entries' in json:
|
||||||
|
support.log(json['entries'])
|
||||||
|
return json['entries']
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def get_programs(item, ret=[], args={}):
|
||||||
|
support.log()
|
||||||
|
hasMore = False
|
||||||
|
if not args:
|
||||||
|
if item.url:
|
||||||
|
args['uxReference'] = item.url
|
||||||
|
args['platform'] = 'pc'
|
||||||
|
else:
|
||||||
|
args = {"query": "*:*"}
|
||||||
|
if item.args[2]:
|
||||||
|
args['categories'] = item.args[2]
|
||||||
|
|
||||||
|
args['cwId'] = cwid
|
||||||
|
args['traceCid'] = tracecid
|
||||||
|
args['hitsPerPage'] = 500
|
||||||
|
args['page'] = '0'
|
||||||
|
|
||||||
|
if 'all' in item.args: url = 'https://api-ott-prod-fe.mediaset.net/PROD/play/rec/azlisting/v1.0?' + urlencode(args)
|
||||||
|
else: url="https://api-ott-prod-fe.mediaset.net/PROD/play/rec/cataloguelisting/v1.0?" + urlencode(args)
|
||||||
|
json = current_session.get(url).json()
|
||||||
|
if 'response' in json:
|
||||||
|
json = json['response']
|
||||||
|
if 'hasMore' in json:
|
||||||
|
hasMore = json['hasMore']
|
||||||
|
if 'components' in json:
|
||||||
|
id = quote(",".join(json["components"]))
|
||||||
|
json = current_session.get(entries.format(id=id)).json()
|
||||||
|
if 'entries' in json:
|
||||||
|
ret += json['entries']
|
||||||
|
if hasMore:
|
||||||
|
args['page'] = str(int(args['page']) + 1)
|
||||||
|
return get_programs(item, ret, args)
|
||||||
|
else:
|
||||||
|
return ret
|
||||||
@@ -14,8 +14,8 @@ from xml.dom import minidom
|
|||||||
host = 'https://metalvideo.com'
|
host = 'https://metalvideo.com'
|
||||||
headers={'X-Requested-With': 'XMLHttpRequest'}
|
headers={'X-Requested-With': 'XMLHttpRequest'}
|
||||||
|
|
||||||
list_servers = ['youtube']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
@support.scrape
|
@support.scrape
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
@@ -38,8 +38,6 @@ def mainlist(item):
|
|||||||
action='search',
|
action='search',
|
||||||
thumbnail=support.thumb(thumb='search.png')))
|
thumbnail=support.thumb(thumb='search.png')))
|
||||||
|
|
||||||
support.autoplay.init(item.channel, list_servers, list_quality)
|
|
||||||
support.autoplay.show_option(item.channel, itemlist)
|
|
||||||
support.channel_config(item, itemlist)
|
support.channel_config(item, itemlist)
|
||||||
return itemlist
|
return itemlist
|
||||||
return locals()
|
return locals()
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ host = support.config.get_channel_url()
|
|||||||
|
|
||||||
IDIOMAS = {'Italiano': 'IT'}
|
IDIOMAS = {'Italiano': 'IT'}
|
||||||
list_language = IDIOMAS.values()
|
list_language = IDIOMAS.values()
|
||||||
list_servers = ['akstream', 'wstream', 'vidtome', 'backin', 'nowvideo', 'verystream']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
headers = {'Referer': host}
|
headers = {'Referer': host}
|
||||||
|
|
||||||
|
|||||||
@@ -7,16 +7,16 @@ from core import support
|
|||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import logger, config
|
from platformcode import logger, config
|
||||||
|
|
||||||
def findhost():
|
# def findhost():
|
||||||
return 'https://' + support.match('https://netfreex.uno/', patron='value="site:([^"]+)"').match
|
# return 'https://' + support.match('https://netfreex.uno/', patron='value="site:([^"]+)"').match
|
||||||
|
|
||||||
host = config.get_channel_url(findhost)
|
host = config.get_channel_url()
|
||||||
headers = ""
|
headers = ""
|
||||||
|
|
||||||
IDIOMAS = {'Italiano': 'IT'}
|
IDIOMAS = {'Italiano': 'IT'}
|
||||||
list_language = IDIOMAS.values()
|
list_language = IDIOMAS.values()
|
||||||
list_servers = ['wstream']
|
|
||||||
list_quality = ['1080p', 'HD', 'SD', 'CAM']
|
|
||||||
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
@@ -59,15 +59,7 @@ def findvideos(item):
|
|||||||
if link['title'] != 'Guarda il trailer':
|
if link['title'] != 'Guarda il trailer':
|
||||||
logger.info(link['title'])
|
logger.info(link['title'])
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(action="play", url=link['url'], quality=link['title']))
|
||||||
action="play",
|
|
||||||
url=link['url'],
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
thumbnail=item.thumbnail,
|
|
||||||
show=item.show,
|
|
||||||
quality=link['title'],
|
|
||||||
contentType=item.contentType,
|
|
||||||
folder=False))
|
|
||||||
return support.server(item, itemlist=itemlist)
|
return support.server(item, itemlist=itemlist)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ from core.support import config, log
|
|||||||
|
|
||||||
host = config.get_channel_url()
|
host = config.get_channel_url()
|
||||||
|
|
||||||
list_servers = ['mixdrop', 'speedvideo', 'gounlimited', 'onlystream', 'youtube']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ host = config.get_channel_url()
|
|||||||
|
|
||||||
headers = [['Accept', 'application/ld+json']]
|
headers = [['Accept', 'application/ld+json']]
|
||||||
|
|
||||||
list_servers = ['directo']
|
|
||||||
list_quality = ['1080p','720p','480p','360p']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
@@ -90,18 +90,11 @@ def get_season(item, seas_url, seasonNumber):
|
|||||||
json_object = jsontools.load(data)
|
json_object = jsontools.load(data)
|
||||||
for episode in json_object['hydra:member']:
|
for episode in json_object['hydra:member']:
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(action='findvideos',
|
||||||
action='findvideos',
|
contentType='episode',
|
||||||
contentType='episode',
|
title=str(seasonNumber)+"x"+str("%02d"%episode['episodeNumber']),
|
||||||
fulltitle=item.fulltitle,
|
url=seas_url,
|
||||||
show=item.show,
|
extra=str(len(json_object['hydra:member'])-episode['episodeNumber'])))
|
||||||
contentSerieName=item.contentSerieName,
|
|
||||||
title=str(seasonNumber)+"x"+str("%02d"%episode['episodeNumber']),
|
|
||||||
url=seas_url,
|
|
||||||
thumbnail=item.thumbnail,
|
|
||||||
fanart=item.fanart,
|
|
||||||
plot=item.plot,
|
|
||||||
extra=str(len(json_object['hydra:member'])-episode['episodeNumber'])))
|
|
||||||
return itemlist[::-1]
|
return itemlist[::-1]
|
||||||
|
|
||||||
def search(item, texto):
|
def search(item, texto):
|
||||||
@@ -135,12 +128,10 @@ def search_movie_by_genre(item):
|
|||||||
json_object = jsontools.load(data)
|
json_object = jsontools.load(data)
|
||||||
for genre in json_object['hydra:member']:
|
for genre in json_object['hydra:member']:
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(action="peliculas",
|
||||||
action="peliculas",
|
title=support.typo(genre['name'],'bold'),
|
||||||
title=support.typo(genre['name'],'bold'),
|
contentType='movie',
|
||||||
contentType='movie',
|
url="%s/api/movies?genres.id=%s" %(host,genre['id'])))
|
||||||
url="%s/api/movies?genres.id=%s" %(host,genre['id']),
|
|
||||||
extra=item.extra))
|
|
||||||
return support.thumb(itemlist, True)
|
return support.thumb(itemlist, True)
|
||||||
|
|
||||||
def search_movie_by_year(item):
|
def search_movie_by_year(item):
|
||||||
@@ -150,12 +141,12 @@ def search_movie_by_year(item):
|
|||||||
itemlist = []
|
itemlist = []
|
||||||
for i in range(100):
|
for i in range(100):
|
||||||
year_to_search = year - i
|
year_to_search = year - i
|
||||||
itemlist.append(Item(channel=item.channel,
|
itemlist.append(
|
||||||
url="%s/api/movies?releaseDate=%s" %(host,year_to_search),
|
item.clone(channel=item.channel,url="%s/api/movies?releaseDate=%s" %(host,year_to_search),
|
||||||
plot="1",
|
plot="1",
|
||||||
type="movie",
|
type="movie",
|
||||||
title=support.typo(year_to_search,'bold'),
|
title=support.typo(year_to_search,'bold'),
|
||||||
action="peliculas"))
|
action="peliculas"))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
def findvideos(item):
|
def findvideos(item):
|
||||||
@@ -169,17 +160,12 @@ def findvideos(item):
|
|||||||
array_index=int(item.extra)
|
array_index=int(item.extra)
|
||||||
for video in json_object['hydra:member'][array_index]['playlist']['videos']:
|
for video in json_object['hydra:member'][array_index]['playlist']['videos']:
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(
|
item.clone(action="play",
|
||||||
channel=item.channel,
|
title='Direct',
|
||||||
action="play",
|
url=video['src'],
|
||||||
title='Direct',
|
server='directo',
|
||||||
thumbnail=item.thumbnail,
|
quality=str(video['size'])+ 'p',
|
||||||
fulltitle = item.fulltitle,
|
folder=False))
|
||||||
search = item.search,
|
|
||||||
url=video['src'],
|
|
||||||
server='directo',
|
|
||||||
quality=str(video['size'])+ 'p',
|
|
||||||
folder=False))
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
return support.server(item, itemlist=itemlist)
|
return support.server(item, itemlist=itemlist)
|
||||||
@@ -219,22 +205,19 @@ def get_itemlist_element(element,item):
|
|||||||
next_action='episodios'
|
next_action='episodios'
|
||||||
quality=''
|
quality=''
|
||||||
url="%s%s"
|
url="%s%s"
|
||||||
itemlist.append(
|
|
||||||
Item(channel=item.channel,
|
|
||||||
action=next_action,
|
|
||||||
title=support.typo(scrapedtitle,'bold') + quality,
|
|
||||||
fulltitle=scrapedtitle,
|
|
||||||
show=scrapedtitle,
|
|
||||||
plot=scrapedplot,
|
|
||||||
fanart=scrapedfanart,
|
|
||||||
thumbnail=scrapedthumbnail,
|
|
||||||
contentType=item.contentType,
|
|
||||||
contentTitle=scrapedtitle,
|
|
||||||
url=url %(host,element['@id'] ),
|
|
||||||
infoLabels=infoLabels,
|
|
||||||
extra=item.extra))
|
|
||||||
|
|
||||||
if item.contentType=='movie':
|
if item.contentType=='movie':
|
||||||
for item in itemlist:
|
support.tmdb.set_infoLabels_itemlist(itemlist)
|
||||||
item= support.tmdb.find_and_set_infoLabels(item)
|
itemlist.append(
|
||||||
|
item.clone(action=next_action,
|
||||||
|
title=support.typo(scrapedtitle, 'bold') + quality,
|
||||||
|
fulltitle=scrapedtitle,
|
||||||
|
show=scrapedtitle,
|
||||||
|
plot=scrapedplot,
|
||||||
|
fanart=scrapedfanart,
|
||||||
|
thumbnail=scrapedthumbnail,
|
||||||
|
contentTitle=scrapedtitle,
|
||||||
|
url=url % (host, element['@id']),
|
||||||
|
infoLabels=infoLabels))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "pufimovies",
|
"id": "pufimovies",
|
||||||
"name": "PufiMovies",
|
"name": "PufiMovies",
|
||||||
"active": true,
|
"active": false,
|
||||||
"language": ["ita", "sub-ita"],
|
"language": ["ita", "sub-ita"],
|
||||||
"thumbnail": "pufimovies.png",
|
"thumbnail": "pufimovies.png",
|
||||||
"banner": "pufimovies.png",
|
"banner": "pufimovies.png",
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ from core import support
|
|||||||
|
|
||||||
host = support.config.get_channel_url()
|
host = support.config.get_channel_url()
|
||||||
|
|
||||||
list_servers = ['mixdrop', 'wstream', 'vupplayer', 'supervideo', 'cloudvideo', 'gounlimited']
|
|
||||||
list_quality = ['default','1080p', '720p', '480p', '360p']
|
|
||||||
|
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ def newest(categoria):
|
|||||||
except:
|
except:
|
||||||
import sys
|
import sys
|
||||||
for line in sys.exc_info():
|
for line in sys.exc_info():
|
||||||
support.log({0}.format(line))
|
support.logger.error("%s" % line)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
"banner": "raiplay.png",
|
"banner": "raiplay.png",
|
||||||
"categories": ["movie", "tvshow", "documentary", "live"],
|
"categories": ["movie", "tvshow", "documentary", "live"],
|
||||||
"not_active": ["include_in_newest"],
|
"not_active": ["include_in_newest"],
|
||||||
|
"default_off": ["include_in_global_search"],
|
||||||
"settings": [],
|
"settings": [],
|
||||||
"cloudflare": true
|
"cloudflare": true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
# Canale per SerieHD
|
# Canale per Rai Play
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
@@ -17,7 +17,7 @@ onair = host + '/palinsesto/onAir.json'
|
|||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
top = [('Dirette {bold}', ['/dl/RaiPlay/2016/PublishingBlock-9a2ff311-fcf0-4539-8f8f-c4fee2a71d58.html?json', 'dirette']),
|
top = [('Dirette {bold}', ['/dl/RaiPlay/2016/PublishingBlock-9a2ff311-fcf0-4539-8f8f-c4fee2a71d58.html?json', 'live']),
|
||||||
('Replay {bold}', ['/dl/RaiPlay/2016/PublishingBlock-9a2ff311-fcf0-4539-8f8f-c4fee2a71d58.html?json', 'replay_menu'])]
|
('Replay {bold}', ['/dl/RaiPlay/2016/PublishingBlock-9a2ff311-fcf0-4539-8f8f-c4fee2a71d58.html?json', 'replay_menu'])]
|
||||||
|
|
||||||
menu = [('Film {bullet bold}', ['/film/index.json', 'menu']),
|
menu = [('Film {bullet bold}', ['/film/index.json', 'menu']),
|
||||||
@@ -39,16 +39,10 @@ def mainlist(item):
|
|||||||
|
|
||||||
def menu(item):
|
def menu(item):
|
||||||
support.log()
|
support.log()
|
||||||
itemlist = [support.Item(channel= item.channel, title = support.typo('Tutti','bullet bold'),
|
itemlist = [item.clone(title = support.typo('Tutti','bullet bold'), action = 'peliculas'),
|
||||||
url = item.url, action = 'peliculas'),
|
item.clone(title = support.typo('Generi','submenu'), args = 'genre', action = 'submenu'),
|
||||||
|
item.clone(title = support.typo('A-Z','submenu'), args = 'az', action = 'submenu'),
|
||||||
support.Item(channel= item.channel, title = support.typo('Generi','submenu'),
|
item.clone(title = support.typo('Cerca','submenu'), action = 'search')]
|
||||||
url = item.url, args = 'genre', action = 'submenu'),
|
|
||||||
|
|
||||||
support.Item(channel= item.channel, title = support.typo('A-Z','submenu'),
|
|
||||||
url = item.url, args = 'az', action = 'submenu'),
|
|
||||||
support.Item(channel= item.channel, title = support.typo('Cerca','submenu'),
|
|
||||||
url = item.url, action = 'search')]
|
|
||||||
|
|
||||||
return support.thumb(itemlist)
|
return support.thumb(itemlist)
|
||||||
|
|
||||||
@@ -58,8 +52,8 @@ def learning(item):
|
|||||||
itemlist =[]
|
itemlist =[]
|
||||||
json = current_session.get(item.url).json()['contents']
|
json = current_session.get(item.url).json()['contents']
|
||||||
for key in json:
|
for key in json:
|
||||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key['name'],'bold'), fulltitle = key['name'], show = key['name'],
|
itemlist.append(item.clone(title = support.typo(key['name'],'bold'), fulltitle = key['name'],
|
||||||
url = key['contents'], thumbnail = item.thumbnail, action = 'peliculas', args = item.args))
|
show = key['name'], url = key['contents'], action = 'peliculas'))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
|
|
||||||
@@ -71,12 +65,12 @@ def submenu(item):
|
|||||||
json_url = getUrl(json[-1]['path_id'])
|
json_url = getUrl(json[-1]['path_id'])
|
||||||
json = current_session.get(json_url).json()['contents']
|
json = current_session.get(json_url).json()['contents']
|
||||||
for key in json:
|
for key in json:
|
||||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key,'bold'), fulltitle = key, show = key,
|
itemlist.append(item.clone(title = support.typo(key,'bold'), fulltitle = key,
|
||||||
url = json[key], thumbnail = item.thumbnail, action = 'peliculas', args = item.args))
|
show = key, url = json[key], action = 'peliculas'))
|
||||||
else:
|
else:
|
||||||
for key in json:
|
for key in json:
|
||||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key['name'],'bold'), fulltitle = key['name'], show = key['name'],
|
itemlist.append(item.clone(title = support.typo(key['name'],'bold'), fulltitle = key['name'], show = key['name'],
|
||||||
thumbnail = getUrl(key['image']), url = getUrl(key['path_id']), action = 'peliculas', args = item.args))
|
thumbnail = getUrl(key['image']), url = getUrl(key['path_id']), action = 'peliculas'))
|
||||||
itemlist.pop(-1)
|
itemlist.pop(-1)
|
||||||
return support.thumb(itemlist)
|
return support.thumb(itemlist)
|
||||||
|
|
||||||
@@ -97,8 +91,9 @@ def replay_menu(item):
|
|||||||
today = datetime.date.today()
|
today = datetime.date.today()
|
||||||
for d in range(7):
|
for d in range(7):
|
||||||
day = today - datetime.timedelta(days=d)
|
day = today - datetime.timedelta(days=d)
|
||||||
itemlist.append(support.Item(channel = item.channel, thumbnail = item.thumbnail, action = 'replay_channels', url = item.url, date = day.strftime("%d-%m-%Y"),
|
support.log(day)
|
||||||
title = support.typo(days[int(day.strftime("%w"))] + " " + day.strftime("%d") + " " + months[int(day.strftime("%m"))-1], 'bold')))
|
itemlist.append(item.clone(action = 'replay_channels', date = day.strftime("%d-%m-%Y"),
|
||||||
|
title = support.typo(days[int(day.strftime("%w"))] + " " + day.strftime("%d") + " " + months[int(day.strftime("%m"))-1], 'bold')))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
|
|
||||||
@@ -107,8 +102,8 @@ def replay_channels(item):
|
|||||||
itemlist = []
|
itemlist = []
|
||||||
json = current_session.get(item.url).json()['dirette']
|
json = current_session.get(item.url).json()['dirette']
|
||||||
for key in json:
|
for key in json:
|
||||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key['channel'], 'bold'), fulltitle = key['channel'], show = key['channel'],plot = item.title, action = 'replay',
|
itemlist.append(item.clone(title = support.typo(key['channel'], 'bold'), fulltitle = key['channel'], show = key['channel'], plot = item.title, action = 'replay',
|
||||||
thumbnail = key['transparent-icon'].replace("[RESOLUTION]", "256x-"), url = '%s/palinsesto/app/old/%s/%s.json' % (host, key['channel'].lower().replace(' ','-'), item.date)))
|
thumbnail = key['transparent-icon'].replace("[RESOLUTION]", "256x-"), url = '%s/palinsesto/app/old/%s/%s.json' % (host, key['channel'].lower().replace(' ','-'), item.date)))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
|
|
||||||
@@ -118,15 +113,16 @@ def replay(item):
|
|||||||
json = current_session.get(item.url).json()[item.fulltitle][0]['palinsesto'][0]['programmi']
|
json = current_session.get(item.url).json()[item.fulltitle][0]['palinsesto'][0]['programmi']
|
||||||
for key in json:
|
for key in json:
|
||||||
support.log('KEY=',key)
|
support.log('KEY=',key)
|
||||||
if key and key['pathID']: itemlist.append(support.Item(channel = item.channel, thumbnail = getUrl(key['images']['landscape']), fanart = getUrl(key['images']['landscape']), url = getUrl(key['pathID']),
|
if key and key['pathID']: itemlist.append(item.clone(thumbnail = getUrl(key['images']['landscape']), fanart = getUrl(key['images']['landscape']), url = getUrl(key['pathID']), fulltitle = key['name'], show = key['name'],
|
||||||
title = support.typo(key['timePublished'], 'color kod bold') + support.typo(' | ' + key['name'], ' bold'), fulltitle = key['name'], show = key['name'], plot = key['testoBreve'], action = 'findvideos'))
|
title = support.typo(key['timePublished'], 'color kod bold') + support.typo(' | ' + key['name'], ' bold'), plot = key['testoBreve'], action = 'findvideos'))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
def search(item, text):
|
def search(item, text):
|
||||||
|
# support.dbg()
|
||||||
support.log()
|
support.log()
|
||||||
itemlist =[]
|
itemlist =[]
|
||||||
try:
|
try:
|
||||||
if item.url:
|
if item.url != host:
|
||||||
item.search = text
|
item.search = text
|
||||||
itemlist = peliculas(item)
|
itemlist = peliculas(item)
|
||||||
else:
|
else:
|
||||||
@@ -134,9 +130,9 @@ def search(item, text):
|
|||||||
for key in json:
|
for key in json:
|
||||||
for key in json[key]:
|
for key in json[key]:
|
||||||
if 'PathID' in key and (text.lower() in key['name'].lower()):
|
if 'PathID' in key and (text.lower() in key['name'].lower()):
|
||||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key['name'],'bold'), fulltitle = key['name'], show = key['name'], url = key['PathID'].replace('/?json', '.json'), action = 'Type',
|
itemlist.append(item.clone(title = support.typo(key['name'],'bold'), fulltitle = key['name'], show = key['name'], url = key['PathID'].replace('/?json', '.json'), action = 'Type',
|
||||||
thumbnail = getUrl(key['images']['portrait'] if 'portrait' in key['images'] else key['images']['portrait43'] if 'portrait43' in key['images'] else key['images']['landscape']),
|
thumbnail = getUrl(key['images']['portrait'] if 'portrait' in key['images'] else key['images']['portrait43'] if 'portrait43' in key['images'] else key['images']['landscape']),
|
||||||
fanart = getUrl(key['images']['landscape'] if 'landscape' in key['images'] else key['images']['landscape43'])))
|
fanart = getUrl(key['images']['landscape'] if 'landscape' in key['images'] else key['images']['landscape43'])))
|
||||||
except:
|
except:
|
||||||
import sys
|
import sys
|
||||||
for line in sys.exc_info():
|
for line in sys.exc_info():
|
||||||
@@ -156,15 +152,15 @@ def Type(item):
|
|||||||
return select(item)
|
return select(item)
|
||||||
|
|
||||||
|
|
||||||
def dirette(item):
|
def live(item):
|
||||||
support.log()
|
support.log()
|
||||||
itemlist =[]
|
itemlist =[]
|
||||||
json = current_session.get(item.url).json()['dirette']
|
json = current_session.get(item.url).json()['dirette']
|
||||||
onAir = current_session.get(onair).json()['on_air']
|
onAir = current_session.get(onair).json()['on_air']
|
||||||
for i, key in enumerate(json):
|
for i, key in enumerate(json):
|
||||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key['channel'], 'bold'), fulltitle = key['channel'], show = key['channel'],
|
itemlist.append(item.clone(title = support.typo(key['channel'], 'bold'), fulltitle = key['channel'], show = key['channel'], url = key['video']['contentUrl'],
|
||||||
thumbnail = key['transparent-icon'].replace("[RESOLUTION]", "256x-"),forcethumb=True , fanart = getUrl(onAir[i]['currentItem']['image']), url = key['video']['contentUrl'],
|
thumbnail = key['transparent-icon'].replace("[RESOLUTION]", "256x-"), forcethumb = True , fanart = getUrl(onAir[i]['currentItem']['image']),
|
||||||
plot = support.typo(onAir[i]['currentItem']['name'],'bold')+ '\n\n' + onAir[i]['currentItem']['description'], action = 'play'))
|
plot = support.typo(onAir[i]['currentItem']['name'],'bold')+ '\n\n' + onAir[i]['currentItem']['description'], action = 'play'))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
|
|
||||||
@@ -212,10 +208,7 @@ def peliculas(item):
|
|||||||
itemlist = sorted(itemlist, key=lambda it: it.title)
|
itemlist = sorted(itemlist, key=lambda it: it.title)
|
||||||
|
|
||||||
if len(keys) > pag * pagination and not item.search:
|
if len(keys) > pag * pagination and not item.search:
|
||||||
itemlist.append(support.Item(channel=item.channel, action = item.action, contentType=item.contentType,
|
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), page=pag + 1, thumbnail=support.thumb()))
|
||||||
title=support.typo(support.config.get_localized_string(30992), 'color kod bold'),
|
|
||||||
fulltitle= item.fulltitle, show= item.show, url=item.url, args=item.args, page=pag + 1,
|
|
||||||
thumbnail=support.thumb()))
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
|
|
||||||
@@ -224,8 +217,7 @@ def select(item):
|
|||||||
itemlist = []
|
itemlist = []
|
||||||
json = current_session.get(item.url).json()['blocks']
|
json = current_session.get(item.url).json()['blocks']
|
||||||
for key in json:
|
for key in json:
|
||||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key['name'],'bold'), fulltitle = item.fulltitle,
|
itemlist.append(item.clone(title = support.typo(key['name'],'bold'), url = key['sets'], action = 'episodios'))
|
||||||
show = item.show, thumbnail = item.thumbnail, url = key['sets'], action = 'episodios', args = item.args))
|
|
||||||
if len(itemlist) == 1:
|
if len(itemlist) == 1:
|
||||||
return episodios(itemlist[0])
|
return episodios(itemlist[0])
|
||||||
else:
|
else:
|
||||||
@@ -237,9 +229,7 @@ def episodios(item):
|
|||||||
itemlist = []
|
itemlist = []
|
||||||
if type(item.url) in [list, dict] and len(item.url) > 1 and ('name' in item.url[0] and 'stagione' not in item.url[0]['name'].lower()):
|
if type(item.url) in [list, dict] and len(item.url) > 1 and ('name' in item.url[0] and 'stagione' not in item.url[0]['name'].lower()):
|
||||||
for key in item.url:
|
for key in item.url:
|
||||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key['name'], 'bold'), fulltitle = item.fulltitle, show = item.show, thumbnail = item.thumbnail,
|
itemlist.append(item.clone(title = support.typo(key['name'], 'bold'), url = getUrl(key['path_id']), contentType = 'tvshow', action = 'episodios'))
|
||||||
fanart = item.fanart, url = getUrl(key['path_id']), plot = item.plot, contentType = 'tvshow',
|
|
||||||
action = 'episodios'))
|
|
||||||
|
|
||||||
elif type(item.url) in [list, dict]:
|
elif type(item.url) in [list, dict]:
|
||||||
with futures.ThreadPoolExecutor() as executor:
|
with futures.ThreadPoolExecutor() as executor:
|
||||||
@@ -269,9 +259,8 @@ def episodios(item):
|
|||||||
# title = key['subtitle'].strip()
|
# title = key['subtitle'].strip()
|
||||||
if not title:
|
if not title:
|
||||||
title = key['name']
|
title = key['name']
|
||||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(title, 'bold'), fulltitle = item.fulltitle, show = item.show, thumbnail = item.thumbnail,
|
itemlist.append(item.clone(title = support.typo(title, 'bold'), action = 'findvideos', VL=True if ep else False, plot = key['description'],
|
||||||
fanart = getUrl(key['images']['landscape']), url = key['video_url'], plot = key['description'], contentType = 'episode',
|
fanart = getUrl(key['images']['landscape']), url = key['video_url'], contentType = 'episode'))
|
||||||
action = 'findvideos', VL=True if ep else False))
|
|
||||||
|
|
||||||
if itemlist and itemlist[0].VL: support.videolibrary(itemlist, item)
|
if itemlist and itemlist[0].VL: support.videolibrary(itemlist, item)
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -290,8 +279,7 @@ def findvideos(item):
|
|||||||
else:
|
else:
|
||||||
url = item.url
|
url = item.url
|
||||||
|
|
||||||
itemlist.append(support.Item(channel = item.channel, server = 'directo', title = 'Diretto', fulltitle = item.fulltitle,
|
itemlist.append(item.clone(server = 'directo', title = 'Diretto', fanart = item.json, url = getUrl(url), action = 'play' ))
|
||||||
show = item.show, thumbnail = item.thumbnail, fanart = item.json, url = getUrl(url), action = 'play' ))
|
|
||||||
return support.server(item, itemlist=itemlist, Download=False)
|
return support.server(item, itemlist=itemlist, Download=False)
|
||||||
|
|
||||||
|
|
||||||
@@ -321,8 +309,9 @@ def addinfo(key, item):
|
|||||||
support.log()
|
support.log()
|
||||||
info = current_session.get(getUrl(key['info_url'])).json()
|
info = current_session.get(getUrl(key['info_url'])).json()
|
||||||
if not item.search or item.search.lower() in key['name'].lower():
|
if not item.search or item.search.lower() in key['name'].lower():
|
||||||
it = support.Item( channel = item.channel, title = support.typo(key['name'],'bold'), fulltitle = key['name'], show = key['name'],
|
it = item.clone(title = support.typo(key['name'],'bold'), fulltitle = key['name'], show = key['name'],
|
||||||
thumbnail = getUrl(key['images']['portrait_logo'] if key['images']['portrait_logo'] else key['images']['landscape']), fanart = getUrl(key['images']['landscape']), url = getUrl(key['path_id']), plot = info['description'])
|
thumbnail = getUrl(key['images']['portrait_logo'] if key['images']['portrait_logo'] else key['images']['landscape']),
|
||||||
|
fanart = getUrl(key['images']['landscape']), url = getUrl(key['path_id']), plot = info['description'])
|
||||||
if 'layout' not in key or key['layout'] == 'single':
|
if 'layout' not in key or key['layout'] == 'single':
|
||||||
it.action = 'findvideos'
|
it.action = 'findvideos'
|
||||||
it.contentType = 'movie'
|
it.contentType = 'movie'
|
||||||
@@ -351,9 +340,9 @@ def load_episodes(key, item):
|
|||||||
if not title:
|
if not title:
|
||||||
title = key['name']
|
title = key['name']
|
||||||
|
|
||||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(title, 'bold'), fulltitle = item.fulltitle, show = item.show, thumbnail = item.thumbnail,
|
itemlist.append(item.clone(title = support.typo(title, 'bold'), url = key['video_url'], contentType = 'episode',
|
||||||
fanart = getUrl(key['images']['landscape']), url = key['video_url'], plot = key['description'], contentType = 'episode',
|
fanart = getUrl(key['images']['landscape']), plot = key['description'],
|
||||||
action = 'findvideos', VL=True if ep else False, order=order))
|
action = 'findvideos', VL=True if ep else False, order=order))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ host = support.config.get_channel_url()
|
|||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
|
|
||||||
list_servers = ['mixdrop', 'vidoza', 'vcstream', 'gounlimited']
|
|
||||||
list_quality = ['1080p', '720p', '480p', '360']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ def findhost():
|
|||||||
host = config.get_channel_url(findhost)
|
host = config.get_channel_url(findhost)
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['akvideo', 'wstream', 'backin', 'vidtome', 'nowvideo']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
@@ -64,6 +64,7 @@ def peliculas(item):
|
|||||||
blacklist = ['DMCA', 'Contatti', 'Attenzione NON FARTI OSCURARE', 'Lista Cartoni Animati e Anime']
|
blacklist = ['DMCA', 'Contatti', 'Attenzione NON FARTI OSCURARE', 'Lista Cartoni Animati e Anime']
|
||||||
patronBlock = r'<h1>.+?</h1>(?P<block>.*?)<div class="footer_c">'
|
patronBlock = r'<h1>.+?</h1>(?P<block>.*?)<div class="footer_c">'
|
||||||
patronNext = r'<div class="siguiente"><a href="([^"]+)" >'
|
patronNext = r'<div class="siguiente"><a href="([^"]+)" >'
|
||||||
|
# debug = True
|
||||||
|
|
||||||
if item.args == 'search':
|
if item.args == 'search':
|
||||||
patronBlock = r'>Lista Serie Tv</a></li></ul></div><div id="box_movies">(?P<block>.*?)<div id="paginador">'
|
patronBlock = r'>Lista Serie Tv</a></li></ul></div><div id="box_movies">(?P<block>.*?)<div id="paginador">'
|
||||||
@@ -87,7 +88,7 @@ def peliculas(item):
|
|||||||
pagination = 25
|
pagination = 25
|
||||||
|
|
||||||
if item.args == 'lista':
|
if item.args == 'lista':
|
||||||
patron = r'href="(?P<url>[^"]+)"[^>]+>(?P<title>.*?)[ ]?(?P<year>\d+)?(?: Streaming | MD iSTANCE )?<'
|
patron = r'href="(?P<url>[^"]+)"[^>]+>(?P<title>.*?)(?P<year>\d{4})?<'
|
||||||
patronBlock = r'Lista dei film disponibili in streaming e anche in download\.</p>(?P<block>.*?)<div class="footer_c">'
|
patronBlock = r'Lista dei film disponibili in streaming e anche in download\.</p>(?P<block>.*?)<div class="footer_c">'
|
||||||
else:
|
else:
|
||||||
patron = r'<tr><td><a href="(?P<url>[^"]+)"(?:|.+?)?>(?: )?[ ]?(?P<title>.*?)[ ]?(?P<quality>HD)?[ ]?(?P<year>\d+)?(?: | HD | Streaming | MD(?: iSTANCE)? )?</a>'
|
patron = r'<tr><td><a href="(?P<url>[^"]+)"(?:|.+?)?>(?: )?[ ]?(?P<title>.*?)[ ]?(?P<quality>HD)?[ ]?(?P<year>\d+)?(?: | HD | Streaming | MD(?: iSTANCE)? )?</a>'
|
||||||
@@ -183,17 +184,6 @@ def findvideos(item):
|
|||||||
series = support.typo(item.contentSerieName, ' bold color kod')
|
series = support.typo(item.contentSerieName, ' bold color kod')
|
||||||
itemlist = support.server(item, data=url_video)
|
itemlist = support.server(item, data=url_video)
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(item.clone(title=goseries + series, contentType='tvshow', url=url_serie, action='episodios', plot = goseries + series + "con tutte le puntate"))
|
||||||
Item(channel=item.channel,
|
|
||||||
title=goseries + series,
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
show=item.show,
|
|
||||||
contentType='tvshow',
|
|
||||||
contentSerieName=item.contentSerieName,
|
|
||||||
url=url_serie,
|
|
||||||
action='episodios',
|
|
||||||
contentTitle=item.contentSerieName,
|
|
||||||
plot = goseries + series + "con tutte le puntate",
|
|
||||||
))
|
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ headers = [['Referer', host]]
|
|||||||
|
|
||||||
IDIOMAS = {'Italiano': 'IT'}
|
IDIOMAS = {'Italiano': 'IT'}
|
||||||
list_language = IDIOMAS.values()
|
list_language = IDIOMAS.values()
|
||||||
list_servers = ['gounlimited', 'rapidgator', 'uploadedto', 'vidtome']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
@@ -42,7 +42,7 @@ def cleantitle(scrapedtitle):
|
|||||||
scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle.strip())
|
scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle.strip())
|
||||||
scrapedtitle = scrapedtitle.replace('[HD]', '').replace('’', '\'').replace('×', 'x').replace('Game of Thrones –','')\
|
scrapedtitle = scrapedtitle.replace('[HD]', '').replace('’', '\'').replace('×', 'x').replace('Game of Thrones –','')\
|
||||||
.replace('In The Dark 2019', 'In The Dark (2019)').replace('"', "'").strip()
|
.replace('In The Dark 2019', 'In The Dark (2019)').replace('"', "'").strip()
|
||||||
year = scrapertools.find_single_match(scrapedtitle, '\((\d{4})\)')
|
year = scrapertools.find_single_match(scrapedtitle, r'\((\d{4})\)')
|
||||||
if year:
|
if year:
|
||||||
scrapedtitle = scrapedtitle.replace('(' + year + ')', '')
|
scrapedtitle = scrapedtitle.replace('(' + year + ')', '')
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ def findvideos(item):
|
|||||||
data = re.sub(r'\n|\t|\s+', ' ', data)
|
data = re.sub(r'\n|\t|\s+', ' ', data)
|
||||||
# recupero il blocco contenente i link
|
# recupero il blocco contenente i link
|
||||||
blocco = scrapertools.find_single_match(data, r'<div class="entry">([\s\S.]*?)<div class="post').replace('..:: Episodio ', 'Episodio ').strip()
|
blocco = scrapertools.find_single_match(data, r'<div class="entry">([\s\S.]*?)<div class="post').replace('..:: Episodio ', 'Episodio ').strip()
|
||||||
matches = scrapertools.find_multiple_matches(blocco, '(S(\d*)E(\d*))\s')
|
matches = scrapertools.find_multiple_matches(blocco, r'(S(\d*)E(\d*))\s')
|
||||||
if len(matches) > 0:
|
if len(matches) > 0:
|
||||||
for fullseasonepisode, season, episode in matches:
|
for fullseasonepisode, season, episode in matches:
|
||||||
blocco = blocco.replace(fullseasonepisode + ' ', 'Episodio ' + episode + ' ')
|
blocco = blocco.replace(fullseasonepisode + ' ', 'Episodio ' + episode + ' ')
|
||||||
@@ -74,7 +74,7 @@ def findvideos(item):
|
|||||||
if len(matches):
|
if len(matches):
|
||||||
data = matches[0][0]
|
data = matches[0][0]
|
||||||
|
|
||||||
patron = 'href="(https?://www\.keeplinks\.(?:co|eu)/p(?:[0-9]*)/([^"]+))"'
|
patron = r'href="(https?://www\.keeplinks\.(?:co|eu)/p(?:[0-9]*)/([^"]+))"'
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
for keeplinks, id in matches:
|
for keeplinks, id in matches:
|
||||||
headers2 = [['Cookie', 'flag[' + id + ']=1; defaults=1; nopopatall=' + str(int(time.time()))],
|
headers2 = [['Cookie', 'flag[' + id + ']=1; defaults=1; nopopatall=' + str(int(time.time()))],
|
||||||
@@ -116,18 +116,15 @@ def lista_serie(item):
|
|||||||
if i >= p * PERPAGE: break
|
if i >= p * PERPAGE: break
|
||||||
title = cleantitle(scrapedtitle)
|
title = cleantitle(scrapedtitle)
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(action="episodios",
|
||||||
extra=item.extra,
|
title=title,
|
||||||
action="episodios",
|
url=scrapedurl,
|
||||||
title=title,
|
thumbnail=scrapedthumbnail,
|
||||||
url=scrapedurl,
|
fulltitle=title,
|
||||||
thumbnail=scrapedthumbnail,
|
show=title,
|
||||||
fulltitle=title,
|
plot=scrapedplot,
|
||||||
show=title,
|
contentType='episode',
|
||||||
plot=scrapedplot,
|
originalUrl=scrapedurl))
|
||||||
contentType='episode',
|
|
||||||
originalUrl=scrapedurl,
|
|
||||||
folder=True))
|
|
||||||
|
|
||||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||||
|
|
||||||
@@ -162,7 +159,7 @@ def episodios(item, itemlist=[]):
|
|||||||
|
|
||||||
# recupero la stagione
|
# recupero la stagione
|
||||||
season = scrapertools.find_single_match(scrapedtitle, 'Stagione ([0-9]*)')
|
season = scrapertools.find_single_match(scrapedtitle, 'Stagione ([0-9]*)')
|
||||||
blocco = scrapertools.find_single_match(data, '<div class="entry">[\s\S.]*?<div class="post')
|
blocco = scrapertools.find_single_match(data, r'<div class="entry">[\s\S.]*?<div class="post')
|
||||||
blocco = blocco.replace('<strong>Episodio ', '<strong>Episodio ').replace(' </strong>', ' </strong>')
|
blocco = blocco.replace('<strong>Episodio ', '<strong>Episodio ').replace(' </strong>', ' </strong>')
|
||||||
blocco = blocco.replace('<strong>Episodio ', '<strong>S' + season.zfill(2) + 'E')
|
blocco = blocco.replace('<strong>Episodio ', '<strong>S' + season.zfill(2) + 'E')
|
||||||
matches = scrapertools.find_multiple_matches(blocco, r'(S(\d*)E(\d*))\s')
|
matches = scrapertools.find_multiple_matches(blocco, r'(S(\d*)E(\d*))\s')
|
||||||
@@ -189,18 +186,15 @@ def episodios(item, itemlist=[]):
|
|||||||
infoLabels['episode'] = episode
|
infoLabels['episode'] = episode
|
||||||
fullepisode += ' ' + support.typo("Sub-ITA", '_ [] color kod')
|
fullepisode += ' ' + support.typo("Sub-ITA", '_ [] color kod')
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(action="findvideos",
|
||||||
extra=item.extra,
|
fulltitle=scrapedtitle,
|
||||||
action="findvideos",
|
show=scrapedtitle,
|
||||||
fulltitle=scrapedtitle,
|
title=fullepisode,
|
||||||
show=scrapedtitle,
|
url=scrapedurl,
|
||||||
title=fullepisode,
|
thumbnail=scrapedthumbnail,
|
||||||
url=scrapedurl,
|
plot=scrapedplot,
|
||||||
thumbnail=scrapedthumbnail,
|
contentSerieName=title,
|
||||||
plot=scrapedplot,
|
infoLabels=infoLabels))
|
||||||
contentSerieName=title,
|
|
||||||
infoLabels=infoLabels,
|
|
||||||
folder=True))
|
|
||||||
|
|
||||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||||
|
|
||||||
@@ -224,7 +218,7 @@ def peliculas_tv(item):
|
|||||||
log()
|
log()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
patron = '<div class="post-meta">\s*<a href="([^"]+)"\s*title="([^"]+)"\s*class=".*?"></a>'
|
patron = r'<div class="post-meta">\s*<a href="([^"]+)"\s*title="([^"]+)"\s*class=".*?"></a>'
|
||||||
|
|
||||||
html = support.match(item, patron=patron, headers=headers)
|
html = support.match(item, patron=patron, headers=headers)
|
||||||
matches = html.matches
|
matches = html.matches
|
||||||
@@ -249,18 +243,16 @@ def peliculas_tv(item):
|
|||||||
infoLabels['episode'] = episode[2].zfill(2)
|
infoLabels['episode'] = episode[2].zfill(2)
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(action="findvideos",
|
||||||
action="findvideos",
|
fulltitle=scrapedtitle,
|
||||||
fulltitle=scrapedtitle,
|
show=scrapedtitle,
|
||||||
show=scrapedtitle,
|
title=title + " - " + episode[0] + " " + support.typo("Sub-ITA", '_ [] color kod'),
|
||||||
title=title + " - " + episode[0] + " " + support.typo("Sub-ITA", '_ [] color kod'),
|
url=scrapedurl,
|
||||||
url=scrapedurl,
|
thumbnail=scrapedthumbnail,
|
||||||
thumbnail=scrapedthumbnail,
|
contentSerieName=title,
|
||||||
contentSerieName=title,
|
contentLanguage='Sub-ITA',
|
||||||
contentLanguage='Sub-ITA',
|
plot=scrapedplot,
|
||||||
plot=scrapedplot,
|
infoLabels=infoLabels))
|
||||||
infoLabels=infoLabels,
|
|
||||||
folder=True))
|
|
||||||
|
|
||||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||||
|
|
||||||
@@ -301,7 +293,7 @@ def search(item, texto):
|
|||||||
log(texto)
|
log(texto)
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
patron = '<li class="cat-item cat-item-\d+"><a href="([^"]+)"\s?>([^<]+)</a>'
|
patron = r'<li class="cat-item cat-item-\d+"><a href="([^"]+)"\s?>([^<]+)</a>'
|
||||||
matches = support.match(item, patron=patron, headers=headers).matches
|
matches = support.match(item, patron=patron, headers=headers).matches
|
||||||
for i, (scrapedurl, scrapedtitle) in enumerate(matches):
|
for i, (scrapedurl, scrapedtitle) in enumerate(matches):
|
||||||
if texto.upper() in scrapedtitle.upper():
|
if texto.upper() in scrapedtitle.upper():
|
||||||
@@ -309,18 +301,15 @@ def search(item, texto):
|
|||||||
scrapedplot = ""
|
scrapedplot = ""
|
||||||
title = cleantitle(scrapedtitle)
|
title = cleantitle(scrapedtitle)
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(action="episodios",
|
||||||
extra=item.extra,
|
title=title,
|
||||||
action="episodios",
|
url=scrapedurl,
|
||||||
title=title,
|
thumbnail=scrapedthumbnail,
|
||||||
url=scrapedurl,
|
fulltitle=title,
|
||||||
thumbnail=scrapedthumbnail,
|
show=title,
|
||||||
fulltitle=title,
|
plot=scrapedplot,
|
||||||
show=title,
|
contentType='episode',
|
||||||
plot=scrapedplot,
|
originalUrl=scrapedurl))
|
||||||
contentType='episode',
|
|
||||||
originalUrl=scrapedurl,
|
|
||||||
folder=True))
|
|
||||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -336,7 +325,7 @@ def list_az(item):
|
|||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
alphabet = dict()
|
alphabet = dict()
|
||||||
patron = '<li class="cat-item cat-item-\d+"><a href="([^"]+)"\s?>([^<]+)</a>'
|
patron = r'<li class="cat-item cat-item-\d+"><a href="([^"]+)"\s?>([^<]+)</a>'
|
||||||
matches = support.match(item, patron=patron, headers=headers).matches
|
matches = support.match(item, patron=patron, headers=headers).matches
|
||||||
for i, (scrapedurl, scrapedtitle) in enumerate(matches):
|
for i, (scrapedurl, scrapedtitle) in enumerate(matches):
|
||||||
letter = scrapedtitle[0].upper()
|
letter = scrapedtitle[0].upper()
|
||||||
@@ -346,11 +335,10 @@ def list_az(item):
|
|||||||
|
|
||||||
for letter in sorted(alphabet):
|
for letter in sorted(alphabet):
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(action="lista_serie",
|
||||||
action="lista_serie",
|
url='\n\n'.join(alphabet[letter]),
|
||||||
url='\n\n'.join(alphabet[letter]),
|
title=letter,
|
||||||
title=letter,
|
fulltitle=letter))
|
||||||
fulltitle=letter))
|
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ from platformcode import config
|
|||||||
host = config.get_channel_url()
|
host = config.get_channel_url()
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['speedvideo']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
@@ -122,14 +122,10 @@ def findvideos(item):
|
|||||||
itemlist = support.server(item, data=urls_video)
|
itemlist = support.server(item, data=urls_video)
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.colone(title=support.typo("Vai alla Serie Completa: " + item.fulltitle, ' bold'),
|
||||||
title=support.typo("Vai alla Serie Completa: " + item.fulltitle, ' bold'),
|
contentType='tvshow',
|
||||||
fulltitle=item.fulltitle,
|
url=url_serie,
|
||||||
show=item.show,
|
action='episodios',
|
||||||
contentType='tvshow',
|
thumbnail = support.thumb(thumb='tvshow.png')))
|
||||||
url=url_serie,
|
|
||||||
action='episodios',
|
|
||||||
thumbnail = support.thumb(thumb='tvshow.png')
|
|
||||||
))
|
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ else:
|
|||||||
from urllib import unquote
|
from urllib import unquote
|
||||||
|
|
||||||
|
|
||||||
list_servers = ['verystream', 'openload', 'wstream']
|
|
||||||
list_quality = ['1080p', 'HD', 'DVDRIP', 'SD', 'CAM']
|
|
||||||
|
|
||||||
def findhost():
|
def findhost():
|
||||||
data = httptools.downloadpage('https://www.popcornstream-nuovo-indirizzo.online/').data
|
data = httptools.downloadpage('https://www.popcornstream-nuovo-indirizzo.online/').data
|
||||||
@@ -68,14 +68,8 @@ def findvideos(item):
|
|||||||
matches = support.match(item, patron=r'<a href="([^"]+)[^>]+>Download[^>]+>[^>]+>[^>]+><strong class="quality">([^<]+)<').matches
|
matches = support.match(item, patron=r'<a href="([^"]+)[^>]+>Download[^>]+>[^>]+>[^>]+><strong class="quality">([^<]+)<').matches
|
||||||
for url, quality in matches:
|
for url, quality in matches:
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(caction="play",
|
||||||
action="play",
|
url=unquote(support.match(url, patron=[r'dest=([^"]+)"',r'/(http[^"]+)">Click']).match),
|
||||||
url=unquote(support.match(url, patron=[r'dest=([^"]+)"',r'/(http[^"]+)">Click']).match),
|
quality=quality))
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
thumbnail=item.thumbnail,
|
|
||||||
show=item.show,
|
|
||||||
quality=quality,
|
|
||||||
contentType=item.contentType,
|
|
||||||
folder=False))
|
|
||||||
|
|
||||||
return support.server(item, itemlist=itemlist)
|
return support.server(item, itemlist=itemlist)
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ la lista delle pagine non sarà affatto 'uniforme' (a seconda di come viene pres
|
|||||||
|
|
||||||
host = config.get_channel_url()
|
host = config.get_channel_url()
|
||||||
headers = [['Referer', 'org.telegram.messenger']]
|
headers = [['Referer', 'org.telegram.messenger']]
|
||||||
list_servers = ['directo']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
downPrefix = 'https://stsh.ml/Down-'
|
downPrefix = 'https://stsh.ml/Down-'
|
||||||
|
|
||||||
@@ -122,17 +122,12 @@ def episodios(item):
|
|||||||
if '-' in season: # vedi https://stpgs.ml/SerieTv/Atypical-S01-8-8.html
|
if '-' in season: # vedi https://stpgs.ml/SerieTv/Atypical-S01-8-8.html
|
||||||
season = season.split('-')[0]
|
season = season.split('-')[0]
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(action="findvideos",
|
||||||
action="findvideos",
|
title=str(int(season)) + 'x' + str(n) + support.typo(item.quality, '-- [] color kod'),
|
||||||
title=str(int(season)) + 'x' + str(n) + support.typo(item.quality, '-- [] color kod'),
|
url=url,
|
||||||
url=url,
|
contentType='episode',
|
||||||
fulltitle=item.fulltitle,
|
folder=True,
|
||||||
thumbnail=item.thumbnail,
|
args={'id': id, 'season': season, 'episode': episode}))
|
||||||
show=item.show,
|
|
||||||
quality=item.quality,
|
|
||||||
contentType='episode',
|
|
||||||
folder=True,
|
|
||||||
args={'id': id, 'season': season, 'episode': episode}))
|
|
||||||
|
|
||||||
support.videolibrary(itemlist, item)
|
support.videolibrary(itemlist, item)
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -154,21 +149,7 @@ def findvideos(item):
|
|||||||
|
|
||||||
if res:
|
if res:
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
item.clone(action="play", title='contentful', url=res, server='directo'))
|
||||||
action="play",
|
|
||||||
title='contentful',
|
|
||||||
url=res,
|
|
||||||
server='directo',
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
thumbnail=item.thumbnail,
|
|
||||||
quality=item.quality,
|
|
||||||
contentType=item.contentType))
|
|
||||||
# download = itemlist[0].clone()
|
|
||||||
# if item.contentType == 'movie':
|
|
||||||
# download.url = downPrefix + id
|
|
||||||
# else:
|
|
||||||
# download.url = downPrefix + id + '-S' + season + '-' + episode
|
|
||||||
# itemlist.append(download)
|
|
||||||
else:
|
else:
|
||||||
# google drive...
|
# google drive...
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ def findhost():
|
|||||||
|
|
||||||
host = config.get_channel_url(findhost)
|
host = config.get_channel_url(findhost)
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
list_servers = ['verystream', 'openload', 'streamango', 'vidlox', 'youtube']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
@@ -58,13 +58,13 @@ def peliculas(item):
|
|||||||
# support.regexDbg(item, patron, headers)
|
# support.regexDbg(item, patron, headers)
|
||||||
else:
|
else:
|
||||||
patronNext = r'<a class="nextpostslink" rel="next" href="([^"]+)">'
|
patronNext = r'<a class="nextpostslink" rel="next" href="([^"]+)">'
|
||||||
patron = r'<div class="mediaWrap mediaWrapAlt">\s?<a href="(?P<url>[^"]+)"(?:[^>]+>|)>?\s?<img[^s]+src="([^"]+)"[^>]+>\s?<\/a>[^>]+>[^>]+>[^>]+>(?P<title>.+?)(?:[ ]<lang>[sSuUbB\-iItTaA]+)?(?:[ ]?\((?P<year>[\-\d+]+)\)).[^<]+[^>]+><\/a>.+?<p>\s*(?P<quality>[a-zA-Z-0-9\.]+)\s*<\/p>[^>]+>'
|
patron = r'<div class="mediaWrap mediaWrapAlt">\s?<a href="(?P<url>[^"]+)"(?:[^>]+>|)>?\s?<img[^s]+src="([^"]+)"[^>]+>\s?<\/a>[^>]+>[^>]+>[^>]+>(?P<title>.+?)(?P<lang>[sSuUbB\-iItTaA]+)?(?:[ ]?\((?P<year>\d{4})-?(?:\d{4})?)\).[^<]+[^>]+><\/a>.+?<p>\s*(?P<quality>[a-zA-Z-0-9\.]+)\s*<\/p>[^>]+>'
|
||||||
patronBlock = r'<div id="main_col">(?P<block>.*?)<!\-\- main_col \-\->'
|
patronBlock = r'<div id="main_col">(?P<block>.*?)<!\-\- main_col \-\->'
|
||||||
|
|
||||||
# if item.args != 'all' and item.args != 'search':
|
# if item.args != 'all' and item.args != 'search':
|
||||||
# action = 'findvideos' if item.extra == 'movie' else 'episodios'
|
# action = 'findvideos' if item.extra == 'movie' else 'episodios'
|
||||||
# item.contentType = 'movie' if item.extra == 'movie' else 'tvshow'
|
# item.contentType = 'movie' if item.extra == 'movie' else 'tvshow'
|
||||||
#debug = True
|
# debug = True
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ host = support.config.get_channel_url()
|
|||||||
|
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
|
|
||||||
list_servers = ['wstream', 'openload', 'streamango']
|
|
||||||
list_quality = ['HD', 'default']
|
|
||||||
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ from xml.dom import minidom
|
|||||||
|
|
||||||
host = 'http://api.radiotime.com'
|
host = 'http://api.radiotime.com'
|
||||||
headers = [['Referer', host]]
|
headers = [['Referer', host]]
|
||||||
list_servers = ['directo']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
@support.scrape
|
@support.scrape
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
@@ -27,14 +27,7 @@ def mainlist(item):
|
|||||||
return item
|
return item
|
||||||
def itemlistHook(itemlist):
|
def itemlistHook(itemlist):
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
support.Item(
|
item.clone(title=support.typo('Cerca...', 'bold color kod'), action='search', thumbnail=support.thumb(thumb='search.png')))
|
||||||
channel=item.channel,
|
|
||||||
title=support.typo('Cerca...', 'bold color kod'),
|
|
||||||
url = item.url,
|
|
||||||
action='search',
|
|
||||||
thumbnail=support.thumb(thumb='search.png')))
|
|
||||||
support.autoplay.init(item.channel, list_servers, list_quality)
|
|
||||||
support.autoplay.show_option(item.channel, itemlist)
|
|
||||||
support.channel_config(item, itemlist)
|
support.channel_config(item, itemlist)
|
||||||
return itemlist
|
return itemlist
|
||||||
return locals()
|
return locals()
|
||||||
@@ -47,16 +40,12 @@ def radio(item):
|
|||||||
if data.matches:
|
if data.matches:
|
||||||
for title, location, url, quality, song, type, thumbnail in data.matches:
|
for title, location, url, quality, song, type, thumbnail in data.matches:
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
support.Item(
|
item.clone(title = support.typo(title, 'bold') + support.typo(quality + ' kbps','_ [] bold color kod'),
|
||||||
channel = item.channel,
|
thumbnail = thumbnail,
|
||||||
title = support.typo(title, 'bold') + support.typo(quality + ' kbps','_ [] bold color kod'),
|
url = url,
|
||||||
thumbnail = thumbnail,
|
contentType = 'music',
|
||||||
url = url,
|
plot = support.typo(location, 'bold') + '\n' + song,
|
||||||
contentType = 'music',
|
action = 'findvideos'))
|
||||||
plot = support.typo(location, 'bold') + '\n' + song,
|
|
||||||
action = 'findvideos'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
matches = support.match(data.data, patron= r'text="(?P<title>[^\("]+)(?:\([^\)]+\))?" URL="(?P<url>[^"]+)" (?:guide_id="[^"]+" )?(?:stream_type="[^"]+" )?topic_duration="(?P<duration>[^"]+)" subtext="(?P<plot>[^"]+)" item="[^"]+" image="(?P<thumb>[^"]+)"').matches
|
matches = support.match(data.data, patron= r'text="(?P<title>[^\("]+)(?:\([^\)]+\))?" URL="(?P<url>[^"]+)" (?:guide_id="[^"]+" )?(?:stream_type="[^"]+" )?topic_duration="(?P<duration>[^"]+)" subtext="(?P<plot>[^"]+)" item="[^"]+" image="(?P<thumb>[^"]+)"').matches
|
||||||
if matches:
|
if matches:
|
||||||
@@ -64,29 +53,22 @@ def radio(item):
|
|||||||
infoLabels={}
|
infoLabels={}
|
||||||
infoLabels['duration'] = duration
|
infoLabels['duration'] = duration
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
support.Item(
|
item.clone(title = support.typo(title, 'bold'),
|
||||||
channel = item.channel,
|
thumbnail = thumbnail,
|
||||||
title = support.typo(title, 'bold'),
|
infolLbels = infoLabels,
|
||||||
thumbnail = thumbnail,
|
url = url,
|
||||||
infolLbels = infoLabels,
|
contentType = 'music',
|
||||||
url = url,
|
plot = plot,
|
||||||
contentType = 'music',
|
action = 'findvideos'))
|
||||||
plot = plot,
|
|
||||||
action = 'findvideos'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
matches = support.match(data.data, patron= r'text="(?P<title>[^"]+)" URL="(?P<url>[^"]+)"').matches
|
matches = support.match(data.data, patron= r'text="(?P<title>[^"]+)" URL="(?P<url>[^"]+)"').matches
|
||||||
for title, url in matches:
|
for title, url in matches:
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
support.Item(
|
item.clone(channel = item.channel,
|
||||||
channel = item.channel,
|
title = support.typo(title, 'bold'),
|
||||||
title = support.typo(title, 'bold'),
|
thumbnail = item.thumbnail,
|
||||||
thumbnail = item.thumbnail,
|
url = url,
|
||||||
url = url,
|
action = 'radio'))
|
||||||
action = 'radio'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ headers = ""
|
|||||||
|
|
||||||
IDIOMAS = {'Italiano': 'IT'}
|
IDIOMAS = {'Italiano': 'IT'}
|
||||||
list_language = IDIOMAS.values()
|
list_language = IDIOMAS.values()
|
||||||
list_servers = ['verystream', 'openload', 'streamango', 'wstream']
|
|
||||||
list_quality = ['HD', 'SD']
|
|
||||||
|
|
||||||
#esclusione degli articoli 'di servizio'
|
#esclusione degli articoli 'di servizio'
|
||||||
blacklist = ['CB01.UNO ▶ TROVA L’INDIRIZZO UFFICIALE ', 'AVVISO IMPORTANTE – CB01.UNO', 'GUIDA VEDOHD']
|
blacklist = ['CB01.UNO ▶ TROVA L’INDIRIZZO UFFICIALE ', 'AVVISO IMPORTANTE – CB01.UNO', 'GUIDA VEDOHD']
|
||||||
@@ -52,18 +52,7 @@ def findvideos(item):
|
|||||||
title = server + " [COLOR blue][" + quality + "][/COLOR]"
|
title = server + " [COLOR blue][" + quality + "][/COLOR]"
|
||||||
else:
|
else:
|
||||||
title = server
|
title = server
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="play", title=title, url=link['url'], server=server, quality=quality,))
|
||||||
Item(channel=item.channel,
|
|
||||||
action="play",
|
|
||||||
title=title,
|
|
||||||
url=link['url'],
|
|
||||||
server=server,
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
thumbnail=item.thumbnail,
|
|
||||||
show=item.show,
|
|
||||||
quality=quality,
|
|
||||||
contentType=item.contentType,
|
|
||||||
folder=False))
|
|
||||||
|
|
||||||
autoplay.start(itemlist, item)
|
autoplay.start(itemlist, item)
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ except:
|
|||||||
|
|
||||||
main_host = host
|
main_host = host
|
||||||
host += '/vvvvid/ondemand/'
|
host += '/vvvvid/ondemand/'
|
||||||
list_servers = ['vvvvid']
|
|
||||||
list_quality = ['default']
|
|
||||||
|
|
||||||
@support.menu
|
@support.menu
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
@@ -123,12 +123,10 @@ def peliculas(item):
|
|||||||
for key in keys:
|
for key in keys:
|
||||||
if key not in ['1','2']:
|
if key not in ['1','2']:
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel = item.channel,
|
item.clone(title = support.typo(key.upper() if Filter == 'filter' else key['name'], 'bold'),
|
||||||
title = support.typo(key.upper() if Filter == 'filter' else key['name'], 'bold'),
|
url = item.url + item.args + (key if Filter == 'filter' else str(key['id'])),
|
||||||
url = item.url + item.args + (key if Filter == 'filter' else str(key['id'])),
|
action = 'peliculas',
|
||||||
action = 'peliculas',
|
args = 'filters'))
|
||||||
args = 'filters',
|
|
||||||
contentType = item.contentType))
|
|
||||||
|
|
||||||
else :
|
else :
|
||||||
json_file=loadjs(item.url)
|
json_file=loadjs(item.url)
|
||||||
@@ -167,19 +165,10 @@ def episodios(item):
|
|||||||
if make_item == True:
|
if make_item == True:
|
||||||
if type(title) == tuple: title = title[0]
|
if type(title) == tuple: title = title[0]
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(
|
item.clone(title = title,
|
||||||
channel = item.channel,
|
url= host + show_id + '/season/' + str(key['season_id']) + '/',
|
||||||
title = title,
|
action= 'findvideos',
|
||||||
fulltitle= item.fulltitle,
|
video_id= key['video_id']))
|
||||||
show= item.show,
|
|
||||||
url= host + show_id + '/season/' + str(key['season_id']) + '/',
|
|
||||||
action= 'findvideos',
|
|
||||||
video_id= key['video_id'],
|
|
||||||
thumbnail= item.thumbnail,
|
|
||||||
fanart = item.fanart,
|
|
||||||
plot=item.plot,
|
|
||||||
contentType = item.contentType
|
|
||||||
))
|
|
||||||
autorenumber.renumber(itemlist, item, 'bold')
|
autorenumber.renumber(itemlist, item, 'bold')
|
||||||
if autorenumber.check(item) == True \
|
if autorenumber.check(item) == True \
|
||||||
or support.match(itemlist[0].title, patron=r"(\d+x\d+)").match:
|
or support.match(itemlist[0].title, patron=r"(\d+x\d+)").match:
|
||||||
@@ -204,10 +193,10 @@ def findvideos(item):
|
|||||||
url = support.match('https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/playlist.m3u').data
|
url = support.match('https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/playlist.m3u').data
|
||||||
url = url.split()[-1]
|
url = url.split()[-1]
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(action= 'play',
|
item.clone(action= 'play',
|
||||||
title='direct',
|
title='direct',
|
||||||
url= 'https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/' + url,
|
url= 'https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/' + url,
|
||||||
server= 'directo')
|
server= 'directo')
|
||||||
)
|
)
|
||||||
return support.server(item, itemlist=itemlist, Download=False)
|
return support.server(item, itemlist=itemlist, Download=False)
|
||||||
|
|
||||||
@@ -220,18 +209,15 @@ def make_itemlist(itemlist, item, data):
|
|||||||
infoLabels['title'] = infoLabels['tvshowtitle'] = key['title']
|
infoLabels['title'] = infoLabels['tvshowtitle'] = key['title']
|
||||||
title = encode(key['title'])
|
title = encode(key['title'])
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(
|
item.clone(title = support.typo(title, 'bold'),
|
||||||
channel = item.channel,
|
fulltitle= title,
|
||||||
title = support.typo(title, 'bold'),
|
show= title,
|
||||||
fulltitle= title,
|
url= host + str(key['show_id']) + '/seasons/',
|
||||||
show= title,
|
action= 'findvideos' if item.contentType == 'movie' else 'episodios',
|
||||||
url= host + str(key['show_id']) + '/seasons/',
|
contentType = item.contentType,
|
||||||
action= 'findvideos' if item.contentType == 'movie' else 'episodios',
|
contentSerieName= key['title'] if item.contentType != 'movie' else '',
|
||||||
contentType = item.contentType,
|
contentTitle= title if item.contentType == 'movie' else '',
|
||||||
contentSerieName= key['title'] if item.contentType != 'movie' else '',
|
infoLabels=infoLabels))
|
||||||
contentTitle= title if item.contentType == 'movie' else '',
|
|
||||||
infoLabels=infoLabels
|
|
||||||
))
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
def loadjs(url):
|
def loadjs(url):
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ def getchanneltypes(view="thumb_"):
|
|||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
# Category List
|
# Category List
|
||||||
channel_types = ["movie", "tvshow", "anime", "documentary", "vos", "direct", "live", "torrent", "music"]
|
channel_types = ["movie", "tvshow", "anime", "documentary", "vos", "live", "torrent", "music"] #, "direct"
|
||||||
|
|
||||||
# Channel Language
|
# Channel Language
|
||||||
channel_language = auto_filter()
|
channel_language = auto_filter()
|
||||||
@@ -218,31 +218,16 @@ def filterchannels(category, view="thumb_"):
|
|||||||
return channelslist
|
return channelslist
|
||||||
|
|
||||||
|
|
||||||
def get_thumb(thumb_name, view="thumb_", auto=False):
|
def get_thumb(thumb_name, view="thumb_"):
|
||||||
|
from core import filetools
|
||||||
if auto:
|
if thumb_name.startswith('http'):
|
||||||
thumbnail = ''
|
return thumb_name
|
||||||
|
elif config.get_setting('enable_custom_theme') and config.get_setting('custom_theme') and filetools.isfile(config.get_setting('custom_theme') + view + thumb_name):
|
||||||
thumb_name = unify.set_genre(unify.simplify(thumb_name))
|
media_path = config.get_setting('custom_theme')
|
||||||
|
|
||||||
if thumb_name in thumb_dict:
|
|
||||||
thumbnail = thumb_dict[thumb_name]
|
|
||||||
return thumbnail
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
icon_pack_name = config.get_setting('icon_set', default="default")
|
icon_pack_name = config.get_setting('icon_set', default="default")
|
||||||
media_path = os.path.join("https://raw.githubusercontent.com/kodiondemand/media/master/themes", icon_pack_name)
|
media_path = filetools.join("https://raw.githubusercontent.com/kodiondemand/media/master/themes", icon_pack_name)
|
||||||
|
return filetools.join(media_path, view + thumb_name)
|
||||||
if config.get_setting('enable_custom_theme') and config.get_setting('custom_theme') and os.path.isfile(config.get_setting('custom_theme') + view + thumb_name):
|
|
||||||
media_path = config.get_setting('custom_theme')
|
|
||||||
|
|
||||||
if thumb_name.startswith('http'):
|
|
||||||
thumbnail = thumb_name
|
|
||||||
else:
|
|
||||||
thumbnail = os.path.join(media_path, view + thumb_name)
|
|
||||||
if 'http' in thumbnail:
|
|
||||||
thumbnail = thumbnail.replace('\\','/')
|
|
||||||
return thumbnail
|
|
||||||
|
|
||||||
|
|
||||||
def set_channel_info(parameters):
|
def set_channel_info(parameters):
|
||||||
@@ -296,7 +281,7 @@ def thumb(item_or_itemlist=None, genre=False, thumb=''):
|
|||||||
import re
|
import re
|
||||||
icon_dict = {'movie':['film', 'movie'],
|
icon_dict = {'movie':['film', 'movie'],
|
||||||
'tvshow':['serie','tv','episodi','episodio','fiction', 'show'],
|
'tvshow':['serie','tv','episodi','episodio','fiction', 'show'],
|
||||||
'documentary':['documentari','documentario', 'documentary'],
|
'documentary':['documentari','documentario', 'documentary', 'documentaristico'],
|
||||||
'teenager':['ragazzi','teenager', 'teen'],
|
'teenager':['ragazzi','teenager', 'teen'],
|
||||||
'learning':['learning'],
|
'learning':['learning'],
|
||||||
'all':['tutti', 'all'],
|
'all':['tutti', 'all'],
|
||||||
@@ -308,17 +293,17 @@ def thumb(item_or_itemlist=None, genre=False, thumb=''):
|
|||||||
'action':['azione', 'arti marziali', 'action'],
|
'action':['azione', 'arti marziali', 'action'],
|
||||||
'adventure': ['avventura', 'adventure'],
|
'adventure': ['avventura', 'adventure'],
|
||||||
'biographical':['biografico', 'biographical'],
|
'biographical':['biografico', 'biographical'],
|
||||||
'comedy':['comico', 'commedia', 'demenziale', 'comedy'],
|
'comedy':['comico', 'commedia', 'demenziale', 'comedy', 'brillante'],
|
||||||
'adult':['erotico', 'hentai', 'harem', 'ecchi', 'adult'],
|
'adult':['erotico', 'hentai', 'harem', 'ecchi', 'adult'],
|
||||||
'drama':['drammatico', 'drama', 'dramma'],
|
'drama':['drammatico', 'drama', 'dramma'],
|
||||||
'syfy':['fantascienza', 'science fiction', 'syfy', 'sci'],
|
'syfy':['fantascienza', 'science fiction', 'syfy', 'sci'],
|
||||||
'fantasy':['fantasy', 'magia', 'magic'],
|
'fantasy':['fantasy', 'magia', 'magic', 'fantastico'],
|
||||||
'crime':['gangster','poliziesco', 'crime', 'crimine'],
|
'crime':['gangster','poliziesco', 'crime', 'crimine'],
|
||||||
'grotesque':['grottesco', 'grotesque'],
|
'grotesque':['grottesco', 'grotesque'],
|
||||||
'war':['guerra', 'war'],
|
'war':['guerra', 'war'],
|
||||||
'children':['bambini', 'kids'],
|
'children':['bambini', 'kids'],
|
||||||
'horror':['horror'],
|
'horror':['horror'],
|
||||||
'music':['musical', 'musica', 'music'],
|
'music':['musical', 'musica', 'music', 'musicale'],
|
||||||
'mistery':['mistero', 'giallo', 'mystery'],
|
'mistery':['mistero', 'giallo', 'mystery'],
|
||||||
'noir':['noir'],
|
'noir':['noir'],
|
||||||
'popular' : ['popolari','popolare', 'più visti'],
|
'popular' : ['popolari','popolare', 'più visti'],
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ def get_channel_setting(name, channel, default=None):
|
|||||||
file_settings = filetools.join(config.get_data_path(), "settings_channels", channel + "_data.json")
|
file_settings = filetools.join(config.get_data_path(), "settings_channels", channel + "_data.json")
|
||||||
dict_settings = {}
|
dict_settings = {}
|
||||||
dict_file = {}
|
dict_file = {}
|
||||||
if channel not in ['trakt']: def_settings = get_default_settings(channel)
|
if channel not in ['trakt', 'autoplay']: def_settings = get_default_settings(channel)
|
||||||
|
|
||||||
if filetools.exists(file_settings):
|
if filetools.exists(file_settings):
|
||||||
# We get saved configuration from ../settings/channel_data.json
|
# We get saved configuration from ../settings/channel_data.json
|
||||||
|
|||||||
@@ -360,7 +360,7 @@ def downloadfile(url, nombrefichero, headers=None, silent=False, continuar=False
|
|||||||
tiempofalta = 0
|
tiempofalta = 0
|
||||||
# logger.info(sec_to_hms(tiempofalta))
|
# logger.info(sec_to_hms(tiempofalta))
|
||||||
if not silent:
|
if not silent:
|
||||||
progreso.update(percent, "%.2fMB/%.2fMB (%d%%) %.2f Kb/s %s falta " %
|
progreso.update(percent, "%.2fMB/%.2fMB (%d%%) %.2f Kb/s %s" %
|
||||||
(descargadosmb, totalmb, percent, old_div(velocidad, 1024),
|
(descargadosmb, totalmb, percent, old_div(velocidad, 1024),
|
||||||
sec_to_hms(tiempofalta)))
|
sec_to_hms(tiempofalta)))
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -40,8 +40,20 @@ def printMatches(matches):
|
|||||||
|
|
||||||
def find_single_match(data, patron, index=0):
|
def find_single_match(data, patron, index=0):
|
||||||
try:
|
try:
|
||||||
matches = re.findall(patron, data, flags=re.DOTALL)
|
if index == 0:
|
||||||
return matches[index]
|
matches = re.search(patron, data, flags=re.DOTALL)
|
||||||
|
if matches:
|
||||||
|
if len(matches.groups()) == 1:
|
||||||
|
return matches.group(1)
|
||||||
|
elif len(matches.groups()) > 1:
|
||||||
|
return matches.groups()
|
||||||
|
else:
|
||||||
|
return matches.group()
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
else:
|
||||||
|
matches = re.findall(patron, data, flags=re.DOTALL)
|
||||||
|
return matches[index]
|
||||||
except:
|
except:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
@@ -91,6 +103,8 @@ def unescape(text):
|
|||||||
from Fredrik Lundh
|
from Fredrik Lundh
|
||||||
http://effbot.org/zone/re-sub.htm#unescape-html
|
http://effbot.org/zone/re-sub.htm#unescape-html
|
||||||
"""
|
"""
|
||||||
|
if not ('&' in text and ';' in text):
|
||||||
|
return text
|
||||||
|
|
||||||
def fixup(m):
|
def fixup(m):
|
||||||
text = m.group(0)
|
text = m.group(0)
|
||||||
@@ -418,7 +432,7 @@ def get_season_and_episode(title):
|
|||||||
"""
|
"""
|
||||||
filename = ""
|
filename = ""
|
||||||
|
|
||||||
patrons = ["(\d+)\s*[x-]\s*(\d+)", "(\d+)\s*×\s*(\d+)", "(?:[Ss]|[Tt])(\d+)(?:[Ee]|Ep\.)(\d+)",
|
patrons = ["(\d+)\s*[x-]\s*(\d+)", "(\d+)\s*×\s*(\d+)", "(?:[Ss]|[Tt])(\d+)\s?(?:[Ee]|Ep\.?)(\d+)",
|
||||||
"(?:[Ss]tag|[Ss]eason|[Ss]tagione\w*)\s*(\d+)\s*(?:[Ee]pi|[Ee]pisode|[Ee]pisodio\w*)\s*(\d+)"]
|
"(?:[Ss]tag|[Ss]eason|[Ss]tagione\w*)\s*(\d+)\s*(?:[Ee]pi|[Ee]pisode|[Ee]pisodio\w*)\s*(\d+)"]
|
||||||
|
|
||||||
for patron in patrons:
|
for patron in patrons:
|
||||||
|
|||||||
@@ -118,8 +118,6 @@ def get_servers_itemlist(itemlist, fnc=None, sort=False):
|
|||||||
|
|
||||||
# We remove the deactivated servers
|
# We remove the deactivated servers
|
||||||
# itemlist = filter(lambda i: not i.server or is_server_enabled(i.server), itemlist)
|
# itemlist = filter(lambda i: not i.server or is_server_enabled(i.server), itemlist)
|
||||||
# Filter if necessary
|
|
||||||
itemlist = filter_servers(itemlist)
|
|
||||||
|
|
||||||
for item in itemlist:
|
for item in itemlist:
|
||||||
# We assign "direct" in case the server is not in KoD
|
# We assign "direct" in case the server is not in KoD
|
||||||
@@ -152,23 +150,24 @@ def findvideos(data, skip=False):
|
|||||||
servers_list = list(get_servers_list().keys())
|
servers_list = list(get_servers_list().keys())
|
||||||
|
|
||||||
|
|
||||||
is_filter_servers = False
|
# is_filter_servers = False
|
||||||
|
|
||||||
# Run findvideos on each active server
|
# Run findvideos on each active server
|
||||||
for serverid in servers_list:
|
for serverid in servers_list:
|
||||||
'''if not is_server_enabled(serverid):
|
'''if not is_server_enabled(serverid):
|
||||||
continue'''
|
continue'''
|
||||||
if config.get_setting("filter_servers") == True and config.get_setting("black_list", server=serverid):
|
if config.get_setting('servers_blacklist') and serverid not in config.get_setting("black_list", server='servers'):
|
||||||
is_filter_servers = True
|
# if config.get_setting("filter_servers") == True and config.get_setting("black_list", server=serverid):
|
||||||
|
# is_filter_servers = True
|
||||||
continue
|
continue
|
||||||
devuelve.extend(findvideosbyserver(data, serverid))
|
devuelve.extend(findvideosbyserver(data, serverid))
|
||||||
if skip and len(devuelve) >= skip:
|
if skip and len(devuelve) >= skip:
|
||||||
devuelve = devuelve[:skip]
|
devuelve = devuelve[:skip]
|
||||||
break
|
break
|
||||||
if config.get_setting("filter_servers") == False: is_filter_servers = False
|
# if config.get_setting("filter_servers") == False: is_filter_servers = False
|
||||||
if not devuelve and is_filter_servers:
|
# logger.info('DEVUELVE: ' + str(devuelve))
|
||||||
platformtools.dialog_ok(config.get_localized_string(60000), config.get_localized_string(60001))
|
# if not devuelve and is_filter_servers:
|
||||||
|
# platformtools.dialog_ok(config.get_localized_string(60000), config.get_localized_string(60001))
|
||||||
return devuelve
|
return devuelve
|
||||||
|
|
||||||
|
|
||||||
@@ -214,8 +213,6 @@ def get_server_from_url(url):
|
|||||||
for serverid in servers_list:
|
for serverid in servers_list:
|
||||||
'''if not is_server_enabled(serverid):
|
'''if not is_server_enabled(serverid):
|
||||||
continue'''
|
continue'''
|
||||||
if config.get_setting("filter_servers") == True and config.get_setting("black_list", server=serverid):
|
|
||||||
continue
|
|
||||||
serverid = get_server_name(serverid)
|
serverid = get_server_name(serverid)
|
||||||
if not serverid:
|
if not serverid:
|
||||||
continue
|
continue
|
||||||
@@ -535,35 +532,35 @@ def get_server_parameters(server):
|
|||||||
return dict_servers_parameters[server]
|
return dict_servers_parameters[server]
|
||||||
|
|
||||||
|
|
||||||
def get_server_json(server_name):
|
# def get_server_json(server_name):
|
||||||
# logger.info("server_name=" + server_name)
|
# # logger.info("server_name=" + server_name)
|
||||||
try:
|
# try:
|
||||||
server_path = filetools.join(config.get_runtime_path(), "servers", server_name + ".json")
|
# server_path = filetools.join(config.get_runtime_path(), "servers", server_name + ".json")
|
||||||
if not filetools.exists(server_path):
|
# if not filetools.exists(server_path):
|
||||||
server_path = filetools.join(config.get_runtime_path(), "servers", "debriders", server_name + ".json")
|
# server_path = filetools.join(config.get_runtime_path(), "servers", "debriders", server_name + ".json")
|
||||||
|
#
|
||||||
# logger.info("server_path=" + server_path)
|
# # logger.info("server_path=" + server_path)
|
||||||
server_json = jsontools.load(filetools.read(server_path))
|
# server_json = jsontools.load(filetools.read(server_path))
|
||||||
# logger.info("server_json= %s" % server_json)
|
# # logger.info("server_json= %s" % server_json)
|
||||||
|
#
|
||||||
except Exception as ex:
|
# except Exception as ex:
|
||||||
template = "An exception of type %s occured. Arguments:\n%r"
|
# template = "An exception of type %s occured. Arguments:\n%r"
|
||||||
message = template % (type(ex).__name__, ex.args)
|
# message = template % (type(ex).__name__, ex.args)
|
||||||
logger.error(" %s" % message)
|
# logger.error(" %s" % message)
|
||||||
server_json = None
|
# server_json = None
|
||||||
|
#
|
||||||
return server_json
|
# return server_json
|
||||||
|
|
||||||
|
|
||||||
def get_server_host(server_name):
|
def get_server_host(server_name):
|
||||||
from core import scrapertools
|
from core import scrapertools
|
||||||
return [scrapertools.get_domain_from_url(pattern['url']) for pattern in get_server_json(server_name)['find_videos']['patterns']]
|
return [scrapertools.get_domain_from_url(pattern['url']) for pattern in get_server_parameters(server_name)['find_videos']['patterns']]
|
||||||
|
|
||||||
|
|
||||||
def get_server_controls_settings(server_name):
|
def get_server_controls_settings(server_name):
|
||||||
dict_settings = {}
|
dict_settings = {}
|
||||||
|
|
||||||
list_controls = get_server_json(server_name).get('settings', [])
|
list_controls = get_server_parameters(server_name).get('settings', [])
|
||||||
import copy
|
import copy
|
||||||
list_controls = copy.deepcopy(list_controls)
|
list_controls = copy.deepcopy(list_controls)
|
||||||
|
|
||||||
@@ -720,33 +717,7 @@ def sort_servers(servers_list):
|
|||||||
return servers_list
|
return servers_list
|
||||||
|
|
||||||
|
|
||||||
def filter_servers(servers_list):
|
|
||||||
"""
|
|
||||||
If the option "Filter by servers" is activated in the server configuration, removes the servers included in the Black List from the entry list.
|
|
||||||
:param servers_list: List of servers to filter. The items in the servers_list can be strings or Item objects. In which case it is necessary that they have an item.server attribute of type str.
|
|
||||||
:return: List of the same type of objects as servers_list filtered based on the Black List.
|
|
||||||
"""
|
|
||||||
# We eliminate the inactive
|
|
||||||
if servers_list:
|
|
||||||
servers_list = [i for i in servers_list if not i.server or is_server_enabled(i.server)]
|
|
||||||
|
|
||||||
|
|
||||||
if servers_list and config.get_setting('filter_servers'):
|
|
||||||
if isinstance(servers_list[0], Item):
|
|
||||||
servers_list_filter = [x for x in servers_list if not config.get_setting("black_list", server=x.server)]
|
|
||||||
else:
|
|
||||||
servers_list_filter = [x for x in servers_list if not config.get_setting("black_list", server=x)]
|
|
||||||
|
|
||||||
# If there are no links after filtering
|
|
||||||
if servers_list_filter or not platformtools.dialog_yesno(config.get_localized_string(60000), config.get_localized_string(60010), config.get_localized_string(70281)):
|
|
||||||
servers_list = servers_list_filter
|
|
||||||
|
|
||||||
return servers_list
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Checking links
|
# Checking links
|
||||||
|
|
||||||
def check_list_links(itemlist, numero='', timeout=3):
|
def check_list_links(itemlist, numero='', timeout=3):
|
||||||
"""
|
"""
|
||||||
Check a list of video links and return it by modifying the title with verification.
|
Check a list of video links and return it by modifying the title with verification.
|
||||||
|
|||||||
@@ -39,13 +39,8 @@ def hdpass_get_servers(item):
|
|||||||
for mir_url, srv in scrapertools.find_multiple_matches(mir, patron_option):
|
for mir_url, srv in scrapertools.find_multiple_matches(mir, patron_option):
|
||||||
mir_url = scrapertools.decodeHtmlentities(mir_url)
|
mir_url = scrapertools.decodeHtmlentities(mir_url)
|
||||||
log(mir_url)
|
log(mir_url)
|
||||||
it = Item(channel=item.channel,
|
it = item.clone(action="play",
|
||||||
action="play",
|
|
||||||
fulltitle=item.fulltitle,
|
|
||||||
quality=quality,
|
quality=quality,
|
||||||
show=item.show,
|
|
||||||
thumbnail=item.thumbnail,
|
|
||||||
contentType=item.contentType,
|
|
||||||
title=srv,
|
title=srv,
|
||||||
server=srv,
|
server=srv,
|
||||||
url= mir_url)
|
url= mir_url)
|
||||||
@@ -114,7 +109,7 @@ def search(channel, item, texto):
|
|||||||
|
|
||||||
def dbg():
|
def dbg():
|
||||||
if config.dev_mode():
|
if config.dev_mode():
|
||||||
import web_pdb;
|
import web_pdb
|
||||||
if not web_pdb.WebPdb.active_instance:
|
if not web_pdb.WebPdb.active_instance:
|
||||||
import webbrowser
|
import webbrowser
|
||||||
webbrowser.open('http://127.0.0.1:5555')
|
webbrowser.open('http://127.0.0.1:5555')
|
||||||
@@ -128,7 +123,8 @@ def regexDbg(item, patron, headers, data=''):
|
|||||||
|
|
||||||
if not data:
|
if not data:
|
||||||
html = httptools.downloadpage(item.url, headers=headers, ignore_response_code=True).data.replace("'", '"')
|
html = httptools.downloadpage(item.url, headers=headers, ignore_response_code=True).data.replace("'", '"')
|
||||||
html = re.sub('\n|\t', ' ', html)
|
html = html.replace('\n', ' ')
|
||||||
|
html = html.replace('\t', ' ')
|
||||||
else:
|
else:
|
||||||
html = data
|
html = data
|
||||||
headers = {'content-type': 'application/json'}
|
headers = {'content-type': 'application/json'}
|
||||||
@@ -168,6 +164,14 @@ def cleantitle(title):
|
|||||||
cleantitle = title.replace('"', "'").replace('×', 'x').replace('–', '-').strip()
|
cleantitle = title.replace('"', "'").replace('×', 'x').replace('–', '-').strip()
|
||||||
return cleantitle
|
return cleantitle
|
||||||
|
|
||||||
|
def unifyEp(ep):
|
||||||
|
# ep = re.sub(r'\s-\s|-|–|×|×', 'x', scraped['episode'])
|
||||||
|
ep = ep.replace('-', 'x')
|
||||||
|
ep = ep.replace('–', 'x')
|
||||||
|
ep = ep.replace('×', 'x')
|
||||||
|
ep = ep.replace('×', 'x')
|
||||||
|
return ep
|
||||||
|
|
||||||
def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, typeContentDict, typeActionDict, blacklist, search, pag, function, lang, sceneTitle):
|
def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, typeContentDict, typeActionDict, blacklist, search, pag, function, lang, sceneTitle):
|
||||||
itemlist = []
|
itemlist = []
|
||||||
log("scrapeBlock qui")
|
log("scrapeBlock qui")
|
||||||
@@ -216,10 +220,10 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t
|
|||||||
|
|
||||||
if scraped['season']:
|
if scraped['season']:
|
||||||
stagione = scraped['season']
|
stagione = scraped['season']
|
||||||
ep = re.sub(r'\s-\s|-|x|–|×|×', 'x', scraped['episode'])
|
ep = unifyEp(scraped['episode'])
|
||||||
if 'x' in ep:
|
if 'x' in ep:
|
||||||
episode = ep.split('x')[0]
|
episode = ep.split('x')[0].strip()
|
||||||
second_episode = ep.split('x')[1]
|
second_episode = ep.split('x')[1].strip()
|
||||||
else:
|
else:
|
||||||
episode = ep
|
episode = ep
|
||||||
second_episode = ''
|
second_episode = ''
|
||||||
@@ -234,7 +238,7 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t
|
|||||||
item.news = 'season_completed'
|
item.news = 'season_completed'
|
||||||
episode = ''
|
episode = ''
|
||||||
else:
|
else:
|
||||||
episode = re.sub(r'\s-\s|-|x|–|×|×', 'x', scraped['episode']) if scraped['episode'] else ''
|
episode = unifyEp(scraped['episode']) if scraped['episode'] else ''
|
||||||
if 'x' in episode:
|
if 'x' in episode:
|
||||||
ep = episode.split('x')
|
ep = episode.split('x')
|
||||||
episode = str(int(ep[0])).zfill(1) + 'x' + str(int(ep[1])).zfill(2)
|
episode = str(int(ep[0])).zfill(1) + 'x' + str(int(ep[1])).zfill(2)
|
||||||
@@ -292,7 +296,10 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t
|
|||||||
if parsedTitle.get('screen_size'):
|
if parsedTitle.get('screen_size'):
|
||||||
quality += ' ' + str(parsedTitle.get('screen_size', ''))
|
quality += ' ' + str(parsedTitle.get('screen_size', ''))
|
||||||
if not scraped['year']:
|
if not scraped['year']:
|
||||||
infolabels['year'] = parsedTitle.get('year', '')
|
if type(parsedTitle.get('year', '')) == list:
|
||||||
|
infolabels['year'] =parsedTitle.get('year', '')[0]
|
||||||
|
else:
|
||||||
|
infolabels['year'] = parsedTitle.get('year', '')
|
||||||
if parsedTitle.get('episode') and parsedTitle.get('season'):
|
if parsedTitle.get('episode') and parsedTitle.get('season'):
|
||||||
longtitle = title + s
|
longtitle = title + s
|
||||||
|
|
||||||
@@ -434,7 +441,8 @@ def scrape(func):
|
|||||||
if not data:
|
if not data:
|
||||||
page = httptools.downloadpage(item.url, headers=headers, ignore_response_code=True)
|
page = httptools.downloadpage(item.url, headers=headers, ignore_response_code=True)
|
||||||
data = page.data.replace("'", '"')
|
data = page.data.replace("'", '"')
|
||||||
data = re.sub('\n|\t', ' ', data)
|
data = data.replace('\n', ' ')
|
||||||
|
data = data.replace('\t', ' ')
|
||||||
data = re.sub(r'>\s+<', '> <', data)
|
data = re.sub(r'>\s+<', '> <', data)
|
||||||
# replace all ' with " and eliminate newline, so we don't need to worry about
|
# replace all ' with " and eliminate newline, so we don't need to worry about
|
||||||
scrapingTime = time()
|
scrapingTime = time()
|
||||||
@@ -479,8 +487,8 @@ def scrape(func):
|
|||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
|
|
||||||
if (pagination and len(matches) <= pag * pagination) or not pagination: # next page with pagination
|
if (pagination and len(matches) <= pag * pagination) or not pagination: # next page with pagination
|
||||||
if patronNext and inspect.stack()[1][3] != 'newest':
|
if patronNext and inspect.stack()[1][3] not in ['newest', 'search']:
|
||||||
nextPage(itemlist, item, data, patronNext, function)
|
nextPage(itemlist, item, data, patronNext, function)
|
||||||
|
|
||||||
# next page for pagination
|
# next page for pagination
|
||||||
@@ -543,12 +551,13 @@ def dooplay_get_links(item, host):
|
|||||||
for type, post, nume, title, server in matches:
|
for type, post, nume, title, server in matches:
|
||||||
postData = urlencode({
|
postData = urlencode({
|
||||||
"action": "doo_player_ajax",
|
"action": "doo_player_ajax",
|
||||||
"post": post,
|
"post": post,
|
||||||
"nume": nume,
|
"nume": nume,
|
||||||
"type": type
|
"type": type
|
||||||
})
|
})
|
||||||
dataAdmin = httptools.downloadpage(host + '/wp-admin/admin-ajax.php', post=postData,headers={'Referer': item.url}).data
|
dataAdmin = httptools.downloadpage(host + '/wp-admin/admin-ajax.php', post=postData,headers={'Referer': item.url}).data
|
||||||
link = scrapertools.find_single_match(dataAdmin, "<iframe.*src='([^']+)'")
|
link = scrapertools.find_single_match(dataAdmin, r"<iframe.*src='([^']+)'")
|
||||||
|
if not link: link = scrapertools.find_single_match(dataAdmin, r'"embed_url":"([^"]+)"').replace('\\','')
|
||||||
ret.append({
|
ret.append({
|
||||||
'url': link,
|
'url': link,
|
||||||
'title': title,
|
'title': title,
|
||||||
@@ -785,8 +794,8 @@ def menu(func):
|
|||||||
menuItem(itemlist, filename, config.get_localized_string(70741) % '… {bold}', 'search', host + dictUrl['search'], style=not global_search)
|
menuItem(itemlist, filename, config.get_localized_string(70741) % '… {bold}', 'search', host + dictUrl['search'], style=not global_search)
|
||||||
|
|
||||||
if not global_search:
|
if not global_search:
|
||||||
autoplay.init(item.channel, list_servers, list_quality)
|
# autoplay.init(item.channel, list_servers, list_quality)
|
||||||
autoplay.show_option(item.channel, itemlist)
|
# autoplay.show_option(item.channel, itemlist)
|
||||||
channel_config(item, itemlist)
|
channel_config(item, itemlist)
|
||||||
|
|
||||||
# Apply auto Thumbnails at the menus
|
# Apply auto Thumbnails at the menus
|
||||||
@@ -915,8 +924,9 @@ def match(item_url_string, **args):
|
|||||||
data = httptools.downloadpage(url, **args).data.replace("'", '"')
|
data = httptools.downloadpage(url, **args).data.replace("'", '"')
|
||||||
|
|
||||||
# format page data
|
# format page data
|
||||||
data = re.sub(r'\n|\t', ' ', data)
|
data = data.replace('\n', ' ')
|
||||||
data = re.sub(r'>\s\s*<', '><', data)
|
data = data.replace('\t', ' ')
|
||||||
|
data = re.sub(r'>\s+<', '><', data)
|
||||||
|
|
||||||
# collect blocks of a page
|
# collect blocks of a page
|
||||||
if patronBlock:
|
if patronBlock:
|
||||||
@@ -1094,6 +1104,7 @@ def videolibrary(itemlist, item, typography='', function_level=1, function=''):
|
|||||||
def nextPage(itemlist, item, data='', patron='', function_or_level=1, next_page='', resub=[]):
|
def nextPage(itemlist, item, data='', patron='', function_or_level=1, next_page='', resub=[]):
|
||||||
# Function_level is useful if the function is called by another function.
|
# Function_level is useful if the function is called by another function.
|
||||||
# If the call is direct, leave it blank
|
# If the call is direct, leave it blank
|
||||||
|
log()
|
||||||
action = inspect.stack()[function_or_level][3] if type(function_or_level) == int else function_or_level
|
action = inspect.stack()[function_or_level][3] if type(function_or_level) == int else function_or_level
|
||||||
if next_page == '':
|
if next_page == '':
|
||||||
next_page = scrapertools.find_single_match(data, patron)
|
next_page = scrapertools.find_single_match(data, patron)
|
||||||
@@ -1102,7 +1113,7 @@ def nextPage(itemlist, item, data='', patron='', function_or_level=1, next_page=
|
|||||||
if resub: next_page = re.sub(resub[0], resub[1], next_page)
|
if resub: next_page = re.sub(resub[0], resub[1], next_page)
|
||||||
if 'http' not in next_page:
|
if 'http' not in next_page:
|
||||||
next_page = scrapertools.find_single_match(item.url, 'https?://[a-z0-9.-]+') + (next_page if next_page.startswith('/') else '/' + next_page)
|
next_page = scrapertools.find_single_match(item.url, 'https?://[a-z0-9.-]+') + (next_page if next_page.startswith('/') else '/' + next_page)
|
||||||
next_page = re.sub('&', '&',next_page)
|
next_page = next_page.replace('&', '&')
|
||||||
log('NEXT= ', next_page)
|
log('NEXT= ', next_page)
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel,
|
Item(channel=item.channel,
|
||||||
@@ -1166,6 +1177,8 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
|
|||||||
videoitem.contentType = item.contentType
|
videoitem.contentType = item.contentType
|
||||||
videoitem.infoLabels = item.infoLabels
|
videoitem.infoLabels = item.infoLabels
|
||||||
videoitem.quality = quality
|
videoitem.quality = quality
|
||||||
|
# videoitem.nfo = item.nfo
|
||||||
|
# videoitem.strm_path = item.strm_path
|
||||||
return videoitem
|
return videoitem
|
||||||
|
|
||||||
with futures.ThreadPoolExecutor() as executor:
|
with futures.ThreadPoolExecutor() as executor:
|
||||||
@@ -1180,11 +1193,8 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
|
|||||||
if patronTag:
|
if patronTag:
|
||||||
addQualityTag(item, verifiedItemlist, data, patronTag)
|
addQualityTag(item, verifiedItemlist, data, patronTag)
|
||||||
|
|
||||||
# Auto Play & Hide Links
|
|
||||||
AP, HS = autoplay.get_channel_AP_HS(item)
|
|
||||||
|
|
||||||
# Check Links
|
# Check Links
|
||||||
if not AP and not item.global_search and (config.get_setting('checklinks') or config.get_setting('checklinks', item.channel)):
|
if not item.global_search and (config.get_setting('checklinks') or config.get_setting('checklinks', item.channel)):
|
||||||
if config.get_setting('checklinks', item.channel):
|
if config.get_setting('checklinks', item.channel):
|
||||||
checklinks_number = config.get_setting('checklinks_number', item.channel)
|
checklinks_number = config.get_setting('checklinks_number', item.channel)
|
||||||
elif config.get_setting('checklinks'):
|
elif config.get_setting('checklinks'):
|
||||||
@@ -1198,11 +1208,8 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
|
|||||||
videolibrary(verifiedItemlist, item)
|
videolibrary(verifiedItemlist, item)
|
||||||
if Download:
|
if Download:
|
||||||
download(verifiedItemlist, item, function_level=3)
|
download(verifiedItemlist, item, function_level=3)
|
||||||
|
# if item.contentChannel == 'videolibrary' or not config.get_setting('autoplay'):
|
||||||
if not AP or not HS:
|
return verifiedItemlist
|
||||||
# for it in verifiedItemlist:
|
|
||||||
# log(it)
|
|
||||||
return verifiedItemlist
|
|
||||||
|
|
||||||
|
|
||||||
def filterLang(item, itemlist):
|
def filterLang(item, itemlist):
|
||||||
@@ -1213,12 +1220,12 @@ def filterLang(item, itemlist):
|
|||||||
itemlist = filtertools.get_links(itemlist, item, list_language)
|
itemlist = filtertools.get_links(itemlist, item, list_language)
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
def aplay(item, itemlist, list_servers='', list_quality=''):
|
# def aplay(item, itemlist, list_servers='', list_quality=''):
|
||||||
if inspect.stack()[1][3] == 'mainlist':
|
# if inspect.stack()[1][3] == 'mainlist':
|
||||||
autoplay.init(item.channel, list_servers, list_quality)
|
# autoplay.init(item.channel, list_servers, list_quality)
|
||||||
autoplay.show_option(item.channel, itemlist)
|
# autoplay.show_option(item.channel, itemlist)
|
||||||
else:
|
# else:
|
||||||
autoplay.start(itemlist, item)
|
# autoplay.start(itemlist, item)
|
||||||
|
|
||||||
|
|
||||||
def log(*args):
|
def log(*args):
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ def save_movie(item, silent=False):
|
|||||||
|
|
||||||
for raiz, subcarpetas, ficheros in filetools.walk(MOVIES_PATH):
|
for raiz, subcarpetas, ficheros in filetools.walk(MOVIES_PATH):
|
||||||
for c in subcarpetas:
|
for c in subcarpetas:
|
||||||
code = scrapertools.find_single_match(c, '\[(.*?)\]')
|
code = scrapertools.find_single_match(c, r'\[(.*?)\]')
|
||||||
if code and code in item.infoLabels['code']:
|
if code and code in item.infoLabels['code']:
|
||||||
path = filetools.join(raiz, c)
|
path = filetools.join(raiz, c)
|
||||||
_id = code
|
_id = code
|
||||||
@@ -192,7 +192,7 @@ def save_movie(item, silent=False):
|
|||||||
headers = {}
|
headers = {}
|
||||||
if item.headers:
|
if item.headers:
|
||||||
headers = item.headers
|
headers = item.headers
|
||||||
channel = generictools.verify_channel(item.channel)
|
channel = item.channel
|
||||||
if config.get_setting("emergency_urls", channel) in [1, 3]:
|
if config.get_setting("emergency_urls", channel) in [1, 3]:
|
||||||
item = emergency_urls(item, None, json_path, headers=headers)
|
item = emergency_urls(item, None, json_path, headers=headers)
|
||||||
if item_nfo.emergency_urls and not isinstance(item_nfo.emergency_urls, dict):
|
if item_nfo.emergency_urls and not isinstance(item_nfo.emergency_urls, dict):
|
||||||
@@ -364,7 +364,7 @@ def filter_list(episodelist, action=None, path=None):
|
|||||||
stop = False
|
stop = False
|
||||||
while not stop:
|
while not stop:
|
||||||
for episode in episodelist:
|
for episode in episodelist:
|
||||||
title = scrapertools.find_single_match(episode.title, '(\d+x\d+)')
|
title = scrapertools.find_single_match(episode.title, r'(\d+x\d+)')
|
||||||
if not any(title in word for word in ep_list) and episode.contentLanguage == langs[count]:
|
if not any(title in word for word in ep_list) and episode.contentLanguage == langs[count]:
|
||||||
ep_list.append(episode.title)
|
ep_list.append(episode.title)
|
||||||
if count < len(langs)-1: count += 1
|
if count < len(langs)-1: count += 1
|
||||||
@@ -386,14 +386,14 @@ def filter_list(episodelist, action=None, path=None):
|
|||||||
stop = False
|
stop = False
|
||||||
while not stop:
|
while not stop:
|
||||||
for episode in episodelist:
|
for episode in episodelist:
|
||||||
title = scrapertools.find_single_match(episode.title, '(\d+x\d+)')
|
title = scrapertools.find_single_match(episode.title, r'(\d+x\d+)')
|
||||||
if not any(title in word for word in ep_list) and episode.quality.lower() in quality_dict[quality_list[selection]]:
|
if not any(title in word for word in ep_list) and episode.quality.lower() in quality_dict[quality_list[selection]]:
|
||||||
ep_list.append(episode.title)
|
ep_list.append(episode.title)
|
||||||
if selection != 0: selection = selection - 1
|
if selection != 0: selection = selection - 1
|
||||||
else: stop = True
|
else: stop = True
|
||||||
if quality_list[selection] == 'N/A':
|
if quality_list[selection] == 'N/A':
|
||||||
for episode in episodelist:
|
for episode in episodelist:
|
||||||
title = scrapertools.find_single_match(episode.title, '(\d+x\d+)')
|
title = scrapertools.find_single_match(episode.title, r'(\d+x\d+)')
|
||||||
if not any(title in word for word in ep_list):
|
if not any(title in word for word in ep_list):
|
||||||
ep_list.append(episode.title)
|
ep_list.append(episode.title)
|
||||||
|
|
||||||
@@ -473,7 +473,7 @@ def save_tvshow(item, episodelist, silent=False):
|
|||||||
|
|
||||||
for raiz, subcarpetas, ficheros in filetools.walk(TVSHOWS_PATH):
|
for raiz, subcarpetas, ficheros in filetools.walk(TVSHOWS_PATH):
|
||||||
for c in subcarpetas:
|
for c in subcarpetas:
|
||||||
code = scrapertools.find_single_match(c, '\[(.*?)\]')
|
code = scrapertools.find_single_match(c, r'\[(.*?)\]')
|
||||||
if code and code != 'None' and code in item.infoLabels['code']:
|
if code and code != 'None' and code in item.infoLabels['code']:
|
||||||
path = filetools.join(raiz, c)
|
path = filetools.join(raiz, c)
|
||||||
_id = code
|
_id = code
|
||||||
@@ -602,12 +602,12 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True):
|
|||||||
p_dialog = platformtools.dialog_progress(config.get_localized_string(20000), config.get_localized_string(60064))
|
p_dialog = platformtools.dialog_progress(config.get_localized_string(20000), config.get_localized_string(60064))
|
||||||
p_dialog.update(0, config.get_localized_string(60065))
|
p_dialog.update(0, config.get_localized_string(60065))
|
||||||
|
|
||||||
channel_alt = generictools.verify_channel(serie.channel) # We prepare to add the emergency urls
|
channel_alt = serie.channels # We prepare to add the emergency urls
|
||||||
emergency_urls_stat = config.get_setting("emergency_urls", channel_alt) # Does the channel want emergency urls?
|
emergency_urls_stat = config.get_setting("emergency_urls", channel_alt) # Does the channel want emergency urls?
|
||||||
emergency_urls_succ = False
|
emergency_urls_succ = False
|
||||||
try: channel = __import__('specials.%s' % channel_alt, fromlist=["specials.%s" % channel_alt])
|
try: channel = __import__('specials.%s' % channel_alt, fromlist=["specials.%s" % channel_alt])
|
||||||
except: channel = __import__('channels.%s' % channel_alt, fromlist=["channels.%s" % channel_alt])
|
except: channel = __import__('channels.%s' % channel_alt, fromlist=["channels.%s" % channel_alt])
|
||||||
if serie.torrent_caching_fail: # If the conversion process has failed, they are not cached
|
if serie.torrent_caching_fail: # If the conversion process has failed, they are not cached
|
||||||
emergency_urls_stat = 0
|
emergency_urls_stat = 0
|
||||||
del serie.torrent_caching_fail
|
del serie.torrent_caching_fail
|
||||||
|
|
||||||
@@ -679,8 +679,8 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True):
|
|||||||
|
|
||||||
high_sea = e.contentSeason
|
high_sea = e.contentSeason
|
||||||
high_epi = e.contentEpisodeNumber
|
high_epi = e.contentEpisodeNumber
|
||||||
if scrapertools.find_single_match(e.title, '[a|A][l|L]\s*(\d+)'):
|
if scrapertools.find_single_match(e.title, r'[a|A][l|L]\s*(\d+)'):
|
||||||
high_epi = int(scrapertools.find_single_match(e.title, 'al\s*(\d+)'))
|
high_epi = int(scrapertools.find_single_match(e.title, r'al\s*(\d+)'))
|
||||||
max_sea = e.infoLabels["number_of_seasons"]
|
max_sea = e.infoLabels["number_of_seasons"]
|
||||||
max_epi = 0
|
max_epi = 0
|
||||||
if e.infoLabels["number_of_seasons"] and (e.infoLabels["temporada_num_episodios"] or e.infoLabels["number_of_seasons"] == 1):
|
if e.infoLabels["number_of_seasons"] and (e.infoLabels["temporada_num_episodios"] or e.infoLabels["number_of_seasons"] == 1):
|
||||||
@@ -981,8 +981,8 @@ def add_tvshow(item, channel=None):
|
|||||||
|
|
||||||
if not channel:
|
if not channel:
|
||||||
try:
|
try:
|
||||||
# channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel])
|
channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel])
|
||||||
channel = __import__('specials.%s' % channel_alt, fromlist=["specials.%s" % channel_alt])
|
# channel = __import__('specials.%s' % item.channel, fromlist=["specials.%s" % item.channel])
|
||||||
except ImportError:
|
except ImportError:
|
||||||
exec("import channels." + item.channel + " as channel")
|
exec("import channels." + item.channel + " as channel")
|
||||||
|
|
||||||
@@ -998,9 +998,8 @@ def add_tvshow(item, channel=None):
|
|||||||
# del item.tmdb_stat # We clean the status so that it is not recorded in the Video Library
|
# del item.tmdb_stat # We clean the status so that it is not recorded in the Video Library
|
||||||
|
|
||||||
# Get the episode list
|
# Get the episode list
|
||||||
|
|
||||||
itemlist = getattr(channel, item.action)(item)
|
itemlist = getattr(channel, item.action)(item)
|
||||||
if itemlist and not scrapertools.find_single_match(itemlist[0].title, r'(\d+.\d+)'):
|
if itemlist and not scrapertools.find_single_match(itemlist[0].title, r'(\d+x\d+)'):
|
||||||
from specials.autorenumber import select_type, renumber, check
|
from specials.autorenumber import select_type, renumber, check
|
||||||
if not check(item):
|
if not check(item):
|
||||||
action = item.action
|
action = item.action
|
||||||
@@ -1066,7 +1065,7 @@ def emergency_urls(item, channel=None, path=None, headers={}):
|
|||||||
# we launched a "lookup" in the "findvideos" of the channel to obtain the emergency links
|
# we launched a "lookup" in the "findvideos" of the channel to obtain the emergency links
|
||||||
try:
|
try:
|
||||||
if channel == None: # If the caller has not provided the channel structure, it is created
|
if channel == None: # If the caller has not provided the channel structure, it is created
|
||||||
channel = generictools.verify_channel(item.channel) # It is verified if it is a clone, which returns "newpct1"
|
channel = item.channel # It is verified if it is a clone, which returns "newpct1"
|
||||||
#channel = __import__('channels.%s' % channel, fromlist=["channels.%s" % channel])
|
#channel = __import__('channels.%s' % channel, fromlist=["channels.%s" % channel])
|
||||||
channel = __import__('specials.%s' % channel_alt, fromlist=["specials.%s" % channel_alt])
|
channel = __import__('specials.%s' % channel_alt, fromlist=["specials.%s" % channel_alt])
|
||||||
if hasattr(channel, 'findvideos'): # If the channel has "findvideos" ...
|
if hasattr(channel, 'findvideos'): # If the channel has "findvideos" ...
|
||||||
@@ -1099,7 +1098,7 @@ def emergency_urls(item, channel=None, path=None, headers={}):
|
|||||||
try:
|
try:
|
||||||
referer = None
|
referer = None
|
||||||
post = None
|
post = None
|
||||||
channel_bis = generictools.verify_channel(item.channel)
|
channel_bis =item.channel
|
||||||
if config.get_setting("emergency_urls_torrents", channel_bis) and item_res.emergency_urls and path != None:
|
if config.get_setting("emergency_urls_torrents", channel_bis) and item_res.emergency_urls and path != None:
|
||||||
videolibrary_path = config.get_videolibrary_path() # we detect the absolute path of the title
|
videolibrary_path = config.get_videolibrary_path() # we detect the absolute path of the title
|
||||||
movies = config.get_setting("folder_movies")
|
movies = config.get_setting("folder_movies")
|
||||||
|
|||||||
@@ -577,6 +577,11 @@ class UnshortenIt(object):
|
|||||||
if not r:
|
if not r:
|
||||||
r = httptools.downloadpage(uri, follow_redirect=True, timeout=self._timeout, cookies=False)
|
r = httptools.downloadpage(uri, follow_redirect=True, timeout=self._timeout, cookies=False)
|
||||||
uri = r.url
|
uri = r.url
|
||||||
|
if "4snip" in uri:
|
||||||
|
if 'out_generator' in uri:
|
||||||
|
uri = re.findall('url=(.*)$', uri)[0]
|
||||||
|
elif '/decode/' in uri:
|
||||||
|
uri = httptools.downloadpage(uri, follow_redirects=True).url
|
||||||
return uri, r.code
|
return uri, r.code
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
@@ -462,3 +462,7 @@ def verify_directories_created():
|
|||||||
import traceback
|
import traceback
|
||||||
logger.error("When checking or creating the resolution folder")
|
logger.error("When checking or creating the resolution folder")
|
||||||
logger.error(traceback.format_exc())
|
logger.error(traceback.format_exc())
|
||||||
|
|
||||||
|
|
||||||
|
def get_online_server_thumb(server):
|
||||||
|
return "https://raw.github.com/kodiondemand/media/master/resources/servers/" + server.lower() + '.png'
|
||||||
@@ -3,19 +3,9 @@
|
|||||||
# XBMC Launcher (xbmc / kodi)
|
# XBMC Launcher (xbmc / kodi)
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
#from future import standard_library
|
import sys, os
|
||||||
#standard_library.install_aliases()
|
|
||||||
#from builtins import str
|
|
||||||
import sys
|
|
||||||
PY3 = False
|
PY3 = False
|
||||||
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
|
if sys.version_info[0] >= 3:PY3 = True; unicode = str; unichr = chr; long = int
|
||||||
|
|
||||||
# if PY3:
|
|
||||||
# import urllib.error as urllib2 # It is very slow in PY2. In PY3 it is native
|
|
||||||
# else:
|
|
||||||
# import urllib2 # We use the native of PY2 which is faster
|
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import config, logger, platformtools
|
from platformcode import config, logger, platformtools
|
||||||
@@ -65,11 +55,7 @@ def run(item=None):
|
|||||||
config.get_localized_string(70137): 'peliculas',
|
config.get_localized_string(70137): 'peliculas',
|
||||||
config.get_localized_string(30123): 'series',
|
config.get_localized_string(30123): 'series',
|
||||||
config.get_localized_string(30124): 'anime',
|
config.get_localized_string(30124): 'anime',
|
||||||
config.get_localized_string(70018): 'infantiles',
|
|
||||||
config.get_localized_string(60513): 'documentales',
|
config.get_localized_string(60513): 'documentales',
|
||||||
config.get_localized_string(70013): 'terror',
|
|
||||||
config.get_localized_string(70014): 'castellano',
|
|
||||||
config.get_localized_string(59976): 'latino',
|
|
||||||
config.get_localized_string(70171): 'torrent',
|
config.get_localized_string(70171): 'torrent',
|
||||||
}
|
}
|
||||||
if not config.get_setting("category") in dictCategory.keys():
|
if not config.get_setting("category") in dictCategory.keys():
|
||||||
@@ -142,7 +128,6 @@ def run(item=None):
|
|||||||
if tmdb.drop_bd():
|
if tmdb.drop_bd():
|
||||||
platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(60011), time=2000, sound=False)
|
platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(60011), time=2000, sound=False)
|
||||||
elif item.action == "itemInfo":
|
elif item.action == "itemInfo":
|
||||||
import base64
|
|
||||||
platformtools.dialog_textviewer('Item info', item.parent)
|
platformtools.dialog_textviewer('Item info', item.parent)
|
||||||
elif item.action == "open_browser":
|
elif item.action == "open_browser":
|
||||||
import webbrowser
|
import webbrowser
|
||||||
@@ -155,18 +140,10 @@ def run(item=None):
|
|||||||
import urllib.request as urllib
|
import urllib.request as urllib
|
||||||
except ImportError:
|
except ImportError:
|
||||||
import urllib
|
import urllib
|
||||||
short = urllib.urlopen(
|
short = urllib.urlopen('https://u.nu/api.php?action=shorturl&format=simple&url=' + item.url).read().decode('utf-8')
|
||||||
'https://u.nu/api.php?action=shorturl&format=simple&url=' + item.url).read().decode('utf-8')
|
platformtools.dialog_ok(config.get_localized_string(20000), config.get_localized_string(70740) % short)
|
||||||
platformtools.dialog_ok(config.get_localized_string(20000),
|
|
||||||
config.get_localized_string(70740) % short)
|
|
||||||
# Action in certain channel specified in "action" and "channel" parameters
|
# Action in certain channel specified in "action" and "channel" parameters
|
||||||
else:
|
else:
|
||||||
# # Actualiza el canal individual
|
|
||||||
# if (item.action == "mainlist" and item.channel != "channelselector" and
|
|
||||||
# config.get_setting("check_for_channel_updates") == True):
|
|
||||||
# from core import updater
|
|
||||||
# updater.update_channel(item.channel)
|
|
||||||
|
|
||||||
# Checks if channel exists
|
# Checks if channel exists
|
||||||
if os.path.isfile(os.path.join(config.get_runtime_path(), 'channels', item.channel + ".py")):
|
if os.path.isfile(os.path.join(config.get_runtime_path(), 'channels', item.channel + ".py")):
|
||||||
CHANNELS = 'channels'
|
CHANNELS = 'channels'
|
||||||
@@ -181,8 +158,7 @@ def run(item=None):
|
|||||||
|
|
||||||
if os.path.exists(channel_file):
|
if os.path.exists(channel_file):
|
||||||
try:
|
try:
|
||||||
channel = __import__('%s.%s' % (CHANNELS, item.channel), None,
|
channel = __import__('%s.%s' % (CHANNELS, item.channel), None, None, ['%s.%s' % (CHANNELS, item.channel)])
|
||||||
None, ['%s.%s' % (CHANNELS, item.channel)])
|
|
||||||
except ImportError:
|
except ImportError:
|
||||||
exec("import " + CHANNELS + "." + item.channel + " as channel")
|
exec("import " + CHANNELS + "." + item.channel + " as channel")
|
||||||
|
|
||||||
@@ -211,7 +187,7 @@ def run(item=None):
|
|||||||
item.isFavourite = True
|
item.isFavourite = True
|
||||||
platformtools.play_video(item)
|
platformtools.play_video(item)
|
||||||
|
|
||||||
# Permitir varias calidades desde play en el canal
|
# Permitir varias calidades desde play en el Channel
|
||||||
elif len(itemlist) > 0 and isinstance(itemlist[0], list):
|
elif len(itemlist) > 0 and isinstance(itemlist[0], list):
|
||||||
item.video_urls = itemlist
|
item.video_urls = itemlist
|
||||||
platformtools.play_video(item)
|
platformtools.play_video(item)
|
||||||
@@ -232,7 +208,6 @@ def run(item=None):
|
|||||||
# First checks if channel has a "findvideos" function
|
# First checks if channel has a "findvideos" function
|
||||||
if hasattr(channel, 'findvideos'):
|
if hasattr(channel, 'findvideos'):
|
||||||
itemlist = getattr(channel, item.action)(item)
|
itemlist = getattr(channel, item.action)(item)
|
||||||
itemlist = servertools.filter_servers(itemlist)
|
|
||||||
|
|
||||||
# If not, uses the generic findvideos function
|
# If not, uses the generic findvideos function
|
||||||
else:
|
else:
|
||||||
@@ -310,32 +285,18 @@ def run(item=None):
|
|||||||
|
|
||||||
platformtools.render_items(itemlist, item)
|
platformtools.render_items(itemlist, item)
|
||||||
|
|
||||||
# except urllib2.URLError as e:
|
|
||||||
# import traceback
|
|
||||||
# logger.error(traceback.format_exc())
|
|
||||||
#
|
|
||||||
# # Grab inner and third party errors
|
|
||||||
# if hasattr(e, 'reason'):
|
|
||||||
# logger.error("Reason for the error, code: %s | Reason: %s" % (str(e.reason[0]), str(e.reason[1])))
|
|
||||||
# texto = config.get_localized_string(30050) # "No se puede conectar con el sitio web"
|
|
||||||
# platformtools.dialog_ok(config.get_localized_string(20000), texto)
|
|
||||||
#
|
|
||||||
# # Grab server response errors
|
|
||||||
# elif hasattr(e, 'code'):
|
|
||||||
# logger.error("HTTP error code: %d" % e.code)
|
|
||||||
# # "El sitio web no funciona correctamente (error http %d)"
|
|
||||||
# platformtools.dialog_ok(config.get_localized_string(20000), config.get_localized_string(30051) % e.code)
|
|
||||||
except WebErrorException as e:
|
except WebErrorException as e:
|
||||||
import traceback
|
import traceback
|
||||||
from core import scrapertools
|
from core import scrapertools
|
||||||
|
|
||||||
logger.error(traceback.format_exc())
|
logger.error(traceback.format_exc())
|
||||||
|
|
||||||
patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + '([^.]+)\.py"'
|
patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + r'([^.]+)\.py"'
|
||||||
canal = scrapertools.find_single_match(traceback.format_exc(), patron)
|
Channel = scrapertools.find_single_match(traceback.format_exc(), patron)
|
||||||
|
|
||||||
platformtools.dialog_ok(
|
platformtools.dialog_ok(
|
||||||
config.get_localized_string(59985) + canal,
|
config.get_localized_string(59985) + Channel,
|
||||||
config.get_localized_string(60013) %(e))
|
config.get_localized_string(60013) %(e))
|
||||||
except:
|
except:
|
||||||
import traceback
|
import traceback
|
||||||
@@ -343,8 +304,8 @@ def run(item=None):
|
|||||||
|
|
||||||
logger.error(traceback.format_exc())
|
logger.error(traceback.format_exc())
|
||||||
|
|
||||||
patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + '([^.]+)\.py"'
|
patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + r'([^.]+)\.py"'
|
||||||
canal = scrapertools.find_single_match(traceback.format_exc(), patron)
|
Channel = scrapertools.find_single_match(traceback.format_exc(), patron)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import xbmc
|
import xbmc
|
||||||
@@ -356,15 +317,12 @@ def run(item=None):
|
|||||||
except:
|
except:
|
||||||
log_message = ""
|
log_message = ""
|
||||||
|
|
||||||
if canal:
|
if Channel:
|
||||||
if item.url:
|
if item.url:
|
||||||
if platformtools.dialog_yesno(config.get_localized_string(60087) % canal, config.get_localized_string(60014),
|
if platformtools.dialog_yesno(config.get_localized_string(60087) % Channel, config.get_localized_string(60014), log_message, nolabel='ok', yeslabel=config.get_localized_string(70739)):
|
||||||
log_message, nolabel='ok', yeslabel=config.get_localized_string(70739)):
|
|
||||||
run(Item(action="open_browser", url=item.url))
|
run(Item(action="open_browser", url=item.url))
|
||||||
else:
|
else:
|
||||||
platformtools.dialog_ok(config.get_localized_string(60087) % canal,
|
platformtools.dialog_ok(config.get_localized_string(60087) % Channel, config.get_localized_string(60014), log_message)
|
||||||
config.get_localized_string(60014),
|
|
||||||
log_message)
|
|
||||||
else:
|
else:
|
||||||
platformtools.dialog_ok(
|
platformtools.dialog_ok(
|
||||||
config.get_localized_string(60038),
|
config.get_localized_string(60038),
|
||||||
@@ -384,8 +342,7 @@ def reorder_itemlist(itemlist):
|
|||||||
modified = 0
|
modified = 0
|
||||||
not_modified = 0
|
not_modified = 0
|
||||||
|
|
||||||
to_change = [[config.get_localized_string(60335), '[V]'],
|
to_change = [[config.get_localized_string(60335), '[V]'], [config.get_localized_string(60336), '[D]']]
|
||||||
[config.get_localized_string(60336), '[D]']]
|
|
||||||
|
|
||||||
for item in itemlist:
|
for item in itemlist:
|
||||||
if not PY3:
|
if not PY3:
|
||||||
@@ -441,7 +398,6 @@ def limit_itemlist(itemlist):
|
|||||||
|
|
||||||
|
|
||||||
def play_from_library(item):
|
def play_from_library(item):
|
||||||
itemlist=[]
|
|
||||||
"""
|
"""
|
||||||
The .strm files when played from kodi, this expects it to be a "playable" file so it cannot contain
|
The .strm files when played from kodi, this expects it to be a "playable" file so it cannot contain
|
||||||
more items, at most a selection dialog can be placed.
|
more items, at most a selection dialog can be placed.
|
||||||
@@ -452,115 +408,67 @@ def play_from_library(item):
|
|||||||
@type item: item
|
@type item: item
|
||||||
@param item: item with information
|
@param item: item with information
|
||||||
"""
|
"""
|
||||||
|
import xbmcgui, xbmcplugin, xbmc
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
itemlist=[]
|
||||||
item.fromLibrary = True
|
item.fromLibrary = True
|
||||||
logger.info()
|
logger.info()
|
||||||
# logger.debug("item: \n" + item.tostring('\n'))
|
# logger.debug("item: \n" + item.tostring('\n'))
|
||||||
|
|
||||||
import xbmcgui
|
# Try to reproduce an image (this does nothing and also does not give an error)
|
||||||
import xbmcplugin
|
|
||||||
import xbmc
|
|
||||||
from time import sleep, time
|
|
||||||
from specials import nextep
|
|
||||||
|
|
||||||
# We try to reproduce an image (this does nothing and also does not give an error)
|
|
||||||
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xbmcgui.ListItem(path=os.path.join(config.get_runtime_path(), "resources", "kod.mp4")))
|
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xbmcgui.ListItem(path=os.path.join(config.get_runtime_path(), "resources", "kod.mp4")))
|
||||||
|
|
||||||
# Just in case the image did (in future versions) we give stop to stop the reproduction
|
|
||||||
# sleep(0.5) ### If you don't put this on you crash Kodi
|
|
||||||
xbmc.Player().stop()
|
xbmc.Player().stop()
|
||||||
|
|
||||||
# we modify the action (currently the video library needs "findvideos" since this is where the sources are searched
|
# Modify the action (currently the video library needs "findvideos" since this is where the sources are searched
|
||||||
item.action = "findvideos"
|
item.action = "findvideos"
|
||||||
check_next_ep = nextep.check(item)
|
|
||||||
|
|
||||||
|
|
||||||
window_type = config.get_setting("window_type", "videolibrary")
|
window_type = config.get_setting("window_type", "videolibrary")
|
||||||
|
# and launch kodi again
|
||||||
# and we launch kodi again
|
|
||||||
if xbmc.getCondVisibility('Window.IsMedia') and not window_type == 1:
|
if xbmc.getCondVisibility('Window.IsMedia') and not window_type == 1:
|
||||||
# Conventional window
|
# Conventional window
|
||||||
xbmc.executebuiltin("Container.Update(" + sys.argv[0] + "?" + item.tourl() + ")")
|
xbmc.executebuiltin("Container.Update(" + sys.argv[0] + "?" + item.tourl() + ")")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
# Pop-up window
|
# Pop-up window
|
||||||
item.show_server = True
|
from specials import videolibrary
|
||||||
|
|
||||||
from specials import videolibrary, autoplay
|
|
||||||
p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), config.get_localized_string(60683))
|
p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), config.get_localized_string(60683))
|
||||||
p_dialog.update(0, '')
|
p_dialog.update(0, '')
|
||||||
|
item.play_from = 'window'
|
||||||
itemlist = videolibrary.findvideos(item)
|
itemlist = videolibrary.findvideos(item)
|
||||||
|
p_dialog.update(100, ''); sleep(0.5); p_dialog.close()
|
||||||
|
while platformtools.is_playing(): # Conventional window
|
||||||
|
sleep(1)
|
||||||
|
play_time = platformtools.resume_playback(item, True)
|
||||||
|
if not play_time and config.get_setting('autoplay'):
|
||||||
|
return
|
||||||
|
|
||||||
if check_next_ep and autoplay.is_active(item.contentChannel):
|
# The number of links to show is limited
|
||||||
p_dialog.update(100, '')
|
if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist)
|
||||||
sleep(0.5)
|
# The list of links is slightly "cleaned"
|
||||||
p_dialog.close()
|
if config.get_setting("replace_VD", "videolibrary") == 1: itemlist = reorder_itemlist(itemlist)
|
||||||
item = nextep.return_item(item)
|
|
||||||
if item.next_ep:
|
|
||||||
return play_from_library(item)
|
|
||||||
|
|
||||||
else:
|
if len(itemlist) > 0:
|
||||||
while platformtools.is_playing():
|
while not xbmc.Monitor().abortRequested():
|
||||||
# Conventional window
|
# The user chooses the mirror
|
||||||
sleep(5)
|
options = []
|
||||||
p_dialog.update(50, '')
|
selection_implementation = 0
|
||||||
|
for item in itemlist:
|
||||||
it = item
|
item.thumbnail = config.get_online_server_thumb(item.server)
|
||||||
if item.show_server or not check_next_ep:
|
quality = '[B][' + item.quality + '][/B]' if item.quality else ''
|
||||||
|
if item.server:
|
||||||
# The links are filtered according to the blacklist
|
it = xbmcgui.ListItem('\n[B]%s[/B] %s - %s' % (item.server, quality, item.contentTitle))
|
||||||
# if config.get_setting('filter_servers', "servers"):
|
it.setArt({'thumb':item.thumbnail})
|
||||||
# itemlist = servertools.filter_servers(itemlist)
|
options.append(it)
|
||||||
|
|
||||||
# The number of links to show is limited
|
|
||||||
if config.get_setting("max_links", "videolibrary") != 0:
|
|
||||||
itemlist = limit_itemlist(itemlist)
|
|
||||||
|
|
||||||
# The list of links is slightly "cleaned"
|
|
||||||
if config.get_setting("replace_VD", "videolibrary") == 1:
|
|
||||||
itemlist = reorder_itemlist(itemlist)
|
|
||||||
|
|
||||||
|
|
||||||
p_dialog.update(100, '')
|
|
||||||
sleep(0.5)
|
|
||||||
p_dialog.close()
|
|
||||||
|
|
||||||
|
|
||||||
if len(itemlist) > 0:
|
|
||||||
while not xbmc.Monitor().abortRequested():
|
|
||||||
# The user chooses the mirror
|
|
||||||
opciones = []
|
|
||||||
for item in itemlist:
|
|
||||||
opciones.append(item.title)
|
|
||||||
|
|
||||||
# The selection window opens
|
|
||||||
if (item.contentSerieName != "" and
|
|
||||||
item.contentSeason != "" and
|
|
||||||
item.contentEpisodeNumber != ""):
|
|
||||||
cabecera = ("%s - %sx%s -- %s" %
|
|
||||||
(item.contentSerieName,
|
|
||||||
item.contentSeason,
|
|
||||||
item.contentEpisodeNumber,
|
|
||||||
config.get_localized_string(30163)))
|
|
||||||
else:
|
else:
|
||||||
cabecera = config.get_localized_string(30163)
|
selection_implementation += 1
|
||||||
|
# The selection window opens
|
||||||
|
if (item.contentSerieName and item.contentSeason and item.contentEpisodeNumber): head = ("%s - %sx%s | %s" % (item.contentSerieName, item.contentSeason, item.contentEpisodeNumber, config.get_localized_string(30163)))
|
||||||
seleccion = platformtools.dialog_select(cabecera, opciones)
|
else: head = config.get_localized_string(30163)
|
||||||
|
selection = platformtools.dialog_select(head, options, preselect= -1, useDetails=True)
|
||||||
if seleccion == -1:
|
if selection == -1:
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
item = videolibrary.play(itemlist[seleccion])[0]
|
item = videolibrary.play(itemlist[selection + selection_implementation])[0]
|
||||||
item.play_from = 'window'
|
platformtools.play_video(item)
|
||||||
platformtools.play_video(item)
|
if (platformtools.is_playing() and item.action) or item.server == 'torrent' or config.get_setting('autoplay'): break
|
||||||
|
|
||||||
if (platformtools.is_playing() and item.action) or item.server == 'torrent' or autoplay.is_active(item.contentChannel):
|
|
||||||
break
|
|
||||||
|
|
||||||
if it.show_server and check_next_ep:
|
|
||||||
nextep.run(it)
|
|
||||||
sleep(0.5)
|
|
||||||
p_dialog.close()
|
|
||||||
|
|
||||||
@@ -6,24 +6,18 @@
|
|||||||
# version 2.0
|
# version 2.0
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
from __future__ import division
|
|
||||||
from __future__ import absolute_import
|
|
||||||
from past.utils import old_div
|
|
||||||
import sys
|
import sys
|
||||||
PY3 = False
|
if sys.version_info[0] >= 3:
|
||||||
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
|
|
||||||
|
|
||||||
if PY3:
|
|
||||||
import urllib.parse as urllib
|
import urllib.parse as urllib
|
||||||
else:
|
else:
|
||||||
import urllib
|
import urllib
|
||||||
|
|
||||||
import os, xbmc, xbmcgui, xbmcplugin
|
import os, xbmc, xbmcgui, xbmcplugin
|
||||||
|
from past.utils import old_div
|
||||||
from channelselector import get_thumb
|
from channelselector import get_thumb
|
||||||
from core import channeltools, trakt_tools, scrapertools
|
from core import trakt_tools, scrapertools
|
||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import logger, config, unify
|
from platformcode import logger, config
|
||||||
|
|
||||||
addon = config.__settings__
|
addon = config.__settings__
|
||||||
addon_icon = os.path.join( addon.getAddonInfo( "path" ), "logo.png" )
|
addon_icon = os.path.join( addon.getAddonInfo( "path" ), "logo.png" )
|
||||||
@@ -73,8 +67,8 @@ def dialog_yesno(heading, line1, line2="", line3="", nolabel="No", yeslabel="Si"
|
|||||||
return dialog.yesno(heading, makeMessage(line1, line2, line3), nolabel=nolabel, yeslabel=yeslabel)
|
return dialog.yesno(heading, makeMessage(line1, line2, line3), nolabel=nolabel, yeslabel=yeslabel)
|
||||||
|
|
||||||
|
|
||||||
def dialog_select(heading, _list, preselect=0):
|
def dialog_select(heading, _list, preselect=0, useDetails=False):
|
||||||
return xbmcgui.Dialog().select(heading, _list, preselect=preselect)
|
return xbmcgui.Dialog().select(heading, _list, preselect=preselect, useDetails=useDetails)
|
||||||
|
|
||||||
|
|
||||||
def dialog_multiselect(heading, _list, autoclose=0, preselect=[], useDetails=False):
|
def dialog_multiselect(heading, _list, autoclose=0, preselect=[], useDetails=False):
|
||||||
@@ -122,15 +116,15 @@ def dialog_browse(_type, heading, default=""):
|
|||||||
|
|
||||||
|
|
||||||
def itemlist_refresh():
|
def itemlist_refresh():
|
||||||
pos = Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition
|
# pos = Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition
|
||||||
logger.info('Current position: ' + str(pos))
|
# logger.info('Current position: ' + str(pos))
|
||||||
xbmc.executebuiltin("Container.Refresh")
|
xbmc.executebuiltin("Container.Refresh")
|
||||||
|
|
||||||
while Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition != pos:
|
# while Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition != pos:
|
||||||
win = xbmcgui.Window(xbmcgui.getCurrentWindowId())
|
# win = xbmcgui.Window(xbmcgui.getCurrentWindowId())
|
||||||
cid = win.getFocusId()
|
# cid = win.getFocusId()
|
||||||
ctl = win.getControl(cid)
|
# ctl = win.getControl(cid)
|
||||||
ctl.selectItem(pos)
|
# ctl.selectItem(pos)
|
||||||
|
|
||||||
|
|
||||||
def itemlist_update(item, replace=False):
|
def itemlist_update(item, replace=False):
|
||||||
@@ -168,7 +162,7 @@ def render_items(itemlist, parent_item):
|
|||||||
|
|
||||||
dirItems = []
|
dirItems = []
|
||||||
for n, item in enumerate(itemlist):
|
for n, item in enumerate(itemlist):
|
||||||
item.itemlistPosition = n + 1
|
# item.itemlistPosition = n + 1
|
||||||
item_url = item.tourl()
|
item_url = item.tourl()
|
||||||
|
|
||||||
if item.category == "":
|
if item.category == "":
|
||||||
@@ -181,7 +175,7 @@ def render_items(itemlist, parent_item):
|
|||||||
if item.fanart == "":
|
if item.fanart == "":
|
||||||
item.fanart = parent_item.fanart
|
item.fanart = parent_item.fanart
|
||||||
if item.action == 'play' and thumb_type == 1 and not item.forcethumb:
|
if item.action == 'play' and thumb_type == 1 and not item.forcethumb:
|
||||||
item.thumbnail = "https://github.com/kodiondemand/media/raw/master/resources/servers/" + item.server.lower() + '.png'
|
item.thumbnail = config.get_online_server_thumb(item.server)
|
||||||
|
|
||||||
# if cloudflare and cloudscraper is used, cookies are needed to display images taken from site
|
# if cloudflare and cloudscraper is used, cookies are needed to display images taken from site
|
||||||
# before checking domain (time consuming), checking if tmdb failed (so, images scraped from website are used)
|
# before checking domain (time consuming), checking if tmdb failed (so, images scraped from website are used)
|
||||||
@@ -198,7 +192,7 @@ def render_items(itemlist, parent_item):
|
|||||||
listitem.setArt({'icon': icon_image, 'thumb': item.thumbnail, 'poster': item.thumbnail,
|
listitem.setArt({'icon': icon_image, 'thumb': item.thumbnail, 'poster': item.thumbnail,
|
||||||
'fanart': item.fanart if item.fanart else default_fanart})
|
'fanart': item.fanart if item.fanart else default_fanart})
|
||||||
|
|
||||||
if config.get_setting("player_mode") == 1 and item.action == "play":
|
if config.get_setting("player_mode") == 1 and item.action == "play" and not item.nfo:
|
||||||
listitem.setProperty('IsPlayable', 'true')
|
listitem.setProperty('IsPlayable', 'true')
|
||||||
|
|
||||||
set_infolabels(listitem, item)
|
set_infolabels(listitem, item)
|
||||||
@@ -254,7 +248,7 @@ def getCurrentView(item=None, parent_item=None):
|
|||||||
elif (item.contentType in ['movie'] and parent_item.action in parent_actions) \
|
elif (item.contentType in ['movie'] and parent_item.action in parent_actions) \
|
||||||
or (item.channel in ['videolibrary'] and parent_item.action in ['list_movies']) \
|
or (item.channel in ['videolibrary'] and parent_item.action in ['list_movies']) \
|
||||||
or (parent_item.channel in ['favorites'] and parent_item.action in ['mainlist']) \
|
or (parent_item.channel in ['favorites'] and parent_item.action in ['mainlist']) \
|
||||||
or parent_item.action in ['now_on_tv', 'now_on_misc', 'now_on_misc_film', 'mostrar_perfil']:
|
or parent_item.action in ['now_on_tv', 'now_on_misc', 'now_on_misc_film', 'mostrar_perfil', 'live']:
|
||||||
return 'movie', 'movies'
|
return 'movie', 'movies'
|
||||||
|
|
||||||
elif (item.contentType in ['tvshow'] and parent_item.action in parent_actions) \
|
elif (item.contentType in ['tvshow'] and parent_item.action in parent_actions) \
|
||||||
@@ -293,255 +287,6 @@ def set_view_mode(item, parent_item):
|
|||||||
logger.info('TYPE: ' + Type + ' - ' + 'CONTENT: ' + content)
|
logger.info('TYPE: ' + Type + ' - ' + 'CONTENT: ' + content)
|
||||||
|
|
||||||
|
|
||||||
# def render_items_old(itemlist, parent_item):
|
|
||||||
# """
|
|
||||||
# Function responsible for displaying the itemlist in kodi, the itemlist and the item it comes from are passed as parameters
|
|
||||||
# @type itemlist: list
|
|
||||||
# @param itemlist: list of elements to show
|
|
||||||
|
|
||||||
# @type parent_item: item
|
|
||||||
# @param parent_item: parent element
|
|
||||||
# """
|
|
||||||
# logger.info('START render_items')
|
|
||||||
# from core import httptools
|
|
||||||
|
|
||||||
# # If the itemlist is not a list we leave
|
|
||||||
# if not isinstance(itemlist, list):
|
|
||||||
# return
|
|
||||||
|
|
||||||
# if parent_item.start:
|
|
||||||
# menu_icon = get_thumb('menu.png')
|
|
||||||
# menu = Item(channel="channelselector", action="getmainlist", viewmode="movie", thumbnail=menu_icon, title='Menu')
|
|
||||||
# itemlist.insert(0, menu)
|
|
||||||
|
|
||||||
# # If there is no item, we show a notice
|
|
||||||
# if not len(itemlist):
|
|
||||||
# itemlist.append(Item(title=config.get_localized_string(60347), thumbnail=get_thumb('nofolder.png')))
|
|
||||||
|
|
||||||
# genre = False
|
|
||||||
# if 'nero' in parent_item.title:
|
|
||||||
# genre = True
|
|
||||||
# anime = False
|
|
||||||
# if 'anime' in channeltools.get_channel_parameters(parent_item.channel)['categories']:
|
|
||||||
# anime = True
|
|
||||||
# # try:
|
|
||||||
# # force_unify = channeltools.get_channel_parameters(parent_item.channel)['force_unify']
|
|
||||||
# # except:
|
|
||||||
# force_unify = False
|
|
||||||
|
|
||||||
# unify_enabled = False
|
|
||||||
|
|
||||||
# has_extendedinfo = xbmc.getCondVisibility('System.HasAddon(script.extendedinfo)')
|
|
||||||
|
|
||||||
# # Add SuperFavourites to context menu (1.0.53 or higher required)
|
|
||||||
# sf_file_path = xbmc.translatePath("special://home/addons/plugin.program.super.favourites/LaunchSFMenu.py")
|
|
||||||
# check_sf = os.path.exists(sf_file_path)
|
|
||||||
# superfavourites = check_sf and xbmc.getCondVisibility('System.HasAddon("plugin.program.super.favourites")')
|
|
||||||
# # try:
|
|
||||||
# # if channeltools.get_channel_parameters(parent_item.channel)['adult']:
|
|
||||||
# # unify_enabled = False
|
|
||||||
# # except:
|
|
||||||
# # pass
|
|
||||||
# # logger.debug('unify_enabled: %s' % unify_enabled)
|
|
||||||
|
|
||||||
# # We go through the itemlist
|
|
||||||
# for item in itemlist:
|
|
||||||
# # logger.debug(item)
|
|
||||||
# # If the item does not contain a category, we will add the parent item
|
|
||||||
# item_url = item.tourl()
|
|
||||||
# if item.category == "":
|
|
||||||
# item.category = parent_item.category
|
|
||||||
|
|
||||||
# # If title does not exist, we start it as str, to avoid "NoType" mistakes
|
|
||||||
# if not item.title:
|
|
||||||
# item.title = ''
|
|
||||||
|
|
||||||
# # If there is no action or it is findvideos / play, folder = False because no listing will be returned
|
|
||||||
# if item.action in ['play', '']:
|
|
||||||
# item.folder = False
|
|
||||||
|
|
||||||
# # If the item does not contain fanart, we put the one of the parent item
|
|
||||||
# if item.fanart == "":
|
|
||||||
# item.fanart = parent_item.fanart
|
|
||||||
|
|
||||||
# if genre:
|
|
||||||
# valid_genre = True
|
|
||||||
# thumb = get_thumb(item.title, auto=True)
|
|
||||||
# if thumb != '':
|
|
||||||
# item.thumbnail = thumb
|
|
||||||
# valid_genre = True
|
|
||||||
# elif anime:
|
|
||||||
# valid_genre = True
|
|
||||||
# elif (('siguiente' in item.title.lower() and '>' in item.title) or ('pagina:' in item.title.lower())):
|
|
||||||
# item.thumbnail = get_thumb("next.png")
|
|
||||||
# elif 'add' in item.action:
|
|
||||||
# if 'pelicula' in item.action:
|
|
||||||
# item.thumbnail = get_thumb("add_to_videolibrary.png")
|
|
||||||
# elif 'serie' in item.action:
|
|
||||||
# item.thumbnail = get_thumb("add_to_videolibrary.png")
|
|
||||||
|
|
||||||
# if (unify_enabled or force_unify) and parent_item.channel not in ['kodfavourites']:
|
|
||||||
# # Format title with unify
|
|
||||||
# item = unify.title_format(item)
|
|
||||||
# else:
|
|
||||||
# # Format title method old school
|
|
||||||
# if item.text_color:
|
|
||||||
# item.title = '[COLOR %s]%s[/COLOR]' % (item.text_color, item.title)
|
|
||||||
# if item.text_bold:
|
|
||||||
# item.title = '[B]%s[/B]' % item.title
|
|
||||||
# if item.text_italic:
|
|
||||||
# item.title = '[I]%s[/I]' % item.title
|
|
||||||
|
|
||||||
# # Add headers to images if they are on a server with cloudflare
|
|
||||||
# if item.action == 'play':
|
|
||||||
# item.thumbnail = unify.thumbnail_type(item)
|
|
||||||
# else:
|
|
||||||
# item.thumbnail = httptools.get_url_headers(item.thumbnail)
|
|
||||||
# item.fanart = httptools.get_url_headers(item.fanart)
|
|
||||||
|
|
||||||
# # Icon Image for folder and video
|
|
||||||
# if item.folder:
|
|
||||||
# icon_image = "DefaultFolder.png"
|
|
||||||
# else:
|
|
||||||
# icon_image = "DefaultVideo.png"
|
|
||||||
|
|
||||||
# # fanart
|
|
||||||
# if item.fanart:
|
|
||||||
# fanart = item.fanart
|
|
||||||
# else:
|
|
||||||
# fanart = config.get_fanart()
|
|
||||||
|
|
||||||
# # Create listitem
|
|
||||||
# listitem = xbmcgui.ListItem(item.title)
|
|
||||||
|
|
||||||
# # values icon, thumb or poster are skin dependent.. so we set all to avoid problems
|
|
||||||
# # if not exists thumb it's used icon value
|
|
||||||
# if config.get_platform(True)['num_version'] >= 16.0:
|
|
||||||
# listitem.setArt({'icon': icon_image, 'thumb': item.thumbnail, 'poster': item.thumbnail,
|
|
||||||
# 'fanart': fanart})
|
|
||||||
# else:
|
|
||||||
# listitem.setIconImage(icon_image)
|
|
||||||
# listitem.setThumbnailImage(item.thumbnail)
|
|
||||||
# listitem.setProperty('fanart_image', fanart)
|
|
||||||
|
|
||||||
# # No need it, use fanart instead
|
|
||||||
# # xbmcplugin.setPluginFanart(int(sys.argv[1]), os.path.join(config.get_runtime_path(), "fanart.jpg"))
|
|
||||||
|
|
||||||
# # This option is to be able to use the xbmcplugin.setResolvedUrl()
|
|
||||||
# # if item.isPlayable == True or (config.get_setting("player_mode") == 1 and item.action == "play"):
|
|
||||||
# if config.get_setting("player_mode") == 1 and item.action == "play":
|
|
||||||
# listitem.setProperty('IsPlayable', 'true')
|
|
||||||
|
|
||||||
# # Add infoLabels
|
|
||||||
# set_infolabels(listitem, item)
|
|
||||||
|
|
||||||
# # Do not drag plot if it is not a movie / series / season / episode
|
|
||||||
# if item.plot and item.contentType not in ['movie', 'tvshow', 'season', 'episode']:
|
|
||||||
# item.__dict__['infoLabels'].pop('plot')
|
|
||||||
|
|
||||||
# # Mount context menu
|
|
||||||
# if parent_item.channel != 'special':
|
|
||||||
# context_commands = set_context_commands(item, item_url, parent_item, has_extendedinfo=has_extendedinfo, superfavourites=superfavourites)
|
|
||||||
# else:
|
|
||||||
# context_commands = []
|
|
||||||
# # Add context menu
|
|
||||||
# if config.get_platform(True)['num_version'] >= 17.0 and parent_item.list_type == '':
|
|
||||||
# listitem.addContextMenuItems(context_commands)
|
|
||||||
# elif parent_item.list_type == '':
|
|
||||||
# listitem.addContextMenuItems(context_commands, replaceItems=True)
|
|
||||||
|
|
||||||
# from specials import shortcuts
|
|
||||||
# context_commands += shortcuts.context()
|
|
||||||
|
|
||||||
# if not item.totalItems:
|
|
||||||
# item.totalItems = 0
|
|
||||||
# xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url='%s?%s' % (sys.argv[0], item_url),
|
|
||||||
# listitem=listitem, isFolder=item.folder,
|
|
||||||
# totalItems=item.totalItems)
|
|
||||||
|
|
||||||
# # Set types of views ...
|
|
||||||
# if config.get_setting("forceview"): # ...force according to the viewcontent
|
|
||||||
# xbmcplugin.setContent(int(sys.argv[1]), parent_item.viewcontent)
|
|
||||||
|
|
||||||
# elif parent_item.channel not in ["channelselector", "", "kodfavourites"]: # ... or according to the channel
|
|
||||||
# xbmcplugin.setContent(int(sys.argv[1]), "movies")
|
|
||||||
|
|
||||||
# elif parent_item.channel == "kodfavourites" and parent_item.action == 'mostrar_perfil':
|
|
||||||
# xbmcplugin.setContent(int(sys.argv[1]), "movies")
|
|
||||||
|
|
||||||
# # set "breadcrumb"
|
|
||||||
# if parent_item.list_type == '':
|
|
||||||
# breadcrumb = parent_item.category.capitalize()
|
|
||||||
# else:
|
|
||||||
# if 'similar' in parent_item.list_type:
|
|
||||||
# if parent_item.contentTitle != '':
|
|
||||||
# breadcrumb = config.get_localized_string(70693) + parent_item.contentTitle
|
|
||||||
# else:
|
|
||||||
# breadcrumb = config.get_localized_string(70693) + parent_item.contentSerieName
|
|
||||||
# else:
|
|
||||||
# breadcrumb = config.get_localized_string(70693)
|
|
||||||
|
|
||||||
# xbmcplugin.setPluginCategory(handle=int(sys.argv[1]), category=breadcrumb)
|
|
||||||
|
|
||||||
# # Do not sort items
|
|
||||||
# xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_NONE)
|
|
||||||
|
|
||||||
# # We close the directory
|
|
||||||
# xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True)
|
|
||||||
|
|
||||||
# # Fix the view
|
|
||||||
# # if config.get_setting("forceview"):
|
|
||||||
# # viewmode_id = get_viewmode_id(parent_item)
|
|
||||||
# # xbmc.executebuiltin("Container.SetViewMode(%s)" % viewmode_id)
|
|
||||||
# # if parent_item.mode in ['silent', 'get_cached', 'set_cache', 'finish']:
|
|
||||||
# # xbmc.executebuiltin("Container.SetViewMode(500)")
|
|
||||||
|
|
||||||
# logger.info('END render_items')
|
|
||||||
|
|
||||||
|
|
||||||
# def get_viewmode_id(parent_item):
|
|
||||||
# # viewmode_json would have to save it in a file and create a method for the user to set their preferences in:
|
|
||||||
# # user_files, user_movies, user_tvshows, user_season and user_episodes.
|
|
||||||
# viewmode_json = {'skin.confluence': {'default_files': 50,
|
|
||||||
# 'default_movies': 515,
|
|
||||||
# 'default_tvshows': 508,
|
|
||||||
# 'default_seasons': 503,
|
|
||||||
# 'default_episodes': 504,
|
|
||||||
# 'view_list': 50,
|
|
||||||
# 'view_thumbnails': 500,
|
|
||||||
# 'view_movie_with_plot': 503},
|
|
||||||
# 'skin.estuary': {'default_files': 50,
|
|
||||||
# 'default_movies': 54,
|
|
||||||
# 'default_tvshows': 502,
|
|
||||||
# 'default_seasons': 500,
|
|
||||||
# 'default_episodes': 53,
|
|
||||||
# 'view_list': 50,
|
|
||||||
# 'view_thumbnails': 500,
|
|
||||||
# 'view_movie_with_plot': 54}}
|
|
||||||
|
|
||||||
# # If the parent_item had a viewmode set we use that view ...
|
|
||||||
# if parent_item.viewmode == 'movie':
|
|
||||||
# # We replace the old viewmode 'movie' with 'thumbnails'
|
|
||||||
# parent_item.viewmode = 'thumbnails'
|
|
||||||
|
|
||||||
# if parent_item.viewmode in ["list", "movie_with_plot", "thumbnails"]:
|
|
||||||
# view_name = "view_" + parent_item.viewmode
|
|
||||||
|
|
||||||
# '''elif isinstance(parent_item.viewmode, int):
|
|
||||||
# # only for debug
|
|
||||||
# viewName = parent_item.viewmode'''
|
|
||||||
|
|
||||||
# # ...otherwise we put the default view according to the viewcontent
|
|
||||||
# else:
|
|
||||||
# view_name = "default_" + parent_item.viewcontent
|
|
||||||
|
|
||||||
# skin_name = xbmc.getSkinDir()
|
|
||||||
# if skin_name not in viewmode_json:
|
|
||||||
# skin_name = 'skin.confluence'
|
|
||||||
# view_skin = viewmode_json[skin_name]
|
|
||||||
# return view_skin.get(view_name, 50)
|
|
||||||
|
|
||||||
|
|
||||||
def set_infolabels(listitem, item, player=False):
|
def set_infolabels(listitem, item, player=False):
|
||||||
"""
|
"""
|
||||||
Method to pass the information to the listitem (see tmdb.set_InfoLabels())
|
Method to pass the information to the listitem (see tmdb.set_InfoLabels())
|
||||||
@@ -582,32 +327,6 @@ def set_infolabels(listitem, item, player=False):
|
|||||||
listitem.setInfo("video", item.infoLabels)
|
listitem.setInfo("video", item.infoLabels)
|
||||||
# logger.error(item.infoLabels)
|
# logger.error(item.infoLabels)
|
||||||
|
|
||||||
# if item.infoLabels:
|
|
||||||
# if 'mediatype' not in item.infoLabels:
|
|
||||||
# item.infoLabels['mediatype'] = item.contentType
|
|
||||||
#
|
|
||||||
# try:
|
|
||||||
# for label_tag, label_value in list(item.infoLabels.items()):
|
|
||||||
# try:
|
|
||||||
# # logger.debug(str(label_tag) + ': ' + str(infoLabels_dict[label_tag]))
|
|
||||||
# if infoLabels_dict[label_tag] != 'None':
|
|
||||||
# infoLabels_kodi.update({infoLabels_dict[label_tag]: item.infoLabels[label_tag]})
|
|
||||||
# except:
|
|
||||||
# continue
|
|
||||||
#
|
|
||||||
# listitem.setInfo("video", infoLabels_kodi)
|
|
||||||
#
|
|
||||||
# except:
|
|
||||||
# listitem.setInfo("video", item.infoLabels)
|
|
||||||
# logger.error(item.infoLabels)
|
|
||||||
# logger.error(infoLabels_kodi)
|
|
||||||
#
|
|
||||||
# if player and not item.contentTitle:
|
|
||||||
# listitem.setInfo("video", {"Title": item.title})
|
|
||||||
#
|
|
||||||
# elif not player:
|
|
||||||
# listitem.setInfo("video", {"Title": item.title})
|
|
||||||
|
|
||||||
|
|
||||||
def set_context_commands(item, item_url, parent_item, **kwargs):
|
def set_context_commands(item, item_url, parent_item, **kwargs):
|
||||||
"""
|
"""
|
||||||
@@ -686,17 +405,12 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
|
|||||||
# ExtendedInfo: If the addon is installed and a series of conditions are met
|
# ExtendedInfo: If the addon is installed and a series of conditions are met
|
||||||
if kwargs.get('has_extendedinfo') \
|
if kwargs.get('has_extendedinfo') \
|
||||||
and config.get_setting("extended_info") == True:
|
and config.get_setting("extended_info") == True:
|
||||||
if item.contentType == "episode" and item.contentEpisodeNumber and item.contentSeason \
|
if item.contentType == "episode" and item.contentEpisodeNumber and item.contentSeason and (item.infoLabels['tmdb_id'] or item.contentSerieName):
|
||||||
and (item.infoLabels['tmdb_id'] or item.contentSerieName):
|
param = "tvshow_id =%s, tvshow=%s, season=%s, episode=%s" % (item.infoLabels['tmdb_id'], item.contentSerieName, item.contentSeason, item.contentEpisodeNumber)
|
||||||
param = "tvshow_id =%s, tvshow=%s, season=%s, episode=%s" \
|
|
||||||
% (item.infoLabels['tmdb_id'], item.contentSerieName, item.contentSeason,
|
|
||||||
item.contentEpisodeNumber)
|
|
||||||
context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedepisodeinfo,%s)" % param))
|
context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedepisodeinfo,%s)" % param))
|
||||||
|
|
||||||
elif item.contentType == "season" and item.contentSeason \
|
elif item.contentType == "season" and item.contentSeason and (item.infoLabels['tmdb_id'] or item.contentSerieName):
|
||||||
and (item.infoLabels['tmdb_id'] or item.contentSerieName):
|
param = "tvshow_id =%s,tvshow=%s, season=%s" % (item.infoLabels['tmdb_id'], item.contentSerieName, item.contentSeason)
|
||||||
param = "tvshow_id =%s,tvshow=%s, season=%s" \
|
|
||||||
% (item.infoLabels['tmdb_id'], item.contentSerieName, item.contentSeason)
|
|
||||||
context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=seasoninfo,%s)" % param))
|
context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=seasoninfo,%s)" % param))
|
||||||
|
|
||||||
elif item.contentType == "tvshow" and (item.infoLabels['tmdb_id'] or item.infoLabels['tvdb_id'] or item.infoLabels['imdb_id'] or item.contentSerieName):
|
elif item.contentType == "tvshow" and (item.infoLabels['tmdb_id'] or item.infoLabels['tvdb_id'] or item.infoLabels['imdb_id'] or item.contentSerieName):
|
||||||
@@ -705,15 +419,14 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
|
|||||||
|
|
||||||
elif item.contentType == "movie" and (item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.contentTitle):
|
elif item.contentType == "movie" and (item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.contentTitle):
|
||||||
param = "id =%s,imdb_id=%s,name=%s" % (item.infoLabels['tmdb_id'], item.infoLabels['imdb_id'], item.contentTitle)
|
param = "id =%s,imdb_id=%s,name=%s" % (item.infoLabels['tmdb_id'], item.infoLabels['imdb_id'], item.contentTitle)
|
||||||
|
|
||||||
context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedinfo,%s)" % param))
|
context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedinfo,%s)" % param))
|
||||||
# InfoPlus
|
|
||||||
|
# InfoPlus
|
||||||
if config.get_setting("infoplus"):
|
if config.get_setting("infoplus"):
|
||||||
#if item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.infoLabels['tvdb_id'] or \
|
#if item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.infoLabels['tvdb_id'] or \
|
||||||
# (item.contentTitle and item.infoLabels["year"]) or item.contentSerieName:
|
# (item.contentTitle and item.infoLabels["year"]) or item.contentSerieName:
|
||||||
if item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.infoLabels['tvdb_id']:
|
if item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.infoLabels['tvdb_id']:
|
||||||
context_commands.append(("InfoPlus", "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url,
|
context_commands.append(("InfoPlus", "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=infoplus&action=start&from_channel=' + item.channel)))
|
||||||
'channel=infoplus&action=start&from_channel=' + item.channel)))
|
|
||||||
|
|
||||||
# Go to the Main Menu (channel.mainlist)
|
# Go to the Main Menu (channel.mainlist)
|
||||||
if parent_item.channel not in ["news", "channelselector", "downloads"] and item.action != "mainlist":
|
if parent_item.channel not in ["news", "channelselector", "downloads"] and item.action != "mainlist":
|
||||||
@@ -721,13 +434,6 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
|
|||||||
context_commands.insert(0, (config.get_localized_string(60349), "XBMC.Container.Refresh (%s?%s)" % (sys.argv[0], Item(channel=item.channel, action="mainlist").tourl())))
|
context_commands.insert(0, (config.get_localized_string(60349), "XBMC.Container.Refresh (%s?%s)" % (sys.argv[0], Item(channel=item.channel, action="mainlist").tourl())))
|
||||||
context_commands.insert(1, (config.get_localized_string(70739), "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="open_browser", url=item.url).tourl())))
|
context_commands.insert(1, (config.get_localized_string(70739), "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="open_browser", url=item.url).tourl())))
|
||||||
|
|
||||||
# Add to Favorites
|
|
||||||
# if num_version_xbmc < 17.0 and \
|
|
||||||
# ((item.channel not in ["favorites", "videolibrary", "help", ""]
|
|
||||||
# or item.action in ["update_videolibrary"]) and parent_item.channel != "favorites"):
|
|
||||||
# context_commands.append((config.get_localized_string(30155), "XBMC.RunPlugin(%s?%s&%s)" %
|
|
||||||
# (sys.argv[0], item_url, 'channel=favorites&action=addFavourite&from_channel=' + item.channel + '&from_action=' + item.action)))
|
|
||||||
|
|
||||||
# Add to kodfavoritos (My links)
|
# Add to kodfavoritos (My links)
|
||||||
if item.channel not in ["favorites", "videolibrary", "help", ""] and parent_item.channel != "favorites":
|
if item.channel not in ["favorites", "videolibrary", "help", ""] and parent_item.channel != "favorites":
|
||||||
context_commands.append( (config.get_localized_string(70557), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, urllib.urlencode({'channel': "kodfavorites", 'action': "addFavourite", 'from_channel': item.channel, 'from_action': item.action}))))
|
context_commands.append( (config.get_localized_string(70557), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, urllib.urlencode({'channel': "kodfavorites", 'action': "addFavourite", 'from_channel': item.channel, 'from_action': item.action}))))
|
||||||
@@ -748,6 +454,7 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
|
|||||||
context_commands.append((config.get_localized_string(60350), "XBMC.Container.Update (%s?%s&%s)" % (sys.argv[0], item_url, urllib.urlencode({'channel': 'search', 'action': "from_context", 'from_channel': item.channel, 'contextual': True, 'text': item.wanted}))))
|
context_commands.append((config.get_localized_string(60350), "XBMC.Container.Update (%s?%s&%s)" % (sys.argv[0], item_url, urllib.urlencode({'channel': 'search', 'action': "from_context", 'from_channel': item.channel, 'contextual': True, 'text': item.wanted}))))
|
||||||
|
|
||||||
context_commands.append( (config.get_localized_string(70561), "XBMC.Container.Update (%s?%s&%s)" % (sys.argv[0], item_url, 'channel=search&action=from_context&search_type=list&page=1&list_type=%s/%s/similar' % (mediatype, item.infoLabels['tmdb_id']))))
|
context_commands.append( (config.get_localized_string(70561), "XBMC.Container.Update (%s?%s&%s)" % (sys.argv[0], item_url, 'channel=search&action=from_context&search_type=list&page=1&list_type=%s/%s/similar' % (mediatype, item.infoLabels['tmdb_id']))))
|
||||||
|
|
||||||
# Set as Home Page
|
# Set as Home Page
|
||||||
if config.get_setting('start_page'):
|
if config.get_setting('start_page'):
|
||||||
if item.action not in ['episodios', 'seasons', 'findvideos', 'play']:
|
if item.action not in ['episodios', 'seasons', 'findvideos', 'play']:
|
||||||
@@ -780,11 +487,6 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
|
|||||||
elif item.contentType == "season":
|
elif item.contentType == "season":
|
||||||
context_commands.append((config.get_localized_string(60357), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel + '&from_action=' + item.action)))
|
context_commands.append((config.get_localized_string(60357), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel + '&from_action=' + item.action)))
|
||||||
|
|
||||||
# # Open settings
|
|
||||||
# if parent_item.channel not in ["setting", "news", "search"] and item.action == "play":
|
|
||||||
# context_commands.append((config.get_localized_string(60358), "XBMC.Container.Update(%s?%s)" %
|
|
||||||
# (sys.argv[0], Item(channel="setting", action="mainlist").tourl())))
|
|
||||||
|
|
||||||
# Open settings...
|
# Open settings...
|
||||||
if item.action in ["findvideos", 'episodios', 'check', 'new_search'] or "buscar_trailer" in context:
|
if item.action in ["findvideos", 'episodios', 'check', 'new_search'] or "buscar_trailer" in context:
|
||||||
context_commands.append((config.get_localized_string(60359), "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], urllib.urlencode({ 'channel': "trailertools", 'action': "buscartrailer", 'search_title': item.contentTitle if item.contentTitle else item.fulltitle, 'contextual': True}))))
|
context_commands.append((config.get_localized_string(60359), "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], urllib.urlencode({ 'channel': "trailertools", 'action': "buscartrailer", 'search_title': item.contentTitle if item.contentTitle else item.fulltitle, 'contextual': True}))))
|
||||||
@@ -792,14 +494,6 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
|
|||||||
if kwargs.get('superfavourites'):
|
if kwargs.get('superfavourites'):
|
||||||
context_commands.append((config.get_localized_string(60361), "XBMC.RunScript(special://home/addons/plugin.program.super.favourites/LaunchSFMenu.py)"))
|
context_commands.append((config.get_localized_string(60361), "XBMC.RunScript(special://home/addons/plugin.program.super.favourites/LaunchSFMenu.py)"))
|
||||||
|
|
||||||
# context_commands = sorted(context_commands, key=lambda comand: comand[0])
|
|
||||||
|
|
||||||
# Quick Menu
|
|
||||||
# context_commands.insert(0, (config.get_localized_string(60360),
|
|
||||||
# "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(channel='side_menu',
|
|
||||||
# action="open_menu",
|
|
||||||
# parent=parent_item.tourl()).tourl(
|
|
||||||
# ))))
|
|
||||||
if config.dev_mode():
|
if config.dev_mode():
|
||||||
context_commands.insert(0, ("item info", "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="itemInfo", parent=item.tojson()).tourl())))
|
context_commands.insert(0, ("item info", "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="itemInfo", parent=item.tojson()).tourl())))
|
||||||
return context_commands
|
return context_commands
|
||||||
@@ -812,19 +506,12 @@ def is_playing():
|
|||||||
def play_video(item, strm=False, force_direct=False, autoplay=False):
|
def play_video(item, strm=False, force_direct=False, autoplay=False):
|
||||||
logger.info()
|
logger.info()
|
||||||
# logger.debug(item.tostring('\n'))
|
# logger.debug(item.tostring('\n'))
|
||||||
logger.debug('item play: %s' % item)
|
|
||||||
xbmc_player = XBMCPlayer()
|
|
||||||
if item.channel == 'downloads':
|
if item.channel == 'downloads':
|
||||||
logger.info("Reproducir video local: %s [%s]" % (item.title, item.url))
|
logger.info("Play local video: %s [%s]" % (item.title, item.url))
|
||||||
xlistitem = xbmcgui.ListItem(path=item.url)
|
xlistitem = xbmcgui.ListItem(path=item.url)
|
||||||
if config.get_platform(True)['num_version'] >= 16.0:
|
xlistitem.setArt({"thumb": item.thumbnail})
|
||||||
xlistitem.setArt({"thumb": item.thumbnail})
|
|
||||||
else:
|
|
||||||
xlistitem.setThumbnailImage(item.thumbnail)
|
|
||||||
|
|
||||||
set_infolabels(xlistitem, item, True)
|
set_infolabels(xlistitem, item, True)
|
||||||
set_player(item, xlistitem, item.url, True, None) # Fix Play From Download Section
|
set_player(item, xlistitem, item.url, True, None) # Fix Play From Download Section
|
||||||
# xbmc_player.play(item.url, xlistitem)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
default_action = config.get_setting("default_action")
|
default_action = config.get_setting("default_action")
|
||||||
@@ -832,13 +519,11 @@ def play_video(item, strm=False, force_direct=False, autoplay=False):
|
|||||||
|
|
||||||
# Open the selection dialog to see the available options
|
# Open the selection dialog to see the available options
|
||||||
opciones, video_urls, seleccion, salir = get_dialogo_opciones(item, default_action, strm, autoplay)
|
opciones, video_urls, seleccion, salir = get_dialogo_opciones(item, default_action, strm, autoplay)
|
||||||
if salir:
|
if salir: return
|
||||||
return
|
|
||||||
|
|
||||||
# get default option of addon configuration
|
# get default option of addon configuration
|
||||||
seleccion = get_seleccion(default_action, opciones, seleccion, video_urls)
|
seleccion = get_seleccion(default_action, opciones, seleccion, video_urls)
|
||||||
if seleccion < 0: # Canceled box
|
if seleccion < 0: return # Canceled box
|
||||||
return
|
|
||||||
|
|
||||||
logger.info("selection=%d" % seleccion)
|
logger.info("selection=%d" % seleccion)
|
||||||
logger.info("selection=%s" % opciones[seleccion])
|
logger.info("selection=%s" % opciones[seleccion])
|
||||||
@@ -850,42 +535,25 @@ def play_video(item, strm=False, force_direct=False, autoplay=False):
|
|||||||
|
|
||||||
# we get the selected video
|
# we get the selected video
|
||||||
mediaurl, view, mpd = get_video_seleccionado(item, seleccion, video_urls)
|
mediaurl, view, mpd = get_video_seleccionado(item, seleccion, video_urls)
|
||||||
if mediaurl == "":
|
if not mediaurl: return
|
||||||
return
|
|
||||||
# # no certificate verification
|
|
||||||
# mediaurl = mediaurl.replace('https://', 'http://')
|
|
||||||
|
|
||||||
# video information is obtained.
|
# video information is obtained.
|
||||||
if not item.contentThumbnail:
|
|
||||||
thumb = item.thumbnail
|
|
||||||
else:
|
|
||||||
thumb = item.contentThumbnail
|
|
||||||
|
|
||||||
xlistitem = xbmcgui.ListItem(path=item.url)
|
xlistitem = xbmcgui.ListItem(path=item.url)
|
||||||
if config.get_platform(True)['num_version'] >= 16.0:
|
xlistitem.setArt({"thumb": item.contentThumbnail if item.contentThumbnail else item.thumbnail})
|
||||||
xlistitem.setArt({"thumb": thumb})
|
|
||||||
else:
|
|
||||||
xlistitem.setThumbnailImage(thumb)
|
|
||||||
|
|
||||||
set_infolabels(xlistitem, item, True)
|
set_infolabels(xlistitem, item, True)
|
||||||
|
|
||||||
# if it is a video in mpd format, the listitem is configured to play it
|
# if it is a video in mpd format, the listitem is configured to play it ith the inpustreamaddon addon implemented in Kodi 17
|
||||||
# with the inpustreamaddon addon implemented in Kodi 17
|
# from core.support import dbg;dbg()
|
||||||
if mpd:
|
if mpd:
|
||||||
|
if not os.path.exists(os.path.join(xbmc.translatePath('special://home/addons/'),'inputstream.adaptive')): install_inputstream()
|
||||||
xlistitem.setProperty('inputstreamaddon', 'inputstream.adaptive')
|
xlistitem.setProperty('inputstreamaddon', 'inputstream.adaptive')
|
||||||
xlistitem.setProperty('inputstream.adaptive.manifest_type', 'mpd')
|
xlistitem.setProperty('inputstream.adaptive.manifest_type', 'mpd')
|
||||||
|
|
||||||
# player launches
|
if force_direct: item.play_from = 'window'
|
||||||
if force_direct: # when it comes from a window and not directly from the addon base
|
|
||||||
# We add the listitem to a playlist
|
|
||||||
playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
|
|
||||||
playlist.clear()
|
|
||||||
playlist.add(mediaurl, xlistitem)
|
|
||||||
|
|
||||||
# Reproduce
|
|
||||||
xbmc_player.play(playlist, xlistitem)
|
item, nfo_path, head_nfo, item_nfo = resume_playback(item)
|
||||||
else:
|
set_player(item, xlistitem, mediaurl, view, strm, nfo_path, head_nfo, item_nfo)
|
||||||
set_player(item, xlistitem, mediaurl, view, strm)
|
|
||||||
|
|
||||||
|
|
||||||
def stop_video():
|
def stop_video():
|
||||||
@@ -1196,6 +864,9 @@ def get_video_seleccionado(item, seleccion, video_urls):
|
|||||||
wait_time = video_urls[seleccion][2]
|
wait_time = video_urls[seleccion][2]
|
||||||
view = True
|
view = True
|
||||||
|
|
||||||
|
if 'mpd' in video_urls[seleccion][0]:
|
||||||
|
mpd = True
|
||||||
|
|
||||||
# If there is no mediaurl it is because the video is not there :)
|
# If there is no mediaurl it is because the video is not there :)
|
||||||
logger.info("mediaurl=" + mediaurl)
|
logger.info("mediaurl=" + mediaurl)
|
||||||
if mediaurl == "":
|
if mediaurl == "":
|
||||||
@@ -1213,68 +884,64 @@ def get_video_seleccionado(item, seleccion, video_urls):
|
|||||||
return mediaurl, view, mpd
|
return mediaurl, view, mpd
|
||||||
|
|
||||||
|
|
||||||
def set_player(item, xlistitem, mediaurl, view, strm):
|
def set_player(item, xlistitem, mediaurl, view, strm, nfo_path=None, head_nfo=None, item_nfo=None):
|
||||||
logger.info()
|
logger.info()
|
||||||
logger.debug("item:\n" + item.tostring('\n'))
|
# logger.debug("item:\n" + item.tostring('\n'))
|
||||||
# Moved del conector "torrent" here
|
# Moved del conector "torrent" here
|
||||||
if item.server == "torrent":
|
if item.server == "torrent":
|
||||||
play_torrent(item, xlistitem, mediaurl)
|
play_torrent(item, xlistitem, mediaurl)
|
||||||
return
|
return
|
||||||
|
|
||||||
# If it is a strm file, play is not necessary
|
# If it is a strm file, play is not necessary
|
||||||
elif strm:
|
elif strm:
|
||||||
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xlistitem)
|
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xlistitem)
|
||||||
if item.subtitle != "":
|
if item.subtitle:
|
||||||
xbmc.sleep(2000)
|
xbmc.sleep(2000)
|
||||||
xbmc_player.setSubtitles(item.subtitle)
|
xbmc_player.setSubtitles(item.subtitle)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.info("player_mode=%s" % config.get_setting("player_mode"))
|
player_mode = config.get_setting("player_mode")
|
||||||
|
if (player_mode == 3 and mediaurl.startswith("rtmp")) or item.play_from == 'window' or item.nfo: player_mode = 0
|
||||||
|
elif "megacrypter.com" in mediaurl: player_mode = 3
|
||||||
logger.info("mediaurl=" + mediaurl)
|
logger.info("mediaurl=" + mediaurl)
|
||||||
if config.get_setting("player_mode") == 3 or "megacrypter.com" in mediaurl:
|
|
||||||
from platformcode import download_and_play
|
|
||||||
download_and_play.download_and_play(mediaurl, "download_and_play.tmp", config.get_setting("downloadpath"))
|
|
||||||
return
|
|
||||||
|
|
||||||
elif config.get_setting("player_mode") == 0 or item.play_from == 'window' or \
|
if player_mode == 0:
|
||||||
(config.get_setting("player_mode") == 3 and mediaurl.startswith("rtmp")):
|
logger.info('Player Mode: Direct')
|
||||||
# We add the listitem to a playlist
|
# Add the listitem to a playlist
|
||||||
playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
|
playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
|
||||||
playlist.clear()
|
playlist.clear()
|
||||||
playlist.add(mediaurl, xlistitem)
|
playlist.add(mediaurl, xlistitem)
|
||||||
|
|
||||||
# Reproduce
|
# Reproduce
|
||||||
# xbmc_player = xbmc_player
|
|
||||||
xbmc_player.play(playlist, xlistitem)
|
xbmc_player.play(playlist, xlistitem)
|
||||||
if config.get_setting('trakt_sync'):
|
if config.get_setting('trakt_sync'):
|
||||||
trakt_tools.wait_for_update_trakt()
|
trakt_tools.wait_for_update_trakt()
|
||||||
|
|
||||||
# elif config.get_setting("player_mode") == 1 or item.isPlayable:
|
elif player_mode == 1:
|
||||||
elif config.get_setting("player_mode") == 1:
|
logger.info('Player Mode: setResolvedUrl')
|
||||||
logger.info("Tras setResolvedUrl")
|
|
||||||
# if it is a video library file send to mark as seen
|
|
||||||
|
|
||||||
if strm or item.strm_path:
|
|
||||||
from platformcode import xbmc_videolibrary
|
|
||||||
xbmc_videolibrary.mark_auto_as_watched(item)
|
|
||||||
logger.debug(item)
|
|
||||||
xlistitem.setPath(mediaurl)
|
xlistitem.setPath(mediaurl)
|
||||||
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xlistitem)
|
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xlistitem)
|
||||||
xbmc.sleep(2500)
|
xbmc.sleep(2500)
|
||||||
|
|
||||||
elif config.get_setting("player_mode") == 2:
|
elif player_mode == 2:
|
||||||
|
logger.info('Player Mode: Built-In')
|
||||||
xbmc.executebuiltin("PlayMedia(" + mediaurl + ")")
|
xbmc.executebuiltin("PlayMedia(" + mediaurl + ")")
|
||||||
|
|
||||||
|
elif player_mode == 3:
|
||||||
|
logger.info('Player Mode: Download and Play')
|
||||||
|
from platformcode import download_and_play
|
||||||
|
download_and_play.download_and_play(mediaurl, "download_and_play.tmp", config.get_setting("downloadpath"))
|
||||||
|
return
|
||||||
|
|
||||||
# ALL LOOKING TO REMOVE VIEW
|
# ALL LOOKING TO REMOVE VIEW
|
||||||
if item.subtitle != "" and view:
|
if item.subtitle and view:
|
||||||
logger.info("Subtítulos externos: " + item.subtitle)
|
logger.info("External subtitles: " + item.subtitle)
|
||||||
xbmc.sleep(2000)
|
xbmc.sleep(2000)
|
||||||
xbmc_player.setSubtitles(item.subtitle)
|
xbmc_player.setSubtitles(item.subtitle)
|
||||||
|
|
||||||
# if it is a video library file send to mark as seen
|
# if it is a video library file send to mark as seen
|
||||||
if strm or item.strm_path:
|
if strm or item.strm_path:
|
||||||
from platformcode import xbmc_videolibrary
|
from platformcode import xbmc_videolibrary
|
||||||
xbmc_videolibrary.mark_auto_as_watched(item)
|
xbmc_videolibrary.mark_auto_as_watched(item, nfo_path, head_nfo, item_nfo)
|
||||||
|
|
||||||
|
|
||||||
def torrent_client_installed(show_tuple=False):
|
def torrent_client_installed(show_tuple=False):
|
||||||
@@ -1334,4 +1001,83 @@ def play_torrent(item, xlistitem, mediaurl):
|
|||||||
|
|
||||||
|
|
||||||
def log(texto):
|
def log(texto):
|
||||||
xbmc.log(texto, xbmc.LOGNOTICE)
|
xbmc.log(texto, xbmc.LOGNOTICE)
|
||||||
|
|
||||||
|
def resume_playback(item, return_played_time=False):
|
||||||
|
class ResumePlayback(xbmcgui.WindowXMLDialog):
|
||||||
|
Close = False
|
||||||
|
Resume = False
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.action_exitkeys_id = [xbmcgui.ACTION_BACKSPACE, xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK]
|
||||||
|
self.progress_control = None
|
||||||
|
self.item = kwargs.get('item')
|
||||||
|
m, s = divmod(float(self.item.played_time), 60)
|
||||||
|
h, m = divmod(m, 60)
|
||||||
|
self.setProperty("time", '%02d:%02d:%02d' % (h, m, s))
|
||||||
|
|
||||||
|
def set_values(self, value):
|
||||||
|
self.Resume = value
|
||||||
|
self.Close = True
|
||||||
|
|
||||||
|
def is_close(self):
|
||||||
|
return self.Close
|
||||||
|
|
||||||
|
def onClick(self, controlId):
|
||||||
|
if controlId == 3012: # Resume
|
||||||
|
self.set_values(True)
|
||||||
|
self.close()
|
||||||
|
elif controlId == 3013: # Cancel
|
||||||
|
self.set_values(False)
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
def onAction(self, action):
|
||||||
|
if action in self.action_exitkeys_id:
|
||||||
|
self.set_values(False)
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
|
||||||
|
from core import videolibrarytools, filetools
|
||||||
|
|
||||||
|
# Read NFO FILE
|
||||||
|
if item.contentType == 'movie':
|
||||||
|
nfo_path = item.nfo
|
||||||
|
else:
|
||||||
|
nfo_path = item.strm_path.replace('strm','nfo')
|
||||||
|
|
||||||
|
if filetools.isfile(nfo_path):
|
||||||
|
head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path)
|
||||||
|
|
||||||
|
if return_played_time:
|
||||||
|
return item_nfo.played_time
|
||||||
|
# Show Window
|
||||||
|
elif (config.get_setting("player_mode") not in [3] or item.play_from == 'window') and item_nfo.played_time:
|
||||||
|
Dialog = ResumePlayback('ResumePlayback.xml', config.get_runtime_path(), item=item_nfo)
|
||||||
|
Dialog.show()
|
||||||
|
t = 0
|
||||||
|
while not Dialog.is_close() and t < 100:
|
||||||
|
t += 1
|
||||||
|
xbmc.sleep(100)
|
||||||
|
if not Dialog.Resume: item_nfo.played_time = 0
|
||||||
|
else:
|
||||||
|
item_nfo.played_time = 0
|
||||||
|
|
||||||
|
return item, nfo_path, head_nfo, item_nfo
|
||||||
|
else:
|
||||||
|
item.nfo = item.strm_path = ""
|
||||||
|
return item, None, None, None
|
||||||
|
|
||||||
|
def install_inputstream():
|
||||||
|
from xbmcaddon import Addon
|
||||||
|
try:
|
||||||
|
# See if there's an installed repo that has it
|
||||||
|
xbmc.executebuiltin('InstallAddon(inputstream.adaptive)', wait=True)
|
||||||
|
|
||||||
|
# Check if InputStream add-on exists!
|
||||||
|
Addon('inputstream.adaptive')
|
||||||
|
|
||||||
|
logger.info('InputStream add-on installed from repo.')
|
||||||
|
return True
|
||||||
|
except RuntimeError:
|
||||||
|
logger.info('InputStream add-on not installed.')
|
||||||
|
return False
|
||||||
@@ -184,7 +184,7 @@ class SettingsWindow(xbmcgui.WindowXMLDialog):
|
|||||||
# The call is made from a channel
|
# The call is made from a channel
|
||||||
self.list_controls, default_values = servertools.get_server_controls_settings(self.channel)
|
self.list_controls, default_values = servertools.get_server_controls_settings(self.channel)
|
||||||
self.kwargs = {"server": self.channel}
|
self.kwargs = {"server": self.channel}
|
||||||
self.channelName = servertools.get_server_json(self.channel)['name']
|
self.channelName = servertools.get_server_parameters(self.channel)['name']
|
||||||
|
|
||||||
# Else Exit
|
# Else Exit
|
||||||
else:
|
else:
|
||||||
@@ -378,8 +378,8 @@ class SettingsWindow(xbmcgui.WindowXMLDialog):
|
|||||||
textColor=c["color"], font=self.font, isPassword=c["hidden"], window=self)
|
textColor=c["color"], font=self.font, isPassword=c["hidden"], window=self)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
control = xbmcgui.ControlEdit(0, -100, self.controls_width - 5, self.height_control,
|
control = xbmcgui.ControlEdit(0, -100, self.controls_width, self.height_control,
|
||||||
c["label"], self.font, c["color"], '', 4, isPassword=c["hidden"],
|
c["label"], self.font, c["color"], '', 1 | 4, isPassword=c["hidden"],
|
||||||
focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'),
|
focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'),
|
||||||
noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'))
|
noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'))
|
||||||
|
|
||||||
@@ -393,7 +393,7 @@ class SettingsWindow(xbmcgui.WindowXMLDialog):
|
|||||||
s = ''
|
s = ''
|
||||||
control.setText(s)
|
control.setText(s)
|
||||||
# control.setText(self.values[c["id"]])
|
# control.setText(self.values[c["id"]])
|
||||||
control.setWidth(self.controls_width - 5)
|
control.setWidth(self.controls_width + 10)
|
||||||
control.setHeight(self.height_control)
|
control.setHeight(self.height_control)
|
||||||
|
|
||||||
c["control"] = control
|
c["control"] = control
|
||||||
@@ -446,8 +446,8 @@ class SettingsWindow(xbmcgui.WindowXMLDialog):
|
|||||||
self.getControl(10006).setLabel(self.custom_button['label'])
|
self.getControl(10006).setLabel(self.custom_button['label'])
|
||||||
else:
|
else:
|
||||||
self.getControl(10006).setVisible(False)
|
self.getControl(10006).setVisible(False)
|
||||||
self.getControl(10004).setPosition(self.getControl(10004).getPosition()[0] + 80, self.getControl(10004).getPosition()[1])
|
# self.getControl(10004).setPosition(self.getControl(10004).getPosition()[0], self.getControl(10004).getPosition()[1])
|
||||||
self.getControl(10005).setPosition(self.getControl(10005).getPosition()[0] + 80, self.getControl(10005).getPosition()[1])
|
# self.getControl(10005).setPosition(self.getControl(10005).getPosition()[0], self.getControl(10005).getPosition()[1])
|
||||||
|
|
||||||
# Control Area Dimensions
|
# Control Area Dimensions
|
||||||
self.controls_width = self.getControl(10007).getWidth() - 30
|
self.controls_width = self.getControl(10007).getWidth() - 30
|
||||||
@@ -506,7 +506,6 @@ class SettingsWindow(xbmcgui.WindowXMLDialog):
|
|||||||
elif c["type"] == 'text': self.add_control_text(c)
|
elif c["type"] == 'text': self.add_control_text(c)
|
||||||
elif c["type"] == 'list': self.add_control_list(c)
|
elif c["type"] == 'list': self.add_control_list(c)
|
||||||
elif c["type"] == 'label': self.add_control_label(c)
|
elif c["type"] == 'label': self.add_control_label(c)
|
||||||
|
|
||||||
self.list_controls = [c for c in self.list_controls if "control" in c]
|
self.list_controls = [c for c in self.list_controls if "control" in c]
|
||||||
|
|
||||||
self.evaluate_conditions()
|
self.evaluate_conditions()
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
from future import standard_library
|
from future import standard_library
|
||||||
standard_library.install_aliases()
|
standard_library.install_aliases()
|
||||||
#from builtins import str
|
#from builtins import str
|
||||||
import sys, os, threading, time, re, math, xbmc
|
import sys, os, threading, time, re, math, xbmc, xbmcgui
|
||||||
PY3 = False
|
PY3 = False
|
||||||
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
|
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
|
||||||
|
|
||||||
@@ -15,73 +15,84 @@ from core import scrapertools
|
|||||||
from xml.dom import minidom
|
from xml.dom import minidom
|
||||||
|
|
||||||
|
|
||||||
def mark_auto_as_watched(item):
|
def mark_auto_as_watched(item, nfo_path=None, head_nfo=None, item_nfo=None):
|
||||||
def mark_as_watched_subThread(item):
|
def mark_as_watched_subThread(item, nfo_path, head_nfo, item_nfo):
|
||||||
logger.info()
|
logger.info()
|
||||||
# logger.debug("item:\n" + item.tostring('\n'))
|
# logger.debug("item:\n" + item.tostring('\n'))
|
||||||
# if nfo and strm_path not exist
|
|
||||||
if not item.nfo:
|
|
||||||
if item.contentType == 'movie':
|
|
||||||
vl = xbmc.translatePath(filetools.join(config.get_setting("videolibrarypath"), config.get_setting("folder_movies")))
|
|
||||||
path = '%s [%s]' % (item.contentTitle, item.infoLabels['IMDBNumber'])
|
|
||||||
item.nfo = filetools.join(vl, path, path + '.nfo')
|
|
||||||
item.strm_path = filetools.join(path, item.contentTitle + '.strm')
|
|
||||||
else:
|
|
||||||
vl = xbmc.translatePath(filetools.join(config.get_setting("videolibrarypath"), config.get_setting("folder_tvshows")))
|
|
||||||
path = '%s [%s]' % (item.contentSerieName, item.infoLabels['IMDBNumber'])
|
|
||||||
item.nfo = filetools.join(vl, path, 'tvshow.nfo')
|
|
||||||
if item.contentSeason and item.contentEpisodeNumber:
|
|
||||||
title = str(item.contentSeason) + 'x' + str(item.contentEpisodeNumber).zfill(2)
|
|
||||||
else:
|
|
||||||
season, episode = scrapertools.find_single_match(item.title, r'(\d+)x(\d+)')
|
|
||||||
title = season + 'x' + episode.zfill(2)
|
|
||||||
item.strm_path = filetools.join(path, title + '.strm')
|
|
||||||
condicion = config.get_setting("watched_setting", "videolibrary")
|
|
||||||
|
|
||||||
time_limit = time.time() + 30
|
time_limit = time.time() + 30
|
||||||
while not platformtools.is_playing() and time.time() < time_limit:
|
while not platformtools.is_playing() and time.time() < time_limit:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
sync_with_trakt = False
|
marked = False
|
||||||
|
next_episode = None
|
||||||
|
show_server = True
|
||||||
|
|
||||||
|
percentage = float(config.get_setting("watched_setting")) / 100
|
||||||
|
time_from_end = config.get_setting('next_ep_seconds')
|
||||||
|
if item.contentType != 'movie' and config.get_setting('next_ep'):
|
||||||
|
next_dialogs = ['NextDialog.xml', 'NextDialogExtended.xml', 'NextDialogCompact.xml']
|
||||||
|
next_ep_type = config.get_setting('next_ep_type')
|
||||||
|
ND = next_dialogs[next_ep_type]
|
||||||
|
next_episode = next_ep(item)
|
||||||
|
|
||||||
while platformtools.is_playing():
|
while platformtools.is_playing():
|
||||||
tiempo_actual = xbmc.Player().getTime()
|
actual_time = xbmc.Player().getTime()
|
||||||
totaltime = xbmc.Player().getTotalTime()
|
total_time = xbmc.Player().getTotalTime()
|
||||||
|
if item_nfo.played_time and item_nfo.played_time > actual_time > 1:
|
||||||
|
xbmc.Player().seekTime(item_nfo.played_time)
|
||||||
|
item_nfo.played_time = 0 # Fix for Slow Devices
|
||||||
|
|
||||||
mark_time = 0
|
mark_time = total_time * percentage
|
||||||
if condicion == 0: # '5 minutos'
|
difference = total_time - actual_time
|
||||||
mark_time = 300
|
|
||||||
elif condicion == 1: # '30%'
|
|
||||||
mark_time = totaltime * 0.3
|
|
||||||
elif condicion == 2: # '50%'
|
|
||||||
mark_time = totaltime * 0.5
|
|
||||||
elif condicion == 3: # '80%'
|
|
||||||
mark_time = totaltime * 0.8
|
|
||||||
elif condicion == 4: # '0 seg'
|
|
||||||
mark_time = -1
|
|
||||||
|
|
||||||
# logger.debug(str(tiempo_actual))
|
# Mark as Watched
|
||||||
# logger.debug(str(mark_time))
|
if actual_time > mark_time and not marked:
|
||||||
|
|
||||||
if tiempo_actual > mark_time:
|
|
||||||
logger.debug("Marked as Watched")
|
logger.debug("Marked as Watched")
|
||||||
item.playcount = 1
|
item.playcount = 1
|
||||||
sync_with_trakt = True
|
marked = True
|
||||||
|
show_server = False
|
||||||
from specials import videolibrary
|
from specials import videolibrary
|
||||||
videolibrary.mark_content_as_watched2(item)
|
videolibrary.mark_content_as_watched2(item)
|
||||||
break
|
if not next_episode:
|
||||||
|
break
|
||||||
|
|
||||||
time.sleep(5)
|
# check for next Episode
|
||||||
|
if next_episode and marked and time_from_end >= difference:
|
||||||
|
nextdialog = NextDialog(ND, config.get_runtime_path())
|
||||||
|
nextdialog.show()
|
||||||
|
while platformtools.is_playing() and not nextdialog.is_exit():
|
||||||
|
xbmc.sleep(100)
|
||||||
|
if nextdialog.continuewatching:
|
||||||
|
next_episode.next_ep = True
|
||||||
|
xbmc.Player().stop()
|
||||||
|
nextdialog.close()
|
||||||
|
break
|
||||||
|
xbmc.sleep(1000)
|
||||||
|
|
||||||
|
# Set played time
|
||||||
|
item_nfo.played_time = int(actual_time) if not marked and actual_time > 120 else 0
|
||||||
|
filetools.write(nfo_path, head_nfo + item_nfo.tojson())
|
||||||
|
|
||||||
# Silent sync with Trakt
|
# Silent sync with Trakt
|
||||||
if sync_with_trakt and config.get_setting("trakt_sync"):
|
if marked and config.get_setting("trakt_sync"): sync_trakt_kodi()
|
||||||
sync_trakt_kodi()
|
|
||||||
|
|
||||||
# logger.debug("Fin del hilo")
|
while platformtools.is_playing():
|
||||||
|
xbmc.sleep(100)
|
||||||
|
if not show_server and item.play_from != 'window':
|
||||||
|
xbmc.sleep(700)
|
||||||
|
xbmc.executebuiltin('Action(Back)')
|
||||||
|
xbmc.sleep(500)
|
||||||
|
if next_episode and next_episode.next_ep:
|
||||||
|
from platformcode.launcher import play_from_library
|
||||||
|
return play_from_library(next_episode)
|
||||||
|
|
||||||
# If it is configured to mark as seen
|
# If it is configured to mark as seen
|
||||||
if config.get_setting("mark_as_watched", "videolibrary"):
|
if config.get_setting("mark_as_watched", "videolibrary"):
|
||||||
threading.Thread(target=mark_as_watched_subThread, args=[item]).start()
|
threading.Thread(target=mark_as_watched_subThread, args=[item, nfo_path, head_nfo, item_nfo]).start()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def sync_trakt_addon(path_folder):
|
def sync_trakt_addon(path_folder):
|
||||||
@@ -110,7 +121,7 @@ def sync_trakt_addon(path_folder):
|
|||||||
shows = list(shows.items())
|
shows = list(shows.items())
|
||||||
|
|
||||||
# we get the series id to compare
|
# we get the series id to compare
|
||||||
_id = re.findall("\[(.*?)\]", path_folder, flags=re.DOTALL)[0]
|
_id = re.findall(r"\[(.*?)\]", path_folder, flags=re.DOTALL)[0]
|
||||||
logger.debug("the id is %s" % _id)
|
logger.debug("the id is %s" % _id)
|
||||||
|
|
||||||
if "tt" in _id:
|
if "tt" in _id:
|
||||||
@@ -152,7 +163,7 @@ def sync_trakt_addon(path_folder):
|
|||||||
logger.debug("dict_trakt_show %s " % dict_trakt_show)
|
logger.debug("dict_trakt_show %s " % dict_trakt_show)
|
||||||
|
|
||||||
# we get the keys that are episodes
|
# we get the keys that are episodes
|
||||||
regex_epi = re.compile('\d+x\d+')
|
regex_epi = re.compile(r'\d+x\d+')
|
||||||
keys_episodes = [key for key in serie.library_playcounts if regex_epi.match(key)]
|
keys_episodes = [key for key in serie.library_playcounts if regex_epi.match(key)]
|
||||||
# we get the keys that are seasons
|
# we get the keys that are seasons
|
||||||
keys_seasons = [key for key in serie.library_playcounts if 'season ' in key]
|
keys_seasons = [key for key in serie.library_playcounts if 'season ' in key]
|
||||||
@@ -210,14 +221,14 @@ def sync_trakt_kodi(silent=True):
|
|||||||
# So that the synchronization is not silent it is worth with silent = False
|
# So that the synchronization is not silent it is worth with silent = False
|
||||||
if xbmc.getCondVisibility('System.HasAddon("script.trakt")'):
|
if xbmc.getCondVisibility('System.HasAddon("script.trakt")'):
|
||||||
notificacion = True
|
notificacion = True
|
||||||
if (not config.get_setting("sync_trakt_notification", "videolibrary") and platformtools.is_playing()):
|
if not config.get_setting("sync_trakt_notification", "videolibrary") and platformtools.is_playing():
|
||||||
notificacion = False
|
notificacion = False
|
||||||
|
|
||||||
xbmc.executebuiltin('RunScript(script.trakt,action=sync,silent=%s)' % silent)
|
xbmc.executebuiltin('RunScript(script.trakt,action=sync,silent=%s)' % silent)
|
||||||
logger.info("Synchronization with Trakt started")
|
logger.info("Synchronization with Trakt started")
|
||||||
|
|
||||||
if notificacion:
|
if notificacion:
|
||||||
platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(60045), time=2000)
|
platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(60045), sound=False, time=2000)
|
||||||
|
|
||||||
|
|
||||||
def mark_content_as_watched_on_kodi(item, value=1):
|
def mark_content_as_watched_on_kodi(item, value=1):
|
||||||
@@ -276,7 +287,6 @@ def mark_content_as_watched_on_kodi(item, value=1):
|
|||||||
path = filetools.join(tail, filename)
|
path = filetools.join(tail, filename)
|
||||||
|
|
||||||
for d in data['result']['episodes']:
|
for d in data['result']['episodes']:
|
||||||
|
|
||||||
if d['file'].replace("/", "\\").endswith(path.replace("/", "\\")):
|
if d['file'].replace("/", "\\").endswith(path.replace("/", "\\")):
|
||||||
# logger.debug("I mark the episode as seen")
|
# logger.debug("I mark the episode as seen")
|
||||||
episodeid = d['episodeid']
|
episodeid = d['episodeid']
|
||||||
@@ -376,7 +386,7 @@ def mark_content_as_watched_on_kod(path):
|
|||||||
path1 = path.replace("\\\\", "\\") # Windows format
|
path1 = path.replace("\\\\", "\\") # Windows format
|
||||||
if not path2:
|
if not path2:
|
||||||
path2 = path1.replace("\\", "/") # Format no Windows
|
path2 = path1.replace("\\", "/") # Format no Windows
|
||||||
nfo_name = scrapertools.find_single_match(path2, '\]\/(.*?)$') # I build the name of the .nfo
|
nfo_name = scrapertools.find_single_match(path2, r'\]\/(.*?)$') # I build the name of the .nfo
|
||||||
path1 = path1.replace(nfo_name, '') # for SQL I just need the folder
|
path1 = path1.replace(nfo_name, '') # for SQL I just need the folder
|
||||||
path2 = path2.replace(nfo_name, '') # for SQL I just need the folder
|
path2 = path2.replace(nfo_name, '') # for SQL I just need the folder
|
||||||
path2 = filetools.remove_smb_credential(path2) # If the file is on an SMB server, we remove the credentials
|
path2 = filetools.remove_smb_credential(path2) # If the file is on an SMB server, we remove the credentials
|
||||||
@@ -394,7 +404,7 @@ def mark_content_as_watched_on_kod(path):
|
|||||||
if contentType == "episode_view":
|
if contentType == "episode_view":
|
||||||
title_plain = title.replace('.strm', '') # If it is Serial, we remove the suffix .strm
|
title_plain = title.replace('.strm', '') # If it is Serial, we remove the suffix .strm
|
||||||
else:
|
else:
|
||||||
title_plain = scrapertools.find_single_match(item.strm_path, '.(.*?\s\[.*?\])') # if it's a movie, we remove the title
|
title_plain = scrapertools.find_single_match(item.strm_path, r'.(.*?\s\[.*?\])') # if it's a movie, we remove the title
|
||||||
if playCount is None or playCount == 0: # not yet seen, we set it to 0
|
if playCount is None or playCount == 0: # not yet seen, we set it to 0
|
||||||
playCount_final = 0
|
playCount_final = 0
|
||||||
elif playCount >= 1:
|
elif playCount >= 1:
|
||||||
@@ -409,7 +419,7 @@ def mark_content_as_watched_on_kod(path):
|
|||||||
if item.infoLabels['mediatype'] == "tvshow": # We update the Season and Series playCounts
|
if item.infoLabels['mediatype'] == "tvshow": # We update the Season and Series playCounts
|
||||||
for season in item.library_playcounts:
|
for season in item.library_playcounts:
|
||||||
if "season" in season: # we look for the tags "season" inside playCounts
|
if "season" in season: # we look for the tags "season" inside playCounts
|
||||||
season_num = int(scrapertools.find_single_match(season, 'season (\d+)')) # we save the season number
|
season_num = int(scrapertools.find_single_match(season, r'season (\d+)')) # we save the season number
|
||||||
item = videolibrary.check_season_playcount(item, season_num) # We call the method that updates Temps. and series
|
item = videolibrary.check_season_playcount(item, season_num) # We call the method that updates Temps. and series
|
||||||
|
|
||||||
filetools.write(path, head_nfo + item.tojson())
|
filetools.write(path, head_nfo + item.tojson())
|
||||||
@@ -497,7 +507,7 @@ def update(folder_content=config.get_setting("folder_tvshows"), folder=""):
|
|||||||
# update_path = filetools.join(videolibrarypath, folder_content, folder) + "/" # Encoder problems in "folder"
|
# update_path = filetools.join(videolibrarypath, folder_content, folder) + "/" # Encoder problems in "folder"
|
||||||
update_path = filetools.join(videolibrarypath, folder_content, ' ').rstrip()
|
update_path = filetools.join(videolibrarypath, folder_content, ' ').rstrip()
|
||||||
|
|
||||||
if videolibrarypath.startswith("special:") or not scrapertools.find_single_match(update_path, '(^\w+:\/\/)'):
|
if videolibrarypath.startswith("special:") or not scrapertools.find_single_match(update_path, r'(^\w+:\/\/)'):
|
||||||
payload["params"] = {"directory": update_path}
|
payload["params"] = {"directory": update_path}
|
||||||
|
|
||||||
while xbmc.getCondVisibility('Library.IsScanningVideo()'):
|
while xbmc.getCondVisibility('Library.IsScanningVideo()'):
|
||||||
@@ -539,7 +549,7 @@ def set_content(content_type, silent=False, custom=False):
|
|||||||
if not xbmc.getCondVisibility('System.HasAddon(metadata.themoviedb.org)'):
|
if not xbmc.getCondVisibility('System.HasAddon(metadata.themoviedb.org)'):
|
||||||
if not silent:
|
if not silent:
|
||||||
# Ask if we want to install metadata.themoviedb.org
|
# Ask if we want to install metadata.themoviedb.org
|
||||||
install = platformtools.dialog_yesno(config.get_localized_string(60046))
|
install = platformtools.dialog_yesno(config.get_localized_string(60046),'')
|
||||||
else:
|
else:
|
||||||
install = True
|
install = True
|
||||||
|
|
||||||
@@ -563,7 +573,7 @@ def set_content(content_type, silent=False, custom=False):
|
|||||||
continuar = False
|
continuar = False
|
||||||
if not silent:
|
if not silent:
|
||||||
# Ask if we want to install metadata.universal
|
# Ask if we want to install metadata.universal
|
||||||
install = platformtools.dialog_yesno(config.get_localized_string(70095))
|
install = platformtools.dialog_yesno(config.get_localized_string(70095),'')
|
||||||
else:
|
else:
|
||||||
install = True
|
install = True
|
||||||
|
|
||||||
@@ -593,7 +603,7 @@ def set_content(content_type, silent=False, custom=False):
|
|||||||
if not xbmc.getCondVisibility('System.HasAddon(metadata.tvdb.com)'):
|
if not xbmc.getCondVisibility('System.HasAddon(metadata.tvdb.com)'):
|
||||||
if not silent:
|
if not silent:
|
||||||
#Ask if we want to install metadata.tvdb.com
|
#Ask if we want to install metadata.tvdb.com
|
||||||
install = platformtools.dialog_yesno(config.get_localized_string(60048))
|
install = platformtools.dialog_yesno(config.get_localized_string(60048),'')
|
||||||
else:
|
else:
|
||||||
install = True
|
install = True
|
||||||
|
|
||||||
@@ -617,7 +627,7 @@ def set_content(content_type, silent=False, custom=False):
|
|||||||
continuar = False
|
continuar = False
|
||||||
if not silent:
|
if not silent:
|
||||||
# Ask if we want to install metadata.tvshows.themoviedb.org
|
# Ask if we want to install metadata.tvshows.themoviedb.org
|
||||||
install = platformtools.dialog_yesno(config.get_localized_string(60050))
|
install = platformtools.dialog_yesno(config.get_localized_string(60050),'')
|
||||||
else:
|
else:
|
||||||
install = True
|
install = True
|
||||||
|
|
||||||
@@ -651,7 +661,7 @@ def set_content(content_type, silent=False, custom=False):
|
|||||||
if sql_videolibrarypath.startswith("special://"):
|
if sql_videolibrarypath.startswith("special://"):
|
||||||
sql_videolibrarypath = sql_videolibrarypath.replace('/profile/', '/%/').replace('/home/userdata/', '/%/')
|
sql_videolibrarypath = sql_videolibrarypath.replace('/profile/', '/%/').replace('/home/userdata/', '/%/')
|
||||||
sep = '/'
|
sep = '/'
|
||||||
elif scrapertools.find_single_match(sql_videolibrarypath, '(^\w+:\/\/)'):
|
elif scrapertools.find_single_match(sql_videolibrarypath, r'(^\w+:\/\/)'):
|
||||||
sep = '/'
|
sep = '/'
|
||||||
else:
|
else:
|
||||||
sep = os.sep
|
sep = os.sep
|
||||||
@@ -1228,4 +1238,110 @@ def ask_set_content(silent=False):
|
|||||||
# configuration from the settings menu
|
# configuration from the settings menu
|
||||||
else:
|
else:
|
||||||
platformtools.dialog_ok(config.get_localized_string(80026), config.get_localized_string(80023))
|
platformtools.dialog_ok(config.get_localized_string(80026), config.get_localized_string(80023))
|
||||||
do_config(True)
|
do_config(True)
|
||||||
|
|
||||||
|
|
||||||
|
def next_ep(item):
|
||||||
|
from core.item import Item
|
||||||
|
logger.info()
|
||||||
|
item.next_ep = False
|
||||||
|
|
||||||
|
# check if next file exist
|
||||||
|
current_filename = filetools.basename(item.strm_path)
|
||||||
|
base_path = filetools.basename(filetools.dirname(item.strm_path))
|
||||||
|
path = filetools.join(config.get_videolibrary_path(), config.get_setting("folder_tvshows"),base_path)
|
||||||
|
fileList = []
|
||||||
|
for file in filetools.listdir(path):
|
||||||
|
if file.endswith('.strm'):
|
||||||
|
fileList.append(file)
|
||||||
|
fileList.sort()
|
||||||
|
|
||||||
|
nextIndex = fileList.index(current_filename) + 1
|
||||||
|
if nextIndex == 0 or nextIndex == len(fileList): next_file = None
|
||||||
|
else: next_file = fileList[nextIndex]
|
||||||
|
logger.info('Next File:' + str(next_file))
|
||||||
|
|
||||||
|
# start next episode window afther x time
|
||||||
|
if next_file:
|
||||||
|
season_ep = next_file.split('.')[0]
|
||||||
|
season = season_ep.split('x')[0]
|
||||||
|
episode = season_ep.split('x')[1]
|
||||||
|
next_ep = '%sx%s' % (season, episode)
|
||||||
|
item = Item(
|
||||||
|
action= 'play_from_library',
|
||||||
|
channel= 'videolibrary',
|
||||||
|
contentEpisodeNumber= episode,
|
||||||
|
contentSeason= season,
|
||||||
|
contentTitle= next_ep,
|
||||||
|
contentType= 'episode',
|
||||||
|
infoLabels= {'episode': episode, 'mediatype': 'episode', 'season': season, 'title': next_ep},
|
||||||
|
strm_path= filetools.join(base_path, next_file),
|
||||||
|
play_from = item.play_from)
|
||||||
|
|
||||||
|
global INFO
|
||||||
|
INFO = filetools.join(path, next_file.replace("strm", "nfo"))
|
||||||
|
else:
|
||||||
|
item=None
|
||||||
|
|
||||||
|
return item
|
||||||
|
|
||||||
|
|
||||||
|
class NextDialog(xbmcgui.WindowXMLDialog):
|
||||||
|
item = None
|
||||||
|
cancel = False
|
||||||
|
EXIT = False
|
||||||
|
continuewatching = True
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.action_exitkeys_id = [xbmcgui.ACTION_STOP, xbmcgui.ACTION_BACKSPACE, xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK]
|
||||||
|
self.progress_control = None
|
||||||
|
|
||||||
|
# set info
|
||||||
|
f = filetools.file_open(INFO, 'r')
|
||||||
|
full_info = f.read().split('\n')
|
||||||
|
full_info = full_info[1:]
|
||||||
|
f.close()
|
||||||
|
full_info = "".join(full_info)
|
||||||
|
info = jsontools.load(full_info)
|
||||||
|
if "thumbnail" in info:
|
||||||
|
img = info["thumbnail"]
|
||||||
|
else:
|
||||||
|
img = filetools.join(config.get_runtime_path(), "resources", "noimage.png")
|
||||||
|
self.setProperty("next_img", img)
|
||||||
|
info = info["infoLabels"]
|
||||||
|
self.setProperty("title", info["tvshowtitle"])
|
||||||
|
self.setProperty("ep_title", "%dx%02d - %s" % (info["season"], info["episode"], info["title"]))
|
||||||
|
|
||||||
|
def set_exit(self, EXIT):
|
||||||
|
self.EXIT = EXIT
|
||||||
|
|
||||||
|
def set_continue_watching(self, continuewatching):
|
||||||
|
self.continuewatching = continuewatching
|
||||||
|
|
||||||
|
def is_exit(self):
|
||||||
|
return self.EXIT
|
||||||
|
|
||||||
|
def onFocus(self, controlId):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def doAction(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def closeDialog(self):
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
def onClick(self, controlId):
|
||||||
|
if controlId == 3012: # Still watching
|
||||||
|
self.set_exit(True)
|
||||||
|
self.set_continue_watching(True)
|
||||||
|
self.close()
|
||||||
|
elif controlId == 3013: # Cancel
|
||||||
|
self.set_exit(True)
|
||||||
|
self.set_continue_watching(False)
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
def onAction(self, action):
|
||||||
|
if action in self.action_exitkeys_id:
|
||||||
|
self.set_exit(True)
|
||||||
|
self.set_continue_watching(False)
|
||||||
|
self.close()
|
||||||
@@ -191,6 +191,14 @@ msgctxt "#30044"
|
|||||||
msgid "Play mode"
|
msgid "Play mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30045"
|
||||||
|
msgid "Resume from:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30046"
|
||||||
|
msgid "Resume from start"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgctxt "#30050"
|
msgctxt "#30050"
|
||||||
msgid "Server connection error"
|
msgid "Server connection error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -223,6 +231,10 @@ msgctxt "#30068"
|
|||||||
msgid "Filter by servers"
|
msgid "Filter by servers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30069"
|
||||||
|
msgid "Priority to quality"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgctxt "#30100"
|
msgctxt "#30100"
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -191,6 +191,14 @@ msgctxt "#30044"
|
|||||||
msgid "Play mode"
|
msgid "Play mode"
|
||||||
msgstr "Modalità di riproduzione"
|
msgstr "Modalità di riproduzione"
|
||||||
|
|
||||||
|
msgctxt "#30045"
|
||||||
|
msgid "Resume from:"
|
||||||
|
msgstr "Riprendi da:"
|
||||||
|
|
||||||
|
msgctxt "#30046"
|
||||||
|
msgid "Resume from start"
|
||||||
|
msgstr "Riprendi dall'inizio"
|
||||||
|
|
||||||
msgctxt "#30050"
|
msgctxt "#30050"
|
||||||
msgid "Server connection error"
|
msgid "Server connection error"
|
||||||
msgstr "Errore connessione server"
|
msgstr "Errore connessione server"
|
||||||
@@ -223,6 +231,10 @@ msgctxt "#30068"
|
|||||||
msgid "Filter by servers"
|
msgid "Filter by servers"
|
||||||
msgstr "Filtra per server"
|
msgstr "Filtra per server"
|
||||||
|
|
||||||
|
msgctxt "#30069"
|
||||||
|
msgid "Priority to quality"
|
||||||
|
msgstr "Priorità alla qualità"
|
||||||
|
|
||||||
msgctxt "#30100"
|
msgctxt "#30100"
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Impostazioni"
|
msgstr "Impostazioni"
|
||||||
@@ -20,7 +20,10 @@
|
|||||||
<setting id="player_mode" type="select" lvalues="30026|30027|30028|30029" label="30044" default="1"/>
|
<setting id="player_mode" type="select" lvalues="30026|30027|30028|30029" label="30044" default="1"/>
|
||||||
<setting id="default_action" type="select" lvalues="30006|30007|30008" label="30005" default="0"/>
|
<setting id="default_action" type="select" lvalues="30006|30007|30008" label="30005" default="0"/>
|
||||||
<setting id="autoplay" type="bool" label="70562" default="false" visible="true"/>
|
<setting id="autoplay" type="bool" label="70562" default="false" visible="true"/>
|
||||||
<setting id="hide_servers" type="bool" label="70747" default="false" visible="eq(-1,true)" subsetting="true"/>
|
<setting id="servers_favorites" visible="eq(-1,true)" subsetting="true" type="action" label="60551" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19mYXZvcml0ZXMiLA0KICAgICJjaGFubmVsIjogInNldHRpbmciDQp9==)"/>
|
||||||
|
<setting id="servers_blacklist" visible="eq(-2,true)" subsetting="true" type="action" label="60550" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19ibGFja2xpc3QiLA0KICAgICJjaGFubmVsIjogInNldHRpbmciDQp9==)"/>
|
||||||
|
|
||||||
|
<!-- <setting id="hide_servers" type="bool" label="70747" default="false" visible="eq(-1,true)" subsetting="true"/> -->
|
||||||
<setting id="checklinks" type="bool" label="30020" default="false"/>
|
<setting id="checklinks" type="bool" label="30020" default="false"/>
|
||||||
<setting id="checklinks_number" type="slider" option="int" range="5,5,20" label="30021" default="5" visible="eq(-1,true)" subsetting="true"/>
|
<setting id="checklinks_number" type="slider" option="int" range="5,5,20" label="30021" default="5" visible="eq(-1,true)" subsetting="true"/>
|
||||||
</category>
|
</category>
|
||||||
@@ -35,9 +38,10 @@
|
|||||||
<setting id="videolibrary_kodi" type="bool" label="70120" default="false"/>
|
<setting id="videolibrary_kodi" type="bool" label="70120" default="false"/>
|
||||||
<setting label="59997" type="lsep"/>
|
<setting label="59997" type="lsep"/>
|
||||||
<setting id="videolibrary_max_quality" type="bool" label="70729" default="false" visible="true"/>
|
<setting id="videolibrary_max_quality" type="bool" label="70729" default="false" visible="true"/>
|
||||||
<setting id="next_ep" type="select" label="70746" lvalues="70752|70747|70748" default="0"/>
|
<setting id="next_ep" type="bool" label="70748" default="true"/>
|
||||||
<setting id="next_ep_type" type="select" label="70754" lvalues="70755|70756|70757" default="0" visible="eq(-1,2)" subsetting="true"/>
|
<setting id="next_ep_type" type="select" label="70754" lvalues="70755|70756|70757" default="0" visible="eq(-1,true)" subsetting="true"/>
|
||||||
<setting id="next_ep_seconds" type="slider" option="int" range="20,10,120" label="70749" default="40" visible="!eq(-2,0)" subsetting="true"/>
|
<setting id="next_ep_seconds" type="slider" option="int" range="20,10,240" label="70749" default="40" visible="eq(-2,true)" subsetting="true"/>
|
||||||
|
<setting id="watched_setting" type="slider" option="int" range="20,5,90" label="60634" default="80"/>
|
||||||
<setting id="trakt_sync" type="bool" label="70109" default="false"/>
|
<setting id="trakt_sync" type="bool" label="70109" default="false"/>
|
||||||
<setting label="30030" type="lsep"/>
|
<setting label="30030" type="lsep"/>
|
||||||
<setting id="vidolibrary_preferences" type="action" label="60542" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAiY2hhbm5lbF9jb25maWciLA0KICAgICJjaGFubmVsIjogInZpZGVvbGlicmFyeSINCn0==)"/>
|
<setting id="vidolibrary_preferences" type="action" label="60542" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAiY2hhbm5lbF9jb25maWciLA0KICAgICJjaGFubmVsIjogInZpZGVvbGlicmFyeSINCn0==)"/>
|
||||||
@@ -63,8 +67,9 @@
|
|||||||
<setting id="hidepremium" type="bool" label="70112" default="false"/>
|
<setting id="hidepremium" type="bool" label="70112" default="false"/>
|
||||||
<setting id="httptools_timeout" type="slider" option="int" range="0,5,120" label="70580" default="15"/>
|
<setting id="httptools_timeout" type="slider" option="int" range="0,5,120" label="70580" default="15"/>
|
||||||
<setting label="70145" type="lsep"/>
|
<setting label="70145" type="lsep"/>
|
||||||
<setting id="servers_favorites" type="action" label="60551" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19mYXZvcml0ZXMiLA0KICAgICJjaGFubmVsIjogInNldHRpbmciDQp9==)"/>
|
<setting id="favorites_servers" type="bool" label="60551" default="false" visible="false"/>
|
||||||
<setting id="servers_blacklist" type="action" label="60550" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19ibGFja2xpc3QiLA0KICAgICJjaGFubmVsIjogInNldHRpbmciDQp9==)"/>
|
<setting id="quality_priority" type="bool" label="30069" default="false" visible="false"/>
|
||||||
|
|
||||||
<setting id="servers_config" type="action" label="60538" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19tZW51IiwNCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiDQp9==)"/>
|
<setting id="servers_config" type="action" label="60538" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19tZW51IiwNCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiDQp9==)"/>
|
||||||
<setting id="debriders_config" type="action" label="60552" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19tZW51IiwNCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLA0KCSJ0eXBlIjogImRlYnJpZGVycyINCn0==)"/>
|
<setting id="debriders_config" type="action" label="60552" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19tZW51IiwNCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLA0KCSJ0eXBlIjogImRlYnJpZGVycyINCn0==)"/>
|
||||||
<setting label="70578" type="lsep"/>
|
<setting label="70578" type="lsep"/>
|
||||||
@@ -158,7 +163,7 @@
|
|||||||
<!-- <setting id="category" type="select" label="70124" lvalues="70137|30123|30124|60513" default="Film" visible="eq(-3,True)+eq(-1,True)+eq(-2,False)" enable="eq(-3,True)+eq(-1,True)+(-2,false)"/> -->
|
<!-- <setting id="category" type="select" label="70124" lvalues="70137|30123|30124|60513" default="Film" visible="eq(-3,True)+eq(-1,True)+eq(-2,False)" enable="eq(-3,True)+eq(-1,True)+(-2,false)"/> -->
|
||||||
<!-- Others -->
|
<!-- Others -->
|
||||||
<setting label="70149" type="lsep"/>
|
<setting label="70149" type="lsep"/>
|
||||||
<setting id="icon_set" type="select" label="70108" values="default|light|dark|alfa|mike" default="default"/>
|
<setting id="icon_set" type="select" label="70108" values="default|light|dark|mike" default="default"/>
|
||||||
<setting id="only_channel_icons" type="bool" label="30009" default="false"/>
|
<setting id="only_channel_icons" type="bool" label="30009" default="false"/>
|
||||||
<setting id="enable_custom_theme" type="bool" label="70564" default="false"/>
|
<setting id="enable_custom_theme" type="bool" label="70564" default="false"/>
|
||||||
<setting id="custom_theme" type="folder" label="70565" default="" visible="eq(-1,true)"/>
|
<setting id="custom_theme" type="folder" label="70565" default="" visible="eq(-1,true)"/>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
<control type="image">
|
<control type="image">
|
||||||
<width>100%</width>
|
<width>100%</width>
|
||||||
<height>100%</height>
|
<height>100%</height>
|
||||||
<texture colordiffuse="FF232323">Shortcut/white.png</texture>
|
<texture colordiffuse="FF232323">white.png</texture>
|
||||||
</control>
|
</control>
|
||||||
<!-- Divider -->
|
<!-- Divider -->
|
||||||
<control type="image">
|
<control type="image">
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
<right>0</right>
|
<right>0</right>
|
||||||
<width>100%</width>
|
<width>100%</width>
|
||||||
<height>1</height>
|
<height>1</height>
|
||||||
<texture colordiffuse="33FFFFFF">Shortcut/white.png</texture>
|
<texture colordiffuse="33FFFFFF">white.png</texture>
|
||||||
</control>
|
</control>
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<control type="label" id="10002">
|
<control type="label" id="10002">
|
||||||
@@ -47,8 +47,8 @@
|
|||||||
<top>25</top>
|
<top>25</top>
|
||||||
<width>30</width>
|
<width>30</width>
|
||||||
<height>30</height>
|
<height>30</height>
|
||||||
<texturefocus colordiffuse="FFFFFFFF">Controls/DialogCloseButton-focus.png</texturefocus>
|
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="55FFFFFF">Controls/DialogCloseButton-focus.png</texturenofocus>
|
<texturenofocus colordiffuse="55FFFFFF">close.png</texturenofocus>
|
||||||
</control>
|
</control>
|
||||||
<!-- OK -->
|
<!-- OK -->
|
||||||
<control type="button" id="10004">
|
<control type="button" id="10004">
|
||||||
@@ -58,8 +58,8 @@
|
|||||||
<height>60</height>
|
<height>60</height>
|
||||||
<textwidth>110</textwidth>
|
<textwidth>110</textwidth>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="FF191919">Shortcut/white.png</texturenofocus>
|
<texturenofocus colordiffuse="FF191919">white.png</texturenofocus>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
<label>$ADDON[plugin.video.kod 70001]</label>
|
<label>$ADDON[plugin.video.kod 70001]</label>
|
||||||
@@ -72,8 +72,8 @@
|
|||||||
<height>60</height>
|
<height>60</height>
|
||||||
<textwidth>110</textwidth>
|
<textwidth>110</textwidth>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="FF191919">Shortcut/white.png</texturenofocus>
|
<texturenofocus colordiffuse="FF191919">white.png</texturenofocus>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
<label>$ADDON[plugin.video.kod 70002]</label>
|
<label>$ADDON[plugin.video.kod 70002]</label>
|
||||||
@@ -86,8 +86,8 @@
|
|||||||
<height>60</height>
|
<height>60</height>
|
||||||
<textwidth>110</textwidth>
|
<textwidth>110</textwidth>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="FF191919">Shortcut/white.png</texturenofocus>
|
<texturenofocus colordiffuse="FF191919">white.png</texturenofocus>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
<label>$ADDON[plugin.video.kod 70003]</label>
|
<label>$ADDON[plugin.video.kod 70003]</label>
|
||||||
@@ -102,7 +102,7 @@
|
|||||||
<top>0</top>
|
<top>0</top>
|
||||||
<left>0</left>
|
<left>0</left>
|
||||||
<width>900</width>
|
<width>900</width>
|
||||||
<height>680</height>
|
<height>580</height>
|
||||||
<font>font20</font>
|
<font>font20</font>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
@@ -116,14 +116,14 @@
|
|||||||
<right>0</right>
|
<right>0</right>
|
||||||
<width>10</width>
|
<width>10</width>
|
||||||
<height>540</height>
|
<height>540</height>
|
||||||
<texture border="2" colordiffuse="FF232323">Shortcut/white.png</texture>
|
<texture border="2" colordiffuse="FF232323">white.png</texture>
|
||||||
</control>
|
</control>
|
||||||
<control type="image" id="10009">
|
<control type="image" id="10009">
|
||||||
<top>120</top>
|
<top>120</top>
|
||||||
<right>0</right>
|
<right>0</right>
|
||||||
<width>10</width>
|
<width>10</width>
|
||||||
<height>540</height>
|
<height>540</height>
|
||||||
<texture border="2" colordiffuse="33FFFFFF">Shortcut/white.png</texture>
|
<texture border="2" colordiffuse="33FFFFFF">white.png</texture>
|
||||||
</control>
|
</control>
|
||||||
</control>
|
</control>
|
||||||
</controls>
|
</controls>
|
||||||
|
|||||||
@@ -12,8 +12,8 @@
|
|||||||
<top>0</top>
|
<top>0</top>
|
||||||
<width>100%</width>
|
<width>100%</width>
|
||||||
<height>100%</height>
|
<height>100%</height>
|
||||||
<texturefocus colordiffuse="80DCDCDC">Shortcut/white.png</texturefocus>
|
<texturefocus colordiffuse="80DCDCDC">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="80DCDCDC">Shortcut/white.png</texturenofocus>
|
<texturenofocus colordiffuse="80DCDCDC">white.png</texturenofocus>
|
||||||
<animation effect="fade" time="200">WindowOpen</animation>
|
<animation effect="fade" time="200">WindowOpen</animation>
|
||||||
<animation effect="fade" time="200">WindowClose</animation>
|
<animation effect="fade" time="200">WindowClose</animation>
|
||||||
<onclick>Action(close)</onclick>
|
<onclick>Action(close)</onclick>
|
||||||
@@ -39,9 +39,9 @@
|
|||||||
<top>219</top>
|
<top>219</top>
|
||||||
<width>1100</width>
|
<width>1100</width>
|
||||||
<height>10</height>
|
<height>10</height>
|
||||||
<texturesliderbackground colordiffuse="FFDCDCDC">Shortcut/white.png</texturesliderbackground>
|
<texturesliderbackground colordiffuse="FFDCDCDC">white.png</texturesliderbackground>
|
||||||
<texturesliderbar colordiffuse="FF1f1f1f">Shortcut/white.png</texturesliderbar>
|
<texturesliderbar colordiffuse="FF1f1f1f">white.png</texturesliderbar>
|
||||||
<texturesliderbarfocus colordiffuse="FF0082C2">Shortcut/white.png</texturesliderbarfocus>
|
<texturesliderbarfocus colordiffuse="FF0082C2">white.png</texturesliderbarfocus>
|
||||||
<showonepage>false</showonepage>
|
<showonepage>false</showonepage>
|
||||||
<orientation>horizontal</orientation>
|
<orientation>horizontal</orientation>
|
||||||
<ondown>32500</ondown>
|
<ondown>32500</ondown>
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
<control type="image">
|
<control type="image">
|
||||||
<width>1100</width>
|
<width>1100</width>
|
||||||
<height>218</height>
|
<height>218</height>
|
||||||
<texture colordiffuse="FFDCDCDC">Shortcut/white.png</texture>
|
<texture colordiffuse="FFDCDCDC">white.png</texture>
|
||||||
</control>
|
</control>
|
||||||
<control type="list" id="32500">
|
<control type="list" id="32500">
|
||||||
<left>-130</left>
|
<left>-130</left>
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
<top>1</top>
|
<top>1</top>
|
||||||
<width>220</width>
|
<width>220</width>
|
||||||
<height>218</height>
|
<height>218</height>
|
||||||
<texture colordiffuse="FF0082C2">Shortcut/white.png</texture>
|
<texture colordiffuse="FF0082C2">white.png</texture>
|
||||||
</control>
|
</control>
|
||||||
<control type="textbox">
|
<control type="textbox">
|
||||||
<left>0</left>
|
<left>0</left>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
<control type="image">
|
<control type="image">
|
||||||
<width>100%</width>
|
<width>100%</width>
|
||||||
<height>100%</height>
|
<height>100%</height>
|
||||||
<texture colordiffuse="FF232323">Shortcut/white.png</texture>
|
<texture colordiffuse="FF232323">white.png</texture>
|
||||||
</control>
|
</control>
|
||||||
<!-- FANART -->
|
<!-- FANART -->
|
||||||
<control type="image" id="10004">
|
<control type="image" id="10004">
|
||||||
@@ -47,8 +47,8 @@
|
|||||||
<top>25</top>
|
<top>25</top>
|
||||||
<width>30</width>
|
<width>30</width>
|
||||||
<height>30</height>
|
<height>30</height>
|
||||||
<texturefocus colordiffuse="FFFFFFFF">Controls/DialogCloseButton-focus.png</texturefocus>
|
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="55FFFFFF">Controls/DialogCloseButton-focus.png</texturenofocus>
|
<texturenofocus colordiffuse="55FFFFFF">close.png</texturenofocus>
|
||||||
</control>
|
</control>
|
||||||
<!-- LOCANDINA -->
|
<!-- LOCANDINA -->
|
||||||
<control type="image" id="10005">
|
<control type="image" id="10005">
|
||||||
@@ -315,8 +315,8 @@
|
|||||||
<width>200</width>
|
<width>200</width>
|
||||||
<height>50</height>
|
<height>50</height>
|
||||||
<textwidth>110</textwidth>
|
<textwidth>110</textwidth>
|
||||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus>
|
<texturenofocus colordiffuse="000081C2">white.png</texturenofocus>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
<label>$ADDON[plugin.video.kod 70005]</label>
|
<label>$ADDON[plugin.video.kod 70005]</label>
|
||||||
@@ -327,8 +327,8 @@
|
|||||||
<width>200</width>
|
<width>200</width>
|
||||||
<height>50</height>
|
<height>50</height>
|
||||||
<textwidth>110</textwidth>
|
<textwidth>110</textwidth>
|
||||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus>
|
<texturenofocus colordiffuse="000081C2">white.png</texturenofocus>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
<label>$ADDON[plugin.video.kod 70006]</label>
|
<label>$ADDON[plugin.video.kod 70006]</label>
|
||||||
@@ -339,8 +339,8 @@
|
|||||||
<width>200</width>
|
<width>200</width>
|
||||||
<height>50</height>
|
<height>50</height>
|
||||||
<textwidth>110</textwidth>
|
<textwidth>110</textwidth>
|
||||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus>
|
<texturenofocus colordiffuse="000081C2">white.png</texturenofocus>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
<label>$ADDON[plugin.video.kod 70002]</label>
|
<label>$ADDON[plugin.video.kod 70002]</label>
|
||||||
@@ -351,8 +351,8 @@
|
|||||||
<width>200</width>
|
<width>200</width>
|
||||||
<height>50</height>
|
<height>50</height>
|
||||||
<textwidth>110</textwidth>
|
<textwidth>110</textwidth>
|
||||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus>
|
<texturenofocus colordiffuse="000081C2">white.png</texturenofocus>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
<label>$ADDON[plugin.video.kod 70007]</label>
|
<label>$ADDON[plugin.video.kod 70007]</label>
|
||||||
|
|||||||
@@ -5,82 +5,60 @@
|
|||||||
<onload>Dialog.Close(videoosd,true)</onload>
|
<onload>Dialog.Close(videoosd,true)</onload>
|
||||||
<controls>
|
<controls>
|
||||||
<control type="group">
|
<control type="group">
|
||||||
|
<top>0</top>
|
||||||
|
<right>0</right>
|
||||||
|
<width>100%</width>
|
||||||
<animation type="WindowOpen" reversible="false">
|
<animation type="WindowOpen" reversible="false">
|
||||||
<effect type="fade" start="0" end="100" time="600" />
|
<effect type="fade" start="0" end="100" time="400" />
|
||||||
<effect type="slide" start="115,0" end="0,0" time="600" />
|
<effect type="slide" start="115,0" end="0,0" time="400" />
|
||||||
</animation>
|
</animation>
|
||||||
<animation type="WindowClose" reversible="false">
|
<animation type="WindowClose" reversible="false">
|
||||||
<effect type="fade" start="100" end="0" time="400" />
|
<effect type="fade" start="100" end="0" time="300" />
|
||||||
<effect type="slide" start="0,0" end="115,0" time="400" />
|
<effect type="slide" start="0,0" end="115,0" time="300" />
|
||||||
</animation>
|
</animation>
|
||||||
<control type="group">
|
<control type="grouplist" id="20">
|
||||||
<right>0</right>
|
<orientation>horizontal</orientation>
|
||||||
<top>15</top>
|
<top>15</top>
|
||||||
<height>40</height>
|
<height>40</height>
|
||||||
<width>100%</width>
|
<itemgap>0</itemgap>
|
||||||
<!-- Background -->
|
<align>right</align>
|
||||||
<control type="image">
|
<control type="button" id="3012">
|
||||||
<top>0</top>
|
<label>$INFO[Window.Property(title)] - $INFO[Window.Property(ep_title)] | $INFO[Player.TimeRemaining(secs),,]</label>
|
||||||
<width>100%</width>
|
|
||||||
<height>40</height>
|
<height>40</height>
|
||||||
<texture colordiffuse="00111111">NextDialog/background-diffuse.png</texture>
|
<width min="50">auto</width>
|
||||||
|
<font>font30_title</font>
|
||||||
|
<textoffsetx>20</textoffsetx>
|
||||||
|
<textcolor>80FFFFFF</textcolor>
|
||||||
|
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||||
|
<selectedcolor>80FFFFFF</selectedcolor>
|
||||||
|
<shadowcolor>22000000</shadowcolor>
|
||||||
|
<aligny>center</aligny>
|
||||||
|
<align>center</align>
|
||||||
|
<texturefocus border="10" colordiffuse="88232323">white.png</texturefocus>
|
||||||
|
<texturenofocus border="10" colordiffuse="88232323">white.png</texturenofocus>
|
||||||
|
<pulseonselect>no</pulseonselect>
|
||||||
</control>
|
</control>
|
||||||
<control type="group">
|
<control type="button" id="3013">
|
||||||
|
<label>$ADDON[plugin.video.kod 60396]</label>
|
||||||
|
<height>40</height>
|
||||||
|
<width min="50">auto</width>
|
||||||
|
<font>font30_title</font>
|
||||||
|
<textoffsetx>20</textoffsetx>
|
||||||
|
<textcolor>80FFFFFF</textcolor>
|
||||||
|
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||||
|
<selectedcolor>80FFFFFF</selectedcolor>
|
||||||
|
<shadowcolor>22000000</shadowcolor>
|
||||||
|
<aligny>center</aligny>
|
||||||
|
<align>center</align>
|
||||||
|
<texturefocus border="10" colordiffuse="88232323">white.png</texturefocus>
|
||||||
|
<texturenofocus border="10" colordiffuse="88232323">white.png</texturenofocus>
|
||||||
|
<pulseonselect>no</pulseonselect>
|
||||||
|
</control>
|
||||||
|
<control type="image">
|
||||||
<top>0</top>
|
<top>0</top>
|
||||||
<right>0</right>
|
<width>30</width>
|
||||||
<width>100%</width>
|
<height>40</height>
|
||||||
<!-- buttons -->
|
<texture colordiffuse="88232323">white.png</texture>
|
||||||
<control type="button" id="3012">
|
|
||||||
<left>-1000</left>
|
|
||||||
<top>-1000</top>
|
|
||||||
<height>1</height>
|
|
||||||
<width>1</width>
|
|
||||||
</control>
|
|
||||||
<control type="grouplist" id="20">
|
|
||||||
<orientation>horizontal</orientation>
|
|
||||||
<height>40</height>
|
|
||||||
<itemgap>0</itemgap>
|
|
||||||
<align>right</align>
|
|
||||||
<control type="button" id="11">
|
|
||||||
<label>$INFO[Window.Property(title)] | $INFO[Window.Property(ep_title)] | $INFO[Player.TimeRemaining(secs),,]</label>
|
|
||||||
<onclick>SendClick(3012)</onclick>
|
|
||||||
<height>40</height>
|
|
||||||
<width min="50">auto</width>
|
|
||||||
<font>font30_title</font>
|
|
||||||
<textoffsetx>20</textoffsetx>
|
|
||||||
<textcolor>80FFFFFF</textcolor>
|
|
||||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
|
||||||
<selectedcolor>80FFFFFF</selectedcolor>
|
|
||||||
<shadowcolor>22000000</shadowcolor>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<texturefocus border="10" colordiffuse="88232323">NextDialog/background-diffuse.png</texturefocus>
|
|
||||||
<texturenofocus border="10" colordiffuse="88232323">NextDialog/background-diffuse.png</texturenofocus>
|
|
||||||
<pulseonselect>no</pulseonselect>
|
|
||||||
</control>
|
|
||||||
<control type="button" id="3013">
|
|
||||||
<label>$ADDON[plugin.video.kod 60396]</label>
|
|
||||||
<height>40</height>
|
|
||||||
<width min="50">auto</width>
|
|
||||||
<font>font30_title</font>
|
|
||||||
<textoffsetx>20</textoffsetx>
|
|
||||||
<textcolor>80FFFFFF</textcolor>
|
|
||||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
|
||||||
<selectedcolor>80FFFFFF</selectedcolor>
|
|
||||||
<shadowcolor>22000000</shadowcolor>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<texturefocus border="10" colordiffuse="88232323">NextDialog/background-diffuse.png</texturefocus>
|
|
||||||
<texturenofocus border="10" colordiffuse="88232323">NextDialog/background-diffuse.png</texturenofocus>
|
|
||||||
<pulseonselect>no</pulseonselect>
|
|
||||||
</control>
|
|
||||||
<control type="image">
|
|
||||||
<top>0</top>
|
|
||||||
<width>30</width>
|
|
||||||
<height>40</height>
|
|
||||||
<texture colordiffuse="88232323">NextDialog/background-diffuse.png</texture>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
</control>
|
||||||
</control>
|
</control>
|
||||||
</control>
|
</control>
|
||||||
|
|||||||
@@ -5,83 +5,63 @@
|
|||||||
<onload>Dialog.Close(videoosd,true)</onload>
|
<onload>Dialog.Close(videoosd,true)</onload>
|
||||||
<controls>
|
<controls>
|
||||||
<control type="group">
|
<control type="group">
|
||||||
|
<top>15</top>
|
||||||
|
<right>0</right>
|
||||||
|
<width>140</width>
|
||||||
|
<height>40</height>
|
||||||
<animation type="WindowOpen" reversible="false">
|
<animation type="WindowOpen" reversible="false">
|
||||||
<effect type="fade" start="0" end="100" time="600" />
|
<effect type="fade" start="0" end="100" time="400" />
|
||||||
<effect type="slide" start="115,0" end="0,0" time="600" />
|
<effect type="slide" start="115,0" end="0,0" time="400" />
|
||||||
</animation>
|
</animation>
|
||||||
<animation type="WindowClose" reversible="false">
|
<animation type="WindowClose" reversible="false">
|
||||||
<effect type="fade" start="100" end="0" time="400" />
|
<effect type="fade" start="100" end="0" time="300" />
|
||||||
<effect type="slide" start="0,0" end="115,0" time="400" />
|
<effect type="slide" start="0,0" end="115,0" time="300" />
|
||||||
</animation>
|
</animation>
|
||||||
<control type="group">
|
<control type="image">
|
||||||
|
<top>0</top>
|
||||||
<right>0</right>
|
<right>0</right>
|
||||||
<top>15</top>
|
|
||||||
<height>50</height>
|
|
||||||
<width>100%</width>
|
<width>100%</width>
|
||||||
<!-- Background -->
|
<height>100%</height>
|
||||||
<control type="image">
|
<texture colordiffuse="80232323">white.png</texture>
|
||||||
<top>0</top>
|
</control>
|
||||||
<width>100%</width>
|
<control type="grouplist" id="20">
|
||||||
|
<orientation>horizontal</orientation>
|
||||||
|
<top>0</top>
|
||||||
|
<right>20</right>
|
||||||
|
<height>40</height>
|
||||||
|
<itemgap>0</itemgap>
|
||||||
|
<align>right</align>
|
||||||
|
<control type="button" id="3012">
|
||||||
|
<label>[B]$INFO[Player.TimeRemaining(secs),,][/B]</label>
|
||||||
<height>40</height>
|
<height>40</height>
|
||||||
<!-- <texture colordiffuse="00111111">NextDialog/button-bg.png</texture> -->
|
<width>80</width>
|
||||||
|
<font>font30_title</font>
|
||||||
|
<textoffsetx>10</textoffsetx>
|
||||||
|
<textcolor>80FFFFFF</textcolor>
|
||||||
|
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||||
|
<selectedcolor>80FFFFFF</selectedcolor>
|
||||||
|
<shadowcolor>22000000</shadowcolor>
|
||||||
|
<aligny>center</aligny>
|
||||||
|
<align>left</align>
|
||||||
|
<texturefocus border="0" colordiffuse="FFFFFFFF">NextDialog/play.png</texturefocus>
|
||||||
|
<texturenofocus border="0" colordiffuse="80FFFFFF">NextDialog/play.png</texturenofocus>
|
||||||
|
<pulseonselect>no</pulseonselect>
|
||||||
</control>
|
</control>
|
||||||
<control type="group">
|
<control type="button" id="3013">
|
||||||
<top>0</top>
|
<label></label>
|
||||||
<right>0</right>
|
<height>40</height>
|
||||||
<width>100%</width>
|
<width>40</width>
|
||||||
<!-- buttons -->
|
<font>font30_title</font>
|
||||||
<control type="button" id="3012">
|
<textoffsetx>30</textoffsetx>
|
||||||
<left>-1000</left>
|
<textcolor>80FFFFFF</textcolor>
|
||||||
<top>-1000</top>
|
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||||
<height>1</height>
|
<selectedcolor>80FFFFFF</selectedcolor>
|
||||||
<width>1</width>
|
<shadowcolor>22000000</shadowcolor>
|
||||||
</control>
|
<aligny>center</aligny>
|
||||||
<control type="grouplist" id="20">
|
<align>center</align>
|
||||||
<orientation>horizontal</orientation>
|
<texturefocus border="10" colordiffuse="FFFFFFFF">NextDialog/close.png</texturefocus>
|
||||||
<height>40</height>
|
<texturenofocus border="10" colordiffuse="80FFFFFF">NextDialog/close.png</texturenofocus>
|
||||||
<itemgap>0</itemgap>
|
<pulseonselect>no</pulseonselect>
|
||||||
<align>right</align>
|
|
||||||
<control type="button" id="11">
|
|
||||||
<label>[B]$INFO[Player.TimeRemaining(secs),,][/B]</label>
|
|
||||||
<onclick>SendClick(3012)</onclick>
|
|
||||||
<!-- <visible>!Integer.IsGreater(Player.TimeRemaining,59)</visible> -->
|
|
||||||
<height>40</height>
|
|
||||||
<width>100</width>
|
|
||||||
<font>font30_title</font>
|
|
||||||
<textoffsetx>12</textoffsetx>
|
|
||||||
<textcolor>80FFFFFF</textcolor>
|
|
||||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
|
||||||
<selectedcolor>80FFFFFF</selectedcolor>
|
|
||||||
<shadowcolor>22000000</shadowcolor>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<align>left</align>
|
|
||||||
<texturefocus border="10">NextDialog/play-fo.png</texturefocus>
|
|
||||||
<texturenofocus border="10">NextDialog/play-nf.png</texturenofocus>
|
|
||||||
<pulseonselect>no</pulseonselect>
|
|
||||||
</control>
|
|
||||||
<control type="button" id="3013">
|
|
||||||
<label></label>
|
|
||||||
<height>40</height>
|
|
||||||
<width>40</width>
|
|
||||||
<font>font30_title</font>
|
|
||||||
<textoffsetx>30</textoffsetx>
|
|
||||||
<textcolor>80FFFFFF</textcolor>
|
|
||||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
|
||||||
<selectedcolor>80FFFFFF</selectedcolor>
|
|
||||||
<shadowcolor>22000000</shadowcolor>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<texturefocus border="10">NextDialog/close-fo.png</texturefocus>
|
|
||||||
<texturenofocus border="10">NextDialog/close-nf.png</texturenofocus>
|
|
||||||
<pulseonselect>no</pulseonselect>
|
|
||||||
</control>
|
|
||||||
<control type="image">
|
|
||||||
<top>0</top>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
<texture>NextDialog/background.png</texture>
|
|
||||||
</control>
|
|
||||||
</control>
|
|
||||||
</control>
|
</control>
|
||||||
</control>
|
</control>
|
||||||
</control>
|
</control>
|
||||||
|
|||||||
@@ -6,12 +6,12 @@
|
|||||||
<controls>
|
<controls>
|
||||||
<control type="group">
|
<control type="group">
|
||||||
<animation type="WindowOpen" reversible="false">
|
<animation type="WindowOpen" reversible="false">
|
||||||
<effect type="fade" start="0" end="100" time="600" />
|
<effect type="fade" start="0" end="100" time="400" />
|
||||||
<effect type="slide" start="115,0" end="0,0" time="600" />
|
<effect type="slide" start="115,0" end="0,0" time="400" />
|
||||||
</animation>
|
</animation>
|
||||||
<animation type="WindowClose" reversible="false">
|
<animation type="WindowClose" reversible="false">
|
||||||
<effect type="fade" start="100" end="0" time="400" />
|
<effect type="fade" start="100" end="0" time="300" />
|
||||||
<effect type="slide" start="0,0" end="115,0" time="400" />
|
<effect type="slide" start="0,0" end="115,0" time="300" />
|
||||||
</animation>
|
</animation>
|
||||||
<control type="group">
|
<control type="group">
|
||||||
<right>30</right>
|
<right>30</right>
|
||||||
@@ -26,59 +26,47 @@
|
|||||||
<height>180</height>
|
<height>180</height>
|
||||||
<texture>$INFO[Window.Property(next_img)]</texture>
|
<texture>$INFO[Window.Property(next_img)]</texture>
|
||||||
</control>
|
</control>
|
||||||
<control type="group">
|
<control type="grouplist" id="20">
|
||||||
<top>0</top>
|
<orientation>vertical</orientation>
|
||||||
|
<height>220</height>
|
||||||
|
<width>326</width>
|
||||||
|
<itemgap>0</itemgap>
|
||||||
<right>0</right>
|
<right>0</right>
|
||||||
<width>100%</width>
|
|
||||||
<!-- buttons -->
|
|
||||||
<control type="button" id="3012">
|
<control type="button" id="3012">
|
||||||
<left>-1000</left>
|
<label></label>
|
||||||
<top>-1000</top>
|
<height>180</height>
|
||||||
<height>1</height>
|
<width>326</width>
|
||||||
<width>1</width>
|
|
||||||
</control>
|
|
||||||
<control type="grouplist" id="20">
|
|
||||||
<orientation>vertical</orientation>
|
|
||||||
<height>220</height>
|
|
||||||
<width>326</width>
|
|
||||||
<itemgap>0</itemgap>
|
|
||||||
<right>0</right>
|
<right>0</right>
|
||||||
<control type="button" id="11">
|
<font>font30_title</font>
|
||||||
<label></label>
|
<textoffsety>20</textoffsety>
|
||||||
<onclick>SendClick(3012)</onclick>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<height>180</height>
|
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||||
<width>326</width>
|
<selectedcolor>FFFFFFFF</selectedcolor>
|
||||||
<right>0</right>
|
<shadowcolor>22000000</shadowcolor>
|
||||||
<font>font30_title</font>
|
<aligny>top</aligny>
|
||||||
<textoffsety>20</textoffsety>
|
<align>center</align>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<texturefocus border="10">NextDialog/background-play.png</texturefocus>
|
||||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
<texturenofocus border="10" colordiffuse="00232323">white.png</texturenofocus>
|
||||||
<selectedcolor>FFFFFFFF</selectedcolor>
|
<pulseonselect>no</pulseonselect>
|
||||||
<shadowcolor>22000000</shadowcolor>
|
|
||||||
<aligny>top</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<texturefocus border="10">NextDialog/background-play.png</texturefocus>
|
|
||||||
<texturenofocus border="10" colordiffuse="00232323">NextDialog/background-diffuse.png</texturenofocus>
|
|
||||||
<pulseonselect>no</pulseonselect>
|
|
||||||
</control>
|
|
||||||
<control type="button" id="3013">
|
|
||||||
<label>$ADDON[plugin.video.kod 60396]</label>
|
|
||||||
<height>40</height>
|
|
||||||
<width>326</width>
|
|
||||||
<font>font30_title</font>
|
|
||||||
<textoffsetx>20</textoffsetx>
|
|
||||||
<textcolor>80FFFFFF</textcolor>
|
|
||||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
|
||||||
<selectedcolor>80FFFFFF</selectedcolor>
|
|
||||||
<shadowcolor>22000000</shadowcolor>
|
|
||||||
<aligny>center</aligny>
|
|
||||||
<align>center</align>
|
|
||||||
<texturefocus border="10" colordiffuse="88232323">NextDialog/background-diffuse.png</texturefocus>
|
|
||||||
<texturenofocus border="10" colordiffuse="88232323">NextDialog/background-diffuse.png</texturenofocus>
|
|
||||||
<pulseonselect>no</pulseonselect>
|
|
||||||
</control>
|
|
||||||
</control>
|
</control>
|
||||||
<control type="label">
|
<control type="button" id="3013">
|
||||||
|
<label>$ADDON[plugin.video.kod 60396]</label>
|
||||||
|
<height>40</height>
|
||||||
|
<width>326</width>
|
||||||
|
<font>font30_title</font>
|
||||||
|
<textoffsetx>20</textoffsetx>
|
||||||
|
<textcolor>80FFFFFF</textcolor>
|
||||||
|
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||||
|
<selectedcolor>FFFFFFFF</selectedcolor>
|
||||||
|
<shadowcolor>22000000</shadowcolor>
|
||||||
|
<aligny>center</aligny>
|
||||||
|
<align>center</align>
|
||||||
|
<texturefocus border="10" colordiffuse="FF0082C2">white.png</texturefocus>
|
||||||
|
<texturenofocus border="10" colordiffuse="FF232323">white.png</texturenofocus>
|
||||||
|
<pulseonselect>no</pulseonselect>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
<control type="label">
|
||||||
<bottom>60</bottom>
|
<bottom>60</bottom>
|
||||||
<height>40</height>
|
<height>40</height>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
@@ -86,12 +74,12 @@
|
|||||||
<align>center</align>
|
<align>center</align>
|
||||||
<scroll>true</scroll>
|
<scroll>true</scroll>
|
||||||
<scrollspeed>50</scrollspeed>
|
<scrollspeed>50</scrollspeed>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<shadowcolor>ff000000</shadowcolor>
|
<shadowcolor>FF000000</shadowcolor>
|
||||||
<info>Window.Property(title)</info>
|
<info>Window.Property(title)</info>
|
||||||
<font>font30_title</font>
|
<font>font30_title</font>
|
||||||
</control>
|
</control>
|
||||||
<control type="label">
|
<control type="label">
|
||||||
<bottom>40</bottom>
|
<bottom>40</bottom>
|
||||||
<height>40</height>
|
<height>40</height>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
@@ -99,26 +87,25 @@
|
|||||||
<align>center</align>
|
<align>center</align>
|
||||||
<scroll>true</scroll>
|
<scroll>true</scroll>
|
||||||
<scrollspeed>50</scrollspeed>
|
<scrollspeed>50</scrollspeed>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<shadowcolor>ff000000</shadowcolor>
|
<shadowcolor>FF000000</shadowcolor>
|
||||||
<info>Window.Property(ep_title)</info>
|
<info>Window.Property(ep_title)</info>
|
||||||
<font>font20_title</font>
|
<font>font20_title</font>
|
||||||
</control>
|
</control>
|
||||||
<control type="label">
|
<control type="label">
|
||||||
<top>20</top>
|
<top>20</top>
|
||||||
<right>25</right>
|
<right>25</right>
|
||||||
<height>auto</height>
|
<height>auto</height>
|
||||||
<aligny>top</aligny>
|
<aligny>top</aligny>
|
||||||
<visible>true</visible>
|
<visible>true</visible>
|
||||||
<align>right</align>
|
<align>right</align>
|
||||||
<scroll>true</scroll>
|
<scroll>true</scroll>
|
||||||
<scrollspeed>50</scrollspeed>
|
<scrollspeed>50</scrollspeed>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<shadowcolor>ff000000</shadowcolor>
|
<shadowcolor>FF000000</shadowcolor>
|
||||||
<info>Player.TimeRemaining(secs),,</info>
|
<info>Player.TimeRemaining(secs),,</info>
|
||||||
<font>font30_title</font>
|
<font>font30_title</font>
|
||||||
</control>
|
</control>
|
||||||
</control>
|
|
||||||
</control>
|
</control>
|
||||||
</control>
|
</control>
|
||||||
</controls>
|
</controls>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
<width>510</width>
|
<width>510</width>
|
||||||
<height>640</height>
|
<height>640</height>
|
||||||
<left>45</left>
|
<left>45</left>
|
||||||
<texture>Shortcut/dialog-bg-solid.png</texture>
|
<texture>Controls/dialog-bg-solid.png</texture>
|
||||||
</control>
|
</control>
|
||||||
<control type="textbox" id="10000">
|
<control type="textbox" id="10000">
|
||||||
<top>30</top>
|
<top>30</top>
|
||||||
@@ -39,8 +39,8 @@
|
|||||||
<textwidth>110</textwidth>
|
<textwidth>110</textwidth>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||||
<texturefocus>Controls/KeyboardKey.png</texturefocus>
|
<texturefocus colordiffuse="FF0082C2">white.png</texturefocus>
|
||||||
<texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus>
|
<texturenofocus colordiffuse="000082C2">white.png</texturenofocus>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
<label>$ADDON[plugin.video.kod 70007]</label>
|
<label>$ADDON[plugin.video.kod 70007]</label>
|
||||||
@@ -57,8 +57,8 @@
|
|||||||
<textwidth>110</textwidth>
|
<textwidth>110</textwidth>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||||
<texturefocus>Controls/KeyboardKey.png</texturefocus>
|
<texturefocus colordiffuse="FF0082C2">white.png</texturefocus>
|
||||||
<texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus>
|
<texturenofocus colordiffuse="000082C2">white.png</texturenofocus>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
<label>$ADDON[plugin.video.kod 707433]</label>
|
<label>$ADDON[plugin.video.kod 707433]</label>
|
||||||
@@ -75,8 +75,8 @@
|
|||||||
<textwidth>110</textwidth>
|
<textwidth>110</textwidth>
|
||||||
<textcolor>FFFFFFFF</textcolor>
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||||
<texturefocus>Controls/KeyboardKey.png</texturefocus>
|
<texturefocus colordiffuse="FF0082C2">white.png</texturefocus>
|
||||||
<texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus>
|
<texturenofocus colordiffuse="000082C2">white.png</texturenofocus>
|
||||||
<align>center</align>
|
<align>center</align>
|
||||||
<aligny>center</aligny>
|
<aligny>center</aligny>
|
||||||
<label>$ADDON[plugin.video.kod 70008]</label>
|
<label>$ADDON[plugin.video.kod 70008]</label>
|
||||||
@@ -96,9 +96,9 @@
|
|||||||
<left>75</left>
|
<left>75</left>
|
||||||
<width>150</width>
|
<width>150</width>
|
||||||
<height>150</height>
|
<height>150</height>
|
||||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||||
<onup>10002</onup>
|
<onup>10002</onup>
|
||||||
<ondown>10008</ondown>
|
<ondown>10008</ondown>
|
||||||
@@ -110,9 +110,9 @@
|
|||||||
<left>225</left>
|
<left>225</left>
|
||||||
<width>150</width>
|
<width>150</width>
|
||||||
<height>150</height>
|
<height>150</height>
|
||||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||||
<onup>10003</onup>
|
<onup>10003</onup>
|
||||||
<ondown>10009</ondown>
|
<ondown>10009</ondown>
|
||||||
@@ -124,9 +124,9 @@
|
|||||||
<left>375</left>
|
<left>375</left>
|
||||||
<width>150</width>
|
<width>150</width>
|
||||||
<height>150</height>
|
<height>150</height>
|
||||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||||
<onup>10004</onup>
|
<onup>10004</onup>
|
||||||
<ondown>10010</ondown>
|
<ondown>10010</ondown>
|
||||||
@@ -138,9 +138,9 @@
|
|||||||
<left>75</left>
|
<left>75</left>
|
||||||
<width>150</width>
|
<width>150</width>
|
||||||
<height>150</height>
|
<height>150</height>
|
||||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||||
<onup>10005</onup>
|
<onup>10005</onup>
|
||||||
<ondown>10011</ondown>
|
<ondown>10011</ondown>
|
||||||
@@ -152,9 +152,9 @@
|
|||||||
<left>225</left>
|
<left>225</left>
|
||||||
<width>150</width>
|
<width>150</width>
|
||||||
<height>150</height>
|
<height>150</height>
|
||||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||||
<onup>10006</onup>
|
<onup>10006</onup>
|
||||||
<ondown>10012</ondown>
|
<ondown>10012</ondown>
|
||||||
@@ -166,9 +166,9 @@
|
|||||||
<left>375</left>
|
<left>375</left>
|
||||||
<width>150</width>
|
<width>150</width>
|
||||||
<height>150</height>
|
<height>150</height>
|
||||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||||
<onup>10007</onup>
|
<onup>10007</onup>
|
||||||
<ondown>10013</ondown>
|
<ondown>10013</ondown>
|
||||||
@@ -180,9 +180,9 @@
|
|||||||
<left>75</left>
|
<left>75</left>
|
||||||
<width>150</width>
|
<width>150</width>
|
||||||
<height>150</height>
|
<height>150</height>
|
||||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||||
<onup>10008</onup>
|
<onup>10008</onup>
|
||||||
<ondown>10002</ondown>
|
<ondown>10002</ondown>
|
||||||
@@ -194,9 +194,9 @@
|
|||||||
<left>225</left>
|
<left>225</left>
|
||||||
<width>150</width>
|
<width>150</width>
|
||||||
<height>150</height>
|
<height>150</height>
|
||||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||||
<onup>10009</onup>
|
<onup>10009</onup>
|
||||||
<ondown>10003</ondown>
|
<ondown>10003</ondown>
|
||||||
@@ -208,9 +208,9 @@
|
|||||||
<left>375</left>
|
<left>375</left>
|
||||||
<width>150</width>
|
<width>150</width>
|
||||||
<height>150</height>
|
<height>150</height>
|
||||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||||
<onup>10010</onup>
|
<onup>10010</onup>
|
||||||
<ondown>10004</ondown>
|
<ondown>10004</ondown>
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<window>
|
||||||
|
<defaultcontrol always="true">20</defaultcontrol>
|
||||||
|
<onload>Dialog.Close(fullscreeninfo,true)</onload>
|
||||||
|
<onload>Dialog.Close(videoosd,true)</onload>
|
||||||
|
<controls>
|
||||||
|
<control type="group">
|
||||||
|
<animation type="WindowOpen" reversible="false">
|
||||||
|
<effect type="fade" start="0" end="100" time="300" />
|
||||||
|
</animation>
|
||||||
|
<animation type="WindowClose" reversible="false">
|
||||||
|
<effect type="fade" start="100" end="0" time="300" />
|
||||||
|
</animation>
|
||||||
|
<right>440</right>
|
||||||
|
<top>320</top>
|
||||||
|
<height>40</height>
|
||||||
|
<width>400</width>
|
||||||
|
<control type="grouplist" id="20">
|
||||||
|
<orientation>vertical</orientation>
|
||||||
|
<height>80</height>
|
||||||
|
<itemgap>0</itemgap>
|
||||||
|
<align>center</align>
|
||||||
|
<control type="button" id="3012">
|
||||||
|
<label>$ADDON[plugin.video.kod 30045] $INFO[Window.Property(time)]</label>
|
||||||
|
<onclick>SendClick(3012)</onclick>
|
||||||
|
<height>40</height>
|
||||||
|
<width>400</width>
|
||||||
|
<font>font30_title</font>
|
||||||
|
<textoffsetx>20</textoffsetx>
|
||||||
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
|
<aligny>center</aligny>
|
||||||
|
<align>center</align>
|
||||||
|
<texturefocus border="10" colordiffuse="FF0082C2">white.png</texturefocus>
|
||||||
|
<texturenofocus border="10" colordiffuse="FF232323">white.png</texturenofocus>
|
||||||
|
<pulseonselect>no</pulseonselect>
|
||||||
|
</control>
|
||||||
|
<control type="button" id="3013">
|
||||||
|
<label>$ADDON[plugin.video.kod 30046]</label>
|
||||||
|
<height>40</height>
|
||||||
|
<width>400</width>
|
||||||
|
<font>font30_title</font>
|
||||||
|
<textoffsetx>20</textoffsetx>
|
||||||
|
<textcolor>FFFFFFFF</textcolor>
|
||||||
|
<aligny>center</aligny>
|
||||||
|
<align>center</align>
|
||||||
|
<texturefocus border="10" colordiffuse="FF0082C2">white.png</texturefocus>
|
||||||
|
<texturenofocus border="10" colordiffuse="FF232323">white.png</texturenofocus>
|
||||||
|
<pulseonselect>no</pulseonselect>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
</controls>
|
||||||
|
</window>
|
||||||
@@ -12,8 +12,8 @@
|
|||||||
<top>0</top>
|
<top>0</top>
|
||||||
<width>100%</width>
|
<width>100%</width>
|
||||||
<height>100%</height>
|
<height>100%</height>
|
||||||
<texturefocus colordiffuse="80232323">Shortcut/white.png</texturefocus>
|
<texturefocus colordiffuse="80232323">white.png</texturefocus>
|
||||||
<texturenofocus colordiffuse="80232323">Shortcut/white.png</texturenofocus>
|
<texturenofocus colordiffuse="80232323">white.png</texturenofocus>
|
||||||
<animation effect="fade" time="200">WindowOpen</animation>
|
<animation effect="fade" time="200">WindowOpen</animation>
|
||||||
<animation effect="fade" time="200">WindowClose</animation>
|
<animation effect="fade" time="200">WindowClose</animation>
|
||||||
<onclick>Action(close)</onclick>
|
<onclick>Action(close)</onclick>
|
||||||
@@ -39,9 +39,9 @@
|
|||||||
<top>219</top>
|
<top>219</top>
|
||||||
<width>1100</width>
|
<width>1100</width>
|
||||||
<height>10</height>
|
<height>10</height>
|
||||||
<texturesliderbackground colordiffuse="FF232323">Shortcut/white.png</texturesliderbackground>
|
<texturesliderbackground colordiffuse="FF232323">white.png</texturesliderbackground>
|
||||||
<texturesliderbar colordiffuse="FF1f1f1f">Shortcut/white.png</texturesliderbar>
|
<texturesliderbar colordiffuse="FF1f1f1f">white.png</texturesliderbar>
|
||||||
<texturesliderbarfocus colordiffuse="FF0082C2">Shortcut/white.png</texturesliderbarfocus>
|
<texturesliderbarfocus colordiffuse="FF0082C2">white.png</texturesliderbarfocus>
|
||||||
<showonepage>false</showonepage>
|
<showonepage>false</showonepage>
|
||||||
<orientation>horizontal</orientation>
|
<orientation>horizontal</orientation>
|
||||||
<ondown>32500</ondown>
|
<ondown>32500</ondown>
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
<control type="image">
|
<control type="image">
|
||||||
<width>1100</width>
|
<width>1100</width>
|
||||||
<height>218</height>
|
<height>218</height>
|
||||||
<texture colordiffuse="FF232323">Shortcut/white.png</texture>
|
<texture colordiffuse="FF232323">white.png</texture>
|
||||||
</control>
|
</control>
|
||||||
<control type="list" id="32500">
|
<control type="list" id="32500">
|
||||||
<left>-130</left>
|
<left>-130</left>
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
<top>1</top>
|
<top>1</top>
|
||||||
<width>220</width>
|
<width>220</width>
|
||||||
<height>218</height>
|
<height>218</height>
|
||||||
<texture colordiffuse="FF0082C2">Shortcut/white.png</texture>
|
<texture colordiffuse="FF0082C2">white.png</texture>
|
||||||
</control>
|
</control>
|
||||||
<control type="textbox">
|
<control type="textbox">
|
||||||
<left>0</left>
|
<left>0</left>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 866 B |
|
Before Width: | Height: | Size: 912 B |
|
Before Width: | Height: | Size: 863 B |