- 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
This commit is contained in:
marco
2020-07-03 23:08:20 +02:00
parent 8b78c88e41
commit 0932a1969f
296 changed files with 3205 additions and 8075 deletions
+6 -4
View File
@@ -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>
+6 -3
View File
@@ -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",
-4
View File
@@ -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
+5 -5
View File
@@ -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()
+3 -3
View File
@@ -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)
+2 -2
View File
@@ -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):
+4 -12
View File
@@ -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)
+2 -2
View File
@@ -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
+13 -29
View File
@@ -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)
-11
View File
@@ -1,11 +0,0 @@
{
"id": "animesubita",
"name": "AnimeSubIta",
"active": false,
"language": ["sub-ita"],
"thumbnail": "animesubita.png",
"bannermenu": "animesubita.png",
"categories": ["anime", "vos"],
"settings": []
}
-123
View File
@@ -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)
-10
View File
@@ -1,10 +0,0 @@
{
"id": "animetubeita",
"name": "AnimeTubeITA",
"active": false,
"language": ["sub-ita"],
"thumbnail": "animetubeita.png",
"bannermenu": "animetubeita.png",
"categories": ["anime","vos"],
"settings": []
}
-137
View File
@@ -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="([^"]+)" >&raquo;'
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="([^"]+)" >&raquo;'
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 &amp; 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)
+4 -15
View File
@@ -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)
+6 -20
View File
@@ -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
+2 -2
View File
@@ -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):
+2 -2
View File
@@ -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):
+3 -3
View File
@@ -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 LINDIRIZZO UFFICIALE','Lista Richieste Up &amp; Re-Up'] Blacklist = ['AVVISO IMPORTANTE CB01.ROCKS', 'Lista Alfabetica Completa Anime/Cartoon', 'CB01.UNO ▶ TROVA LINDIRIZZO UFFICIALE','Lista Richieste Up &amp; 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="([^"]+)"'
+7 -29
View File
@@ -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+(?:&#8211;|-)\s+<a href="?([^" ]+)') folderUrl = scrapertools.find_single_match(data, r'TUTTA LA \w+\s+(?:&#8211;|-)\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*(?:&#215;|×)[0-9]+[^<]+)', '' ,item.url) data = re.sub(r'((?:<p>|<strong>)?[^\d]*\d*(?:&#215;|×)[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)
+2 -2
View File
@@ -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():
+2 -9
View File
@@ -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)
+4 -20
View File
@@ -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)
+2 -8
View File
@@ -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()
+14 -15
View File
@@ -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 -1
View File
@@ -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",
+2 -2
View File
@@ -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]]
+2 -2
View File
@@ -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):
-61
View File
@@ -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"]
}
]
}
-317
View File
@@ -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
+11
View File
@@ -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": []
}
+73
View File
@@ -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)
+11
View File
@@ -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": []
}
+59
View File
@@ -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)
-2
View File
@@ -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):
+2 -2
View File
@@ -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):
+4 -13
View File
@@ -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:
+1 -1
View File
@@ -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"]
} }
+1 -5
View File
@@ -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
-3
View File
@@ -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):
+13
View File
@@ -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
}
+230
View File
@@ -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
+2 -4
View File
@@ -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()
+2 -2
View File
@@ -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}
+6 -14
View File
@@ -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)
+2 -2
View File
@@ -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]]
+36 -53
View File
@@ -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 -1
View File
@@ -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",
+3 -3
View File
@@ -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
+1
View File
@@ -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
} }
+40 -51
View File
@@ -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
+2 -2
View File
@@ -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):
+5 -15
View File
@@ -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>[^"]+)"(?:|.+?)?>(?:&nbsp;&nbsp;)?[ ]?(?P<title>.*?)[ ]?(?P<quality>HD)?[ ]?(?P<year>\d+)?(?: | HD | Streaming | MD(?: iSTANCE)? )?</a>' patron = r'<tr><td><a href="(?P<url>[^"]+)"(?:|.+?)?>(?:&nbsp;&nbsp;)?[ ]?(?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
+50 -62
View File
@@ -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
+7 -11
View File
@@ -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
+5 -11
View File
@@ -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)
+9 -28
View File
@@ -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
+4 -4
View File
@@ -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()
+2 -2
View File
@@ -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
+21 -39
View File
@@ -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
+3 -14
View File
@@ -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 &#x25b6; TROVA L&#8217;INDIRIZZO UFFICIALE ', 'AVVISO IMPORTANTE CB01.UNO', 'GUIDA VEDOHD'] blacklist = ['CB01.UNO &#x25b6; TROVA L&#8217;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)
+23 -37
View File
@@ -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):
+13 -28
View File
@@ -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'],
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+17 -3
View File
@@ -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:
+28 -57
View File
@@ -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.
+45 -38
View File
@@ -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|-|&#8211;|&#215;|×', 'x', scraped['episode'])
ep = ep.replace('-', 'x')
ep = ep.replace('&#8211;', 'x')
ep = ep.replace('&#215;', '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|&#8211|&#215;|×', '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|&#8211|&#215;|×', '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('&amp;', '&',next_page) next_page = next_page.replace('&amp;', '&')
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):
+15 -16
View File
@@ -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")
+759 -1552
View File
File diff suppressed because it is too large Load Diff
+5
View File
@@ -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:
+4
View File
@@ -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'
+58 -150
View File
@@ -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()
+143 -397
View File
@@ -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
+6 -7
View File
@@ -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()
+177 -61
View File
@@ -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"
+12 -7
View File
@@ -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>
+11 -11
View File
@@ -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>
+45 -67
View File
@@ -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>
+34 -34
View File
@@ -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>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 912 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 863 B

Some files were not shown because too many files have changed in this diff Show More