Fix vari
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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']
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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']))
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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,23 +481,24 @@ def render_items(itemlist, parent_item):
|
||||
|
||||
|
||||
def viewmodeMonitor():
|
||||
try:
|
||||
currentModeName = xbmc.getInfoLabel('Container.Viewmode')
|
||||
win = xbmcgui.Window(xbmcgui.getCurrentWindowId())
|
||||
currentMode = int(win.getFocusId())
|
||||
if currentModeName and 'plugin.video.kod' in xbmc.getInfoLabel('Container.FolderPath') and currentMode < 1000 and currentMode >= 50: # inside addon and in itemlist view
|
||||
content, Type = getCurrentView()
|
||||
if content:
|
||||
defaultMode = int(config.get_setting('view_mode_%s' % content).split(',')[-1])
|
||||
if currentMode != defaultMode:
|
||||
logger.debug('viewmode changed: ' + currentModeName + '-' + str(currentMode) + ' - content: ' + content)
|
||||
config.set_setting('view_mode_%s' % content, currentModeName + ', ' + str(currentMode))
|
||||
dialog_notification(config.get_localized_string(70153),
|
||||
config.get_localized_string(70187) % (content, currentModeName),
|
||||
sound=False)
|
||||
except:
|
||||
import traceback
|
||||
logger.error(traceback.print_exc())
|
||||
if get_window() == 'WINDOW_VIDEO_NAV':
|
||||
try:
|
||||
currentModeName = xbmc.getInfoLabel('Container.Viewmode')
|
||||
win = xbmcgui.Window(xbmcgui.getCurrentWindowId())
|
||||
currentMode = int(win.getFocusId())
|
||||
if currentModeName and 'plugin.video.kod' in xbmc.getInfoLabel('Container.FolderPath') and currentMode < 1000 and currentMode >= 50: # inside addon and in itemlist view
|
||||
content, Type = getCurrentView()
|
||||
if content:
|
||||
defaultMode = int(config.get_setting('view_mode_%s' % content).split(',')[-1])
|
||||
if currentMode != defaultMode:
|
||||
logger.debug('viewmode changed: ' + currentModeName + '-' + str(currentMode) + ' - content: ' + content)
|
||||
config.set_setting('view_mode_%s' % content, currentModeName + ', ' + str(currentMode))
|
||||
dialog_notification(config.get_localized_string(70153),
|
||||
config.get_localized_string(70187) % (content, currentModeName),
|
||||
sound=False)
|
||||
except:
|
||||
import traceback
|
||||
logger.error(traceback.print_exc())
|
||||
|
||||
|
||||
def getCurrentView(item=None, parent_item=None):
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -286,7 +294,7 @@ def mark_content_as_watched_on_kodi(item, value=1):
|
||||
payload = {"jsonrpc": "2.0", "method": "VideoLibrary.RemoveTVShow", "id": 1, "params": {"tvshowid": tvshowid}}
|
||||
data = get_data(payload)
|
||||
|
||||
from platformcode.dbconverter import add_video;add_video(item)
|
||||
from platformcode.dbconverter import add_video;add_video(item)
|
||||
|
||||
|
||||
def set_watched_on_kod(data):
|
||||
|
||||
@@ -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>
|
||||
<width>450</width>
|
||||
<height>60</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>
|
||||
<control type="textbox">
|
||||
<visible>!ListItem.Property(quality)</visible>
|
||||
<description>Server Title</description>
|
||||
<left>150</left>
|
||||
<top>35</top>
|
||||
<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>
|
||||
<label>[B]$INFO[ListItem.Label][/B]</label>
|
||||
</control>
|
||||
<control type="textbox">
|
||||
<description>No 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>$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>
|
||||
<width>450</width>
|
||||
<height>60</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>
|
||||
<control type="textbox">
|
||||
<visible>!ListItem.Property(quality)</visible>
|
||||
<description>Server Title</description>
|
||||
<left>150</left>
|
||||
<top>35</top>
|
||||
<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>
|
||||
<label>[B]$INFO[ListItem.Label][/B]</label>
|
||||
</control>
|
||||
<control type="textbox">
|
||||
<description>No 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>$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,60 +798,52 @@
|
||||
<visible>Control.IsVisible(4)</visible>
|
||||
</control>
|
||||
|
||||
<control type="textbox">
|
||||
<description>Load Channels</description>
|
||||
<top>300</top>
|
||||
<left>0</left>
|
||||
<width>100%</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>
|
||||
<height>40</height>
|
||||
<width>40</width>
|
||||
<onleft>504</onleft>
|
||||
<onright>503</onright>
|
||||
<texturefocus colordiffuse="FFFFFFFF">menu.png</texturefocus>
|
||||
<texturenofocus colordiffuse="80FFFFFF">menu.png</texturenofocus>
|
||||
<visible>Integer.IsGreater(Container(101).NumItems, 0)</visible>
|
||||
</control>
|
||||
|
||||
<control type="button" id="503">
|
||||
<description>Back</description>
|
||||
<top>30</top>
|
||||
<right>70</right>
|
||||
<height>40</height>
|
||||
<width>40</width>
|
||||
<onleft>502</onleft>
|
||||
<onright>504</onright>
|
||||
<texturefocus colordiffuse="FFFFFFFF">left.png</texturefocus>
|
||||
<texturenofocus colordiffuse="80FFFFFF">left.png</texturenofocus>
|
||||
</control>
|
||||
|
||||
<control type="button" id="504">
|
||||
<description>Close</description>
|
||||
<control type="group">
|
||||
<description>Buttons Group</description>
|
||||
<top>30</top>
|
||||
<right>30</right>
|
||||
<width>150</width>
|
||||
<height>40</height>
|
||||
<width>40</width>
|
||||
<onleft>503</onleft>
|
||||
<onright>502</onright>
|
||||
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
|
||||
<texturenofocus colordiffuse="80FFFFFF">close.png</texturenofocus>
|
||||
<control type="button" id="502">
|
||||
<description>Menu</description>
|
||||
<top>0</top>
|
||||
<right>80</right>
|
||||
<height>40</height>
|
||||
<width>40</width>
|
||||
<onleft>504</onleft>
|
||||
<onright>503</onright>
|
||||
<texturefocus colordiffuse="FFFFFFFF">menu.png</texturefocus>
|
||||
<texturenofocus colordiffuse="80FFFFFF">menu.png</texturenofocus>
|
||||
<visible>Integer.IsGreater(Container(101).NumItems, 0)</visible>
|
||||
</control>
|
||||
|
||||
<control type="button" id="503">
|
||||
<description>Back</description>
|
||||
<top>0</top>
|
||||
<right>40</right>
|
||||
<height>40</height>
|
||||
<width>40</width>
|
||||
<onleft>502</onleft>
|
||||
<onright>504</onright>
|
||||
<texturefocus colordiffuse="FFFFFFFF">left.png</texturefocus>
|
||||
<texturenofocus colordiffuse="80FFFFFF">left.png</texturenofocus>
|
||||
</control>
|
||||
|
||||
<control type="button" id="504">
|
||||
<description>Close</description>
|
||||
<top>0</top>
|
||||
<right>0</right>
|
||||
<height>40</height>
|
||||
<width>40</width>
|
||||
<onleft>503</onleft>
|
||||
<onright>502</onright>
|
||||
<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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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')
|
||||
|
||||
@@ -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
|
||||
+83
-127
@@ -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,19 +146,20 @@ class SearchWindow(xbmcgui.WindowXML):
|
||||
|
||||
# wait and return as getActionsThread load
|
||||
lastLen = len(self.searchActions)
|
||||
while self.thActions.is_alive():
|
||||
while len(self.searchActions) == lastLen:
|
||||
if not self.thActions.is_alive():
|
||||
return
|
||||
time.sleep(0.1)
|
||||
yield self.searchActions[lastLen-1]
|
||||
lastLen = len(self.searchActions)
|
||||
if self.thActions:
|
||||
while self.thActions.is_alive():
|
||||
while len(self.searchActions) == lastLen:
|
||||
if not self.thActions.is_alive():
|
||||
return
|
||||
time.sleep(0.1)
|
||||
yield self.searchActions[lastLen-1]
|
||||
lastLen = len(self.searchActions)
|
||||
|
||||
def select(self):
|
||||
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,27 +480,18 @@ 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',
|
||||
'results': str(len(results))
|
||||
})
|
||||
for result in results:
|
||||
resultsList += result.tourl() + '|'
|
||||
item.setProperty('items',resultsList)
|
||||
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))
|
||||
item = xbmcgui.ListItem(name)
|
||||
item.setArt({'poster':channelParams['thumbnail']})
|
||||
item.setProperties({'position': '0',
|
||||
'results': str(len(results))
|
||||
})
|
||||
for result in results:
|
||||
resultsList += result.tourl() + '|'
|
||||
item.setProperties({'items': resultsList, 'results': str(len(resultsList.split('|')) - 1)})
|
||||
self.results[name] = len(self.results)
|
||||
self.channels.append(item)
|
||||
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,25 +525,18 @@ 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
|
||||
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_']:
|
||||
self.select()
|
||||
elif self.item.mode in ['person']:
|
||||
self.actors()
|
||||
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', 'filmography']:
|
||||
self.select()
|
||||
elif self.item.mode in ['person']:
|
||||
self.actors()
|
||||
|
||||
def Focus(self, focusid):
|
||||
if focusid in [SEARCH]:
|
||||
@@ -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():
|
||||
|
||||
+155
-781
@@ -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:
|
||||
@@ -835,4 +209,4 @@ def get_saved_searches():
|
||||
else:
|
||||
saved_searches_list = list(current_saved_searches_list)
|
||||
|
||||
return saved_searches_list
|
||||
return saved_searches_list
|
||||
@@ -30,7 +30,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "tmdb_alternativo",
|
||||
"id": "tmdbfallback",
|
||||
"type": "list",
|
||||
"label": "@70426",
|
||||
"default": 6,
|
||||
|
||||
+53
-2951
File diff suppressed because it is too large
Load Diff
@@ -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'))
|
||||
|
||||
Reference in New Issue
Block a user