- aggiunto nuovo canale: guardaserie.cam
- autoplay migliorato, ora i settaggi sono globali e non più per canale
- adesso in onda riscritto, ora usa EPG (ringraziamo epg-guide.com)
- Riprendi la visione di un film o episodio da server diversi (solo videoteca)
- fix e ottimizzazioni varie
This commit is contained in:
marco
2020-07-03 23:08:20 +02:00
parent 8b78c88e41
commit 0932a1969f
296 changed files with 3205 additions and 8075 deletions

View File

@@ -1,4 +1,4 @@
<addon id="plugin.video.kod" name="Kodi on Demand" version="1.1" provider-name="KoD Team">
<addon id="plugin.video.kod" name="Kodi on Demand" version="1.2" provider-name="KoD Team">
<requires>
<!-- <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>

View File

@@ -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",

View File

@@ -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

View File

@@ -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()

View File

@@ -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)

View File

@@ -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):

View File

@@ -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)

View File

@@ -11,8 +11,8 @@ host = support.config.get_channel_url()
headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'],
['Referer', host]]
list_servers = ['verystream','openload','rapidvideo','streamango']
list_quality = ['default']
@support.menu

View File

@@ -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)

View File

@@ -1,11 +0,0 @@
{
"id": "animesubita",
"name": "AnimeSubIta",
"active": false,
"language": ["sub-ita"],
"thumbnail": "animesubita.png",
"bannermenu": "animesubita.png",
"categories": ["anime", "vos"],
"settings": []
}

View File

@@ -1,123 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per AnimeSubIta
# ------------------------------------------------------------
from core import support
host = support.config.get_channel_url()
headers = {'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0'}
list_servers = ['directo']
list_quality = ['default']
@support.menu
def mainlist(item):
anime = ['/lista-anime/',
('Ultimi Episodi',['/category/ultimi-episodi/', 'peliculas', 'updated']),
('in Corso',['/category/anime-in-corso/', 'peliculas', 'alt']),
('Generi',['/generi/', 'genres', 'alt'])]
return locals()
def newest(categoria):
support.log(categoria)
itemlist = []
item = support.Item()
try:
if categoria == "anime":
item.url = host
item.args = "updated"
itemlist = peliculas(item)
if itemlist[-1].action == "ultimiep":
itemlist.pop()
# Continua l'esecuzione in caso di errore
except:
import sys
for line in sys.exc_info():
support.logger.error("{0}".format(line))
return []
return itemlist
def search(item, texto):
support.log(texto)
item.url = host + "/?s=" + texto
item.args = 'alt'
try:
return peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return []
@support.scrape
def genres(item):
blacklist= ['Anime In Corso','Ultimi Episodi']
patronMenu=r'<li><a title="[^"]+" href="(?P<url>[^"]+)">(?P<title>[^<]+)</a>'
action = 'peliculas'
return locals()
@support.scrape
def peliculas(item):
anime = True
if item.args == 'updated':
patron = r'<div class="post-thumbnail">\s*<a href="(?P<url>[^"]+)" title="(?P<title>.*?)\s*Episodio (?P<episode>\d+) (?P<lang>[a-zA-Z-\s]+)[^"]*"> <img[^src]+src="(?P<thumb>[^"]+)"'
patronNext = r'<link rel="next" href="([^"]+)"\s*/>'
action = 'findvideos'
elif item.args == 'alt':
patron = r'<div class="post-thumbnail">\s*<a href="(?P<url>[^"]+)" title="(?P<title>.*?)(?: [Oo][Aa][Vv])?(?:\s*(?P<lang>[Ss][Uu][Bb].[Ii][Tt][Aa]))[^"]+">\s*<img[^src]+src="(?P<thumb>[^"]+)"'
patronNext = r'<link rel="next" href="([^"]+)"\s*/>'
action = 'episodios'
else:
pagination = ''
patronBlock = r'<ul class="lcp_catlist"[^>]+>(?P<block>.*?)</ul>'
patron = r'<a href="(?P<url>[^"]+)"[^>]+>(?P<title>.*?)(?: [Oo][Aa][Vv])?(?:\s*(?P<lang>[Ss][Uu][Bb].[Ii][Tt][Aa])[^<]+)?</a>'
action = 'episodios'
return locals()
@support.scrape
def episodios(item):
anime = True
patron = r'<td style="[^"]*?">\s*.*?<strong>(?P<episode>[^<]+)</strong>\s*</td>\s*<td[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>\s*<img src="(?P<thumb>[^"]+?)"[^>]+>'
return locals()
def findvideos(item):
support.log(item)
itemlist = []
if item.args == 'updated':
ep = support.match(item.fulltitle, patron=r'(\d+)').match
item.url = support.re.sub(r'episodio-\d+-|oav-\d+-'+ep, '',item.url)
if 'streaming' not in item.url: item.url = item.url.replace('sub-ita','sub-ita-streaming')
item.url = support.match(item, patron= ep + r'[^>]+>[^>]+>[^>]+><a href="([^"]+)"').match
# post
url = host + '/' + support.match(item.url, patron=r'(episodio\d*.php.*?)"').match.replace('%3F','?').replace('%3D','=')
headers['Referer'] = url
cookies = ""
matches = support.re.compile('(.%s.*?)\n' % host.replace("http://", "").replace("www.", ""), support.re.DOTALL).findall(support.config.get_cookie_data())
for cookie in matches:
cookies += cookie.split('\t')[5] + "=" + cookie.split('\t')[6] + ";"
headers['Cookie'] = cookies[:-1]
url = support.match(url, patron=r'<source src="([^"]+)"[^>]+>').match
itemlist.append(
support.Item(channel=item.channel,
action="play",
title='Diretto',
url=url + '|' + support.urllib.urlencode(headers),
server='directo'))
return support.server(item,itemlist=itemlist)

