KoD 1.5.2

- Migliorato Menu Rapido\n- Rimosso Menu Laterale\n- Fix Youtube\n- Fix Visualizza collegamenti della videoteca come pop-up\n- Riorganizzata sezione Aiuto\n- Reinserito canale tantifilm\n
This commit is contained in:
marco
2021-01-09 20:34:42 +01:00
parent d169179e15
commit 47f02db14b
38 changed files with 572 additions and 1128 deletions
+7 -4
View File
@@ -1,4 +1,4 @@
<addon id="plugin.video.kod" name="Kodi on Demand" version="1.5.1" provider-name="KoD Team"> <addon id="plugin.video.kod" name="Kodi on Demand" version="1.5.2" provider-name="KoD Team">
<requires> <requires>
<!-- <import addon="script.module.libtorrent" optional="true"/> --> <!-- <import addon="script.module.libtorrent" optional="true"/> -->
<import addon="metadata.themoviedb.org"/> <import addon="metadata.themoviedb.org"/>
@@ -26,9 +26,12 @@
<screenshot>resources/media/themes/ss/2.png</screenshot> <screenshot>resources/media/themes/ss/2.png</screenshot>
<screenshot>resources/media/themes/ss/3.png</screenshot> <screenshot>resources/media/themes/ss/3.png</screenshot>
</assets> </assets>
<news>- corretta e migliorata la nuova ricerca globale <news>- Migliorato Menu Rapido
- salvataggio punto di visione basato sull'id tmdb (disponibile su qualunque canale / server anche senza salvare in videoteca) - Rimosso Menu Laterale
- alcuni fix e migliore</news> - Fix Youtube
- Fix Visualizza collegamenti della videoteca come pop-up
- Riorganizzata sezione Aiuto
- Reinserito canale tantifilm</news>
<description lang="it">Naviga velocemente sul web e guarda i contenuti presenti</description> <description lang="it">Naviga velocemente sul web e guarda i contenuti presenti</description>
<disclaimer>[COLOR red]The owners and submitters to this addon do not host or distribute any of the content displayed by these addons nor do they have any affiliation with the content providers.[/COLOR] <disclaimer>[COLOR red]The owners and submitters to this addon do not host or distribute any of the content displayed by these addons nor do they have any affiliation with the content providers.[/COLOR]
[COLOR yellow]Kodi © is a registered trademark of the XBMC Foundation. We are not connected to or in any other way affiliated with Kodi, Team Kodi, or the XBMC Foundation. Furthermore, any software, addons, or products offered by us will receive no support in official Kodi channels, including the Kodi forums and various social networks.[/COLOR]</disclaimer> [COLOR yellow]Kodi © is a registered trademark of the XBMC Foundation. We are not connected to or in any other way affiliated with Kodi, Team Kodi, or the XBMC Foundation. Furthermore, any software, addons, or products offered by us will receive no support in official Kodi channels, including the Kodi forums and various social networks.[/COLOR]</disclaimer>
+1 -1
View File
@@ -32,7 +32,7 @@
"ilgeniodellostreaming": "https://ilgeniodellostreaming.cat", "ilgeniodellostreaming": "https://ilgeniodellostreaming.cat",
"ilgeniodellostreaming_cam": "https://ilgeniodellostreaming.gold", "ilgeniodellostreaming_cam": "https://ilgeniodellostreaming.gold",
"italiaserie": "https://italiaserie.best", "italiaserie": "https://italiaserie.best",
"mediasetplay": "https://www.mediasetplay.mediaset.it", "mediasetplay": "https://www.mediasetplay.mediaset.it",
"mondoserietv": "https://mondoserietv.fun", "mondoserietv": "https://mondoserietv.fun",
"piratestreaming": "https://www.piratestreaming.date", "piratestreaming": "https://www.piratestreaming.date",
"polpotv": "https://roma.polpo.tv", "polpotv": "https://roma.polpo.tv",
+2 -1
View File
@@ -24,7 +24,8 @@ entries = 'https://api.one.accedo.tv/content/entries?id={id}&locale=it'
sessionUrl = "https://api.one.accedo.tv/session?appKey=59ad346f1de1c4000dfd09c5&uuid={uuid}&gid=default" sessionUrl = "https://api.one.accedo.tv/session?appKey=59ad346f1de1c4000dfd09c5&uuid={uuid}&gid=default"
current_session = requests.Session() current_session = requests.Session()
current_session.headers.update({'Content-Type': 'application/json', 'User-Agent': support.httptools.get_user_agent(), 'Referer': support.config.get_channel_url()}) current_session.headers.update({'Content-Type': 'application/json', 'User-Agent': support.httptools.get_user_agent(),
'Referer': support.config.get_channel_url()})
# login anonimo # login anonimo
res = current_session.post(loginUrl, json=loginData, verify=False) res = current_session.post(loginUrl, json=loginData, verify=False)
+6 -1
View File
@@ -5,6 +5,7 @@
import json, requests import json, requests
from core import support from core import support
from platformcode import logger
host = support.config.get_channel_url() host = support.config.get_channel_url()
session = requests.Session() session = requests.Session()
@@ -173,6 +174,7 @@ def episodios(item):
plot=it['plot'], plot=it['plot'],
action='findvideos', action='findvideos',
contentType='episode', contentType='episode',
contentSerieName=item.fulltitle,
url=host + '/watch/' + str(episodes['title_id']) + '?e=' + str(it['id']))) url=host + '/watch/' + str(episodes['title_id']) + '?e=' + str(it['id'])))
support.videolibrary(itemlist, item) support.videolibrary(itemlist, item)
@@ -185,5 +187,8 @@ def findvideos(item):
support.info() support.info()
itemlist=[] itemlist=[]
url = support.match(support.match(item).data.replace('&quot;','"').replace('\\',''), patron=r'video_url"\s*:\s*"([^"]+)"').match url = support.match(support.match(item).data.replace('&quot;','"').replace('\\',''), patron=r'video_url"\s*:\s*"([^"]+)"').match
itemlist=[item.clone(title=support.config.get_localized_string(30137), server='directo', url=url, action='play')] for res in ['480p', '720p', '1080p']:
newurl = '{}/{}'.format(url, res)
if session.head(newurl, headers=headers).status_code == 200:
itemlist += [item.clone(title=support.config.get_localized_string(30137), server='directo', url=newurl, quality=res, action='play')]
return support.server(item, itemlist=itemlist) return support.server(item, itemlist=itemlist)
+1 -1
View File
@@ -2,7 +2,7 @@
"id": "tantifilm", "id": "tantifilm",
"name": "Tantifilm", "name": "Tantifilm",
"language": ["ita"], "language": ["ita"],
"active": false, "active": true,
"thumbnail": "tantifilm.png", "thumbnail": "tantifilm.png",
"banner": "tantifilm.png", "banner": "tantifilm.png",
"categories": ["tvshow", "movie", "anime"], "categories": ["tvshow", "movie", "anime"],
+37 -44
View File
@@ -20,7 +20,7 @@ def findhost(url):
host = config.get_channel_url(findhost) host = config.get_channel_url(findhost)
headers = [['Referer', host]] headers = [['Referer', host]]
player_iframe = r'<iframe src="([^"]+)"[^>]+></iframe>\s?<div class="player' player_iframe = r'<iframe.*?src="([^"]+)"[^>]+></iframe>\s*<div class="player'
@support.menu @support.menu
def mainlist(item): def mainlist(item):
@@ -49,11 +49,12 @@ def mainlist(item):
@support.scrape @support.scrape
def peliculas(item): def peliculas(item):
# debug=True
if item.args == 'search': if item.args == 'search':
patron = r'<a href="(?P<url>[^"]+)" title="Permalink to\s*(?P<title>[^"]+) \((?P<year>[0-9]+)[^<]*\)[^"]*"[^>]+>\s*<img[^s]+src="(?P<thumb>[^"]+)".*?<div class="calitate">\s*<p>(?P<quality>[^<]+)<\/p>' patron = r'<a href="(?P<url>[^"]+)" title="Permalink to\s*(?P<title>[^"]+) \((?P<year>[0-9]+)[^<]*\)[^"]*"[^>]+>\s*<img[^s]+src="(?P<thumb>[^"]+)".*?<div class="calitate">\s*<p>(?P<quality>[^<]+)<\/p>'
else: else:
patronNext = r'<a class="nextpostslink" rel="next" href="([^"]+)">' patronNext = r'<a class="nextpostslink" rel="next" href="([^"]+)">'
patron = r'<div class="mediaWrap mediaWrapAlt">\s*<a href="(?P<url>[^"]+)"(?:[^>]+)?>?\s*<img[^s]+src="([^"]+)"[^>]+>\s*<\/a>[^>]+>[^>]+>[^>]+>(?P<title>.+?)(?P<lang>[sSuUbB\-iItTaA]+)?(?:[ ]?\((?P<year>\d{4})-?(?:\d{4})?)\).[^<]+[^>]+><\/a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<quality>[a-zA-Z-0-9\.]+)' patron = r'<div class="mediaWrap mediaWrapAlt">\s*<a href="(?P<url>[^"]+)"(?:[^>]+)?>?\s*<img[^s]+src="(?P<thumb>[^"]+)"[^>]+>\s*<\/a>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+?)(?P<lang>[sS][uU][bB]\-[iI][tT][aA]+)?(?:[ ]?\((?P<year>\d{4})-?(?:\d{4})?)\).[^<]+[^>]+><\/a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<quality>[a-zA-Z-0-9\.]+)?'
patronBlock = r'<div id="main_col">(?P<block>.*?)<!\-\- main_col \-\->' patronBlock = r'<div id="main_col">(?P<block>.*?)<!\-\- main_col \-\->'
# if item.args != 'all' and item.args != 'search': # if item.args != 'all' and item.args != 'search':
@@ -63,60 +64,49 @@ def peliculas(item):
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodios(item):
info() def get_season(pageData, seas_url, season):
if not item.data: data = ''
data_check = httptools.downloadpage(item.url, headers=headers).data episodes = support.match(pageData if pageData else seas_url, patronBlock=patron_episode, patron=patron_option).matches
data_check = re.sub('\n|\t', ' ', data_check) for episode_url, episode in episodes:
data_check = re.sub(r'>\s+<', '> <', data_check) title = season + "x" + episode.zfill(2) + ' - ' + item.fulltitle
else: data += title + '|' + episode_url + '\n'
data_check = item.data return data
data = httptools.downloadpage(scrapertools.find_single_match(data_check, player_iframe), headers=headers).data
data = data.replace("'", '"')
data = re.sub('\n|\t', ' ', data)
data = re.sub(r'>\s+<', '> <', data)
patronBlock = r'Stagioni<\/a>.*?<ul class="nav navbar-nav">(?P<block>.*?)<\/ul>' patron_season = 'Stagioni<\/a>.*?<ul class="nav navbar-nav">(.*?)<\/ul>'
patron = r'<a href="(?P<url>[^"]+)"\s*>\s*<i[^>]+><\/i>\s*(?P<episode>\d+)<\/a>' patron_episode = 'Episodio<\/a>.*?<ul class="nav navbar-nav">(?P<block>.*?)<\/ul>'
# debugBlock = True patron_option = r'<a href="([^"]+?)".*?>[^>]+></i>\s*(\d+)'
otherLinks = support.match(data_check, patronBlock='<div class="content-left-film">.*?Keywords', patron='([0-9]+)(?:×|x)([0-9]+(?:-[0-9]+)?)(.*?)(?:<br|$)').matches url = support.match(item, patron=player_iframe).match
seasons = support.match(url, patronBlock=patron_season, patron=patron_option)
data = ''
import sys
if sys.version_info[0] >= 3: from concurrent import futures
else: from concurrent_py2 import futures
with futures.ThreadPoolExecutor() as executor:
thL = []
for i, season in enumerate(seasons.matches):
thL.append(executor.submit(get_season, seasons.data if i == 0 else '', season[0], season[1]))
for res in futures.as_completed(thL):
if res.result():
data += res.result()
patron = r'(?P<season>\d+)x(?P<episode>\d+)\s*-\s*(?P<title>[^\|]+)\|(?P<url>[^ ]+)'
action = 'findvideos'
def itemlistHook(itemlist): def itemlistHook(itemlist):
retItemlist = [] itemlist.sort(key=lambda item: (item.infoLabels['season'], item.infoLabels['episode']))
return itemlist
for item in itemlist:
item.contentType = 'episode'
season = unify.remove_format(item.title)
season_data = httptools.downloadpage(item.url).data
season_data = re.sub('\n|\t', ' ', season_data)
season_data = re.sub(r'>\s+<', '> <', season_data)
# block = scrapertools.find_single_match(season_data, 'Episodi.*?<ul class="nav navbar-nav">(.*?)</ul>')
episodes = scrapertools.find_multiple_matches(season_data, '<a.*?href="(?P<url>[^"]+)"[^>]+>Episodio (?P<episode>[0-9]+)(?::\s*(?P<title2>[^<]+))?')
for url, episode in episodes:
i = item.clone()
i.action = 'findvideos'
i.url = url
i.contentSeason = str(season)
i.contentEpisodeNumber = str(episode)
i.title = str(season) + 'x' + str(episode)
for ep in otherLinks:
if int(ep[0]) == int(season) and int(ep[1].split('-')[-1]) == int(episode):
i.otherLinks = ep[2]
break
retItemlist.append(i)
retItemlist.sort(key=lambda e: (int(e.contentSeason), int(e.contentEpisodeNumber)))
return retItemlist
# debugBlock = True
return locals() return locals()
@support.scrape @support.scrape
def category(item): def category(item):
blacklist = ['Serie TV Altadefinizione', 'HD AltaDefinizione', 'Al Cinema', 'Serie TV', 'Miniserie', 'Programmi Tv', 'Live', 'Trailers', 'Serie TV Aggiornate', 'Aggiornamenti', 'Featured'] blacklist = ['Ultimi Film Aggiornati', 'Anime', 'Serie TV Altadefinizione', 'HD AltaDefinizione', 'Al Cinema', 'Serie TV', 'Miniserie', 'Programmi Tv', 'Live', 'Trailers', 'Serie TV Aggiornate', 'Aggiornamenti', 'Featured']
patron = '<li><a href="(?P<url>[^"]+)"><span></span>(?P<title>[^<]+)</a></li>' patron = '<li><a href="(?P<url>[^"]+)"><span></span>(?P<title>[^<]+)</a></li>'
patron_block = '<ul class="table-list">(.*?)</ul>' patron_block = '<ul class="table-list">(.*?)</ul>'
action = 'peliculas' action = 'peliculas'
@@ -185,6 +175,9 @@ def findvideos(item):
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.data = data item.data = data
return episodios(item) return episodios(item)
else:
item.contentTitle = item.fulltitle
item.contentType = 'movie'
# if 'protectlink' in data: # if 'protectlink' in data:
# urls = scrapertools.find_multiple_matches(data, r'<iframe src="[^=]+=(.*?)"') # urls = scrapertools.find_multiple_matches(data, r'<iframe src="[^=]+=(.*?)"')
-3
View File
@@ -12,9 +12,6 @@ def getmainlist(view="thumb_"):
logger.debug() logger.debug()
itemlist = list() itemlist = list()
if config.dev_mode():
itemlist.append(Item(title="Redirect", action="check_channels", thumbnail='',
category=config.get_localized_string(30119), viewmode="thumbnails"))
# Main Menu Channels # Main Menu Channels
if addon.getSetting('enable_news_menu') == "true": if addon.getSetting('enable_news_menu') == "true":
itemlist.append(Item(title=config.get_localized_string(30130), channel="news", action="mainlist", itemlist.append(Item(title=config.get_localized_string(30130), channel="news", action="mainlist",
+4 -4
View File
@@ -62,11 +62,13 @@ def start(itemlist, item):
# Save the current value of "Action and Player Mode" in preferences # Save the current value of "Action and Player Mode" in preferences
user_config_setting_action = config.get_setting("default_action") user_config_setting_action = config.get_setting("default_action")
user_config_setting_player = config.get_setting("player_mode") # user_config_setting_player = config.get_setting("player_mode")
# Enable the "View in high quality" action (if the server returns more than one quality, eg gdrive) # Enable the "View in high quality" action (if the server returns more than one quality, eg gdrive)
if not user_config_setting_action: config.set_setting("default_action", 2) if not user_config_setting_action: config.set_setting("default_action", 2)
# if user_config_setting_player != 0: config.set_setting("player_mode", 0)
# Priorities when ordering itemlist: # Priorities when ordering itemlist:
# 0: Servers and qualities # 0: Servers and qualities
# 1: Qualities and servers # 1: Qualities and servers
@@ -208,8 +210,6 @@ def start(itemlist, item):
videoitem = autoplay_elem['videoitem'] videoitem = autoplay_elem['videoitem']
if videoitem.server.lower() not in max_intentos_servers: if videoitem.server.lower() not in max_intentos_servers:
max_intentos_servers[videoitem.server.lower()] = max_intentos max_intentos_servers[videoitem.server.lower()] = max_intentos
if videoitem.server.lower() in ['youtube'] and user_config_setting_player != 0:
config.set_setting("player_mode", 0)
# If the maximum number of attempts of this server have been reached, we jump to the next # If the maximum number of attempts of this server have been reached, we jump to the next
if max_intentos_servers[videoitem.server.lower()] == 0: if max_intentos_servers[videoitem.server.lower()] == 0:
@@ -269,7 +269,7 @@ def start(itemlist, item):
# Restore if necessary the previous value of "Action and Player Mode" in preferences # Restore if necessary the previous value of "Action and Player Mode" in preferences
if not user_config_setting_action: config.set_setting("default_action", user_config_setting_action) if not user_config_setting_action: config.set_setting("default_action", user_config_setting_action)
config.set_setting("player_mode", user_config_setting_player) # if user_config_setting_player != 0: config.set_setting("player_mode", user_config_setting_player)
return itemlist return itemlist
+2 -2
View File
@@ -142,9 +142,9 @@ class Downloader(object):
# We stop downloading # We stop downloading
self._state = self.states.stopped self._state = self.states.stopped
for t in self._threads: for t in self._threads:
if t.isAlive(): t.join() if t.is_alive(): t.join()
if self._save_thread.isAlive(): self._save_thread.join() if self._save_thread.is_alive(): self._save_thread.join()
if self._seekable: if self._seekable:
# Guardamos la info al final del archivo # Guardamos la info al final del archivo
+15 -1
View File
@@ -815,36 +815,50 @@ def typo(string, typography=''):
string = string string = string
typography.lower() typography.lower()
if 'capitalize' in typography: if 'capitalize' in typography:
string = string.capitalize() string = string.capitalize()
typography = typography.replace('capitalize', '')
if 'uppercase' in typography: if 'uppercase' in typography:
string = string.upper() string = string.upper()
typography = typography.replace('uppercase', '')
if 'lowercase' in typography: if 'lowercase' in typography:
string = string.lower() string = string.lower()
typography = typography.replace('lowercase', '')
if '[]' in typography: if '[]' in typography:
string = '[' + string + ']' string = '[' + string + ']'
typography = typography.replace('[]', '')
if '()' in typography: if '()' in typography:
string = '(' + string + ')' string = '(' + string + ')'
typography = typography.replace('()', '')
if 'submenu' in typography: if 'submenu' in typography:
if VLT: string = "•• " + string if VLT: string = "•• " + string
else: string = string else: string = string
typography = typography.replace('submenu', '')
if 'color kod' in typography: if 'color kod' in typography:
string = '[COLOR ' + kod_color + ']' + string + '[/COLOR]' string = '[COLOR ' + kod_color + ']' + string + '[/COLOR]'
typography = typography.replace('color kod', '')
elif 'color' in typography: elif 'color' in typography:
color = scrapertools.find_single_match(typography, 'color ([a-zA-Z0-9]+)') color = scrapertools.find_single_match(typography, 'color ([a-zA-Z0-9]+)')
string = '[COLOR ' + color + ']' + string + '[/COLOR]' string = '[COLOR ' + color + ']' + string + '[/COLOR]'
typography = typography.replace('color ' + color, '')
if 'bold' in typography: if 'bold' in typography:
string = '[B]' + string + '[/B]' string = '[B]' + string + '[/B]'
typography = typography.replace('bold', '')
if 'italic' in typography: if 'italic' in typography:
string = '[I]' + string + '[/I]' string = '[I]' + string + '[/I]'
typography = typography.replace('italic', '')
if '_' in typography: if '_' in typography:
string = ' ' + string string = ' ' + string
typography = typography.replace('_', '')
if '--' in typography: if '--' in typography:
string = ' - ' + string string = ' - ' + string
typography = typography.replace('--', '')
if 'bullet' in typography: if 'bullet' in typography:
if VLT: string = '[B]' + "" + '[/B] ' + string if VLT: string = '[B]' + "" + '[/B] ' + string
else: string = string else: string = string
typography = typography.replace('bullet', '')
typography = typography.strip()
if typography: string = string + '{' + typography + '}'
return string return string
+1 -1
View File
@@ -269,7 +269,7 @@ def wait_for_update_trakt():
t = Thread(update_all) t = Thread(update_all)
t.setDaemon(True) t.setDaemon(True)
t.start() t.start()
t.isAlive() t.is_alive()
def update_all(): def update_all():
# from core.support import dbg;dbg() # from core.support import dbg;dbg()
+2
View File
@@ -49,6 +49,8 @@ def read_nfo(path_nfo, item=None):
data = "\n".join(data.splitlines()[1:]) data = "\n".join(data.splitlines()[1:])
it_nfo = Item().fromjson(data) it_nfo = Item().fromjson(data)
if not it_nfo.library_playcounts: # may be corrupted
it_nfo.library_playcounts = {}
if item: if item:
it = item.clone() it = item.clone()
+6 -6
View File
@@ -40,7 +40,7 @@ def download_and_play(url, file_name, download_path):
dialog.create(config.get_localized_string(60200), config.get_localized_string(60312)) dialog.create(config.get_localized_string(60200), config.get_localized_string(60312))
dialog.update(0) dialog.update(0)
while not cancelled and download_thread.isAlive(): while not cancelled and download_thread.is_alive():
dialog.update(download_thread.get_progress(), config.get_localized_string(60313) + '\n' + dialog.update(download_thread.get_progress(), config.get_localized_string(60313) + '\n' +
config.get_localized_string(60314) + str(int(old_div(download_thread.get_speed(), 1024))) + " KB/s " + str( config.get_localized_string(60314) + str(int(old_div(download_thread.get_speed(), 1024))) + " KB/s " + str(
download_thread.get_actual_size()) + config.get_localized_string(60316) + str( download_thread.get_total_size()) + "MB", download_thread.get_actual_size()) + config.get_localized_string(60316) + str( download_thread.get_total_size()) + "MB",
@@ -67,15 +67,15 @@ def download_and_play(url, file_name, download_path):
logger.info("Terminated by user") logger.info("Terminated by user")
break break
else: else:
if not download_thread.isAlive(): if not download_thread.is_alive():
logger.info("Download has finished") logger.info("Download has finished")
break break
else: else:
logger.info("Continua la descarga") logger.info("Continua la descarga")
# When the player finishes, if you continue downloading it for now # When the player finishes, if you continue downloading it for now
logger.info("Download thread alive=" + str(download_thread.isAlive())) logger.info("Download thread alive=" + str(download_thread.is_alive()))
if download_thread.isAlive(): if download_thread.is_alive():
logger.info("Killing download thread") logger.info("Killing download thread")
download_thread.force_stop() download_thread.force_stop()
@@ -106,11 +106,11 @@ class CustomPlayer(xbmc.Player):
def force_stop_download_thread(self): def force_stop_download_thread(self):
logger.info() logger.info()
if self.download_thread.isAlive(): if self.download_thread.is_alive():
logger.info("Killing download thread") logger.info("Killing download thread")
self.download_thread.force_stop() self.download_thread.force_stop()
# while self.download_thread.isAlive(): # while self.download_thread.is_alive():
# xbmc.sleep(1000) # xbmc.sleep(1000)
def onPlayBackStarted(self): def onPlayBackStarted(self):
+94 -66
View File
@@ -1,15 +1,21 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from builtins import map from builtins import map
import sys, xbmc, xbmcaddon, xbmcgui, base64, json, os import xbmc, xbmcaddon, xbmcgui, re
PY3 = False
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
from threading import Timer from threading import Timer
from platformcode import config, logger, platformtools, launcher
from channelselector import get_thumb from core import filetools
from platformcode import config, logger from core.item import Item
import channelselector import channelselector
addon_icon = os.path.join( config.__settings__.getAddonInfo( "path" ),'resources', 'media', 'logo.png' ) addon_icon = filetools.join( config.__settings__.getAddonInfo( "path" ),'resources', 'media', 'logo.png' )
background = 'FF232323'
text = 'FFFFFFFF'
select = 'FF0082C2'
if config.get_setting('icon_set') == 'dark':
background = 'FFDCDCDC'
text = 'FF232323'
select = '880082C2'
class KeyListener(xbmcgui.WindowXMLDialog): class KeyListener(xbmcgui.WindowXMLDialog):
TIMEOUT = 10 TIMEOUT = 10
@@ -29,7 +35,6 @@ class KeyListener(xbmcgui.WindowXMLDialog):
def onInit(self): def onInit(self):
try: try:
logger.debug('ICONA',addon_icon)
self.getControl(400).setImage(addon_icon) self.getControl(400).setImage(addon_icon)
self.getControl(401).addLabel(config.get_localized_string(70698)) self.getControl(401).addLabel(config.get_localized_string(70698))
self.getControl(402).addLabel(config.get_localized_string(70699) % self.TIMEOUT) self.getControl(402).addLabel(config.get_localized_string(70699) % self.TIMEOUT)
@@ -89,88 +94,111 @@ def delete_key():
config.set_setting("shortcut_key", '') config.set_setting("shortcut_key", '')
xbmc.executebuiltin('Action(reloadkeymaps)') xbmc.executebuiltin('Action(reloadkeymaps)')
LEFT = 1
RIGHT = 2
UP = 3
DOWN = 4
EXIT = 10
BACKSPACE = 92
RIGHTCLICK = 101
MOUSEMOVE = 107
class Main(xbmcgui.WindowXMLDialog): class Main(xbmcgui.WindowXMLDialog):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.items = [] self.items = []
def onInit(self): def onInit(self):
self.MENU = self.getControl(1)
self.SUBMENU = self.getControl(2)
#### Compatibility with Kodi 18 #### #### Compatibility with Kodi 18 ####
if config.get_platform(True)['num_version'] < 18: if config.get_platform(True)['num_version'] < 18:
self.setCoordinateResolution(2) self.setCoordinateResolution(2)
for menuentry in menu: itemlist = self.menulist(channelselector.getmainlist())
if not menuentry.channel: menuentry.channel = prevchannel
item = xbmcgui.ListItem(menuentry.title)
if not submenu and menuentry.channel in ['news', 'channelselector', 'search', 'videolibrary']:
item.setProperty('sub', 'Shortcut/sub.png')
if menuentry.title != 'Redirect':
for key , value in json.loads(menuentry.tojson()).items():
item.setProperty(key, str(value))
item.setProperty('run', menuentry.tojson())
self.items.append(item)
self.getControl(32500).addItems(self.items) self.MENU.addItems(itemlist)
self.setFocusId(32500) self.setFocusId(1)
self.submenu()
def menulist(self, menu):
itemlist = []
for menuentry in menu:
# if not menuentry.channel: menuentry.channel = 'news'
title = re.sub(r'(\[[/]?COLOR[^\]]*\])','',menuentry.title)
item = xbmcgui.ListItem(title)
item.setProperty('background', background)
item.setProperty('text', text)
item.setProperty('select', select)
item.setProperty('channel', menuentry.channel)
item.setProperty('focus', '0')
item.setProperty('thumbnail', menuentry.thumbnail)
if menuentry.channel not in ['downloads', 'setting', 'help']:
item.setProperty('sub', 'true')
item.setProperty('run', menuentry.tourl())
itemlist.append(item)
return itemlist
def onClick(self, control_id): def onClick(self, control_id):
if control_id == 32500: if control_id in [1, 2]:
action = self.getControl(32500).getSelectedItem().getProperty('run') action = self.getControl(control_id).getSelectedItem().getProperty('run')
self.close() self.close()
if self.getControl(32500).getSelectedItem().getProperty('folder') == 'False': if Item().fromurl(action).folder == False:
xbmc.executebuiltin('RunPlugin("plugin://plugin.video.kod/?' + base64.b64encode(action) + '")') xbmc.executebuiltin('RunPlugin("plugin://plugin.video.kod/?' + action + '")')
else: else:
xbmc.executebuiltin('ActivateWindow(10025, "plugin://plugin.video.kod/?' + base64.b64encode(action) + '")') xbmc.executebuiltin('ActivateWindow(10025, "plugin://plugin.video.kod/?' + action + '")')
elif control_id in [101]:
self.setFocusId(2)
elif control_id in [102]:
self.setFocusId(1)
def onAction(self, action): def onAction(self, action):
# exit if action.getButtonCode() == config.get_setting('shortcut_key'):
if action.getId() in [xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK]:
self.close() self.close()
if submenu: open_shortcut_menu(self=True)
if action.getId() == xbmcgui.ACTION_CONTEXT_MENU: action = action.getId()
config.open_settings()
if action in [EXIT, BACKSPACE, RIGHTCLICK]:
self.close()
focus = self.getFocusId() focus = self.getFocusId()
if action == 3: if action in [LEFT, RIGHT, MOUSEMOVE] and self.getFocusId() in [1]:
if focus == 61: if focus in [1]:
self.setFocusId(32500) self.submenu()
elif submenu: else:
self.close() itfocus = str(self.SUBMENU.getSelectedPosition())
open_shortcut_menu(self=True) self.MENU.getSelectedItem().setProperty('focus', itfocus)
elif self.getControl(32500).getSelectedItem().getProperty('channel') in ['news', 'channelselector', 'search', 'videolibrary']:
channel_name = self.getControl(32500).getSelectedItem().getProperty('channel')
if channel_name == 'channelselector':
import channelselector
self.close()
open_shortcut_menu(channelselector.getchanneltypes(), channel_name, self=True)
else:
from core.item import Item
channel = __import__('specials.%s' % channel_name, fromlist=["specials.%s" % channel_name])
self.close()
open_shortcut_menu(channel.mainlist(Item()), channel_name, self=True)
def open_shortcut_menu(newmenu='', channel='', self=False): def submenu(self):
if not self: xbmc.executebuiltin('Dialog.Close(all,true)') channel_name = self.MENU.getSelectedItem().getProperty('channel')
global menu focus = int(self.MENU.getSelectedItem().getProperty('focus'))
global submenu if channel_name == 'channelselector':
global prevchannel import channelselector
prevchannel = channel itemlist = self.menulist(channelselector.getchanneltypes())
if newmenu: elif channel_name not in ['downloads', 'setting', 'help']:
menu = newmenu channel = __import__('specials.%s' % channel_name, fromlist=["specials.%s" % channel_name])
submenu = True itemlist = self.menulist(channel.mainlist(Item().fromurl(self.MENU.getSelectedItem().getProperty('run'))))
else: self.SUBMENU.reset()
menu = channelselector.getmainlist() self.SUBMENU.addItems(itemlist)
submenu = False self.SUBMENU.selectItem(focus)
XML = 'ShortCutMenu.xml'
if config.get_setting('icon_set') == 'dark': def context(self):
XML = 'Dark' + XML focus = self.getFocusId()
main = Main(XML, config.get_runtime_path()) item_url = self.MENU.getSelectedItem().getProperty('run')
main.doModal() item = Item().fromurl(item_url)
del main commands = platformtools.set_context_commands(item, item_url, Item())
context = [c[0] for c in commands]
context_commands = [c[1].replace('Container.Refresh', 'RunPlugin').replace('Container.Update', 'RunPlugin') for c in commands]
index = xbmcgui.Dialog().contextmenu(context)
if index > 0: xbmc.executebuiltin(context_commands[index])
def open_shortcut_menu():
if xbmcgui.getCurrentWindowDialogId() == 9999:
main = Main('ShortCutMenu.xml', config.get_runtime_path())
main.doModal()
+24 -32
View File
@@ -51,27 +51,7 @@ def run(item=None):
item.__setattr__(key, val) item.__setattr__(key, val)
# If no item, this is mainlist # If no item, this is mainlist
else: else:
if config.get_setting("start_page"): item = Item(channel="channelselector", action="getmainlist", viewmode="movie")
if not config.get_setting("custom_start"):
dictCategory = {
config.get_localized_string(70137): 'peliculas',
config.get_localized_string(30123): 'series',
config.get_localized_string(30124): 'anime',
config.get_localized_string(60513): 'documentales',
config.get_localized_string(70171): 'torrent',
}
if not config.get_setting("category") in dictCategory.keys():
config.set_setting('category', config.get_localized_string(70137))
category = dictCategory[config.get_setting("category")]
item = Item(channel="news", action="novedades", extra=category, mode = 'silent')
else:
from platformcode import side_menu
item= Item()
item = side_menu.check_user_home(item)
item.start = True
else:
item = Item(channel="channelselector", action="getmainlist", viewmode="movie")
if not config.get_setting('show_once'): if not config.get_setting('show_once'):
if not config.get_all_settings_addon(): if not config.get_all_settings_addon():
logger.error('corrupted settings.xml!!') logger.error('corrupted settings.xml!!')
@@ -455,6 +435,18 @@ def play_from_library(item):
@type item: item @type item: item
@param item: item with information @param item: item with information
""" """
def get_played_time(item):
if item.contentType == 'movie': nfo_path = item.nfo
else: nfo_path = item.strm_path.replace('strm','nfo')
if nfo_path and filetools.isfile(nfo_path):
from core import videolibrarytools
head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path)
sleep(1)
played_time = platformtools.get_played_time(item_nfo)
else: played_time = 0
return played_time
import xbmcgui, xbmcplugin, xbmc import xbmcgui, xbmcplugin, xbmc
from time import sleep from time import sleep
@@ -482,16 +474,7 @@ def play_from_library(item):
item.play_from = 'window' item.play_from = 'window'
itemlist = videolibrary.findvideos(item) itemlist = videolibrary.findvideos(item)
p_dialog.update(100, ''); sleep(0.5); p_dialog.close() p_dialog.update(100, ''); sleep(0.5); p_dialog.close()
while platformtools.is_playing(): sleep(1) played = False
if item.contentType == 'movie': nfo_path = item.nfo
else: nfo_path = item.strm_path.replace('strm','nfo')
if nfo_path and filetools.isfile(nfo_path):
from core import videolibrarytools
head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path)
played_time = platformtools.get_played_time(item_nfo)
else: played_time = 0
if not played_time:
return
# The number of links to show is limited # The number of links to show is limited
if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist) if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist)
@@ -499,9 +482,16 @@ def play_from_library(item):
if config.get_setting("replace_VD", "videolibrary") == 1: itemlist = reorder_itemlist(itemlist) if config.get_setting("replace_VD", "videolibrary") == 1: itemlist = reorder_itemlist(itemlist)
# from core.support import dbg;dbg() # from core.support import dbg;dbg()
if len(itemlist) > 0: if len(itemlist) > 0:
reopen = False
while not xbmc.Monitor().abortRequested(): while not xbmc.Monitor().abortRequested():
played = True
# The user chooses the mirror # The user chooses the mirror
if not platformtools.is_playing(): if not platformtools.is_playing():
# from core.support import dbg;dbg()
if config.get_setting('autoplay') or reopen:
played_time = get_played_time(item)
if not played_time and played:
return
options = [] options = []
selection_implementation = 0 selection_implementation = 0
for item in itemlist: for item in itemlist:
@@ -525,4 +515,6 @@ def play_from_library(item):
else: else:
item = videolibrary.play(itemlist[selection + selection_implementation])[0] item = videolibrary.play(itemlist[selection + selection_implementation])[0]
platformtools.play_video(item) platformtools.play_video(item)
# if (platformtools.is_playing() and item.action) or item.server == 'torrent' or config.get_setting('autoplay'): break reopen = True
# if (platformtools.is_playing() and item.action) or item.server == 'torrent' or config.get_setting('autoplay'): break
+2 -8
View File
@@ -576,11 +576,6 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
context_commands.append( (config.get_localized_string(70561), "Container.Update (%s?%s&%s)" % (sys.argv[0], item_url, 'channel=search&action=from_context&search_type=list&page=1&list_type=%s/%s/similar' % (mediatype, item.infoLabels['tmdb_id'])))) context_commands.append( (config.get_localized_string(70561), "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']:
context_commands.insert(0, (config.get_localized_string(60351), "RunPlugin(%s?%s)" % (sys.argv[0], Item(channel='side_menu', action="set_custom_start", parent=item.tourl()).tourl())))
if item.channel != "videolibrary": if item.channel != "videolibrary":
# Add Series to the video library # Add Series to the video library
if item.action in ["episodios", "get_episodios", "get_seasons"] and item.contentSerieName: if item.action in ["episodios", "get_episodios", "get_seasons"] and item.contentSerieName:
@@ -602,7 +597,7 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
context_commands.append((config.get_localized_string(60355), "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))) context_commands.append((config.get_localized_string(60355), "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action)))
context_commands.append((config.get_localized_string(60357), "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel + '&from_action=' + item.action))) context_commands.append((config.get_localized_string(60357), "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel + '&from_action=' + item.action)))
# Download episode # Download episode
elif item.contentType == "episode" or item.action in ['findvideos']: elif item.contentType == "episode" and item.action in ['findvideos']:
context_commands.append((config.get_localized_string(60356), "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))) context_commands.append((config.get_localized_string(60356), "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action)))
# Download season # Download season
elif item.contentType == "season": elif item.contentType == "season":
@@ -1012,7 +1007,7 @@ def get_video_seleccionado(item, seleccion, video_urls):
def set_player(item, xlistitem, mediaurl, view, strm): def set_player(item, xlistitem, mediaurl, view, strm):
logger.debug() logger.debug()
item.options = {'strm':False, 'continue':False} item.options = {'strm':False}
# logger.debug("item:\n" + item.tostring('\n')) # logger.debug("item:\n" + item.tostring('\n'))
# Moved del conector "torrent" here # Moved del conector "torrent" here
@@ -1039,7 +1034,6 @@ def set_player(item, xlistitem, mediaurl, view, strm):
prevent_busy(item) prevent_busy(item)
if player_mode in [1]: if player_mode in [1]:
item.played_time = resume_playback(get_played_time(item)) item.played_time = resume_playback(get_played_time(item))
item.options['continue'] = True
logger.info('Player Mode:',['Direct', 'Bookmark'][player_mode]) logger.info('Player Mode:',['Direct', 'Bookmark'][player_mode])
# Add the listitem to a playlist # Add the listitem to a playlist
+24 -22
View File
@@ -7,20 +7,14 @@ def context():
context = [] context = []
# original # original
# if config.get_setting('quick_menu'): context.append((config.get_localized_string(60360).upper(), "RunPlugin(plugin://plugin.video.kod/?%s)" % Item(channel='shortcuts', action="shortcut_menu").tourl())) # if config.get_setting('quick_menu'): context.append((config.get_localized_string(60360).upper(), "RunPlugin(plugin://plugin.video.kod/?%s)" % Item(channel='shortcuts', action="shortcut_menu").tourl()))
# if config.get_setting('side_menu'): context.append((config.get_localized_string(70737).upper(), "RunPlugin(plugin://plugin.video.kod/?%s)" % Item(channel='shortcuts',action="Side_menu").tourl()))
# if config.get_setting('kod_menu'): context.append((config.get_localized_string(60026), "RunPlugin(plugin://plugin.video.kod/?%s)" % Item(channel='shortcuts', action="settings_menu").tourl())) # if config.get_setting('kod_menu'): context.append((config.get_localized_string(60026), "RunPlugin(plugin://plugin.video.kod/?%s)" % Item(channel='shortcuts', action="settings_menu").tourl()))
# pre-serialised # pre-serialised
if config.get_setting('quick_menu'): context.append((config.get_localized_string(60360), 'RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJzaG9ydGN1dF9tZW51IiwgCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLCAKICAgICJpbmZvTGFiZWxzIjoge30KfQ%3D%3D)')) if config.get_setting('quick_menu'): context.append((config.get_localized_string(60360), 'RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJzaG9ydGN1dF9tZW51IiwgCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLCAKICAgICJpbmZvTGFiZWxzIjoge30KfQ%3D%3D)'))
if config.get_setting('Side_menu'): context.append((config.get_localized_string(70737), 'RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJTaWRlX21lbnUiLCAKICAgICJjaGFubmVsIjogInNob3J0Y3V0cyIsIAogICAgImluZm9MYWJlbHMiOiB7fQp9)'))
if config.get_setting('kod_menu'): context.append((config.get_localized_string(60026), 'RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJzZXR0aW5nc19tZW51IiwgCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLCAKICAgICJpbmZvTGFiZWxzIjoge30KfQ%3D%3D)')) if config.get_setting('kod_menu'): context.append((config.get_localized_string(60026), 'RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJzZXR0aW5nc19tZW51IiwgCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLCAKICAgICJpbmZvTGFiZWxzIjoge30KfQ%3D%3D)'))
return context return context
def Side_menu(item):
from platformcode import side_menu
side_menu.open_menu(item)
def shortcut_menu(item): def shortcut_menu(item):
from platformcode import keymaptools from platformcode import keymaptools
keymaptools.open_shortcut_menu() keymaptools.open_shortcut_menu()
@@ -49,12 +43,13 @@ def servers_menu(item):
ids.append(server) ids.append(server)
select = platformtools.dialog_select(config.get_localized_string(60552), names) select = platformtools.dialog_select(config.get_localized_string(60552), names)
ID = ids[select] if select != -1:
ID = ids[select]
it = Item(channel = 'settings', it = Item(channel = 'settings',
action = action, action = action,
config = ID) config = ID)
return setting.server_debrid_config(it) setting.server_debrid_config(it)
else: else:
action = 'server_config' action = 'server_config'
server_list = list(servertools.get_servers_list().keys()) server_list = list(servertools.get_servers_list().keys())
@@ -65,13 +60,16 @@ def servers_menu(item):
ids.append(server) ids.append(server)
select = platformtools.dialog_select(config.get_localized_string(60538), names) select = platformtools.dialog_select(config.get_localized_string(60538), names)
ID = ids[select] if select != -1:
ID = ids[select]
it = Item(channel = 'settings', it = Item(channel = 'settings',
action = action, action = action,
config = ID) config = ID)
return setting.server_config(it) setting.server_config(it)
if select != -1:
servers_menu(item)
def channels_menu(item): def channels_menu(item):
import channelselector import channelselector
@@ -93,13 +91,15 @@ def channels_menu(item):
ids.append(channel.channel) ids.append(channel.channel)
select = platformtools.dialog_select(config.get_localized_string(60537), names) select = platformtools.dialog_select(config.get_localized_string(60537), names)
ID = ids[select] if select != -1:
ID = ids[select]
it = Item(channel='settings', it = Item(channel='settings',
action="channel_config", action="channel_config",
config=ID) config=ID)
return setting.channel_config(it) setting.channel_config(it)
return channels_menu(item)
def check_channels(item): def check_channels(item):
from specials import setting from specials import setting
@@ -132,6 +132,7 @@ def SettingOnPosition(item):
def select(item): def select(item):
from core.support import dbg;dbg()
from platformcode import config, platformtools from platformcode import config, platformtools
# item.id = setting ID # item.id = setting ID
# item.type = labels or values # item.type = labels or values
@@ -146,6 +147,7 @@ def select(item):
values.append(config.get_localized_string(int(val))) values.append(config.get_localized_string(int(val)))
else: else:
values = item.values.split('|') values = item.values.split('|')
ID = config.get_setting(item.id) if config.get_setting(item.id) else 0
select = platformtools.dialog_select(label, values, ID)
select = platformtools.dialog_select(label, values, config.get_setting(item.id))
config.set_setting(item.id, values[select]) config.set_setting(item.id, values[select])
-364
View File
@@ -1,364 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# from builtins import str
import sys
PY3 = False
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
import os
from core.item import Item
from core import jsontools
from platformcode import config, logger, launcher
import xbmc, xbmcgui
media_path = os.path.join(config.get_runtime_path(), "resources/skins/Default/media/side_menu/")
menu_settings_path = os.path.join(config.get_data_path(), "settings_channels", 'menu_settings_data.json')
if os.path.exists(menu_settings_path):
menu_node = jsontools.get_node_from_file('menu_setting_data.json', 'menu')
else:
menu_node = {'categoria actual':config.get_setting('category')}
jsontools.update_node(menu_node, 'menu_settings_data.json', "menu")
info_language = ["de", "en", "es", "fr", "it", "pt"] # from videolibrary.json
def_lang = info_language[config.get_setting("info_language", "videolibrary")]
ACTION_SHOW_FULLSCREEN = 36
ACTION_GESTURE_SWIPE_LEFT = 511
ACTION_SELECT_ITEM = 7
ACTION_PREVIOUS_MENU = 10
ACTION_MOVE_LEFT = 1
ACTION_MOVE_RIGHT = 2
ACTION_MOVE_DOWN = 4
ACTION_MOVE_UP = 3
def set_menu_settings(item):
if os.path.exists(menu_settings_path):
menu_node = jsontools.get_node_from_file('menu_settings_data.json', 'menu')
else:
menu_node = {}
menu_node['categoria actual'] = item.extra
jsontools.update_node(menu_node, 'menu_settings_data.json', "menu")
def check_user_home(item):
logger.debug()
if os.path.exists(menu_settings_path):
menu_node = jsontools.get_node_from_file('menu_settings_data.json', 'menu')
if 'user_home' in menu_node:
item = Item().fromurl(menu_node['user_home'])
else:
item = Item(channel="channelselector", action="getmainlist", viewmode="movie")
from platformcode import platformtools
undefined_start = platformtools.dialog_ok(config.get_localized_string(70664), config.get_localized_string(70665) + '\n' + config.get_localized_string(70666))
return item
def set_custom_start(item):
logger.debug()
if os.path.exists(menu_settings_path):
menu_node = jsontools.get_node_from_file('menu_settings_data.json', 'menu')
else:
menu_node={}
parent_item= Item().fromurl(item.parent)
parent_item.start=True
config.set_setting("custom_start",True)
if config.get_setting("news_start"):
config.set_setting("news_start", False)
menu_node['user_home']=parent_item.tourl()
jsontools.update_node(menu_node, 'menu_settings_data.json', "menu")
def get_start_page():
logger.debug()
dictCategory = {
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(30124): 'castellano',
config.get_localized_string(59976): 'latino',
config.get_localized_string(70171): 'torrent',
}
category = dictCategory[config.get_setting("category")]
custom_start= config.get_setting("custom_start")
#if category != 'definido':
if custom_start == False:
item = Item(channel="news", action="novedades", extra=category, mode='silent')
else:
item = Item()
item = side_menu.check_user_home(item)
return item
def open_menu(item):
main = Main('side_menu.xml', config.get_runtime_path())
main.doModal()
del main
def open_shortcut_menu(item):
from platformcode import keymaptools
keymaptools.open_shortcut_menu()
class Main(xbmcgui.WindowXMLDialog):
def __init__(self, *args, **kwargs):
self.items = []
def onInit(self):
#### Kodi 18 compatibility ####
if config.get_platform(True)['num_version'] < 18:
self.setCoordinateResolution(2)
self.focus = -1
self.buttons = []
posx= 0
posy= 145
space = 30
selected = 'selected0.png'
width = 260
height = 30
textcolor = "0xFFCCCCCC"
conditional_textcolor = "0xFF0081C2"
shadow = "0x00000000"
offsetx = 30
offsety = 5
font = 'font25_title'
if config.get_setting('start_page'):
label = config.get_localized_string(70663)
self.button_start = xbmcgui.ControlButton(posx, posy, width, height, label, font=font, alignment=0x00000000,
noFocusTexture='', focusTexture=media_path + selected,
textColor=textcolor, shadowColor=shadow, textOffsetX=offsetx,
textOffsetY=offsety)
self.addControl(self.button_start)
self.buttons.append(self.button_start)
posy += space * 2
label = config.get_localized_string(70009)
self.button_alfa = xbmcgui.ControlButton(posx, posy, width, height, label, font=font, alignment=0x00000000,
noFocusTexture='', focusTexture=media_path+selected,
textColor=textcolor, shadowColor=shadow, textOffsetX=offsetx,
textOffsetY=offsety)
self.addControl(self.button_alfa)
self.buttons.append(self.button_alfa)
posy += space
label = config.get_localized_string(30100)
self.button_config = xbmcgui.ControlButton(posx, posy, width, height, label, font=font, alignment=0x00000000,
noFocusTexture='', focusTexture=media_path + selected,
textColor=textcolor, shadowColor=shadow, textOffsetX=offsetx,
textOffsetY=offsety)
self.addControl(self.button_config)
self.buttons.append(self.button_config)
posy += space*2
label = config.get_localized_string(30122)
self.button_peliculas = xbmcgui.ControlButton(posx, posy, width, height, label, font=font,
alignment=0x00000000, noFocusTexture='',
focusTexture=media_path+selected, textColor=textcolor,
shadowColor=shadow, textOffsetX=offsetx, textOffsetY=offsety)
self.addControl(self.button_peliculas)
self.buttons.append(self.button_peliculas)
posy += space
label = config.get_localized_string(70017)
self.button_series = xbmcgui.ControlButton(posx, posy, width, height, label, font=font,
alignment=0x00000000, noFocusTexture='',
focusTexture=media_path+selected, textColor=textcolor,
shadowColor=shadow, textOffsetX=offsetx, textOffsetY=offsety)
self.addControl(self.button_series)
self.buttons.append(self.button_series)
posy += space
label = config.get_localized_string(30124)
self.button_anime = xbmcgui.ControlButton(posx, posy, width, height, label, font=font, alignment=0x00000000,
noFocusTexture='', focusTexture=media_path+selected,
textColor=textcolor, shadowColor=shadow, textOffsetX=offsetx,
textOffsetY=offsety)
self.addControl(self.button_anime)
self.buttons.append(self.button_anime)
# posy += space
# label = config.get_localized_string(70018)
# self.button_infantil = xbmcgui.ControlButton(posx, posy, width, height, label, font=font,
# alignment=0x00000000, noFocusTexture='',
# focusTexture=media_path+selected, textColor=textcolor,
# shadowColor=shadow, textOffsetX=offsetx, textOffsetY=offsety)
# self.addControl(self.button_infantil)
# self.buttons.append(self.button_infantil)
posy += space
label = config.get_localized_string(70019)
self.button_docu = xbmcgui.ControlButton(posx, posy, width, height, label, font=font,
alignment=0x00000000, noFocusTexture='',
focusTexture=media_path + selected, textColor=textcolor,
shadowColor=shadow, textOffsetX=offsetx, textOffsetY=offsety)
self.addControl(self.button_docu)
self.buttons.append(self.button_docu)
posy += space
# label = config.get_localized_string(70013)
# self.button_terror = xbmcgui.ControlButton(posx, posy, width, height, label, font=font,
# alignment=0x00000000, noFocusTexture='',
# focusTexture=media_path+selected, textColor=textcolor,
# shadowColor=shadow, textOffsetX=offsetx, textOffsetY=offsety)
# self.addControl(self.button_terror)
# self.buttons.append(self.button_terror)
# if channelselector.auto_filter() == 'esp':
# posy += space
# label = config.get_localized_string(59981)
# self.button_lat = xbmcgui.ControlButton(posx, posy, width, height, label, font=font, alignment=0x00000000,
# noFocusTexture='', focusTexture=media_path+selected,
# textColor=textcolor, shadowColor=shadow, textOffsetX=offsetx,
# textOffsetY=offsety)
# self.addControl(self.button_lat)
# self.buttons.append(self.button_lat)
# posy += space
# label = config.get_localized_string(70014)
# self.button_cast = xbmcgui.ControlButton(posx, posy, width, height, label, font=font, alignment=0x00000000,
# noFocusTexture='', focusTexture=media_path + selected,
# textColor=textcolor, shadowColor=shadow, textOffsetX=offsetx,
# textOffsetY=offsety)
# self.addControl(self.button_cast)
# self.buttons.append(self.button_cast)
# posy += space
# label = config.get_localized_string(70015)
# self.button_torrent = xbmcgui.ControlButton(posx, posy, width, height, label, font=font,
# alignment=0x00000000, noFocusTexture='',
# focusTexture=media_path+selected, textColor=textcolor,
# shadowColor=shadow, textOffsetX=offsetx, textOffsetY=offsety)
# self.addControl(self.button_torrent)
# self.buttons.append(self.button_torrent)
start_page_item = get_start_page()
if config.get_setting('start_page') and start_page_item.channel == 'news':
posy += space
label = config.get_localized_string(70016)
self.button_config = xbmcgui.ControlButton(posx, posy, width, height, label, font=font,
alignment=0x00000000, noFocusTexture='',
focusTexture=media_path+selected, textColor=conditional_textcolor,
shadowColor=shadow, textOffsetX=offsetx, textOffsetY=offsety)
self.addControl(self.button_config)
self.buttons.append(self.button_config)
posy += space*2
label = config.get_localized_string(60423)
self.button_buscar = xbmcgui.ControlButton(posx, posy, width, height, label, font=font, alignment=0x00000000,
noFocusTexture='', focusTexture=media_path + selected,
textColor=textcolor, shadowColor=shadow, textOffsetX=offsetx,
textOffsetY=offsety)
self.addControl(self.button_buscar)
self.buttons.append(self.button_buscar)
posy += space
label = config.get_localized_string(70036)
self.button_actor = xbmcgui.ControlButton(posx, posy, width, height, label, font=font, alignment=0x00000000,
noFocusTexture='', focusTexture=media_path + selected,
textColor=textcolor, shadowColor=shadow, textOffsetX=offsetx,
textOffsetY=offsety)
self.addControl(self.button_actor)
self.buttons.append(self.button_actor)
posy += space
label = config.get_localized_string(70010)
self.button_config_search = xbmcgui.ControlButton(posx, posy, width, height, label, font=font,
alignment=0x00000000,
noFocusTexture='', focusTexture=media_path + selected,
textColor=conditional_textcolor, shadowColor=shadow,
textOffsetX=offsetx, textOffsetY=offsety)
self.addControl(self.button_config_search)
self.buttons.append(self.button_config_search)
label=''
self.button_close = xbmcgui.ControlButton(260, 0, 1020, 725, label, noFocusTexture='', focusTexture='')
self.addControl(self.button_close)
def onClick(self, control):
new_item=''
control = self.getControl(control).getLabel()
if control == config.get_localized_string(70663):
new_item = get_start_page()
elif control == config.get_localized_string(70009):
new_item = Item(channel='', action='getmainlist', title='Menú Alfa')
elif control == config.get_localized_string(30100):
new_item = Item(channel='setting', action="settings")
elif control == config.get_localized_string(30122):
new_item = Item(channel='news', action="novedades", extra="peliculas", mode='silent')
elif control == config.get_localized_string(70017):
new_item = Item(channel='news', action="novedades", extra="series", mode='silent')
elif control == config.get_localized_string(30124):
new_item = Item(channel='news', action="novedades", extra="anime", mode='silent')
elif control == config.get_localized_string(70018):
new_item = Item(channel='news', action="novedades", extra="infantiles", mode='silent')
elif control == config.get_localized_string(70019):
new_item = Item(channel='news', action="novedades", extra="documentales", mode='silent')
elif control == config.get_localized_string(70013):
new_item = Item(channel='news', action="novedades", extra="terror", mode='silent')
elif control == config.get_localized_string(59981):
new_item = Item(channel='news', action="novedades", extra="castellano", mode='silent')
elif control == config.get_localized_string(70014):
new_item = Item(channel='news', action="novedades", extra="latino", mode='silent')
elif control == config.get_localized_string(70015):
new_item = Item(channel='news', action="novedades", extra="torrent", mode='silent')
elif control == config.get_localized_string(70016):
menu_node = jsontools.get_node_from_file('menu_settings_data.json', 'menu')
if 'categoria actual' in menu_node:
category = menu_node['categoria actual']
new_item = Item(channel='news', action="setting_channel", extra=category, menu=True)
elif control == config.get_localized_string(60423):
new_item = Item(channel='search', action="search")
elif control == config.get_localized_string(70036):
new_item = Item(channel='tvmoviedb', title="Buscar actor/actriz", action="search_",
search={'url': 'search/person', 'language': def_lang, 'page': 1}, star=True)
elif control == config.get_localized_string(70010):
new_item = Item(channel='search', action="setting_channel")
elif control == '':
self.close()
if new_item !='':
self.run_action(new_item)
def onAction(self, action):
if action == ACTION_PREVIOUS_MENU or action == ACTION_GESTURE_SWIPE_LEFT or action == 110 or action == 92:
self.close()
if action == ACTION_MOVE_RIGHT or action == ACTION_MOVE_DOWN:
self.focus += 1
if self.focus > len(self.buttons)-1:
self.focus = 0
while True:
id_focus = str(self.buttons[self.focus].getId())
if xbmc.getCondVisibility('[Control.IsVisible(' + id_focus + ')]'):
self.setFocus(self.buttons[self.focus])
break
self.focus += 1
if action == ACTION_MOVE_LEFT or action == ACTION_MOVE_UP:
self.focus -= 1
if self.focus < 0:
self.focus = len(self.buttons) - 1
while True:
id_focus = str(self.buttons[self.focus].getId())
if xbmc.getCondVisibility('[Control.IsVisible(' + id_focus + ')]'):
self.setFocus(self.buttons[self.focus])
break
self.focus -= 1
def run_action(self, item):
logger.debug()
if item.menu != True:
self.close()
xbmc.executebuiltin("Container.update(%s)"%launcher.run(item))
+13 -9
View File
@@ -34,6 +34,7 @@ def mark_auto_as_watched(item):
marked = False marked = False
sync = False
next_episode = None next_episode = None
show_server = True show_server = True
@@ -60,7 +61,10 @@ def mark_auto_as_watched(item):
if actual_time > mark_time and not marked: if actual_time > mark_time and not marked:
logger.info("Marked as Watched") logger.info("Marked as Watched")
item.playcount = 1 item.playcount = 1
if item.options['strm'] : marked = True marked = True
item.played_time = 0
platformtools.set_played_time(item)
if item.options['strm'] : sync = True
show_server = False show_server = False
from specials import videolibrary from specials import videolibrary
videolibrary.mark_content_as_watched2(item) videolibrary.mark_content_as_watched2(item)
@@ -68,7 +72,7 @@ def mark_auto_as_watched(item):
break break
# check for next Episode # check for next Episode
if next_episode and marked and time_from_end >= difference: if next_episode and sync and time_from_end >= difference:
nextdialog = NextDialog(ND, config.get_runtime_path()) nextdialog = NextDialog(ND, config.get_runtime_path())
nextdialog.show() nextdialog.show()
while platformtools.is_playing() and not nextdialog.is_exit(): while platformtools.is_playing() and not nextdialog.is_exit():
@@ -80,20 +84,20 @@ def mark_auto_as_watched(item):
break break
xbmc.sleep(1000) xbmc.sleep(1000)
if item.options['continue']: # if item.options['continue']:
if 120 < actual_time < (total_time / 100) * 80: if actual_time < mark_time:
item.played_time = actual_time item.played_time = actual_time
else: item.played_time = 0 else: item.played_time = 0
platformtools.set_played_time(item) platformtools.set_played_time(item)
# Silent sync with Trakt # Silent sync with Trakt
if marked and config.get_setting("trakt_sync"): sync_trakt_kodi() if sync and config.get_setting("trakt_sync"): sync_trakt_kodi()
while platformtools.is_playing(): while platformtools.is_playing():
xbmc.sleep(100) xbmc.sleep(100)
if not show_server and item.play_from != 'window' and not item.no_return: if not show_server and item.play_from != 'window' and not item.no_return:
xbmc.sleep(700) xbmc.sleep(700)
xbmc.executebuiltin('Action(Back)') xbmc.executebuiltin('Action(ParentDir)')
xbmc.sleep(500) xbmc.sleep(500)
if next_episode and next_episode.next_ep: if next_episode and next_episode.next_ep:
from platformcode.launcher import play_from_library from platformcode.launcher import play_from_library
@@ -1937,7 +1937,7 @@ msgid "FILTER SAVED"
msgstr "" msgstr ""
msgctxt "#60447" msgctxt "#60447"
msgid "FAQ:" msgid "Guide (opens the browser)"
msgstr "" msgstr ""
msgctxt "#60448" msgctxt "#60448"
@@ -1936,8 +1936,8 @@ msgid "FILTER SAVED"
msgstr "FILTRO SALVATO" msgstr "FILTRO SALVATO"
msgctxt "#60447" msgctxt "#60447"
msgid "FAQ:" msgid "Guide (opens the browser)"
msgstr "FAQ:" msgstr "Guida alle funzioni di KoD (apre il browser)"
msgctxt "#60448" msgctxt "#60448"
msgid " - How do I report an error?" msgid " - How do I report an error?"
+1 -8
View File
@@ -148,7 +148,7 @@
<!-- Contextual --> <!-- Contextual -->
<setting label="30024" type="lsep"/> <setting label="30024" type="lsep"/>
<setting id="quick_menu" type="bool" label="60360" default="true"/> <setting id="quick_menu" type="bool" label="60360" default="true"/>
<setting id="side_menu" type="bool" label="70737" default="false"/> <!-- <setting id="side_menu" type="bool" label="70737" default="false"/> -->
<setting id="kod_menu" type="bool" label="60026" default="true"/> <setting id="kod_menu" type="bool" label="60026" default="true"/>
<setting id="infoplus" type="bool" label="70151" default="false"/> <setting id="infoplus" type="bool" label="70151" default="false"/>
<!-- <setting id="infoplus_set" type="bool" label="70128" visible="eq(-1,true)" default="false" subsetting="true"/> --> <!-- <setting id="infoplus_set" type="bool" label="70128" visible="eq(-1,true)" default="false" subsetting="true"/> -->
@@ -157,13 +157,6 @@
<setting label="30998" type="lsep"/> <setting label="30998" type="lsep"/>
<setting id="shortcut_key" type="action" label="30999" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAia2V5bWFwIg0KfQ==)"/> <setting id="shortcut_key" type="action" label="30999" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAia2V5bWFwIg0KfQ==)"/>
<setting id="delete_key" type="action" label="31000" action="RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJkZWxldGVfa2V5Igp9==)"/> <setting id="delete_key" type="action" label="31000" action="RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJkZWxldGVfa2V5Igp9==)"/>
<!-- Custom Start -->
<setting label="70715" type="lsep"/>
<setting id="start_page" type="bool" label="70121" default="false"/>
<setting id="custom_start" type="bool" label="70122" default="false" visible="eq(-1,True)" enable="eq(-1,True)+eq(1,False)" subsetting="true"/>
<setting id="news_start" type="bool" label="70123" default="false" visible="eq(-2,True)" enable="eq(-1,False)+eq(-2,True)" subsetting="true"/>
<setting id="category" type="action" label="70124" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJzZWxlY3QiLA0KICAgICJjaGFubmVsIjoic2hvcnRjdXRzIiwNCgkiaWQiOiJjYXRlZ29yeSIsDQoJInR5cGUiOiJsYWJlbHMiLA0KCSJ2YWx1ZXMiOiI3MDEzN3wzMDEyM3wzMDEyNHw2MDUxMyIsDQoJImxhYmVsIjoiNzAxMjQiDQp9)" visible="eq(-3,True)+eq(-1,True)+eq(-2,False)" enable="eq(-3,True)+eq(-1,True)+eq(-2,False)" subsetting="true"/>
<!-- <setting id="category" type="select" label="70124" lvalues="70137|30123|30124|60513" default="Film" visible="eq(-3,True)+eq(-1,True)+eq(-2,False)" enable="eq(-3,True)+eq(-1,True)+(-2,false)"/> -->
<!-- Others --> <!-- Others -->
<setting label="70149" type="lsep"/> <setting label="70149" type="lsep"/>
<setting id="icon_set" type="select" label="70108" values="default|light|dark|mike" default="default"/> <setting id="icon_set" type="select" label="70108" values="default|light|dark|mike" default="default"/>
@@ -1,114 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<window>
<depth>0.52</depth>
<coordinates>
<left>0</left>
<top>0</top>
</coordinates>
<controls>
<!-- CLOSE BUTTON / BACKGROUND -->
<control type="button">
<left>0</left>
<top>0</top>
<width>100%</width>
<height>100%</height>
<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>
</control>
<!-- GROUP CONTROLS -->
<control type="group">
<left>100</left>
<top>250</top>
<animation type="WindowOpen" reversible="false">
<effect type="slide" start="0,100" end="0,0" delay="160" time="160" />
<effect type="fade" delay="160" end="100" time="100" />
</animation>
<animation type="WindowClose" reversible="false">
<effect type="slide" start="0,0" end="0,100" delay="160" time="160" />
<effect type="fade" delay="160" start="100" end="0" time="100" />
</animation>
<!-- SCROLLBAR -->
<control type="scrollbar" id="61">
<visible allowhiddenfocus="true">Control.HasFocus(61)</visible>
<animation effect="slide" start="0,0" end="0,-9" time="100">Unfocus</animation>
<animation effect="slide" start="0,-9" end="0,0" time="100">Focus</animation>
<left>0</left>
<top>219</top>
<width>1100</width>
<height>10</height>
<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>
</control>
<!-- BACKGROUND -->
<control type="image">
<width>1100</width>
<height>218</height>
<texture colordiffuse="FFDCDCDC">white.png</texture>
</control>
<control type="list" id="32500">
<left>-130</left>
<top>-1</top>
<width>1100</width>
<height>220</height>
<onup>32501</onup>
<ondown>61</ondown>
<orientation>horizontal</orientation>
<scrolltime>200</scrolltime>
<pagecontrol>61</pagecontrol>
<animation effect="slide" start="0,0" end="10,0" time="0" condition="true">Conditional</animation>
<animation effect="slide" end="120,0" time="0" condition="!Control.IsVisible(5)">Conditional</animation>
<itemlayout height="220" width="220">
<control type="image">
<width>220</width>
<height>220</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>keep</aspectratio>
<align>center</align>
</control>
</itemlayout>
<focusedlayout height="220" width="220">
<control type="image">
<top>1</top>
<width>220</width>
<height>218</height>
<texture colordiffuse="550082C2">white.png</texture>
</control>
<control type="image">
<width>220</width>
<height>220</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>keep</aspectratio>
<align>center</align>
</control>
<control type="textbox">
<left>0</left>
<top>160</top>
<width>220</width>
<height>74</height>
<font>font13</font>
<textcolor>FF232323</textcolor>
<label>$INFO[ListItem.Label]</label>
<align>center</align>
<aligny>center</aligny>
</control>
<control type="image">
<left>90</left>
<top>0</top>
<width>40</width>
<height>40</height>
<texture colordiffuse="FF232323">$INFO[ListItem.Property(sub)]</texture>
<aspectratio>keep</aspectratio>
<align>center</align>
</control>
</focusedlayout>
</control>
</control> <!-- GROUP CONTROLS END -->
</controls>
</window>
+159 -79
View File
@@ -6,22 +6,29 @@
<top>0</top> <top>0</top>
</coordinates> </coordinates>
<controls> <controls>
<!-- CLOSE BUTTON / BACKGROUND -->
<control type="button"> <control type="button">
<description>Close Button</description>
<left>0</left> <left>0</left>
<top>0</top> <top>0</top>
<width>100%</width> <width>100%</width>
<height>100%</height> <height>100%</height>
<texturefocus colordiffuse="80232323">white.png</texturefocus> <texturefocus colordiffuse="77232323">white.png</texturefocus>
<texturenofocus colordiffuse="80232323">white.png</texturenofocus> <texturenofocus colordiffuse="77232323">white.png</texturenofocus>
<animation effect="fade" time="200">WindowOpen</animation> <animation effect="fade" time="200">WindowOpen</animation>
<animation effect="fade" time="200">WindowClose</animation> <animation effect="fade" time="200">WindowClose</animation>
<onclick>Action(close)</onclick> <onclick>Action(close)</onclick>
<onup>100</onup>
<ondown>100</ondown>
<onleft>100</onleft>
<onright>100</onright>
</control> </control>
<!-- GROUP CONTROLS -->
<control type="group"> <control type="group">
<description>Group Controls</description>
<left>100</left> <left>100</left>
<top>250</top> <top>250</top>
<width>1100</width>
<height>220</height>
<animation type="WindowOpen" reversible="false"> <animation type="WindowOpen" reversible="false">
<effect type="slide" start="0,100" end="0,0" delay="160" time="160" /> <effect type="slide" start="0,100" end="0,0" delay="160" time="160" />
<effect type="fade" delay="160" end="100" time="100" /> <effect type="fade" delay="160" end="100" time="100" />
@@ -30,84 +37,157 @@
<effect type="slide" start="0,0" end="0,100" delay="160" time="160" /> <effect type="slide" start="0,0" end="0,100" delay="160" time="160" />
<effect type="fade" delay="160" start="100" end="0" time="100" /> <effect type="fade" delay="160" start="100" end="0" time="100" />
</animation> </animation>
<!-- SCROLLBAR -->
<control type="scrollbar" id="61">
<visible allowhiddenfocus="true">Control.HasFocus(61)</visible>
<animation effect="slide" start="0,0" end="0,-9" time="100">Unfocus</animation>
<animation effect="slide" start="0,-9" end="0,0" time="100">Focus</animation>
<left>0</left>
<top>219</top>
<width>1100</width>
<height>10</height>
<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>
</control>
<!-- BACKGROUND -->
<control type="image"> <control type="image">
<width>1100</width> <description>Background</description>
<height>218</height> <top>0</top>
<texture colordiffuse="FF232323">white.png</texture> <left>0</left>
<width>100%</width>
<height>100%</height>
<texture colordiffuse="Container(1).ListItem.Property(background)">white.png</texture>
</control> </control>
<control type="list" id="32500">
<left>-130</left> <control type="grouplist">
<top>-1</top> <description>Group List</description>
<width>1100</width> <top>0</top>
<left>0</left>
<width>100%</width>
<height>220</height> <height>220</height>
<onup>32501</onup> <orientation>vertical</orientation>
<ondown>61</ondown>
<orientation>horizontal</orientation> <control type="list" id="1">
<scrolltime>200</scrolltime> <description>Menu</description>
<pagecontrol>61</pagecontrol> <left>0</left>
<animation effect="slide" start="0,0" end="10,0" time="0" condition="true">Conditional</animation> <top>0</top>
<animation effect="slide" end="120,0" time="0" condition="!Control.IsVisible(5)">Conditional</animation> <width>100%</width>
<itemlayout height="220" width="220"> <height>220</height>
<control type="image"> <onup>32501</onup>
<width>220</width> <ondown>61</ondown>
<height>220</height> <orientation>horizontal</orientation>
<texture>$INFO[ListItem.Property(thumbnail)]</texture> <scrolltime>200</scrolltime>
<aspectratio>keep</aspectratio> <pagecontrol>61</pagecontrol>
<align>center</align> <itemlayout height="220" width="220">
</control> <control type="image">
</itemlayout> <width>220</width>
<focusedlayout height="220" width="220"> <height>220</height>
<control type="image"> <texture>$INFO[ListItem.Property(thumbnail)]</texture>
<top>1</top> <aspectratio>keep</aspectratio>
<width>220</width> <align>center</align>
<height>218</height> </control>
<texture colordiffuse="FF0082C2">white.png</texture> </itemlayout>
</control> <focusedlayout height="220" width="220">
<control type="image"> <control type="image">
<width>220</width> <top>1</top>
<height>220</height> <width>220</width>
<texture>$INFO[ListItem.Property(thumbnail)]</texture> <height>218</height>
<aspectratio>keep</aspectratio> <texture colordiffuse="Container(1).ListItem.Property(select)">white.png</texture>
<align>center</align> </control>
</control> <control type="image">
<control type="textbox"> <width>220</width>
<left>0</left> <height>220</height>
<top>160</top> <texture>$INFO[ListItem.Property(thumbnail)]</texture>
<width>220</width> <aspectratio>keep</aspectratio>
<height>74</height> <align>center</align>
<font>font13</font> </control>
<textcolor>FFFFFFFF</textcolor> <control type="textbox">
<label>$INFO[ListItem.Label]</label> <description>Selected Item</description>
<align>center</align> <left>0</left>
<aligny>center</aligny> <top>180</top>
</control> <width>100%</width>
<control type="image"> <height>40</height>
<left>90</left> <font>font13</font>
<top>0</top> <textcolor>FFFFFFFF</textcolor>
<width>40</width> <label>$INFO[ListItem.Label]</label>
<height>40</height> <align>center</align>
<texture>$INFO[ListItem.Property(sub)]</texture> <aligny>center</aligny>
<aspectratio>keep</aspectratio> </control>
<align>center</align> </focusedlayout>
</control> </control>
</focusedlayout>
<control type="list" id="2">
<description>Submenu</description>
<left>0</left>
<top>0</top>
<width>100%</width>
<height>220</height>
<onup>32501</onup>
<ondown>61</ondown>
<orientation>horizontal</orientation>
<scrolltime>200</scrolltime>
<pagecontrol>61</pagecontrol>
<itemlayout height="220" width="220">
<control type="image">
<width>220</width>
<height>220</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>keep</aspectratio>
<align>center</align>
</control>
</itemlayout>
<focusedlayout height="220" width="220">
<control type="image">
<top>1</top>
<width>220</width>
<height>218</height>
<texture colordiffuse="Container(1).ListItem.Property(select)">white.png</texture>
</control>
<control type="image">
<width>220</width>
<height>220</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>keep</aspectratio>
<align>center</align>
</control>
<control type="textbox">
<description>Selected Item</description>
<left>0</left>
<top>180</top>
<width>100%</width>
<height>40</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<label>$INFO[ListItem.Label]</label>
<align>center</align>
<aligny>center</aligny>
</control>
</focusedlayout>
</control>
</control>
<control type="button" id='101'>
<visible>!String.IsEmpty(Container(1).ListItem.Property(sub)) + !Control.HasFocus(2) + !Control.HasFocus(102)</visible>
<animation effect="fade" start="0" end="100" time="200" reversible="true" condition="Control.IsVisible(101)">Conditional</animation>
<!-- <animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(1).Position,0)">Conditional</animation>
<animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(1).Position,1)">Conditional</animation>
<animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(1).Position,2)">Conditional</animation>
<animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(1).Position,3)">Conditional</animation>
<animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(1).Position,4)">Conditional</animation>
<animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(1).Position,5)">Conditional</animation> -->
<left>520</left>
<top>240</top>
<width>60</width>
<height>60</height>
<texturefocus colordiffuse="Container(1).ListItem.Property(text)">down.png</texturefocus>
<texturenofocus colordiffuse="Container(1).ListItem.Property(text)">down.png</texturenofocus>
<aspectratio>keep</aspectratio>
</control>
<control type="button" id='102'>
<visible>!Control.HasFocus(1) + !Control.HasFocus(101)</visible>
<animation effect="fade" start="0" end="100" time="200" reversible="true" condition="Control.IsVisible(102)">Conditional</animation>
<!-- <animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(2).Position,0)">Conditional</animation>
<animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(2).Position,1)">Conditional</animation>
<animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(2).Position,2)">Conditional</animation>
<animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(2).Position,3)">Conditional</animation>
<animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(2).Position,4)">Conditional</animation>
<animation effect="slide" end="220,0" condition="Integer.IsGreater(Container(2).Position,5)">Conditional</animation> -->
<left>520</left>
<top>-80</top>
<width>60</width>
<height>60</height>
<texturefocus colordiffuse="Container(1).ListItem.Property(text)">up.png</texturefocus>
<texturenofocus colordiffuse="Container(1).ListItem.Property(text)">up.png</texturenofocus>
<aspectratio>keep</aspectratio>
</control> </control>
</control> <!-- GROUP CONTROLS END --> </control> <!-- GROUP CONTROLS END -->
</controls> </controls>
@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<window>
<coordinates>
<left>0</left>
<top>0</top>
</coordinates>
<zorder>1</zorder>
<controls>
<control type="image">
<animation type="WindowOpen" reversible="true">
<effect type="slide" start="-200" end="0" time="250"/>
</animation>
<left>0</left>
<top>0</top>
<width>260</width>
<height>725</height>
<texture border="2">side_menu/bg0.png</texture>
</control>
<control type="image">
<left>25</left>
<top>30</top>
<width>200</width>
<height>70</height>
<texture border="2">side_menu/logo.png</texture>
</control>
</controls>
</window>
+1 -1
View File
@@ -13,7 +13,7 @@ from platformcode import logger, config, platformtools
# real_host = 'wstream.video' # real_host = 'wstream.video'
errorsStr = ['Sorry this file is not longer available', 'Sorry this video is unavailable', 'Video is processing' errorsStr = ['Sorry this file is not longer available', 'Sorry this video is unavailable', 'Video is processing'
'File was deleted', 'Not Found'] 'File was deleted', 'Not Found', 'This server is in maintenance mode. Refresh this page in some minutes.']
def test_video_exists(page_url): def test_video_exists(page_url):
+14 -9
View File
@@ -1,5 +1,5 @@
# s-*- coding: utf-8 -*- # s-*- coding: utf-8 -*-
import xbmc, xbmcaddon, sys, re
from core import httptools, scrapertools, filetools from core import httptools, scrapertools, filetools
from platformcode import config, logger, platformtools from platformcode import config, logger, platformtools
@@ -21,20 +21,17 @@ def get_video_url(page_url, premium=False, user="", password="", video_password=
logger.debug("(page_url='%s')" % page_url) logger.debug("(page_url='%s')" % page_url)
video_urls = [] video_urls = []
if not page_url.startswith("http"):
page_url = "http://www.youtube.com/watch?v=%s" % page_url
logger.debug(" page_url->'%s'" % page_url)
video_id = scrapertools.find_single_match(page_url, '(?:v=|embed/)([A-z0-9_-]{11})') video_id = scrapertools.find_single_match(page_url, '(?:v=|embed/)([A-z0-9_-]{11})')
inputstream = platformtools.install_inputstream() inputstream = platformtools.install_inputstream()
# from core.support import dbg;dbg()
try: try:
__settings__ = Addon(name) __settings__ = Addon(name)
if inputstream: __settings__.setSetting('kodion.video.quality.mpd', 'true') if inputstream: __settings__.setSetting('kodion.video.quality.mpd', 'true')
else: __settings__.setSetting('kodion.video.quality.mpd', 'false') else: __settings__.setSetting('kodion.video.quality.mpd', 'false')
video_urls = [['con YouTube', 'plugin://plugin.video.youtube/play/?video_id=' + video_id ]] # video_urls = [['con YouTube', 'plugin://plugin.video.youtube/play/?video_id=' + video_id ]]
except: except:
if filetools.exists(xbmc.translatePath('special://profile/addons/' + name)): path = xbmc.translatePath('special://home/addons/' + name)
if filetools.exists(path):
if platformtools.dialog_yesno(config.get_localized_string(70784), config.get_localized_string(70818)): if platformtools.dialog_yesno(config.get_localized_string(70784), config.get_localized_string(70818)):
xbmc.executeJSONRPC('{"jsonrpc": "2.0", "id":1, "method": "Addons.SetAddonEnabled", "params": { "addonid": "' + name + '", "enabled": true }}') xbmc.executeJSONRPC('{"jsonrpc": "2.0", "id":1, "method": "Addons.SetAddonEnabled", "params": { "addonid": "' + name + '", "enabled": true }}')
else: return [['','']] else: return [['','']]
@@ -42,7 +39,15 @@ def get_video_url(page_url, premium=False, user="", password="", video_password=
xbmc.executebuiltin('InstallAddon(' + name + ')', wait=True) xbmc.executebuiltin('InstallAddon(' + name + ')', wait=True)
try: Addon(name) try: Addon(name)
except: return [['','']] except: return [['','']]
my_addon = xbmcaddon.Addon('plugin.video.youtube')
addon_dir = xbmc.translatePath( my_addon.getAddonInfo('path') )
sys.path.append(filetools.join( addon_dir, 'resources', 'lib' ) )
from youtube_resolver import resolve
for stream in resolve(page_url):
# title = scrapertools.find_single_match(stream['title'], '(\d+p)')
if scrapertools.find_single_match(stream['title'], r'(\d+p)'):
video_urls.append([re.sub(r'(\[[^\]]+\])', '', stream['title']), stream['url']])
video_urls.sort(key=lambda it: int(it[0].split("p", 1)[0]))
return get_video_url(page_url)
return video_urls return video_urls
+20 -37
View File
@@ -65,7 +65,7 @@ QUALITYTAG = 505
EPISODESLIST = 200 EPISODESLIST = 200
SERVERLIST = 300 SERVERLIST = 300
class SearchWindow(xbmcgui.WindowXMLDialog): class SearchWindow(xbmcgui.WindowXML):
def start(self, item, moduleDict={}, searchActions=[]): def start(self, item, moduleDict={}, searchActions=[]):
logger.debug() logger.debug()
self.exit = False self.exit = False
@@ -83,6 +83,8 @@ class SearchWindow(xbmcgui.WindowXMLDialog):
self.searchActions = searchActions self.searchActions = searchActions
self.thread = None self.thread = None
self.selected = False self.selected = False
self.pos = 0
selfeppos = 0
self.items = [] self.items = []
if not searchActions: if not searchActions:
@@ -479,8 +481,7 @@ class SearchWindow(xbmcgui.WindowXMLDialog):
global close_action global close_action
action = action.getId() action = action.getId()
focus = self.getFocusId() focus = self.getFocusId()
if action in [FULLSCREEN]:
self.playmonitor()
if action in [CONTEXT] and focus in [RESULTS, EPISODESLIST, SERVERLIST]: if action in [CONTEXT] and focus in [RESULTS, EPISODESLIST, SERVERLIST]:
self.context() self.context()
@@ -500,7 +501,7 @@ class SearchWindow(xbmcgui.WindowXMLDialog):
self.RESULTS.addItems(items) self.RESULTS.addItems(items)
self.RESULTS.selectItem(subpos) self.RESULTS.selectItem(subpos)
elif action in [DOWN] and focus in [BACK, CLOSE, MENU]: elif (action in [DOWN] and focus in [BACK, CLOSE, MENU]) or focus not in [BACK, CLOSE, MENU, SERVERLIST, EPISODESLIST, RESULTS, CHANNELS]:
if self.SERVERS.isVisible(): self.setFocusId(SERVERLIST) if self.SERVERS.isVisible(): self.setFocusId(SERVERLIST)
elif self.EPISODES.isVisible(): self.setFocusId(EPISODESLIST) elif self.EPISODES.isVisible(): self.setFocusId(EPISODESLIST)
elif self.RESULTS.isVisible(): self.setFocusId(RESULTS) elif self.RESULTS.isVisible(): self.setFocusId(RESULTS)
@@ -556,10 +557,10 @@ class SearchWindow(xbmcgui.WindowXMLDialog):
self.actors() self.actors()
elif search == 'persons': elif search == 'persons':
item = self.item.clone(mode='person_', discovery=self.persons[pos]) item = self.item.clone(mode='person_', discovery=self.persons[pos])
self.close() # self.close()
Search(item, self.moduleDict, self.searchActions) Search(item, self.moduleDict, self.searchActions)
if not close_action: if close_action:
self.doModal() self.close
else: else:
item = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item')) item = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item'))
if self.item.mode == 'movie': item.contentTitle = self.RESULTS.getSelectedItem().getLabel() if self.item.mode == 'movie': item.contentTitle = self.RESULTS.getSelectedItem().getLabel()
@@ -574,10 +575,10 @@ class SearchWindow(xbmcgui.WindowXMLDialog):
self.RESULTS.setVisible(True) self.RESULTS.setVisible(True)
self.PROGRESS.setVisible(False) self.PROGRESS.setVisible(False)
self.close() # self.close()
Search(item, self.moduleDict, self.searchActions) Search(item, self.moduleDict, self.searchActions)
if not close_action: if close_action:
self.doModal() self.close()
elif control_id in [RESULTS, EPISODESLIST]: elif control_id in [RESULTS, EPISODESLIST]:
busy(True) busy(True)
@@ -586,7 +587,7 @@ class SearchWindow(xbmcgui.WindowXMLDialog):
self.pos = self.RESULTS.getSelectedPosition() self.pos = self.RESULTS.getSelectedPosition()
item = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item')) item = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item'))
else: else:
self.pos = self.EPISODESLIST.getSelectedPosition() self.eppos = self.EPISODESLIST.getSelectedPosition()
item_url = self.EPISODESLIST.getSelectedItem().getProperty('item') item_url = self.EPISODESLIST.getSelectedItem().getProperty('item')
if item_url: if item_url:
item = Item().fromurl(item_url) item = Item().fromurl(item_url)
@@ -663,14 +664,12 @@ class SearchWindow(xbmcgui.WindowXMLDialog):
if config.get_setting('autoplay'): if config.get_setting('autoplay'):
busy(False) busy(False)
self.playmonitor()
else: else:
self.episodes = self.itemsResult if self.itemsResult else [] self.episodes = self.itemsResult if self.itemsResult else []
self.itemsResult = [] self.itemsResult = []
ep = [] ep = []
for item in self.episodes: for item in self.episodes:
# if item.action == 'findvideos':
it = xbmcgui.ListItem(item.title) it = xbmcgui.ListItem(item.title)
it.setProperty('item', item.tourl()) it.setProperty('item', item.tourl())
ep.append(it) ep.append(it)
@@ -688,9 +687,7 @@ class SearchWindow(xbmcgui.WindowXMLDialog):
elif control_id in [SERVERLIST]: elif control_id in [SERVERLIST]:
server = Item().fromurl(self.getControl(control_id).getSelectedItem().getProperty('item')) server = Item().fromurl(self.getControl(control_id).getSelectedItem().getProperty('item'))
return self.playmonitor(server) return self.play(server)
# server.globalsearch = True
# return run(server)
def Back(self): def Back(self):
self.getControl(QUALITYTAG).setText('') self.getControl(QUALITYTAG).setText('')
@@ -701,7 +698,7 @@ class SearchWindow(xbmcgui.WindowXMLDialog):
else: else:
self.Focus(SEARCH) self.Focus(SEARCH)
self.setFocusId(RESULTS) self.setFocusId(RESULTS)
self.RESULTS.selectItem(self.pos) self.RESULTS.selectItem(self.eppos)
elif self.EPISODES.isVisible(): elif self.EPISODES.isVisible():
self.episodes = [] self.episodes = []
self.Focus(SEARCH) self.Focus(SEARCH)
@@ -740,23 +737,9 @@ class SearchWindow(xbmcgui.WindowXMLDialog):
if index > 0: xbmc.executebuiltin(context_commands[index]) if index > 0: xbmc.executebuiltin(context_commands[index])
def playmonitor(self, server=None): def play(self, server=None):
if server: platformtools.prevent_busy(server)
platformtools.prevent_busy(server) server.window = True
server.window = True server.globalsearch = True
server.globalsearch = True return run(server)
if server in ['torrent']: Thread(target=run, args=[server]).start()
else: run(server)
try:
while not platformtools.is_playing() or not xbmc.Player().getTime() > 0:
xbmc.sleep(500)
self.close()
xbmc.sleep(500)
while xbmcgui.getCurrentWindowId() in [12005, 12006]:
xbmc.sleep(500)
if platformtools.is_playing():
xbmc.sleep(300)
xbmc.executebuiltin('Action(Fullscreen)')
self.doModal()
except:
return
+6 -145
View File
@@ -1,40 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os
from channelselector import get_thumb from channelselector import get_thumb
from core.item import Item from core.item import Item
from platformcode import config, logger, platformtools from platformcode import config, logger
if config.is_xbmc():
import xbmcgui
class TextBox(xbmcgui.WindowXMLDialog):
""" Create a skinned textbox window """
def __init__(self, *args, **kwargs):
self.title = kwargs.get('title')
self.text = kwargs.get('text')
self.doModal()
def onInit(self):
try:
self.getControl(5).setText(self.text)
self.getControl(1).setLabel(self.title)
except:
pass
def onClick(self, control_id):
pass
def onFocus(self, control_id):
pass
def onAction(self, action):
# self.close()
if action in [xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK]:
self.close()
guideUrl = "https://github.com/kodiondemand/addon/wiki/Guida-alle-funzioni-di-Kod"
def mainlist(item): def mainlist(item):
logger.debug() logger.debug()
@@ -44,119 +13,11 @@ def mainlist(item):
itemlist.append(Item(title=config.get_localized_string(707429), channel="setting", action="report_menu", itemlist.append(Item(title=config.get_localized_string(707429), channel="setting", action="report_menu",
thumbnail=get_thumb("error.png"), viewmode="list",folder=True)) thumbnail=get_thumb("error.png"), viewmode="list",folder=True))
itemlist.append(Item(channel=item.channel, action="", title=config.get_localized_string(60447), itemlist.append(Item(action="open_browser", title=config.get_localized_string(60447),
thumbnail=get_thumb("help.png"), thumbnail=get_thumb("help.png"), url=guideUrl, plot=guideUrl,
folder=False)) folder=False))
itemlist.append(Item(channel=item.channel, action="faq", itemlist.append(Item(channel="setting", action="check_quickfixes", folder=False, thumbnail=get_thumb("update.png"),
title=config.get_localized_string(60449), title=config.get_localized_string(30001), plot=config.get_addon_version(with_fix=True)))
thumbnail=get_thumb("help.png"),
folder=False, extra="onoff_canales"))
itemlist.append(Item(channel=item.channel, action="faq",
title=config.get_localized_string(60450),
thumbnail=get_thumb("help.png"),
folder=False, extra="trakt_sync"))
itemlist.append(Item(channel=item.channel, action="faq",
title=config.get_localized_string(60451),
thumbnail=get_thumb("help.png"),
folder=False, extra="buscador_juntos"))
itemlist.append(Item(channel=item.channel, action="faq",
title=config.get_localized_string(60452),
thumbnail=get_thumb("help.png"),
folder=False, extra="tiempo_enlaces"))
itemlist.append(Item(channel=item.channel, action="faq",
title=config.get_localized_string(60453),
thumbnail=get_thumb("help.png"),
folder=False, extra="prob_busquedacont"))
itemlist.append(Item(channel=item.channel, action="faq",
title=config.get_localized_string(60454),
thumbnail=get_thumb("help.png"),
folder=False, extra="canal_fallo"))
itemlist.append(Item(channel=item.channel, action="faq",
title=config.get_localized_string(70280),
thumbnail=get_thumb("help.png"),
folder=False, extra="prob_torrent"))
itemlist.append(Item(channel=item.channel, action="faq",
title=config.get_localized_string(60455),
thumbnail=get_thumb("help.png"),
folder=False, extra="prob_bib"))
itemlist.append(Item(channel=item.channel, action="faq",
title=config.get_localized_string(60456),
thumbnail=get_thumb("help.png"),
folder=False, extra=""))
return itemlist return itemlist
def faq(item):
if item.extra == "onoff_canales":
respuesta = platformtools.dialog_yesno(config.get_localized_string(60457), config.get_localized_string(60458))
if respuesta == 1:
from specials import setting
setting.conf_tools(Item(extra='channels_onoff'))
elif item.extra == "trakt_sync":
respuesta = platformtools.dialog_yesno(config.get_localized_string(60457), config.get_localized_string(60459))
if respuesta == 1:
from specials import videolibrary
videolibrary.channel_config(Item(channel='videolibrary'))
elif item.extra == "tiempo_enlaces":
respuesta = platformtools.dialog_yesno(config.get_localized_string(60457), config.get_localized_string(60460))
if respuesta == 1:
from specials import videolibrary
videolibrary.channel_config(Item(channel='videolibrary'))
elif item.extra == "prob_busquedacont":
title = config.get_localized_string(60461) % item.title[6:]
text = config.get_localized_string(60462)
return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text)
elif item.extra == "canal_fallo":
title = config.get_localized_string(60461) % item.title[6:]
text = config.get_localized_string(60463)
return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text)
elif item.extra == "prob_bib":
platformtools.dialog_ok(config.get_localized_string(60457), # To check
config.get_localized_string(60464))
respuesta = platformtools.dialog_yesno(config.get_localized_string(60457),
config.get_localized_string(60465))
if respuesta == 1:
itemlist = []
from specials import setting
new_item = Item(channel="setting", action="submenu_tools", folder=True)
itemlist.extend(setting.submenu_tools(new_item))
return itemlist
elif item.extra == "prob_torrent":
title = config.get_localized_string(60461) % item.title[6:]
text = config.get_localized_string(70279)
return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text)
elif item.extra == "buscador_juntos":
respuesta = platformtools.dialog_yesno(config.get_localized_string(60457), config.get_localized_string(60466))
if respuesta == 1:
from specials import search
search.settings("")
elif item.extra == "report_error":
import xbmc
if config.get_platform(True)['num_version'] < 14:
log_name = "xbmc.log"
else:
log_name = "kodi.log"
ruta = xbmc.translatePath("special://logpath") + log_name
title = config.get_localized_string(60461) % item.title[6:]
text = config.get_localized_string(60467) % ruta
return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text)
else:
platformtools.dialog_ok(config.get_localized_string(60457), # To check "Tag telegram"
config.get_localized_string(60468))
+14 -20
View File
@@ -26,7 +26,7 @@ from datetime import datetime
from core.item import Item from core.item import Item
from platformcode import config, logger, platformtools from platformcode import config, logger, platformtools
from core import filetools, jsontools from core import filetools, jsontools, support
def fechahora_actual(): def fechahora_actual():
@@ -189,30 +189,24 @@ def mainlist(item):
for i_perfil, perfil in enumerate(alfav.user_favorites): for i_perfil, perfil in enumerate(alfav.user_favorites):
context = [] context = []
context.append({'title': config.get_localized_string(70533), 'channel': item.channel, 'action': 'editar_perfil_titulo', context.append({'title': config.get_localized_string(70533), 'channel': item.channel, 'action': 'editar_perfil_titulo', 'i_perfil': i_perfil})
'i_perfil': i_perfil}) context.append({'title': config.get_localized_string(70534), 'channel': item.channel, 'action': 'eliminar_perfil', 'i_perfil': i_perfil})
context.append({'title': config.get_localized_string(70534), 'channel': item.channel, 'action': 'eliminar_perfil',
'i_perfil': i_perfil})
if i_perfil > 0: if i_perfil > 0:
context.append({'title': config.get_localized_string(70535), 'channel': item.channel, 'action': 'mover_perfil', context.append({'title': config.get_localized_string(70535), 'channel': item.channel, 'action': 'mover_perfil', 'i_perfil': i_perfil, 'direccion': 'top'})
'i_perfil': i_perfil, 'direccion': 'top'}) context.append({'title': config.get_localized_string(70536), 'channel': item.channel, 'action': 'mover_perfil', 'i_perfil': i_perfil, 'direccion': 'arriba'})
context.append({'title': config.get_localized_string(70536), 'channel': item.channel, 'action': 'mover_perfil',
'i_perfil': i_perfil, 'direccion': 'arriba'})
if i_perfil < last_i: if i_perfil < last_i:
context.append({'title': config.get_localized_string(70537), 'channel': item.channel, 'action': 'mover_perfil', context.append({'title': config.get_localized_string(70537), 'channel': item.channel, 'action': 'mover_perfil', 'i_perfil': i_perfil, 'direccion': 'abajo'})
'i_perfil': i_perfil, 'direccion': 'abajo'}) context.append({'title': config.get_localized_string(70538), 'channel': item.channel, 'action': 'mover_perfil', 'i_perfil': i_perfil, 'direccion': 'bottom'})
context.append({'title': config.get_localized_string(70538), 'channel': item.channel, 'action': 'mover_perfil',
'i_perfil': i_perfil, 'direccion': 'bottom'})
plot = str(len(perfil['items'])) + " " + config.get_localized_string(70723) plot = str(len(perfil['items'])) + " " + config.get_localized_string(70723)
itemlist.append(Item(channel=item.channel, action='mostrar_perfil', title=perfil['title'], plot=plot, i_perfil=i_perfil, context=context)) itemlist.append(Item(channel=item.channel, action='mostrar_perfil', title=perfil['title'], plot=plot, i_perfil=i_perfil, context=context, thumbnail=support.thumb('mylink.png')))
itemlist.append(item.clone(action='crear_perfil', title=config.get_localized_string(70542), folder=False)) itemlist.append(item.clone(action='crear_perfil', title=config.get_localized_string(70542), folder=False))
itemlist.append(item.clone(action='mainlist_listas', title=config.get_localized_string(70603))) itemlist.append(item.clone(action='mainlist_listas', title=config.get_localized_string(70603)))
return itemlist return support.thumb(itemlist)
def mostrar_perfil(item): def mostrar_perfil(item):
@@ -230,13 +224,13 @@ def mostrar_perfil(item):
for i_enlace, enlace in enumerate(alfav.user_favorites[i_perfil]['items']): for i_enlace, enlace in enumerate(alfav.user_favorites[i_perfil]['items']):
it = Item().fromurl(enlace) it = Item().fromurl(enlace)
it.context = [ {'title': '[COLOR blue]'+config.get_localized_string(70617)+'[/COLOR]', 'channel': item.channel, 'action': 'acciones_enlace', it.context = [ {'title': config.get_localized_string(70617), 'channel': item.channel, 'action': 'acciones_enlace',
'i_enlace': i_enlace, 'i_perfil': i_perfil} ] 'i_enlace': i_enlace, 'i_perfil': i_perfil} ]
it.plot += '[CR][CR][COLOR blue]' + config.get_localized_string(70724) + ':[/COLOR] ' + it.channel + ' [COLOR blue]' + config.get_localized_string(60266) + ':[/COLOR] ' + it.action it.plot += '[CR][CR]' + config.get_localized_string(70724) + ': ' + it.channel + ' ' + config.get_localized_string(60266) + ': ' + it.action
if it.extra != '': it.plot += ' [COLOR blue]Extra:[/COLOR] ' + it.extra if it.extra != '': it.plot += ' Extra: ' + it.extra
it.plot += '[CR][COLOR blue]Url:[/COLOR] ' + it.url if isinstance(it.url, str) else '...' it.plot += '[CR]Url: ' + it.url if isinstance(it.url, str) else '...'
if it.date_added != '': it.plot += '[CR][COLOR blue]' + config.get_localized_string(70469) + ':[/COLOR] ' + it.date_added if it.date_added != '': it.plot += '[CR]' + config.get_localized_string(70469) + ': ' + it.date_added
# If it is not a url, nor does it have the system path, convert the path since it will have been copied from another device. # If it is not a url, nor does it have the system path, convert the path since it will have been copied from another device.
# It would be more optimal if the conversion was done with an import menu, but at the moment it is controlled in run-time. # It would be more optimal if the conversion was done with an import menu, but at the moment it is controlled in run-time.
+11 -11
View File
@@ -246,15 +246,15 @@ def novedades(item):
list_canales, any_active = get_channels_list() list_canales, any_active = get_channels_list()
if config.is_xbmc(): # if config.is_xbmc():
from platformcode import side_menu # from platformcode import side_menu
if mode=='silent' and any_active and len(list_canales[item.extra]) > 0: # if mode=='silent' and any_active and len(list_canales[item.extra]) > 0:
side_menu.set_menu_settings(item) # side_menu.set_menu_settings(item)
aux_list=[] # aux_list=[]
for canal in list_canales[item.extra]: # for canal in list_canales[item.extra]:
if len(aux_list)<2: # if len(aux_list)<2:
aux_list.append(canal) # aux_list.append(canal)
list_canales[item.extra]=aux_list # list_canales[item.extra]=aux_list
if mode == 'set_cache': if mode == 'set_cache':
list_canales[item.extra] = list_canales[item.extra][2:] list_canales[item.extra] = list_canales[item.extra][2:]
@@ -290,7 +290,7 @@ def novedades(item):
# Multi Thread mode: wait for all threads to finish # Multi Thread mode: wait for all threads to finish
if multithread: if multithread:
pendent = [a for a in threads if a.isAlive()] pendent = [a for a in threads if a.is_alive()]
t = float(100) / len(pendent) t = float(100) / len(pendent)
while pendent: while pendent:
index = (len(threads) - len(pendent)) + 1 index = (len(threads) - len(pendent)) + 1
@@ -308,7 +308,7 @@ def novedades(item):
break break
time.sleep(0.5) time.sleep(0.5)
pendent = [a for a in threads if a.isAlive()] pendent = [a for a in threads if a.is_alive()]
if mode == 'normal': if mode == 'normal':
mensaje = config.get_localized_string(60522) % (len(list_newest), time.time() - start_time) mensaje = config.get_localized_string(60522) % (len(list_newest), time.time() - start_time)
progreso.update(100, mensaje) progreso.update(100, mensaje)
+17 -11
View File
@@ -21,7 +21,7 @@ from core.item import Item
from core import tmdb, scrapertools, channeltools, filetools, jsontools, servertools from core import tmdb, scrapertools, channeltools, filetools, jsontools, servertools
from channelselector import get_thumb from channelselector import get_thumb
from platformcode import logger, config, platformtools, unify from platformcode import logger, config, platformtools, unify
from core.support import typo from core.support import typo, thumb
import xbmcgui import xbmcgui
import gc import gc
@@ -697,11 +697,18 @@ def discover_list(item):
year = scrapertools.find_single_match(release, r'(\d{4})') year = scrapertools.find_single_match(release, r'(\d{4})')
if not item.cast_ or (item.cast_ and (int(year) <= int(datetime.datetime.today().year))): if not item.cast_ or (item.cast_ and (int(year) <= int(datetime.datetime.today().year))):
new_item = Item(channel='search', title=typo(title, 'bold'), infoLabels=elem, if config.get_setting('new_search'):
action='channel_search', text=title, new_item = Item(channel='globalsearch', title=typo(title, 'bold'), infoLabels=elem,
thumbnail=thumbnail, fanart=fanart, action='Search', text=title,
context='', mode=mode, contentType=mode, thumbnail=thumbnail, fanart=fanart,
release_date=year) context='', mode='search', type = mode, contentType=mode,
release_date=year, folder = False)
else:
new_item = Item(channel='search', title=typo(title, 'bold'), infoLabels=elem,
action='channel_search', text=title,
thumbnail=thumbnail, fanart=fanart,
context='', mode=mode, contentType=mode,
release_date=year)
if tvshow: if tvshow:
new_item.contentSerieName = title new_item.contentSerieName = title
@@ -718,14 +725,13 @@ def discover_list(item):
elif len(result) > 19 and item.discovery: elif len(result) > 19 and item.discovery:
item.discovery['page'] = str(int(item.discovery['page']) + 1) item.discovery['page'] = str(int(item.discovery['page']) + 1)
itemlist.append(Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70065), itemlist.append(Item(channel=item.channel, action='discover_list', title=typo(config.get_localized_string(30992), 'color kod bold'),
list_type=item.list_type, discovery=item.discovery, text_color='gold')) list_type=item.list_type, discovery=item.discovery, thumbnail=thumb()))
elif len(result) > 19: elif len(result) > 19:
next_page = str(int(item.page) + 1) next_page = str(int(item.page) + 1)
itemlist.append(Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70065), itemlist.append(Item(channel=item.channel, action='discover_list', title=typo(config.get_localized_string(30992), 'color kod bold'),
list_type=item.list_type, search_type=item.search_type, mode=item.mode, page=next_page, list_type=item.list_type, search_type=item.search_type, mode=item.mode, page=next_page, thumbnail=thumb()))
text_color='gold'))
return itemlist return itemlist
-41
View File
@@ -371,47 +371,6 @@ def settings(item):
config.open_settings() config.open_settings()
def submenu_tools(item):
logger.debug()
itemlist = list()
# Custom tools
import os
channel_custom = os.path.join(config.get_runtime_path(), 'channels', 'custom.py')
if not filetools.exists(channel_custom):
user_custom = os.path.join(config.get_data_path(), 'custom.py')
if filetools.exists(user_custom):
filetools.copy(user_custom, channel_custom, silent=True)
if filetools.exists(channel_custom):
itemlist.append(Item(channel='custom', action='mainlist', title='Custom Channel'))
itemlist.append(Item(channel=CHANNELNAME, action="check_quickfixes", folder=False,
title=config.get_localized_string(30001), plot=config.get_addon_version(with_fix=True)))
# itemlist.append(Item(channel=CHANNELNAME, action="update_quasar", folder=False,
# title=config.get_localized_string(70569)))
itemlist.append(Item(channel=CHANNELNAME, action="", title="", folder=False,
thumbnail=get_thumb("setting_0.png")))
itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60564) + ":", action="", folder=False,
text_bold=True, thumbnail=get_thumb("channels.png")))
itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60565), action="conf_tools",
folder=True, extra="lib_check_datajson", thumbnail=get_thumb("channels.png")))
if config.get_videolibrary_support():
itemlist.append(Item(channel=CHANNELNAME, action="", title="", folder=False,
thumbnail=get_thumb("setting_0.png")))
itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60566) + ":", action="", folder=False,
text_bold=True, thumbnail=get_thumb("videolibrary.png")))
itemlist.append(Item(channel=CHANNELNAME, action="restore_tools", folder=False,
thumbnail=get_thumb("videolibrary.png"),
title="- " + config.get_localized_string(60567)))
itemlist.append(Item(channel="videolibrary", action="update_videolibrary", folder=False,
thumbnail=get_thumb("videolibrary.png"),
title="- " + config.get_localized_string(60568)))
return itemlist
def check_quickfixes(item): def check_quickfixes(item):
logger.debug() logger.debug()
+1 -1
View File
@@ -358,11 +358,11 @@ try:
self.control_list.addItems(self.items) self.control_list.addItems(self.items)
self.setFocus(self.control_list) self.setFocus(self.control_list)
def onClick(self, id): def onClick(self, id):
global window_select, result
# Cancel button y [X] # Cancel button y [X]
if id == 7: if id == 7:
window_select[-1].close() window_select[-1].close()
if id == 5: if id == 5:
global window_select, result
self.result = "_no_video" self.result = "_no_video"
result = "no_video" result = "no_video"
self.close() self.close()
+21 -9
View File
@@ -408,9 +408,14 @@ def details(item):
title = item.contentType.replace("movie", config.get_localized_string(70283)).replace("tvshow", "serie") title = item.contentType.replace("movie", config.get_localized_string(70283)).replace("tvshow", "serie")
# Search by titles chosen language and / or original version and Spanish # Search by titles chosen language and / or original version and Spanish
itemlist.append(item.clone(channel='search', action="new_search", title=config.get_localized_string(70069) % (title, item.contentTitle), search_text=item.contentTitle, mode=item.contentType)) if config.get_setting('new_search'):
if item.infoLabels['originaltitle'] and item.contentTitle != item.infoLabels['originaltitle']: itemlist.append(item.clone(channel='globalsearch', action="Search", title=config.get_localized_string(70069) % (title, item.contentTitle), search_text=item.contentTitle, mode='search', type=item.contentType))
itemlist.append(item.clone(channel='search', action="search", search_text=item.infoLabels['originaltitle'], title=config.get_localized_string(70070) % item.infoLabels['originaltitle'], mode=item.contentType)) if item.infoLabels['originaltitle'] and item.contentTitle != item.infoLabels['originaltitle']:
itemlist.append(item.clone(channel='globalsearch', action="Search", search_text=item.infoLabels['originaltitle'], title=config.get_localized_string(70070) % item.infoLabels['originaltitle'], mode='search', type=item.contentType))
else:
itemlist.append(item.clone(channel='search', action="new_search", title=config.get_localized_string(70069) % (title, item.contentTitle), search_text=item.contentTitle, mode=item.contentType))
if item.infoLabels['originaltitle'] and item.contentTitle != item.infoLabels['originaltitle']:
itemlist.append(item.clone(channel='search', action="search", search_text=item.infoLabels['originaltitle'], title=config.get_localized_string(70070) % item.infoLabels['originaltitle'], mode=item.contentType))
# if langt != "es" and langt != "en" and item.infoLabels["tmdb_id"]: # if langt != "es" and langt != "en" and item.infoLabels["tmdb_id"]:
# tmdb_lang = Tmdb(id_Tmdb=item.infoLabels["tmdb_id"], tipo=item.args, idioma_searching=def_lang) # tmdb_lang = Tmdb(id_Tmdb=item.infoLabels["tmdb_id"], tipo=item.args, idioma_searching=def_lang)
@@ -2035,7 +2040,7 @@ def top_mal(item):
# data = re.sub(r"\n|\r|\t|&nbsp;", "", data) # data = re.sub(r"\n|\r|\t|&nbsp;", "", data)
# data = re.sub(r"\s{2}", " ", data) # data = re.sub(r"\s{2}", " ", data)
patron = r'<td class="title al va-t word-break"><a.*?href="([^"]+)"[^>]+><img.*?src="([^"]+).*?<div class="di-ib clearfix">.*?href.*?>([^<]+)<.*?<div class="information di-ib mt4">(.*?)<br>.*?(\d{4}|-).*?<span class="text.*?>(.*?)</span>' patron = r'<td class="title al va-t word-break">\s*<a.*?href="([^"]+)"[^>]+>\s*<img.*?src="([^"]+).*?<div class="di-ib clearfix">.*?href.*?>([^<]+)<.*?<div class="information di-ib mt4">(.*?)<br>.*?(\d{4}|-).*?<span class="text.*?>(.*?)</span>'
matches = match(item, patron=patron) matches = match(item, patron=patron)
for url, thumbnail, title, info, year, rating in matches.matches: for url, thumbnail, title, info, year, rating in matches.matches:
new_item = item.clone(action="details_mal", url=url) new_item = item.clone(action="details_mal", url=url)
@@ -2155,13 +2160,20 @@ def details_mal(item):
if item.infoLabels['fanart']: item.fanart = item.infoLabels['fanart'] if item.infoLabels['fanart']: item.fanart = item.infoLabels['fanart']
if item.infoLabels['thumbnail']: item.thumbnail = item.infoLabels['thumbnail'] if item.infoLabels['thumbnail']: item.thumbnail = item.infoLabels['thumbnail']
if not item.thumbnail: item.thumbnail = match(data, patron=r'/pics">.*?<img src="([^"]+)"').match.replace(".jpg", "l.jpg") if not item.thumbnail: item.thumbnail = match(data, patron=r'/pics">.*?<img src="([^"]+)"').match.replace(".jpg", "l.jpg")
if config.get_setting('new_search'):
itemlist.append(item.clone(action="Search", channel='globalsearch', title=config.get_localized_string(70350) % title_mal, text=title_mal, mode=item.args.replace("tv", "tvshow"), contentType=item.args.replace("tv", "tvshow"), thumbnail=thumb('search')))
if item.infoLabels["title"] and title_mal != item.infoLabels["title"]:
itemlist.append(item.clone(action="Search", channel='globalsearch', search_text=item.infoLabels["title"], title=config.get_localized_string(70351) % item.infoLabels["title"], mode=item.args.replace("tv", "tvshow"), contentType=item.args.replace("tv", "tvshow"), thumbnail=thumb('search')))
itemlist.append(item.clone(action="new_search", channel='search', title=config.get_localized_string(70350) % title_mal, search_text=title_mal, args=item.args.replace("tv", "anime"), thumbnail=thumb('search'))) if eng_title and item.contentTitle != eng_title and title_mal != eng_title:
if item.infoLabels["title"] and title_mal != item.infoLabels["title"]: itemlist.append(item.clone(action="Search", channel='globalsearch', search_text=eng_title, title=config.get_localized_string(70352) % eng_title, mode=item.args.replace("tv", "tvshow"), contentType=item.args.replace("tv", "tvshow"), thumbnail=thumb('search')))
itemlist.append(item.clone(action="new_search", channel='search', search_text=item.infoLabels["title"], title=config.get_localized_string(70351) % item.infoLabels["title"], thumbnail=thumb('search'))) else:
itemlist.append(item.clone(action="new_search", channel='search', title=config.get_localized_string(70350) % title_mal, search_text=title_mal, args=item.args.replace("tv", "anime"), thumbnail=thumb('search')))
if item.infoLabels["title"] and title_mal != item.infoLabels["title"]:
itemlist.append(item.clone(action="new_search", channel='search', search_text=item.infoLabels["title"], title=config.get_localized_string(70351) % item.infoLabels["title"], thumbnail=thumb('search')))
if eng_title and item.contentTitle != eng_title and title_mal != eng_title: if eng_title and item.contentTitle != eng_title and title_mal != eng_title:
itemlist.append(item.clone(action="new_search", channel='search', search_text=eng_title, title=config.get_localized_string(70352) % eng_title, thumbnail=thumb('search'))) itemlist.append(item.clone(action="new_search", channel='search', search_text=eng_title, title=config.get_localized_string(70352) % eng_title, thumbnail=thumb('search')))
if item_tmdb.args == "tv" and ob_tmdb.result: if item_tmdb.args == "tv" and ob_tmdb.result:
itemlist.append(item.clone(action="info_seasons", title=config.get_localized_string(70067) % item.infoLabels["number_of_seasons"], thumbnail=thumb('info'))) itemlist.append(item.clone(action="info_seasons", title=config.get_localized_string(70067) % item.infoLabels["number_of_seasons"], thumbnail=thumb('info')))
+14 -9
View File
@@ -64,15 +64,17 @@ def list_tvshows(item):
logger.debug() logger.debug()
itemlist = [] itemlist = []
lista = [] lista = []
tvshows_path = [] # tvshows_path = []
# We get all the tvshow.nfo from the SERIES video library recursively # # We get all the tvshow.nfo from the SERIES video library recursively
for root, folders, files in filetools.walk(videolibrarytools.TVSHOWS_PATH): # for root, folders, files in filetools.walk(videolibrarytools.TVSHOWS_PATH):
for f in folders: # for f in folders:
tvshows_path += [filetools.join(root, f, "tvshow.nfo")] # tvshows_path += [filetools.join(root, f, "tvshow.nfo")]
root = videolibrarytools.TVSHOWS_PATH
with futures.ThreadPoolExecutor() as executor: with futures.ThreadPoolExecutor() as executor:
for tvshow_path in tvshows_path: for folder in filetools.listdir(root):
tvshow_path = filetools.join(root, folder, "tvshow.nfo")
item_tvshow, value = executor.submit(get_results, tvshow_path, root, 'tvshow').result() item_tvshow, value = executor.submit(get_results, tvshow_path, root, 'tvshow').result()
# verify the existence of the channels # verify the existence of the channels
if item_tvshow.library_urls and len(item_tvshow.library_urls) > 0: if item_tvshow.library_urls and len(item_tvshow.library_urls) > 0:
@@ -394,7 +396,10 @@ def findvideos(item):
logger.debug("Unable to search for videos due to lack of parameters") logger.debug("Unable to search for videos due to lack of parameters")
return [] return []
content_title = str(item.contentSeason) + 'x' + (str(item.contentEpisodeNumber) if item.contentEpisodeNumber > 9 else '0' + str(item.contentEpisodeNumber)) if item.contentEpisodeNumber:
content_title = str(item.contentSeason) + 'x' + (str(item.contentEpisodeNumber) if item.contentEpisodeNumber > 9 else '0' + str(item.contentEpisodeNumber))
else:
content_title = item.contentTitle.strip().lower()
if item.contentType == 'movie': if item.contentType == 'movie':
item.strm_path = filetools.join(videolibrarytools.MOVIES_PATH, item.strm_path) item.strm_path = filetools.join(videolibrarytools.MOVIES_PATH, item.strm_path)
path_dir = filetools.dirname(item.strm_path) path_dir = filetools.dirname(item.strm_path)
@@ -1127,8 +1132,8 @@ def add_download_items(item, itemlist):
thumbnail=thumb('downloads'), thumbnail=thumb('downloads'),
parent=item.tourl()) parent=item.tourl())
if item.action == 'findvideos': if item.action == 'findvideos':
if item.contentType == 'episode': if item.contentType != 'movie':
downloadItem.title = typo(config.get_localized_string(60356), "color kod bold") downloadItem.title = '{} {}'.format(typo(config.get_localized_string(60356), "color kod bold"), item.title)
else: # film else: # film
downloadItem.title = typo(config.get_localized_string(60354), "color kod bold") downloadItem.title = typo(config.get_localized_string(60354), "color kod bold")
downloadItem.downloadItemlist = [i.tourl() for i in itemlist] downloadItem.downloadItemlist = [i.tourl() for i in itemlist]
-1
View File
@@ -57,7 +57,6 @@
<td class="col-xs-9" colspan="3"> <td class="col-xs-9" colspan="3">
{%- if test_case.stdout %}<p style="white-space: pre-line;">{{ test_case.stdout|e }}</p>{% endif %} {%- if test_case.stdout %}<p style="white-space: pre-line;">{{ test_case.stdout|e }}</p>{% endif %}
{%- if test_case.err %}<p style="color:maroon;">{{ test_case.err[0].__name__ }}: {{ test_case.err[1] }}</p>{% endif %} {%- if test_case.err %}<p style="color:maroon;">{{ test_case.err[0].__name__ }}: {{ test_case.err[1] }}</p>{% endif %}
{%- if test_case.err %}<p style="color:maroon;">{{ test_case.test_exception_info }}</p>{% endif %}
</td> </td>
</tr> </tr>
{%- endif %} {%- endif %}
+49 -32
View File
@@ -6,7 +6,7 @@
# export PYTHONPATH=/home/user/.kodi/addons/plugin.video.kod # export PYTHONPATH=/home/user/.kodi/addons/plugin.video.kod
# export KOD_TST_CH=channel # export KOD_TST_CH=channel
# python tests/test_generic.py # python tests/test_generic.py
import html
import os import os
import sys import sys
import unittest import unittest
@@ -141,23 +141,33 @@ chNumRis = {
servers = [] servers = []
channels = [] channels = []
channel_list = channelselector.filterchannels("all") if 'KOD_TST_CH' not in os.environ else [Item(channel=os.environ['KOD_TST_CH'], action="mainlist")] # channel_list = channelselector.filterchannels("all") if 'KOD_TST_CH' not in os.environ else [Item(channel=os.environ['KOD_TST_CH'], action="mainlist")]
logger.info(channel_list) channel_list = [Item(channel='tantifilm', action="mainlist")]
logger.info([c.channel for c in channel_list])
ret = [] ret = []
logger.record = True logger.record = True
for chItem in channel_list: for chItem in channel_list:
try: ch = chItem.channel
ch = chItem.channel if ch not in chBlackList:
if ch not in chBlackList: hasChannelConfig = False
module = __import__('channels.%s' % ch, fromlist=["channels.%s" % ch]) mainlist = []
hasChannelConfig = False module = None
mainlist = module.mainlist(Item()) error = None
menuItemlist = {} menuItemlist = {}
logMenu = {} serversFound = {}
serversFound = {} logMenu = {}
for it in mainlist: try:
module = __import__('channels.%s' % ch, fromlist=["channels.%s" % ch])
mainlist = module.mainlist(Item())
except:
import traceback
logger.error(traceback.format_exc())
error = logger.recordedLog
logger.recordedLog = ''
for it in mainlist:
try:
print('preparing ' + ch + ' -> ' + it.title) print('preparing ' + ch + ' -> ' + it.title)
if it.action == 'channel_config': if it.action == 'channel_config':
@@ -165,6 +175,8 @@ for chItem in channel_list:
continue continue
if it.action == 'search': # channel-specific if it.action == 'search': # channel-specific
continue continue
menuItemlist[it.title] = []
itemlist = getattr(module, it.action)(it) itemlist = getattr(module, it.action)(it)
menuItemlist[it.title] = itemlist menuItemlist[it.title] = itemlist
logMenu[it.title] = logger.recordedLog logMenu[it.title] = logger.recordedLog
@@ -180,19 +192,24 @@ for chItem in channel_list:
if serversFound[it.title]: if serversFound[it.title]:
if hasattr(module, 'play'): if hasattr(module, 'play'):
serversFound[it.title] = [getattr(module, 'play')(resIt)[0] for srv in serversFound[it.title]] tmp = []
for srv in serversFound[it.title]:
itPlay = getattr(module, 'play')(srv)
if itPlay:
tmp.append(itPlay[0])
serversFound[it.title] = tmp
servers.extend( servers.extend(
{'name': srv.server.lower(), 'server': srv} for srv in serversFound[it.title] if srv.server) {'name': srv.server.lower(), 'server': srv} for srv in serversFound[it.title] if srv.server)
break break
except:
import traceback
logger.error(traceback.format_exc())
logMenu[it.title] = logger.recordedLog
logger.recordedLog = ''
channels.append( channels.append(
{'ch': ch, 'hasChannelConfig': hasChannelConfig, 'mainlist': mainlist, 'menuItemlist': menuItemlist, {'ch': ch, 'hasChannelConfig': hasChannelConfig, 'mainlist': mainlist, 'menuItemlist': menuItemlist,
'serversFound': serversFound, 'module': module, 'logMenu': logMenu}) 'serversFound': serversFound, 'module': module, 'logMenu': logMenu, 'error': error})
except:
import traceback
logger.error(traceback.format_exc())
print(logger.recordedLog)
logger.recordedLog = ''
logger.record = False logger.record = False
@@ -211,6 +228,7 @@ for s in servers:
@parameterized.parameterized_class(channels) @parameterized.parameterized_class(channels)
class GenericChannelTest(unittest.TestCase): class GenericChannelTest(unittest.TestCase):
def test_mainlist(self): def test_mainlist(self):
self.assertIsNone(self.error, self.error)
self.assertTrue(self.mainlist, 'channel ' + self.ch + ' has no mainlist') self.assertTrue(self.mainlist, 'channel ' + self.ch + ' has no mainlist')
self.assertTrue(self.hasChannelConfig, 'channel ' + self.ch + ' has no channel config') self.assertTrue(self.hasChannelConfig, 'channel ' + self.ch + ' has no channel config')
@@ -255,25 +273,22 @@ class GenericChannelMenuItemTest(unittest.TestCase):
self.assertEqual(chNumRis[self.ch][content], risNum, self.assertEqual(chNumRis[self.ch][content], risNum,
'channel ' + self.ch + ' -> ' + self.title + ' returned wrong number of results<br>' 'channel ' + self.ch + ' -> ' + self.title + ' returned wrong number of results<br>'
+ str(risNum) + ' but should be ' + str(chNumRis[self.ch][content]) + '<br>' + + str(risNum) + ' but should be ' + str(chNumRis[self.ch][content]) + '<br>' +
'<br>'.join([i.title for i in self.itemlist if not i.nextPage])) '<br>'.join([html.escape(i.title) for i in self.itemlist if not i.nextPage]))
break break
for resIt in self.itemlist: for resIt in self.itemlist:
logger.info(resIt.title + ' -> ' + resIt.url) logger.info(resIt.title + ' -> ' + resIt.url)
self.assertLess(len(resIt.fulltitle), 110, self.assertLess(len(resIt.fulltitle), 110,
'channel ' + self.ch + ' -> ' + self.title + ' might contain wrong titles<br>' + resIt.fulltitle) 'channel ' + self.ch + ' -> ' + self.title + ' might contain wrong titles:<br>' + html.escape(resIt.fulltitle))
if resIt.url: if resIt.url:
self.assertIsInstance(resIt.url, str, self.assertIsInstance(resIt.url, str,
'channel ' + self.ch + ' -> ' + self.title + ' -> ' + resIt.title + ' contain non-string url') 'channel ' + self.ch + ' -> ' + self.title + ' -> ' + html.escape(resIt.title) + ' contain non-string url')
self.assertIsNotNone(re.match(validUrlRegex, resIt.url), self.assertIsNotNone(re.match(validUrlRegex, resIt.url),
'channel ' + self.ch + ' -> ' + self.title + ' -> ' + resIt.title + ' might contain wrong url<br>' + resIt.url) 'channel ' + self.ch + ' -> ' + self.title + ' -> ' + html.escape(resIt.title) + ' might contain wrong url<br>' + html.escape(resIt.url))
if 'year' in resIt.infoLabels and resIt.infoLabels['year']: if 'year' in resIt.infoLabels and resIt.infoLabels['year']:
msgYear = 'channel ' + self.ch + ' -> ' + self.title + ' might contain wrong infolabels year<br>' + str( msgYear = 'channel ' + self.ch + ' -> ' + self.title + ' might contain wrong infolabels year:<br>' + html.escape(str(resIt.infoLabels['year']))
resIt.infoLabels['year']) self.assert_(type(resIt.infoLabels['year']) is int or resIt.infoLabels['year'].isdigit(), msgYear)
self.assert_(type(resIt.infoLabels['year']) is int or resIt.infoLabels['year'].isdigit(), self.assert_(1900 < int(resIt.infoLabels['year']) < 2100, msgYear)
msgYear)
self.assert_(int(resIt.infoLabels['year']) > 1900 and int(resIt.infoLabels['year']) < 2100,
msgYear)
if resIt.title == typo(config.get_localized_string(30992), 'color kod bold'): # next page if resIt.title == typo(config.get_localized_string(30992), 'color kod bold'): # next page
nextPageItemlist = getattr(self.module, resIt.action)(resIt) nextPageItemlist = getattr(self.module, resIt.action)(resIt)
@@ -326,5 +341,7 @@ if __name__ == '__main__':
if 'KOD_TST_CH' not in os.environ: if 'KOD_TST_CH' not in os.environ:
unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(report_name='report', add_timestamp=False, combine_reports=True, unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(report_name='report', add_timestamp=False, combine_reports=True,
report_title='KoD Test Suite', template=os.path.join(config.get_runtime_path(), 'tests', 'template.html')), exit=False) report_title='KoD Test Suite', template=os.path.join(config.get_runtime_path(), 'tests', 'template.html')), exit=False)
import webbrowser
webbrowser.open(os.path.join(config.get_runtime_path(), 'reports', 'report.html'))
else: else:
unittest.main() unittest.main()