diff --git a/addon.xml b/addon.xml
index 0d58e475..77d5ac23 100644
--- a/addon.xml
+++ b/addon.xml
@@ -19,7 +19,7 @@
Kodi on Demand è un addon di Kodi per cercare e guardare contenuti sul web.
resources/media/logo.png
- resources/media/fanart.jpg
+ resources/media/dark_background.jpg
resources/media/screenshot-1.png
resources/media/screenshot-2.png
resources/media/screenshot-3.png
diff --git a/core/support.py b/core/support.py
index cb160bc5..dd4cc11d 100755
--- a/core/support.py
+++ b/core/support.py
@@ -890,11 +890,20 @@ def nextPage(itemlist, item, function_or_level=1, **kwargs):
# create Item
if next_page or page:
itemlist.append(item.clone(action = inspect.stack()[function_or_level][3] if type(function_or_level) == int else function_or_level,
- title=typo(config.get_localized_string(30992), 'color kod bold'),
+ title=typo(config.get_localized_string(90006), 'color kod bold'),
nextPage=True,
page=page if page else item.page + 1 if item.page else 2,
prevthumb = item.thumbnail,
thumbnail=thumb()))
+ if total_pages:
+ itemlist.append(item.clone(action='gotopage',
+ real_action = inspect.stack()[function_or_level][3] if type(function_or_level) == int else function_or_level,
+ title=typo(config.get_localized_string(90007), 'color kod bold'),
+ nextPage=True,
+ total_pages = total_pages,
+ page=page if page else item.page + 1 if item.page else 2,
+ prevthumb = item.thumbnail,
+ thumbnail=thumb()))
return itemlist
@@ -957,7 +966,7 @@ def season_pagination(itemlist, item, seasons, function_level=1):
itlist.append(
Item(channel=item.channel,
action=action,
- title=typo('Stagione Successiva [{}]'.format(seasons[item.nextSeason + 1]), 'bold'),
+ title=typo(config.get_localized_string(90008), 'color kod bold'),
allSeasons = seasons,
nextSeason = item.nextSeason + 1,
itemlist = True,
@@ -967,7 +976,7 @@ def season_pagination(itemlist, item, seasons, function_level=1):
Item(channel=item.channel,
action='gotoseason',
real_action=action,
- title=typo('Vai alla stagione…', 'bold'),
+ title=typo(config.get_localized_string(90009), 'color kod bold'),
allSeasons = seasons,
nextSeason = item.nextSeason + 1,
itemlist = True,
@@ -1310,7 +1319,7 @@ def addQualityTag(item, itemlist, data, patron):
def thumb(data=None, mode=None):
'''
data = str, item or itemlist
- mode = str, genre, live, quality
+ mode = genre, live, quality
'''
if mode == 'live':
diff --git a/platformcode/infoplus.py b/platformcode/infoplus.py
index 0fd5eda8..af179d04 100644
--- a/platformcode/infoplus.py
+++ b/platformcode/infoplus.py
@@ -3,31 +3,25 @@
# infoplus window with item information
# ------------------------------------------------------------
-from typing import List
-import xbmc, xbmcgui, sys, requests, re
-from core import httptools, support, tmdb, filetools, channeltools, servertools, jsontools
+import xbmc, xbmcgui, sys
+from core import httptools, tmdb
from core.item import Item
-from platformcode import config, platformtools, logger, xbmc_videolibrary
-from platformcode.logger import log
-from core.scrapertools import decodeHtmlentities, htmlclean
+from platformcode import config, platformtools, logger
-from core.support import typo, dbg
+from core.support import match, typo, dbg
-PY3 = False
-if sys.version_info[0] >= 3: PY3 = True
-if PY3: from concurrent import futures
-else: from concurrent_py2 import futures
info_list = []
SearchWindows = []
-api = 'k_0tdb8a8y'
# Control ID
LIST = 100
-CAST = 101
-RECOMANDED = 102
-TRAILERS = 103
-FANARTS = 104
+CAST = MOVIE = 101
+SET = SHOW = 102
+RECOMANDED = 103
+TRAILERS = 104
+FANARTS = 105
+
SEARCH = 200
@@ -61,6 +55,7 @@ class InfoPlus(xbmcgui.WindowXML):
self.trailers = []
self.images = []
self.fanarts = []
+ self.collection = []
if not self.item.focus: self.item.focus = {}
platformtools.dialog_busy(True)
if self.item:
@@ -84,7 +79,7 @@ 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'))
@@ -93,8 +88,6 @@ class InfoPlus(xbmcgui.WindowXML):
# Set infoLabels
platformtools.set_infolabels(self.listitem, self.item)
-
-
# Add Cast Info
for cast in self.info.get('castandrole',[]):
@@ -104,6 +97,21 @@ class InfoPlus(xbmcgui.WindowXML):
self.cast.append(castitem)
self.cast.sort(key=lambda c: c.getProperty('order'))
+ if self.info.get('setid'):
+ url = '{}/collection/{}?api_key={}&language={}'.format(tmdb.host, self.info.get('setid'), tmdb.api, tmdb.def_lang)
+ parts = match(url).response.json['parts']
+ for part in parts:
+ poster = 'https://image.tmdb.org/t/p/original/' + part.get('poster_path') if part.get('poster_path') else ''
+ setitem = xbmcgui.ListItem(part.get('title'), self.info.get('set'))
+ setitem.setArt({'poster': poster})
+ rating = part.get('vote_average', 'N/A')
+ color = 'FFFFFFFF' if rating == 'N/A' else 'FFDB2360' if rating < 4 else 'FFD2D531' if rating < 7 else 'FF21D07A'
+
+ setitem.setProperties({'id':part.get('id'), 'mediatype':'movie', 'color':color})
+ setitem.setInfo("video", {'plot':self.info.get('setoverview'), 'rating':rating})
+ self.collection.append(setitem)
+
+
directors = self.info.get('director')
if directors:
for i, director in enumerate(directors.split(',')):
@@ -137,6 +145,9 @@ class InfoPlus(xbmcgui.WindowXML):
self.getControl(TRAILERS).addItems(self.trailers)
self.getControl(FANARTS).addItems(self.fanarts)
+ if self.collection:
+ self.getControl(SET).addItems(self.collection)
+
# Set Focus
if self.item.focus:
for k, v in self.item.focus.items():
@@ -149,13 +160,26 @@ class InfoPlus(xbmcgui.WindowXML):
def onAction(self, action):
action = action.getId()
focus = self.getFocusId()
+ infoList = [LIST, CAST, SET, RECOMANDED, TRAILERS, FANARTS]
+ actionList = [SEARCH, BACK, CLOSE]
if action in [EXIT]:
self.close()
elif action in [BACKSPACE]:
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 and focus not in [SEARCH, BACK, CLOSE]:
+ elif action in [UP, DOWN]:
+ A = 1 if action == DOWN else -1
+ if focus not in infoList or focus in actionList:
+ self.setFocusId(infoList[0])
+ elif focus + A in infoList and not focus in actionList:
+ while focus in infoList:
+ focus += A
+ if self.getControl(focus).isVisible():
+ self.setFocusId(focus)
+ break
+ else:
+ self.setFocusId(SEARCH)
+
+ if focus > 0 and focus not in actionList:
self.item.setFocus = focus
self.item.focus[focus] = self.getControl(focus).getSelectedPosition()
@@ -164,13 +188,23 @@ class InfoPlus(xbmcgui.WindowXML):
global info_list
if control in [SEARCH]:
- from specials.globalsearch import new_search
+ selection = 0
+ original = self.item.infoLabels.get('originaltitle')
+
if self.item.contentType == 'episode':
self.item.contentType = 'tvshow'
self.item.text = self.item.contentSerieName
- self.item.mode = 'all'
- self.item.type = self.item.contentType
- new_search(self.item)
+ else:
+ self.item.text = self.item.contentTitle
+ titles = [self.item.text] + [original] if original else []
+ if original and original != self.item.text:
+ selection = platformtools.dialog_select(config.get_localized_string(90010), titles)
+ if selection > -1:
+ self.item.text = titles[selection]
+ self.item.mode = 'search_' + self.item.contentType
+ item = self.item.clone(channel='globalsearch', action='new_search')
+ xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?" + item.tourl() + ")")
+ # new_search(self.item.clone())
elif control in [CLOSE]:
self.close()
@@ -185,9 +219,9 @@ class InfoPlus(xbmcgui.WindowXML):
self.close()
showCast(it)
- elif control in [RECOMANDED]:
+ elif control in [RECOMANDED, SET]:
info_list.append(self.item)
- listitem = self.getControl(RECOMANDED).getSelectedItem()
+ listitem = self.getControl(control).getSelectedItem()
it = Item(title=listitem.getLabel(), infoLabels={'tmdb_id':listitem.getProperty('id'), 'mediatype':listitem.getProperty('mediatype')})
self.close()
start(it)
@@ -255,8 +289,6 @@ class CastWindow(xbmcgui.WindowXML):
self.item = kwargs.get('item')
self.id = self.item.id
self.item.InfoWindow = 'cast'
- self.host = tmdb.host
- self.api = tmdb.api
self.movies = []
self.tvshows = []
self.movieItems = []
@@ -271,8 +303,8 @@ class CastWindow(xbmcgui.WindowXML):
def get_person_info(self):
# Function for Person Info
- url = '{}/person/{}?api_key={}&language=en'.format(self.host, self.id, self.api)
- translation_url = '{}/person/{}/translations?api_key={}'.format(self.host, self.id, self.api)
+ url = '{}/person/{}?api_key={}&language=en'.format(tmdb.host, self.id, tmdb.api)
+ translation_url = '{}/person/{}/translations?api_key={}'.format(tmdb.host, self.id, tmdb.api)
info = httptools.downloadpage(url).json
@@ -295,8 +327,8 @@ class CastWindow(xbmcgui.WindowXML):
def onInit(self):
self.getControl(LIST).addItem(self.castitem)
- self.getControl(CAST).addItems(self.movies)
- self.getControl(RECOMANDED).addItems(self.tvshows)
+ self.getControl(MOVIE).addItems(self.movies)
+ self.getControl(SHOW).addItems(self.tvshows)
# Set Focus
xbmc.sleep(200)
@@ -309,17 +341,29 @@ class CastWindow(xbmcgui.WindowXML):
def onAction(self, action):
action = action.getId()
focus = self.getFocusId()
+ infoList = [LIST, MOVIE, SHOW]
+ actionList = [BACK, CLOSE]
if action in [EXIT]:
self.close()
elif action in [BACKSPACE]:
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:
+ elif action in [UP, DOWN] and focus in infoList + actionList:
+ A = 1 if action == DOWN else -1
+ if focus not in infoList or focus in actionList:
+ self.setFocusId(infoList[0])
+ elif focus + A in infoList and not focus in actionList:
+ while focus in infoList:
+ focus += A
+ if self.getControl(focus).isVisible():
+ self.setFocusId(focus)
+ break
+ else:
+ self.setFocusId(BACK)
+
+ if focus > 0 and focus not in actionList:
self.item.setFocus = focus
self.item.focus[focus] = self.getControl(focus).getSelectedPosition()
-
def onClick(self, control):
global info_list
@@ -329,20 +373,20 @@ class CastWindow(xbmcgui.WindowXML):
elif control in [BACK]:
back(self)
- elif control in [CAST]:
+ elif control in [MOVIE]:
info_list.append(self.item)
self.close()
- start(self.movieItems[self.getControl(CAST).getSelectedPosition()])
+ start(self.movieItems[self.getControl(MOVIE).getSelectedPosition()])
- elif control in [RECOMANDED]:
+ elif control in [SHOW]:
info_list.append(self.item)
self.close()
- start(self.tvshowItems[self.getControl(RECOMANDED).getSelectedPosition()])
+ start(self.tvshowItems[self.getControl(SHOW).getSelectedPosition()])
def get_credits(self):
# Function for Credits Info
- url = '{}/person/{}/combined_credits?api_key={}&language=it'.format(self.host, self.id, self.api)
+ url = '{}/person/{}/combined_credits?api_key={}&language='.format(tmdb.host, self.id, tmdb.api, tmdb.def_lang)
info = httptools.downloadpage(url).json
for video in info.get('cast',[]) + info.get('crew',[]):
diff --git a/platformcode/launcher.py b/platformcode/launcher.py
index ed546144..a0261191 100644
--- a/platformcode/launcher.py
+++ b/platformcode/launcher.py
@@ -151,6 +151,7 @@ def run(item=None):
else:
platformtools.dialog_ok(config.get_localized_string(20000), config.get_localized_string(70740) % "\n".join([item.url[j:j+57] for j in range(0, len(item.url), 57)]))
elif item.action == "gotopage":
+ # from core.support import dbg;dbg()
from core import scrapertools
head = config.get_localized_string(70511)
scraped_page = scrapertools.find_single_match(item.url,'[=/]([0-9]+)')
@@ -166,7 +167,8 @@ def run(item=None):
item.page = page
import re
item.url = re.sub('([=/])[0-9]+(/?)$', '\g<1>{}\g<2>'.format(page), item.url)
- xbmc.executebuiltin("Container.Update(%s?%s)" % (sys.argv[0], item.tourl()))
+ run(item)
+ # xbmc.executebuiltin("Container.Update(%s?%s)" % (sys.argv[0], item.tourl()))
elif item.action == "gotoseason":
head = 'Seleziona la stagione'
seasons = [str(s) for s in item.allSeasons]
diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po
index 0e909ecc..a611f721 100644
--- a/resources/language/resource.language.en_gb/strings.po
+++ b/resources/language/resource.language.en_gb/strings.po
@@ -6535,3 +6535,24 @@ msgstr "No options"
msgctxt "#90005"
msgid "Search on KOD"
msgstr "Search with KOD"
+
+
+msgctxt "#90006"
+msgid "Next page >"
+msgstr ""
+
+msgctxt "#90007"
+msgid "Go to page…"
+msgstr ""
+
+msgctxt "#90008"
+msgid "Next Season >"
+msgstr ""
+
+msgctxt "#90009"
+msgid "Go to season…"
+msgstr ""
+
+msgctxt "#90010"
+msgid "What title do you want to search for?"
+msgstr ""
\ No newline at end of file
diff --git a/resources/language/resource.language.it_it/strings.po b/resources/language/resource.language.it_it/strings.po
index b515bb2c..85b5a7ca 100644
--- a/resources/language/resource.language.it_it/strings.po
+++ b/resources/language/resource.language.it_it/strings.po
@@ -6536,3 +6536,24 @@ msgstr "Nessuna opzione possibile"
msgctxt "#90005"
msgid "Search on KOD"
msgstr "Cerca con KOD"
+
+
+msgctxt "#90006"
+msgid "Next page >"
+msgstr "Pagina successiva >"
+
+msgctxt "#90007"
+msgid "Go to page…"
+msgstr "Vai a pagina…"
+
+msgctxt "#90008"
+msgid "Next Season >"
+msgstr "Stagione successiva >"
+
+msgctxt "#90009"
+msgid "Go to season…"
+msgstr "Vai alla stagione…"
+
+msgctxt "#90010"
+msgid "What title do you want to search for?"
+msgstr "Quale titolo vuoi cercare?"
\ No newline at end of file
diff --git a/resources/media/dark_background.jpg b/resources/media/dark_background.jpg
new file mode 100644
index 00000000..e0c9fc63
Binary files /dev/null and b/resources/media/dark_background.jpg differ
diff --git a/resources/media/fanart.jpg b/resources/media/fanart.jpg
deleted file mode 100644
index b5883c02..00000000
Binary files a/resources/media/fanart.jpg and /dev/null differ
diff --git a/resources/skins/Default/720p/CastWindow.xml b/resources/skins/Default/720p/CastWindow.xml
index 2d51af29..9350e551 100644
--- a/resources/skins/Default/720p/CastWindow.xml
+++ b/resources/skins/Default/720p/CastWindow.xml
@@ -97,8 +97,6 @@
horizontal
- 201
- 101
Birth
@@ -134,7 +132,7 @@
Movie Group
-
+ Integer.IsGreater(Container(102).NumItems, 0)
241
Movie Title
@@ -143,15 +141,14 @@
font13
ffFFFFFF
00000000
-
+
left
center
Movie List
+ Integer.IsGreater(Container(102).NumItems, 0)
30
- 100
- 102
200
horizontal
10
@@ -236,25 +233,16 @@
Rating
20
- 50
+ 15
40
30
font13
- ffFFFFFF
+ Container(101).ListItem.Property(color)
00000000
right
center
-
- Rating Circle
- 20
- 15
- 30
- 30
- Circular/$INFO[Container(101).ListItem.Property(rating)].png
- scale
-
Separator
@@ -267,7 +255,7 @@
Show Group
-
+ Integer.IsGreater(Container(102).NumItems, 0)
241
Show Title
@@ -276,14 +264,14 @@
font13
ffFFFFFF
00000000
-
+
left
center
Show List
+ Integer.IsGreater(Container(102).NumItems, 0)
30
- 101
200
horizontal
10
@@ -368,36 +356,25 @@
Rating
20
- 50
+ 15
40
30
font13
- ffFFFFFF
+ Container(102).ListItem.Property(color)
00000000
right
center
-
- Rating Circle
- 20
- 15
- 30
- 30
- Circular/$INFO[Container(102).ListItem.Property(rating)].png
- scale
-
- 100
30
30
40
80
-
horizontal
diff --git a/resources/skins/Default/720p/ChannelSettings.xml b/resources/skins/Default/720p/ChannelSettings.xml
index b2acb97a..63eef84d 100644
--- a/resources/skins/Default/720p/ChannelSettings.xml
+++ b/resources/skins/Default/720p/ChannelSettings.xml
@@ -31,7 +31,7 @@
FFFFFFFF
left
center
-
+
Close
diff --git a/resources/skins/Default/720p/GlobalSearch.xml b/resources/skins/Default/720p/GlobalSearch.xml
index d7309149..a9f7a208 100644
--- a/resources/skins/Default/720p/GlobalSearch.xml
+++ b/resources/skins/Default/720p/GlobalSearch.xml
@@ -46,9 +46,10 @@
$INFO[Container(103).ListItem.Art(thumb)]
Control.IsVisible(2) + !String.IsEmpty(Container(103).ListItem.Art(thumb))
-
+
Title
+ Control.IsVisible(500)
480
270
1000
@@ -56,7 +57,6 @@
font13
FFFFFFFF
00000000
-
left
center
Conditional
@@ -674,21 +674,6 @@
Conditional
-
- Progress Count
- 270
- 450
- 180
- 30
- font13
- FFFFFFFF
- 00000000
- right
- center
- Conditional
-
-
-
No Results
340
diff --git a/resources/skins/Default/720p/InfoPlus.xml b/resources/skins/Default/720p/InfoPlus.xml
index 4a822471..d39a0abf 100644
--- a/resources/skins/Default/720p/InfoPlus.xml
+++ b/resources/skins/Default/720p/InfoPlus.xml
@@ -39,6 +39,7 @@
+
30
@@ -246,8 +247,6 @@
horizontal
- 200
- 101
Cast Title
@@ -256,16 +255,14 @@
font13
ffFFFFFF
00000000
-
+
left
center
Cast List
+ Integer.IsGreater(Container(101).NumItems, 0)
30
- 100
- 102
- 200
horizontal
10
@@ -342,27 +339,26 @@
white.pngù
-
+
- Recomanded Group
-
+ Collection Group
+ Integer.IsGreater(Container(102).NumItems, 0)
241
- Cast Title
+ Collection Title
10
30
font13
ffFFFFFF
00000000
-
+
left
center
- Recomanded List
+ Collection List
+ Integer.IsGreater(Container(102).NumItems, 0)
30
- 101
- 103
200
horizontal
10
@@ -434,15 +430,6 @@
right
center
-
Plot
60
@@ -466,10 +453,124 @@
white.png
+
+
+ Recomanded Group
+ Integer.IsGreater(Container(103).NumItems, 0)
+ 241
+
+ Cast Title
+ 10
+ 30
+ font13
+ ffFFFFFF
+ 00000000
+
+ left
+ center
+
+
+ Recomanded List
+ Integer.IsGreater(Container(103).NumItems, 0)
+ 30
+ 200
+ horizontal
+ 10
+
+
+ Infoplus/no_photo.png
+ 10
+ scale
+
+
+ $INFO[ListItem.Art(poster)]
+ 10
+ scale
+
+
+
+
+ white.png
+ 5
+ scale
+ Control.HasFocus(103)
+
+
+ Infoplus/no_photo.png
+ 10
+ scale
+
+
+ $INFO[ListItem.Art(poster)]
+ 10
+ scale
+
+
+
+
+ 30
+ 133
+ 200
+ Control.HasFocus(103)
+ Conditional
+ Conditional
+
+ white.png
+
+
+ Name
+ 20
+ 40
+ 30
+ 450
+ font13
+ ffFFFFFF
+ 00000000
+
+ left
+ center
+
+
+ Name
+ 20
+ 15
+ 40
+ 30
+ font13
+ true
+ Container(103).ListItem.Property(color)
+ 00000000
+
+ right
+ center
+
+
+ Plot
+ 60
+ 40
+ 100
+ 520
+ font13
+ ffFFFFFF
+ 00000000
+
+ True
+ left
+ center
+
+
+
+ Separator
+ 240
+ 0
+ 0.5
+ white.png
+
+
Trailers Group
- Integer.IsGreater(Container(103).NumItems, 0)
+ Integer.IsGreater(Container(104).NumItems, 0)
241
@@ -483,11 +584,10 @@
left
center
-
+
Trailers List
+ Integer.IsGreater(Container(104).NumItems, 0)
30
- 102
- 104
200
horizontal
10
@@ -503,7 +603,7 @@
white.png
5
scale
- Control.HasFocus(103)
+ Control.HasFocus(104)
$INFO[ListItem.Art(thumb)]
@@ -516,9 +616,9 @@
30
340
200
- Control.HasFocus(103)
- Conditional
- Conditional
+ Control.HasFocus(104)
+ Conditional
+ Conditional
white.png
@@ -531,7 +631,7 @@
font13
ffFFFFFF
00000000
-
+
True
left
center
@@ -548,7 +648,7 @@
Fanart Group
- Integer.IsGreater(Container(104).NumItems, 0)
+ Integer.IsGreater(Container(105).NumItems, 0)
241
@@ -558,14 +658,14 @@
font13
ffFFFFFF
00000000
-
+
left
center
-
+
Fanart List
- 30
- 103
+ Integer.IsGreater(Container(105).NumItems, 0)
+ 30>
200
horizontal
10
@@ -581,7 +681,7 @@
white.png
5
scale
- Control.HasFocus(104)
+ Control.HasFocus(105)
$INFO[ListItem.Art(fanart)]
@@ -591,15 +691,14 @@
+
- 100
30
30
40
120
-
horizontal
search
diff --git a/specials/globalsearch.py b/specials/globalsearch.py
index f2228503..2ce5ac7a 100644
--- a/specials/globalsearch.py
+++ b/specials/globalsearch.py
@@ -90,7 +90,7 @@ class SearchWindow(xbmcgui.WindowXML):
self.next = None
self.previous = None
self.FOCUS = False
-
+ self.mode = self.item.mode.split('_')[-1]
if not thActions and not self.searchActions:
self.thActions = Thread(target=self.getActionsThread)
@@ -129,7 +129,7 @@ class SearchWindow(xbmcgui.WindowXML):
try:
module = __import__('channels.%s' % channel, fromlist=["channels.%s" % channel])
mainlist = getattr(module, 'mainlist')(Item(channel=channel, global_search=True))
- 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'])]
+ actions = [elem for elem in mainlist if elem.action == "search" and (self.mode in ['all', 'person'] or elem.contentType in [self.mode, 'undefined'])]
self.moduleDict[channel] = module
self.searchActions.append(actions)
except:
@@ -157,20 +157,20 @@ class SearchWindow(xbmcgui.WindowXML):
logger.debug()
self.PROGRESS.setVisible(False)
self.items = []
- if self.item.mode == 'filmography':
+ if self.mode == 'filmography':
tmdb_info = tmdb.discovery(self.item, dict_=self.item.discovery)
results = tmdb_info.results.get('cast',[])
else:
- tmdb_info = tmdb.Tmdb(searched_text=self.item.text, search_type=self.item.mode.replace('show', ''))
+ tmdb_info = tmdb.Tmdb(searched_text=self.item.text, search_type=self.mode.replace('show', ''))
results = tmdb_info.results
def make(n, result):
result = tmdb_info.get_infoLabels(result, origen=result)
- if self.item.mode == 'movie':
+ if self.mode == 'movie':
title = result['title']
result['mode'] = 'movie'
- elif self.item.mode == 'tvshow':
+ elif self.mode == 'tvshow':
title = result['name']
result['mode'] = 'tvshow'
else:
@@ -189,7 +189,7 @@ class SearchWindow(xbmcgui.WindowXML):
text=title,
infoLabels=result)
- if self.item.mode == 'movie':
+ if self.mode == 'movie':
new_item.contentTitle = result['title']
else:
new_item.contentSerieName = result['name']
@@ -284,7 +284,7 @@ class SearchWindow(xbmcgui.WindowXML):
self.setFocusId(CLOSE)
def get_channels(self):
- logger.debug()
+ logger.debug('MODE:', self.mode)
channels_list = []
all_channels = channelselector.filterchannels('all')
@@ -302,7 +302,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:
+ if self.mode in ['all', 'person'] or self.mode in list_cat:
if config.get_setting("include_in_global_search", channel) and ch_param.get("active", False):
channels_list.append(channel)
@@ -374,7 +374,7 @@ class SearchWindow(xbmcgui.WindowXML):
if not results[0].action or results[0].nextPage:
results = []
- if self.item.mode != 'all':
+ if self.mode != 'all':
for elem in results:
if elem.infoLabels.get('tmdb_id') == self.item.infoLabels.get('tmdb_id'):
elem.from_channel = elem.channel
@@ -404,7 +404,7 @@ class SearchWindow(xbmcgui.WindowXML):
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'):
+ if self.mode != 'all' and not valid and self.item.infoLabels.get('originaltitle'):
logger.debug('retring with original title on channel ')
dummy, valid, dummy = channel_search(self.item.infoLabels.get('originaltitle'))
except:
@@ -509,13 +509,12 @@ class SearchWindow(xbmcgui.WindowXML):
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']:
+ elif self.mode in ['movie', 'tvshow', 'filmography']:
self.select()
- elif self.item.mode in ['person']:
+ elif self.mode in ['person']:
self.actors()
def Focus(self, focusid):
@@ -612,7 +611,7 @@ class SearchWindow(xbmcgui.WindowXML):
self.close()
else:
item = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item'))
- if self.item.mode == 'movie': item.contentTitle = self.RESULTS.getSelectedItem().getLabel()
+ if self.mode == 'movie': item.contentTitle = self.RESULTS.getSelectedItem().getLabel()
else: item.contentSerieName = self.RESULTS.getSelectedItem().getLabel()
new_search(item, self.moduleDict, self.searchActions)
diff --git a/specials/tvmoviedb.py b/specials/tvmoviedb.py
index 1c40343b..d203d188 100644
--- a/specials/tvmoviedb.py
+++ b/specials/tvmoviedb.py
@@ -6,8 +6,8 @@ from core import filetools, jsontools, trakt_tools
from core import support, tmdb
from core.tmdb import Tmdb
from core.scrapertools import htmlclean, decodeHtmlentities
-from core.support import thumb, typo, match, dbg
-from platformcode import config, logger
+from core.support import nextPage, thumb, typo, match, dbg
+from platformcode import config, logger, platformtools
langs = Item(tmdb=[tmdb.def_lang, 'de', 'fr', 'pt', 'it', 'es-MX', 'ca', 'en', 'es'],
@@ -24,13 +24,8 @@ mal_key = 'MzE1MDQ2cGQ5N2llYTY4Z2xwbGVzZjFzbTY='
def mainlist(item):
logger.debug()
- itemlist = [item.clone(title='TMDB', action='tmdb_menu'),
- item.clone(title='IMDB', action='imdb_menu')]
- # itemlist = [item.clone(title=config.get_localized_string(70021) % (config.get_localized_string(30122), 'TMDB'), action='tmdb_menu', args='movie'),
- # item.clone(title=config.get_localized_string(70021) % (config.get_localized_string(30123), 'TMDB'), action='tmdb_menu', args='tv'),
- # item.clone(title=config.get_localized_string(70021) % (config.get_localized_string(30122), 'IMDB'), action='imdb', args='movie', url='&title_type=feature,tv_movie'),
- # item.clone(title=config.get_localized_string(70021) % (config.get_localized_string(30123), 'IMDB'), action='imdb', args='tv', url='&title_type=tv_series,tv_special,mini_series')]
- support.thumb(itemlist)
+ itemlist = [item.clone(title='TMDB', action='tmdbMenu', thumbnail=support.thumb('tmdb')),
+ item.clone(title='IMDB', action='imdbMenu', thumbnail=support.thumb('imdb'))]
itemlist += [item.clone(title=config.get_localized_string(70415), action='trakt', thumbnail=support.thumb('trakt')),
item.clone(title=config.get_localized_string(70026), action='mal', thumbnail=support.thumb('mal')),
item.clone(title=typo(config.get_localized_string(70027), 'bold'), action='configuracion', folder=False, thumbnail=support.thumb('setting'))]
@@ -38,41 +33,43 @@ def mainlist(item):
-def tmdb_menu(item):
+def tmdbMenu(item):
if not item.args:
- return [item.clone(title=config.get_localized_string(70741) % config.get_localized_string(30122), args='movie'),
- item.clone(title=config.get_localized_string(70741) % config.get_localized_string(30123), args='tv')]
+ return thumb([item.clone(title=config.get_localized_string(70741) % config.get_localized_string(30122), args='movie'),
+ item.clone(title=config.get_localized_string(70741) % config.get_localized_string(30123), args='tv')])
item.contentType = item.args.replace('tv', 'tvshow')
- itemlist = [item.clone(title=config.get_localized_string(70028), action='peliculas', args=item.args + '/popular'),
- item.clone(title=config.get_localized_string(70029), action='peliculas', args=item.args + '/top_rated'),
- item.clone(title=config.get_localized_string(50001), action='peliculas', args=item.args + '/now_playing' if item.args == 'movie' else '/on_the_air'),
- item.clone(title=config.get_localized_string(70032), action='indices_tmdb'),
- item.clone(title=config.get_localized_string(70042), action='indices_tmdb')]
+ itemlist = [item.clone(title=config.get_localized_string(70028), action='tmdbResults', args=item.args + '/popular'),
+ item.clone(title=config.get_localized_string(70029), action='tmdbResults', args=item.args + '/top_rated'),
+ item.clone(title=config.get_localized_string(50001), action='tmdbResults', args=item.args + '/now_playing' if item.args == 'movie' else '/on_the_air'),
+ item.clone(title=config.get_localized_string(70032), action='tmdbIndex', mode='genre'),
+ item.clone(title=config.get_localized_string(70042), action='tmdbIndex', mode='year')]
if item.args == 'movie':
- itemlist.extend([item.clone(title=config.get_localized_string(70033), action='peliculas', args='person/popular'),
- item.clone(title=config.get_localized_string(70034), action='list_tmdb', args=item.args + '/upcoming')])
+ itemlist.extend([item.clone(title=config.get_localized_string(70033), action='tmdbResults', args='person/popular'),
+ item.clone(title=config.get_localized_string(70034), action='tmdbResults', args=item.args + '/upcoming')])
- itemlist.extend([item.clone(title=config.get_localized_string(70035) % config.get_localized_string(60244 if item.args == 'movie' else 60245).lower(), action='search_', search={'url': 'search/%s' % item.args, 'language': lang.tmdb, 'page': 1}),
- item.clone(title=config.get_localized_string(70036), action='search_', search={'url': 'search/person', 'language': lang.tmdb, 'page': 1})])
+ itemlist.extend([item.clone(title=config.get_localized_string(70035) % config.get_localized_string(60244 if item.args == 'movie' else 60245).lower(), action='_search', search={'url': 'search/%s' % item.args, 'language': lang.tmdb, 'page': 1}),
+ item.clone(title=config.get_localized_string(70036), action='_search', search={'url': 'search/person', 'language': lang.tmdb, 'page': 1})])
- if item.args == 'movie': itemlist.append(item.clone(title=config.get_localized_string(70037), action='search_', search={'url': 'search/person', 'language': lang.tmdb, 'page': 1}, crew=True))
+ if item.args == 'movie': itemlist.append(item.clone(title=config.get_localized_string(70037), action='_search', search={'url': 'search/person', 'language': lang.tmdb, 'page': 1}, crew=True))
itemlist.extend([item.clone(title=typo(config.get_localized_string(70038),'bold'), action='filter', ),
item.clone(title=typo(config.get_localized_string(70039),'bold'), action='filter', )])
return thumb(itemlist)
-def peliculas(item):
+
+def tmdbResults(item):
itemlist = []
- _search = {'url': item.args, 'language': lang.tmdb, 'page': item.page if item.page else 1}
+ if not item.page: item.page = 1
+ _search = item.search if item.search else {'url': item.args, 'language': lang.tmdb, 'page': item.page}
obj = tmdb.discovery(item, _search)
for result in obj.results:
- if 'person' in item.args:
+ if 'person' in _search['url']:
it = item.clone(action='showCast', channel='infoplus', folder=False)
it.id = result.get('id')
else:
@@ -81,4 +78,128 @@ def peliculas(item):
for k in ['title', 'thumbnail', 'fanart']:
it.__setattr__(k, it.infoLabels.get(k))
itemlist.append(it)
+
+ if item.page < obj.total_pages:
+ support.nextPage(itemlist, item, 'peliculas', page=item.page + 1, total_pages=obj.total_pages)
return itemlist
+
+def tmdbIndex(item):
+ itemlist = []
+ from datetime import datetime
+ if item.mode == 'genre':
+ url = '{}/{}/list?api_key={}&language={}'.format(tmdb.host, item.mode, tmdb.api, lang.tmdb)
+ genres = match(url, cookies=False).response.json['genres']
+
+ date = datetime.now().strftime('%Y-%m-%d')
+ sort_by = 'release_date.desc'
+ param_year = 'release_date.lte'
+ if item.contentType == 'tvshow':
+ sort_by = 'first_air_date.desc'
+ param_year = 'air_date.lte'
+ for genre in genres:
+ search = {'url': 'discover/{}'.format(item.args), 'with_genres': genre['id'], 'sort_by': sort_by, param_year: date,'language': lang.tmdb, 'page': 1}
+ new_item = item.clone(title=genre['name'], action='tmdbResults', search=search, mode='')
+ itemlist.append(new_item)
+
+ itemlist.sort(key=lambda item: item.title)
+ thumb(itemlist, mode='genre')
+ else:
+ year = datetime.now().year + 3
+ for i in range(year, 1899, -1):
+ if item.contentType == 'tvshow':
+ param_year = 'first_air_date_year'
+ else:
+ param_year = 'primary_release_year'
+ search = {'url': 'discover/{}'.format(item.args), param_year: i, 'language': lang.tmdb, 'page': 1}
+ itemlist.append(item.clone(title=str(i), action='tmdbResults', search=search))
+
+ return itemlist
+
+def _search(item):
+ text = platformtools.dialog_input(heading=item.title)
+ if text:
+ item.search['query'] = text
+ return tmdbResults(item)
+
+
+
+############################################################
+
+def filter(item):
+ logger.debug()
+
+ from datetime import datetime
+ list_controls = []
+ valores = {}
+
+ dict_values = None
+
+ list_controls.append({'id': 'years', 'label': config.get_localized_string(60232), 'enabled': True, 'type': 'list', 'default': -1, 'visible': True})
+ list_controls[0]['lvalues'] = []
+ valores['years'] = []
+ year = datetime.now().year + 1
+ for i in range(1900, year + 1):
+ list_controls[0]['lvalues'].append(str(i))
+ valores['years'].append(str(i))
+ list_controls[0]['lvalues'].append(config.get_localized_string(70450))
+ valores['years'].append('')
+
+ if config.get_localized_string(70038) in item.title:
+ # Se utilizan los valores por defecto/guardados
+ saved_values = config.get_setting("default_filter_" + item.args, item.channel)
+ if saved_values:
+ dict_values = saved_values
+ # dbg()
+ url = '{}/genre/{}/list?api_key={}&language={}'.format(tmdb.host, item.args, tmdb.api, lang.tmdb)
+ # try:
+ lista = support.match(url, cookies=False).response.json["genres"]
+ if lista:
+ list_controls.append({'id': 'labelgenre', 'enabled': True, 'type': 'label', 'default': None, 'label': config.get_localized_string(70451), 'visible': True})
+ for l in lista:
+ list_controls.append({'id': 'genre' + str(l["id"]), 'label': l["name"], 'enabled': True, 'type': 'bool', 'default': False, 'visible': True})
+ # except:
+ # pass
+
+ list_controls.append({'id': 'orden', 'label': config.get_localized_string(70455), 'enabled': True, 'type': 'list', 'default': -1, 'visible': True})
+ orden = [config.get_localized_string(70456), config.get_localized_string(70457), config.get_localized_string(70458), config.get_localized_string(70459), config.get_localized_string(70460), config.get_localized_string(70461)]
+ if item.args == "movie":
+ orden.extend([config.get_localized_string(70462), config.get_localized_string(70463)])
+ orden_tmdb = ['popularity.desc', 'popularity.asc', 'release_date.desc', 'release_date.asc', 'vote_average.desc', 'vote_average.asc', 'original_title.asc', 'original_title.desc']
+ valores['orden'] = []
+ list_controls[-1]['lvalues'] = []
+ for i, tipo_orden in enumerate(orden):
+ list_controls[-1]['lvalues'].insert(0, tipo_orden)
+ valores['orden'].insert(0, orden_tmdb[i])
+
+ list_controls.append({'id': 'espacio', 'label': '', 'enabled': False, 'type': 'label', 'default': None, 'visible': True})
+ list_controls.append({'id': 'save', 'label': config.get_localized_string(70464), 'enabled': True, 'type': 'bool', 'default': False, 'visible': True})
+ else:
+ list_controls.append({'id': 'keyword', 'label': config.get_localized_string(70465), 'enabled': True, 'type': 'text', 'default': '', 'visible': True})
+
+ item.valores = valores
+ return platformtools.show_channel_settings(list_controls=list_controls, dict_values=dict_values, caption=config.get_localized_string(70320), item=item, callback='filtered')
+
+def filtered(item, values):
+ values_copy = values.copy()
+ # Save the filter to be the one loaded by default
+ if "save" in values and values["save"]:
+ values_copy.pop("save")
+ config.set_setting("default_filter_" + item.args, values_copy, item.channel)
+
+ year = item.valores["years"][values["years"]]
+ if config.get_localized_string(70038) in item.title:
+ orden = item.valores["orden"][values["orden"]]
+ if item.args == "tv": orden = orden.replace('release_date', 'first_air_date')
+
+ genre_ids = []
+ for v in values:
+ if "genre" in v:
+ if values[v]: genre_ids.append(v.replace('genre', ''))
+ genre_ids = ",".join(genre_ids)
+
+ if config.get_localized_string(70465).lower() in item.title.lower(): item.search = {'url': 'search/%s' % item.args, 'year': year, 'query': values["keyword"], 'language': lang.tmdb, 'page': 1}
+ elif item.args == "movie": item.search = {'url': 'discover/%s' % item.args, 'sort_by': orden, 'primary_release_year': year, 'with_genres': genre_ids, 'vote_count.gte': '10', 'language': lang.tmdb, 'page': 1}
+ else: item.search = {'url': 'discover/%s' % item.args, 'sort_by': orden, 'first_air_date_year': year, 'with_genres': genre_ids, 'vote_count.gte': '10', 'language': lang.tmdb, 'page': 1}
+
+ item.action = "list_tmdb"
+ return tmdbResults(item)
\ No newline at end of file