View File

@@ -1,10 +0,0 @@
{
"id": "animetubeita",
"name": "AnimeTubeITA",
"active": false,
"language": ["sub-ita"],
"thumbnail": "animetubeita.png",
"bannermenu": "animetubeita.png",
"categories": ["anime","vos"],
"settings": []
}

View File

@@ -1,137 +0,0 @@
# -*- coding: utf-8 -*-
# ----------------------------------------------------------
# Canale per animetubeita
# ----------------------------------------------------------
import re
import urllib
from core import support
host = support.config.get_channel_url()
headers = {'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0'}
list_servers = ['directo']
list_quality = ['default']
@support.menu
def mainlist(item):
anime = [('Generi',['/generi', 'genres', 'genres']),
('Ordine Alfabetico',['/lista-anime', 'peliculas', 'list']),
('In Corso',['/category/serie-in-corso/', 'peliculas', 'in_progress'])
]
return locals()
@support.scrape
def genres(item):
blacklist = ['Ultimi Episodi', 'Serie in Corso']
patronMenu = r'<li[^>]+><a href="(?P<url>[^"]+)" >(?P<title>[^<]+)</a>'
action = 'peliculas'
return locals()
def search(item, text):
support.log(text)
item.url = host + '/lista-anime'
item.args = 'list'
item.search = text
try:
return peliculas(item)
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return []
def newest(categoria):
support.log(categoria)
item = support.Item()
try:
if categoria == "anime":
item.contentType='tvshow'
item.url = host
item.args = "last"
return peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.logger.error("{0}".format(line))
return []
@support.scrape
def peliculas(item):
anime = True
if not item.search: pagination = ''
action = 'episodios'
if item.args == 'list':
search = item.search
patronBlock = r'<ul class="page-list ">(?P<block>.*?)<div class="wprc-container'
patron = r'<li.*?class="page_.*?href="(?P<url>[^"]+)">(?P<title>.*?) Sub Ita'
elif item.args == 'last':
action = 'findvideos'
item.contentType='episode'
patronBlock = r'<div class="blocks">(?P<block>.*?)<div id="sidebar'
patron = r'<h2 class="title"><a href="(?P<url>[^"]+)" [^>]+>.*?<img.*?src="(?P<thumb>[^"]+)".*?<strong>Titolo</strong></td>.*?<td>(?P<title>.*?)\s*Episodio\s*(?P<episode>\d+)[^<]+</td>.*?<td><strong>Trama</strong></td>\s*<td>(?P<plot>[^<]+)<'
elif item.args in ['in_progress','genres']:
patronBlock = r'<div class="blocks">(?P<block>.*?)<div id="sidebar'
patron = r'<h2 class="title"><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.*?)\s* Sub Ita[^<]+</a></h2>.*?<img.*?src="(?P<thumb>.*?)".*?<td><strong>Trama</strong></td>.*?<td>(?P<plot>[^<]+)<'
patronNext = r'href="([^"]+)" >&raquo;'
else:
patronBlock = r'<div class="blocks">(?P<block>.*?)<div id="sidebar'
patron = r'<img.*?src="(?P<thumb>[^"]+)".*?<strong>Titolo</strong></td>.*?<td>\s*(?P<title>.*?)\s*Episodio[^<]+</td>.*?<td><strong>Trama</strong></td>\s*<td>(?P<plot>[^<]+)<.*?<a.*?href="(?P<url>[^"]+)"'
patronNext = r'href="([^"]+)" >&raquo;'
return locals()
@support.scrape
def episodios(item):
patronBlock = r'<h6>Episodio</h6>(?P<block>.*?)(?:<!--|</table>)'
patron = r'<strong>(?P<title>[^<]+)</strong>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><a href="http://link\.animetubeita\.com/2361078/(?P<url>[^"]+)"'
action = 'findvideos'
return locals()
def findvideos(item):
itemlist=[]
if item.args == 'last':
match = support.match(item, patron=r'href="(?P<url>[^"]+)"[^>]+><strong>DOWNLOAD &amp; STREAMING</strong>').match
if match:
patronBlock = r'<h6>Episodio</h6>(?P<block>.*?)(?:<!--|</table>)'
patron = r'<a href="http://link\.animetubeita\.com/2361078/(?P<url>[^"]+)"'
match = support.match(match, patron=patron, patronBlock=patronBlock, headers=headers).match
else: return itemlist
if match: item.url = match[-1]
else: return itemlist
data = support.httptools.downloadpage(item.url, headers=headers).data
cookies = ""
matches = re.compile('(.animetubeita.com.*?)\n', re.DOTALL).findall(support.config.get_cookie_data())
for cookie in matches:
name = cookie.split('\t')[5]
value = cookie.split('\t')[6]
cookies += name + "=" + value + ";"
headers['Referer'] = item.url
headers['Cookie'] = cookies[:-1]
url = support.scrapertools.find_single_match(data, """<source src="([^"]+)" type='video/mp4'>""")
if not url: url = support.scrapertools.find_single_match(data, 'file: "([^"]+)"')
if url:
url += '|' + urllib.urlencode(headers)
itemlist.append(
support.Item(channel=item.channel,
action="play",
title='diretto',
server='directo',
quality='',
url=url,
thumbnail=item.thumbnail,
fulltitle=item.fulltitle,
show=item.show,
contentType=item.contentType,
folder=False))
return support.server(item, itemlist=itemlist)

