KoD 1.2
- aggiunto nuovo canale: guardaserie.cam - autoplay migliorato, ora i settaggi sono globali e non più per canale - adesso in onda riscritto, ora usa EPG (ringraziamo epg-guide.com) - Riprendi la visione di un film o episodio da server diversi (solo videoteca) - fix e ottimizzazioni varie
10
addon.xml
@@ -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>
|
||||
<!-- <import addon="script.module.libtorrent" optional="true"/> -->
|
||||
<import addon="metadata.themoviedb.org"/>
|
||||
@@ -18,9 +18,11 @@
|
||||
<screenshot>resources/media/themes/ss/2.png</screenshot>
|
||||
<screenshot>resources/media/themes/ss/3.png</screenshot>
|
||||
</assets>
|
||||
<news> - Ottimizzata e migliorata la ricerca globale
|
||||
- fix Mega
|
||||
- altri cambiamenti minori</news>
|
||||
<news> - 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</news>
|
||||
<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]
|
||||
[COLOR yellow]Kodi © is a registered trademark of the XBMC Foundation. We are not connected to or in any other way affiliated with Kodi, Team Kodi, or the XBMC Foundation. Furthermore, any software, addons, or products offered by us will receive no support in official Kodi channels, including the Kodi forums and various social networks.[/COLOR]</disclaimer>
|
||||
|
||||
@@ -24,10 +24,13 @@
|
||||
"filmstreaming01": "https://filmstreaming01.com",
|
||||
"guardaserie_stream": "https://guardaserie.store",
|
||||
"guardaserieclick": "https://www.guardaserie.style",
|
||||
"hd4me": "https://hd4me.net",
|
||||
"ilgeniodellostreaming": "https://ilgeniodellostreaming.tw",
|
||||
"hd4me": "https://hd4me.net",
|
||||
"netfreex": "https://www.netfreex.stream/",
|
||||
"ilgeniodellostreaming": "https://ilgeniodellostreaming.tw",
|
||||
"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",
|
||||
"polpotv": "https://polpotv.club",
|
||||
"pufimovies": "https://pufimovies.com",
|
||||
|
||||
@@ -69,10 +69,6 @@ host = config.get_channel_url(findhost)
|
||||
host = config.get_channel_url()
|
||||
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
|
||||
|
||||
|
||||
@@ -28,8 +28,8 @@ def findhost():
|
||||
host = config.get_channel_url(findhost)
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['mixdrop','vidoza','cloudvideo','vup','supervideo','gounlimited']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
@@ -80,13 +80,13 @@ def genres(item):
|
||||
blacklist = ['Altadefinizione01']
|
||||
if item.args == 'genres':
|
||||
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':
|
||||
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':
|
||||
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
|
||||
return locals()
|
||||
|
||||
@@ -11,8 +11,8 @@ __channel__ = "altadefinizione01_link"
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['mixdrop', 'vup', 'supervideo']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
# =========== home menu ===================
|
||||
@support.menu
|
||||
@@ -102,4 +102,4 @@ def newest(categoria):
|
||||
|
||||
def findvideos(item):
|
||||
support.log('findvideos', item)
|
||||
return support.server(item, headers=headers)
|
||||
return support.server(item, support.match(item, patron='<ul class="playernav">.*?</ul>', headers=headers).match)
|
||||
|
||||
@@ -28,8 +28,8 @@ def findhost():
|
||||
|
||||
host = config.get_channel_url(findhost)
|
||||
headers = [['Referer', host]]
|
||||
list_servers = ['mixdrop', 'vidcloud', 'vidoza', 'supervideo', 'hdload', 'mystream']
|
||||
list_quality = ['1080p', '720p', '360p']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
@@ -7,8 +7,8 @@ from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
|
||||
list_servers = ['directo', 'vvvvid']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
|
||||
headers = [['Referer', host]]
|
||||
@@ -142,10 +142,7 @@ def findvideos(item):
|
||||
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 = url.split()[-1]
|
||||
itemlist.append(
|
||||
support.Item(action= 'play',
|
||||
url= 'https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/' + url,
|
||||
server= 'directo'))
|
||||
itemlist.append(item.clone(action= 'play', url= 'https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/' + url, server= 'directo'))
|
||||
|
||||
elif 'adf.ly' in item.url:
|
||||
from servers.decrypters import adfly
|
||||
@@ -170,11 +167,6 @@ def findvideos(item):
|
||||
elif url.startswith('/'): url = 'https:/' + url
|
||||
|
||||
|
||||
itemlist.append(
|
||||
support.Item(channel=item.channel,
|
||||
action="play",
|
||||
title='Diretto',
|
||||
url=url,
|
||||
server='directo'))
|
||||
itemlist.append(item.clone(action="play", title='Diretto', url=url, server='directo'))
|
||||
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
@@ -11,8 +11,8 @@ host = support.config.get_channel_url()
|
||||
headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'],
|
||||
['Referer', host]]
|
||||
|
||||
list_servers = ['verystream','openload','rapidvideo','streamango']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
|
||||
@@ -9,9 +9,6 @@ host = support.config.get_channel_url()
|
||||
headers={'X-Requested-With': 'XMLHttpRequest'}
|
||||
|
||||
|
||||
list_servers = ['directo', 'fembed', 'animeworld']
|
||||
list_quality = ['default', '480p', '720p', '1080p']
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
@@ -26,9 +23,10 @@ def mainlist(item):
|
||||
@support.scrape
|
||||
def search(item, texto):
|
||||
search = texto
|
||||
# debug = True
|
||||
item.contentType = 'tvshow'
|
||||
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'
|
||||
return locals()
|
||||
|
||||
@@ -53,15 +51,20 @@ def newest(categoria):
|
||||
|
||||
@support.scrape
|
||||
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'
|
||||
item.args = 'top'
|
||||
def itemHook(item2):
|
||||
item2.url = item.url
|
||||
return item2
|
||||
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
anime = True
|
||||
# debug = True
|
||||
|
||||
deflang= 'Sub-ITA'
|
||||
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
|
||||
|
||||
if item.args == 'top':
|
||||
data=item.url
|
||||
patron = r'light">(?P<title2>[^<]+)</div>\s(?P<title>[^<]+)[^>]+>[^>]+>\s<a href="(?P<url>[^"]+)">(?:<a[^>]+>|\s*)<img alt="[^"]+" src="(?P<thumb>[^"]+)"'
|
||||
|
||||
data = item.other
|
||||
patron = r'light">(?P<title2>[^<]+)</div>\s(?P<title>[^<]+)[^>]+>[^>]+>\s<a href="(?P<url>[^"]+)">(?:<a[^>]+>|\s*)<img.*?src="(?P<thumb>[^"]+)"'
|
||||
else:
|
||||
data = support.match(item, post=post, headers=headers).data
|
||||
if item.args == 'updated':
|
||||
@@ -82,22 +84,14 @@ def peliculas(item):
|
||||
action = 'findvideos'
|
||||
def itemlistHook(itemlist):
|
||||
if page:
|
||||
itemlist.append(
|
||||
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()))
|
||||
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'),page= page, thumbnail=support.thumb()))
|
||||
return itemlist
|
||||
else:
|
||||
pagination = ''
|
||||
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>[^<]+)<'
|
||||
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()
|
||||
|
||||
@@ -131,17 +125,7 @@ def findvideos(item):
|
||||
if url:
|
||||
links = support.match(url, patron=r'(?:<source type="[^"]+"\s*src=|file:\s*)"([^"]+)"', headers=headers, debug=False).matches
|
||||
for link in links:
|
||||
itemlist.append(
|
||||
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))
|
||||
itemlist.append(item.clone(action="play", title='Diretto', url=link, server='directo'))
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"id": "animesubita",
|
||||
"name": "AnimeSubIta",
|
||||
"active": false,
|
||||
"language": ["sub-ita"],
|
||||
"thumbnail": "animesubita.png",
|
||||
"bannermenu": "animesubita.png",
|
||||
"categories": ["anime", "vos"],
|
||||
"settings": []
|
||||
}
|
||||
|
||||
@@ -1,123 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per AnimeSubIta
|
||||
# ------------------------------------------------------------
|
||||
|
||||
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = {'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0'}
|
||||
|
||||
list_servers = ['directo']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
anime = ['/lista-anime/',
|
||||
('Ultimi Episodi',['/category/ultimi-episodi/', 'peliculas', 'updated']),
|
||||
('in Corso',['/category/anime-in-corso/', 'peliculas', 'alt']),
|
||||
('Generi',['/generi/', 'genres', 'alt'])]
|
||||
return locals()
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.log(categoria)
|
||||
itemlist = []
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "anime":
|
||||
item.url = host
|
||||
item.args = "updated"
|
||||
itemlist = peliculas(item)
|
||||
|
||||
if itemlist[-1].action == "ultimiep":
|
||||
itemlist.pop()
|
||||
# Continua l'esecuzione in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def search(item, texto):
|
||||
support.log(texto)
|
||||
item.url = host + "/?s=" + texto
|
||||
item.args = 'alt'
|
||||
try:
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
blacklist= ['Anime In Corso','Ultimi Episodi']
|
||||
patronMenu=r'<li><a title="[^"]+" href="(?P<url>[^"]+)">(?P<title>[^<]+)</a>'
|
||||
action = 'peliculas'
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
anime = True
|
||||
if item.args == 'updated':
|
||||
patron = r'<div class="post-thumbnail">\s*<a href="(?P<url>[^"]+)" title="(?P<title>.*?)\s*Episodio (?P<episode>\d+) (?P<lang>[a-zA-Z-\s]+)[^"]*"> <img[^src]+src="(?P<thumb>[^"]+)"'
|
||||
patronNext = r'<link rel="next" href="([^"]+)"\s*/>'
|
||||
action = 'findvideos'
|
||||
elif item.args == 'alt':
|
||||
patron = r'<div class="post-thumbnail">\s*<a href="(?P<url>[^"]+)" title="(?P<title>.*?)(?: [Oo][Aa][Vv])?(?:\s*(?P<lang>[Ss][Uu][Bb].[Ii][Tt][Aa]))[^"]+">\s*<img[^src]+src="(?P<thumb>[^"]+)"'
|
||||
patronNext = r'<link rel="next" href="([^"]+)"\s*/>'
|
||||
action = 'episodios'
|
||||
else:
|
||||
pagination = ''
|
||||
patronBlock = r'<ul class="lcp_catlist"[^>]+>(?P<block>.*?)</ul>'
|
||||
patron = r'<a href="(?P<url>[^"]+)"[^>]+>(?P<title>.*?)(?: [Oo][Aa][Vv])?(?:\s*(?P<lang>[Ss][Uu][Bb].[Ii][Tt][Aa])[^<]+)?</a>'
|
||||
action = 'episodios'
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
anime = True
|
||||
patron = r'<td style="[^"]*?">\s*.*?<strong>(?P<episode>[^<]+)</strong>\s*</td>\s*<td[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>\s*<img src="(?P<thumb>[^"]+?)"[^>]+>'
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
support.log(item)
|
||||
itemlist = []
|
||||
|
||||
if item.args == 'updated':
|
||||
ep = support.match(item.fulltitle, patron=r'(\d+)').match
|
||||
item.url = support.re.sub(r'episodio-\d+-|oav-\d+-'+ep, '',item.url)
|
||||
if 'streaming' not in item.url: item.url = item.url.replace('sub-ita','sub-ita-streaming')
|
||||
item.url = support.match(item, patron= ep + r'[^>]+>[^>]+>[^>]+><a href="([^"]+)"').match
|
||||
|
||||
# post
|
||||
url = host + '/' + support.match(item.url, patron=r'(episodio\d*.php.*?)"').match.replace('%3F','?').replace('%3D','=')
|
||||
headers['Referer'] = url
|
||||
cookies = ""
|
||||
matches = support.re.compile('(.%s.*?)\n' % host.replace("http://", "").replace("www.", ""), support.re.DOTALL).findall(support.config.get_cookie_data())
|
||||
for cookie in matches:
|
||||
cookies += cookie.split('\t')[5] + "=" + cookie.split('\t')[6] + ";"
|
||||
headers['Cookie'] = cookies[:-1]
|
||||
|
||||
url = support.match(url, patron=r'<source src="([^"]+)"[^>]+>').match
|
||||
|
||||
itemlist.append(
|
||||
support.Item(channel=item.channel,
|
||||
action="play",
|
||||
title='Diretto',
|
||||
url=url + '|' + support.urllib.urlencode(headers),
|
||||
server='directo'))
|
||||
|
||||
return support.server(item,itemlist=itemlist)
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"id": "animetubeita",
|
||||
"name": "AnimeTubeITA",
|
||||
"active": false,
|
||||
"language": ["sub-ita"],
|
||||
"thumbnail": "animetubeita.png",
|
||||
"bannermenu": "animetubeita.png",
|
||||
"categories": ["anime","vos"],
|
||||
"settings": []
|
||||
}
|
||||
@@ -1,137 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ----------------------------------------------------------
|
||||
# Canale per animetubeita
|
||||
# ----------------------------------------------------------
|
||||
import re
|
||||
import urllib
|
||||
from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
|
||||
headers = {'Upgrade-Insecure-Requests': '1',
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0'}
|
||||
|
||||
list_servers = ['directo']
|
||||
list_quality = ['default']
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
anime = [('Generi',['/generi', 'genres', 'genres']),
|
||||
('Ordine Alfabetico',['/lista-anime', 'peliculas', 'list']),
|
||||
('In Corso',['/category/serie-in-corso/', 'peliculas', 'in_progress'])
|
||||
]
|
||||
return locals()
|
||||
|
||||
@support.scrape
|
||||
def genres(item):
|
||||
blacklist = ['Ultimi Episodi', 'Serie in Corso']
|
||||
patronMenu = r'<li[^>]+><a href="(?P<url>[^"]+)" >(?P<title>[^<]+)</a>'
|
||||
action = 'peliculas'
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.log(text)
|
||||
item.url = host + '/lista-anime'
|
||||
item.args = 'list'
|
||||
item.search = text
|
||||
try:
|
||||
return peliculas(item)
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
|
||||
def newest(categoria):
|
||||
support.log(categoria)
|
||||
item = support.Item()
|
||||
try:
|
||||
if categoria == "anime":
|
||||
item.contentType='tvshow'
|
||||
item.url = host
|
||||
item.args = "last"
|
||||
return peliculas(item)
|
||||
# Continua la ricerca in caso di errore
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.logger.error("{0}".format(line))
|
||||
return []
|
||||
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
anime = True
|
||||
if not item.search: pagination = ''
|
||||
action = 'episodios'
|
||||
|
||||
if item.args == 'list':
|
||||
search = item.search
|
||||
patronBlock = r'<ul class="page-list ">(?P<block>.*?)<div class="wprc-container'
|
||||
patron = r'<li.*?class="page_.*?href="(?P<url>[^"]+)">(?P<title>.*?) Sub Ita'
|
||||
elif item.args == 'last':
|
||||
action = 'findvideos'
|
||||
item.contentType='episode'
|
||||
patronBlock = r'<div class="blocks">(?P<block>.*?)<div id="sidebar'
|
||||
patron = r'<h2 class="title"><a href="(?P<url>[^"]+)" [^>]+>.*?<img.*?src="(?P<thumb>[^"]+)".*?<strong>Titolo</strong></td>.*?<td>(?P<title>.*?)\s*Episodio\s*(?P<episode>\d+)[^<]+</td>.*?<td><strong>Trama</strong></td>\s*<td>(?P<plot>[^<]+)<'
|
||||
elif item.args in ['in_progress','genres']:
|
||||
patronBlock = r'<div class="blocks">(?P<block>.*?)<div id="sidebar'
|
||||
patron = r'<h2 class="title"><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.*?)\s* Sub Ita[^<]+</a></h2>.*?<img.*?src="(?P<thumb>.*?)".*?<td><strong>Trama</strong></td>.*?<td>(?P<plot>[^<]+)<'
|
||||
patronNext = r'href="([^"]+)" >»'
|
||||
else:
|
||||
patronBlock = r'<div class="blocks">(?P<block>.*?)<div id="sidebar'
|
||||
patron = r'<img.*?src="(?P<thumb>[^"]+)".*?<strong>Titolo</strong></td>.*?<td>\s*(?P<title>.*?)\s*Episodio[^<]+</td>.*?<td><strong>Trama</strong></td>\s*<td>(?P<plot>[^<]+)<.*?<a.*?href="(?P<url>[^"]+)"'
|
||||
patronNext = r'href="([^"]+)" >»'
|
||||
return locals()
|
||||
|
||||
|
||||
@support.scrape
|
||||
def episodios(item):
|
||||
patronBlock = r'<h6>Episodio</h6>(?P<block>.*?)(?:<!--|</table>)'
|
||||
patron = r'<strong>(?P<title>[^<]+)</strong>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><a href="http://link\.animetubeita\.com/2361078/(?P<url>[^"]+)"'
|
||||
action = 'findvideos'
|
||||
return locals()
|
||||
|
||||
|
||||
def findvideos(item):
|
||||
itemlist=[]
|
||||
if item.args == 'last':
|
||||
match = support.match(item, patron=r'href="(?P<url>[^"]+)"[^>]+><strong>DOWNLOAD & STREAMING</strong>').match
|
||||
if match:
|
||||
patronBlock = r'<h6>Episodio</h6>(?P<block>.*?)(?:<!--|</table>)'
|
||||
patron = r'<a href="http://link\.animetubeita\.com/2361078/(?P<url>[^"]+)"'
|
||||
match = support.match(match, patron=patron, patronBlock=patronBlock, headers=headers).match
|
||||
else: return itemlist
|
||||
|
||||
if match: item.url = match[-1]
|
||||
else: return itemlist
|
||||
data = support.httptools.downloadpage(item.url, headers=headers).data
|
||||
cookies = ""
|
||||
matches = re.compile('(.animetubeita.com.*?)\n', re.DOTALL).findall(support.config.get_cookie_data())
|
||||
for cookie in matches:
|
||||
name = cookie.split('\t')[5]
|
||||
value = cookie.split('\t')[6]
|
||||
cookies += name + "=" + value + ";"
|
||||
|
||||
headers['Referer'] = item.url
|
||||
headers['Cookie'] = cookies[:-1]
|
||||
|
||||
url = support.scrapertools.find_single_match(data, """<source src="([^"]+)" type='video/mp4'>""")
|
||||
if not url: url = support.scrapertools.find_single_match(data, 'file: "([^"]+)"')
|
||||
if url:
|
||||
url += '|' + urllib.urlencode(headers)
|
||||
itemlist.append(
|
||||
support.Item(channel=item.channel,
|
||||
action="play",
|
||||
title='diretto',
|
||||
server='directo',
|
||||
quality='',
|
||||
url=url,
|
||||
thumbnail=item.thumbnail,
|
||||
fulltitle=item.fulltitle,
|
||||
show=item.show,
|
||||
contentType=item.contentType,
|
||||
folder=False))
|
||||
return support.server(item, itemlist=itemlist)
|
||||
@@ -7,8 +7,8 @@ from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
|
||||
list_servers = ['mixdrop', 'wstream', 'vupplayer', 'supervideo', 'cloudvideo', 'gounlimited']
|
||||
list_quality = ['default','1080p', '720p', '480p', '360p']
|
||||
|
||||
|
||||
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@@ -61,7 +61,7 @@ def newest(categoria):
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.log({0}.format(line))
|
||||
support.log(line)
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
@@ -108,16 +108,5 @@ def findvideos(item):
|
||||
itemlist = []
|
||||
if item.contentType != 'episode': item.contentType = 'movie'
|
||||
video = support.match(html.data, patron=r'<source src="([^"]+)"').match
|
||||
itemlist.append(
|
||||
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))
|
||||
itemlist.append(item.clone(action="play", title='Diretto', url=video, server='directo'))
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
@@ -3,16 +3,13 @@
|
||||
# Canale per animeworld
|
||||
# ----------------------------------------------------------
|
||||
|
||||
from core import support, jsontools
|
||||
from core import support, jsontools
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
__channel__ = 'animeworld'
|
||||
|
||||
list_servers = ['directo', 'animeworld', 'vvvvid']
|
||||
list_quality = ['default', '480p', '720p', '1080p']
|
||||
|
||||
|
||||
def order():
|
||||
# Seleziona l'ordinamento dei risultati
|
||||
@@ -35,6 +32,7 @@ def genres(item):
|
||||
action = 'peliculas'
|
||||
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>'
|
||||
|
||||
def itemHook(item):
|
||||
item.url = host + '/filter?' + item.name + '=' + item.value + '&sort='
|
||||
return item
|
||||
@@ -45,7 +43,8 @@ def genres(item):
|
||||
def menu(item):
|
||||
action = 'submenu'
|
||||
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):
|
||||
item.title = support.typo('Tutti','bold')
|
||||
item.action = 'peliculas'
|
||||
@@ -57,7 +56,7 @@ def menu(item):
|
||||
@support.scrape
|
||||
def submenu(item):
|
||||
action = 'peliculas'
|
||||
data = item.url
|
||||
data = item.other
|
||||
patronMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)<\/label>'
|
||||
def itemHook(item):
|
||||
item.url = host + '/filter?' + item.name + '=' + item.value + '&language[]=' + item.args + '&sort='
|
||||
@@ -157,20 +156,7 @@ def findvideos(item):
|
||||
|
||||
if serverid == '18':
|
||||
url = support.match('%s/ajax/episode/serverPlayer?id=%s' % (host, ID), patron=r'source src="([^"]+)"', debug=False).match
|
||||
itemlist.append(
|
||||
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))
|
||||
itemlist.append(item.clone(action="play", title='diretto', url=url, server='directo'))
|
||||
|
||||
elif serverid == '26':
|
||||
matches = support.match('%s/ajax/episode/serverPlayer?id=%s' % (host, item.url.split('/')[-1]), patron=r'<a href="([^"]+)"', ).matches
|
||||
|
||||
@@ -10,8 +10,8 @@ from core import support
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['verystream', 'openload', 'wstream', 'speedvideo']
|
||||
list_quality = ['HD', 'SD']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
@@ -32,8 +32,8 @@ from core.item import Item
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['supervideo', 'streamcherry','rapidvideo', 'streamango', 'openload']
|
||||
list_quality = ['default', 'HD', '3D', '4K', 'DVD', 'SD']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
@@ -9,8 +9,8 @@ from core import support
|
||||
host = support.config.get_channel_url() + '/cb01-anime-cartoon'
|
||||
|
||||
Blacklist = ['AVVISO IMPORTANTE – CB01.ROCKS', 'Lista Alfabetica Completa Anime/Cartoon', 'CB01.UNO ▶ TROVA L’INDIRIZZO UFFICIALE','Lista Richieste Up & Re-Up']
|
||||
list_servers = ['verystream', 'openload', 'streamango', 'thevideome']
|
||||
list_quality = ['1080p', '720p', '480p', '360']
|
||||
|
||||
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
@@ -62,7 +62,7 @@ def peliculas(item):
|
||||
blacklist = Blacklist
|
||||
item.contentType = 'tvshow'
|
||||
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:
|
||||
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="([^"]+)"'
|
||||
|
||||
@@ -21,8 +21,8 @@ def findhost():
|
||||
host = config.get_channel_url(findhost)
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['mixdrop', 'akstream', 'wstream', 'backin']
|
||||
list_quality = ['HD', 'SD', 'default']
|
||||
|
||||
|
||||
|
||||
checklinks = config.get_setting('checklinks', 'cineblog01')
|
||||
checklinks_number = config.get_setting('checklinks_number', 'cineblog01')
|
||||
@@ -135,7 +135,7 @@ def episodios(item):
|
||||
data = support.match(item.url, headers=headers).data
|
||||
support.log(data)
|
||||
if 'TUTTA LA ' in data:
|
||||
folderUrl = scrapertools.find_single_match(data, 'TUTTA LA \w+\s+(?:–|-)\s+<a href="?([^" ]+)')
|
||||
folderUrl = scrapertools.find_single_match(data, r'TUTTA LA \w+\s+(?:–|-)\s+<a href="?([^" ]+)')
|
||||
data = httptools.downloadpage(folderUrl).data
|
||||
patron = r'<a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)'
|
||||
sceneTitle = True
|
||||
@@ -181,18 +181,7 @@ def findvideos(item):
|
||||
matches = support.match(streaming, patron = r'<td><a.*?href=([^ ]+) [^>]+>([^<]+)<').matches
|
||||
for scrapedurl, scrapedtitle in matches:
|
||||
logger.debug("##### findvideos %s ## %s ## %s ##" % (desc_txt, scrapedurl, scrapedtitle))
|
||||
itemlist.append(
|
||||
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))
|
||||
itemlist.append(item.clone(action="play", title=scrapedtitle, url=scrapedurl, server=scrapedtitle, quality=quality))
|
||||
|
||||
support.log()
|
||||
|
||||
@@ -213,7 +202,7 @@ def findvideos(item):
|
||||
|
||||
itemlist = support.server(item, itemlist=itemlist)
|
||||
# Extract the quality format
|
||||
patronvideos = '([\w.]+)</strong></div></td>'
|
||||
patronvideos = r'([\w.]+)</strong></div></td>'
|
||||
support.addQualityTag(item, itemlist, data, patronvideos)
|
||||
|
||||
return itemlist
|
||||
@@ -231,24 +220,13 @@ def findvid_serie(item):
|
||||
# Estrae i contenuti
|
||||
matches = support.match(html, patron=r'<a href=(?:")?([^ "]+)[^>]+>(?!<!--)(.*?)(?:</a>|<img)').matches
|
||||
for url, server in matches:
|
||||
item = Item(channel=item.channel,
|
||||
action="play",
|
||||
title=server,
|
||||
url=url,
|
||||
server=server,
|
||||
fulltitle=item.fulltitle,
|
||||
show=item.show,
|
||||
quality=blktxt,
|
||||
contentType=item.contentType,
|
||||
folder=False)
|
||||
item = item.clone(action="play", title=server, url=url, server=server, quality=blktxt)
|
||||
if 'swzz' in item.url: item.url = support.swzz_get_url(item)
|
||||
itemlist.append(item)
|
||||
|
||||
support.log()
|
||||
|
||||
itemlist = []
|
||||
lnkblk = []
|
||||
lnkblkp = []
|
||||
|
||||
data = re.sub(r'((?:<p>|<strong>)?[^\d]*\d*(?:×|Ã)[0-9]+[^<]+)', '' ,item.url)
|
||||
|
||||
@@ -267,4 +245,4 @@ def findvid_serie(item):
|
||||
|
||||
def play(item):
|
||||
support.log()
|
||||
return servertools.find_video_items(data=item.url)
|
||||
return servertools.find_video_items(item, data=item.url)
|
||||
|
||||
@@ -9,8 +9,8 @@ from core import httptools, support, scrapertools
|
||||
from core.item import Item
|
||||
from 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
|
||||
# def findhost():
|
||||
|
||||
@@ -28,7 +28,7 @@ def menu(item):
|
||||
elif 'percorsi' in item.url:
|
||||
patron = r'<div class="cover_percorso">\s*<a href="(?P<url>[^"]+)">\s*<img src="(?P<thumb>[^"]+)"[^>]+>\s*[^>]+>(?P<title>.*?)<'
|
||||
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'
|
||||
return locals()
|
||||
|
||||
@@ -68,14 +68,7 @@ def findvideos(item):
|
||||
matches = support.match(item, patron=r'filename: "(.*?)"').matches
|
||||
|
||||
for url in matches:
|
||||
itemlist.append(
|
||||
Item(
|
||||
channel=item.channel,
|
||||
action="play",
|
||||
title='Diretto',
|
||||
server='directo',
|
||||
url=host + url,
|
||||
folder=False))
|
||||
itemlist.append(item.clone(action="play", title='Diretto', server='directo', url=host + url))
|
||||
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
|
||||
@@ -76,6 +76,7 @@ def newest(categoria):
|
||||
|
||||
@support.scrape
|
||||
def peliculas(item):
|
||||
# debug = True
|
||||
anime = True
|
||||
if 'movie' in item.url:
|
||||
item.contentType = 'movie'
|
||||
@@ -88,7 +89,7 @@ def peliculas(item):
|
||||
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>[^"]+)"'
|
||||
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="([^"]+)">'
|
||||
|
||||
return locals()
|
||||
@@ -120,14 +121,7 @@ def findvideos(item):
|
||||
return episodios(item)
|
||||
|
||||
if 'vvvvid' in matches.data:
|
||||
itemlist.append(
|
||||
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',
|
||||
))
|
||||
itemlist.append(item.clone(action="play", title='VVVVID', url=support.match(matches.data, patron=r'(http://www.vvvvid[^"]+)').match, server='vvvvid'))
|
||||
else:
|
||||
# matches.matches.sort()
|
||||
support.log('VIDEO')
|
||||
@@ -139,17 +133,7 @@ def findvideos(item):
|
||||
language = 'Sub-' + language
|
||||
quality = url.split('/')[-1].split('?')[0]
|
||||
|
||||
itemlist.append(
|
||||
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.append(item.clone(action="play", 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)
|
||||
return support.server(item, itemlist=itemlist)
|
||||
@@ -15,15 +15,9 @@ def findhost():
|
||||
host = support.config.get_channel_url(findhost)
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
list_servers = ['akstream', 'wstream', 'mixdrop', 'vidtome', 'turbovid', 'speedvideo', 'flashx', 'nowvideo', 'deltabit']
|
||||
list_quality = ['default']
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
support.log()
|
||||
|
||||
|
||||
tvshow = []
|
||||
anime = ['/category/anime-cartoni-animati/']
|
||||
mix = [('Aggiornamenti {bullet bold} {TV}', ['/aggiornamento-episodi/', 'peliculas', 'newest']),
|
||||
@@ -37,7 +31,7 @@ def mainlist(item):
|
||||
def peliculas(item):
|
||||
action = 'episodios'
|
||||
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 = ''
|
||||
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>'
|
||||
@@ -55,7 +49,7 @@ def episodios(item):
|
||||
|
||||
def itemHook(item):
|
||||
if not item.url:
|
||||
item.url =''
|
||||
item.url = ''
|
||||
return item
|
||||
|
||||
return locals()
|
||||
|
||||
@@ -23,8 +23,8 @@ from platformcode import config
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
list_servers = ['wstream', 'upstream', 'flashx', 'vidoza', 'vidtome']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
@@ -100,7 +100,6 @@ def genres(item):
|
||||
|
||||
def search(item, text):
|
||||
support.log('search', item)
|
||||
itemlist = []
|
||||
text = text.replace(' ', '+')
|
||||
item.url = host + '?s=' + text
|
||||
try:
|
||||
@@ -133,7 +132,7 @@ def newest(categoria):
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.log('newest log: ', {0}.format(line))
|
||||
support.log('newest log: ', line)
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
@@ -163,16 +162,16 @@ def findvideos(item):
|
||||
titles = support.typo(series.upper().replace('-', ' '), 'bold color kod')
|
||||
goseries = support.typo("Vai alla Serie:", ' bold color kod')
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
title=goseries + titles,
|
||||
fulltitle=titles,
|
||||
show=series,
|
||||
contentType='tvshow',
|
||||
contentSerieName=series,
|
||||
url=host+"/serietv/"+series,
|
||||
action='episodios',
|
||||
contentTitle=titles,
|
||||
plot = "Vai alla Serie " + titles + " con tutte le puntate",
|
||||
))
|
||||
item.clone(channel=item.channel,
|
||||
title=goseries + titles,
|
||||
fulltitle=titles,
|
||||
show=series,
|
||||
contentType='tvshow',
|
||||
contentSerieName=series,
|
||||
url=host+"/serietv/"+series,
|
||||
action='episodios',
|
||||
contentTitle=titles,
|
||||
plot = "Vai alla Serie " + titles + " con tutte le puntate",
|
||||
))
|
||||
|
||||
return itemlist
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "filmigratis",
|
||||
"name": "Filmi Gratis",
|
||||
"active": true,
|
||||
"active": false,
|
||||
"language": ["ita", "sub-ita"],
|
||||
"thumbnail": "filmigratis.png",
|
||||
"banner": "filmigratis.png",
|
||||
|
||||
@@ -19,8 +19,8 @@ from platformcode import config
|
||||
|
||||
host = config.get_channel_url()
|
||||
|
||||
list_servers = ['verystream', 'openload', 'streamango', 'vidoza', 'okru']
|
||||
list_quality = ['1080p', '720p', '480p', '360']
|
||||
|
||||
|
||||
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@ def findhost():
|
||||
|
||||
host = config.get_channel_url(findhost)
|
||||
headers = [['Referer', host]]
|
||||
list_servers = ['mixdrop', 'akvideo', 'wstream', 'onlystream', 'speedvideo']
|
||||
list_quality = ['HD', 'SD']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
{
|
||||
"id": "filmsenzalimiticc",
|
||||
"name": "Filmsenzalimiti CC",
|
||||
"active": false,
|
||||
"language": ["ita"],
|
||||
"thumbnail": "filmsenzalimiticc.png",
|
||||
"banner": "",
|
||||
"categories": ["movie","tvshow"],
|
||||
"settings": [
|
||||
{
|
||||
"id": "include_in_global_search",
|
||||
"type": "bool",
|
||||
"label": "Includi ricerca globale",
|
||||
"default": false,
|
||||
"enabled": false,
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"id": "include_in_newest_peliculas",
|
||||
"type": "bool",
|
||||
"label": "Includi in Novità - Film",
|
||||
"default": true,
|
||||
"enabled": true,
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"id": "include_in_newest_series",
|
||||
"type": "bool",
|
||||
"label": "Includi in Novità - Serie TV",
|
||||
"default": true,
|
||||
"enabled": true,
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"id": "checklinks",
|
||||
"type": "bool",
|
||||
"label": "Verifica se i link esistono",
|
||||
"default": false,
|
||||
"enabled": true,
|
||||
"visible": true
|
||||
},
|
||||
{
|
||||
"id": "checklinks_number",
|
||||
"type": "list",
|
||||
"label": "Numero de link da verificare",
|
||||
"default": 1,
|
||||
"enabled": true,
|
||||
"visible": "eq(-1,true)",
|
||||
"lvalues": [ "1", "3", "5", "10" ]
|
||||
},
|
||||
{
|
||||
"id": "filter_languages",
|
||||
"type": "list",
|
||||
"label": "Mostra link in lingua...",
|
||||
"default": 0,
|
||||
"enabled": true,
|
||||
"visible": true,
|
||||
"lvalues": ["Non filtrare","IT"]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,317 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per Filmsenzalimiti CC
|
||||
# ------------------------------------------------------------
|
||||
import re
|
||||
|
||||
try:
|
||||
import urlparse
|
||||
except:
|
||||
import urllib.parse as urlparse
|
||||
|
||||
from core import scrapertools, servertools, httptools
|
||||
from core import tmdb
|
||||
from core.item import Item
|
||||
from platformcode import config
|
||||
from platformcode import logger
|
||||
from specials import autoplay
|
||||
|
||||
# Necessario per Autoplay
|
||||
host = config.get_channel_url()
|
||||
|
||||
IDIOMAS = {'Italiano': 'IT'}
|
||||
list_language = IDIOMAS.values()
|
||||
list_servers = ['verystream', 'openload', 'vidlox', 'youtube']
|
||||
list_quality = ['default']
|
||||
|
||||
# Necessario per Verifica Link
|
||||
checklinks = config.get_setting('checklinks', 'filmsenzalimiticc')
|
||||
checklinks_number = config.get_setting('checklinks_number', 'filmsenzalimiticc')
|
||||
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
|
||||
def mainlist(item):
|
||||
logger.info('[filmsenzalimiticc.py] mainlist')
|
||||
|
||||
autoplay.init(item.channel, list_servers, list_quality) # Necessario per Autoplay
|
||||
|
||||
# Menu Principale
|
||||
itemlist = [Item(channel=item.channel,
|
||||
action='video',
|
||||
title='Film',
|
||||
url=host,
|
||||
contentType='movie',
|
||||
thumbnail=''),
|
||||
Item(channel=item.channel,
|
||||
action='sottomenu_film',
|
||||
title='Categorie Film',
|
||||
url=host,
|
||||
contentType='movie',
|
||||
thumbnail=''),
|
||||
Item(channel=item.channel,
|
||||
action='video',
|
||||
title='Serie TV',
|
||||
url=host+'/serie-tv/',
|
||||
contentType='tvshow',
|
||||
thumbnail=''),
|
||||
Item(channel=item.channel,
|
||||
action='sottomenu_serie',
|
||||
title='[B]Categorie Serie TV[/B]',
|
||||
thumbnail=''),
|
||||
Item(channel=item.channel,
|
||||
action='search',
|
||||
extra='tvshow',
|
||||
title='[B]Cerca... (non funziona)[/B]',
|
||||
thumbnail='')
|
||||
]
|
||||
|
||||
autoplay.show_option(item.channel, itemlist) # Necessario per Autoplay (Menu Configurazione)
|
||||
|
||||
return itemlist
|
||||
|
||||
def search(item, texto):
|
||||
logger.info('[filmsenzalimiticc.py] search')
|
||||
|
||||
item.url = host + '/?s=' + texto
|
||||
|
||||
try:
|
||||
return video(item)
|
||||
|
||||
# Continua la ricerca in caso di errore .
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
logger.error('%s' % line)
|
||||
return []
|
||||
|
||||
def sottomenu_film(item):
|
||||
logger.info('[filmsenzalimiticc.py] sottomenu_film')
|
||||
itemlist = []
|
||||
|
||||
# Carica la pagina
|
||||
data = httptools.downloadpage(item.url).data
|
||||
|
||||
# Estrae i contenuti
|
||||
patron = "<li><a href='([^']+)'>(.*?)<"
|
||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||
|
||||
for scrapedurl, scrapedtitle in matches:
|
||||
itemlist.append(
|
||||
Item(channel=__channel__,
|
||||
action='video',
|
||||
contentType=item.contentType,
|
||||
title=scrapedtitle,
|
||||
url=scrapedurl))
|
||||
|
||||
# Elimina le Serie al Sottomenù
|
||||
itemlist.pop(3)
|
||||
itemlist.pop(29)
|
||||
itemlist.pop(29)
|
||||
itemlist.pop(32)
|
||||
|
||||
return itemlist
|
||||
|
||||
def sottomenu_serie(item):
|
||||
logger.info('[seriehd.py] sottomenu_serie')
|
||||
itemlist = [
|
||||
Item(channel=item.channel,
|
||||
action='video',
|
||||
title='Serie TV HD',
|
||||
url=host+'/watch-genre/serie-altadefinizione/',
|
||||
contentType='tvshow',
|
||||
thumbnail=''),
|
||||
Item(channel=item.channel,
|
||||
action='video',
|
||||
title='Miniserie',
|
||||
url=host+'/watch-genre/miniserie/',
|
||||
contentType='tvshow',
|
||||
thumbnail=''),
|
||||
Item(channel=item.channel,
|
||||
action='video',
|
||||
title='Programmi TV',
|
||||
url=host+'/watch-genre/programmi-tv/',
|
||||
contentType='tvshow',
|
||||
thumbnail='')
|
||||
]
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
def video(item):
|
||||
logger.info('[filmsenzalimiticc.py] video')
|
||||
itemlist = []
|
||||
|
||||
# Carica la pagina
|
||||
data = httptools.downloadpage(item.url).data.replace('\n','').replace('\t','')
|
||||
|
||||
# Estrae i contenuti
|
||||
patron = r'<div class="mediaWrap mediaWrapAlt">.*?<a href="([^"]+)".*?src="([^"]+)".*?<p>([^"]+) (\(.*?)streaming<\/p>.*?<p>\s*(\S+).*?<\/p>'
|
||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||
|
||||
for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedyear, scrapedquality in matches:
|
||||
scrapedthumbnail = httptools.get_url_headers(scrapedthumbnail)
|
||||
scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle)
|
||||
scrapedyear = scrapertools.decodeHtmlentities(scrapedyear)
|
||||
scrapedquality = scrapertools.decodeHtmlentities(scrapedquality)
|
||||
|
||||
year = scrapedyear.replace('(','').replace(')','')
|
||||
infolabels = {}
|
||||
if year:
|
||||
infolabels['year'] = year
|
||||
|
||||
title = scrapedtitle + ' '+ scrapedyear +' [' + scrapedquality + ']'
|
||||
|
||||
# Seleziona fra Serie TV e Film
|
||||
if item.contentType == 'movie':
|
||||
azione = 'findvideos'
|
||||
tipologia = 'movie'
|
||||
if item.contentType == 'tvshow':
|
||||
azione='episodios'
|
||||
tipologia = 'tv'
|
||||
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
action=azione,
|
||||
contentType=item.contentType,
|
||||
title=title,
|
||||
fulltitle=scrapedtitle,
|
||||
text_color='azure',
|
||||
url=scrapedurl,
|
||||
thumbnail=scrapedthumbnail,
|
||||
infoLabels=infolabels,
|
||||
show=scrapedtitle))
|
||||
|
||||
# Next page
|
||||
next_page = scrapertools.find_single_match(data, '<a class="nextpostslink".*?href="([^"]+)">')
|
||||
|
||||
if next_page != '':
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
action='film',
|
||||
title='[COLOR lightgreen]' + config.get_localized_string(30992) + '[/COLOR]',
|
||||
url=next_page,
|
||||
contentType=item.contentType,
|
||||
thumbnail='http://2.bp.blogspot.com/-fE9tzwmjaeQ/UcM2apxDtjI/AAAAAAAAeeg/WKSGM2TADLM/s1600/pager+old.png'))
|
||||
|
||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||
return itemlist
|
||||
|
||||
|
||||
|
||||
def findvideos(item): # Questa def. deve sempre essere nominata findvideos
|
||||
logger.info('[filmsenzalimiticc.py] findvideos')
|
||||
itemlist = []
|
||||
|
||||
# Carica la pagina
|
||||
data = httptools.downloadpage(item.url, headers=headers).data
|
||||
|
||||
# Aggira protectlink
|
||||
if 'protectlink' in data:
|
||||
urls = scrapertools.find_multiple_matches(data, r'<iframe src="[^=]+=(.*?)"')
|
||||
for url in urls:
|
||||
url= url.decode('base64')
|
||||
if '\t' in url: #fix alcuni link presentano una tabulazione finale.
|
||||
url = url[:-1]
|
||||
data += '\t' + url
|
||||
if 'nodmca' in data: #fix player Openload sezione Serie TV
|
||||
page = httptools.downloadpage(url, headers=headers).data
|
||||
data += '\t' + scrapertools.find_single_match(page,'<meta name="og:url" content="([^=]+)">')
|
||||
|
||||
|
||||
|
||||
itemlist = servertools.find_video_items(data=data)
|
||||
|
||||
for videoitem in itemlist:
|
||||
videoitem.title = item.fulltitle + ' - [[COLOR limegreen]'+videoitem.title+'[/COLOR] ]'
|
||||
videoitem.fulltitle = item.fulltitle
|
||||
videoitem.thumbnail = item.thumbnail
|
||||
videoitem.show = item.show
|
||||
videoitem.plot = item.plot
|
||||
videoitem.channel = item.channel
|
||||
videoitem.contentType = item.contentType
|
||||
|
||||
# Link Aggiungi alla Libreria
|
||||
if item.contentType != 'episode':
|
||||
if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findservers':
|
||||
itemlist.append(
|
||||
Item(channel=item.channel, title='[COLOR lightblue][B]Aggiungi alla videoteca[/B][/COLOR]', url=item.url,
|
||||
action='add_pelicula_to_library', extra='findservers', contentTitle=item.contentTitle))
|
||||
|
||||
# Necessario per FilterTools
|
||||
# itemlist = filtertools.get_links(itemlist, item, list_language)
|
||||
|
||||
# Necessario per AutoPlay
|
||||
autoplay.start(itemlist, item)
|
||||
|
||||
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
|
||||
def episodios(item): # Questa def. deve sempre essere nominata episodios
|
||||
logger.info('[filmsenzalimiticc.py] episodios')
|
||||
itemlist = []
|
||||
|
||||
# Trova le Stagioni
|
||||
|
||||
# Carica la pagina
|
||||
data = httptools.downloadpage(item.url, headers=headers).data
|
||||
|
||||
# Estrae i contenuti
|
||||
patron = r'<iframe src="([^"]+)".*?>'
|
||||
url = scrapertools.find_single_match(data, patron)
|
||||
|
||||
# Carica la pagina
|
||||
data = httptools.downloadpage(url).data.replace('\t', '').replace('\n', '')
|
||||
|
||||
# Estrae i contenuti
|
||||
section_stagione = scrapertools.find_single_match(data, r'Stagioni<\/a>(.*?)<\/ul>')
|
||||
patron = r'<a href="([^"]+)" >.*?<\/i>\s(.*?)<\/a>'
|
||||
seasons = re.compile(patron, re.DOTALL).findall(section_stagione)
|
||||
|
||||
for scrapedseason_url, scrapedseason in seasons:
|
||||
|
||||
# Trova gli Episodi
|
||||
|
||||
season_url = urlparse.urljoin(url, scrapedseason_url)
|
||||
|
||||
# Carica la pagina
|
||||
data = httptools.downloadpage(season_url).data.replace('\t', '').replace('\n', '')
|
||||
|
||||
# Estrae i contenuti
|
||||
section_episodio = scrapertools.find_single_match(data, r'Episodio<\/a>(.*?)<\/ul>')
|
||||
patron = r'<a href="([^"]+)" >.*?<\/i>\s(.*?)<\/a>'
|
||||
episodes = re.compile(patron, re.DOTALL).findall(section_episodio)
|
||||
|
||||
for scrapedepisode_url, scrapedepisode in episodes:
|
||||
episode_url = urlparse.urljoin(url, scrapedepisode_url)
|
||||
|
||||
title = scrapedseason + 'x' + scrapedepisode.zfill(2)
|
||||
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
action='findvideos',
|
||||
contentType='episode',
|
||||
title=title,
|
||||
url=episode_url,
|
||||
fulltitle=title + ' - ' + item.show,
|
||||
show=item.show,
|
||||
thumbnail=item.thumbnail))
|
||||
|
||||
# Link Aggiungi alla Libreria
|
||||
if config.get_videolibrary_support() and len(itemlist) != 0:
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
title='[COLOR lightblue][B]Aggiungi Serie alla videoteca[/B][/COLOR]',
|
||||
url=item.url,
|
||||
action='add_serie_to_library',
|
||||
extra='episodios' + '###' + item.extra,
|
||||
show=item.show))
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
|
||||
11
channels/guardaserieCam.json
Normal 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
channels/guardaserieCam.py
Normal 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
channels/guardaserieIcu.json
Normal 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
channels/guardaserieIcu.py
Normal 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)
|
||||
@@ -22,8 +22,6 @@ from core.support import log
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['speedvideo', 'openload']
|
||||
list_quality = ['default']
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
@@ -9,8 +9,8 @@ from core import httptools, support
|
||||
host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['mega']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
@@ -15,8 +15,8 @@ support.log('HOST',host)
|
||||
# host = 'https://ilcorsaronero.xyz'
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['torrent']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
@@ -51,8 +51,7 @@ def peliculas(item):
|
||||
if item.args[1] in ['tvshow', 'anime', 'music', 'other']:
|
||||
patron = r'>[^"<]+'
|
||||
else:
|
||||
patron = r'>(?P<quality>[^"<]+)'
|
||||
patron += '</td> <TD[^>]+><A class="tab" HREF="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<size>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<seed>[^<]+)'
|
||||
patron = r'>(?P<quality>[^"<]+)</td> <TD[^>]+><A class="tab" HREF="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<size>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<seed>[^<]+)'
|
||||
def itemHook(item):
|
||||
item.contentType = item.args[1]
|
||||
|
||||
@@ -62,21 +61,13 @@ def peliculas(item):
|
||||
def itemlistHook(itemlist):
|
||||
args = item.args
|
||||
args[0] += 1
|
||||
itemlist.append(
|
||||
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()))
|
||||
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), args=args, thumbnail=support.thumb()))
|
||||
return itemlist
|
||||
return locals()
|
||||
|
||||
|
||||
def search(item, text):
|
||||
support.log(item, text)
|
||||
itemlist = []
|
||||
if 'all' in item.args:
|
||||
item.url += text
|
||||
else:
|
||||
|
||||
@@ -6,5 +6,5 @@
|
||||
"thumbnail": "ilgeniodellostreaming.png",
|
||||
"banner": "ilgeniodellostreaming.png",
|
||||
"categories": ["movie", "tvshow", "anime", "vos"],
|
||||
"settings": []
|
||||
"settings": ["include_in_newest_anime"]
|
||||
}
|
||||
|
||||
@@ -7,16 +7,12 @@
|
||||
|
||||
import re
|
||||
|
||||
from core import scrapertools, httptools, support
|
||||
from core import support
|
||||
from core.support import log
|
||||
from core.item import Item
|
||||
from platformcode import config
|
||||
|
||||
host = config.get_channel_url()
|
||||
|
||||
list_servers = ['verystream', 'openload', 'streamango']
|
||||
list_quality = ['default']
|
||||
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@support.menu
|
||||
|
||||
@@ -22,9 +22,6 @@ from platformcode import config
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['speedvideo']
|
||||
list_quality = []
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
13
channels/mediasetplay.json
Normal 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
channels/mediasetplay.py
Normal 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
|
||||
@@ -14,8 +14,8 @@ from xml.dom import minidom
|
||||
host = 'https://metalvideo.com'
|
||||
headers={'X-Requested-With': 'XMLHttpRequest'}
|
||||
|
||||
list_servers = ['youtube']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
@support.scrape
|
||||
def mainlist(item):
|
||||
@@ -38,8 +38,6 @@ def mainlist(item):
|
||||
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)
|
||||
return itemlist
|
||||
return locals()
|
||||
|
||||
@@ -9,8 +9,8 @@ host = support.config.get_channel_url()
|
||||
|
||||
IDIOMAS = {'Italiano': 'IT'}
|
||||
list_language = IDIOMAS.values()
|
||||
list_servers = ['akstream', 'wstream', 'vidtome', 'backin', 'nowvideo', 'verystream']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
headers = {'Referer': host}
|
||||
|
||||
|
||||
@@ -7,16 +7,16 @@ from core import support
|
||||
from core.item import Item
|
||||
from platformcode import logger, config
|
||||
|
||||
def findhost():
|
||||
return 'https://' + support.match('https://netfreex.uno/', patron='value="site:([^"]+)"').match
|
||||
# def findhost():
|
||||
# return 'https://' + support.match('https://netfreex.uno/', patron='value="site:([^"]+)"').match
|
||||
|
||||
host = config.get_channel_url(findhost)
|
||||
host = config.get_channel_url()
|
||||
headers = ""
|
||||
|
||||
IDIOMAS = {'Italiano': 'IT'}
|
||||
list_language = IDIOMAS.values()
|
||||
list_servers = ['wstream']
|
||||
list_quality = ['1080p', 'HD', 'SD', 'CAM']
|
||||
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
@@ -59,15 +59,7 @@ def findvideos(item):
|
||||
if link['title'] != 'Guarda il trailer':
|
||||
logger.info(link['title'])
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
action="play",
|
||||
url=link['url'],
|
||||
fulltitle=item.fulltitle,
|
||||
thumbnail=item.thumbnail,
|
||||
show=item.show,
|
||||
quality=link['title'],
|
||||
contentType=item.contentType,
|
||||
folder=False))
|
||||
item.clone(action="play", url=link['url'], quality=link['title']))
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
|
||||
|
||||
@@ -9,8 +9,8 @@ from core.support import config, log
|
||||
|
||||
host = config.get_channel_url()
|
||||
|
||||
list_servers = ['mixdrop', 'speedvideo', 'gounlimited', 'onlystream', 'youtube']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ host = config.get_channel_url()
|
||||
|
||||
headers = [['Accept', 'application/ld+json']]
|
||||
|
||||
list_servers = ['directo']
|
||||
list_quality = ['1080p','720p','480p','360p']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
@@ -90,18 +90,11 @@ def get_season(item, seas_url, seasonNumber):
|
||||
json_object = jsontools.load(data)
|
||||
for episode in json_object['hydra:member']:
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
action='findvideos',
|
||||
contentType='episode',
|
||||
fulltitle=item.fulltitle,
|
||||
show=item.show,
|
||||
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'])))
|
||||
item.clone(action='findvideos',
|
||||
contentType='episode',
|
||||
title=str(seasonNumber)+"x"+str("%02d"%episode['episodeNumber']),
|
||||
url=seas_url,
|
||||
extra=str(len(json_object['hydra:member'])-episode['episodeNumber'])))
|
||||
return itemlist[::-1]
|
||||
|
||||
def search(item, texto):
|
||||
@@ -135,12 +128,10 @@ def search_movie_by_genre(item):
|
||||
json_object = jsontools.load(data)
|
||||
for genre in json_object['hydra:member']:
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
action="peliculas",
|
||||
title=support.typo(genre['name'],'bold'),
|
||||
contentType='movie',
|
||||
url="%s/api/movies?genres.id=%s" %(host,genre['id']),
|
||||
extra=item.extra))
|
||||
item.clone(action="peliculas",
|
||||
title=support.typo(genre['name'],'bold'),
|
||||
contentType='movie',
|
||||
url="%s/api/movies?genres.id=%s" %(host,genre['id'])))
|
||||
return support.thumb(itemlist, True)
|
||||
|
||||
def search_movie_by_year(item):
|
||||
@@ -150,12 +141,12 @@ def search_movie_by_year(item):
|
||||
itemlist = []
|
||||
for i in range(100):
|
||||
year_to_search = year - i
|
||||
itemlist.append(Item(channel=item.channel,
|
||||
url="%s/api/movies?releaseDate=%s" %(host,year_to_search),
|
||||
plot="1",
|
||||
type="movie",
|
||||
title=support.typo(year_to_search,'bold'),
|
||||
action="peliculas"))
|
||||
itemlist.append(
|
||||
item.clone(channel=item.channel,url="%s/api/movies?releaseDate=%s" %(host,year_to_search),
|
||||
plot="1",
|
||||
type="movie",
|
||||
title=support.typo(year_to_search,'bold'),
|
||||
action="peliculas"))
|
||||
return itemlist
|
||||
|
||||
def findvideos(item):
|
||||
@@ -169,17 +160,12 @@ def findvideos(item):
|
||||
array_index=int(item.extra)
|
||||
for video in json_object['hydra:member'][array_index]['playlist']['videos']:
|
||||
itemlist.append(
|
||||
Item(
|
||||
channel=item.channel,
|
||||
action="play",
|
||||
title='Direct',
|
||||
thumbnail=item.thumbnail,
|
||||
fulltitle = item.fulltitle,
|
||||
search = item.search,
|
||||
url=video['src'],
|
||||
server='directo',
|
||||
quality=str(video['size'])+ 'p',
|
||||
folder=False))
|
||||
item.clone(action="play",
|
||||
title='Direct',
|
||||
url=video['src'],
|
||||
server='directo',
|
||||
quality=str(video['size'])+ 'p',
|
||||
folder=False))
|
||||
except:
|
||||
pass
|
||||
return support.server(item, itemlist=itemlist)
|
||||
@@ -219,22 +205,19 @@ def get_itemlist_element(element,item):
|
||||
next_action='episodios'
|
||||
quality=''
|
||||
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':
|
||||
for item in itemlist:
|
||||
item= support.tmdb.find_and_set_infoLabels(item)
|
||||
support.tmdb.set_infoLabels_itemlist(itemlist)
|
||||
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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "pufimovies",
|
||||
"name": "PufiMovies",
|
||||
"active": true,
|
||||
"active": false,
|
||||
"language": ["ita", "sub-ita"],
|
||||
"thumbnail": "pufimovies.png",
|
||||
"banner": "pufimovies.png",
|
||||
|
||||
@@ -7,8 +7,8 @@ from core import support
|
||||
|
||||
host = support.config.get_channel_url()
|
||||
|
||||
list_servers = ['mixdrop', 'wstream', 'vupplayer', 'supervideo', 'cloudvideo', 'gounlimited']
|
||||
list_quality = ['default','1080p', '720p', '480p', '360p']
|
||||
|
||||
|
||||
|
||||
headers = [['Referer', host]]
|
||||
|
||||
@@ -77,7 +77,7 @@ def newest(categoria):
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
support.log({0}.format(line))
|
||||
support.logger.error("%s" % line)
|
||||
return []
|
||||
|
||||
return itemlist
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"banner": "raiplay.png",
|
||||
"categories": ["movie", "tvshow", "documentary", "live"],
|
||||
"not_active": ["include_in_newest"],
|
||||
"default_off": ["include_in_global_search"],
|
||||
"settings": [],
|
||||
"cloudflare": true
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ------------------------------------------------------------
|
||||
# Canale per SerieHD
|
||||
# Canale per Rai Play
|
||||
# ------------------------------------------------------------
|
||||
|
||||
import requests
|
||||
@@ -17,7 +17,7 @@ onair = host + '/palinsesto/onAir.json'
|
||||
|
||||
@support.menu
|
||||
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'])]
|
||||
|
||||
menu = [('Film {bullet bold}', ['/film/index.json', 'menu']),
|
||||
@@ -39,16 +39,10 @@ def mainlist(item):
|
||||
|
||||
def menu(item):
|
||||
support.log()
|
||||
itemlist = [support.Item(channel= item.channel, title = support.typo('Tutti','bullet bold'),
|
||||
url = item.url, action = 'peliculas'),
|
||||
|
||||
support.Item(channel= item.channel, title = support.typo('Generi','submenu'),
|
||||
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')]
|
||||
itemlist = [item.clone(title = support.typo('Tutti','bullet bold'), 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'),
|
||||
item.clone(title = support.typo('Cerca','submenu'), action = 'search')]
|
||||
|
||||
return support.thumb(itemlist)
|
||||
|
||||
@@ -58,8 +52,8 @@ def learning(item):
|
||||
itemlist =[]
|
||||
json = current_session.get(item.url).json()['contents']
|
||||
for key in json:
|
||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key['name'],'bold'), fulltitle = key['name'], show = key['name'],
|
||||
url = key['contents'], thumbnail = item.thumbnail, action = 'peliculas', args = item.args))
|
||||
itemlist.append(item.clone(title = support.typo(key['name'],'bold'), fulltitle = key['name'],
|
||||
show = key['name'], url = key['contents'], action = 'peliculas'))
|
||||
return itemlist
|
||||
|
||||
|
||||
@@ -71,12 +65,12 @@ def submenu(item):
|
||||
json_url = getUrl(json[-1]['path_id'])
|
||||
json = current_session.get(json_url).json()['contents']
|
||||
for key in json:
|
||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key,'bold'), fulltitle = key, show = key,
|
||||
url = json[key], thumbnail = item.thumbnail, action = 'peliculas', args = item.args))
|
||||
itemlist.append(item.clone(title = support.typo(key,'bold'), fulltitle = key,
|
||||
show = key, url = json[key], action = 'peliculas'))
|
||||
else:
|
||||
for key in json:
|
||||
itemlist.append(support.Item(channel = item.channel, 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))
|
||||
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'))
|
||||
itemlist.pop(-1)
|
||||
return support.thumb(itemlist)
|
||||
|
||||
@@ -97,8 +91,9 @@ def replay_menu(item):
|
||||
today = datetime.date.today()
|
||||
for d in range(7):
|
||||
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"),
|
||||
title = support.typo(days[int(day.strftime("%w"))] + " " + day.strftime("%d") + " " + months[int(day.strftime("%m"))-1], 'bold')))
|
||||
support.log(day)
|
||||
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
|
||||
|
||||
|
||||
@@ -107,8 +102,8 @@ def replay_channels(item):
|
||||
itemlist = []
|
||||
json = current_session.get(item.url).json()['dirette']
|
||||
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',
|
||||
thumbnail = key['transparent-icon'].replace("[RESOLUTION]", "256x-"), url = '%s/palinsesto/app/old/%s/%s.json' % (host, key['channel'].lower().replace(' ','-'), item.date)))
|
||||
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)))
|
||||
return itemlist
|
||||
|
||||
|
||||
@@ -118,15 +113,16 @@ def replay(item):
|
||||
json = current_session.get(item.url).json()[item.fulltitle][0]['palinsesto'][0]['programmi']
|
||||
for key in json:
|
||||
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']),
|
||||
title = support.typo(key['timePublished'], 'color kod bold') + support.typo(' | ' + key['name'], ' bold'), fulltitle = key['name'], show = key['name'], plot = key['testoBreve'], action = 'findvideos'))
|
||||
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'), plot = key['testoBreve'], action = 'findvideos'))
|
||||
return itemlist
|
||||
|
||||
def search(item, text):
|
||||
# support.dbg()
|
||||
support.log()
|
||||
itemlist =[]
|
||||
try:
|
||||
if item.url:
|
||||
if item.url != host:
|
||||
item.search = text
|
||||
itemlist = peliculas(item)
|
||||
else:
|
||||
@@ -134,9 +130,9 @@ def search(item, text):
|
||||
for key in json:
|
||||
for key in json[key]:
|
||||
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',
|
||||
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'])))
|
||||
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']),
|
||||
fanart = getUrl(key['images']['landscape'] if 'landscape' in key['images'] else key['images']['landscape43'])))
|
||||
except:
|
||||
import sys
|
||||
for line in sys.exc_info():
|
||||
@@ -156,15 +152,15 @@ def Type(item):
|
||||
return select(item)
|
||||
|
||||
|
||||
def dirette(item):
|
||||
def live(item):
|
||||
support.log()
|
||||
itemlist =[]
|
||||
json = current_session.get(item.url).json()['dirette']
|
||||
onAir = current_session.get(onair).json()['on_air']
|
||||
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'],
|
||||
thumbnail = key['transparent-icon'].replace("[RESOLUTION]", "256x-"),forcethumb=True , fanart = getUrl(onAir[i]['currentItem']['image']), url = key['video']['contentUrl'],
|
||||
plot = support.typo(onAir[i]['currentItem']['name'],'bold')+ '\n\n' + onAir[i]['currentItem']['description'], action = 'play'))
|
||||
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']),
|
||||
plot = support.typo(onAir[i]['currentItem']['name'],'bold')+ '\n\n' + onAir[i]['currentItem']['description'], action = 'play'))
|
||||
return itemlist
|
||||
|
||||
|
||||
@@ -212,10 +208,7 @@ def peliculas(item):
|
||||
itemlist = sorted(itemlist, key=lambda it: it.title)
|
||||
|
||||
if len(keys) > pag * pagination and not item.search:
|
||||
itemlist.append(support.Item(channel=item.channel, action = item.action, contentType=item.contentType,
|
||||
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()))
|
||||
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), page=pag + 1, thumbnail=support.thumb()))
|
||||
return itemlist
|
||||
|
||||
|
||||
@@ -224,8 +217,7 @@ def select(item):
|
||||
itemlist = []
|
||||
json = current_session.get(item.url).json()['blocks']
|
||||
for key in json:
|
||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(key['name'],'bold'), fulltitle = item.fulltitle,
|
||||
show = item.show, thumbnail = item.thumbnail, url = key['sets'], action = 'episodios', args = item.args))
|
||||
itemlist.append(item.clone(title = support.typo(key['name'],'bold'), url = key['sets'], action = 'episodios'))
|
||||
if len(itemlist) == 1:
|
||||
return episodios(itemlist[0])
|
||||
else:
|
||||
@@ -237,9 +229,7 @@ def episodios(item):
|
||||
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()):
|
||||
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,
|
||||
fanart = item.fanart, url = getUrl(key['path_id']), plot = item.plot, contentType = 'tvshow',
|
||||
action = 'episodios'))
|
||||
itemlist.append(item.clone(title = support.typo(key['name'], 'bold'), url = getUrl(key['path_id']), contentType = 'tvshow', action = 'episodios'))
|
||||
|
||||
elif type(item.url) in [list, dict]:
|
||||
with futures.ThreadPoolExecutor() as executor:
|
||||
@@ -269,9 +259,8 @@ def episodios(item):
|
||||
# title = key['subtitle'].strip()
|
||||
if not title:
|
||||
title = key['name']
|
||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(title, 'bold'), fulltitle = item.fulltitle, show = item.show, thumbnail = item.thumbnail,
|
||||
fanart = getUrl(key['images']['landscape']), url = key['video_url'], plot = key['description'], contentType = 'episode',
|
||||
action = 'findvideos', VL=True if ep else False))
|
||||
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'], contentType = 'episode'))
|
||||
|
||||
if itemlist and itemlist[0].VL: support.videolibrary(itemlist, item)
|
||||
return itemlist
|
||||
@@ -290,8 +279,7 @@ def findvideos(item):
|
||||
else:
|
||||
url = item.url
|
||||
|
||||
itemlist.append(support.Item(channel = item.channel, server = 'directo', title = 'Diretto', fulltitle = item.fulltitle,
|
||||
show = item.show, thumbnail = item.thumbnail, fanart = item.json, url = getUrl(url), action = 'play' ))
|
||||
itemlist.append(item.clone(server = 'directo', title = 'Diretto', fanart = item.json, url = getUrl(url), action = 'play' ))
|
||||
return support.server(item, itemlist=itemlist, Download=False)
|
||||
|
||||
|
||||
@@ -321,8 +309,9 @@ def addinfo(key, item):
|
||||
support.log()
|
||||
info = current_session.get(getUrl(key['info_url'])).json()
|
||||
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'],
|
||||
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'])
|
||||
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'])
|
||||
if 'layout' not in key or key['layout'] == 'single':
|
||||
it.action = 'findvideos'
|
||||
it.contentType = 'movie'
|
||||
@@ -351,9 +340,9 @@ def load_episodes(key, item):
|
||||
if not title:
|
||||
title = key['name']
|
||||
|
||||
itemlist.append(support.Item(channel = item.channel, title = support.typo(title, 'bold'), fulltitle = item.fulltitle, show = item.show, thumbnail = item.thumbnail,
|
||||
fanart = getUrl(key['images']['landscape']), url = key['video_url'], plot = key['description'], contentType = 'episode',
|
||||
action = 'findvideos', VL=True if ep else False, order=order))
|
||||
itemlist.append(item.clone(title = support.typo(title, 'bold'), url = key['video_url'], contentType = 'episode',
|
||||
fanart = getUrl(key['images']['landscape']), plot = key['description'],
|
||||
action = 'findvideos', VL=True if ep else False, order=order))
|
||||
return itemlist
|
||||
|
||||
|
||||
|
||||
@@ -10,8 +10,8 @@ host = support.config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
|
||||
list_servers = ['mixdrop', 'vidoza', 'vcstream', 'gounlimited']
|
||||
list_quality = ['1080p', '720p', '480p', '360']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
|
||||
@@ -28,8 +28,8 @@ def findhost():
|
||||
host = config.get_channel_url(findhost)
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['akvideo', 'wstream', 'backin', 'vidtome', 'nowvideo']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
@@ -64,6 +64,7 @@ def peliculas(item):
|
||||
blacklist = ['DMCA', 'Contatti', 'Attenzione NON FARTI OSCURARE', 'Lista Cartoni Animati e Anime']
|
||||
patronBlock = r'<h1>.+?</h1>(?P<block>.*?)<div class="footer_c">'
|
||||
patronNext = r'<div class="siguiente"><a href="([^"]+)" >'
|
||||
# debug = True
|
||||
|
||||
if item.args == 'search':
|
||||
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
|
||||
|
||||
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">'
|
||||
else:
|
||||
patron = r'<tr><td><a href="(?P<url>[^"]+)"(?:|.+?)?>(?: )?[ ]?(?P<title>.*?)[ ]?(?P<quality>HD)?[ ]?(?P<year>\d+)?(?: | HD | Streaming | MD(?: iSTANCE)? )?</a>'
|
||||
@@ -183,17 +184,6 @@ def findvideos(item):
|
||||
series = support.typo(item.contentSerieName, ' bold color kod')
|
||||
itemlist = support.server(item, data=url_video)
|
||||
|
||||
itemlist.append(
|
||||
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",
|
||||
))
|
||||
itemlist.append(item.clone(title=goseries + series, contentType='tvshow', url=url_serie, action='episodios', plot = goseries + series + "con tutte le puntate"))
|
||||
|
||||
return itemlist
|
||||
|
||||
@@ -17,8 +17,8 @@ headers = [['Referer', host]]
|
||||
|
||||
IDIOMAS = {'Italiano': 'IT'}
|
||||
list_language = IDIOMAS.values()
|
||||
list_servers = ['gounlimited', 'rapidgator', 'uploadedto', 'vidtome']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
@@ -42,7 +42,7 @@ def cleantitle(scrapedtitle):
|
||||
scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle.strip())
|
||||
scrapedtitle = scrapedtitle.replace('[HD]', '').replace('’', '\'').replace('×', 'x').replace('Game of Thrones –','')\
|
||||
.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:
|
||||
scrapedtitle = scrapedtitle.replace('(' + year + ')', '')
|
||||
|
||||
@@ -58,7 +58,7 @@ def findvideos(item):
|
||||
data = re.sub(r'\n|\t|\s+', ' ', data)
|
||||
# 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()
|
||||
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:
|
||||
for fullseasonepisode, season, episode in matches:
|
||||
blocco = blocco.replace(fullseasonepisode + ' ', 'Episodio ' + episode + ' ')
|
||||
@@ -74,7 +74,7 @@ def findvideos(item):
|
||||
if len(matches):
|
||||
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)
|
||||
for keeplinks, id in matches:
|
||||
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
|
||||
title = cleantitle(scrapedtitle)
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
extra=item.extra,
|
||||
action="episodios",
|
||||
title=title,
|
||||
url=scrapedurl,
|
||||
thumbnail=scrapedthumbnail,
|
||||
fulltitle=title,
|
||||
show=title,
|
||||
plot=scrapedplot,
|
||||
contentType='episode',
|
||||
originalUrl=scrapedurl,
|
||||
folder=True))
|
||||
item.clone(action="episodios",
|
||||
title=title,
|
||||
url=scrapedurl,
|
||||
thumbnail=scrapedthumbnail,
|
||||
fulltitle=title,
|
||||
show=title,
|
||||
plot=scrapedplot,
|
||||
contentType='episode',
|
||||
originalUrl=scrapedurl))
|
||||
|
||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||
|
||||
@@ -162,7 +159,7 @@ def episodios(item, itemlist=[]):
|
||||
|
||||
# recupero la stagione
|
||||
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>S' + season.zfill(2) + 'E')
|
||||
matches = scrapertools.find_multiple_matches(blocco, r'(S(\d*)E(\d*))\s')
|
||||
@@ -189,18 +186,15 @@ def episodios(item, itemlist=[]):
|
||||
infoLabels['episode'] = episode
|
||||
fullepisode += ' ' + support.typo("Sub-ITA", '_ [] color kod')
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
extra=item.extra,
|
||||
action="findvideos",
|
||||
fulltitle=scrapedtitle,
|
||||
show=scrapedtitle,
|
||||
title=fullepisode,
|
||||
url=scrapedurl,
|
||||
thumbnail=scrapedthumbnail,
|
||||
plot=scrapedplot,
|
||||
contentSerieName=title,
|
||||
infoLabels=infoLabels,
|
||||
folder=True))
|
||||
item.clone(action="findvideos",
|
||||
fulltitle=scrapedtitle,
|
||||
show=scrapedtitle,
|
||||
title=fullepisode,
|
||||
url=scrapedurl,
|
||||
thumbnail=scrapedthumbnail,
|
||||
plot=scrapedplot,
|
||||
contentSerieName=title,
|
||||
infoLabels=infoLabels))
|
||||
|
||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||
|
||||
@@ -224,7 +218,7 @@ def peliculas_tv(item):
|
||||
log()
|
||||
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)
|
||||
matches = html.matches
|
||||
@@ -249,18 +243,16 @@ def peliculas_tv(item):
|
||||
infoLabels['episode'] = episode[2].zfill(2)
|
||||
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
action="findvideos",
|
||||
fulltitle=scrapedtitle,
|
||||
show=scrapedtitle,
|
||||
title=title + " - " + episode[0] + " " + support.typo("Sub-ITA", '_ [] color kod'),
|
||||
url=scrapedurl,
|
||||
thumbnail=scrapedthumbnail,
|
||||
contentSerieName=title,
|
||||
contentLanguage='Sub-ITA',
|
||||
plot=scrapedplot,
|
||||
infoLabels=infoLabels,
|
||||
folder=True))
|
||||
item.clone(action="findvideos",
|
||||
fulltitle=scrapedtitle,
|
||||
show=scrapedtitle,
|
||||
title=title + " - " + episode[0] + " " + support.typo("Sub-ITA", '_ [] color kod'),
|
||||
url=scrapedurl,
|
||||
thumbnail=scrapedthumbnail,
|
||||
contentSerieName=title,
|
||||
contentLanguage='Sub-ITA',
|
||||
plot=scrapedplot,
|
||||
infoLabels=infoLabels))
|
||||
|
||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||
|
||||
@@ -301,7 +293,7 @@ def search(item, texto):
|
||||
log(texto)
|
||||
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
|
||||
for i, (scrapedurl, scrapedtitle) in enumerate(matches):
|
||||
if texto.upper() in scrapedtitle.upper():
|
||||
@@ -309,18 +301,15 @@ def search(item, texto):
|
||||
scrapedplot = ""
|
||||
title = cleantitle(scrapedtitle)
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
extra=item.extra,
|
||||
action="episodios",
|
||||
title=title,
|
||||
url=scrapedurl,
|
||||
thumbnail=scrapedthumbnail,
|
||||
fulltitle=title,
|
||||
show=title,
|
||||
plot=scrapedplot,
|
||||
contentType='episode',
|
||||
originalUrl=scrapedurl,
|
||||
folder=True))
|
||||
item.clone(action="episodios",
|
||||
title=title,
|
||||
url=scrapedurl,
|
||||
thumbnail=scrapedthumbnail,
|
||||
fulltitle=title,
|
||||
show=title,
|
||||
plot=scrapedplot,
|
||||
contentType='episode',
|
||||
originalUrl=scrapedurl))
|
||||
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
|
||||
|
||||
return itemlist
|
||||
@@ -336,7 +325,7 @@ def list_az(item):
|
||||
itemlist = []
|
||||
|
||||
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
|
||||
for i, (scrapedurl, scrapedtitle) in enumerate(matches):
|
||||
letter = scrapedtitle[0].upper()
|
||||
@@ -346,11 +335,10 @@ def list_az(item):
|
||||
|
||||
for letter in sorted(alphabet):
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
action="lista_serie",
|
||||
url='\n\n'.join(alphabet[letter]),
|
||||
title=letter,
|
||||
fulltitle=letter))
|
||||
item.clone(action="lista_serie",
|
||||
url='\n\n'.join(alphabet[letter]),
|
||||
title=letter,
|
||||
fulltitle=letter))
|
||||
|
||||
return itemlist
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@ from platformcode import config
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['speedvideo']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
@@ -122,14 +122,10 @@ def findvideos(item):
|
||||
itemlist = support.server(item, data=urls_video)
|
||||
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
title=support.typo("Vai alla Serie Completa: " + item.fulltitle, ' bold'),
|
||||
fulltitle=item.fulltitle,
|
||||
show=item.show,
|
||||
contentType='tvshow',
|
||||
url=url_serie,
|
||||
action='episodios',
|
||||
thumbnail = support.thumb(thumb='tvshow.png')
|
||||
))
|
||||
item.colone(title=support.typo("Vai alla Serie Completa: " + item.fulltitle, ' bold'),
|
||||
contentType='tvshow',
|
||||
url=url_serie,
|
||||
action='episodios',
|
||||
thumbnail = support.thumb(thumb='tvshow.png')))
|
||||
|
||||
return itemlist
|
||||
|
||||
@@ -13,8 +13,8 @@ else:
|
||||
from urllib import unquote
|
||||
|
||||
|
||||
list_servers = ['verystream', 'openload', 'wstream']
|
||||
list_quality = ['1080p', 'HD', 'DVDRIP', 'SD', 'CAM']
|
||||
|
||||
|
||||
|
||||
def findhost():
|
||||
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
|
||||
for url, quality in matches:
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
action="play",
|
||||
url=unquote(support.match(url, patron=[r'dest=([^"]+)"',r'/(http[^"]+)">Click']).match),
|
||||
fulltitle=item.fulltitle,
|
||||
thumbnail=item.thumbnail,
|
||||
show=item.show,
|
||||
quality=quality,
|
||||
contentType=item.contentType,
|
||||
folder=False))
|
||||
item.clone(caction="play",
|
||||
url=unquote(support.match(url, patron=[r'dest=([^"]+)"',r'/(http[^"]+)">Click']).match),
|
||||
quality=quality))
|
||||
|
||||
return support.server(item, itemlist=itemlist)
|
||||
|
||||
@@ -11,8 +11,8 @@ la lista delle pagine non sarà affatto 'uniforme' (a seconda di come viene pres
|
||||
|
||||
host = config.get_channel_url()
|
||||
headers = [['Referer', 'org.telegram.messenger']]
|
||||
list_servers = ['directo']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
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
|
||||
season = season.split('-')[0]
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
action="findvideos",
|
||||
title=str(int(season)) + 'x' + str(n) + support.typo(item.quality, '-- [] color kod'),
|
||||
url=url,
|
||||
fulltitle=item.fulltitle,
|
||||
thumbnail=item.thumbnail,
|
||||
show=item.show,
|
||||
quality=item.quality,
|
||||
contentType='episode',
|
||||
folder=True,
|
||||
args={'id': id, 'season': season, 'episode': episode}))
|
||||
item.clone(action="findvideos",
|
||||
title=str(int(season)) + 'x' + str(n) + support.typo(item.quality, '-- [] color kod'),
|
||||
url=url,
|
||||
contentType='episode',
|
||||
folder=True,
|
||||
args={'id': id, 'season': season, 'episode': episode}))
|
||||
|
||||
support.videolibrary(itemlist, item)
|
||||
return itemlist
|
||||
@@ -154,21 +149,7 @@ def findvideos(item):
|
||||
|
||||
if res:
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
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)
|
||||
item.clone(action="play", title='contentful', url=res, server='directo'))
|
||||
else:
|
||||
# google drive...
|
||||
pass
|
||||
|
||||
@@ -19,8 +19,8 @@ def findhost():
|
||||
|
||||
host = config.get_channel_url(findhost)
|
||||
headers = [['Referer', host]]
|
||||
list_servers = ['verystream', 'openload', 'streamango', 'vidlox', 'youtube']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
@@ -58,13 +58,13 @@ def peliculas(item):
|
||||
# support.regexDbg(item, patron, headers)
|
||||
else:
|
||||
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 \-\->'
|
||||
|
||||
# if item.args != 'all' and item.args != 'search':
|
||||
# action = 'findvideos' if item.extra == 'movie' else 'episodios'
|
||||
# item.contentType = 'movie' if item.extra == 'movie' else 'tvshow'
|
||||
#debug = True
|
||||
# debug = True
|
||||
return locals()
|
||||
|
||||
|
||||
|
||||
@@ -9,8 +9,8 @@ host = support.config.get_channel_url()
|
||||
|
||||
headers = [['Referer', host]]
|
||||
|
||||
list_servers = ['wstream', 'openload', 'streamango']
|
||||
list_quality = ['HD', 'default']
|
||||
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
|
||||
@@ -13,8 +13,8 @@ from xml.dom import minidom
|
||||
|
||||
host = 'http://api.radiotime.com'
|
||||
headers = [['Referer', host]]
|
||||
list_servers = ['directo']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
@support.scrape
|
||||
def mainlist(item):
|
||||
@@ -27,14 +27,7 @@ def mainlist(item):
|
||||
return item
|
||||
def itemlistHook(itemlist):
|
||||
itemlist.append(
|
||||
support.Item(
|
||||
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)
|
||||
item.clone(title=support.typo('Cerca...', 'bold color kod'), action='search', thumbnail=support.thumb(thumb='search.png')))
|
||||
support.channel_config(item, itemlist)
|
||||
return itemlist
|
||||
return locals()
|
||||
@@ -47,16 +40,12 @@ def radio(item):
|
||||
if data.matches:
|
||||
for title, location, url, quality, song, type, thumbnail in data.matches:
|
||||
itemlist.append(
|
||||
support.Item(
|
||||
channel = item.channel,
|
||||
title = support.typo(title, 'bold') + support.typo(quality + ' kbps','_ [] bold color kod'),
|
||||
thumbnail = thumbnail,
|
||||
url = url,
|
||||
contentType = 'music',
|
||||
plot = support.typo(location, 'bold') + '\n' + song,
|
||||
action = 'findvideos'
|
||||
)
|
||||
)
|
||||
item.clone(title = support.typo(title, 'bold') + support.typo(quality + ' kbps','_ [] bold color kod'),
|
||||
thumbnail = thumbnail,
|
||||
url = url,
|
||||
contentType = 'music',
|
||||
plot = support.typo(location, 'bold') + '\n' + song,
|
||||
action = 'findvideos'))
|
||||
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
|
||||
if matches:
|
||||
@@ -64,29 +53,22 @@ def radio(item):
|
||||
infoLabels={}
|
||||
infoLabels['duration'] = duration
|
||||
itemlist.append(
|
||||
support.Item(
|
||||
channel = item.channel,
|
||||
title = support.typo(title, 'bold'),
|
||||
thumbnail = thumbnail,
|
||||
infolLbels = infoLabels,
|
||||
url = url,
|
||||
contentType = 'music',
|
||||
plot = plot,
|
||||
action = 'findvideos'
|
||||
)
|
||||
)
|
||||
item.clone(title = support.typo(title, 'bold'),
|
||||
thumbnail = thumbnail,
|
||||
infolLbels = infoLabels,
|
||||
url = url,
|
||||
contentType = 'music',
|
||||
plot = plot,
|
||||
action = 'findvideos'))
|
||||
else:
|
||||
matches = support.match(data.data, patron= r'text="(?P<title>[^"]+)" URL="(?P<url>[^"]+)"').matches
|
||||
for title, url in matches:
|
||||
itemlist.append(
|
||||
support.Item(
|
||||
channel = item.channel,
|
||||
title = support.typo(title, 'bold'),
|
||||
thumbnail = item.thumbnail,
|
||||
url = url,
|
||||
action = 'radio'
|
||||
)
|
||||
)
|
||||
item.clone(channel = item.channel,
|
||||
title = support.typo(title, 'bold'),
|
||||
thumbnail = item.thumbnail,
|
||||
url = url,
|
||||
action = 'radio'))
|
||||
return itemlist
|
||||
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ headers = ""
|
||||
|
||||
IDIOMAS = {'Italiano': 'IT'}
|
||||
list_language = IDIOMAS.values()
|
||||
list_servers = ['verystream', 'openload', 'streamango', 'wstream']
|
||||
list_quality = ['HD', 'SD']
|
||||
|
||||
|
||||
|
||||
#esclusione degli articoli 'di servizio'
|
||||
blacklist = ['CB01.UNO ▶ TROVA L’INDIRIZZO UFFICIALE ', 'AVVISO IMPORTANTE – CB01.UNO', 'GUIDA VEDOHD']
|
||||
@@ -52,18 +52,7 @@ def findvideos(item):
|
||||
title = server + " [COLOR blue][" + quality + "][/COLOR]"
|
||||
else:
|
||||
title = server
|
||||
itemlist.append(
|
||||
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))
|
||||
itemlist.append(item.clone(action="play", title=title, url=link['url'], server=server, quality=quality,))
|
||||
|
||||
autoplay.start(itemlist, item)
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@ except:
|
||||
|
||||
main_host = host
|
||||
host += '/vvvvid/ondemand/'
|
||||
list_servers = ['vvvvid']
|
||||
list_quality = ['default']
|
||||
|
||||
|
||||
|
||||
@support.menu
|
||||
def mainlist(item):
|
||||
@@ -123,12 +123,10 @@ def peliculas(item):
|
||||
for key in keys:
|
||||
if key not in ['1','2']:
|
||||
itemlist.append(
|
||||
Item(channel = item.channel,
|
||||
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'])),
|
||||
action = 'peliculas',
|
||||
args = 'filters',
|
||||
contentType = item.contentType))
|
||||
item.clone(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'])),
|
||||
action = 'peliculas',
|
||||
args = 'filters'))
|
||||
|
||||
else :
|
||||
json_file=loadjs(item.url)
|
||||
@@ -167,19 +165,10 @@ def episodios(item):
|
||||
if make_item == True:
|
||||
if type(title) == tuple: title = title[0]
|
||||
itemlist.append(
|
||||
Item(
|
||||
channel = item.channel,
|
||||
title = title,
|
||||
fulltitle= item.fulltitle,
|
||||
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
|
||||
))
|
||||
item.clone(title = title,
|
||||
url= host + show_id + '/season/' + str(key['season_id']) + '/',
|
||||
action= 'findvideos',
|
||||
video_id= key['video_id']))
|
||||
autorenumber.renumber(itemlist, item, 'bold')
|
||||
if autorenumber.check(item) == True \
|
||||
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 = url.split()[-1]
|
||||
itemlist.append(
|
||||
Item(action= 'play',
|
||||
title='direct',
|
||||
url= 'https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/' + url,
|
||||
server= 'directo')
|
||||
item.clone(action= 'play',
|
||||
title='direct',
|
||||
url= 'https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/' + url,
|
||||
server= 'directo')
|
||||
)
|
||||
return support.server(item, itemlist=itemlist, Download=False)
|
||||
|
||||
@@ -220,18 +209,15 @@ def make_itemlist(itemlist, item, data):
|
||||
infoLabels['title'] = infoLabels['tvshowtitle'] = key['title']
|
||||
title = encode(key['title'])
|
||||
itemlist.append(
|
||||
Item(
|
||||
channel = item.channel,
|
||||
title = support.typo(title, 'bold'),
|
||||
fulltitle= title,
|
||||
show= title,
|
||||
url= host + str(key['show_id']) + '/seasons/',
|
||||
action= 'findvideos' if item.contentType == 'movie' else 'episodios',
|
||||
contentType = item.contentType,
|
||||
contentSerieName= key['title'] if item.contentType != 'movie' else '',
|
||||
contentTitle= title if item.contentType == 'movie' else '',
|
||||
infoLabels=infoLabels
|
||||
))
|
||||
item.clone(title = support.typo(title, 'bold'),
|
||||
fulltitle= title,
|
||||
show= title,
|
||||
url= host + str(key['show_id']) + '/seasons/',
|
||||
action= 'findvideos' if item.contentType == 'movie' else 'episodios',
|
||||
contentType = item.contentType,
|
||||
contentSerieName= key['title'] if item.contentType != 'movie' else '',
|
||||
contentTitle= title if item.contentType == 'movie' else '',
|
||||
infoLabels=infoLabels))
|
||||
return itemlist
|
||||
|
||||
def loadjs(url):
|
||||
|
||||
@@ -76,7 +76,7 @@ def getchanneltypes(view="thumb_"):
|
||||
logger.info()
|
||||
|
||||
# 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 = auto_filter()
|
||||
@@ -218,31 +218,16 @@ def filterchannels(category, view="thumb_"):
|
||||
return channelslist
|
||||
|
||||
|
||||
def get_thumb(thumb_name, view="thumb_", auto=False):
|
||||
|
||||
if auto:
|
||||
thumbnail = ''
|
||||
|
||||
thumb_name = unify.set_genre(unify.simplify(thumb_name))
|
||||
|
||||
if thumb_name in thumb_dict:
|
||||
thumbnail = thumb_dict[thumb_name]
|
||||
return thumbnail
|
||||
|
||||
def get_thumb(thumb_name, view="thumb_"):
|
||||
from core import filetools
|
||||
if thumb_name.startswith('http'):
|
||||
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):
|
||||
media_path = config.get_setting('custom_theme')
|
||||
else:
|
||||
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)
|
||||
|
||||
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
|
||||
media_path = filetools.join("https://raw.githubusercontent.com/kodiondemand/media/master/themes", icon_pack_name)
|
||||
return filetools.join(media_path, view + thumb_name)
|
||||
|
||||
|
||||
def set_channel_info(parameters):
|
||||
@@ -296,7 +281,7 @@ def thumb(item_or_itemlist=None, genre=False, thumb=''):
|
||||
import re
|
||||
icon_dict = {'movie':['film', 'movie'],
|
||||
'tvshow':['serie','tv','episodi','episodio','fiction', 'show'],
|
||||
'documentary':['documentari','documentario', 'documentary'],
|
||||
'documentary':['documentari','documentario', 'documentary', 'documentaristico'],
|
||||
'teenager':['ragazzi','teenager', 'teen'],
|
||||
'learning':['learning'],
|
||||
'all':['tutti', 'all'],
|
||||
@@ -308,17 +293,17 @@ def thumb(item_or_itemlist=None, genre=False, thumb=''):
|
||||
'action':['azione', 'arti marziali', 'action'],
|
||||
'adventure': ['avventura', 'adventure'],
|
||||
'biographical':['biografico', 'biographical'],
|
||||
'comedy':['comico', 'commedia', 'demenziale', 'comedy'],
|
||||
'comedy':['comico', 'commedia', 'demenziale', 'comedy', 'brillante'],
|
||||
'adult':['erotico', 'hentai', 'harem', 'ecchi', 'adult'],
|
||||
'drama':['drammatico', 'drama', 'dramma'],
|
||||
'syfy':['fantascienza', 'science fiction', 'syfy', 'sci'],
|
||||
'fantasy':['fantasy', 'magia', 'magic'],
|
||||
'fantasy':['fantasy', 'magia', 'magic', 'fantastico'],
|
||||
'crime':['gangster','poliziesco', 'crime', 'crimine'],
|
||||
'grotesque':['grottesco', 'grotesque'],
|
||||
'war':['guerra', 'war'],
|
||||
'children':['bambini', 'kids'],
|
||||
'horror':['horror'],
|
||||
'music':['musical', 'musica', 'music'],
|
||||
'music':['musical', 'musica', 'music', 'musicale'],
|
||||
'mistery':['mistero', 'giallo', 'mystery'],
|
||||
'noir':['noir'],
|
||||
'popular' : ['popolari','popolare', 'più visti'],
|
||||
|
||||
@@ -256,7 +256,7 @@ def get_channel_setting(name, channel, default=None):
|
||||
file_settings = filetools.join(config.get_data_path(), "settings_channels", channel + "_data.json")
|
||||
dict_settings = {}
|
||||
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):
|
||||
# We get saved configuration from ../settings/channel_data.json
|
||||
|
||||
@@ -360,7 +360,7 @@ def downloadfile(url, nombrefichero, headers=None, silent=False, continuar=False
|
||||
tiempofalta = 0
|
||||
# logger.info(sec_to_hms(tiempofalta))
|
||||
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),
|
||||
sec_to_hms(tiempofalta)))
|
||||
break
|
||||
|
||||
@@ -40,8 +40,20 @@ def printMatches(matches):
|
||||
|
||||
def find_single_match(data, patron, index=0):
|
||||
try:
|
||||
matches = re.findall(patron, data, flags=re.DOTALL)
|
||||
return matches[index]
|
||||
if index == 0:
|
||||
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:
|
||||
return ""
|
||||
|
||||
@@ -91,6 +103,8 @@ def unescape(text):
|
||||
from Fredrik Lundh
|
||||
http://effbot.org/zone/re-sub.htm#unescape-html
|
||||
"""
|
||||
if not ('&' in text and ';' in text):
|
||||
return text
|
||||
|
||||
def fixup(m):
|
||||
text = m.group(0)
|
||||
@@ -418,7 +432,7 @@ def get_season_and_episode(title):
|
||||
"""
|
||||
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+)"]
|
||||
|
||||
for patron in patrons:
|
||||
|
||||
@@ -118,8 +118,6 @@ def get_servers_itemlist(itemlist, fnc=None, sort=False):
|
||||
|
||||
# We remove the deactivated servers
|
||||
# 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:
|
||||
# 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())
|
||||
|
||||
|
||||
is_filter_servers = False
|
||||
# is_filter_servers = False
|
||||
|
||||
# Run findvideos on each active server
|
||||
for serverid in servers_list:
|
||||
'''if not is_server_enabled(serverid):
|
||||
continue'''
|
||||
if config.get_setting("filter_servers") == True and config.get_setting("black_list", server=serverid):
|
||||
is_filter_servers = True
|
||||
if config.get_setting('servers_blacklist') and serverid not in config.get_setting("black_list", server='servers'):
|
||||
# if config.get_setting("filter_servers") == True and config.get_setting("black_list", server=serverid):
|
||||
# is_filter_servers = True
|
||||
continue
|
||||
devuelve.extend(findvideosbyserver(data, serverid))
|
||||
if skip and len(devuelve) >= skip:
|
||||
devuelve = devuelve[:skip]
|
||||
break
|
||||
if config.get_setting("filter_servers") == False: is_filter_servers = False
|
||||
if not devuelve and is_filter_servers:
|
||||
platformtools.dialog_ok(config.get_localized_string(60000), config.get_localized_string(60001))
|
||||
|
||||
# if config.get_setting("filter_servers") == False: is_filter_servers = False
|
||||
# logger.info('DEVUELVE: ' + str(devuelve))
|
||||
# if not devuelve and is_filter_servers:
|
||||
# platformtools.dialog_ok(config.get_localized_string(60000), config.get_localized_string(60001))
|
||||
return devuelve
|
||||
|
||||
|
||||
@@ -214,8 +213,6 @@ def get_server_from_url(url):
|
||||
for serverid in servers_list:
|
||||
'''if not is_server_enabled(serverid):
|
||||
continue'''
|
||||
if config.get_setting("filter_servers") == True and config.get_setting("black_list", server=serverid):
|
||||
continue
|
||||
serverid = get_server_name(serverid)
|
||||
if not serverid:
|
||||
continue
|
||||
@@ -535,35 +532,35 @@ def get_server_parameters(server):
|
||||
return dict_servers_parameters[server]
|
||||
|
||||
|
||||
def get_server_json(server_name):
|
||||
# logger.info("server_name=" + server_name)
|
||||
try:
|
||||
server_path = filetools.join(config.get_runtime_path(), "servers", server_name + ".json")
|
||||
if not filetools.exists(server_path):
|
||||
server_path = filetools.join(config.get_runtime_path(), "servers", "debriders", server_name + ".json")
|
||||
|
||||
# logger.info("server_path=" + server_path)
|
||||
server_json = jsontools.load(filetools.read(server_path))
|
||||
# logger.info("server_json= %s" % server_json)
|
||||
|
||||
except Exception as ex:
|
||||
template = "An exception of type %s occured. Arguments:\n%r"
|
||||
message = template % (type(ex).__name__, ex.args)
|
||||
logger.error(" %s" % message)
|
||||
server_json = None
|
||||
|
||||
return server_json
|
||||
# def get_server_json(server_name):
|
||||
# # logger.info("server_name=" + server_name)
|
||||
# try:
|
||||
# server_path = filetools.join(config.get_runtime_path(), "servers", server_name + ".json")
|
||||
# if not filetools.exists(server_path):
|
||||
# server_path = filetools.join(config.get_runtime_path(), "servers", "debriders", server_name + ".json")
|
||||
#
|
||||
# # logger.info("server_path=" + server_path)
|
||||
# server_json = jsontools.load(filetools.read(server_path))
|
||||
# # logger.info("server_json= %s" % server_json)
|
||||
#
|
||||
# except Exception as ex:
|
||||
# template = "An exception of type %s occured. Arguments:\n%r"
|
||||
# message = template % (type(ex).__name__, ex.args)
|
||||
# logger.error(" %s" % message)
|
||||
# server_json = None
|
||||
#
|
||||
# return server_json
|
||||
|
||||
|
||||
def get_server_host(server_name):
|
||||
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):
|
||||
dict_settings = {}
|
||||
|
||||
list_controls = get_server_json(server_name).get('settings', [])
|
||||
list_controls = get_server_parameters(server_name).get('settings', [])
|
||||
import copy
|
||||
list_controls = copy.deepcopy(list_controls)
|
||||
|
||||
@@ -720,33 +717,7 @@ def sort_servers(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
|
||||
|
||||
def check_list_links(itemlist, numero='', timeout=3):
|
||||
"""
|
||||
Check a list of video links and return it by modifying the title with verification.
|
||||
|
||||
@@ -39,13 +39,8 @@ def hdpass_get_servers(item):
|
||||
for mir_url, srv in scrapertools.find_multiple_matches(mir, patron_option):
|
||||
mir_url = scrapertools.decodeHtmlentities(mir_url)
|
||||
log(mir_url)
|
||||
it = Item(channel=item.channel,
|
||||
action="play",
|
||||
fulltitle=item.fulltitle,
|
||||
it = item.clone(action="play",
|
||||
quality=quality,
|
||||
show=item.show,
|
||||
thumbnail=item.thumbnail,
|
||||
contentType=item.contentType,
|
||||
title=srv,
|
||||
server=srv,
|
||||
url= mir_url)
|
||||
@@ -114,7 +109,7 @@ def search(channel, item, texto):
|
||||
|
||||
def dbg():
|
||||
if config.dev_mode():
|
||||
import web_pdb;
|
||||
import web_pdb
|
||||
if not web_pdb.WebPdb.active_instance:
|
||||
import webbrowser
|
||||
webbrowser.open('http://127.0.0.1:5555')
|
||||
@@ -128,7 +123,8 @@ def regexDbg(item, patron, headers, data=''):
|
||||
|
||||
if not data:
|
||||
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:
|
||||
html = data
|
||||
headers = {'content-type': 'application/json'}
|
||||
@@ -168,6 +164,14 @@ def cleantitle(title):
|
||||
cleantitle = title.replace('"', "'").replace('×', 'x').replace('–', '-').strip()
|
||||
return cleantitle
|
||||
|
||||
def unifyEp(ep):
|
||||
# ep = re.sub(r'\s-\s|-|–|×|×', 'x', scraped['episode'])
|
||||
ep = ep.replace('-', 'x')
|
||||
ep = ep.replace('–', 'x')
|
||||
ep = ep.replace('×', 'x')
|
||||
ep = ep.replace('×', 'x')
|
||||
return ep
|
||||
|
||||
def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, typeContentDict, typeActionDict, blacklist, search, pag, function, lang, sceneTitle):
|
||||
itemlist = []
|
||||
log("scrapeBlock qui")
|
||||
@@ -216,10 +220,10 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t
|
||||
|
||||
if scraped['season']:
|
||||
stagione = scraped['season']
|
||||
ep = re.sub(r'\s-\s|-|x|–|×|×', 'x', scraped['episode'])
|
||||
ep = unifyEp(scraped['episode'])
|
||||
if 'x' in ep:
|
||||
episode = ep.split('x')[0]
|
||||
second_episode = ep.split('x')[1]
|
||||
episode = ep.split('x')[0].strip()
|
||||
second_episode = ep.split('x')[1].strip()
|
||||
else:
|
||||
episode = ep
|
||||
second_episode = ''
|
||||
@@ -234,7 +238,7 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t
|
||||
item.news = 'season_completed'
|
||||
episode = ''
|
||||
else:
|
||||
episode = re.sub(r'\s-\s|-|x|–|×|×', 'x', scraped['episode']) if scraped['episode'] else ''
|
||||
episode = unifyEp(scraped['episode']) if scraped['episode'] else ''
|
||||
if 'x' in episode:
|
||||
ep = episode.split('x')
|
||||
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'):
|
||||
quality += ' ' + str(parsedTitle.get('screen_size', ''))
|
||||
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'):
|
||||
longtitle = title + s
|
||||
|
||||
@@ -434,7 +441,8 @@ def scrape(func):
|
||||
if not data:
|
||||
page = httptools.downloadpage(item.url, headers=headers, ignore_response_code=True)
|
||||
data = page.data.replace("'", '"')
|
||||
data = re.sub('\n|\t', ' ', data)
|
||||
data = data.replace('\n', ' ')
|
||||
data = data.replace('\t', ' ')
|
||||
data = re.sub(r'>\s+<', '> <', data)
|
||||
# replace all ' with " and eliminate newline, so we don't need to worry about
|
||||
scrapingTime = time()
|
||||
@@ -479,8 +487,8 @@ def scrape(func):
|
||||
else:
|
||||
break
|
||||
|
||||
if (pagination and len(matches) <= pag * pagination) or not pagination: # next page with pagination
|
||||
if patronNext and inspect.stack()[1][3] != 'newest':
|
||||
if (pagination and len(matches) <= pag * pagination) or not pagination: # next page with pagination
|
||||
if patronNext and inspect.stack()[1][3] not in ['newest', 'search']:
|
||||
nextPage(itemlist, item, data, patronNext, function)
|
||||
|
||||
# next page for pagination
|
||||
@@ -543,12 +551,13 @@ def dooplay_get_links(item, host):
|
||||
for type, post, nume, title, server in matches:
|
||||
postData = urlencode({
|
||||
"action": "doo_player_ajax",
|
||||
"post": post,
|
||||
"post": post,
|
||||
"nume": nume,
|
||||
"type": type
|
||||
})
|
||||
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({
|
||||
'url': link,
|
||||
'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)
|
||||
|
||||
if not global_search:
|
||||
autoplay.init(item.channel, list_servers, list_quality)
|
||||
autoplay.show_option(item.channel, itemlist)
|
||||
# autoplay.init(item.channel, list_servers, list_quality)
|
||||
# autoplay.show_option(item.channel, itemlist)
|
||||
channel_config(item, itemlist)
|
||||
|
||||
# Apply auto Thumbnails at the menus
|
||||
@@ -915,8 +924,9 @@ def match(item_url_string, **args):
|
||||
data = httptools.downloadpage(url, **args).data.replace("'", '"')
|
||||
|
||||
# format page data
|
||||
data = re.sub(r'\n|\t', ' ', data)
|
||||
data = re.sub(r'>\s\s*<', '><', data)
|
||||
data = data.replace('\n', ' ')
|
||||
data = data.replace('\t', ' ')
|
||||
data = re.sub(r'>\s+<', '><', data)
|
||||
|
||||
# collect blocks of a page
|
||||
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=[]):
|
||||
# Function_level is useful if the function is called by another function.
|
||||
# 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
|
||||
if next_page == '':
|
||||
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 '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 = re.sub('&', '&',next_page)
|
||||
next_page = next_page.replace('&', '&')
|
||||
log('NEXT= ', next_page)
|
||||
itemlist.append(
|
||||
Item(channel=item.channel,
|
||||
@@ -1166,6 +1177,8 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
|
||||
videoitem.contentType = item.contentType
|
||||
videoitem.infoLabels = item.infoLabels
|
||||
videoitem.quality = quality
|
||||
# videoitem.nfo = item.nfo
|
||||
# videoitem.strm_path = item.strm_path
|
||||
return videoitem
|
||||
|
||||
with futures.ThreadPoolExecutor() as executor:
|
||||
@@ -1180,11 +1193,8 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
|
||||
if patronTag:
|
||||
addQualityTag(item, verifiedItemlist, data, patronTag)
|
||||
|
||||
# Auto Play & Hide Links
|
||||
AP, HS = autoplay.get_channel_AP_HS(item)
|
||||
|
||||
# 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):
|
||||
checklinks_number = config.get_setting('checklinks_number', item.channel)
|
||||
elif config.get_setting('checklinks'):
|
||||
@@ -1198,11 +1208,8 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
|
||||
videolibrary(verifiedItemlist, item)
|
||||
if Download:
|
||||
download(verifiedItemlist, item, function_level=3)
|
||||
|
||||
if not AP or not HS:
|
||||
# for it in verifiedItemlist:
|
||||
# log(it)
|
||||
return verifiedItemlist
|
||||
# if item.contentChannel == 'videolibrary' or not config.get_setting('autoplay'):
|
||||
return verifiedItemlist
|
||||
|
||||
|
||||
def filterLang(item, itemlist):
|
||||
@@ -1213,12 +1220,12 @@ def filterLang(item, itemlist):
|
||||
itemlist = filtertools.get_links(itemlist, item, list_language)
|
||||
return itemlist
|
||||
|
||||
def aplay(item, itemlist, list_servers='', list_quality=''):
|
||||
if inspect.stack()[1][3] == 'mainlist':
|
||||
autoplay.init(item.channel, list_servers, list_quality)
|
||||
autoplay.show_option(item.channel, itemlist)
|
||||
else:
|
||||
autoplay.start(itemlist, item)
|
||||
# def aplay(item, itemlist, list_servers='', list_quality=''):
|
||||
# if inspect.stack()[1][3] == 'mainlist':
|
||||
# autoplay.init(item.channel, list_servers, list_quality)
|
||||
# autoplay.show_option(item.channel, itemlist)
|
||||
# else:
|
||||
# autoplay.start(itemlist, item)
|
||||
|
||||
|
||||
def log(*args):
|
||||
|
||||
@@ -135,7 +135,7 @@ def save_movie(item, silent=False):
|
||||
|
||||
for raiz, subcarpetas, ficheros in filetools.walk(MOVIES_PATH):
|
||||
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']:
|
||||
path = filetools.join(raiz, c)
|
||||
_id = code
|
||||
@@ -192,7 +192,7 @@ def save_movie(item, silent=False):
|
||||
headers = {}
|
||||
if item.headers:
|
||||
headers = item.headers
|
||||
channel = generictools.verify_channel(item.channel)
|
||||
channel = item.channel
|
||||
if config.get_setting("emergency_urls", channel) in [1, 3]:
|
||||
item = emergency_urls(item, None, json_path, headers=headers)
|
||||
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
|
||||
while not stop:
|
||||
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]:
|
||||
ep_list.append(episode.title)
|
||||
if count < len(langs)-1: count += 1
|
||||
@@ -386,14 +386,14 @@ def filter_list(episodelist, action=None, path=None):
|
||||
stop = False
|
||||
while not stop:
|
||||
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]]:
|
||||
ep_list.append(episode.title)
|
||||
if selection != 0: selection = selection - 1
|
||||
else: stop = True
|
||||
if quality_list[selection] == 'N/A':
|
||||
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):
|
||||
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 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']:
|
||||
path = filetools.join(raiz, c)
|
||||
_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.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_succ = False
|
||||
try: channel = __import__('specials.%s' % channel_alt, fromlist=["specials.%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
|
||||
del serie.torrent_caching_fail
|
||||
|
||||
@@ -679,8 +679,8 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True):
|
||||
|
||||
high_sea = e.contentSeason
|
||||
high_epi = e.contentEpisodeNumber
|
||||
if scrapertools.find_single_match(e.title, '[a|A][l|L]\s*(\d+)'):
|
||||
high_epi = int(scrapertools.find_single_match(e.title, 'al\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, r'al\s*(\d+)'))
|
||||
max_sea = e.infoLabels["number_of_seasons"]
|
||||
max_epi = 0
|
||||
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:
|
||||
try:
|
||||
# channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel])
|
||||
channel = __import__('specials.%s' % channel_alt, fromlist=["specials.%s" % channel_alt])
|
||||
channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel])
|
||||
# channel = __import__('specials.%s' % item.channel, fromlist=["specials.%s" % item.channel])
|
||||
except ImportError:
|
||||
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
|
||||
|
||||
# Get the episode list
|
||||
|
||||
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
|
||||
if not check(item):
|
||||
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
|
||||
try:
|
||||
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__('specials.%s' % channel_alt, fromlist=["specials.%s" % channel_alt])
|
||||
if hasattr(channel, 'findvideos'): # If the channel has "findvideos" ...
|
||||
@@ -1099,7 +1098,7 @@ def emergency_urls(item, channel=None, path=None, headers={}):
|
||||
try:
|
||||
referer = 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:
|
||||
videolibrary_path = config.get_videolibrary_path() # we detect the absolute path of the title
|
||||
movies = config.get_setting("folder_movies")
|
||||
|
||||
2311
lib/generictools.py
@@ -577,6 +577,11 @@ class UnshortenIt(object):
|
||||
if not r:
|
||||
r = httptools.downloadpage(uri, follow_redirect=True, timeout=self._timeout, cookies=False)
|
||||
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
|
||||
|
||||
except Exception as e:
|
||||
|
||||
@@ -462,3 +462,7 @@ def verify_directories_created():
|
||||
import traceback
|
||||
logger.error("When checking or creating the resolution folder")
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
|
||||
def get_online_server_thumb(server):
|
||||
return "https://raw.github.com/kodiondemand/media/master/resources/servers/" + server.lower() + '.png'
|
||||
@@ -3,19 +3,9 @@
|
||||
# XBMC Launcher (xbmc / kodi)
|
||||
# ------------------------------------------------------------
|
||||
|
||||
#from future import standard_library
|
||||
#standard_library.install_aliases()
|
||||
#from builtins import str
|
||||
import sys
|
||||
import sys, os
|
||||
PY3 = False
|
||||
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
|
||||
if sys.version_info[0] >= 3:PY3 = True; unicode = str; unichr = chr; long = int
|
||||
|
||||
from core.item import Item
|
||||
from platformcode import config, logger, platformtools
|
||||
@@ -65,11 +55,7 @@ def run(item=None):
|
||||
config.get_localized_string(70137): 'peliculas',
|
||||
config.get_localized_string(30123): 'series',
|
||||
config.get_localized_string(30124): 'anime',
|
||||
config.get_localized_string(70018): 'infantiles',
|
||||
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',
|
||||
}
|
||||
if not config.get_setting("category") in dictCategory.keys():
|
||||
@@ -142,7 +128,6 @@ def run(item=None):
|
||||
if tmdb.drop_bd():
|
||||
platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(60011), time=2000, sound=False)
|
||||
elif item.action == "itemInfo":
|
||||
import base64
|
||||
platformtools.dialog_textviewer('Item info', item.parent)
|
||||
elif item.action == "open_browser":
|
||||
import webbrowser
|
||||
@@ -155,18 +140,10 @@ def run(item=None):
|
||||
import urllib.request as urllib
|
||||
except ImportError:
|
||||
import urllib
|
||||
short = urllib.urlopen(
|
||||
'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)
|
||||
short = urllib.urlopen('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)
|
||||
# Action in certain channel specified in "action" and "channel" parameters
|
||||
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
|
||||
if os.path.isfile(os.path.join(config.get_runtime_path(), 'channels', item.channel + ".py")):
|
||||
CHANNELS = 'channels'
|
||||
@@ -181,8 +158,7 @@ def run(item=None):
|
||||
|
||||
if os.path.exists(channel_file):
|
||||
try:
|
||||
channel = __import__('%s.%s' % (CHANNELS, item.channel), None,
|
||||
None, ['%s.%s' % (CHANNELS, item.channel)])
|
||||
channel = __import__('%s.%s' % (CHANNELS, item.channel), None, None, ['%s.%s' % (CHANNELS, item.channel)])
|
||||
except ImportError:
|
||||
exec("import " + CHANNELS + "." + item.channel + " as channel")
|
||||
|
||||
@@ -211,7 +187,7 @@ def run(item=None):
|
||||
item.isFavourite = True
|
||||
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):
|
||||
item.video_urls = itemlist
|
||||
platformtools.play_video(item)
|
||||
@@ -232,7 +208,6 @@ def run(item=None):
|
||||
# First checks if channel has a "findvideos" function
|
||||
if hasattr(channel, 'findvideos'):
|
||||
itemlist = getattr(channel, item.action)(item)
|
||||
itemlist = servertools.filter_servers(itemlist)
|
||||
|
||||
# If not, uses the generic findvideos function
|
||||
else:
|
||||
@@ -310,32 +285,18 @@ def run(item=None):
|
||||
|
||||
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:
|
||||
import traceback
|
||||
from core import scrapertools
|
||||
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + '([^.]+)\.py"'
|
||||
canal = scrapertools.find_single_match(traceback.format_exc(), patron)
|
||||
patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + r'([^.]+)\.py"'
|
||||
Channel = scrapertools.find_single_match(traceback.format_exc(), patron)
|
||||
|
||||
platformtools.dialog_ok(
|
||||
config.get_localized_string(59985) + canal,
|
||||
config.get_localized_string(59985) + Channel,
|
||||
config.get_localized_string(60013) %(e))
|
||||
except:
|
||||
import traceback
|
||||
@@ -343,8 +304,8 @@ def run(item=None):
|
||||
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + '([^.]+)\.py"'
|
||||
canal = scrapertools.find_single_match(traceback.format_exc(), patron)
|
||||
patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + r'([^.]+)\.py"'
|
||||
Channel = scrapertools.find_single_match(traceback.format_exc(), patron)
|
||||
|
||||
try:
|
||||
import xbmc
|
||||
@@ -356,15 +317,12 @@ def run(item=None):
|
||||
except:
|
||||
log_message = ""
|
||||
|
||||
if canal:
|
||||
if Channel:
|
||||
if item.url:
|
||||
if platformtools.dialog_yesno(config.get_localized_string(60087) % canal, config.get_localized_string(60014),
|
||||
log_message, nolabel='ok', yeslabel=config.get_localized_string(70739)):
|
||||
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)):
|
||||
run(Item(action="open_browser", url=item.url))
|
||||
else:
|
||||
platformtools.dialog_ok(config.get_localized_string(60087) % canal,
|
||||
config.get_localized_string(60014),
|
||||
log_message)
|
||||
platformtools.dialog_ok(config.get_localized_string(60087) % Channel, config.get_localized_string(60014), log_message)
|
||||
else:
|
||||
platformtools.dialog_ok(
|
||||
config.get_localized_string(60038),
|
||||
@@ -384,8 +342,7 @@ def reorder_itemlist(itemlist):
|
||||
modified = 0
|
||||
not_modified = 0
|
||||
|
||||
to_change = [[config.get_localized_string(60335), '[V]'],
|
||||
[config.get_localized_string(60336), '[D]']]
|
||||
to_change = [[config.get_localized_string(60335), '[V]'], [config.get_localized_string(60336), '[D]']]
|
||||
|
||||
for item in itemlist:
|
||||
if not PY3:
|
||||
@@ -441,7 +398,6 @@ def limit_itemlist(itemlist):
|
||||
|
||||
|
||||
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
|
||||
more items, at most a selection dialog can be placed.
|
||||
@@ -452,115 +408,67 @@ def play_from_library(item):
|
||||
@type item: item
|
||||
@param item: item with information
|
||||
"""
|
||||
import xbmcgui, xbmcplugin, xbmc
|
||||
from time import sleep
|
||||
|
||||
itemlist=[]
|
||||
item.fromLibrary = True
|
||||
logger.info()
|
||||
# logger.debug("item: \n" + item.tostring('\n'))
|
||||
|
||||
import xbmcgui
|
||||
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)
|
||||
# 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")))
|
||||
|
||||
# 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()
|
||||
|
||||
# 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"
|
||||
check_next_ep = nextep.check(item)
|
||||
|
||||
|
||||
window_type = config.get_setting("window_type", "videolibrary")
|
||||
|
||||
# and we launch kodi again
|
||||
# and launch kodi again
|
||||
if xbmc.getCondVisibility('Window.IsMedia') and not window_type == 1:
|
||||
# Conventional window
|
||||
xbmc.executebuiltin("Container.Update(" + sys.argv[0] + "?" + item.tourl() + ")")
|
||||
|
||||
else:
|
||||
|
||||
# Pop-up window
|
||||
item.show_server = True
|
||||
|
||||
from specials import videolibrary, autoplay
|
||||
from specials import videolibrary
|
||||
p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), config.get_localized_string(60683))
|
||||
p_dialog.update(0, '')
|
||||
|
||||
item.play_from = 'window'
|
||||
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):
|
||||
p_dialog.update(100, '')
|
||||
sleep(0.5)
|
||||
p_dialog.close()
|
||||
item = nextep.return_item(item)
|
||||
if item.next_ep:
|
||||
return play_from_library(item)
|
||||
# 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)
|
||||
|
||||
else:
|
||||
while platformtools.is_playing():
|
||||
# Conventional window
|
||||
sleep(5)
|
||||
p_dialog.update(50, '')
|
||||
|
||||
it = item
|
||||
if item.show_server or not check_next_ep:
|
||||
|
||||
# The links are filtered according to the blacklist
|
||||
# if config.get_setting('filter_servers', "servers"):
|
||||
# itemlist = servertools.filter_servers(itemlist)
|
||||
|
||||
# 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)))
|
||||
if len(itemlist) > 0:
|
||||
while not xbmc.Monitor().abortRequested():
|
||||
# The user chooses the mirror
|
||||
options = []
|
||||
selection_implementation = 0
|
||||
for item in itemlist:
|
||||
item.thumbnail = config.get_online_server_thumb(item.server)
|
||||
quality = '[B][' + item.quality + '][/B]' if item.quality else ''
|
||||
if item.server:
|
||||
it = xbmcgui.ListItem('\n[B]%s[/B] %s - %s' % (item.server, quality, item.contentTitle))
|
||||
it.setArt({'thumb':item.thumbnail})
|
||||
options.append(it)
|
||||
else:
|
||||
cabecera = config.get_localized_string(30163)
|
||||
|
||||
|
||||
seleccion = platformtools.dialog_select(cabecera, opciones)
|
||||
|
||||
if seleccion == -1:
|
||||
return
|
||||
else:
|
||||
item = videolibrary.play(itemlist[seleccion])[0]
|
||||
item.play_from = 'window'
|
||||
platformtools.play_video(item)
|
||||
|
||||
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()
|
||||
|
||||
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)))
|
||||
else: head = config.get_localized_string(30163)
|
||||
selection = platformtools.dialog_select(head, options, preselect= -1, useDetails=True)
|
||||
if selection == -1:
|
||||
return
|
||||
else:
|
||||
item = videolibrary.play(itemlist[selection + selection_implementation])[0]
|
||||
platformtools.play_video(item)
|
||||
if (platformtools.is_playing() and item.action) or item.server == 'torrent' or config.get_setting('autoplay'): break
|
||||
@@ -6,24 +6,18 @@
|
||||
# version 2.0
|
||||
# ------------------------------------------------------------
|
||||
|
||||
from __future__ import division
|
||||
from __future__ import absolute_import
|
||||
from past.utils import old_div
|
||||
import sys
|
||||
PY3 = False
|
||||
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
|
||||
|
||||
if PY3:
|
||||
if sys.version_info[0] >= 3:
|
||||
import urllib.parse as urllib
|
||||
else:
|
||||
import urllib
|
||||
|
||||
import os, xbmc, xbmcgui, xbmcplugin
|
||||
|
||||
from past.utils import old_div
|
||||
from channelselector import get_thumb
|
||||
from core import channeltools, trakt_tools, scrapertools
|
||||
from core import trakt_tools, scrapertools
|
||||
from core.item import Item
|
||||
from platformcode import logger, config, unify
|
||||
from platformcode import logger, config
|
||||
|
||||
addon = config.__settings__
|
||||
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)
|
||||
|
||||
|
||||
def dialog_select(heading, _list, preselect=0):
|
||||
return xbmcgui.Dialog().select(heading, _list, preselect=preselect)
|
||||
def dialog_select(heading, _list, preselect=0, useDetails=False):
|
||||
return xbmcgui.Dialog().select(heading, _list, preselect=preselect, useDetails=useDetails)
|
||||
|
||||
|
||||
def dialog_multiselect(heading, _list, autoclose=0, preselect=[], useDetails=False):
|
||||
@@ -122,15 +116,15 @@ def dialog_browse(_type, heading, default=""):
|
||||
|
||||
|
||||
def itemlist_refresh():
|
||||
pos = Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition
|
||||
logger.info('Current position: ' + str(pos))
|
||||
# pos = Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition
|
||||
# logger.info('Current position: ' + str(pos))
|
||||
xbmc.executebuiltin("Container.Refresh")
|
||||
|
||||
while Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition != pos:
|
||||
win = xbmcgui.Window(xbmcgui.getCurrentWindowId())
|
||||
cid = win.getFocusId()
|
||||
ctl = win.getControl(cid)
|
||||
ctl.selectItem(pos)
|
||||
# while Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition != pos:
|
||||
# win = xbmcgui.Window(xbmcgui.getCurrentWindowId())
|
||||
# cid = win.getFocusId()
|
||||
# ctl = win.getControl(cid)
|
||||
# ctl.selectItem(pos)
|
||||
|
||||
|
||||
def itemlist_update(item, replace=False):
|
||||
@@ -168,7 +162,7 @@ def render_items(itemlist, parent_item):
|
||||
|
||||
dirItems = []
|
||||
for n, item in enumerate(itemlist):
|
||||
item.itemlistPosition = n + 1
|
||||
# item.itemlistPosition = n + 1
|
||||
item_url = item.tourl()
|
||||
|
||||
if item.category == "":
|
||||
@@ -181,7 +175,7 @@ def render_items(itemlist, parent_item):
|
||||
if item.fanart == "":
|
||||
item.fanart = parent_item.fanart
|
||||
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
|
||||
# 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,
|
||||
'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')
|
||||
|
||||
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) \
|
||||
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.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'
|
||||
|
||||
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)
|
||||
|
||||
|
||||
# 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):
|
||||
"""
|
||||
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)
|
||||
# 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):
|
||||
"""
|
||||
@@ -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
|
||||
if kwargs.get('has_extendedinfo') \
|
||||
and config.get_setting("extended_info") == True:
|
||||
if item.contentType == "episode" and item.contentEpisodeNumber and item.contentSeason \
|
||||
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)
|
||||
if item.contentType == "episode" and item.contentEpisodeNumber and item.contentSeason 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)
|
||||
context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedepisodeinfo,%s)" % param))
|
||||
|
||||
elif item.contentType == "season" and item.contentSeason \
|
||||
and (item.infoLabels['tmdb_id'] or item.contentSerieName):
|
||||
param = "tvshow_id =%s,tvshow=%s, season=%s" \
|
||||
% (item.infoLabels['tmdb_id'], item.contentSerieName, item.contentSeason)
|
||||
elif item.contentType == "season" and item.contentSeason and (item.infoLabels['tmdb_id'] or item.contentSerieName):
|
||||
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))
|
||||
|
||||
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):
|
||||
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))
|
||||
# InfoPlus
|
||||
|
||||
# InfoPlus
|
||||
if config.get_setting("infoplus"):
|
||||
#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:
|
||||
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,
|
||||
'channel=infoplus&action=start&from_channel=' + item.channel)))
|
||||
context_commands.append(("InfoPlus", "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=infoplus&action=start&from_channel=' + item.channel)))
|
||||
|
||||
# Go to the Main Menu (channel.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(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)
|
||||
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}))))
|
||||
@@ -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(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
|
||||
if config.get_setting('start_page'):
|
||||
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":
|
||||
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...
|
||||
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}))))
|
||||
@@ -792,14 +494,6 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
|
||||
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 = 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():
|
||||
context_commands.insert(0, ("item info", "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="itemInfo", parent=item.tojson()).tourl())))
|
||||
return context_commands
|
||||
@@ -812,19 +506,12 @@ def is_playing():
|
||||
def play_video(item, strm=False, force_direct=False, autoplay=False):
|
||||
logger.info()
|
||||
# logger.debug(item.tostring('\n'))
|
||||
logger.debug('item play: %s' % item)
|
||||
xbmc_player = XBMCPlayer()
|
||||
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)
|
||||
if config.get_platform(True)['num_version'] >= 16.0:
|
||||
xlistitem.setArt({"thumb": item.thumbnail})
|
||||
else:
|
||||
xlistitem.setThumbnailImage(item.thumbnail)
|
||||
|
||||
xlistitem.setArt({"thumb": item.thumbnail})
|
||||
set_infolabels(xlistitem, item, True)
|
||||
set_player(item, xlistitem, item.url, True, None) # Fix Play From Download Section
|
||||
# xbmc_player.play(item.url, xlistitem)
|
||||
return
|
||||
|
||||
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
|
||||
opciones, video_urls, seleccion, salir = get_dialogo_opciones(item, default_action, strm, autoplay)
|
||||
if salir:
|
||||
return
|
||||
if salir: return
|
||||
|
||||
# get default option of addon configuration
|
||||
seleccion = get_seleccion(default_action, opciones, seleccion, video_urls)
|
||||
if seleccion < 0: # Canceled box
|
||||
return
|
||||
if seleccion < 0: return # Canceled box
|
||||
|
||||
logger.info("selection=%d" % 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
|
||||
mediaurl, view, mpd = get_video_seleccionado(item, seleccion, video_urls)
|
||||
if mediaurl == "":
|
||||
return
|
||||
# # no certificate verification
|
||||
# mediaurl = mediaurl.replace('https://', 'http://')
|
||||
if not mediaurl: return
|
||||
|
||||
# video information is obtained.
|
||||
if not item.contentThumbnail:
|
||||
thumb = item.thumbnail
|
||||
else:
|
||||
thumb = item.contentThumbnail
|
||||
|
||||
xlistitem = xbmcgui.ListItem(path=item.url)
|
||||
if config.get_platform(True)['num_version'] >= 16.0:
|
||||
xlistitem.setArt({"thumb": thumb})
|
||||
else:
|
||||
xlistitem.setThumbnailImage(thumb)
|
||||
|
||||
xlistitem.setArt({"thumb": item.contentThumbnail if item.contentThumbnail else item.thumbnail})
|
||||
set_infolabels(xlistitem, item, True)
|
||||
|
||||
# if it is a video in mpd format, the listitem is configured to play it
|
||||
# with the inpustreamaddon addon implemented in Kodi 17
|
||||
# if it is a video in mpd format, the listitem is configured to play it ith the inpustreamaddon addon implemented in Kodi 17
|
||||
# from core.support import dbg;dbg()
|
||||
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('inputstream.adaptive.manifest_type', 'mpd')
|
||||
|
||||
# player launches
|
||||
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)
|
||||
if force_direct: item.play_from = 'window'
|
||||
|
||||
# Reproduce
|
||||
xbmc_player.play(playlist, xlistitem)
|
||||
else:
|
||||
set_player(item, xlistitem, mediaurl, view, strm)
|
||||
|
||||
item, nfo_path, head_nfo, item_nfo = resume_playback(item)
|
||||
set_player(item, xlistitem, mediaurl, view, strm, nfo_path, head_nfo, item_nfo)
|
||||
|
||||
|
||||
def stop_video():
|
||||
@@ -1196,6 +864,9 @@ def get_video_seleccionado(item, seleccion, video_urls):
|
||||
wait_time = video_urls[seleccion][2]
|
||||
view = True
|
||||
|
||||
if 'mpd' in video_urls[seleccion][0]:
|
||||
mpd = True
|
||||
|
||||
# If there is no mediaurl it is because the video is not there :)
|
||||
logger.info("mediaurl=" + mediaurl)
|
||||
if mediaurl == "":
|
||||
@@ -1213,68 +884,64 @@ def get_video_seleccionado(item, seleccion, video_urls):
|
||||
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.debug("item:\n" + item.tostring('\n'))
|
||||
# logger.debug("item:\n" + item.tostring('\n'))
|
||||
# Moved del conector "torrent" here
|
||||
if item.server == "torrent":
|
||||
play_torrent(item, xlistitem, mediaurl)
|
||||
return
|
||||
|
||||
# If it is a strm file, play is not necessary
|
||||
elif strm:
|
||||
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xlistitem)
|
||||
if item.subtitle != "":
|
||||
if item.subtitle:
|
||||
xbmc.sleep(2000)
|
||||
xbmc_player.setSubtitles(item.subtitle)
|
||||
|
||||
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)
|
||||
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 \
|
||||
(config.get_setting("player_mode") == 3 and mediaurl.startswith("rtmp")):
|
||||
# We add the listitem to a playlist
|
||||
if player_mode == 0:
|
||||
logger.info('Player Mode: Direct')
|
||||
# Add the listitem to a playlist
|
||||
playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
|
||||
playlist.clear()
|
||||
playlist.add(mediaurl, xlistitem)
|
||||
|
||||
# Reproduce
|
||||
# xbmc_player = xbmc_player
|
||||
xbmc_player.play(playlist, xlistitem)
|
||||
if config.get_setting('trakt_sync'):
|
||||
trakt_tools.wait_for_update_trakt()
|
||||
|
||||
# elif config.get_setting("player_mode") == 1 or item.isPlayable:
|
||||
elif config.get_setting("player_mode") == 1:
|
||||
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)
|
||||
elif player_mode == 1:
|
||||
logger.info('Player Mode: setResolvedUrl')
|
||||
xlistitem.setPath(mediaurl)
|
||||
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xlistitem)
|
||||
xbmc.sleep(2500)
|
||||
|
||||
elif config.get_setting("player_mode") == 2:
|
||||
elif player_mode == 2:
|
||||
logger.info('Player Mode: Built-In')
|
||||
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
|
||||
if item.subtitle != "" and view:
|
||||
logger.info("Subtítulos externos: " + item.subtitle)
|
||||
if item.subtitle and view:
|
||||
logger.info("External subtitles: " + item.subtitle)
|
||||
xbmc.sleep(2000)
|
||||
xbmc_player.setSubtitles(item.subtitle)
|
||||
|
||||
# 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)
|
||||
xbmc_videolibrary.mark_auto_as_watched(item, nfo_path, head_nfo, item_nfo)
|
||||
|
||||
|
||||
def torrent_client_installed(show_tuple=False):
|
||||
@@ -1334,4 +1001,83 @@ def play_torrent(item, xlistitem, mediaurl):
|
||||
|
||||
|
||||
def log(texto):
|
||||
xbmc.log(texto, xbmc.LOGNOTICE)
|
||||
xbmc.log(texto, xbmc.LOGNOTICE)
|
||||
|
||||
def resume_playback(item, return_played_time=False):
|
||||
class ResumePlayback(xbmcgui.WindowXMLDialog):
|
||||
Close = False
|
||||
Resume = False
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.action_exitkeys_id = [xbmcgui.ACTION_BACKSPACE, xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK]
|
||||
self.progress_control = None
|
||||
self.item = kwargs.get('item')
|
||||
m, s = divmod(float(self.item.played_time), 60)
|
||||
h, m = divmod(m, 60)
|
||||
self.setProperty("time", '%02d:%02d:%02d' % (h, m, s))
|
||||
|
||||
def set_values(self, value):
|
||||
self.Resume = value
|
||||
self.Close = True
|
||||
|
||||
def is_close(self):
|
||||
return self.Close
|
||||
|
||||
def onClick(self, controlId):
|
||||
if controlId == 3012: # Resume
|
||||
self.set_values(True)
|
||||
self.close()
|
||||
elif controlId == 3013: # Cancel
|
||||
self.set_values(False)
|
||||
self.close()
|
||||
|
||||
def onAction(self, action):
|
||||
if action in self.action_exitkeys_id:
|
||||
self.set_values(False)
|
||||
self.close()
|
||||
|
||||
|
||||
from core import videolibrarytools, filetools
|
||||
|
||||
# Read NFO FILE
|
||||
if item.contentType == 'movie':
|
||||
nfo_path = item.nfo
|
||||
else:
|
||||
nfo_path = item.strm_path.replace('strm','nfo')
|
||||
|
||||
if filetools.isfile(nfo_path):
|
||||
head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path)
|
||||
|
||||
if return_played_time:
|
||||
return item_nfo.played_time
|
||||
# Show Window
|
||||
elif (config.get_setting("player_mode") not in [3] or item.play_from == 'window') and item_nfo.played_time:
|
||||
Dialog = ResumePlayback('ResumePlayback.xml', config.get_runtime_path(), item=item_nfo)
|
||||
Dialog.show()
|
||||
t = 0
|
||||
while not Dialog.is_close() and t < 100:
|
||||
t += 1
|
||||
xbmc.sleep(100)
|
||||
if not Dialog.Resume: item_nfo.played_time = 0
|
||||
else:
|
||||
item_nfo.played_time = 0
|
||||
|
||||
return item, nfo_path, head_nfo, item_nfo
|
||||
else:
|
||||
item.nfo = item.strm_path = ""
|
||||
return item, None, None, None
|
||||
|
||||
def install_inputstream():
|
||||
from xbmcaddon import Addon
|
||||
try:
|
||||
# See if there's an installed repo that has it
|
||||
xbmc.executebuiltin('InstallAddon(inputstream.adaptive)', wait=True)
|
||||
|
||||
# Check if InputStream add-on exists!
|
||||
Addon('inputstream.adaptive')
|
||||
|
||||
logger.info('InputStream add-on installed from repo.')
|
||||
return True
|
||||
except RuntimeError:
|
||||
logger.info('InputStream add-on not installed.')
|
||||
return False
|
||||
@@ -184,7 +184,7 @@ class SettingsWindow(xbmcgui.WindowXMLDialog):
|
||||
# The call is made from a channel
|
||||
self.list_controls, default_values = servertools.get_server_controls_settings(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:
|
||||
@@ -378,8 +378,8 @@ class SettingsWindow(xbmcgui.WindowXMLDialog):
|
||||
textColor=c["color"], font=self.font, isPassword=c["hidden"], window=self)
|
||||
|
||||
else:
|
||||
control = xbmcgui.ControlEdit(0, -100, self.controls_width - 5, self.height_control,
|
||||
c["label"], self.font, c["color"], '', 4, isPassword=c["hidden"],
|
||||
control = xbmcgui.ControlEdit(0, -100, self.controls_width, self.height_control,
|
||||
c["label"], self.font, c["color"], '', 1 | 4, isPassword=c["hidden"],
|
||||
focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'),
|
||||
noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'))
|
||||
|
||||
@@ -393,7 +393,7 @@ class SettingsWindow(xbmcgui.WindowXMLDialog):
|
||||
s = ''
|
||||
control.setText(s)
|
||||
# control.setText(self.values[c["id"]])
|
||||
control.setWidth(self.controls_width - 5)
|
||||
control.setWidth(self.controls_width + 10)
|
||||
control.setHeight(self.height_control)
|
||||
|
||||
c["control"] = control
|
||||
@@ -446,8 +446,8 @@ class SettingsWindow(xbmcgui.WindowXMLDialog):
|
||||
self.getControl(10006).setLabel(self.custom_button['label'])
|
||||
else:
|
||||
self.getControl(10006).setVisible(False)
|
||||
self.getControl(10004).setPosition(self.getControl(10004).getPosition()[0] + 80, self.getControl(10004).getPosition()[1])
|
||||
self.getControl(10005).setPosition(self.getControl(10005).getPosition()[0] + 80, self.getControl(10005).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], self.getControl(10005).getPosition()[1])
|
||||
|
||||
# Control Area Dimensions
|
||||
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"] == 'list': self.add_control_list(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.evaluate_conditions()
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
#from builtins import str
|
||||
import sys, os, threading, time, re, math, xbmc
|
||||
import sys, os, threading, time, re, math, xbmc, xbmcgui
|
||||
PY3 = False
|
||||
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
|
||||
|
||||
|
||||
def mark_auto_as_watched(item):
|
||||
def mark_as_watched_subThread(item):
|
||||
def mark_auto_as_watched(item, nfo_path=None, head_nfo=None, item_nfo=None):
|
||||
def mark_as_watched_subThread(item, nfo_path, head_nfo, item_nfo):
|
||||
logger.info()
|
||||
# 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
|
||||
while not platformtools.is_playing() and time.time() < time_limit:
|
||||
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():
|
||||
tiempo_actual = xbmc.Player().getTime()
|
||||
totaltime = xbmc.Player().getTotalTime()
|
||||
actual_time = xbmc.Player().getTime()
|
||||
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
|
||||
if condicion == 0: # '5 minutos'
|
||||
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
|
||||
mark_time = total_time * percentage
|
||||
difference = total_time - actual_time
|
||||
|
||||
# logger.debug(str(tiempo_actual))
|
||||
# logger.debug(str(mark_time))
|
||||
|
||||
if tiempo_actual > mark_time:
|
||||
# Mark as Watched
|
||||
if actual_time > mark_time and not marked:
|
||||
logger.debug("Marked as Watched")
|
||||
item.playcount = 1
|
||||
sync_with_trakt = True
|
||||
marked = True
|
||||
show_server = False
|
||||
from specials import videolibrary
|
||||
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
|
||||
if sync_with_trakt and config.get_setting("trakt_sync"):
|
||||
sync_trakt_kodi()
|
||||
if marked and config.get_setting("trakt_sync"): 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 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):
|
||||
@@ -110,7 +121,7 @@ def sync_trakt_addon(path_folder):
|
||||
shows = list(shows.items())
|
||||
|
||||
# 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)
|
||||
|
||||
if "tt" in _id:
|
||||
@@ -152,7 +163,7 @@ def sync_trakt_addon(path_folder):
|
||||
logger.debug("dict_trakt_show %s " % dict_trakt_show)
|
||||
|
||||
# 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)]
|
||||
# we get the keys that are seasons
|
||||
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
|
||||
if xbmc.getCondVisibility('System.HasAddon("script.trakt")'):
|
||||
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
|
||||
|
||||
xbmc.executebuiltin('RunScript(script.trakt,action=sync,silent=%s)' % silent)
|
||||
logger.info("Synchronization with Trakt started")
|
||||
|
||||
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):
|
||||
@@ -276,7 +287,6 @@ def mark_content_as_watched_on_kodi(item, value=1):
|
||||
path = filetools.join(tail, filename)
|
||||
|
||||
for d in data['result']['episodes']:
|
||||
|
||||
if d['file'].replace("/", "\\").endswith(path.replace("/", "\\")):
|
||||
# logger.debug("I mark the episode as seen")
|
||||
episodeid = d['episodeid']
|
||||
@@ -376,7 +386,7 @@ def mark_content_as_watched_on_kod(path):
|
||||
path1 = path.replace("\\\\", "\\") # Windows format
|
||||
if not path2:
|
||||
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
|
||||
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
|
||||
@@ -394,7 +404,7 @@ def mark_content_as_watched_on_kod(path):
|
||||
if contentType == "episode_view":
|
||||
title_plain = title.replace('.strm', '') # If it is Serial, we remove the suffix .strm
|
||||
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
|
||||
playCount_final = 0
|
||||
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
|
||||
for season in item.library_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
|
||||
|
||||
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, ' ').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}
|
||||
|
||||
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 silent:
|
||||
# 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:
|
||||
install = True
|
||||
|
||||
@@ -563,7 +573,7 @@ def set_content(content_type, silent=False, custom=False):
|
||||
continuar = False
|
||||
if not silent:
|
||||
# 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:
|
||||
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 silent:
|
||||
#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:
|
||||
install = True
|
||||
|
||||
@@ -617,7 +627,7 @@ def set_content(content_type, silent=False, custom=False):
|
||||
continuar = False
|
||||
if not silent:
|
||||
# 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:
|
||||
install = True
|
||||
|
||||
@@ -651,7 +661,7 @@ def set_content(content_type, silent=False, custom=False):
|
||||
if sql_videolibrarypath.startswith("special://"):
|
||||
sql_videolibrarypath = sql_videolibrarypath.replace('/profile/', '/%/').replace('/home/userdata/', '/%/')
|
||||
sep = '/'
|
||||
elif scrapertools.find_single_match(sql_videolibrarypath, '(^\w+:\/\/)'):
|
||||
elif scrapertools.find_single_match(sql_videolibrarypath, r'(^\w+:\/\/)'):
|
||||
sep = '/'
|
||||
else:
|
||||
sep = os.sep
|
||||
@@ -1228,4 +1238,110 @@ def ask_set_content(silent=False):
|
||||
# configuration from the settings menu
|
||||
else:
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30045"
|
||||
msgid "Resume from:"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30046"
|
||||
msgid "Resume from start"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30050"
|
||||
msgid "Server connection error"
|
||||
msgstr ""
|
||||
@@ -223,6 +231,10 @@ msgctxt "#30068"
|
||||
msgid "Filter by servers"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30069"
|
||||
msgid "Priority to quality"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "#30100"
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
@@ -191,6 +191,14 @@ msgctxt "#30044"
|
||||
msgid "Play mode"
|
||||
msgstr "Modalità di riproduzione"
|
||||
|
||||
msgctxt "#30045"
|
||||
msgid "Resume from:"
|
||||
msgstr "Riprendi da:"
|
||||
|
||||
msgctxt "#30046"
|
||||
msgid "Resume from start"
|
||||
msgstr "Riprendi dall'inizio"
|
||||
|
||||
msgctxt "#30050"
|
||||
msgid "Server connection error"
|
||||
msgstr "Errore connessione server"
|
||||
@@ -223,6 +231,10 @@ msgctxt "#30068"
|
||||
msgid "Filter by servers"
|
||||
msgstr "Filtra per server"
|
||||
|
||||
msgctxt "#30069"
|
||||
msgid "Priority to quality"
|
||||
msgstr "Priorità alla qualità"
|
||||
|
||||
msgctxt "#30100"
|
||||
msgid "Settings"
|
||||
msgstr "Impostazioni"
|
||||
@@ -20,7 +20,10 @@
|
||||
<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="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_number" type="slider" option="int" range="5,5,20" label="30021" default="5" visible="eq(-1,true)" subsetting="true"/>
|
||||
</category>
|
||||
@@ -35,9 +38,10 @@
|
||||
<setting id="videolibrary_kodi" type="bool" label="70120" default="false"/>
|
||||
<setting label="59997" type="lsep"/>
|
||||
<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" type="select" label="70754" lvalues="70755|70756|70757" default="0" visible="eq(-1,2)" 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" type="bool" label="70748" default="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,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 label="30030" type="lsep"/>
|
||||
<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="httptools_timeout" type="slider" option="int" range="0,5,120" label="70580" default="15"/>
|
||||
<setting label="70145" type="lsep"/>
|
||||
<setting id="servers_favorites" type="action" label="60551" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19mYXZvcml0ZXMiLA0KICAgICJjaGFubmVsIjogInNldHRpbmciDQp9==)"/>
|
||||
<setting id="servers_blacklist" type="action" label="60550" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19ibGFja2xpc3QiLA0KICAgICJjaGFubmVsIjogInNldHRpbmciDQp9==)"/>
|
||||
<setting id="favorites_servers" type="bool" label="60551" default="false" visible="false"/>
|
||||
<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="debriders_config" type="action" label="60552" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19tZW51IiwNCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLA0KCSJ0eXBlIjogImRlYnJpZGVycyINCn0==)"/>
|
||||
<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)"/> -->
|
||||
<!-- Others -->
|
||||
<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="enable_custom_theme" type="bool" label="70564" default="false"/>
|
||||
<setting id="custom_theme" type="folder" label="70565" default="" visible="eq(-1,true)"/>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<control type="image">
|
||||
<width>100%</width>
|
||||
<height>100%</height>
|
||||
<texture colordiffuse="FF232323">Shortcut/white.png</texture>
|
||||
<texture colordiffuse="FF232323">white.png</texture>
|
||||
</control>
|
||||
<!-- Divider -->
|
||||
<control type="image">
|
||||
@@ -27,7 +27,7 @@
|
||||
<right>0</right>
|
||||
<width>100%</width>
|
||||
<height>1</height>
|
||||
<texture colordiffuse="33FFFFFF">Shortcut/white.png</texture>
|
||||
<texture colordiffuse="33FFFFFF">white.png</texture>
|
||||
</control>
|
||||
<!-- Header -->
|
||||
<control type="label" id="10002">
|
||||
@@ -47,8 +47,8 @@
|
||||
<top>25</top>
|
||||
<width>30</width>
|
||||
<height>30</height>
|
||||
<texturefocus colordiffuse="FFFFFFFF">Controls/DialogCloseButton-focus.png</texturefocus>
|
||||
<texturenofocus colordiffuse="55FFFFFF">Controls/DialogCloseButton-focus.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
|
||||
<texturenofocus colordiffuse="55FFFFFF">close.png</texturenofocus>
|
||||
</control>
|
||||
<!-- OK -->
|
||||
<control type="button" id="10004">
|
||||
@@ -58,8 +58,8 @@
|
||||
<height>60</height>
|
||||
<textwidth>110</textwidth>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="FF191919">Shortcut/white.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="FF191919">white.png</texturenofocus>
|
||||
<align>center</align>
|
||||
<aligny>center</aligny>
|
||||
<label>$ADDON[plugin.video.kod 70001]</label>
|
||||
@@ -72,8 +72,8 @@
|
||||
<height>60</height>
|
||||
<textwidth>110</textwidth>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="FF191919">Shortcut/white.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="FF191919">white.png</texturenofocus>
|
||||
<align>center</align>
|
||||
<aligny>center</aligny>
|
||||
<label>$ADDON[plugin.video.kod 70002]</label>
|
||||
@@ -86,8 +86,8 @@
|
||||
<height>60</height>
|
||||
<textwidth>110</textwidth>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="FF191919">Shortcut/white.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="FF191919">white.png</texturenofocus>
|
||||
<align>center</align>
|
||||
<aligny>center</aligny>
|
||||
<label>$ADDON[plugin.video.kod 70003]</label>
|
||||
@@ -102,7 +102,7 @@
|
||||
<top>0</top>
|
||||
<left>0</left>
|
||||
<width>900</width>
|
||||
<height>680</height>
|
||||
<height>580</height>
|
||||
<font>font20</font>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<align>center</align>
|
||||
@@ -116,14 +116,14 @@
|
||||
<right>0</right>
|
||||
<width>10</width>
|
||||
<height>540</height>
|
||||
<texture border="2" colordiffuse="FF232323">Shortcut/white.png</texture>
|
||||
<texture border="2" colordiffuse="FF232323">white.png</texture>
|
||||
</control>
|
||||
<control type="image" id="10009">
|
||||
<top>120</top>
|
||||
<right>0</right>
|
||||
<width>10</width>
|
||||
<height>540</height>
|
||||
<texture border="2" colordiffuse="33FFFFFF">Shortcut/white.png</texture>
|
||||
<texture border="2" colordiffuse="33FFFFFF">white.png</texture>
|
||||
</control>
|
||||
</control>
|
||||
</controls>
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
<top>0</top>
|
||||
<width>100%</width>
|
||||
<height>100%</height>
|
||||
<texturefocus colordiffuse="80DCDCDC">Shortcut/white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="80DCDCDC">Shortcut/white.png</texturenofocus>
|
||||
<texturefocus colordiffuse="80DCDCDC">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="80DCDCDC">white.png</texturenofocus>
|
||||
<animation effect="fade" time="200">WindowOpen</animation>
|
||||
<animation effect="fade" time="200">WindowClose</animation>
|
||||
<onclick>Action(close)</onclick>
|
||||
@@ -39,9 +39,9 @@
|
||||
<top>219</top>
|
||||
<width>1100</width>
|
||||
<height>10</height>
|
||||
<texturesliderbackground colordiffuse="FFDCDCDC">Shortcut/white.png</texturesliderbackground>
|
||||
<texturesliderbar colordiffuse="FF1f1f1f">Shortcut/white.png</texturesliderbar>
|
||||
<texturesliderbarfocus colordiffuse="FF0082C2">Shortcut/white.png</texturesliderbarfocus>
|
||||
<texturesliderbackground colordiffuse="FFDCDCDC">white.png</texturesliderbackground>
|
||||
<texturesliderbar colordiffuse="FF1f1f1f">white.png</texturesliderbar>
|
||||
<texturesliderbarfocus colordiffuse="FF0082C2">white.png</texturesliderbarfocus>
|
||||
<showonepage>false</showonepage>
|
||||
<orientation>horizontal</orientation>
|
||||
<ondown>32500</ondown>
|
||||
@@ -50,7 +50,7 @@
|
||||
<control type="image">
|
||||
<width>1100</width>
|
||||
<height>218</height>
|
||||
<texture colordiffuse="FFDCDCDC">Shortcut/white.png</texture>
|
||||
<texture colordiffuse="FFDCDCDC">white.png</texture>
|
||||
</control>
|
||||
<control type="list" id="32500">
|
||||
<left>-130</left>
|
||||
@@ -78,7 +78,7 @@
|
||||
<top>1</top>
|
||||
<width>220</width>
|
||||
<height>218</height>
|
||||
<texture colordiffuse="FF0082C2">Shortcut/white.png</texture>
|
||||
<texture colordiffuse="FF0082C2">white.png</texture>
|
||||
</control>
|
||||
<control type="textbox">
|
||||
<left>0</left>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<control type="image">
|
||||
<width>100%</width>
|
||||
<height>100%</height>
|
||||
<texture colordiffuse="FF232323">Shortcut/white.png</texture>
|
||||
<texture colordiffuse="FF232323">white.png</texture>
|
||||
</control>
|
||||
<!-- FANART -->
|
||||
<control type="image" id="10004">
|
||||
@@ -47,8 +47,8 @@
|
||||
<top>25</top>
|
||||
<width>30</width>
|
||||
<height>30</height>
|
||||
<texturefocus colordiffuse="FFFFFFFF">Controls/DialogCloseButton-focus.png</texturefocus>
|
||||
<texturenofocus colordiffuse="55FFFFFF">Controls/DialogCloseButton-focus.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
|
||||
<texturenofocus colordiffuse="55FFFFFF">close.png</texturenofocus>
|
||||
</control>
|
||||
<!-- LOCANDINA -->
|
||||
<control type="image" id="10005">
|
||||
@@ -315,8 +315,8 @@
|
||||
<width>200</width>
|
||||
<height>50</height>
|
||||
<textwidth>110</textwidth>
|
||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000081C2">white.png</texturenofocus>
|
||||
<align>center</align>
|
||||
<aligny>center</aligny>
|
||||
<label>$ADDON[plugin.video.kod 70005]</label>
|
||||
@@ -327,8 +327,8 @@
|
||||
<width>200</width>
|
||||
<height>50</height>
|
||||
<textwidth>110</textwidth>
|
||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000081C2">white.png</texturenofocus>
|
||||
<align>center</align>
|
||||
<aligny>center</aligny>
|
||||
<label>$ADDON[plugin.video.kod 70006]</label>
|
||||
@@ -339,8 +339,8 @@
|
||||
<width>200</width>
|
||||
<height>50</height>
|
||||
<textwidth>110</textwidth>
|
||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000081C2">white.png</texturenofocus>
|
||||
<align>center</align>
|
||||
<aligny>center</aligny>
|
||||
<label>$ADDON[plugin.video.kod 70002]</label>
|
||||
@@ -351,8 +351,8 @@
|
||||
<width>200</width>
|
||||
<height>50</height>
|
||||
<textwidth>110</textwidth>
|
||||
<texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FF0081C2">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000081C2">white.png</texturenofocus>
|
||||
<align>center</align>
|
||||
<aligny>center</aligny>
|
||||
<label>$ADDON[plugin.video.kod 70007]</label>
|
||||
|
||||
@@ -5,82 +5,60 @@
|
||||
<onload>Dialog.Close(videoosd,true)</onload>
|
||||
<controls>
|
||||
<control type="group">
|
||||
<top>0</top>
|
||||
<right>0</right>
|
||||
<width>100%</width>
|
||||
<animation type="WindowOpen" reversible="false">
|
||||
<effect type="fade" start="0" end="100" time="600" />
|
||||
<effect type="slide" start="115,0" end="0,0" time="600" />
|
||||
<effect type="fade" start="0" end="100" time="400" />
|
||||
<effect type="slide" start="115,0" end="0,0" time="400" />
|
||||
</animation>
|
||||
<animation type="WindowClose" reversible="false">
|
||||
<effect type="fade" start="100" end="0" time="400" />
|
||||
<effect type="slide" start="0,0" end="115,0" time="400" />
|
||||
<effect type="fade" start="100" end="0" time="300" />
|
||||
<effect type="slide" start="0,0" end="115,0" time="300" />
|
||||
</animation>
|
||||
<control type="group">
|
||||
<right>0</right>
|
||||
<control type="grouplist" id="20">
|
||||
<orientation>horizontal</orientation>
|
||||
<top>15</top>
|
||||
<height>40</height>
|
||||
<width>100%</width>
|
||||
<!-- Background -->
|
||||
<control type="image">
|
||||
<top>0</top>
|
||||
<width>100%</width>
|
||||
<itemgap>0</itemgap>
|
||||
<align>right</align>
|
||||
<control type="button" id="3012">
|
||||
<label>$INFO[Window.Property(title)] - $INFO[Window.Property(ep_title)] | $INFO[Player.TimeRemaining(secs),,]</label>
|
||||
<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 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>
|
||||
<right>0</right>
|
||||
<width>100%</width>
|
||||
<!-- buttons -->
|
||||
<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>
|
||||
<width>30</width>
|
||||
<height>40</height>
|
||||
<texture colordiffuse="88232323">white.png</texture>
|
||||
</control>
|
||||
</control>
|
||||
</control>
|
||||
|
||||
@@ -5,83 +5,63 @@
|
||||
<onload>Dialog.Close(videoosd,true)</onload>
|
||||
<controls>
|
||||
<control type="group">
|
||||
<top>15</top>
|
||||
<right>0</right>
|
||||
<width>140</width>
|
||||
<height>40</height>
|
||||
<animation type="WindowOpen" reversible="false">
|
||||
<effect type="fade" start="0" end="100" time="600" />
|
||||
<effect type="slide" start="115,0" end="0,0" time="600" />
|
||||
<effect type="fade" start="0" end="100" time="400" />
|
||||
<effect type="slide" start="115,0" end="0,0" time="400" />
|
||||
</animation>
|
||||
<animation type="WindowClose" reversible="false">
|
||||
<effect type="fade" start="100" end="0" time="400" />
|
||||
<effect type="slide" start="0,0" end="115,0" time="400" />
|
||||
<effect type="fade" start="100" end="0" time="300" />
|
||||
<effect type="slide" start="0,0" end="115,0" time="300" />
|
||||
</animation>
|
||||
<control type="group">
|
||||
<control type="image">
|
||||
<top>0</top>
|
||||
<right>0</right>
|
||||
<top>15</top>
|
||||
<height>50</height>
|
||||
<width>100%</width>
|
||||
<!-- Background -->
|
||||
<control type="image">
|
||||
<top>0</top>
|
||||
<width>100%</width>
|
||||
<height>100%</height>
|
||||
<texture colordiffuse="80232323">white.png</texture>
|
||||
</control>
|
||||
<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>
|
||||
<!-- <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 type="group">
|
||||
<top>0</top>
|
||||
<right>0</right>
|
||||
<width>100%</width>
|
||||
<!-- buttons -->
|
||||
<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>[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 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" colordiffuse="FFFFFFFF">NextDialog/close.png</texturefocus>
|
||||
<texturenofocus border="10" colordiffuse="80FFFFFF">NextDialog/close.png</texturenofocus>
|
||||
<pulseonselect>no</pulseonselect>
|
||||
</control>
|
||||
</control>
|
||||
</control>
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
<controls>
|
||||
<control type="group">
|
||||
<animation type="WindowOpen" reversible="false">
|
||||
<effect type="fade" start="0" end="100" time="600" />
|
||||
<effect type="slide" start="115,0" end="0,0" time="600" />
|
||||
<effect type="fade" start="0" end="100" time="400" />
|
||||
<effect type="slide" start="115,0" end="0,0" time="400" />
|
||||
</animation>
|
||||
<animation type="WindowClose" reversible="false">
|
||||
<effect type="fade" start="100" end="0" time="400" />
|
||||
<effect type="slide" start="0,0" end="115,0" time="400" />
|
||||
<effect type="fade" start="100" end="0" time="300" />
|
||||
<effect type="slide" start="0,0" end="115,0" time="300" />
|
||||
</animation>
|
||||
<control type="group">
|
||||
<right>30</right>
|
||||
@@ -26,59 +26,47 @@
|
||||
<height>180</height>
|
||||
<texture>$INFO[Window.Property(next_img)]</texture>
|
||||
</control>
|
||||
<control type="group">
|
||||
<top>0</top>
|
||||
<control type="grouplist" id="20">
|
||||
<orientation>vertical</orientation>
|
||||
<height>220</height>
|
||||
<width>326</width>
|
||||
<itemgap>0</itemgap>
|
||||
<right>0</right>
|
||||
<width>100%</width>
|
||||
<!-- buttons -->
|
||||
<control type="button" id="3012">
|
||||
<left>-1000</left>
|
||||
<top>-1000</top>
|
||||
<height>1</height>
|
||||
<width>1</width>
|
||||
</control>
|
||||
<control type="grouplist" id="20">
|
||||
<orientation>vertical</orientation>
|
||||
<height>220</height>
|
||||
<width>326</width>
|
||||
<itemgap>0</itemgap>
|
||||
<label></label>
|
||||
<height>180</height>
|
||||
<width>326</width>
|
||||
<right>0</right>
|
||||
<control type="button" id="11">
|
||||
<label></label>
|
||||
<onclick>SendClick(3012)</onclick>
|
||||
<height>180</height>
|
||||
<width>326</width>
|
||||
<right>0</right>
|
||||
<font>font30_title</font>
|
||||
<textoffsety>20</textoffsety>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||
<selectedcolor>FFFFFFFF</selectedcolor>
|
||||
<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>
|
||||
<font>font30_title</font>
|
||||
<textoffsety>20</textoffsety>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||
<selectedcolor>FFFFFFFF</selectedcolor>
|
||||
<shadowcolor>22000000</shadowcolor>
|
||||
<aligny>top</aligny>
|
||||
<align>center</align>
|
||||
<texturefocus border="10">NextDialog/background-play.png</texturefocus>
|
||||
<texturenofocus border="10" colordiffuse="00232323">white.png</texturenofocus>
|
||||
<pulseonselect>no</pulseonselect>
|
||||
</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>
|
||||
<height>40</height>
|
||||
<aligny>center</aligny>
|
||||
@@ -86,12 +74,12 @@
|
||||
<align>center</align>
|
||||
<scroll>true</scroll>
|
||||
<scrollspeed>50</scrollspeed>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<shadowcolor>ff000000</shadowcolor>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<shadowcolor>FF000000</shadowcolor>
|
||||
<info>Window.Property(title)</info>
|
||||
<font>font30_title</font>
|
||||
</control>
|
||||
<control type="label">
|
||||
<control type="label">
|
||||
<bottom>40</bottom>
|
||||
<height>40</height>
|
||||
<aligny>center</aligny>
|
||||
@@ -99,26 +87,25 @@
|
||||
<align>center</align>
|
||||
<scroll>true</scroll>
|
||||
<scrollspeed>50</scrollspeed>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<shadowcolor>ff000000</shadowcolor>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<shadowcolor>FF000000</shadowcolor>
|
||||
<info>Window.Property(ep_title)</info>
|
||||
<font>font20_title</font>
|
||||
</control>
|
||||
<control type="label">
|
||||
<control type="label">
|
||||
<top>20</top>
|
||||
<right>25</right>
|
||||
<right>25</right>
|
||||
<height>auto</height>
|
||||
<aligny>top</aligny>
|
||||
<visible>true</visible>
|
||||
<align>right</align>
|
||||
<scroll>true</scroll>
|
||||
<scrollspeed>50</scrollspeed>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<shadowcolor>ff000000</shadowcolor>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<shadowcolor>FF000000</shadowcolor>
|
||||
<info>Player.TimeRemaining(secs),,</info>
|
||||
<font>font30_title</font>
|
||||
</control>
|
||||
</control>
|
||||
</control>
|
||||
</control>
|
||||
</controls>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<width>510</width>
|
||||
<height>640</height>
|
||||
<left>45</left>
|
||||
<texture>Shortcut/dialog-bg-solid.png</texture>
|
||||
<texture>Controls/dialog-bg-solid.png</texture>
|
||||
</control>
|
||||
<control type="textbox" id="10000">
|
||||
<top>30</top>
|
||||
@@ -39,8 +39,8 @@
|
||||
<textwidth>110</textwidth>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||
<texturefocus>Controls/KeyboardKey.png</texturefocus>
|
||||
<texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FF0082C2">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000082C2">white.png</texturenofocus>
|
||||
<align>center</align>
|
||||
<aligny>center</aligny>
|
||||
<label>$ADDON[plugin.video.kod 70007]</label>
|
||||
@@ -57,8 +57,8 @@
|
||||
<textwidth>110</textwidth>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||
<texturefocus>Controls/KeyboardKey.png</texturefocus>
|
||||
<texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FF0082C2">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000082C2">white.png</texturenofocus>
|
||||
<align>center</align>
|
||||
<aligny>center</aligny>
|
||||
<label>$ADDON[plugin.video.kod 707433]</label>
|
||||
@@ -75,8 +75,8 @@
|
||||
<textwidth>110</textwidth>
|
||||
<textcolor>FFFFFFFF</textcolor>
|
||||
<focusedcolor>FFFFFFFF</focusedcolor>
|
||||
<texturefocus>Controls/KeyboardKey.png</texturefocus>
|
||||
<texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus>
|
||||
<texturefocus colordiffuse="FF0082C2">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="000082C2">white.png</texturenofocus>
|
||||
<align>center</align>
|
||||
<aligny>center</aligny>
|
||||
<label>$ADDON[plugin.video.kod 70008]</label>
|
||||
@@ -96,9 +96,9 @@
|
||||
<left>75</left>
|
||||
<width>150</width>
|
||||
<height>150</height>
|
||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
||||
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||
<onup>10002</onup>
|
||||
<ondown>10008</ondown>
|
||||
@@ -110,9 +110,9 @@
|
||||
<left>225</left>
|
||||
<width>150</width>
|
||||
<height>150</height>
|
||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
||||
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||
<onup>10003</onup>
|
||||
<ondown>10009</ondown>
|
||||
@@ -124,9 +124,9 @@
|
||||
<left>375</left>
|
||||
<width>150</width>
|
||||
<height>150</height>
|
||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
||||
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||
<onup>10004</onup>
|
||||
<ondown>10010</ondown>
|
||||
@@ -138,9 +138,9 @@
|
||||
<left>75</left>
|
||||
<width>150</width>
|
||||
<height>150</height>
|
||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
||||
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||
<onup>10005</onup>
|
||||
<ondown>10011</ondown>
|
||||
@@ -152,9 +152,9 @@
|
||||
<left>225</left>
|
||||
<width>150</width>
|
||||
<height>150</height>
|
||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
||||
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||
<onup>10006</onup>
|
||||
<ondown>10012</ondown>
|
||||
@@ -166,9 +166,9 @@
|
||||
<left>375</left>
|
||||
<width>150</width>
|
||||
<height>150</height>
|
||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
||||
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||
<onup>10007</onup>
|
||||
<ondown>10013</ondown>
|
||||
@@ -180,9 +180,9 @@
|
||||
<left>75</left>
|
||||
<width>150</width>
|
||||
<height>150</height>
|
||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
||||
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||
<onup>10008</onup>
|
||||
<ondown>10002</ondown>
|
||||
@@ -194,9 +194,9 @@
|
||||
<left>225</left>
|
||||
<width>150</width>
|
||||
<height>150</height>
|
||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
||||
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||
<onup>10009</onup>
|
||||
<ondown>10003</ondown>
|
||||
@@ -208,9 +208,9 @@
|
||||
<left>375</left>
|
||||
<width>150</width>
|
||||
<height>150</height>
|
||||
<texturefocus colordiffuse="AA232323">Controls/background-diffuse.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">Controls/background-diffuse.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF232323">Controls/check_mark.png</alttexturefocus>
|
||||
<texturefocus colordiffuse="AA232323">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="00232323">white.png</texturenofocus>
|
||||
<alttexturefocus colordiffuse="FF0082C2">Controls/check_mark.png</alttexturefocus>
|
||||
<alttexturenofocus colordiffuse="FFFFFFFF">Controls/check_mark.png</alttexturenofocus>
|
||||
<onup>10010</onup>
|
||||
<ondown>10004</ondown>
|
||||
|
||||
53
resources/skins/Default/720p/ResumePlayback.xml
Normal file
@@ -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>
|
||||
<width>100%</width>
|
||||
<height>100%</height>
|
||||
<texturefocus colordiffuse="80232323">Shortcut/white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="80232323">Shortcut/white.png</texturenofocus>
|
||||
<texturefocus colordiffuse="80232323">white.png</texturefocus>
|
||||
<texturenofocus colordiffuse="80232323">white.png</texturenofocus>
|
||||
<animation effect="fade" time="200">WindowOpen</animation>
|
||||
<animation effect="fade" time="200">WindowClose</animation>
|
||||
<onclick>Action(close)</onclick>
|
||||
@@ -39,9 +39,9 @@
|
||||
<top>219</top>
|
||||
<width>1100</width>
|
||||
<height>10</height>
|
||||
<texturesliderbackground colordiffuse="FF232323">Shortcut/white.png</texturesliderbackground>
|
||||
<texturesliderbar colordiffuse="FF1f1f1f">Shortcut/white.png</texturesliderbar>
|
||||
<texturesliderbarfocus colordiffuse="FF0082C2">Shortcut/white.png</texturesliderbarfocus>
|
||||
<texturesliderbackground colordiffuse="FF232323">white.png</texturesliderbackground>
|
||||
<texturesliderbar colordiffuse="FF1f1f1f">white.png</texturesliderbar>
|
||||
<texturesliderbarfocus colordiffuse="FF0082C2">white.png</texturesliderbarfocus>
|
||||
<showonepage>false</showonepage>
|
||||
<orientation>horizontal</orientation>
|
||||
<ondown>32500</ondown>
|
||||
@@ -50,7 +50,7 @@
|
||||
<control type="image">
|
||||
<width>1100</width>
|
||||
<height>218</height>
|
||||
<texture colordiffuse="FF232323">Shortcut/white.png</texture>
|
||||
<texture colordiffuse="FF232323">white.png</texture>
|
||||
</control>
|
||||
<control type="list" id="32500">
|
||||
<left>-130</left>
|
||||
@@ -78,7 +78,7 @@
|
||||
<top>1</top>
|
||||
<width>220</width>
|
||||
<height>218</height>
|
||||
<texture colordiffuse="FF0082C2">Shortcut/white.png</texture>
|
||||
<texture colordiffuse="FF0082C2">white.png</texture>
|
||||
</control>
|
||||
<control type="textbox">
|
||||
<left>0</left>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 866 B |
|
Before Width: | Height: | Size: 912 B |
|
Before Width: | Height: | Size: 863 B |