This commit is contained in:
Alhaziel01
2021-09-14 08:27:59 +02:00
parent 10ee3d0425
commit 938b8e6355
30 changed files with 1193 additions and 4117 deletions
+2 -1
View File
@@ -130,6 +130,7 @@ def registerOrLogin():
@support.scrape
def peliculas(item):
json = {}
# debug=True
if item.contentType == 'undefined':
# tmdbEnabled = False
@@ -149,7 +150,7 @@ def peliculas(item):
else:
json = support.httptools.downloadpage(item.url, headers=headers, cloudscraper=True).json
data = "\n".join(json['data'])
patron = r'wrapFilm">\s*<a href="(?P<url>[^"]+)">\s*<span class="year">(?P<year>[0-9]{4})</span>\s*<span[^>]+>(?P<rating>[^<]+)</span>\s*<span class="qual">(?P<quality>[^<]+).*?<img src="(?P<thumbnail>[^"]+)(?:[^>]+>){1,2}\s*<h3>(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA-]+))?'
patron = r'wrapFilm">\s*<a href="(?P<url>[^"]+)">\s*<span class="year">(?P<year>[0-9]{4})</span>\s*<span[^>]+>(?P<rating>[^<]+)</span>\s*<span class="qual">(?P<quality>[^<]+)(?:[^>]+>){2}\s*<img src="(?P<thumbnail>[^"]+)(?:[^>]+>){1,6}\s*<h3>(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA-]+))?'
# paginazione
logger.debug('JSON FIND',jsontools.load(json))
+1 -1
View File
@@ -5,7 +5,7 @@
"language": ["ita", "sub-ita"],
"thumbnail": "animealtadefinizione.png",
"banner": "animealtadefinizione.png",
"categories": ["anime", "sub-ita"],
"categories": ["anime", "sub"],
"default_off": ["include_in_newest"],
"settings": [
{
+1 -1
View File
@@ -5,7 +5,7 @@
"language": ["ita", "sub-ita"],
"thumbnail": "animeuniverse.png",
"banner": "animeuniverse.png",
"categories": ["anime", "sub-ita"],
"categories": ["anime", "sub"],
"default_off": ["include_in_newest"],
"settings": [
{
+6 -3
View File
@@ -76,7 +76,8 @@ def newest(categoria):
def search(item, text):
logger.info("search", text)
logger.info("search", item, text)
if item.contentType == 'tvshow': item.url = host + '/serietv'
else: item.url = host
try:
@@ -160,19 +161,21 @@ def episodios(item):
return locals()
data = support.match(item.url, headers=headers).data
itemlist = listed(item, data)
# itemlist = listed(item, data)
itemlist = []
if not item.itemlist:
itemlist.extend(folder(item, data) if 'TUTTE LE' in data or 'TUTTA LA' in data else [])
itemDict = {'ITA':{}, 'Sub-ITA':{}}
seasons = []
# support.dbg()
for it in itemlist:
if it.contentSeason and it.contentSeason not in seasons:
seasons.append(it.contentSeason)
itemDict['ITA'][it.contentSeason] = []
itemDict['Sub-ITA'][it.contentSeason] = []
if it.contentSeason:
if not it.contentLanguage: it.contentLanguage = 'ITA'
itemDict[it.contentLanguage][it.contentSeason].append(it)
+1 -1
View File
@@ -2,7 +2,7 @@
"id": "guardaserieclick",
"name": "GuardaSerie.click",
"active": true,
"language": ["ita", "sub"],
"language": ["ita", "sub-ita"],
"thumbnail": "guardaserieclick.png",
"bannermenu": "guardaserieclick.png",
"categories": ["tvshow", "anime"],
+1 -1
View File
@@ -258,7 +258,7 @@ def getUrl(url):
def addinfo(items, item):
def itInfo(key, item):
logger.debug(jsontools.dump(key))
# logger.debug(jsontools.dump(key))
item.forcethumb = True
if key.get('titolo', ''):
key = requests.get(getUrl(key['path_id'])).json()['program_info']
+7 -7
View File
@@ -210,14 +210,14 @@ def findvideos(item):
token = calculateToken()
# def videourls(res):
# newurl = '{}/{}{}'.format(url, res, token)
# if requests.head(newurl, headers=headers).status_code == 200:
# video_urls.append({'type':'m3u8', 'res':res, 'url':newurl})
def videourls(res):
newurl = '{}/{}{}'.format(url, res, token)
if requests.head(newurl, headers=headers).status_code == 200:
video_urls.append({'type':'m3u8', 'res':res, 'url':newurl})
# with futures.ThreadPoolExecutor() as executor:
# for res in ['480p', '720p', '1080p']:
# executor.submit(videourls, res)
with futures.ThreadPoolExecutor() as executor:
for res in ['480p', '720p', '1080p']:
executor.submit(videourls, res)
if not video_urls: video_urls = [{'type':'m3u8', 'url':url + token}]
itemlist = [item.clone(title = channeltools.get_channel_parameters(item.channel)['title'], server='directo', video_urls=video_urls, thumbnail=channeltools.get_channel_parameters(item.channel)["thumbnail"], forcethumb=True)]
+1 -1
View File
@@ -2,7 +2,7 @@
"id": "vvvvid",
"name": "VVVVID",
"active": true,
"language": ["ita","sub"],
"language": ["ita","sub-ita"],
"thumbnail": "vvvvid.png",
"banner": "vvvvid.png",
"categories": ["anime","tvshow","movie","sub"],
+1 -1
View File
@@ -26,7 +26,7 @@ def getmainlist(view="thumb_"):
if addon.getSetting('enable_search_menu') == "true":
itemlist.append(Item(title=config.get_localized_string(30103), channel="search", path='special', action="mainlist",
thumbnail=thumb("search"), category=config.get_localized_string(30119), viewmode="list",
context = [{"title": config.get_localized_string(60412), "action": "setting_channel_new", "channel": "search"},
context = [{"title": config.get_localized_string(60412), "action": "channels_selections", "channel": "search"},
{"title": config.get_localized_string(70286), "channel": "shortcuts", "action": "SettingOnPosition", "category":5 , "setting":1}]))
if addon.getSetting('enable_onair_menu') == "true":
+6 -3
View File
@@ -717,9 +717,12 @@ def sort_servers(servers_list):
sorted_list.append(element)
# We order according to priority
if priority == 0: sorted_list.sort(key=lambda element: (element['index_language'], -element['index_quality'] if inverted else element['index_quality'] , element['videoitem'].server))
elif priority == 1: sorted_list.sort(key=lambda element: (element['index_language'], element['index_server'], -element['index_quality'] if inverted else element['index_quality'])) # Servers and Qualities
elif priority == 2: sorted_list.sort(key=lambda element: (element['index_language'], -element['index_quality'] if inverted else element['index_quality'], element['index_server'])) # Qualities and Servers
if priority == 0:
sorted_list.sort(key=lambda element: (element['index_language'], -element['index_quality'] if inverted else element['index_quality'] , element['videoitem'].server))
elif priority == 1:
sorted_list.sort(key=lambda element: (element['index_language'], element['index_server'], -element['index_quality'] if inverted else element['index_quality'])) # Servers and Qualities
elif priority == 2:
sorted_list.sort(key=lambda element: (element['index_language'], -element['index_quality'] if inverted else element['index_quality'], element['index_server'])) # Qualities and Servers
return [v['videoitem'] for v in sorted_list if v]
+66 -64
View File
@@ -106,7 +106,6 @@ class scrape:
self.function = self.func.__name__ if not 'actLike' in self.args else self.args['actLike']
# self.args
self.item = self.args['item']
self.action = self.args.get('action', 'findvideos')
self.search = self.args.get('search', '')
self.lang = self.args.get('deflang', '')
@@ -143,40 +142,40 @@ class scrape:
self.downloadEnabled = False
self.seasonPagination = False
item = self.args['item']
# variable
self.pag = self.item.page if self.item.page else 1
self.pag = item.page if item.page else 1
self.itemlist = []
self.matches = []
self.seasons = []
self.itemParams = Item()
self.known_keys = ['url', 'title', 'title2', 'season', 'episode', 'episode2', 'thumb', 'quality', 'year', 'plot', 'duration', 'genere', 'rating', 'type', 'lang', 'size', 'seed']
# run scrape
self._scrape()
self._scrape(item)
return self.itemlist
def _scrape(self):
def _scrape(self, item):
if self.item.itemlist:
if item.itemlist:
scrapingTime = time()
self.itemlist = itemlistdb()
self.seasons = self.item.allSeasons
self.seasons = item.allSeasons
else:
for n in range(2):
logger.debug('PATRON= ', self.patron)
if not self.data:
page = httptools.downloadpage(self.item.url, headers=self.headers, ignore_response_code=True)
self.item.url = page.url # might be a redirect
page = httptools.downloadpage(item.url, headers=self.headers, ignore_response_code=True)
item.url = page.url # might be a redirect
self.data = page.data
self.data = html_uniform(self.data)
scrapingTime = time()
if self.patronBlock:
if self.debugBlock: regexDbg(self.item, self.patronBlock, self.headers, self.data)
if self.debugBlock: regexDbg(item, self.patronBlock, self.headers, self.data)
blocks = scrapertools.find_multiple_matches_groups(self.data, self.patronBlock)
for bl in blocks:self._scrapeBlock(bl)
for bl in blocks:self._scrapeBlock(item, bl)
elif self.patron:
self._scrapeBlock(self.data)
self._scrapeBlock(item, self.data)
if 'itemlistHook' in self.args:
try:
@@ -190,9 +189,9 @@ class scrape:
ch = self.func.__module__.split('.')[-1]
try:
host = config.get_channel_url(self.func.__globals__['findhost'], ch, True)
parse = list(urlparse.urlparse(self.item.url))
parse = list(urlparse.urlparse(item.url))
parse[1] = scrapertools.get_domain_from_url(host)
self.item.url = urlparse.urlunparse(parse)
item.url = urlparse.urlunparse(parse)
except:
raise logger.ChannelScraperException
self.data = None
@@ -203,16 +202,16 @@ class scrape:
if not self.data:
from platformcode.logger import WebErrorException
raise WebErrorException(urlparse.urlparse(self.item.url)[1], self.item.channel)
raise WebErrorException(urlparse.urlparse(item.url)[1], item.channel)
if self.group and self.item.grouped or self.args.get('groupExplode'):
if self.group and item.grouped or self.args.get('groupExplode'):
import copy
nextargs = copy.copy(self.args)
@scrape
def newFunc():
return nextargs
nextargs['item'] = nextPage(self.itemlist, self.item, self.function, data=self.data, patron=self.patronNext, patron_total_pages=self.patronTotalPages)
nextargs['item'] = nextPage(self.itemlist, item, self.function, data=self.data, patron=self.patronNext, patron_total_pages=self.patronTotalPages)
nextargs['group'] = False
if nextargs['item']:
nextargs['groupExplode'] = True
@@ -226,7 +225,7 @@ class scrape:
if not self.group and not self.args.get('groupExplode') and ((self.pagination and len(self.matches) <= self.pag * self.pagination) or not self.pagination): # next page with pagination
if self.patronNext and inspect.stack()[1][3] not in ['newest'] and len(inspect.stack()) > 2 and inspect.stack()[2][3] not in ['get_channel_results']:
nextPage(self.itemlist, self.item, self.function, data=self.data, patron=self.patronNext, patron_total_pages=self.patronTotalPages)
nextPage(self.itemlist, item, self.function, data=self.data, patron=self.patronNext, patron_total_pages=self.patronTotalPages)
if self.numerationEnabled and inspect.stack()[1][3] not in ['find_episodes']:
from platformcode import autorenumber
@@ -242,19 +241,19 @@ class scrape:
if inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes']:
if len(self.seasons) > 1 and self.seasonPagination:
self.itemlist = season_pagination(self.itemlist, self.item, self.seasons, self.function)
self.itemlist = season_pagination(self.itemlist, item, self.seasons, self.function)
elif self.pagination:
self.itemlist = pagination(self.itemlist, self.item, self.function)
self.itemlist = pagination(self.itemlist, item, self.function)
if self.action != 'play' and 'patronMenu' not in self.args and 'patronGenreMenu' not in self.args and self.tmdbEnabled and inspect.stack()[1][3] not in ['add_tvshow'] and self.function not in ['episodios', 'mainlist'] or (self.function in ['episodios'] and config.get_setting('episode_info')): # and function != 'episodios' and item.contentType in ['movie', 'tvshow', 'episode', 'undefined']
tmdb.set_infoLabels_itemlist(self.itemlist, seekTmdb=True)
if inspect.stack()[1][3] not in ['find_episodes', 'add_tvshow']:
if self.videlibraryEnabled and (self.item.infoLabels["title"] or self.item.fulltitle):
if self.videlibraryEnabled and (item.infoLabels["title"] or item.fulltitle):
# item.fulltitle = item.infoLabels["title"]
videolibrary(self.itemlist, self.item, function=self.function)
videolibrary(self.itemlist, item, function=self.function)
if self.downloadEnabled and self.function == 'episodios' or self.function == 'findvideos':
download(self.itemlist, self.item, function=self.function)
download(self.itemlist, item, function=self.function)
if 'patronGenreMenu' in self.args and self.itemlist:
self.itemlist = thumb(self.itemlist, mode='genre')
@@ -273,69 +272,69 @@ class scrape:
trakt_tools.trakt_check(self.itemlist)
logger.debug('scraping time: ', time()-scrapingTime)
def _scrapeBlock(self, block):
def _scrapeBlock(self, item, block):
itemlist = []
contents = []
if type(block) == dict:
if 'season' in block and block['season']: self.item.season = block['season']
if 'lang' in block: self.item.contentLanguage = scrapeLang(block, self.item.contentLanguage)
if 'quality' in block and block['quality']: self.item.quality = block['quality'].strip()
if 'season' in block and block['season']: item.season = block['season']
if 'lang' in block: item.contentLanguage = scrapeLang(block, item.contentLanguage)
if 'quality' in block and block['quality']: item.quality = block['quality'].strip()
block = block['block']
if self.debug:
regexDbg(self.item, self.patron, self.headers, block)
regexDbg(item, self.patron, self.headers, block)
matches = scrapertools.find_multiple_matches_groups(block, self.patron)
logger.debug('MATCHES =', matches)
for match in matches:
self.scraped = {}
self.itemParams = Item()
for k, v in match.items():
if v and k in ['url', 'thumb'] and 'http' not in v:
domain = ''
if v.startswith('//'):
domain = scrapertools.find_single_match(self.item.url, 'https?:')
domain = scrapertools.find_single_match(item.url, 'https?:')
elif v.startswith('/'):
domain = scrapertools.find_single_match(self.item.url, 'https?://[a-z0-9.-]+')
domain = scrapertools.find_single_match(item.url, 'https?://[a-z0-9.-]+')
v = domain + v
self.itemParams.__setattr__(k, v.strip() if type(v) == str else v)
self.itemParams.title = cleantitle(self.itemParams.title)
if self.group and self.itemParams.title in contents and not self.item.grouped: # same title and grouping enabled
if self.group and self.itemParams.title in contents and not item.grouped: # same title and grouping enabled
continue
if self.item.grouped and self.itemParams.title != self.item.fulltitle: # inside a group different tvshow should not be included
if item.grouped and self.itemParams.title != item.fulltitle: # inside a group different tvshow should not be included
continue
contents.append(self.itemParams.title)
self.itemParams.title2 = cleantitle(self.itemParams.title2) if not self.group or self.item.grouped else ''
self.itemParams.title2 = cleantitle(self.itemParams.title2) if not self.group or item.grouped else ''
self.itemParams.quality = self.itemParams.quality
self.itemParams.plot = cleantitle(self.itemParams.plot)
self.itemParams.language = scrapeLang(self.scraped, self.lang)
self.itemParams.language = scrapeLang(self.itemParams, self.lang)
self.set_infolabels()
self.set_infolabels(item)
if self.sceneTitle: self.set_sceneTitle()
if not self.group or self.item.grouped:
self.set_episodes()
if not self.group or item.grouped:
self.set_episodes(item)
if self.itemParams.episode2: self.itemParams.second_episode = scrapertools.find_single_match(self.itemParams.episode2, r'(\d+)').split('x')
if self.itemParams.season: self.itemParams.infoLabels['season'] = int(self.itemParams.season)
if self.itemParams.episode: self.itemParams.infoLabels['episode'] = int(self.itemParams.episode)
it = self.set_item(match)
it = self.set_item(item, match)
if it: itemlist.append(it)
self.itemlist.extend(itemlist)
self.matches.extend(matches)
def set_infolabels(self):
if self.item.infoLabels["title"] == self.itemParams.title:
infolabels = self.item.infoLabels
def set_infolabels(self, item):
if item.infoLabels["title"] == self.itemParams.title:
infolabels = item.infoLabels
else:
if self.function == 'episodios':
infolabels = self.item.infoLabels
infolabels = item.infoLabels
else:
infolabels = {}
if self.itemParams.year:
@@ -377,31 +376,31 @@ class scrape:
self.itemParams.infoLabels['year'] = parsedTitle.get('year', '')
if parsedTitle.get('episode') and parsedTitle.get('season'):
if type(parsedTitle.get('season')) == list:
self.itemParams.season = parsedTitle.get('season')[0]
self.itemParams.season = str(parsedTitle.get('season')[0])
elif parsedTitle.get('season'):
self.itemParams.season = parsedTitle.get('season')
self.itemParams.season = str(parsedTitle.get('season'))
if type(parsedTitle.get('episode')) == list:
self.itemParams.episode = parsedTitle.get('episode')[0]
self.itemParams.second_episode = parsedTitle.get('episode')[1:]
self.itemParams.episode = str(parsedTitle.get('episode')[0])
self.itemParams.second_episode = str(parsedTitle.get('episode')[1:])
else:
self.itemParams.infoLabels['episode'] = parsedTitle.get('episode')
elif parsedTitle.get('season') and type(parsedTitle.get('season')) == list:
self.itemParams.extraInfo = '{}: {}-{}'.format(config.get_localized_string(30140), parsedTitle.get('season')[0], parsedTitle.get('season')[-1])
elif parsedTitle.get('season'):
self.itemParams.season = parsedTitle.get('season')
self.itemParams.season = str(parsedTitle.get('season'))
if parsedTitle.get('episode_title'):
self.itemParams.extraInfo += parsedTitle.get('episode_title')
except:
import traceback
logger.error(traceback.format_exc())
def set_episodes(self):
def set_episodes(self, item):
ep = unifyEp(self.itemParams.episode) if self.itemParams.episode else ''
se = self.itemParams.season if self.itemParams.season.isdigit() else ''
if ep and se:
self.itemParams.season = int(se)
self.itemParams.season = se
if 'x' in ep:
ep_list = ep.split('x')
self.itemParams.episode = ep_list[0]
@@ -409,12 +408,12 @@ class scrape:
else:
self.itemParams.episode = ep
elif self.item.season:
self.itemParams.season = int(self.item.season)
elif item.season:
self.itemParams.season = item.season
if ep: self.itemParams.episode = int(scrapertools.find_single_match(self.itemParams.episode, r'(\d+)'))
elif self.item.contentType == 'tvshow' and (self.itemParams.episode == '' and self.itemParams.season == '' and self.itemParams.season == ''):
self.item.news = 'season_completed'
elif item.contentType == 'tvshow' and (self.itemParams.episode == '' and self.itemParams.season == '' and self.itemParams.season == ''):
item.news = 'season_completed'
else:
try:
@@ -430,7 +429,7 @@ class scrape:
logger.debug('invalid episode: ' + self.itemParams.episode)
pass
def set_item(self, match):
def set_item(self, item, match):
AC = ''
CT = ''
if self.typeContentDict:
@@ -438,7 +437,7 @@ class scrape:
if str(self.itemParams.type).lower() in variants:
CT = name
break
else: CT = self.item.contentType
else: CT = item.contentType
if self.typeActionDict:
for name, variants in self.typeActionDict.items():
if str(self.itemParams.type).lower() in variants:
@@ -447,7 +446,7 @@ class scrape:
else: AC = self.action
if (not self.itemParams.title or self.itemParams.title not in self.blacklist) and (self.search.lower() in self.itemParams.title.lower()):
it = self.item.clone(title=self.itemParams.title,
it = item.clone(title=self.itemParams.title,
fulltitle=self.itemParams.title,
show=self.itemParams.title,
infoLabels=self.itemParams.infoLabels,
@@ -464,16 +463,16 @@ class scrape:
if self.function == 'episodios': it.fulltitle = it.show = self.itemParams.title
if self.itemParams.quality: it.quality = self.itemParams.quality
if self.itemParams.language: it.contentLanguage = self.itemParams.language
if self.item.prevthumb: it.thumbnail = self.item.prevthumb
if item.prevthumb: it.thumbnail = item.prevthumb
elif self.itemParams.thumb: it.thumbnail = self.itemParams.thumb
it.contentType = 'episode' if self.function == 'episodios' else CT if CT else self.item.contentType
it.contentType = 'episode' if self.function == 'episodios' else CT if CT else item.contentType
if it.contentType not in ['movie'] and self.function != 'episodios' or it.contentType in ['undefined']: it.contentSerieName = self.itemParams.title
if self.function == 'peliculas': it.contentTitle= self.itemParams.title
it.contentSeason= self.itemParams.infoLabels.get('season', ''),
it.contentEpisodeNumber= self.itemParams.infoLabels.get('episode', ''),
if self.itemParams.title2: it.title2 = self.itemParams.title2
if self.itemParams.episode and self.group and not self.item.grouped:
if self.itemParams.episode and self.group and not item.grouped:
it.action = self.function
elif AC:
it.action = AC
@@ -481,7 +480,7 @@ class scrape:
it.action=self.action
if it.action == 'findvideos':
it.window = True if self.item.window_type == 0 or (config.get_setting("window_type") == 0) else False
it.window = True if item.window_type == 0 or (config.get_setting("window_type") == 0) else False
if it.window: it.folder = False
for lg in list(set(match.keys()).difference(self.known_keys)):
@@ -531,10 +530,11 @@ def scrapeLang(scraped, lang):
# altrimenti dopo un sub-ita mette tutti quelli a seguire in sub-ita
# e credo sia utile per filtertools
language = ''
lang = scraped.get('lang') if type(scraped) == dict else scraped.lang
if scraped.get('lang'):
if 'ita' in scraped['lang'].lower(): language = 'ITA'
if 'sub' in scraped['lang'].lower(): language = 'Sub-' + language
if lang:
if 'ita' in lang.lower(): language = 'ITA'
if 'sub' in lang.lower(): language = 'Sub-' + language
if not language: language = lang
# if language: longtitle += typo(language, '_ [] color kod')
@@ -1005,6 +1005,7 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
videoitem.server = videoitem.server.lower()
if videoitem.video_urls or srv_param.get('active', False):
logger.debug(item)
quality = videoitem.quality if videoitem.quality else item.quality if item.quality else ''
# videoitem = item.clone(url=videoitem.url, serverName=videoitem.serverName, server=videoitem.server, action='play')
videoitem.contentLanguage = videoitem.contentLanguage if videoitem.contentLanguage else item.contentLanguage if item.contentLanguage else 'ITA'
@@ -1022,6 +1023,7 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
videoitem.action = "play"
videoitem.videolibrary_id = item.videolibrary_id
videoitem.from_library = item.from_library
videoitem.fanart = item.fanart if item.contentType == 'movie' else item.thumbnail
return videoitem
# non threaded for webpdb
+2 -2
View File
@@ -1082,7 +1082,7 @@ class Tmdb(object):
if total_results > 0 or self.cast:
if self.cast:
results = result[self.cast]
results = result['self.cast']
total_results = len(results)
else:
results = result["results"]
@@ -1685,7 +1685,7 @@ class Tmdb(object):
elif k == 'vote_count':
ret_infoLabels['votes'] = v
elif k == 'poster_path':
elif k in ['poster_path', 'profile_path']:
ret_infoLabels['thumbnail'] = 'https://image.tmdb.org/t/p/original' + v
elif k == 'backdrop_path':
+2 -2
View File
@@ -120,9 +120,9 @@ def token_trakt(item):
itemlist = []
if token:
itemlist.append(item.clone(config.get_localized_string(60256), action=""))
itemlist.append(item.clone(title=config.get_localized_string(60256), action=""))
else:
itemlist.append(item.clone(config.get_localized_string(60260), action=""))
itemlist.append(item.clone(title=config.get_localized_string(60260), action=""))
return itemlist
+5
View File
@@ -305,6 +305,11 @@ def get_localized_category(categ):
return categories[categ] if categ in categories else categ
def get_localized_language(lang):
languages = {'ita': 'ITA', 'sub-ita': 'Sub-ITA'}
return languages[lang] if lang in languages else lang
def get_videolibrary_config_path():
value = get_setting("videolibrarypath")
+13 -6
View File
@@ -7,7 +7,7 @@ from platformcode.xbmc_videolibrary import execute_sql_kodi, get_data, get_file_
from time import time, strftime, localtime
import sqlite3
conn = sqlite3.connect(get_file_db())
# conn = sqlite3.connect(get_file_db())
date = strftime('%Y-%m-%d %H:%M:%S', localtime(float(time())))
def save_all():
@@ -23,7 +23,7 @@ def save_all():
item = tvshow['item']
item.no_reload = True
add_video(item)
conn.close()
# conn.close()
reload()
@@ -50,6 +50,8 @@ def reload():
def add_video(item):
global conn
conn = sqlite3.connect(get_file_db())
progress = platformtools.dialog_progress_bg('Sincronizzazione Libreria', item.title)
progress.update(0)
if item.contentType == 'movie':
@@ -61,6 +63,7 @@ def add_video(item):
addTvShow(item=item)
logger.debug('TOTAL TIME:', time() - start)
videolibrarydb.close()
conn.close()
progress.close()
@@ -223,7 +226,7 @@ class addMovie(object):
get_data(payload)
else:
xbmc.executebuiltin('ReloadSkin()')
conn.close()
# conn.close()
def get_id(self):
Type = 'id' + self.item.contentType.replace('tv', '').capitalize()
@@ -433,7 +436,9 @@ class addMovie(object):
params = []
art_urls = []
_id = get_id('art_id', 'art')
art_urls = [[u[0], u[1], u[2]] for u in execute_sql_kodi('select media_id, media_type, type from art', conn=conn)[1]]
arts = execute_sql_kodi('select media_id, media_type, type from art', conn=conn)[1]
if arts:
art_urls = [[u[0], u[1], u[2]] for u in arts]
for art in self.art:
if [art ['media_id'], art['media_type'], art['type']] not in art_urls:
params.append((_id, art['media_id'], art['media_type'], art['type'], art['url']))
@@ -490,7 +495,7 @@ class addTvShow(object):
get_data(payload)
else:
xbmc.executebuiltin('ReloadSkin()')
conn.close()
# conn.close()
def get_idShow(self):
sql = 'select idShow from tvshow_view where uniqueid_value = {} and uniqueid_type = "kod"'.format(self.info['tmdb_id'])
@@ -867,7 +872,9 @@ class addTvShow(object):
params = []
art_urls = []
_id = get_id('art_id', 'art')
art_urls = [[u[0], u[1], u[2]] for u in execute_sql_kodi('select media_id, media_type, type from art', conn=conn)[1]]
arts = execute_sql_kodi('select media_id, media_type, type from art', conn=conn)[1]
if arts:
art_urls = [[u[0], u[1], u[2]] for u in arts]
for art in self.art:
if [art['media_id'], art['media_type'], art['type']] not in art_urls:
params.append((_id, art['media_id'], art['media_type'], art['type'], art['url']))
+7 -7
View File
@@ -146,7 +146,7 @@ class InfoPlus(xbmcgui.WindowXML):
back(self)
elif action in [UP, DOWN, LEFT, RIGHT] and focus not in [LIST, CAST, RECOMANDED, TRAILERS, FANARTS, SEARCH, BACK, CLOSE]:
self.setFocusId(LIST)
if focus > 0:
if focus > 0 and focus not in [SEARCH, BACK, CLOSE]:
self.item.setFocus = focus
self.item.focus[focus] = self.getControl(focus).getSelectedPosition()
@@ -155,13 +155,13 @@ class InfoPlus(xbmcgui.WindowXML):
global info_list
if control in [SEARCH]:
from specials.globalsearch import Search
from specials.globalsearch import new_search
if self.item.contentType == 'episode':
self.item.mode = 'tvshow'
self.item.contentType = 'tvshow'
self.item.text = self.item.contentSerieName
else:
self.item.mode = self.item.contentType
Search(self.item)
self.item.mode = 'all'
self.item.type = self.item.contentType
new_search(self.item)
elif control in [CLOSE]:
self.close()
@@ -281,7 +281,7 @@ class CastWindow(xbmcgui.WindowXML):
place = info.get('place_of_birth')
self.castitem = xbmcgui.ListItem(info.get('name'))
birth = born + (' - ' + dead if dead else '') + (' [B]•[/B] ' + place if place else '')
self.castitem.setArt({'poster':self.item.poster})
self.castitem.setArt({'poster':self.item.poster if self.item.poster else self.item.infoLabels.get('thumbnail', '')})
self.castitem.setProperties({'birth':birth, 'plot':biography})
def onInit(self):
+3 -1
View File
@@ -3,6 +3,7 @@
# XBMC Launcher (xbmc / kodi)
# ------------------------------------------------------------
import platformcode
from specials import videolibrary
import sys, os
@@ -112,7 +113,8 @@ def run(item=None):
elif item.channel == "infoplus":
from platformcode import infoplus
return infoplus.start(item)
action = getattr(infoplus, item.action)
return action(item)
elif item.channel == "backup":
from platformcode import backup
+6 -5
View File
@@ -365,18 +365,18 @@ def render_items(itemlist, parent_item):
icon_image = "DefaultFolder.png" if item.folder else "DefaultVideo.png"
title = item.title
title = item.title if item.title else item.contentTitle
episode = ''
if title[:1] not in ['[', '']:
if item.contentTitle: title = item.contentTitle
elif item.contentSerieName: title = item.contentSerieName
# if item.contentTitle: title = item.contentTitle
# elif item.contentSerieName: title = item.contentSerieName
if type(item.contentSeason) == int and type(item.contentEpisodeNumber) == int and not item.onlyep:
episode = '{}x{:02d}'.format(item.contentSeason, item.contentEpisodeNumber)
elif type(item.contentEpisodeNumber) == int:
episode = '{:02d}'.format(item.contentEpisodeNumber)
if episode and item.episode2:
if len(item.episode2) < 4: episode = '{}-{}'.format(episode, '-'.join('{:02d}'.format(e) for e in item.episode2))
if len(item.episode2) < 4: episode = '{}-{}'.format(episode, '-'.join('{:02d}'.format(int(e)) for e in item.episode2))
else: episode = '{} -> {:02d}'.format(episode, item.episode2[-1])
if episode: title = '{}. {}'.format(episode, title)
if item.title2: title = '{} - {}'.format(title, item.title2)
@@ -481,6 +481,7 @@ def render_items(itemlist, parent_item):
def viewmodeMonitor():
if get_window() == 'WINDOW_VIDEO_NAV':
try:
currentModeName = xbmc.getInfoLabel('Container.Viewmode')
win = xbmcgui.Window(xbmcgui.getCurrentWindowId())
@@ -1884,7 +1885,7 @@ def serverwindow(item, itemlist):
title = self.item.contentTitle
it.setProperties({'name': title, 'channel': videoitem.ch_name, 'color': color if color else 'FF0082C2'})
it.setArt({'poster':self.item.contentThumbnail, 'thumb':videoitem.thumbnail, 'fanart':item.fanart})
it.setArt({'poster':self.item.contentThumbnail if self.item.contentThumbnail else self.item.thumbnail, 'thumb':videoitem.thumbnail, 'fanart':videoitem.fanart})
self.servers.append(it)
self.doModal()
return self.selection
+11 -3
View File
@@ -32,6 +32,7 @@ def mark_auto_as_watched(item):
sync = False
next_episode = None
show_server = True
mark_time = 100
percentage = float(config.get_setting("watched_setting")) / 100
time_from_end = config.get_setting('next_ep_seconds')
@@ -47,9 +48,9 @@ def mark_auto_as_watched(item):
while not xbmc.Monitor().abortRequested():
if not platformtools.is_playing(): break
try: actual_time = xbmc.Player().getTime()
except: pass
except: actual_time = 0
try: total_time = xbmc.Player().getTotalTime()
except: pass
except: total_time = 0
if item.played_time and xbmcgui.getCurrentWindowId() == 12005:
xbmc.Player().seekTime(item.played_time)
item.played_time = 0 # Fix for Slow Devices
@@ -262,7 +263,6 @@ def mark_content_as_watched_on_kodi(item, value=1):
logger.debug()
if item.contentType == 'movie':
conn = sqlite3.connect(get_file_db())
path = '%{}%'.format(item.strm_path.split('\\')[0].split('/')[0] if item.strm_path else item.base_name)
sql = 'select idMovie from movie_view where strPath like "{}"'.format(path)
@@ -270,7 +270,15 @@ def mark_content_as_watched_on_kodi(item, value=1):
if r:
payload = {"jsonrpc": "2.0", "method": "VideoLibrary.SetMovieDetails", "params": {"movieid": r[0][0], "playcount": value}, "id": 1}
data = get_data(payload)
elif item.contentType == 'episode':
from core.support import dbg;dbg()
path = '%{}'.format(item.strm_path.replace('\\','%').replace('/', '%'))
sql = 'select idEpisode from episode_view where c18 like "{}"'.format(path)
n, r = execute_sql_kodi(sql)
if r:
payload = {"jsonrpc": "2.0", "method": "VideoLibrary.SetEpisodeDetails", "params": {"episodeid": r[0][0], "playcount": value}, "id": 1}
data = get_data(payload)
else:
nun_records, records = execute_sql_kodi('SELECT idShow FROM tvshow_view WHERE uniqueid_value LIKE "{}"'.format(item.videolibrary_id))
# delete TV show
+103 -94
View File
@@ -12,7 +12,6 @@
<control type='group' id="2"/>
<control type='group' id="3"/>
<control type='group' id="4"/>
<control type='group' id="5"/>
<control type="image"> <!-- BACKGROUND -->
<description>Window Background</description>
@@ -38,6 +37,7 @@
<height>100%</height>
<aspectratio>scale</aspectratio>
<texture colordiffuse="FF555555">$INFO[Container(102).ListItem.Art(fanart)]</texture>
<visible>!String.IsEmpty(Container(102).ListItem.Art(fanart))</visible>
</control>
@@ -154,6 +154,18 @@
<control type='group'>
<description>Video Info</description>
<visible>Integer.IsGreater(Container(102).NumItems, 0)</visible>
<animation type="Visible" reversible="false">
<effect type="slide" delay="160" start="100,0" end="0,0" time="200" />
<effect type="fade" delay="160" start="0" end="100" time="200" />
</animation>
<animation type="Hidden" reversible="false">
<effect type="slide" start="0,0" end="100,0" time="200" />
<effect type="fade" start="100" end="0" time="200" />
</animation>
<animation type="WindowClose" reversible="false">
<effect type="slide" start="0,0" end="100,0" time="200" />
<effect type="fade" start="100" end="0" time="200" />
</animation>
<top>80</top>
<height>120</height>
<width>840</width>
@@ -254,6 +266,11 @@
</control>
<control type="fixedlist" id="102">
<animation effect="slide" start="0,100" time="200" condition="Integer.IsGreater(Container(102).NumItems, 0)">Conditional</animation>
<animation effect="fade" start="0" time="200" condition="Integer.IsGreater(Container(102).NumItems, 0)">Conditional</animation>
<animation effect="slide" end="0,100" time="200">WindowClose</animation>
<animation effect="fade" time="100">WindowClose</animation>
<description>Search Results list</description>
<bottom>70</bottom>
<left>0</left>
@@ -285,6 +302,7 @@
<texture>$INFO[ListItem.Property(channelthumb)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
<visible>!String.IsEmpty(ListItem.Property(verified))</visible>
</control>
<control type="image">
<description>Item Poster</description>
@@ -478,6 +496,15 @@
<control type="image">
<description>Poster</description>
<visible>Control.IsVisible(2)</visible>
<animation type="Visible" reversible="false">
<effect type="slide" delay="160" start="-100,0" end="0,0" time="200" />
<effect type="fade" delay="160" start="0" end="100" time="200" />
</animation>
<animation type="Hidden" reversible="false">
<effect type="slide" start="0,0" end="-100,0" time="200" />
<effect type="fade" start="100" end="" time="200" />
</animation>
<top>0</top>
<left>0</left>
<width>480</width>
@@ -487,6 +514,15 @@
<control type="textbox">
<description>Main Title</description>
<visible>Control.IsVisible(2)</visible>
<animation type="Visible" reversible="false">
<effect type="slide" delay="160" start="100,0" end="0,0" time="200" />
<effect type="fade" delay="160" start="0" end="100" time="200" />
</animation>
<animation type="Hidden" reversible="false">
<effect type="slide" start="0,0" end="100,0" time="200" />
<effect type="fade" start="100" end="0" time="200" />
</animation>
<left>520</left>
<top>40</top>
<width>1150</width>
@@ -501,6 +537,15 @@
<control type="list" id="200"> <!-- Episodes List -->
<description>Episodes List</description>
<visible>Control.IsVisible(2)</visible>
<animation type="Visible" reversible="false">
<effect type="slide" delay="160" start="100,0" end="0,0" time="200" />
<effect type="fade" delay="160" start="0" end="100" time="200" />
</animation>
<animation type="Hidden" reversible="false">
<effect type="slide" start="0,0" end="100,0" time="200" />
<effect type="fade" start="100" end="0" time="200" />
</animation>
<top>110</top>
<left>520</left>
<width>700</width>
@@ -555,6 +600,15 @@
<visible>Control.IsVisible(3)</visible>
<control type="image">
<visible>Control.IsVisible(3)</visible>
<animation type="Visible" reversible="false">
<effect type="slide" delay="160" start="-100,0" end="0,0" time="200" />
<effect type="fade" delay="160" start="0" end="100" time="200" />
</animation>
<animation type="Hidden" reversible="false">
<effect type="slide" start="0,0" end="-100,0" time="200" />
<effect type="fade" start="100" end="" time="200" />
</animation>
<description>Poster</description>
<top>0</top>
<left>0</left>
@@ -564,6 +618,16 @@
</control>
<control type="textbox">
<visible>Control.IsVisible(3)</visible>
<animation type="Visible" reversible="false">
<effect type="slide" delay="160" start="100,0" end="0,0" time="200" />
<effect type="fade" delay="160" start="0" end="100" time="200" />
</animation>
<animation type="Hidden" reversible="false">
<effect type="slide" start="0,0" end="100,0" time="200" />
<effect type="fade" start="100" end="0" time="200" />
</animation>
<visible>Control.IsVisible(3)</visible>
<description>Main Title</description>
<left>520</left>
<top>40</top>
@@ -578,6 +642,15 @@
</control>
<control type="list" id="300"> <!-- Servers List -->
<visible>Control.IsVisible(3)</visible>
<animation type="Visible" reversible="false">
<effect type="slide" delay="160" start="100,0" end="0,0" time="200" />
<effect type="fade" delay="160" start="0" end="100" time="200" />
</animation>
<animation type="Hidden" reversible="false">
<effect type="slide" start="0,0" end="100,0" time="200" />
<effect type="fade" start="100" end="0" time="200" />
</animation>
<description>Servers List</description>
<bottom>40</bottom>
<left>520</left>
@@ -596,58 +669,31 @@
<texture>$INFO[ListItem.Art(poster)]</texture>
<aspectratio>scale</aspectratio>
</control>
<control type="group">
<visible>ListItem.Property(quality)</visible>
<control type="image">
<description>Servers Quality</description>
<top>35</top>
<left>150</left>
<width>60</width>
<height>60</height>
<texture>$INFO[ListItem.Property(quality)]</texture>
<aspectratio>scale</aspectratio>
</control>
<control type="textbox">
<description>Server Title</description>
<left>220</left>
<top>35</top>
<left>150</left>
<top>30</top>
<width>450</width>
<height>60</height>
<height>30</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>left</align>
<aligny>center</aligny>
<label>[B][COLOR FFAAAAAA]$INFO[ListItem.Property(servername)][/COLOR][/B]</label>
</control>
<label>[B]$INFO[ListItem.Label][/B]</label>
</control>
<control type="textbox">
<visible>!ListItem.Property(quality)</visible>
<description>Server Title</description>
<description>Channel</description>
<left>150</left>
<top>35</top>
<top>60</top>
<width>450</width>
<height>60</height>
<height>30</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>left</align>
<aligny>center</aligny>
<label>[B][COLOR FFAAAAAA]$INFO[ListItem.Property(servername)][/COLOR][/B]</label>
</control>
<control type="textbox">
<description>No Server Title</description>
<left>150</left>
<top>35</top>
<width>450</width>
<height>60</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>left</align>
<aligny>center</aligny>
<label>$INFO[ListItem.Label]</label>
<visible>!ListItem.Property(servername)</visible>
<label>[B][COLOR FFAAAAAA]$INFO[ListItem.Property(channel)][/COLOR][/B]</label>
</control>
</itemlayout>
<focusedlayout height="140" width="700">
@@ -664,10 +710,8 @@
<left>0</left>
<width>130</width>
<height>130</height>
<visible>Control.HasFocus(300)</visible>
<texture colordiffuse="$INFO[ListItem.Property(color)]">white.png</texture>
<aspectratio>scale</aspectratio>
<visible>ListItem.Property(servername)</visible>
</control>
<control type="image">
<description>Servers Icon</description>
@@ -678,58 +722,31 @@
<texture>$INFO[ListItem.Art(poster)]</texture>
<aspectratio>scale</aspectratio>
</control>
<control type="group">
<visible>ListItem.Property(quality)</visible>
<control type="image">
<description>Servers Quality</description>
<top>35</top>
<left>150</left>
<width>60</width>
<height>60</height>
<texture>$INFO[ListItem.Property(quality)]</texture>
<aspectratio>scale</aspectratio>
</control>
<control type="textbox">
<description>Server Title</description>
<left>220</left>
<top>35</top>
<left>150</left>
<top>30</top>
<width>450</width>
<height>60</height>
<height>30</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>left</align>
<aligny>center</aligny>
<label>[B][COLOR FFAAAAAA]$INFO[ListItem.Property(servername)][/COLOR][/B]</label>
</control>
<label>[B]$INFO[ListItem.Label][/B]</label>
</control>
<control type="textbox">
<visible>!ListItem.Property(quality)</visible>
<description>Server Title</description>
<description>Channel</description>
<left>150</left>
<top>35</top>
<top>60</top>
<width>450</width>
<height>60</height>
<height>30</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>left</align>
<aligny>center</aligny>
<label>[B][COLOR FFAAAAAA]$INFO[ListItem.Property(servername)][/COLOR][/B]</label>
</control>
<control type="textbox">
<description>No Server Title</description>
<left>150</left>
<top>35</top>
<width>450</width>
<height>60</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>left</align>
<aligny>center</aligny>
<label>$INFO[ListItem.Label]</label>
<visible>!ListItem.Property(servername)</visible>
<label>[B][COLOR FFAAAAAA]$INFO[ListItem.Property(channel)][/COLOR][/B]</label>
</control>
</focusedlayout>
</control> <!-- END Servers List -->
@@ -781,25 +798,16 @@
<visible>Control.IsVisible(4)</visible>
</control>
<control type="textbox">
<description>Load Channels</description>
<top>300</top>
<left>0</left>
<width>100%</width>
<control type="group">
<description>Buttons Group</description>
<top>30</top>
<right>30</right>
<width>150</width>
<height>40</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>center</align>
<aligny>center</aligny>
<label>[UPPERCASE]$ADDON[plugin.video.kod 60519][/UPPERCASE]</label>
<visible>Control.IsVisible(5)</visible>
</control>
<control type="button" id="502">
<description>Menu</description>
<top>30</top>
<right>110</right>
<top>0</top>
<right>80</right>
<height>40</height>
<width>40</width>
<onleft>504</onleft>
@@ -811,8 +819,8 @@
<control type="button" id="503">
<description>Back</description>
<top>30</top>
<right>70</right>
<top>0</top>
<right>40</right>
<height>40</height>
<width>40</width>
<onleft>502</onleft>
@@ -823,8 +831,8 @@
<control type="button" id="504">
<description>Close</description>
<top>30</top>
<right>30</right>
<top>0</top>
<right>0</right>
<height>40</height>
<width>40</width>
<onleft>503</onleft>
@@ -832,9 +840,10 @@
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">close.png</texturenofocus>
</control>
</control>
<control type="textbox" id="505">
<description>Load Channels</description>
<description>Quality Tag</description>
<top>670</top>
<right>20</right>
<width>200</width>
+4 -4
View File
@@ -399,18 +399,18 @@
<control type='label'>
<description>Name</description>
<top>20</top>
<right>50</right>
<right>15</right>
<width>40</width>
<height>30</height>
<font>font13</font>
<scroll>true</scroll>
<textcolor>ffFFFFFF</textcolor>
<textcolor>Container(102).ListItem.Property(color)</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[Container(102).ListItem.Rating][/B]</label>
<align>right</align>
<aligny>center</aligny>
</control>
<control type='image'>
<!-- <control type='image'>
<description>Rating Circle</description>
<top>20</top>
<right>15</right>
@@ -418,7 +418,7 @@
<height>30</height>
<texture colordiffuse='$INFO[Container(102).ListItem.Property(color)]'>Circular/$INFO[Container(102).ListItem.Property(rating)].png</texture>
<aspectratio aligny='center'>keep</aspectratio>
</control>
</control> -->
<control type='textbox'>
<description>Plot</description>
<top>60</top>
+2 -2
View File
@@ -38,7 +38,7 @@
<effect type="slide" delay="160" start="-100,0" end="0,0" time="200" />
<effect type="fade" delay="160" start="0" end="100" time="200" />
</animation>
<animation type="WindowOpen" reversible="false">
<animation type="WindowClose" reversible="false">
<effect type="slide" delay="160" start="0,0" end="-100,0" time="200" />
<effect type="fade" delay="160" start="100" end="0" time="200" />
</animation>
@@ -68,7 +68,7 @@
<effect type="slide" delay="160" start="100,0" end="0,0" time="200" />
<effect type="fade" delay="160" start="0" end="100" time="200" />
</animation>
<animation type="WindowOpen" reversible="false">
<animation type="WindowClose" reversible="false">
<effect type="slide" delay="160" start="0,0" end="100,0" time="200" />
<effect type="fade" delay="160" start="100" end="0" time="200" />
</animation>
+1 -1
View File
@@ -29,7 +29,7 @@ def test_video_exists(page_url):
def get_video_url(page_url, premium=False, user="", password="", video_password=""):
logger.debug("url=" + page_url)
video_urls = []
find_url = match(data, patron=r'innerHTML = ([^;]+)').match
find_url = match(data, patron=r'innerHTML = ([^;]+)').matches[-1]
possible_url = js2py.eval_js(find_url)
url = "https:" + possible_url
url = httptools.downloadpage(url, follow_redirects=False, only_headers=True).headers.get("location", "")
+3 -2
View File
@@ -92,7 +92,7 @@ class AddonMonitor(xbmc.Monitor):
if wait > 0:
xbmc.sleep(wait)
if not config.get_setting("update", "videolibrary") == 2:
run_threaded(check_for_update, (False,))
run_threaded(check_for_update, [])
self.scheduleVideolibrary()
super(AddonMonitor, self).__init__()
@@ -181,8 +181,9 @@ class AddonMonitor(xbmc.Monitor):
logger.debug('scheduled videolibrary at ' + str(self.update_hour).zfill(2) + ':00')
def scheduleScreenOnJobs(self):
# pass
schedule.every().second.do(platformtools.viewmodeMonitor).tag('screenOn')
schedule.every().second.do(torrent.elementum_monitor).tag('screenOn')
# schedule.every().second.do(torrent.elementum_monitor).tag('screenOn')
def onDPMSActivated(self):
logger.debug('DPMS activated, un-scheduling screen-on jobs')
+602
View File
@@ -0,0 +1,602 @@
# -*- coding: utf-8 -*-
# -*- Channel New Search -*-
# -*- Created for Alfa-addon -*-
# -*- By the Alfa Develop Group -*-
from __future__ import division
from builtins import range
from core import support
from past.utils import old_div
#from builtins import str
import sys
PY3 = False
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
import time, channelselector
if PY3:
from concurrent import futures
else:
from concurrent_py2 import futures
from core.item import Item
from core import tmdb, scrapertools, channeltools, filetools
from platformcode import logger, config, platformtools, unify
from core.support import typo, thumb
from specials.search import channel_selections, set_context, save_search
info_language = ["de", "en", "es", "fr", "it", "pt"] # from videolibrary.json
def_lang = info_language[config.get_setting("info_language", "videolibrary")]
def new_search(item):
logger.debug()
temp_search_file = config.get_temp_file('temp-search')
if filetools.isfile(temp_search_file):
filetools.remove(temp_search_file)
itemlist = []
if config.get_setting('last_search'):
last_search = channeltools.get_channel_setting('Last_searched', 'search', '')
else:
last_search = ''
if item.search_text:
searched_text = item.search_text
else:
searched_text = platformtools.dialog_input(default=last_search, heading='')
save_search(searched_text)
if not searched_text:
return
channeltools.set_channel_setting('Last_searched', searched_text, 'search')
searched_text = searched_text.replace("+", " ")
if item.mode == 'person':
item.searched_text = searched_text
return actor_list(item)
if item.mode != 'all':
tmdb_info = tmdb.Tmdb(searched_text=searched_text, search_type=item.mode.replace('show', ''))
results = tmdb_info.results
for result in results:
result = tmdb_info.get_infoLabels(result, origen=result)
if item.mode == 'movie':
title = result['title']
else:
title = result['name']
item.mode = 'tvshow'
thumbnail = result.get('thumbnail', '')
fanart = result.get('fanart', '')
new_item = Item(channel=item.channel,
action='channel_search',
title=title,
text=searched_text,
thumbnail=thumbnail,
fanart=fanart,
mode=item.mode,
contentType=item.mode,
infoLabels=result)
if item.mode == 'movie':
new_item.contentTitle = result['title']
else:
new_item.contentSerieName = result['name']
itemlist.append(new_item)
if item.mode == 'all' or not itemlist:
return channel_search(Item(channel=item.channel,
title=searched_text,
text=searched_text,
mode='all',
infoLabels={}))
return itemlist
def channel_search(item):
logger.debug(item)
start = time.time()
searching = list()
searching_titles = list()
results = list()
valid = list()
ch_list = dict()
mode = item.mode
if item.infoLabels['tvshowtitle']:
item.text = item.infoLabels['tvshowtitle'].split(' - ')[0]
item.title = item.text
elif item.infoLabels['title']:
item.text = item.infoLabels['title'].split(' - ')[0]
item.title = item.text
temp_search_file = config.get_temp_file('temp-search')
if filetools.isfile(temp_search_file):
itemlist = []
f = filetools.read(temp_search_file)
if f.startswith(item.text):
for it in f.split(','):
if it and it != item.text:
itemlist.append(Item().fromurl(it))
return itemlist
else:
filetools.remove(temp_search_file)
searched_id = item.infoLabels['tmdb_id']
channel_list, channel_titles = get_channels(item)
searching += channel_list
searching_titles += channel_titles
cnt = 0
progress = platformtools.dialog_progress(config.get_localized_string(30993) % item.title, config.get_localized_string(70744) % len(channel_list) + '\n' + ', '.join(searching_titles))
config.set_setting('tmdb_active', False)
search_action_list = []
module_dict = {}
for ch in channel_list:
try:
module = __import__('channels.%s' % ch, fromlist=["channels.%s" % ch])
mainlist = getattr(module, 'mainlist')(Item(channel=ch, global_search=True))
module_dict[ch] = module
search_action_list.extend([elem for elem in mainlist if
elem.action == "search" and (mode == 'all' or elem.contentType in [mode, 'undefined'])])
if progress.iscanceled():
return []
except:
import traceback
logger.error('error importing/getting search items of ' + ch)
logger.error(traceback.format_exc())
total_search_actions = len(search_action_list)
with futures.ThreadPoolExecutor(max_workers=set_workers()) as executor:
c_results = []
for search_action in search_action_list:
c_results.append(executor.submit(get_channel_results, item, module_dict, search_action))
if progress.iscanceled():
break
for res in futures.as_completed(c_results):
search_action = res.result()[0]
channel = search_action.channel
if res.result()[1]:
if channel not in ch_list:
ch_list[channel] = []
ch_list[channel].extend(res.result()[1])
if res.result()[2]:
valid.extend(res.result()[2])
if progress.iscanceled():
break
search_action_list.remove(search_action)
# if no action of this channel remains
for it in search_action_list:
if it.channel == channel:
break
else:
cnt += 1
searching_titles.remove(searching_titles[searching.index(channel)])
searching.remove(channel)
progress.update(old_div(((total_search_actions - len(search_action_list)) * 100), total_search_actions), config.get_localized_string(70744) % str(len(channel_list) - cnt) + '\n' + ', '.join(searching_titles))
progress.close()
cnt = 0
progress = platformtools.dialog_progress(config.get_localized_string(30993) % item.title, config.get_localized_string(60295) + '\n' + config.get_localized_string(60293))
config.set_setting('tmdb_active', True)
# res_count = 0
for key, value in ch_list.items():
ch_name = channel_titles[channel_list.index(key)]
grouped = list()
cnt += 1
progress.update(old_div((cnt * 100), len(ch_list)), config.get_localized_string(60295))
for it in value:
if it.channel == item.channel:
it.channel = key
if it in valid:
continue
if mode == 'all' or (it.contentType and mode == it.contentType):
if config.get_setting('result_mode') != 0:
if config.get_localized_string(30992) not in it.title:
it.title += typo(ch_name,'_ [] color kod bold')
results.append(it)
else:
grouped.append(it)
elif (mode == 'movie' and it.contentTitle) or (mode == 'tvshow' and (it.contentSerieName or it.show)):
grouped.append(it)
else:
continue
if not grouped:
continue
# to_temp[key] = grouped
if config.get_setting('result_mode') == 0:
if not config.get_setting('unify'):
title = typo(ch_name,'bold') + typo(str(len(grouped)), '_ [] color kod bold')
else:
title = typo('%s %s' % (len(grouped), config.get_localized_string(70695)), 'bold')
# res_count += len(grouped)
plot=''
for it in grouped:
plot += it.title +'\n'
ch_thumb = channeltools.get_channel_parameters(key)['thumbnail']
results.append(Item(channel=item.channel, title=title,
action='get_from_temp', thumbnail=ch_thumb, itemlist=[ris.tourl() for ris in grouped], plot=plot, page=1))
progress.close()
# "All Together" and movie mode -> search servers
if config.get_setting('result_mode') == 1 and mode == 'movie':
progress = platformtools.dialog_progress(config.get_localized_string(30993) % item.title, config.get_localized_string(60683))
valid_servers = []
with futures.ThreadPoolExecutor(max_workers=set_workers()) as executor:
c_results = [executor.submit(get_servers, v, module_dict) for v in valid]
completed = 0
for res in futures.as_completed(c_results):
if progress.iscanceled():
break
if res.result():
completed += 1
valid_servers.extend(res.result())
progress.update(old_div(completed * 100, len(valid)))
valid = valid_servers
progress.close()
# send_to_temp(to_temp)
results = sorted(results, key=lambda it: it.title)
results_statistic = config.get_localized_string(59972) % (item.title, time.time() - start)
if mode == 'all':
results.insert(0, Item(title=typo(results_statistic, 'color kod bold'), thumbnail=thumb('search')))
else:
if not valid:
valid.append(Item(title=config.get_localized_string(60347), thumbnail=thumb('nofolder')))
valid.insert(0, Item(title=typo(results_statistic, 'color kod bold'), thumbnail=thumb('search')))
results.insert(0, Item(title=typo(config.get_localized_string(30025), 'color kod bold'), thumbnail=thumb('search')))
# logger.debug(results_statistic)
itlist = valid + results
writelist = item.text
for it in itlist:
writelist += ',' + it.tourl()
filetools.write(temp_search_file, writelist)
return itlist
def get_channel_results(item, module_dict, search_action):
ch = search_action.channel
results = list()
valid = list()
module = module_dict[ch]
searched_id = item.infoLabels['tmdb_id']
try:
results.extend(module.search(search_action, item.text))
if len(results) == 1:
if not results[0].action or config.get_localized_string(70006).lower() in results[0].title.lower():
results.clear()
if item.mode != 'all':
for elem in results:
if not elem.infoLabels.get('year', ""):
elem.infoLabels['year'] = '-'
tmdb.set_infoLabels_item(elem)
if elem.infoLabels['tmdb_id'] == searched_id:
elem.from_channel = ch
if not config.get_setting('unify'):
elem.title += ' [%s]' % ch
valid.append(elem)
# if len(results) < 0 and len(results) < max_results and item.mode != 'all':
#
# if len(results) == 1:
# if not results[0].action or config.get_localized_string(30992).lower() in results[0].title.lower():
# return [ch, []]
#
# results = get_info(results)
return [search_action, results, valid]
except:
return [search_action, results, valid]
def get_servers(item, module_dict):
item.global_search = True
ch = item.channel
results = list()
module = module_dict[ch]
try:
results = getattr(module, item.action)(item)
except:
import traceback
logger.error(traceback.format_exc())
return [r.clone(title=r.title + typo(item.channel, '_ [] color kod')) for r in results if r.action == 'play']
def get_info(itemlist):
logger.debug()
tmdb.set_infoLabels_itemlist(itemlist, True, forced=True)
return itemlist
def get_channels(item):
logger.debug()
channels_list = list()
title_list = list()
all_channels = channelselector.filterchannels('all')
for ch in all_channels:
channel = ch.channel
ch_param = channeltools.get_channel_parameters(channel)
if not ch_param.get("active", False):
continue
list_cat = ch_param.get("categories", [])
if not ch_param.get("include_in_global_search", False):
continue
if 'anime' in list_cat:
n = list_cat.index('anime')
list_cat[n] = 'tvshow'
if item.mode == 'all' or (item.mode in list_cat):
if config.get_setting("include_in_global_search", channel) and ch_param.get("active", False):
channels_list.append(channel)
title_list.append(ch_param.get('title', channel))
return channels_list, title_list
def settings(item):
return platformtools.show_channel_settings(caption=config.get_localized_string(59993))
def set_workers():
workers = config.get_setting('thread_number') if config.get_setting('thread_number') > 0 else None
return workers
def genres_menu(item):
itemlist = []
mode = item.mode.replace('show', '')
genres = tmdb.get_dic_genres(mode)
for key, value in list(genres[mode].items()):
discovery = {'url': 'discover/%s' % mode, 'with_genres': key,
'language': def_lang, 'page': '1'}
itemlist.append(Item(channel=item.channel, title=typo(value, 'bold'), page=1,
action='discover_list', discovery=discovery,
mode=item.mode))
from core import support
support.thumb(itemlist, mode='genre')
return sorted(itemlist, key=lambda it: it.title)
def years_menu(item):
import datetime
itemlist = []
mode = item.mode.replace('show', '')
par_year = 'primary_release_year'
thumb = thumb('movie_year')
if mode != 'movie':
par_year = 'first_air_date_year'
thumb = thumb('tvshow_year')
c_year = datetime.datetime.now().year + 1
l_year = c_year - 31
for year in range(l_year, c_year):
discovery = {'url': 'discover/%s' % mode, 'page': '1',
'%s' % par_year: '%s' % year,
'sort_by': 'popularity.desc', 'language': def_lang}
itemlist.append(Item(channel=item.channel, title=typo(str(year), 'bold'), action='discover_list',
discovery=discovery, mode=item.mode, year_=str(year), thumbnail=thumb))
itemlist.reverse()
itemlist.append(Item(channel=item.channel, title=typo(config.get_localized_string(70745),'color kod bold'), url='',
action="year_cus", mode=item.mode, par_year=par_year))
return itemlist
def year_cus(item):
mode = item.mode.replace('show', '')
heading = config.get_localized_string(70042)
year = platformtools.dialog_numeric(0, heading, default="")
item.discovery = {'url': 'discover/%s' % mode, 'page': '1',
'%s' % item.par_year: '%s' % year,
'sort_by': 'popularity.desc', 'language': def_lang}
item.action = "discover_list"
if year and len(year) == 4:
return discover_list(item)
def actor_list(item):
itemlist = []
dict_ = {'url': 'search/person', 'language': def_lang, 'query': item.searched_text, 'page': item.page}
prof = {'Acting': 'Actor', 'Directing': 'Director', 'Production': 'Productor'}
plot = ''
item.search_type = 'person'
tmdb_inf = tmdb.discovery(item, dict_=dict_)
results = tmdb_inf.results
if not results:
return results
for elem in results:
name = elem.get('name', '')
if not name:
continue
rol = elem.get('known_for_department', '')
rol = prof.get(rol, rol)
# genero = elem.get('gender', 0)
# if genero == 1 and rol in prof:
# rol += 'a'
# rol = rol.replace('Actora', 'Actriz')
know_for = elem.get('known_for', '')
cast_id = elem.get('id', '')
if know_for:
t_k = know_for[0].get('title', '')
if t_k:
plot = '%s in %s' % (rol, t_k)
thumbnail = 'https://image.tmdb.org/t/p/original%s' % elem.get('profile_path', '')
title = typo(name,'bold')+typo(rol,'_ [] color kod bold')
discovery = {'url': 'person/%s/combined_credits' % cast_id, 'page': '1',
'sort_by': 'primary_release_date.desc', 'language': def_lang}
itemlist.append(Item(channel=item.channel, title=title, action='discover_list', cast_='cast',
discovery=discovery, thumbnail=thumbnail, plot=plot, page=1))
if len(results) > 19:
next_ = item.page + 1
itemlist.append(Item(channel=item.channel, title=typo(config.get_localized_string(30992),'bold color kod'), action='actor_list',
page=next_, thumbnail=thumbnail,
searched_text=item.searched_text))
return itemlist
def discover_list(item):
import datetime
itemlist = []
year = 0
tmdb_inf = tmdb.discovery(item, dict_=item.discovery, cast=item.cast_)
result = tmdb_inf.results
tvshow = False
for elem in result:
elem = tmdb_inf.get_infoLabels(elem, origen=elem)
if 'title' in elem:
title = unify.normalize(elem['title']).capitalize()
else:
title = unify.normalize(elem['name']).capitalize()
tvshow = True
elem['tmdb_id'] = elem['id']
mode = item.mode or elem['mediatype']
thumbnail = elem.get('thumbnail', '')
fanart = elem.get('fanart', '')
if item.cast_:
release = elem.get('release_date', '0000') or elem.get('first_air_date', '0000')
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 config.get_setting('new_search'):
new_item = Item(channel='globalsearch', title=typo(title, 'bold'), infoLabels=elem,
action='Search', text=title,
thumbnail=thumbnail, fanart=fanart,
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:
new_item.contentSerieName = title
else:
new_item.contentTitle = title
itemlist.append(new_item)
itemlist = set_context(itemlist)
if item.cast_:
itemlist.sort(key=lambda it: int(it.release_date), reverse=True)
return itemlist
elif len(result) > 19 and item.discovery:
item.discovery['page'] = str(int(item.discovery['page']) + 1)
itemlist.append(Item(channel=item.channel, action='discover_list', nextPage=True,
title=typo(config.get_localized_string(30992), 'color kod bold'),
list_type=item.list_type, discovery=item.discovery, thumbnail=thumb(), page=item.discovery['page']))
elif len(result) > 19:
next_page = str(int(item.page) + 1)
itemlist.append(Item(channel=item.channel, action='discover_list', nextPage=True,
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, thumbnail=thumb()))
return itemlist
def from_context(item):
logger.debug()
select = channel_selections(item)
if not select:
return
if 'infoLabels' in item and 'mediatype' in item.infoLabels:
item.mode = item.infoLabels['mediatype']
else:
return
if config.get_setting('new_search'):
from specials import globalsearch
if item.infoLabels['tmdb_id']:
item.type = item.mode
item.mode = 'search'
return globalsearch.Search(item)
if 'list_type' not in item:
if 'wanted' in item:
item.title = item.wanted
return channel_search(item)
return discover_list(item)
def get_from_temp(item):
logger.debug()
n = 30
nTotal = len(item.itemlist)
nextp = n * item.page
prevp = n * (item.page - 1)
results = [Item().fromurl(elem) for elem in item.itemlist[prevp:nextp]]
if nextp < nTotal:
results.append(Item(channel='search', title=typo(config.get_localized_string(30992), 'bold color kod'),
action='get_from_temp', itemlist=item.itemlist, page=item.page + 1, nextPage=True))
tmdb.set_infoLabels_itemlist(results, True)
for elem in results:
if not elem.infoLabels.get('year', ""):
elem.infoLabels['year'] = '-'
tmdb.set_infoLabels_item(elem, True)
return results
+61 -105
View File
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from logging import Logger
import threading
from core import jsontools, support
@@ -30,7 +31,7 @@ def set_workers():
workers = config.get_setting('thread_number') if config.get_setting('thread_number') > 0 else None
return workers
def Search(*args):
def new_search(*args):
xbmc.executebuiltin('Dialog.Close(all)')
w = SearchWindow('GlobalSearch.xml', config.get_runtime_path())
w.start(*args)
@@ -54,7 +55,6 @@ SEARCH = 1
EPISODES = 2
SERVERS = 3
NORESULTS = 4
LOADING = 5
# Search
MAINTITLE = 100
@@ -79,7 +79,6 @@ class SearchWindow(xbmcgui.WindowXML):
self.exit = False
self.item = item
self.type = self.item.mode
self.channels = []
self.persons = []
self.episodes = []
@@ -95,7 +94,7 @@ class SearchWindow(xbmcgui.WindowXML):
self.search_threads = []
self.reload = False
if not thActions:
if not thActions and not self.searchActions:
self.thActions = Thread(target=self.getActionsThread)
self.thActions.start()
else:
@@ -126,15 +125,15 @@ class SearchWindow(xbmcgui.WindowXML):
def getActionsThread(self):
logger.debug()
self.channelsList = self.get_channels()
for channel in self.channelsList:
logger.debug(channel)
try:
module = __import__('channels.%s' % channel, fromlist=["channels.%s" % channel])
mainlist = getattr(module, 'mainlist')(Item(channel=channel, global_search=True))
action = [elem for elem in mainlist if elem.action == "search" and (
self.item.mode in ['all', 'person'] or elem.contentType in [self.item.mode, 'undefined'])]
actions = [elem for elem in mainlist if elem.action == "search" and (self.item.mode in ['all', 'person'] or elem.contentType in [self.item.mode, 'undefined'])]
self.moduleDict[channel] = module
self.searchActions += action
self.searchActions.append(actions)
except:
import traceback
logger.error('error importing/getting search items of ' + channel)
@@ -147,6 +146,7 @@ class SearchWindow(xbmcgui.WindowXML):
# wait and return as getActionsThread load
lastLen = len(self.searchActions)
if self.thActions:
while self.thActions.is_alive():
while len(self.searchActions) == lastLen:
if not self.thActions.is_alive():
@@ -159,7 +159,7 @@ class SearchWindow(xbmcgui.WindowXML):
logger.debug()
self.PROGRESS.setVisible(False)
self.items = []
if self.item.mode == 'person_':
if self.item.mode == 'filmography':
tmdb_info = tmdb.discovery(self.item, dict_=self.item.discovery)
results = tmdb_info.results.get('cast',[])
else:
@@ -255,12 +255,12 @@ class SearchWindow(xbmcgui.WindowXML):
discovery = {'url': 'person/%s/combined_credits' % cast_id, 'page': '1', 'sort_by': 'primary_release_date.desc', 'language': def_lang}
self.persons.append(discovery)
new_item = Item(channel='search',
new_item = Item(channel='globalsearch',
action=True,
title=name,
thumbnail=thumb,
plot= plot,
mode='search')
mode='search_filmography')
it = xbmcgui.ListItem(name)
platformtools.set_infolabels(it, new_item)
@@ -306,7 +306,7 @@ class SearchWindow(xbmcgui.WindowXML):
n = list_cat.index('anime')
list_cat[n] = 'tvshow'
if self.item.mode in ['all', 'person'] or self.item.mode in list_cat or self.item.type in list_cat:
if self.item.mode in ['all', 'person'] or self.item.mode in list_cat:
if config.get_setting("include_in_global_search", channel) and ch_param.get("active", False):
channels_list.append(channel)
@@ -315,7 +315,7 @@ class SearchWindow(xbmcgui.WindowXML):
return channels_list
def timer(self):
while self.searchActions or self.thActions.is_alive():
while self.searchActions or (self.thActions and self.thActions.is_alive()):
if self.exit: return
try:
percent = (float(self.count) / len(self.searchActions)) * 100
@@ -323,28 +323,27 @@ class SearchWindow(xbmcgui.WindowXML):
percent = 0
self.PROGRESS.setPercent(percent)
self.MAINTITLE.setText('{} | {}/{} [{}"]'.format(self.mainTitle,self.count, len(self.searchActions), int(time.time() - self.time)))
# self.COUNT.setText('%s/%s [%s"]' % (self.count, len(self.searchActions), int(time.time() - self.time)))
if percent == 100:
if len(self.channels) == 1:
self.setFocusId(RESULTS)
elif not self.results:
self.PROGRESS.setVisible(False)
self.NORESULTS.setVisible(True)
self.setFocusId(CLOSE)
self.channels = []
self.moduleDict = {}
self.searchActions = []
# if no results
total = 0
for num in self.results.values():
total += num
if not total:
self.PROGRESS.setVisible(False)
self.NORESULTS.setVisible(True)
self.setFocusId(CLOSE)
time.sleep(1)
def search(self):
logger.debug()
self.count = 0
self.LOADING.setVisible(True)
Thread(target=self.timer).start()
# for searchAction in self.getActions():
# self.search_threads.append(self.get_channel_results(searchAction))
try:
with futures.ThreadPoolExecutor(max_workers=set_workers()) as executor:
for searchAction in self.getActions():
@@ -357,10 +356,13 @@ class SearchWindow(xbmcgui.WindowXML):
def get_channel_results(self, searchAction):
def channel_search(text):
logger.debug('Search on channel:', channel)
results = []
valid = []
other = []
results = self.moduleDict[channel].search(searchAction, text)
for a in searchAction:
logger.debug('Search on channel:', a.channel)
results.extend(self.moduleDict[a.channel].search(a, text))
if len(results) == 1:
if not results[0].action or results[0].nextPage:
results = []
@@ -368,7 +370,7 @@ class SearchWindow(xbmcgui.WindowXML):
if self.item.mode != 'all':
for elem in results:
if elem.infoLabels.get('tmdb_id') == self.item.infoLabels.get('tmdb_id'):
elem.from_channel = channel
elem.from_channel = elem.channel
elem.verified = 1
valid.append(elem)
else:
@@ -376,11 +378,11 @@ class SearchWindow(xbmcgui.WindowXML):
return results, valid, other
logger.debug()
channel = searchAction.channel
results = []
valid = []
other = []
try:
results, valid, other = channel_search(self.item.text)
@@ -388,12 +390,12 @@ class SearchWindow(xbmcgui.WindowXML):
# to add year to search text for better filtering
if self.item.contentType == 'movie' and not valid and other and other[-1].nextPage \
and self.item.infoLabels['year']:
logger.debug('retring adding year on channel ' + channel)
logger.debug('retring adding year on channel ')
dummy, valid, dummy = channel_search(self.item.text + " " + str(self.item.infoLabels['year']))
# some channels may use original title
if self.item.mode != 'all' and not valid and self.item.infoLabels.get('originaltitle'):
logger.debug('retring with original title on channel ' + channel)
logger.debug('retring with original title on channel ')
dummy, valid, dummy = channel_search(self.item.infoLabels.get('originaltitle'))
except:
import traceback
@@ -401,10 +403,11 @@ class SearchWindow(xbmcgui.WindowXML):
if self.exit:
return
update_lock.acquire()
self.count += 1
logger.debug('Results:', channel, results, valid, other)
self.update(channel, valid, other if other else results)
self.update(valid, other if other else results)
update_lock.release()
def makeItem(self, item):
@@ -429,16 +432,19 @@ class SearchWindow(xbmcgui.WindowXML):
it.setProperties({'rating': str(int(info.get('rating',10) * 10)), 'color': color,
'item': item.tourl(), 'verified': item.verified, 'channel':channelParams['title'], 'channelthumb': channelParams['thumbnail'], 'sub':'true' if 'sub' in item.contentLanguage.lower() else ''})
if item.server:
servername = servertools.get_server_parameters(item.server.lower()).get('name', item.server)
if item. quality: servername ='{} [{}]'.format(servername, item.quality)
it.setLabel(servername)
color = scrapertools.find_single_match(item.alive, r'(FF[^\]]+)')
it.setArt({'poster': config.get_online_server_thumb(item.server)})
it.setProperties({'channel': channeltools.get_channel_parameters(item.channel).get('title', ''),
'servername': servertools.get_server_parameters(item.server.lower()).get('name', item.server),
it.setProperties({'quality':'[{}]'.format(item.quality) if item.quality else '',
'channel': channeltools.get_channel_parameters(item.channel).get('title', ''),
'color': color if color else 'FF0082C2'})
return it
def update(self, channel, valid, results):
self.LOADING.setVisible(False)
def update(self, valid, results):
if self.exit:
return
@@ -452,7 +458,6 @@ class SearchWindow(xbmcgui.WindowXML):
pos = self.CHANNELS.getSelectedPosition()
self.CHANNELS.addItems(self.channels)
self.CHANNELS.selectItem(pos)
self.setFocusId(RESULTS)
if valid and self.CHANNELS.size():
item = self.CHANNELS.getListItem(0)
@@ -475,9 +480,8 @@ class SearchWindow(xbmcgui.WindowXML):
if results:
resultsList = ''
channelParams = channeltools.get_channel_parameters(channel)
channelParams = channeltools.get_channel_parameters(results[0].channel)
name = channelParams['title']
if name not in self.results:
item = xbmcgui.ListItem(name)
item.setArt({'poster':channelParams['thumbnail']})
item.setProperties({'position': '0',
@@ -485,17 +489,9 @@ class SearchWindow(xbmcgui.WindowXML):
})
for result in results:
resultsList += result.tourl() + '|'
item.setProperty('items',resultsList)
item.setProperties({'items': resultsList, 'results': str(len(resultsList.split('|')) - 1)})
self.results[name] = len(self.results)
self.channels.append(item)
else:
item = self.CHANNELS.getListItem(self.results[name])
resultsList = item.getProperty('items')
for result in results:
resultsList += result.tourl() + '|'
item.setProperty('items',resultsList)
logger.log(self.channels[int(self.results[name])])
self.channels[int(self.results[name])].setProperty('results', str(len(resultsList.split('|')) - 1))
pos = self.CHANNELS.getSelectedPosition()
self.CHANNELS.reset()
self.CHANNELS.addItems(self.channels)
@@ -511,6 +507,9 @@ class SearchWindow(xbmcgui.WindowXML):
self.RESULTS.addItems(items)
def onInit(self):
self.NORESULTS = self.getControl(NORESULTS)
self.NORESULTS.setVisible(False)
self.time = time.time()
self.mainTitle = config.get_localized_string(30993).replace('...', '') % '"%s"' % self.item.text
@@ -526,22 +525,15 @@ class SearchWindow(xbmcgui.WindowXML):
self.EPISODESLIST = self.getControl(EPISODESLIST)
self.SERVERS = self.getControl(SERVERS)
self.SERVERLIST = self.getControl(SERVERLIST)
self.NORESULTS = self.getControl(NORESULTS)
self.NORESULTS.setVisible(False)
self.LOADING = self.getControl(LOADING)
self.LOADING.setVisible(False)
self.Focus(self.focus)
if self.type:
self.type = None
if self.item.mode in ['all', 'search']:
if self.item.type:
self.item.mode = self.item.type
if self.item.mode.split('_')[0] in ['all', 'search']:
if 'search' in self.item.mode:
self.item.mode = self.item.mode.split('_')[-1]
self.item.text = scrapertools.title_unify(self.item.text)
self.thread = Thread(target=self.search)
self.thread.start()
elif self.item.mode in ['movie', 'tvshow', 'person_']:
elif self.item.mode in ['movie', 'tvshow', 'filmography']:
self.select()
elif self.item.mode in ['person']:
self.actors()
@@ -608,7 +600,7 @@ class SearchWindow(xbmcgui.WindowXML):
elif action in [EXIT]:
self.Close()
reload()
# reload()
close_action = True
xbmc.sleep(500)
@@ -635,7 +627,7 @@ class SearchWindow(xbmcgui.WindowXML):
elif control_id in [CLOSE]:
self.Close()
reload()
# reload()
close_action = True
elif control_id in [MENU]:
@@ -651,7 +643,7 @@ class SearchWindow(xbmcgui.WindowXML):
self.actors()
elif search == 'persons':
item = self.item.clone(mode='person_', discovery=self.persons[pos])
Search(item, self.moduleDict, self.searchActions, self.thActions)
new_search(item, self.moduleDict, self.searchActions)
if close_action:
self.close()
else:
@@ -659,7 +651,7 @@ class SearchWindow(xbmcgui.WindowXML):
if self.item.mode == 'movie': item.contentTitle = self.RESULTS.getSelectedItem().getLabel()
else: item.contentSerieName = self.RESULTS.getSelectedItem().getLabel()
Search(item, self.moduleDict, self.searchActions, self.thActions)
new_search(item, self.moduleDict, self.searchActions)
if close_action:
self.close()
@@ -695,54 +687,16 @@ class SearchWindow(xbmcgui.WindowXML):
if config.get_setting('checklinks') and not config.get_setting('autoplay'):
self.itemsResult = servertools.check_list_links(self.itemsResult, config.get_setting('checklinks_number'))
servers = self.itemsResult if self.itemsResult else []
self.itemsResult = []
uhd = []
fhd = []
hd = []
sd = []
unknown = []
other = []
for i, item in enumerate(servers):
if item.server:
it = self.makeItem(item)
it.setProperty('index', str(i))
if item.quality.lower() in ['4k', '2160p', '2160', '4k2160p', '4k2160', '4k 2160p', '4k 2160', '2k']:
it.setProperty('quality', 'uhd.png')
uhd.append(it)
elif item.quality.lower() in ['fullhd', 'fullhd 1080', 'fullhd 1080p', 'full hd', 'full hd 1080', 'full hd 1080p', 'hd1080', 'hd1080p', 'hd 1080', 'hd 1080p', '1080', '1080p']:
it.setProperty('quality', 'Fhd.png')
fhd.append(it)
elif item.quality.lower() in ['hd', 'hd720', 'hd720p', 'hd 720', 'hd 720p', '720', '720p', 'hdtv']:
it.setProperty('quality', 'hd.png')
hd.append(it)
elif item.quality.lower() in ['sd', '480p', '480', '360p', '360', '240p', '240']:
it.setProperty('quality', 'sd.png')
sd.append(it)
else:
it.setProperty('quality', '')
unknown.append(it)
elif not item.action:
self.getControl(QUALITYTAG).setText(item.fulltitle)
else:
it = self.makeItem(item)
other.append(it)
logger.debug(it)
for s in self.itemsResult: logger.debug(s)
servers = [self.makeItem(s) for s in self.itemsResult if s.server]
uhd.sort(key=lambda it: it.getProperty('index'))
fhd.sort(key=lambda it: it.getProperty('index'))
hd.sort(key=lambda it: it.getProperty('index'))
sd.sort(key=lambda it: it.getProperty('index'))
unknown.sort(key=lambda it: it.getProperty('index'))
serverlist = uhd + fhd + hd + sd + unknown + other
if not serverlist:
serverlist = [xbmcgui.ListItem(config.get_localized_string(60347))]
serverlist[0].setArt({'poster': support.thumb('nofolder')})
if not servers:
servers = [xbmcgui.ListItem(config.get_localized_string(60347))]
servers[0].setArt({'poster': support.thumb('nofolder')})
self.Focus(SERVERS)
self.SERVERLIST.reset()
self.SERVERLIST.addItems(serverlist)
self.SERVERLIST.addItems(servers)
self.setFocusId(SERVERLIST)
if config.get_setting('autoplay'):
@@ -772,10 +726,12 @@ class SearchWindow(xbmcgui.WindowXML):
platformtools.dialog_busy(False)
elif control_id in [SERVERLIST]:
server = Item().fromurl(self.getControl(control_id).getSelectedItem().getProperty('item'))
return self.play(server)
def Back(self):
self.getControl(QUALITYTAG).setText('')
if self.SERVERS.isVisible():
+154 -780
View File
@@ -1,81 +1,180 @@
# -*- coding: utf-8 -*-
# -*- Channel New Search -*-
# -*- Created for Alfa-addon -*-
# -*- By the Alfa Develop Group -*-
# ------------------------------------------------------------
# Search Entry Point
# ------------------------------------------------------------
from __future__ import division
from builtins import range
from core import support
from past.utils import old_div
#from builtins import str
import sys
PY3 = False
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
import time, channelselector
if PY3:
from concurrent import futures
else:
from concurrent_py2 import futures
from core.item import Item
from core import tmdb, scrapertools, channeltools, filetools, jsontools, servertools
from platformcode import logger, config, platformtools, unify
from core.support import typo, thumb
import xbmcgui
import xbmc
from threading import Thread
from core.support import dbg
info_language = ["de", "en", "es", "fr", "it", "pt"] # from videolibrary.json
def_lang = info_language[config.get_setting("info_language", "videolibrary")]
from core.item import Item
from core.support import typo, thumb
from platformcode import logger, config, platformtools
def mainlist(item):
logger.debug()
action = 'new_search'
channel = 'classicsearch'
folder = True
if platformtools.get_window() not in ('WINDOW_SETTINGS_MENU', 'WINDOW_SETTINGS_INTERFACE', 'WINDOW_SKIN_SETTINGS')\
and xbmc.getInfoLabel('System.CurrentWindow') in ('Home', '') and config.get_setting('new_search'):
itemlist = [Item(channel='globalsearch', title=config.get_localized_string(70276), action='Search', mode='all', folder=False),
Item(channel='globalsearch', title=config.get_localized_string(70741) % config.get_localized_string(30122), action='Search', mode='movie', folder=False),
Item(channel='globalsearch', title=config.get_localized_string(70741) % config.get_localized_string(30123), action='Search', mode='tvshow', folder=False),
Item(channel='globalsearch', title=config.get_localized_string(70741) % config.get_localized_string(70314), action='Search', page=1, mode='person', folder=False)]
else:
itemlist = [Item(channel=item.channel, title=config.get_localized_string(70276), action='new_search', mode='all'),
Item(channel=item.channel, title=config.get_localized_string(70741) % config.get_localized_string(30122), action='new_search', mode='movie'),
Item(channel=item.channel, title=config.get_localized_string(70741) % config.get_localized_string(30123), action='new_search', mode='tvshow'),
Item(channel=item.channel, title=config.get_localized_string(70741) % config.get_localized_string(70314), action='new_search', page=1, mode='person')]
channel = 'globalsearch'
folder = False
itemlist += [Item(channel=item.channel, title=config.get_localized_string(59995), action='saved_search', thumbnail=thumb('search')),
itemlist = [Item(channel=channel, title=config.get_localized_string(70276), action=action, mode='all', folder=folder),
Item(channel=channel, title=config.get_localized_string(70741) % config.get_localized_string(30122), action=action, mode='movie', folder=folder),
Item(channel=channel, title=config.get_localized_string(70741) % config.get_localized_string(30123), action=action, mode='tvshow', folder=folder),
Item(channel=channel, title=config.get_localized_string(70741) % config.get_localized_string(70314), action=action, page=1, mode='person', folder=folder),
Item(channel=item.channel, title=config.get_localized_string(59995), action='saved_search', thumbnail=thumb('search')),
Item(channel=item.channel, title=config.get_localized_string(60420), action='sub_menu', thumbnail=thumb('search')),
Item(channel="tvmoviedb", title=config.get_localized_string(70274), action="mainlist", thumbnail=thumb('search')),
Item(channel=item.channel, title=typo(config.get_localized_string(59994) + '{config}', 'color kod bold'), action='setting_channel_new', folder=False),
Item(channel='shortcuts', title=typo(config.get_localized_string(70286), 'color kod bold'), action='SettingOnPosition', category=5, setting=1, folder=False)]
Item(channel=item.channel, title=typo(config.get_localized_string(59994), 'bold'), action='channel_selections', folder=False),
Item(channel='shortcuts', title=typo(config.get_localized_string(70286), 'bold'), action='SettingOnPosition', category=5, setting=1, folder=False)]
itemlist = set_context(itemlist)
thumb(itemlist)
return itemlist
def sub_menu(item):
logger.debug()
itemlist = [Item(channel=item.channel, action='genres_menu', title=config.get_localized_string(70306), mode='movie'),
Item(channel=item.channel, action='years_menu', title=config.get_localized_string(70742), mode='movie'),
Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70307), search_type='list', list_type='movie/popular', mode='movie'),
Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70308), search_type='list', list_type='movie/top_rated', mode='movie'),
Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70309), search_type='list', list_type='movie/now_playing', mode='movie'),
Item(channel=item.channel, action='genres_menu', title=config.get_localized_string(70310), mode='tvshow'),
Item(channel=item.channel, action='years_menu', title=config.get_localized_string(70743), mode='tvshow'),
Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70311), search_type='list', list_type='tv/popular', mode='tvshow'),
Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70312), search_type='list', list_type='tv/on_air', mode='tvshow'),
Item(channel=item.channel, action='discover_list', title=config.get_localized_string(70313), search_type='list', list_type='tv/top_rated', mode='tvshow')]
channel = 'classicsearch'
itemlist = [Item(channel=channel, action='genres_menu', title=config.get_localized_string(70306), mode='movie'),
Item(channel=channel, action='years_menu', title=config.get_localized_string(70742), mode='movie'),
Item(channel=channel, action='discover_list', title=config.get_localized_string(70307), search_type='list', list_type='movie/popular', mode='movie'),
Item(channel=channel, action='discover_list', title=config.get_localized_string(70308), search_type='list', list_type='movie/top_rated', mode='movie'),
Item(channel=channel, action='discover_list', title=config.get_localized_string(70309), search_type='list', list_type='movie/now_playing', mode='movie'),
Item(channel=channel, action='genres_menu', title=config.get_localized_string(70310), mode='tvshow'),
Item(channel=channel, action='years_menu', title=config.get_localized_string(70743), mode='tvshow'),
Item(channel=channel, action='discover_list', title=config.get_localized_string(70311), search_type='list', list_type='tv/popular', mode='tvshow'),
Item(channel=channel, action='discover_list', title=config.get_localized_string(70312), search_type='list', list_type='tv/on_air', mode='tvshow'),
Item(channel=channel, action='discover_list', title=config.get_localized_string(70313), search_type='list', list_type='tv/top_rated', mode='tvshow')]
itemlist = set_context(itemlist)
support.thumb(itemlist)
thumb(itemlist)
return itemlist
def set_context(itemlist):
logger.debug()
channel = 'classicsearch'
for elem in itemlist:
elem.context = [{"title": config.get_localized_string(60412),
"action": "channel_selections",
"channel": channel},
{"title": config.get_localized_string(60415),
"action": "settings",
"channel": channel},
{"title": config.get_localized_string(60416),
"action": "clear_saved_searches",
"channel": channel}]
return itemlist
def channel_selections(item):
import xbmcgui, channelselector
from core import channeltools
# Load list of options (active user channels that allow global search)
channel_list = []
ids = []
lang_list = []
cat_list = []
channels_list = channelselector.filterchannels('all')
for channel in channels_list:
if channel.action == '':
continue
channel_parameters = channeltools.get_channel_parameters(channel.channel)
# Do not include if "include_in_global_search" does not exist in the channel configuration
if not channel_parameters['include_in_global_search']:
continue
label_cat = ', '.join(config.get_localized_category(c) for c in channel_parameters['categories'])
label_lang = ', '.join(config.get_localized_language(l) for l in channel_parameters['language'])
label = '{} [{}]'.format(label_cat, label_lang)
it = xbmcgui.ListItem(channel.title, label)
it.setArt({'thumb': channel.thumbnail, 'fanart': channel.fanart})
channel_list.append(it)
ids.append(channel.channel)
lang_list.append(channel_parameters['language'])
cat_list.append(channel_parameters['categories'])
# Pre-select dialog
preselections = [
config.get_localized_string(70570),
config.get_localized_string(70571),
config.get_localized_string(70572),
config.get_localized_string(70573),
]
preselections_values = ['skip', 'actual', 'all', 'none']
categories = ['movie', 'tvshow', 'documentary', 'anime', 'sub', 'live', 'torrent']
for c in categories:
preselections.append(config.get_localized_string(70577) + config.get_localized_category(c))
preselections_values.append(c)
if item.action == 'setting_channel': # Configure channels included in search
del preselections[0]
del preselections_values[0]
ret = platformtools.dialog_select(config.get_localized_string(59994), preselections)
if ret == -1:
return False # order cancel
if preselections_values[ret] == 'skip':
return True # continue unmodified
elif preselections_values[ret] == 'none':
preselect = []
elif preselections_values[ret] == 'all':
preselect = list(range(len(ids)))
elif preselections_values[ret] == 'actual':
preselect = []
for i, channel in enumerate(ids):
channel_status = config.get_setting('include_in_global_search', channel)
if channel_status:
preselect.append(i)
else:
preselect = []
for i, ctgs in enumerate(cat_list):
if preselections_values[ret] in ctgs:
preselect.append(i)
# Selection Dialog
ret = platformtools.dialog_multiselect(config.get_localized_string(59994), channel_list, preselect=preselect, useDetails=True)
if ret == None: return False # order cancel
selected = [ids[i] for i in ret]
# Save changes to search channels
for channel in ids:
channel_status = config.get_setting('include_in_global_search', channel)
if channel_status and channel not in selected:
config.set_setting('include_in_global_search', False, channel)
elif not channel_status and channel in selected:
config.set_setting('include_in_global_search', True, channel)
return True
def save_search(text):
if text:
saved_searches_limit = config.get_setting("saved_searches_limit")
current_saved_searches_list = config.get_setting("saved_searches_list", "search")
if current_saved_searches_list is None:
saved_searches_list = []
else:
saved_searches_list = list(current_saved_searches_list)
if text in saved_searches_list:
saved_searches_list.remove(text)
saved_searches_list.insert(0, text)
config.set_setting("saved_searches_list", saved_searches_list[:saved_searches_limit], "search")
def clear_saved_searches(item):
config.set_setting("saved_searches_list", list(), "search")
platformtools.dialog_ok(config.get_localized_string(60423), config.get_localized_string(60424))
def saved_search(item):
logger.debug()
@@ -103,731 +202,6 @@ def saved_search(item):
itemlist = set_context(itemlist)
return itemlist
def new_search(item):
logger.debug()
temp_search_file = config.get_temp_file('temp-search')
if filetools.isfile(temp_search_file):
filetools.remove(temp_search_file)
itemlist = []
if config.get_setting('last_search'):
last_search = channeltools.get_channel_setting('Last_searched', 'search', '')
else:
last_search = ''
if item.search_text:
searched_text = item.search_text
else:
searched_text = platformtools.dialog_input(default=last_search, heading='')
save_search(searched_text)
if not searched_text:
return
channeltools.set_channel_setting('Last_searched', searched_text, 'search')
searched_text = searched_text.replace("+", " ")
if item.mode == 'person':
item.searched_text = searched_text
return actor_list(item)
if item.mode != 'all':
tmdb_info = tmdb.Tmdb(searched_text=searched_text, search_type=item.mode.replace('show', ''))
results = tmdb_info.results
for result in results:
result = tmdb_info.get_infoLabels(result, origen=result)
if item.mode == 'movie':
title = result['title']
else:
title = result['name']
item.mode = 'tvshow'
thumbnail = result.get('thumbnail', '')
fanart = result.get('fanart', '')
new_item = Item(channel=item.channel,
action='channel_search',
title=title,
text=searched_text,
thumbnail=thumbnail,
fanart=fanart,
mode=item.mode,
contentType=item.mode,
infoLabels=result)
if item.mode == 'movie':
new_item.contentTitle = result['title']
else:
new_item.contentSerieName = result['name']
itemlist.append(new_item)
if item.mode == 'all' or not itemlist:
return channel_search(Item(channel=item.channel,
title=searched_text,
text=searched_text,
mode='all',
infoLabels={}))
return itemlist
def channel_search(item):
logger.debug(item)
start = time.time()
searching = list()
searching_titles = list()
results = list()
valid = list()
ch_list = dict()
mode = item.mode
if item.infoLabels['tvshowtitle']:
item.text = item.infoLabels['tvshowtitle'].split(' - ')[0]
item.title = item.text
elif item.infoLabels['title']:
item.text = item.infoLabels['title'].split(' - ')[0]
item.title = item.text
temp_search_file = config.get_temp_file('temp-search')
if filetools.isfile(temp_search_file):
itemlist = []
f = filetools.read(temp_search_file)
if f.startswith(item.text):
for it in f.split(','):
if it and it != item.text:
itemlist.append(Item().fromurl(it))
return itemlist
else:
filetools.remove(temp_search_file)
searched_id = item.infoLabels['tmdb_id']
channel_list, channel_titles = get_channels(item)
searching += channel_list
searching_titles += channel_titles
cnt = 0
progress = platformtools.dialog_progress(config.get_localized_string(30993) % item.title, config.get_localized_string(70744) % len(channel_list) + '\n' + ', '.join(searching_titles))
config.set_setting('tmdb_active', False)
search_action_list = []
module_dict = {}
for ch in channel_list:
try:
module = __import__('channels.%s' % ch, fromlist=["channels.%s" % ch])
mainlist = getattr(module, 'mainlist')(Item(channel=ch, global_search=True))
module_dict[ch] = module
search_action_list.extend([elem for elem in mainlist if
elem.action == "search" and (mode == 'all' or elem.contentType in [mode, 'undefined'])])
if progress.iscanceled():
return []
except:
import traceback
logger.error('error importing/getting search items of ' + ch)
logger.error(traceback.format_exc())
total_search_actions = len(search_action_list)
with futures.ThreadPoolExecutor(max_workers=set_workers()) as executor:
c_results = []
for search_action in search_action_list:
c_results.append(executor.submit(get_channel_results, item, module_dict, search_action))
if progress.iscanceled():
break
for res in futures.as_completed(c_results):
search_action = res.result()[0]
channel = search_action.channel
if res.result()[1]:
if channel not in ch_list:
ch_list[channel] = []
ch_list[channel].extend(res.result()[1])
if res.result()[2]:
valid.extend(res.result()[2])
if progress.iscanceled():
break
search_action_list.remove(search_action)
# if no action of this channel remains
for it in search_action_list:
if it.channel == channel:
break
else:
cnt += 1
searching_titles.remove(searching_titles[searching.index(channel)])
searching.remove(channel)
progress.update(old_div(((total_search_actions - len(search_action_list)) * 100), total_search_actions), config.get_localized_string(70744) % str(len(channel_list) - cnt) + '\n' + ', '.join(searching_titles))
progress.close()
cnt = 0
progress = platformtools.dialog_progress(config.get_localized_string(30993) % item.title, config.get_localized_string(60295) + '\n' + config.get_localized_string(60293))
config.set_setting('tmdb_active', True)
# res_count = 0
for key, value in ch_list.items():
ch_name = channel_titles[channel_list.index(key)]
grouped = list()
cnt += 1
progress.update(old_div((cnt * 100), len(ch_list)), config.get_localized_string(60295))
for it in value:
if it.channel == item.channel:
it.channel = key
if it in valid:
continue
if mode == 'all' or (it.contentType and mode == it.contentType):
if config.get_setting('result_mode') != 0:
if config.get_localized_string(30992) not in it.title:
it.title += typo(ch_name,'_ [] color kod bold')
results.append(it)
else:
grouped.append(it)
elif (mode == 'movie' and it.contentTitle) or (mode == 'tvshow' and (it.contentSerieName or it.show)):
grouped.append(it)
else:
continue
if not grouped:
continue
# to_temp[key] = grouped
if config.get_setting('result_mode') == 0:
if not config.get_setting('unify'):
title = typo(ch_name,'bold') + typo(str(len(grouped)), '_ [] color kod bold')
else:
title = typo('%s %s' % (len(grouped), config.get_localized_string(70695)), 'bold')
# res_count += len(grouped)
plot=''
for it in grouped:
plot += it.title +'\n'
ch_thumb = channeltools.get_channel_parameters(key)['thumbnail']
results.append(Item(channel='search', title=title,
action='get_from_temp', thumbnail=ch_thumb, itemlist=[ris.tourl() for ris in grouped], plot=plot, page=1))
progress.close()
# "All Together" and movie mode -> search servers
if config.get_setting('result_mode') == 1 and mode == 'movie':
progress = platformtools.dialog_progress(config.get_localized_string(30993) % item.title, config.get_localized_string(60683))
valid_servers = []
with futures.ThreadPoolExecutor(max_workers=set_workers()) as executor:
c_results = [executor.submit(get_servers, v, module_dict) for v in valid]
completed = 0
for res in futures.as_completed(c_results):
if progress.iscanceled():
break
if res.result():
completed += 1
valid_servers.extend(res.result())
progress.update(old_div(completed * 100, len(valid)))
valid = valid_servers
progress.close()
# send_to_temp(to_temp)
results = sorted(results, key=lambda it: it.title)
results_statistic = config.get_localized_string(59972) % (item.title, time.time() - start)
if mode == 'all':
results.insert(0, Item(title=typo(results_statistic, 'color kod bold'), thumbnail=thumb('search')))
else:
if not valid:
valid.append(Item(title=config.get_localized_string(60347), thumbnail=thumb('nofolder')))
valid.insert(0, Item(title=typo(results_statistic, 'color kod bold'), thumbnail=thumb('search')))
results.insert(0, Item(title=typo(config.get_localized_string(30025), 'color kod bold'), thumbnail=thumb('search')))
# logger.debug(results_statistic)
itlist = valid + results
writelist = item.text
for it in itlist:
writelist += ',' + it.tourl()
filetools.write(temp_search_file, writelist)
return itlist
def get_channel_results(item, module_dict, search_action):
ch = search_action.channel
results = list()
valid = list()
module = module_dict[ch]
searched_id = item.infoLabels['tmdb_id']
try:
results.extend(module.search(search_action, item.text))
if len(results) == 1:
if not results[0].action or config.get_localized_string(70006).lower() in results[0].title.lower():
results.clear()
if item.mode != 'all':
for elem in results:
if not elem.infoLabels.get('year', ""):
elem.infoLabels['year'] = '-'
tmdb.set_infoLabels_item(elem)
if elem.infoLabels['tmdb_id'] == searched_id:
elem.from_channel = ch
if not config.get_setting('unify'):
elem.title += ' [%s]' % ch
valid.append(elem)
# if len(results) < 0 and len(results) < max_results and item.mode != 'all':
#
# if len(results) == 1:
# if not results[0].action or config.get_localized_string(30992).lower() in results[0].title.lower():
# return [ch, []]
#
# results = get_info(results)
return [search_action, results, valid]
except:
return [search_action, results, valid]
def get_servers(item, module_dict):
item.global_search = True
ch = item.channel
results = list()
module = module_dict[ch]
try:
results = getattr(module, item.action)(item)
except:
import traceback
logger.error(traceback.format_exc())
return [r.clone(title=r.title + typo(item.channel, '_ [] color kod')) for r in results if r.action == 'play']
def get_info(itemlist):
logger.debug()
tmdb.set_infoLabels_itemlist(itemlist, True, forced=True)
return itemlist
def get_channels(item):
logger.debug()
channels_list = list()
title_list = list()
all_channels = channelselector.filterchannels('all')
for ch in all_channels:
channel = ch.channel
ch_param = channeltools.get_channel_parameters(channel)
if not ch_param.get("active", False):
continue
list_cat = ch_param.get("categories", [])
if not ch_param.get("include_in_global_search", False):
continue
if 'anime' in list_cat:
n = list_cat.index('anime')
list_cat[n] = 'tvshow'
if item.mode == 'all' or (item.mode in list_cat):
if config.get_setting("include_in_global_search", channel) and ch_param.get("active", False):
channels_list.append(channel)
title_list.append(ch_param.get('title', channel))
return channels_list, title_list
def settings(item):
return platformtools.show_channel_settings(caption=config.get_localized_string(59993))
def set_workers():
workers = config.get_setting('thread_number') if config.get_setting('thread_number') > 0 else None
return workers
def setting_channel_new(item):
import xbmcgui
# Load list of options (active user channels that allow global search)
lista = []
ids = []
lista_lang = []
lista_ctgs = []
channels_list = channelselector.filterchannels('all')
for channel in channels_list:
if channel.action == '':
continue
channel_parameters = channeltools.get_channel_parameters(channel.channel)
# Do not include if "include_in_global_search" does not exist in the channel configuration
if not channel_parameters['include_in_global_search']:
continue
lbl = '%s' % channel_parameters['language']
lbl += ' %s' % ', '.join(config.get_localized_category(categ) for categ in channel_parameters['categories'])
it = xbmcgui.ListItem(channel.title, lbl)
it.setArt({'thumb': channel.thumbnail, 'fanart': channel.fanart})
lista.append(it)
ids.append(channel.channel)
lista_lang.append(channel_parameters['language'])
lista_ctgs.append(channel_parameters['categories'])
# Pre-select dialog
preselecciones = [
config.get_localized_string(70570),
config.get_localized_string(70571),
# 'Modificar partiendo de Recomendados',
# 'Modificar partiendo de Frecuentes',
config.get_localized_string(70572),
config.get_localized_string(70573),
# 'Modificar partiendo de Castellano',
# 'Modificar partiendo de Latino'
]
# presel_values = ['skip', 'actual', 'recom', 'freq', 'all', 'none', 'cast', 'lat']
presel_values = ['skip', 'actual', 'all', 'none']
categs = ['movie', 'tvshow', 'documentary', 'anime', 'sub', 'live', 'torrent']
for c in categs:
preselecciones.append(config.get_localized_string(70577) + config.get_localized_category(c))
presel_values.append(c)
if item.action == 'setting_channel': # Configuración de los canales incluídos en la búsqueda
del preselecciones[0]
del presel_values[0]
# else: # Call from "search on other channels" (you can skip the selection and go directly to the search)
ret = platformtools.dialog_select(config.get_localized_string(59994), preselecciones)
if ret == -1:
return False # order cancel
if presel_values[ret] == 'skip':
return True # continue unmodified
elif presel_values[ret] == 'none':
preselect = []
elif presel_values[ret] == 'all':
preselect = list(range(len(ids)))
elif presel_values[ret] in ['cast', 'lat']:
preselect = []
for i, lg in enumerate(lista_lang):
if presel_values[ret] in lg or '*' in lg:
preselect.append(i)
elif presel_values[ret] == 'actual':
preselect = []
for i, canal in enumerate(ids):
channel_status = config.get_setting('include_in_global_search', canal)
if channel_status:
preselect.append(i)
elif presel_values[ret] == 'recom':
preselect = []
for i, canal in enumerate(ids):
_not, set_canal_list = channeltools.get_channel_controls_settings(canal)
if set_canal_list.get('include_in_global_search', False):
preselect.append(i)
elif presel_values[ret] == 'freq':
preselect = []
for i, canal in enumerate(ids):
frequency = channeltools.get_channel_setting('frequency', canal, 0)
if frequency > 0:
preselect.append(i)
else:
preselect = []
for i, ctgs in enumerate(lista_ctgs):
if presel_values[ret] in ctgs:
preselect.append(i)
# Dialog to select
ret = platformtools.dialog_multiselect(config.get_localized_string(59994), lista, preselect=preselect, useDetails=True)
if ret == None: return False # order cancel
seleccionados = [ids[i] for i in ret]
# Save changes to search channels
for canal in ids:
channel_status = config.get_setting('include_in_global_search', canal)
# if not channel_status:
# channel_status = True
if channel_status and canal not in seleccionados:
config.set_setting('include_in_global_search', False, canal)
elif not channel_status and canal in seleccionados:
config.set_setting('include_in_global_search', True, canal)
return True
def genres_menu(item):
itemlist = []
mode = item.mode.replace('show', '')
genres = tmdb.get_dic_genres(mode)
for key, value in list(genres[mode].items()):
discovery = {'url': 'discover/%s' % mode, 'with_genres': key,
'language': def_lang, 'page': '1'}
itemlist.append(Item(channel=item.channel, title=typo(value, 'bold'), page=1,
action='discover_list', discovery=discovery,
mode=item.mode))
from core import support
support.thumb(itemlist, mode='genre')
return sorted(itemlist, key=lambda it: it.title)
def years_menu(item):
import datetime
itemlist = []
mode = item.mode.replace('show', '')
par_year = 'primary_release_year'
thumb = thumb('movie_year')
if mode != 'movie':
par_year = 'first_air_date_year'
thumb = thumb('tvshow_year')
c_year = datetime.datetime.now().year + 1
l_year = c_year - 31
for year in range(l_year, c_year):
discovery = {'url': 'discover/%s' % mode, 'page': '1',
'%s' % par_year: '%s' % year,
'sort_by': 'popularity.desc', 'language': def_lang}
itemlist.append(Item(channel=item.channel, title=typo(str(year), 'bold'), action='discover_list',
discovery=discovery, mode=item.mode, year_=str(year), thumbnail=thumb))
itemlist.reverse()
itemlist.append(Item(channel=item.channel, title=typo(config.get_localized_string(70745),'color kod bold'), url='',
action="year_cus", mode=item.mode, par_year=par_year))
return itemlist
def year_cus(item):
mode = item.mode.replace('show', '')
heading = config.get_localized_string(70042)
year = platformtools.dialog_numeric(0, heading, default="")
item.discovery = {'url': 'discover/%s' % mode, 'page': '1',
'%s' % item.par_year: '%s' % year,
'sort_by': 'popularity.desc', 'language': def_lang}
item.action = "discover_list"
if year and len(year) == 4:
return discover_list(item)
def actor_list(item):
itemlist = []
dict_ = {'url': 'search/person', 'language': def_lang, 'query': item.searched_text, 'page': item.page}
prof = {'Acting': 'Actor', 'Directing': 'Director', 'Production': 'Productor'}
plot = ''
item.search_type = 'person'
tmdb_inf = tmdb.discovery(item, dict_=dict_)
results = tmdb_inf.results
if not results:
return results
for elem in results:
name = elem.get('name', '')
if not name:
continue
rol = elem.get('known_for_department', '')
rol = prof.get(rol, rol)
# genero = elem.get('gender', 0)
# if genero == 1 and rol in prof:
# rol += 'a'
# rol = rol.replace('Actora', 'Actriz')
know_for = elem.get('known_for', '')
cast_id = elem.get('id', '')
if know_for:
t_k = know_for[0].get('title', '')
if t_k:
plot = '%s in %s' % (rol, t_k)
thumbnail = 'https://image.tmdb.org/t/p/original%s' % elem.get('profile_path', '')
title = typo(name,'bold')+typo(rol,'_ [] color kod bold')
discovery = {'url': 'person/%s/combined_credits' % cast_id, 'page': '1',
'sort_by': 'primary_release_date.desc', 'language': def_lang}
itemlist.append(Item(channel=item.channel, title=title, action='discover_list', cast_='cast',
discovery=discovery, thumbnail=thumbnail, plot=plot, page=1))
if len(results) > 19:
next_ = item.page + 1
itemlist.append(Item(channel=item.channel, title=typo(config.get_localized_string(30992),'bold color kod'), action='actor_list',
page=next_, thumbnail=thumbnail,
searched_text=item.searched_text))
return itemlist
def discover_list(item):
import datetime
itemlist = []
year = 0
tmdb_inf = tmdb.discovery(item, dict_=item.discovery, cast=item.cast_)
result = tmdb_inf.results
tvshow = False
for elem in result:
elem = tmdb_inf.get_infoLabels(elem, origen=elem)
if 'title' in elem:
title = unify.normalize(elem['title']).capitalize()
else:
title = unify.normalize(elem['name']).capitalize()
tvshow = True
elem['tmdb_id'] = elem['id']
mode = item.mode or elem['mediatype']
thumbnail = elem.get('thumbnail', '')
fanart = elem.get('fanart', '')
if item.cast_:
release = elem.get('release_date', '0000') or elem.get('first_air_date', '0000')
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 config.get_setting('new_search'):
new_item = Item(channel='globalsearch', title=typo(title, 'bold'), infoLabels=elem,
action='Search', text=title,
thumbnail=thumbnail, fanart=fanart,
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:
new_item.contentSerieName = title
else:
new_item.contentTitle = title
itemlist.append(new_item)
itemlist = set_context(itemlist)
if item.cast_:
itemlist.sort(key=lambda it: int(it.release_date), reverse=True)
return itemlist
elif len(result) > 19 and item.discovery:
item.discovery['page'] = str(int(item.discovery['page']) + 1)
itemlist.append(Item(channel=item.channel, action='discover_list', nextPage=True,
title=typo(config.get_localized_string(30992), 'color kod bold'),
list_type=item.list_type, discovery=item.discovery, thumbnail=thumb(), page=item.discovery['page']))
elif len(result) > 19:
next_page = str(int(item.page) + 1)
itemlist.append(Item(channel=item.channel, action='discover_list', nextPage=True,
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, thumbnail=thumb()))
return itemlist
def from_context(item):
logger.debug()
select = setting_channel_new(item)
if not select:
return
if 'infoLabels' in item and 'mediatype' in item.infoLabels:
item.mode = item.infoLabels['mediatype']
else:
return
if config.get_setting('new_search'):
from specials import globalsearch
if item.infoLabels['tmdb_id']:
item.type = item.mode
item.mode = 'search'
return globalsearch.Search(item)
if 'list_type' not in item:
if 'wanted' in item:
item.title = item.wanted
return channel_search(item)
return discover_list(item)
def set_context(itemlist):
logger.debug()
for elem in itemlist:
elem.context = [{"title": config.get_localized_string(60412),
"action": "setting_channel_new",
"channel": "search"},
{"title": config.get_localized_string(60415),
"action": "settings",
"channel": "search"},
{"title": config.get_localized_string(60416),
"action": "clear_saved_searches",
"channel": "search"}]
return itemlist
def get_from_temp(item):
logger.debug()
n = 30
nTotal = len(item.itemlist)
nextp = n * item.page
prevp = n * (item.page - 1)
results = [Item().fromurl(elem) for elem in item.itemlist[prevp:nextp]]
if nextp < nTotal:
results.append(Item(channel='search', title=typo(config.get_localized_string(30992), 'bold color kod'),
action='get_from_temp', itemlist=item.itemlist, page=item.page + 1, nextPage=True))
tmdb.set_infoLabels_itemlist(results, True)
for elem in results:
if not elem.infoLabels.get('year', ""):
elem.infoLabels['year'] = '-'
tmdb.set_infoLabels_item(elem, True)
return results
def save_search(text):
if text:
saved_searches_limit = config.get_setting("saved_searches_limit")
current_saved_searches_list = config.get_setting("saved_searches_list", "search")
if current_saved_searches_list is None:
saved_searches_list = []
else:
saved_searches_list = list(current_saved_searches_list)
if text in saved_searches_list:
saved_searches_list.remove(text)
saved_searches_list.insert(0, text)
config.set_setting("saved_searches_list", saved_searches_list[:saved_searches_limit], "search")
def clear_saved_searches(item):
config.set_setting("saved_searches_list", list(), "search")
platformtools.dialog_ok(config.get_localized_string(60423), config.get_localized_string(60424))
def get_saved_searches():
current_saved_searches_list = config.get_setting("saved_searches_list", "search")
if current_saved_searches_list is None:
+1 -1
View File
@@ -30,7 +30,7 @@
]
},
{
"id": "tmdb_alternativo",
"id": "tmdbfallback",
"type": "list",
"label": "@70426",
"default": 6,
+53 -2951
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -413,7 +413,7 @@ def findvideos(item):
if config.get_setting('autoplay'):
itemlist = autoplay.start(itemlist, item)
else:
servertools.sort_servers(itemlist)
itemlist = servertools.sort_servers(itemlist)
if config.get_setting('checklinks') and not config.get_setting('autoplay'):
itemlist = servertools.check_list_links(itemlist, config.get_setting('checklinks_number'))