View File

@@ -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)

View File

@@ -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

View File

@@ -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):

View File

@@ -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):

View File

@@ -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 LINDIRIZZO UFFICIALE','Lista Richieste Up &amp; 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="([^"]+)"'

View File

@@ -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+(?:&#8211;|-)\s+<a href="?([^" ]+)')
folderUrl = scrapertools.find_single_match(data, r'TUTTA LA \w+\s+(?:&#8211;|-)\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*(?:&#215;|×)[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)

View File

@@ -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():

View File

@@ -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)

View File

@@ -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)

View File

@@ -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()

View File

@@ -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

View File

@@ -1,7 +1,7 @@
{
"id": "filmigratis",
"name": "Filmi Gratis",
"active": true,
"active": false,
"language": ["ita", "sub-ita"],
"thumbnail": "filmigratis.png",
"banner": "filmigratis.png",

View File

@@ -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]]

View File

@@ -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):

View File

@@ -1,61 +0,0 @@
{
"id": "filmsenzalimiticc",
"name": "Filmsenzalimiti CC",
"active": false,
"language": ["ita"],
"thumbnail": "filmsenzalimiticc.png",
"banner": "",
"categories": ["movie","tvshow"],
"settings": [
{
"id": "include_in_global_search",
"type": "bool",
"label": "Includi ricerca globale",
"default": false,
"enabled": false,
"visible": false
},
{
"id": "include_in_newest_peliculas",
"type": "bool",
"label": "Includi in Novità - Film",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "include_in_newest_series",
"type": "bool",
"label": "Includi in Novità - Serie TV",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "checklinks",
"type": "bool",
"label": "Verifica se i link esistono",
"default": false,
"enabled": true,
"visible": true
},
{
"id": "checklinks_number",
"type": "list",
"label": "Numero de link da verificare",
"default": 1,
"enabled": true,
"visible": "eq(-1,true)",
"lvalues": [ "1", "3", "5", "10" ]
},
{
"id": "filter_languages",
"type": "list",
"label": "Mostra link in lingua...",
"default": 0,
"enabled": true,
"visible": true,
"lvalues": ["Non filtrare","IT"]
}
]
}

View File

