diff --git a/channels/cinemalibero.py b/channels/cinemalibero.py
index 520c654c..3cabff10 100644
--- a/channels/cinemalibero.py
+++ b/channels/cinemalibero.py
@@ -77,8 +77,8 @@ def peliculas(item):
item.title += support.typo(item.lang2, '_ [] color kod')
if item.args == 'update':
item.title = item.title.replace('-', ' ')
- # if item.args == 'search':
- # item.contentType = 'tvshow' if 'serie-' in item.url else 'movie'
+ if item.args == 'search':
+ item.contentType = 'undefined'
return item
@@ -123,6 +123,7 @@ def genres(item):
def search(item, texto):
logger.debug(item.url,texto)
+ item.contentType = 'undefined'
texto = texto.replace(' ', '+')
item.url = host + "/?s=" + texto
# item.contentType = 'tv'
diff --git a/core/support.py b/core/support.py
index 40abaf5d..cb160bc5 100755
--- a/core/support.py
+++ b/core/support.py
@@ -155,14 +155,16 @@ class scrape:
return self.itemlist
def _scrape(self, item):
-
if item.itemlist:
scrapingTime = time()
self.itemlist = itemlistdb()
self.seasons = item.allSeasons
+
else:
for n in range(2):
logger.debug('PATRON= ', self.patron)
+ if self.data and item.data:
+ item.data = ''
if not self.data:
page = httptools.downloadpage(item.url, headers=self.headers, ignore_response_code=True)
item.url = page.url # might be a redirect
@@ -230,7 +232,7 @@ class scrape:
if self.numerationEnabled and inspect.stack()[1][3] not in ['find_episodes']:
from platformcode import autorenumber
if self.function == 'episodios':
- autorenumber.start(self.itemlist, self.item)
+ autorenumber.start(self.itemlist, item)
for i in self.itemlist:
if i.contentSeason and i.contentSeason not in self.seasons:
@@ -336,7 +338,7 @@ class scrape:
if self.function == 'episodios':
infolabels = item.infoLabels
else:
- infolabels = {}
+ infolabels = {'mediatype':item.contentType}
if self.itemParams.year:
infolabels['year'] = self.itemParams.year
if self.itemParams.plot:
@@ -447,17 +449,17 @@ class scrape:
if (not self.itemParams.title or self.itemParams.title not in self.blacklist) and (self.search.lower() in self.itemParams.title.lower()):
it = item.clone(title=self.itemParams.title,
- fulltitle=self.itemParams.title,
- show=self.itemParams.title,
- infoLabels=self.itemParams.infoLabels,
- contentSeason= self.itemParams.infoLabels.get('season', ''),
- contentEpisodeNumber= self.itemParams.infoLabels.get('episode', ''),
- grouped = self.group,
- episode2 = self.itemParams.second_episode,
- extraInfo = self.itemParams.extraInfo,
- disable_videolibrary = not self.args.get('addVideolibrary', True),
- size = self.itemParams.size,
- seed = self.itemParams.seed)
+ fulltitle=self.itemParams.title,
+ show=self.itemParams.title,
+ infoLabels=self.itemParams.infoLabels,
+ contentSeason= self.itemParams.infoLabels.get('season', ''),
+ contentEpisodeNumber= self.itemParams.infoLabels.get('episode', ''),
+ grouped = self.group,
+ episode2 = self.itemParams.second_episode,
+ extraInfo = self.itemParams.extraInfo,
+ disable_videolibrary = not self.args.get('addVideolibrary', True),
+ size = self.itemParams.size,
+ seed = self.itemParams.seed)
if self.itemParams.url: it.url = self.itemParams.url
if self.function == 'episodios': it.fulltitle = it.show = self.itemParams.title
@@ -899,22 +901,24 @@ def nextPage(itemlist, item, function_or_level=1, **kwargs):
def pagination(itemlist, item, function_level=1):
if 'channel_search' in [s[3] for s in inspect.stack()]:
return itemlist
- itemlistdb(itemlist)
- page = item.page if item.page else 1
+
+ if not item.page:
+ item.page = 1
perpage = config.get_setting('pagination', default=20)
action = function_level if type(function_level) == str else inspect.stack()[function_level][3]
itlist = []
for i, it in enumerate(itemlist):
- if perpage and (page - 1) * perpage > i: continue # pagination
- if perpage and i >= page * perpage: break # pagination
+ if perpage and (item.page - 1) * perpage > i: continue # pagination
+ if perpage and i >= item.page * perpage: break # pagination
itlist.append(it)
- if len(itemlist) >= page * perpage:
+ if len(itemlist) >= item.page * perpage:
+ itemlistdb(itemlist)
itlist.append(
item.clone(channel=item.channel,
action=action,
contentType=item.contentType,
title=typo(config.get_localized_string(30992), 'color kod bold'),
- page=page + 1,
+ page=item.page + 1,
total_pages=round(len(itemlist)/perpage),
nextPage = True,
itemlist = True,
@@ -926,7 +930,7 @@ def pagination(itemlist, item, function_level=1):
def season_pagination(itemlist, item, seasons, function_level=1):
if 'channel_search' in [s[3] for s in inspect.stack()]:
return itemlist
- itemlistdb(itemlist)
+
action = function_level if type(function_level) == str else inspect.stack()[function_level][3]
itlist = []
if itemlist and not seasons:
@@ -936,8 +940,10 @@ def season_pagination(itemlist, item, seasons, function_level=1):
seasons.append(it.contentSeason)
if seasons:
+ itemlistdb(itemlist)
seasons.sort()
- if not item.nextSeason: item.nextSeason = 0
+ if not item.nextSeason:
+ item.nextSeason = 0
try:
current = seasons[item.nextSeason]
@@ -949,22 +955,24 @@ def season_pagination(itemlist, item, seasons, function_level=1):
if item.nextSeason + 1 < len(seasons):
itlist.append(
- item.clone(action=action,
- title=typo('Stagione Successiva [{}]'.format(seasons[item.nextSeason + 1]), 'bold'),
- allSeasons = seasons,
- nextSeason = item.nextSeason + 1,
- itemlist = True,
- prevthumb = item.thumbnail,
- thumbnail=thumb()))
+ Item(channel=item.channel,
+ action=action,
+ title=typo('Stagione Successiva [{}]'.format(seasons[item.nextSeason + 1]), 'bold'),
+ allSeasons = seasons,
+ nextSeason = item.nextSeason + 1,
+ itemlist = True,
+ prevthumb = item.thumbnail,
+ thumbnail=thumb()))
itlist.append(
- item.clone(action='gotoseason',
- real_action=action,
- title=typo('Vai alla stagione…', 'bold'),
- allSeasons = seasons,
- nextSeason = item.nextSeason + 1,
- itemlist = True,
- prevthumb = item.thumbnail,
- thumbnail=thumb()))
+ Item(channel=item.channel,
+ action='gotoseason',
+ real_action=action,
+ title=typo('Vai alla stagione…', 'bold'),
+ allSeasons = seasons,
+ nextSeason = item.nextSeason + 1,
+ itemlist = True,
+ prevthumb = item.thumbnail,
+ thumbnail=thumb()))
return itlist
except:
return itemlist
@@ -1015,6 +1023,7 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
videoitem.channel = item.channel
videoitem.fulltitle = item.fulltitle
videoitem.show = item.show
+ videoitem.ch_name = channeltools.get_channel_parameters(item.channel)['title']
if not videoitem.video_urls: videoitem.thumbnail = item.thumbnail
videoitem.contentType = item.contentType
videoitem.infoLabels = item.infoLabels
diff --git a/core/tmdb.py b/core/tmdb.py
index 7beac2c5..344580f7 100644
--- a/core/tmdb.py
+++ b/core/tmdb.py
@@ -214,7 +214,7 @@ def set_infoLabels_itemlist(itemlist, seekTmdb=False, search_language=def_lang,
logger.error(traceback.format_exc(1))
return (_i, _item, ret)
-
+ # from core.support import dbg;dbg()
# for i, item in enumerate(itemlist):
# r_list.append(sub_thread(item, i, seekTmdb))
with futures.ThreadPoolExecutor() as executor:
@@ -248,11 +248,11 @@ def set_infoLabels_item(item, seekTmdb=True, search_language=def_lang):
def read_data(otmdb_aux):
# item.infoLabels = otmdb_aux.get_infoLabels(item.infoLabels)
infoLabels = otmdb_aux.get_infoLabels(item.infoLabels)
- if not infoLabels['plot']: infoLabels['plot'] = otmdb_aux.get_plot('en')
+ if not infoLabels.get('plot'): infoLabels['plot'] = otmdb_aux.get_plot('en')
item.infoLabels = infoLabels
if item.infoLabels.get('thumbnail'):
item.thumbnail = item.infoLabels['thumbnail']
- if item.infoLabels['fanart']:
+ if item.infoLabels.get('fanart'):
item.fanart = item.infoLabels['fanart']
if seekTmdb:
@@ -290,6 +290,7 @@ def set_infoLabels_item(item, seekTmdb=True, search_language=def_lang):
if episode:
# Update data
read_data(otmdb_global)
+ item.infoLabels['mediatype'] = 'episode'
if episode.get('episode_title'):
item.infoLabels['title'] = episode['episode_title']
if episode.get('episode_plot'):
@@ -409,11 +410,11 @@ def set_infoLabels_item(item, seekTmdb=True, search_language=def_lang):
# If the search has been successful and you are not looking for a list of items,
# carry out another search to expand the information
if search_type == 'multi':
- search_type = 'movie' if otmdb.result.get('media_type') else 'tv'
+ search_type = otmdb.result.get('media_type')
+
otmdb = Tmdb(id_Tmdb=otmdb.result.get("id"), search_type=search_type,
search_language=search_language)
-
if otmdb is not None and otmdb.get_id():
# The search has found a valid result
read_data(otmdb)
@@ -427,6 +428,7 @@ def set_infoLabels_item(item, seekTmdb=True, search_language=def_lang):
item.fulltitle = new_title
return True
# We check what type of content it is...
+ # from core.support import dbg;dbg()
if item.contentType == 'movie':
search_type = 'movie'
elif item.contentType == 'undefined': # don't know
@@ -977,6 +979,7 @@ class Tmdb(object):
self.total_results = 1
self.total_pages = 1
self.result = ResultDictDefault(result)
+ self.result['media_type'] = self.search_type.replace('tv', 'tvshow')
else:
# No search results
@@ -984,7 +987,6 @@ class Tmdb(object):
logger.debug(msg)
def __search(self, index_results=0, page=1):
- # from core.support import dbg;dbg()
self.result = ResultDictDefault()
results = []
text_simple = self.search_text.lower()
@@ -1044,6 +1046,8 @@ class Tmdb(object):
self.total_results = total_results
self.total_pages = total_pages
self.result = ResultDictDefault(self.results[index_results])
+ # self.result['mediatype'] = self.result['media_type']
+
if not config.get_setting('tmdb_plus_info'):
self.result = self.get_mpaa(self.result)
return len(self.results)
@@ -1649,7 +1653,8 @@ class Tmdb(object):
continue
if k == 'media_type':
- ret_infoLabels['mediatype'] = 'tvshow' if v == 'tv' else 'movie'
+ # from core.support import dbg;dbg()
+ ret_infoLabels['mediatype'] = v if v in ['tv', 'tvshow'] else 'movie'
elif k == 'overview':
if origen:
diff --git a/platformcode/infoplus.py b/platformcode/infoplus.py
index b964199f..0fd5eda8 100644
--- a/platformcode/infoplus.py
+++ b/platformcode/infoplus.py
@@ -65,6 +65,7 @@ class InfoPlus(xbmcgui.WindowXML):
platformtools.dialog_busy(True)
if self.item:
# Find Video Info
+
tmdb.set_infoLabels_item(self.item)
self.info = self.item.infoLabels
title = typo(self.info.get('title'), 'bold')
@@ -83,9 +84,17 @@ class InfoPlus(xbmcgui.WindowXML):
rating = self.info.get('rating', 'N/A')
color = 'FFFFFFFF' if rating == 'N/A' else 'FFDB2360' if rating < 4 else 'FFD2D531' if rating < 7 else 'FF21D07A'
self.listitem.setProperty('color',color)
+
+ info = ''
+ if self.info.get('year'): info = str(self.info.get('year'))
+ if self.info.get('duration'): info = '{}[B]•[/B]{}'.format(info, self.info.get('duration'))
+ if self.info.get('Mpaa'): info = '{}[B]•[/B]{}'.format(info, self.info.get('Mpaa'))
+ self.listitem.setProperty('info',info)
# Set infoLabels
platformtools.set_infolabels(self.listitem, self.item)
+
+
# Add Cast Info
for cast in self.info.get('castandrole',[]):
@@ -365,9 +374,9 @@ class CastWindow(xbmcgui.WindowXML):
def showImages(images, position):
xbmc.executebuiltin('Dialog.Close(all)')
- ImagesWindow('imageWindow.xml', config.get_runtime_path(), images=images, position=position)
+ return ImagesWindow('imageWindow.xml', config.get_runtime_path()).start(images=images, position=position)
class ImagesWindow(xbmcgui.WindowXMLDialog):
- def __init__(self, *args, **kwargs):
+ def start(self, *args, **kwargs):
self.images = []
self.position = kwargs.get('position')
for i, image in enumerate(kwargs.get('images', [])):
diff --git a/resources/skins/Default/720p/GlobalSearch.xml b/resources/skins/Default/720p/GlobalSearch.xml
index 766277b7..d7309149 100644
--- a/resources/skins/Default/720p/GlobalSearch.xml
+++ b/resources/skins/Default/720p/GlobalSearch.xml
@@ -11,7 +11,6 @@
-
Window Background
@@ -37,32 +36,39 @@
100%
scale
$INFO[Container(102).ListItem.Art(fanart)]
- !String.IsEmpty(Container(102).ListItem.Art(fanart))
+ !Control.IsVisible(2) + !String.IsEmpty(Container(102).ListItem.Art(fanart))
+
+
+ Episode Fanart
+ 100%
+ 100%
+ scale
+ $INFO[Container(103).ListItem.Art(thumb)]
+ Control.IsVisible(2) + !String.IsEmpty(Container(103).ListItem.Art(thumb))
+
+
+
+ Title
+ 480
+ 270
+ 1000
+ 30
+ font13
+ FFFFFFFF
+ 00000000
+
+ left
+ center
+ Conditional
-
Search Group
Control.IsVisible(1)
-
- Title
- 30
- 30
- 1000
- 30
- font13
- FFFFFFFF
- 00000000
- Integer.IsGreater(Container(101).NumItems, 0)
- left
- center
-
-
-
+
Search Result Group
Integer.IsGreater(Container(102).NumItems, 0)
- Visible
400
90
@@ -120,21 +126,6 @@
-
- String.IsEmpty(Container(102).ListItem.Property(rating))
- Item Title
- 0
- 0
- 840
- 60
- font13
- FFFFFFFF
- 00000000
-
- left
- center
-
-
Item Count
640
@@ -176,10 +167,10 @@
10
horizontal
left
-
+
Year
30
- 45
+ auto
font13
ffFFFFFF
00000000
@@ -187,7 +178,7 @@
left
center
-
+
Separator
30
10
@@ -199,10 +190,10 @@
center
center
-
+
Duration
30
- 50
+ auto
font13
ffFFFFFF
00000000
@@ -210,7 +201,7 @@
left
center
-
+
Separator
30
10
@@ -222,10 +213,10 @@
center
center
-
+
Mpaa
30
- 60
+ auto
font13
ffFFFFFF
00000000
@@ -237,14 +228,14 @@
Genre
- !String.isEmpty(Container(102).ListItem.Genre
+ !String.isEmpty(Container(102).ListItem.Genre)
0
30
600
font13
ffFFFFFF
00000000
-
+
right
center
@@ -266,11 +257,14 @@
- Conditional
- Conditional
- WindowClose
- WindowClose
-
+
+
+
+
+
+
+
+
Search Results list
70
0
@@ -318,41 +312,59 @@
-
-
- Item Poster
- 0
- 0
- 380
- 570
- $INFO[ListItem.Art(poster)]
- 10
- scale
-
-
- Item Poster
- 0
- 0
- 150
- 150
- $INFO[ListItem.Property(channelthumb)]
- 10
- scale
-
-
- Item Poster
- 0
- 0
- 150
- 150
- sub.png
- !String.IsEmpty(ListItem.Property(sub))
- 10
- scale
-
-
+
+
+ Poster
+ 70
+ 570
+ 380
+ Integer.IsGreater(Container(102).NumItems, 0)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Item Poster
+ 0
+ 0
+ 380
+ 570
+ $INFO[Container(102).ListItem.Art(poster)]
+ 10
+ scale
+
+
+ Item Poster
+ 0
+ 0
+ 150
+ 150
+ $INFO[Container(102).ListItem.Property(channelthumb)]
+ 10
+ scale
+
+
+ Item Poster
+ 0
+ 0
+ 150
+ 150
+ sub.png
+ !String.IsEmpty(Container(102).ListItem.Property(sub))
+ 10
+ scale
+
+
100%
@@ -379,7 +391,7 @@
Conditional
Integer.IsGreater(Container(101).NumItems, 0)
-
+
Chennels Bar Tab
0
575
@@ -493,37 +505,19 @@
Episodes Group
Control.IsVisible(2)
-
-
- Poster
- Control.IsVisible(2)
-
-
-
-
-
-
-
-
- 0
- 0
- 480
- 720
- $INFO[Container(102).ListItem.Art(poster)]
-
+ 520
+
+
+
+
+
+
+
+
Main Title
- Control.IsVisible(2)
-
-
-
-
-
-
-
-
- 520
+ 0
40
1150
30
@@ -535,30 +529,20 @@
-
+
Episodes List
- Control.IsVisible(2)
-
-
-
-
-
-
-
-
110
- 520
- 700
+ 50
+ 640
570
- 503
- 503
+ 503
300
Episode Title
0
20
- 660
+ 600
60
font13
FFFFFFFF
@@ -568,189 +552,111 @@
-
-
- Selected Background
- 0
- 0
- 700
- 60
- white.png
- scale
+
+
+ String.IsEmpty(ListItem.Art(thumb))
+ 100%
+ 90
+
+ Selected Background
+ 0
+ 0
+ 100%
+ 100%
+ white.png
+ scale
+
+
+ Episode Title
+ 0
+ 20
+ 600
+ 100%
+ font13
+ FF232323
+ 00000000
+ left
+ center
+
+
-
- Episode Title
- 0
- 20
- 660
- 60
- font13
- FFFFFFFF
- 00000000
- left
- center
-
+
+ !String.IsEmpty(ListItem.Art(thumb))
+ 100%
+ 90
+
+ Selected Background
+ 0
+ 0
+ 100%
+ 100%
+ white.png
+ scale
+
+
+ Selected Background
+ 0
+ 0
+ 160
+ 90
+ $INFO[ListItem.Art(thumb)]
+ scale
+
+
+ Episode Title
+ 0
+ 180
+ 480
+ 100%
+ font13
+ FF232323
+ 00000000
+ left
+ center
+
+
+
+
+ Next Season/Page
+ 380
+ 20
+ 30
+ 30
+ next.png
+ next.png
+
+
+ Previous Season/Page
+ 380
+ 0
+ 30
+ 30
+ previous.png
+ previous.png
+
-
- Servers Group
- Control.IsVisible(3)
-
- Control.IsVisible(3)
-
-
-
-
-
-
-
-
- Poster
- 0
- 0
- 480
- 720
- $INFO[Container(102).ListItem.Art(poster)]
-
-
-
- Control.IsVisible(3)
-
-
-
-
-
-
-
-
- Control.IsVisible(3)
- Main Title
- 520
- 40
- 1150
- 30
- font13
- FFFFFFFF
- 00000000
- left
- center
-
-
-
-
- Control.IsVisible(3)
-
-
-
-
-
-
-
-
- Servers List
- 40
- 520
- 700
- 570
- 503
- 503
- 300
-
-
- Servers Icon
- 5
- 5
- 120
- 120
- $INFO[ListItem.Art(poster)]
- scale
-
-
- Server Title
- 150
- 30
- 450
- 30
- font13
- FFFFFFFF
- 00000000
- left
- center
-
-
-
- Channel
- 150
- 60
- 450
- 30
- font13
- FFFFFFFF
- 00000000
- left
- center
-
-
-
-
-
- Selection Background
- 700
- 130
- white.png
- scale
-
-
- Servers Color
- 0
- 0
- 130
- 130
- white.png
- scale
-
-
- Servers Icon
- 5
- 5
- 120
- 120
- $INFO[ListItem.Art(poster)]
- scale
-
-
- Server Title
- 150
- 30
- 450
- 30
- font13
- FFFFFFFF
- 00000000
- left
- center
-
-
-
- Channel
- 150
- 60
- 450
- 30
- font13
- FFFFFFFF
- 00000000
- left
- center
-
-
-
-
-
+
+ Poster
+ Control.IsVisible(2)
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 480
+ 720
+ $INFO[Container(102).ListItem.Art(poster)]
+
@@ -780,7 +686,7 @@
right
center
Conditional
- Control.IsVisible(500)
+
@@ -795,7 +701,7 @@
center
center
- Control.IsVisible(4)
+ Control.IsVisible(3)
@@ -841,20 +747,5 @@
close.png
-
-
- Quality Tag
- 670
- 20
- 200
- 40
- font13
- FFFFFFFF
- 00000000
- right
- center
- Control.IsVisible(3)
-
-
diff --git a/resources/skins/Default/720p/InfoPlus.xml b/resources/skins/Default/720p/InfoPlus.xml
index 7001417e..4a822471 100644
--- a/resources/skins/Default/720p/InfoPlus.xml
+++ b/resources/skins/Default/720p/InfoPlus.xml
@@ -113,18 +113,18 @@
Video Info
Integer.IsGreater(Container(100).NumItems, 0)
0
- 261
+ 311
0
30
- 300
+ 100%
10
horizontal
left
-
+
Year
30
- 45
+ auto
font13
ffFFFFFF
00000000
@@ -132,7 +132,7 @@
left
center
-
+
Separator
30
10
@@ -144,10 +144,10 @@
center
center
-
+
Duration
30
- 50
+ auto
font13
ffFFFFFF
00000000
@@ -155,7 +155,7 @@
left
center
-
+
Separator
30
10
@@ -167,10 +167,10 @@
center
center
-
+
Mpaa
30
- 60
+ auto
font13
ffFFFFFF
00000000
@@ -178,22 +178,46 @@
left
center
+
+ Separator
+ 30
+ 10
+ font13
+ ffFFFFFF
+ 00000000
+ !String.IsEmpty(Container(100).ListItem.Status)
+
+ center
+ center
+
+
+ Status
+ 30
+ auto
+ font13
+ ffFFFFFF
+ 00000000
+
+ left
+ center
+
-
+
Genre
- 0
+ 40
+ 0
30
- 400
+ 100%
font13
ffFFFFFF
00000000
- right
+ left
center
Plot
- 50
+ 90
0
200
font13
@@ -206,7 +230,7 @@
Separator
- 260
+ 310
0
0.5
white.png
@@ -439,7 +463,7 @@
240
0
0.5
- white.pngù
+ white.png
diff --git a/resources/skins/Default/720p/Servers.xml b/resources/skins/Default/720p/Servers.xml
index 28cc2383..6a6a8475 100644
--- a/resources/skins/Default/720p/Servers.xml
+++ b/resources/skins/Default/720p/Servers.xml
@@ -99,15 +99,15 @@
Channel
150
- 60
+ 65
450
30
font13
- FFFFFFFF
+ FFAAAAAA
00000000
left
center
-
+
@@ -115,7 +115,7 @@
Selection Background
700
130
- white.png
+ white.png
scale
@@ -143,7 +143,7 @@
450
30
font13
- FFFFFFFF
+ FF232323
00000000
left
center
@@ -152,15 +152,15 @@
Channel
150
- 60
+ 65
450
30
font13
- FFFFFFFF
+ FF555555
00000000
left
center
-
+
diff --git a/resources/skins/Default/media/next.png b/resources/skins/Default/media/next.png
new file mode 100644
index 00000000..b16f23fd
Binary files /dev/null and b/resources/skins/Default/media/next.png differ
diff --git a/resources/skins/Default/media/previous.png b/resources/skins/Default/media/previous.png
new file mode 100644
index 00000000..8bc9ba3e
Binary files /dev/null and b/resources/skins/Default/media/previous.png differ
diff --git a/specials/globalsearch.py b/specials/globalsearch.py
index d9ecd67d..f2228503 100644
--- a/specials/globalsearch.py
+++ b/specials/globalsearch.py
@@ -1,16 +1,15 @@
# -*- coding: utf-8 -*-
-from logging import Logger
-import threading
-from core import jsontools, support
-import xbmc, xbmcgui, sys, channelselector, time, os
+
+
+
+import xbmc, xbmcgui, sys, channelselector, time, threading
from core.support import dbg, tmdb
from core.item import Item
-from core import channeltools, servertools, scrapertools
+from core import channeltools, scrapertools, support
from platformcode import platformtools, config, logger
-from platformcode.launcher import run
from threading import Thread
-from platformcode.dbconverter import reload
+from collections import OrderedDict
if sys.version_info[0] >= 3:
PY3 = True
@@ -24,13 +23,9 @@ def_lang = info_language[config.get_setting("info_language", "videolibrary")]
close_action = False
update_lock = threading.Lock()
+workers = config.get_setting('thread_number') if config.get_setting('thread_number') > 0 else None
-
-def set_workers():
- workers = config.get_setting('thread_number') if config.get_setting('thread_number') > 0 else None
- return workers
-
def new_search(*args):
xbmc.executebuiltin('Dialog.Close(all)')
w = SearchWindow('GlobalSearch.xml', config.get_runtime_path())
@@ -53,25 +48,23 @@ FULLSCREEN = 18
# Container
SEARCH = 1
EPISODES = 2
-SERVERS = 3
-NORESULTS = 4
+NORESULTS = 3
# Search
MAINTITLE = 100
CHANNELS = 101
RESULTS = 102
+EPISODESLIST = 103
PROGRESS = 500
-COUNT = 501
MENU = 502
BACK = 503
CLOSE = 504
-QUALITYTAG = 505
-TAB = 506
-
+TAB = 505
+NEXT = 506
+PREV = 507
# Servers
-EPISODESLIST = 200
-SERVERLIST = 300
+
class SearchWindow(xbmcgui.WindowXML):
def start(self, item, moduleDict={}, searchActions=[], thActions=None):
@@ -79,7 +72,7 @@ class SearchWindow(xbmcgui.WindowXML):
self.exit = False
self.item = item
- self.channels = []
+ self.channels = OrderedDict({'valid':[]})
self.persons = []
self.episodes = []
self.results = {}
@@ -93,6 +86,11 @@ class SearchWindow(xbmcgui.WindowXML):
self.items = []
self.search_threads = []
self.reload = False
+ self.nextAction = None
+ self.next = None
+ self.previous = None
+ self.FOCUS = False
+
if not thActions and not self.searchActions:
self.thActions = Thread(target=self.getActionsThread)
@@ -201,8 +199,6 @@ class SearchWindow(xbmcgui.WindowXML):
it.setArt({'poster':result.get('thumbnail', noThumb), 'fanart':result.get('fanart', '')})
platformtools.set_infolabels(it, new_item)
- # logger.debug(jsontools.dump(result))
- # logger.debug(new_item)
color = 'FFFFFFFF' if not rating else 'FFDB2360' if rating < 4 else 'FFD2D531' if rating < 7 else 'FF21D07A'
it.setProperties({'rating': str(int(rating) * 10) if rating else 100, 'color':color, 'item': new_item.tourl(), 'search': 'search'})
@@ -325,13 +321,12 @@ class SearchWindow(xbmcgui.WindowXML):
self.MAINTITLE.setText('{} | {}/{} [{}"]'.format(self.mainTitle,self.count, len(self.searchActions), int(time.time() - self.time)))
if percent == 100:
- if len(self.channels) == 1:
+ if len(self.channels['valid']) or len(self.channels) == 2:
self.setFocusId(RESULTS)
- elif not self.results:
- self.PROGRESS.setVisible(False)
+ elif not len(self.channels['valid']) and not len(self.channels):
self.NORESULTS.setVisible(True)
self.setFocusId(CLOSE)
- self.channels = []
+ OrderedDict({'valid':[]})
self.moduleDict = {}
self.searchActions = []
@@ -342,13 +337,25 @@ class SearchWindow(xbmcgui.WindowXML):
self.count = 0
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:
+ with futures.ThreadPoolExecutor(max_workers=workers) as executor:
for searchAction in self.getActions():
if self.exit: return
self.search_threads.append(executor.submit(self.get_channel_results, searchAction))
+ for res in futures.as_completed(self.search_threads):
+ if res.result():
+ valid, results = res.result()
+ self.channels['valid'].extend(valid)
+
+ if results:
+ name = results[0].channel
+ if name not in results:
+ self.channels[name] = []
+ self.channels[name].extend(results)
+
+ if valid or results:
+ self.update()
+
except:
import traceback
logger.error(traceback.format_exc())
@@ -382,6 +389,9 @@ class SearchWindow(xbmcgui.WindowXML):
valid = []
other = []
+ if self.exit:
+ return [], [], []
+
try:
results, valid, other = channel_search(self.item.text)
@@ -401,110 +411,79 @@ class SearchWindow(xbmcgui.WindowXML):
import traceback
logger.error(traceback.format_exc())
- if self.exit:
- return
-
- update_lock.acquire()
self.count += 1
- self.update(valid, other if other else results)
- update_lock.release()
+ return valid, other if other else results
def makeItem(self, item):
if type(item) == str: item = Item().fromurl(item)
channelParams = channeltools.get_channel_parameters(item.channel)
info = item.infoLabels
+
+ title = item.title
tagline = info.get('tagline')
- if 'download' in item.action or 'videolibrary' in item.action:
- title = '{}{}'.format(item.title, item.contentTitle)
- else:
- title = '[B]{}[/B]'.format(item.contentTitle) + ('\n[I]{}[/I]'.format(tagline) if tagline else '')
+ if tagline == title: tagline = ''
+ if item.contentType == 'episode':
+ tagline = ''
+ title = '{:02d}. {}'.format(item.contentEpisodeNumber, item.contentTitle)
+ if item.contentSeason:
+ title = '{}x{}'.format(item.contentSeason, title)
+ if item.contentLanguage:
+ title = '{} [{}]'.format(title, item.contentLanguage)
+ if item.quality:
+ title = title = '{} [{}]'.format(title, item.quality)
+ if tagline:
+ title = '[B]{}[/B]'.format(title) + ('\n[I]{}[/I]'.format(tagline))
+
thumb = item.thumbnail if item.thumbnail else 'Infoplus/' + item.contentType.replace('show', '') + '.png'
it = xbmcgui.ListItem(title)
- it.setArt({'poster':thumb, 'fanart':item.fanart})
+ it.setArt({'poster':thumb, 'fanart':item.fanart, 'thumb':thumb if config.get_setting('episode_info') else ''})
platformtools.set_infolabels(it, item)
- logger.debug(item)
+ # logger.debug(item)
rating = info.get('rating')
color = 'FFFFFFFF' if not rating else 'FFDB2360' if rating < 4 else 'FFD2D531' if rating < 7 else 'FF21D07A'
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({'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, valid, results):
- if self.exit:
- return
+ def update(self):
+ channels = []
+ for name, value in self.channels.items():
+ thumb = 'valid.png'
+ if name != 'valid':
+ thumb = channeltools.get_channel_parameters(name)['thumbnail']
+ if value:
+ item = xbmcgui.ListItem(name)
+ item.setArt({'poster': thumb })
+ item.setProperties({'position': '0',
+ 'results': str(len(value))})
+ channels.append(item)
- if self.item.mode != 'all' and 'valid' not in self.results:
- self.results['valid'] = 0
- item = xbmcgui.ListItem('valid')
- item.setArt({'poster':'valid.png'})
- item.setProperties({'position': '0',
- 'results': '0'})
- self.channels.append(item)
- pos = self.CHANNELS.getSelectedPosition()
- self.CHANNELS.addItems(self.channels)
- self.CHANNELS.selectItem(pos)
-
- if valid and self.CHANNELS.size():
- item = self.CHANNELS.getListItem(0)
- resultsList = item.getProperty('items')
- for result in valid:
- resultsList += result.tourl() + '|'
- item.setProperty('items', resultsList)
- self.channels[0].setProperty('results', str(len(resultsList.split('|')) - 1 ))
-
- if self.CHANNELS.getSelectedPosition() == 0:
- items = []
- for result in valid:
- if result: items.append(self.makeItem(result))
- pos = self.RESULTS.getSelectedPosition()
- self.RESULTS.addItems(items)
- if pos < 0:
- self.setFocusId(RESULTS)
- pos = 0
- self.RESULTS.selectItem(pos)
-
- if results:
- resultsList = ''
- channelParams = channeltools.get_channel_parameters(results[0].channel)
- name = channelParams['title']
- 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)
+
+ if channels:
pos = self.CHANNELS.getSelectedPosition()
+ if pos < 0: pos = 0
self.CHANNELS.reset()
- self.CHANNELS.addItems(self.channels)
+ self.CHANNELS.addItems(channels)
self.CHANNELS.selectItem(pos)
- if len(self.channels) == 1:
- self.setFocusId(CHANNELS)
- channelResults = self.CHANNELS.getListItem(self.results[name]).getProperty('items').split('|')
- items = []
- for result in channelResults:
- if result: items.append(self.makeItem(result))
- self.RESULTS.reset()
- self.RESULTS.addItems(items)
+ focus = self.getFocusId()
+ items = [self.makeItem(r) for r in self.channels[self.CHANNELS.getSelectedItem().getLabel()]]
+ subpos = self.RESULTS.getSelectedPosition()
+ self.RESULTS.reset()
+ self.RESULTS.addItems(items)
+ self.RESULTS.selectItem(subpos)
+ if not self.FOCUS:
+ if len(self.channels['valid']):
+ self.FOCUS = True
+ self.setFocusId(RESULTS)
+ elif focus not in [RESULTS]:
+ self.FOCUS = True
+ self.setFocusId(CHANNELS)
def onInit(self):
self.NORESULTS = self.getControl(NORESULTS)
@@ -514,17 +493,18 @@ class SearchWindow(xbmcgui.WindowXML):
self.mainTitle = config.get_localized_string(30993).replace('...', '') % '"%s"' % self.item.text
# collect controls
+ self.NEXT = self.getControl(NEXT)
+ self.NEXT.setVisible(False)
+ self.PREV = self.getControl(PREV)
+ self.PREV.setVisible(False)
self.CHANNELS = self.getControl(CHANNELS)
self.RESULTS = self.getControl(RESULTS)
self.PROGRESS = self.getControl(PROGRESS)
- self.COUNT = self.getControl(COUNT)
self.MAINTITLE = self.getControl(MAINTITLE)
self.MAINTITLE.setText(self.mainTitle)
self.SEARCH = self.getControl(SEARCH)
self.EPISODES = self.getControl(EPISODES)
self.EPISODESLIST = self.getControl(EPISODESLIST)
- self.SERVERS = self.getControl(SERVERS)
- self.SERVERLIST = self.getControl(SERVERLIST)
self.Focus(self.focus)
if self.item.mode.split('_')[0] in ['all', 'search']:
@@ -543,45 +523,39 @@ class SearchWindow(xbmcgui.WindowXML):
self.focus = CHANNELS
self.SEARCH.setVisible(True)
self.EPISODES.setVisible(False)
- self.SERVERS.setVisible(False)
if focusid in [EPISODES]:
self.focus = focusid
self.SEARCH.setVisible(False)
self.EPISODES.setVisible(True)
- self.SERVERS.setVisible(False)
- if focusid in [SERVERS]:
- self.focus = SERVERLIST
- self.SEARCH.setVisible(False)
- self.EPISODES.setVisible(False)
- self.SERVERS.setVisible(True)
def onAction(self, action):
global close_action
action = action.getId()
focus = self.getFocusId()
- if action in [CONTEXT] and focus in [RESULTS, EPISODESLIST, SERVERLIST]:
+ if action in [CONTEXT] and focus in [RESULTS, EPISODESLIST]:
self.context()
+ elif focus in [EPISODESLIST] and action in [LEFT, RIGHT]:
+ if action in [LEFT]:
+ item = self.previous
+ if action in [RIGHT]:
+ item = self.next
+ if item:
+ platformtools.dialog_busy(True)
+ self.loadEpisodes(item)
+ platformtools.dialog_busy(False)
+
elif action in [SWIPEUP] and self.CHANNELS.isVisible():
self.setFocusId(CHANNELS)
pos = self.CHANNELS.getSelectedPosition()
self.CHANNELS.selectItem(pos)
elif action in [LEFT, RIGHT, MOUSEMOVE] and focus in [CHANNELS] and self.CHANNELS.isVisible():
- items = []
- name = self.CHANNELS.getSelectedItem().getLabel()
- subpos = int(self.CHANNELS.getSelectedItem().getProperty('position'))
- channelResults = self.CHANNELS.getListItem(self.results[name]).getProperty('items').split('|')
- for result in channelResults:
- if result: items.append(self.makeItem(result))
- self.RESULTS.reset()
- self.RESULTS.addItems(items)
- self.RESULTS.selectItem(subpos)
+ self.channelItems()
- elif (action in [DOWN] and focus in [BACK, CLOSE, MENU]) or focus not in [BACK, CLOSE, MENU, SERVERLIST, EPISODESLIST, RESULTS, CHANNELS]:
- if self.SERVERS.isVisible(): self.setFocusId(SERVERLIST)
- elif self.EPISODES.isVisible(): self.setFocusId(EPISODESLIST)
+ elif (action in [DOWN] and focus in [BACK, CLOSE, MENU]) or focus not in [BACK, CLOSE, MENU, EPISODESLIST, RESULTS, CHANNELS]:
+ if self.EPISODES.isVisible(): self.setFocusId(EPISODESLIST)
elif self.RESULTS.isVisible() and self.RESULTS.size() > 0: self.setFocusId(RESULTS)
elif self.CHANNELS.isVisible(): self.setFocusId(CHANNELS)
@@ -610,17 +584,7 @@ class SearchWindow(xbmcgui.WindowXML):
if self.RESULTS.getSelectedItem(): search = self.RESULTS.getSelectedItem().getProperty('search')
else: search = None
if control_id in [CHANNELS, TAB]:
- items = []
- name = self.CHANNELS.getSelectedItem().getLabel()
- subpos = int(self.CHANNELS.getSelectedItem().getProperty('position'))
- channelResults = self.CHANNELS.getListItem(self.results[name]).getProperty('items').split('|')
- for result in channelResults:
- if result: items.append(self.makeItem(result))
- self.RESULTS.reset()
- self.RESULTS.addItems(items)
- self.RESULTS.selectItem(subpos)
- self.CHANNELS.getSelectedItem().setProperty('position', str(subpos))
- self.setFocusId(CHANNELS)
+ self.channelItems()
elif control_id in [BACK]:
self.Back()
@@ -656,6 +620,7 @@ class SearchWindow(xbmcgui.WindowXML):
self.close()
elif control_id in [RESULTS, EPISODESLIST]:
+
platformtools.dialog_busy(True)
if control_id in [RESULTS]:
name = self.CHANNELS.getSelectedItem().getLabel()
@@ -665,84 +630,77 @@ class SearchWindow(xbmcgui.WindowXML):
item_url = self.EPISODESLIST.getSelectedItem().getProperty('item')
if item_url:
item = Item().fromurl(item_url)
+
else: # no results item
platformtools.dialog_busy(False)
return
- if item.action in ['add_movie_to_library', 'add_serie_to_library','save_download']: # special items (add to videolibrary, download ecc.)
- xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?" + item_url + ")")
+ if item.action:
+ item.window = True
+ item.folder = False
+ xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?" + item.tourl() + ")")
platformtools.dialog_busy(False)
return
- try:
- self.channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel])
- self.itemsResult = getattr(self.channel, item.action)(item)
- except:
- import traceback
- logger.error('error importing/getting search items of ' + item.channel)
- logger.error(traceback.format_exc())
- self.itemsResult = []
-
- if self.itemsResult and self.itemsResult[0].action in ['play', '']:
-
- if config.get_setting('checklinks') and not config.get_setting('autoplay'):
- self.itemsResult = servertools.check_list_links(self.itemsResult, config.get_setting('checklinks_number'))
- for s in self.itemsResult: logger.debug(s)
- servers = [self.makeItem(s) for s in self.itemsResult if s.server]
-
- 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(servers)
- self.setFocusId(SERVERLIST)
-
- if config.get_setting('autoplay'):
- platformtools.dialog_busy(False)
-
- else:
- self.episodes = self.itemsResult if self.itemsResult else []
- self.itemsResult = []
- ep = []
- for item in self.episodes:
- title = item.contentTitle
- if item.contentEpisodeNumber: title = '{:02d}. {}'.format(item.contentEpisodeNumber, title)
- if item.contentSeason: title = '{}x{}'.format(item.contentSeason, title)
-
- it = xbmcgui.ListItem(title)
- it.setProperty('item', item.tourl())
- ep.append(it)
-
- if not ep:
- ep = [xbmcgui.ListItem(config.get_localized_string(60347))]
- ep[0].setArt({'poster', support.thumb('nofolder')})
-
- self.Focus(EPISODES)
- self.EPISODESLIST.reset()
- self.EPISODESLIST.addItems(ep)
- self.setFocusId(EPISODESLIST)
+ self.loadEpisodes(item)
platformtools.dialog_busy(False)
+ def channelItems(self):
+ items = []
+ name = self.CHANNELS.getSelectedItem().getLabel()
+ subpos = int(self.CHANNELS.getSelectedItem().getProperty('position'))
+ channelResults = self.channels.get(name)
+ for result in channelResults:
+ if result: items.append(self.makeItem(result))
+ self.RESULTS.reset()
+ self.RESULTS.addItems(items)
+ self.RESULTS.selectItem(subpos)
- elif control_id in [SERVERLIST]:
- server = Item().fromurl(self.getControl(control_id).getSelectedItem().getProperty('item'))
- return self.play(server)
+ def loadEpisodes(self ,item):
+ try:
+ self.channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel])
+ self.itemsResult = getattr(self.channel, item.action)(item)
+ except:
+ import traceback
+ logger.error('error importing/getting search items of ' + item.channel)
+ logger.error(traceback.format_exc())
+ self.itemsResult = []
+ self.episodes = self.itemsResult if self.itemsResult else []
+ self.itemsResult = []
+ ep = []
+ isnext = False
+
+ for e in self.episodes:
+ if e.action in ['findvideos']:
+ ep.append(self.makeItem(e))
+ if e.nextSeason and e.action in ['episodios']:
+ self.nextAction = e.clone()
+ isnext = True
+
+ if self.nextAction:
+ self.next = None
+ self.previous = None
+ if isnext:
+ self.next = self.nextAction.clone()
+ if self.nextAction.nextSeason > 1 or not self.next:
+ self.previous = self.nextAction.clone(nextSeason = self.nextAction.nextSeason - 2 if self.next else 0)
+
+ self.NEXT.setVisible(True if self.next else False)
+ self.PREV.setVisible(True if self.previous else False)
+
+ if not ep:
+ ep = [xbmcgui.ListItem(config.get_localized_string(60347))]
+ ep[0].setArt({'poster', support.thumb('nofolder')})
+
+ self.Focus(EPISODES)
+ self.EPISODESLIST.reset()
+ self.EPISODESLIST.addItems(ep)
+ self.setFocusId(EPISODESLIST)
def Back(self):
- self.getControl(QUALITYTAG).setText('')
- if self.SERVERS.isVisible():
- if self.episodes:
- self.Focus(EPISODES)
- self.setFocusId(EPISODESLIST)
- else:
- self.Focus(SEARCH)
- self.setFocusId(RESULTS)
- self.RESULTS.selectItem(self.pos)
- elif self.EPISODES.isVisible():
+ if self.EPISODES.isVisible():
self.episodes = []
self.Focus(SEARCH)
self.setFocusId(RESULTS)
@@ -765,9 +723,6 @@ class SearchWindow(xbmcgui.WindowXML):
if focus == EPISODESLIST: # context on episode
item_url = self.EPISODESLIST.getSelectedItem().getProperty('item')
parent = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item'))
- elif focus == SERVERLIST:
- item_url = self.SERVERLIST.getSelectedItem().getProperty('item')
- parent = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item'))
else:
item_url = self.RESULTS.getSelectedItem().getProperty('item')
parent = self.item
@@ -778,10 +733,7 @@ class SearchWindow(xbmcgui.WindowXML):
context_commands = [c[1].replace('Container.Refresh', 'RunPlugin').replace('Container.Update', 'RunPlugin').replace(')','&no_reload=True)') for c in commands]
index = xbmcgui.Dialog().contextmenu(context)
self.reload = True
- if index > 0: xbmc.executebuiltin(context_commands[index])
- def play(self, server=None):
- platformtools.prevent_busy(server)
- server.window = True
- server.globalsearch = True
- return run(server)
+ xbmc.executebuiltin(context_commands[index])
+ # if index > 0: xbmc.executebuiltin(context_commands[index])
+