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