@@ -1,317 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per Filmsenzalimiti CC
# ------------------------------------------------------------
import re
try:
import urlparse
except:
import urllib.parse as urlparse
from core import scrapertools, servertools, httptools
from core import tmdb
from core.item import Item
from platformcode import config
from platformcode import logger
from specials import autoplay
# Necessario per Autoplay
host = config.get_channel_url()
IDIOMAS = {'Italiano': 'IT'}
list_language = IDIOMAS.values()
list_servers = ['verystream', 'openload', 'vidlox', 'youtube']
list_quality = ['default']
# Necessario per Verifica Link
checklinks = config.get_setting('checklinks', 'filmsenzalimiticc')
checklinks_number = config.get_setting('checklinks_number', 'filmsenzalimiticc')
headers = [['Referer', host]]
def mainlist(item):
logger.info('[filmsenzalimiticc.py] mainlist')
autoplay.init(item.channel, list_servers, list_quality) # Necessario per Autoplay
# Menu Principale
itemlist = [Item(channel=item.channel,
action='video',
title='Film',
url=host,
contentType='movie',
thumbnail=''),
Item(channel=item.channel,
action='sottomenu_film',
title='Categorie Film',
url=host,
contentType='movie',
thumbnail=''),
Item(channel=item.channel,
action='video',
title='Serie TV',
url=host+'/serie-tv/',
contentType='tvshow',
thumbnail=''),
Item(channel=item.channel,
action='sottomenu_serie',
title='[B]Categorie Serie TV[/B]',
thumbnail=''),
Item(channel=item.channel,
action='search',
extra='tvshow',
title='[B]Cerca... (non funziona)[/B]',
thumbnail='')
]
autoplay.show_option(item.channel, itemlist) # Necessario per Autoplay (Menu Configurazione)
return itemlist
def search(item, texto):
logger.info('[filmsenzalimiticc.py] search')
item.url = host + '/?s=' + texto
try:
return video(item)
# Continua la ricerca in caso di errore .
except:
import sys
for line in sys.exc_info():
logger.error('%s' % line)
return []
def sottomenu_film(item):
logger.info('[filmsenzalimiticc.py] sottomenu_film')
itemlist = []
# Carica la pagina
data = httptools.downloadpage(item.url).data
# Estrae i contenuti
patron = "<li><a href='([^']+)'>(.*?)<"
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedtitle in matches:
itemlist.append(
Item(channel=__channel__,
action='video',
contentType=item.contentType,
title=scrapedtitle,
url=scrapedurl))
# Elimina le Serie al Sottomenù
itemlist.pop(3)
itemlist.pop(29)
itemlist.pop(29)
itemlist.pop(32)
return itemlist
def sottomenu_serie(item):
logger.info('[seriehd.py] sottomenu_serie')
itemlist = [
Item(channel=item.channel,
action='video',
title='Serie TV HD',
url=host+'/watch-genre/serie-altadefinizione/',
contentType='tvshow',
thumbnail=''),
Item(channel=item.channel,
action='video',
title='Miniserie',
url=host+'/watch-genre/miniserie/',
contentType='tvshow',
thumbnail=''),
Item(channel=item.channel,
action='video',
title='Programmi TV',
url=host+'/watch-genre/programmi-tv/',
contentType='tvshow',
thumbnail='')
]
return itemlist
def video(item):
logger.info('[filmsenzalimiticc.py] video')
itemlist = []
# Carica la pagina
data = httptools.downloadpage(item.url).data.replace('\n','').replace('\t','')
# Estrae i contenuti
patron = r'<div class="mediaWrap mediaWrapAlt">.*?<a href="([^"]+)".*?src="([^"]+)".*?<p>([^"]+) (\(.*?)streaming<\/p>.*?<p>\s*(\S+).*?<\/p>'
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedyear, scrapedquality in matches:
scrapedthumbnail = httptools.get_url_headers(scrapedthumbnail)
scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle)
scrapedyear = scrapertools.decodeHtmlentities(scrapedyear)
scrapedquality = scrapertools.decodeHtmlentities(scrapedquality)
year = scrapedyear.replace('(','').replace(')','')
infolabels = {}
if year:
infolabels['year'] = year
title = scrapedtitle + ' '+ scrapedyear +' [' + scrapedquality + ']'
# Seleziona fra Serie TV e Film
if item.contentType == 'movie':
azione = 'findvideos'
tipologia = 'movie'
if item.contentType == 'tvshow':
azione='episodios'
tipologia = 'tv'
itemlist.append(
Item(channel=item.channel,
action=azione,
contentType=item.contentType,
title=title,
fulltitle=scrapedtitle,
text_color='azure',
url=scrapedurl,
thumbnail=scrapedthumbnail,
infoLabels=infolabels,
show=scrapedtitle))
# Next page
next_page = scrapertools.find_single_match(data, '<a class="nextpostslink".*?href="([^"]+)">')
if next_page != '':
itemlist.append(
Item(channel=item.channel,
action='film',
title='[COLOR lightgreen]' + config.get_localized_string(30992) + '[/COLOR]',
url=next_page,
contentType=item.contentType,
thumbnail='http://2.bp.blogspot.com/-fE9tzwmjaeQ/UcM2apxDtjI/AAAAAAAAeeg/WKSGM2TADLM/s1600/pager+old.png'))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
return itemlist
def findvideos(item): # Questa def. deve sempre essere nominata findvideos
logger.info('[filmsenzalimiticc.py] findvideos')
itemlist = []
# Carica la pagina
data = httptools.downloadpage(item.url, headers=headers).data
# Aggira protectlink
if 'protectlink' in data:
urls = scrapertools.find_multiple_matches(data, r'<iframe src="[^=]+=(.*?)"')
for url in urls:
url= url.decode('base64')
if '\t' in url: #fix alcuni link presentano una tabulazione finale.
url = url[:-1]
data += '\t' + url
if 'nodmca' in data: #fix player Openload sezione Serie TV
page = httptools.downloadpage(url, headers=headers).data
data += '\t' + scrapertools.find_single_match(page,'<meta name="og:url" content="([^=]+)">')
itemlist = servertools.find_video_items(data=data)
for videoitem in itemlist:
videoitem.title = item.fulltitle + ' - [[COLOR limegreen]'+videoitem.title+'[/COLOR] ]'
videoitem.fulltitle = item.fulltitle
videoitem.thumbnail = item.thumbnail
videoitem.show = item.show
videoitem.plot = item.plot
videoitem.channel = item.channel
videoitem.contentType = item.contentType
# Link Aggiungi alla Libreria
if item.contentType != 'episode':
if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findservers':
itemlist.append(
Item(channel=item.channel, title='[COLOR lightblue][B]Aggiungi alla videoteca[/B][/COLOR]', url=item.url,
action='add_pelicula_to_library', extra='findservers', contentTitle=item.contentTitle))
# Necessario per FilterTools
# itemlist = filtertools.get_links(itemlist, item, list_language)
# Necessario per AutoPlay
autoplay.start(itemlist, item)
return itemlist
def episodios(item): # Questa def. deve sempre essere nominata episodios
logger.info('[filmsenzalimiticc.py] episodios')
itemlist = []
# Trova le Stagioni
# Carica la pagina
data = httptools.downloadpage(item.url, headers=headers).data
# Estrae i contenuti
patron = r'<iframe src="([^"]+)".*?>'
url = scrapertools.find_single_match(data, patron)
# Carica la pagina
data = httptools.downloadpage(url).data.replace('\t', '').replace('\n', '')
# Estrae i contenuti
section_stagione = scrapertools.find_single_match(data, r'Stagioni<\/a>(.*?)<\/ul>')
patron = r'<a href="([^"]+)" >.*?<\/i>\s(.*?)<\/a>'
seasons = re.compile(patron, re.DOTALL).findall(section_stagione)
for scrapedseason_url, scrapedseason in seasons:
# Trova gli Episodi
season_url = urlparse.urljoin(url, scrapedseason_url)
# Carica la pagina
data = httptools.downloadpage(season_url).data.replace('\t', '').replace('\n', '')
# Estrae i contenuti
section_episodio = scrapertools.find_single_match(data, r'Episodio<\/a>(.*?)<\/ul>')
patron = r'<a href="([^"]+)" >.*?<\/i>\s(.*?)<\/a>'
episodes = re.compile(patron, re.DOTALL).findall(section_episodio)
for scrapedepisode_url, scrapedepisode in episodes:
episode_url = urlparse.urljoin(url, scrapedepisode_url)
title = scrapedseason + 'x' + scrapedepisode.zfill(2)
itemlist.append(
Item(channel=item.channel,
action='findvideos',
contentType='episode',
title=title,
url=episode_url,
fulltitle=title + ' - ' + item.show,
show=item.show,
thumbnail=item.thumbnail))
# Link Aggiungi alla Libreria
if config.get_videolibrary_support() and len(itemlist) != 0:
itemlist.append(
Item(channel=item.channel,
title='[COLOR lightblue][B]Aggiungi Serie alla videoteca[/B][/COLOR]',
url=item.url,
action='add_serie_to_library',
extra='episodios' + '###' + item.extra,
show=item.show))
return itemlist

View File

@@ -0,0 +1,11 @@
{
"id": "guardaserieCam",
"name": "GuardaSerie Cam",
"language": ["ita", "sub-ita"],
"active": true,
"thumbnail": "https://raw.githubusercontent.com/32Dexter/DexterRepo/master/media/guardaserie_live.png",
"banner": "",
"categories": ["tvshow"],
"not_active": ["include_in_newest"],
"settings": []
}

View File

@@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per 'guardaserie_live'
# By: Napster32
# ------------------------------------------------------------
# Rev: 0.0
# Update 11-06-2020
# fix:
# 1. Emissione
# possibilità di miglioramento: inserire menu per genere - lista serie tv e gestire le novità
from core import support
from core.support import log
from platformcode import logger, config
host = config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
tvshow = ['/serietv-streaming',
('Per Lettera', ['/serietv-streaming/A', 'list', 'Serie-Tv per Lettera'])
]
return locals()
@support.scrape
def list(item):
patronMenu = r'<a title="(?P<title>[^"]+)" href="(?P<url>[^"]+)'
action = 'peliculas'
return locals()
@support.scrape
def peliculas(item):
patron = r'<div class="mlnh-thumb"><a href="(?P<url>[^"]+).*?title="(?P<title>[^"]+).*?src="(?P<thumb>[^"]+).*?hdn">(?P<year>[0-9]{4})'
patronNext = 'pagenavi.*?<span>.</span>.*?<a href="([^"]+)'
action = 'episodios'
return locals()
@support.scrape
def episodios(item):
patronBlock = r'<div class="tab-pane fade" id="season-(?P<season>.)"(?P<block>.*?)</div>'
patron = r'<a href="#" allowfullscreen data-link="(?P<url>[^"]+).*?title="(?P<title>[^"]+)(?P<lang>[sS][uU][bB]-?[iI][tT][aA])?\s*">(?P<episode>[^<]+)'
action = 'findvideos'
# debug = True
return locals()
def search(item, text):
support.log('search', item)
item.contentType = 'tvshow'
itemlist = []
text = text.replace(' ', '+')
item.url = host + '/index.php?story=%s&do=search&subaction=search' % (text)
try:
return peliculas(item)
except:
import sys
for line in sys.exc_info():
log('search log:', line)
return []
def findvideos(item):
logger.info("[guardaserie_live] findvideos")
return support.server(item, item.url)

View File

@@ -0,0 +1,11 @@
{
"id": "guardaserieIcu",
"name": "Guarda Serie Icu",
"language": ["ita", "sub-ita"],
"active": false,
"thumbnail": "https://raw.githubusercontent.com/32Dexter/DexterRepo/master/media/guarda_serie.jpg",
"banner": "",
"categories": ["tvshow"],
"not_active": ["include_in_newest"],
"settings": []
}

View File

@@ -0,0 +1,59 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per 'Guarda_Serie'
# By: Napster32
# ------------------------------------------------------------
# Rev: 0.0
# Update 11-06-2020
# fix:
# 1. Emissione
# possibilità di miglioramento: gestire le novità (sezione Ultimi episodi sul sito)
from core.support import log
from core import support
from platformcode import config
host = config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
tvshow = ['/serie']
return locals()
@support.scrape
def peliculas(item):
patronBlock = r'movies-list movies-list-full(?P<block>.*?)footer>'
patron = r'<div data-movie-id.*?a href="(?P<url>[^"]+).*?<img data-original="(?P<thumbnail>[^"]+).*?qtip-title">(?P<title>[^<]+).*?(?:rel="tag">(?P<year>[0-9]{4}))?</a>'
patronNext = '<li class=.active.>.*?href=.(.*?).>'
action = 'episodios'
return locals()
@support.scrape
def episodios(item):
patronBlock = r'<strong>Stagione (?P<season>[0-9]+)(?P<block>.*?)</div></div>'
patron = r'<a href="(?P<url>[^"]+)">\s*Episodio\s*(?P<episode>[0-9]+)'
return locals()
def search(item, text):
log(text)
itemlist = []
text = text.replace(' ', '+')
item.url = host + "/?s=" + text
try:
item.args = 'search'
return peliculas(item)
except:
import sys
for line in sys.exc_info():
log("%s" % line)
return []
def findvideos(item):
support.log('findvideos', item)
return support.server(item, headers=headers)

View File

@@ -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):

View File

@@ -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):

View File

@@ -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:

View File

@@ -6,5 +6,5 @@
"thumbnail": "ilgeniodellostreaming.png",
"banner": "ilgeniodellostreaming.png",
"categories": ["movie", "tvshow", "anime", "vos"],
"settings": []
"settings": ["include_in_newest_anime"]
}

View File

@@ -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

View File

@@ -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):

View File

@@ -0,0 +1,13 @@
{
"id": "mediasetplay",
"name": "Mediaset Play",
"active": false,
"language": ["ita"],
"thumbnail": "mediasetplay.png",
"banner": "mediasetplay.png",
"categories": ["movie", "tvshow", "documentary", "live"],
"not_active": ["include_in_newest"],
"default_off": ["include_in_global_search"],
"settings": [],
"cloudflare": true
}

230
channels/mediasetplay.py Normal file
View File

@@ -0,0 +1,230 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per Mediaset Play
# ------------------------------------------------------------
import requests
from core import support, httptools
import sys
if sys.version_info[0] >= 3:
from concurrent import futures
from urllib.parse import urlencode, quote
else:
from concurrent_py2 import futures
from urllib import urlencode, quote
current_session = requests.Session()
data = {"cid": "dc4e7d82-89a5-4a96-acac-d3c7f2ca6d67", "platform": "pc", "appName": "web/mediasetplay-web/576ea90"}
res = current_session.post("https://api-ott-prod-fe.mediaset.net/PROD/play/idm/anonymous/login/v1.0", json=data, verify=False)
current_session.headers.update({'t-apigw': res.headers['t-apigw']})
current_session.headers.update({'t-cts': res.headers['t-cts']})
tracecid=res.json()['response']['traceCid']
cwid=res.json()['response']['cwId']
res = current_session.get("https://api.one.accedo.tv/session?appKey=59ad346f1de1c4000dfd09c5&uuid=sdd",verify=False)
current_session.headers.update({'x-session': res.json()['sessionKey']})
host = ''
entry = 'https://api.one.accedo.tv/content/entry/{id}?locale=it'
entries = 'https://api.one.accedo.tv/content/entries?id={id}&locale=it'
@support.menu
def mainlist(item):
top = [('Dirette {bold}', ['https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-stations?sort=ShortTitle', 'live'])]
menu = [('Film {bullet bold}', ['5acfcbc423eec6000d64a6bb', 'menu', ['Tutti','all','Cinema']]),
('Fiction / Serie TV {bullet bold}', ['5acfcb3c23eec6000d64a6a4', 'menu', ['Tutte','all','Fiction'], 'tvshow']),
('Programmi TV{ bullet bold}', ['', 'menu', ['Tutti','all','Programmi Tv'], 'tvshow']),
('Documentari {bullet bold}', ['5bfd17c423eec6001aec49f9', 'menu', ['Tutti','all','Documentari'], 'undefined']),
('Kids {bullet bold}', ['5acfcb8323eec6000d64a6b3', 'menu',['Tutti','all','Kids'], 'undefined']),
]
search = ''
return locals()
def search(item, text):
support.log(text)
item.search = text
if not item.args:
item.contentType = 'undefined'
item.args=['','all','']
itemlist = []
try:
itemlist += peliculas(item)
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return itemlist
def menu(item):
support.log()
itemlist = [item.clone(title=support.typo(item.args[0],'bullet bold'), url='', action='peliculas')]
if item.url:
json = get_from_id(item)
for it in json:
if 'uxReference' in it: itemlist.append(item.clone(title=support.typo(it['title'], 'submenu'), url=it['uxReference'], args = '', action='peliculas'))
itemlist.append(item.clone(title=support.typo('Cerca...','submenu bold'), url='', action ='search'))
return itemlist
def live(item):
support.log()
itemlist = []
json = current_session.get(item.url).json()['entries']
for it in json:
urls = []
if it['tuningInstruction'] and not it['mediasetstation$digitalOnly']:
guide=current_session.get('https://static3.mediasetplay.mediaset.it/apigw/nownext/' + it['callSign'] + '.json').json()['response']
plot = support.typo(guide['currentListing']['mediasetlisting$epgTitle'],'bold') + '\n' + guide['currentListing']['mediasetlisting$shortDescription'] + '\n' + guide['currentListing']['description'] + '\n\n' + support.typo('A Seguire:' + guide['nextListing']['mediasetlisting$epgTitle'], 'bold')
for key in it['tuningInstruction']['urn:theplatform:tv:location:any']: urls += key['publicUrls']
itemlist.append(item.clone(title=support.typo(it['title'], 'bold'),
fulltitle=it['title'],
show=it['title'],
contentTitle=it['title'],
thumbnail=it['thumbnails']['channel_logo-100x100']['url'],
forcethumb = True,
url=urls,
plot=plot,
action='play'))
return itemlist
def peliculas(item):
support.log()
itemlist = []
contentType = ''
json = get_programs(item)
for it in json:
if item.search.lower() in it['title'].lower():
if item.contentType == 'movie':
action = 'findvideos'
urls = []
if 'media' not in it: it = subBrand(it['mediasetprogram$brandId'])[-1]
if 'media' in it:
for key in it['media']:
urls.append(key['publicUrl'])
elif item.contentType == 'tvshow':
action = 'episodios'
urls = it['mediasetprogram$brandId']
else:
if 'media' in it:
action = 'findvideos'
contentType = 'movie'
urls = []
for key in it['media']:
urls.append(key['publicUrl'])
else:
action = 'episodios'
contentType = 'tvshow'
urls = it['mediasetprogram$brandId']
if urls:
itemlist.append(
item.clone(channel=item.channel,
action=action,
title=support.typo(it['title'], 'bold'),
fulltitle=it['title'],
show=it['title'],
contentType=contentType if contentType else item.contentType,
contentTitle=it['title'] if 'movie' in [contentType, item.contentType] else '',
contentSerieName=it['title'] if 'tvshow' in [contentType, item.contentType] else '',
thumbnail=it['thumbnails']['image_vertical-264x396']['url'],
fanart=it['thumbnails']['image_keyframe_poster-1280x720']['url'] if 'image_keyframe_poster-1280x720' in it['thumbnails'] else '',
plot=it['longDescription'] if 'longDescription' in it else it['description'] if 'description' in it else '',
url=urls))
return itemlist
def episodios(item):
support.log()
itemlist = []
subBrandId = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-brands?byCustomValue={brandId}{' + item.url + '}').json()['entries'][-1]['mediasetprogram$subBrandId']
json = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs?byCustomValue={subBrandId}{' + subBrandId + '}').json()['entries']
for it in json:
urls = []
if 'media' in it:
for key in it['media']:
urls.append(key['publicUrl'])
if urls:
title = it['title'].split('-')[-1].strip()
if it['tvSeasonNumber'] and it['tvSeasonEpisodeNumber']:
item.infoLabels['season'] = it['tvSeasonNumber']
item.infoLabels['episode'] = it['tvSeasonEpisodeNumber']
episode = '%dx%02d - ' % (it['tvSeasonNumber'], it['tvSeasonEpisodeNumber'])
else: episode = ''
itemlist.append(
item.clone(action='findvideos',
title=support.typo(episode + title, 'bold'),
fulltitle=title,
show=title,
contentType='episode',
contentSerieName = title,
thumbnail=it['thumbnails']['image_vertical-264x396']['url'],
fanart=it['thumbnails']['image_keyframe_poster-1280x720']['url'] if 'image_keyframe_poster-1280x720' in it['thumbnails'] else '',
plot=it['longDescription'] if 'longDescription' in it else it['description'],
url=urls))
support.videolibrary(itemlist, item)
return sorted(itemlist, key=lambda it: it.title)
def findvideos(item):
support.log()
itemlist = []
itemlist.append(support.Item(server = 'directo', title = 'Direct', url = item.url, action = 'play'))
return support.server(item, itemlist=itemlist, Download=False)
def play(item):
support.log()
for url in item.url:
url = httptools.downloadpage(url, allow_redirects=True).url
if '.mpd' in url: data = url
return support.servertools.find_video_items(item, data=data)
def subBrand(json):
support.log()
subBrandId = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-brands?byCustomValue={brandId}{' + json + '}').json()['entries'][-1]['mediasetprogram$subBrandId']
json = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs?byCustomValue={subBrandId}{' + subBrandId + '}').json()['entries']
return json
def get_from_id(item):
support.log()
json = current_session.get(entry.format(id=item.url)).json()
if 'components' in json:
id = quote(",".join(json["components"]))
json = current_session.get(entries.format(id=id)).json()
if 'entries' in json:
support.log(json['entries'])
return json['entries']
return {}
def get_programs(item, ret=[], args={}):
support.log()
hasMore = False
if not args:
if item.url:
args['uxReference'] = item.url
args['platform'] = 'pc'
else:
args = {"query": "*:*"}
if item.args[2]:
args['categories'] = item.args[2]
args['cwId'] = cwid
args['traceCid'] = tracecid
args['hitsPerPage'] = 500
args['page'] = '0'
if 'all' in item.args: url = 'https://api-ott-prod-fe.mediaset.net/PROD/play/rec/azlisting/v1.0?' + urlencode(args)
else: url="https://api-ott-prod-fe.mediaset.net/PROD/play/rec/cataloguelisting/v1.0?" + urlencode(args)
json = current_session.get(url).json()
if 'response' in json:
json = json['response']
if 'hasMore' in json:
hasMore = json['hasMore']
if 'components' in json:
id = quote(",".join(json["components"]))
json = current_session.get(entries.format(id=id)).json()
if 'entries' in json:
ret += json['entries']
if hasMore:
args['page'] = str(int(args['page']) + 1)
return get_programs(item, ret, args)
else:
return ret

View File

@@ -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()

View File

@@ -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}

View File

@@ -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)

View File

@@ -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]]

View File

@@ -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

View File

@@ -1,7 +1,7 @@
{
"id": "pufimovies",
"name": "PufiMovies",
"active": true,
"active": false,
"language": ["ita", "sub-ita"],
"thumbnail": "pufimovies.png",
"banner": "pufimovies.png",

View File

@@ -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

View File

@@ -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
}

View File

@@ -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

View File

@@ -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):

View File

@@ -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>[^"]+)"(?:|.+?)?>(?:&nbsp;&nbsp;)?[ ]?(?P<title>.*?)[ ]?(?P<quality>HD)?[ ]?(?P<year>\d+)?(?: | HD | Streaming | MD(?: iSTANCE)? )?</a>'
@@ -183,17 +184,6 @@ def findvideos(item):
series = support.typo(item.contentSerieName, ' bold color kod')
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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -11,8 +11,8 @@ la lista delle pagine non sarà affatto 'uniforme' (a seconda di come viene pres
host = config.get_channel_url()
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

View File

@@ -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()

View File

@@ -9,8 +9,8 @@ host = support.config.get_channel_url()
headers = [['Referer', host]]
list_servers = ['wstream', 'openload', 'streamango']
list_quality = ['HD', 'default']
@support.menu

View File

@@ -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

View File

@@ -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 &#x25b6; TROVA L&#8217;INDIRIZZO UFFICIALE ', 'AVVISO IMPORTANTE CB01.UNO', 'GUIDA VEDOHD']
@@ -52,18 +52,7 @@ def findvideos(item):
title = server + " [COLOR blue][" + quality + "][/COLOR]"
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)

View File

@@ -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):

View File

@@ -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'],

View File

@@ -256,7 +256,7 @@ def get_channel_setting(name, channel, default=None):
file_settings = filetools.join(config.get_data_path(), "settings_channels", channel + "_data.json")
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

View File

@@ -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

View File

@@ -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:

View File

@@ -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.

View File

@@ -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|-|&#8211;|&#215;|×', 'x', scraped['episode'])
ep = ep.replace('-', 'x')
ep = ep.replace('&#8211;', 'x')
ep = ep.replace('&#215;', 'x')
ep = ep.replace('×', 'x')
return ep
def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, typeContentDict, typeActionDict, blacklist, search, pag, function, lang, sceneTitle):
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|&#8211|&#215;|×', '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|&#8211|&#215;|×', '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('&amp;', '&',next_page)
next_page = next_page.replace('&amp;', '&')
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):

View File

@@ -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")

File diff suppressed because it is too large Load Diff

View File

@@ -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:

View File

@@ -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'

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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()

View File

@@ -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 ""

View File

@@ -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"

View File

@@ -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)"/>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View 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>

View File

@@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 912 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 863 B

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