From e3129b9b9ed06c1880bc43e6a99cfdd7ecfee4eb Mon Sep 17 00:00:00 2001 From: Alhaziel01 Date: Mon, 28 Sep 2020 17:34:02 +0200 Subject: [PATCH] Fix vari: - AnimeWorld - InfoPlus - Configura canale - Rinumerazione --- channels/animeworld.py | 2 +- core/tvdb.py | 20 ++--- core/videolibrarytools.py | 4 +- platformcode/autorenumber.py | 12 +-- platformcode/infoplus.py | 82 ++++++++++++++++-- platformcode/xbmc_config_menu.py | 60 +++++++------ .../Default/media/Infoplus/next_focus.png | Bin 0 -> 4263 bytes .../Default/media/Infoplus/next_nofocus.png | Bin 0 -> 4325 bytes .../Default/media/Infoplus/previous_focus.png | Bin 0 -> 3271 bytes .../media/Infoplus/previous_nofocus.png | Bin 0 -> 4328 bytes .../skins/Default/media/Infoplus/white.png | Bin 0 -> 167 bytes specials/downloads.py | 2 +- specials/videolibrary.py | 13 ++- 13 files changed, 136 insertions(+), 59 deletions(-) create mode 100644 resources/skins/Default/media/Infoplus/next_focus.png create mode 100644 resources/skins/Default/media/Infoplus/next_nofocus.png create mode 100644 resources/skins/Default/media/Infoplus/previous_focus.png create mode 100644 resources/skins/Default/media/Infoplus/previous_nofocus.png create mode 100644 resources/skins/Default/media/Infoplus/white.png diff --git a/channels/animeworld.py b/channels/animeworld.py index d060089a..4897b96d 100644 --- a/channels/animeworld.py +++ b/channels/animeworld.py @@ -156,7 +156,7 @@ def peliculas(item): action='episodios' # Controlla la lingua se assente - patronNext=r' 0 else {} if item: - # from core.support import dbg;dbg() item.channel = item.from_channel if item.from_channel else item.channel title = item.fulltitle.rstrip() already_renumbered = scrapertools.find_single_match(itemlist[0].title, r'(\d+\D\d+)') @@ -142,7 +141,6 @@ def config_item(item, itemlist=[], typography='', active=False): def semiautomatic_config_item(item): logger.info() # Configurazione Semi Automatica, utile in caso la numerazione automatica fallisca - tvdb.find_and_set_infoLabels(item) item.channel = item.from_channel if item.from_channel else item.channel dict_series = load(item) @@ -295,14 +293,14 @@ def manual_renumeration(item, modify=False): dict_series[title] = dict_renumerate itemlist = find_episodes(item) - for item in itemlist: - Title = re.sub(r'\d+x\d+ - ', '', item.title) + for it in itemlist: + Title = re.sub(r'\d+x\d+ - ', '', it.title) if modify == True: ep = int(scrapertools.find_single_match(Title, r'(\d+)')) - if item.action == 'findvideos' and str(ep) not in EpisodeDict: + if it.action == 'findvideos' and str(ep) not in EpisodeDict: _list.append(Title) else: - if item.action == 'findvideos': + if it.action == 'findvideos': _list.append(Title) count = 1 @@ -317,6 +315,8 @@ def manual_renumeration(item, modify=False): season = '' while not season: season = platformtools.dialog_numeric(0, config.get_localized_string(70733)) + count = int(platformtools.dialog_numeric(0, config.get_localized_string(70733))) + for select in selected: ep = int(scrapertools.find_single_match(_list[select], r'(\d+)')) if season == '0': diff --git a/platformcode/infoplus.py b/platformcode/infoplus.py index 406f6f4f..b5a0cc6a 100644 --- a/platformcode/infoplus.py +++ b/platformcode/infoplus.py @@ -28,6 +28,8 @@ RATING_ICON = 30005 RATING = 30006 TRAILER = 30007 SEARCH = 30008 +NEXT = 30009 +PREVIOUS = 30010 LOADING = 30011 COMMANDS = 30012 RECOMANDED = TRAILERS = 30500 @@ -118,12 +120,11 @@ class MainWindow(xbmcgui.WindowXMLDialog): if not rating: rating = 'N/A' self.getControl(FANART).setImage(fanart) self.getControl(RATING).setText(rating) - if self.getFocus() > 0: - cast, actors = get_cast(self.getControl(self.getFocusId()).getSelectedItem()) - self.getControl(ACTORS).reset() - self.getControl(ACTORS).addItems(actors) - self.getControl(CAST).reset() - self.getControl(CAST).addItems(cast) + cast, actors = get_cast(self.getControl(self.getFocusId()).getSelectedItem()) + self.getControl(ACTORS).reset() + self.getControl(ACTORS).addItems(actors) + self.getControl(CAST).reset() + self.getControl(CAST).addItems(cast) action = action.getId() if action in [BACKSPACE]: self.close() @@ -344,6 +345,75 @@ class TrailerWindow(xbmcgui.WindowXMLDialog): elif action in [EXIT]: self.close() +class images(xbmcgui.WindowDialog): + def __init__(self, *args, **kwargs): + self.tmdb = kwargs.get("tmdb", {}) + self.imdb = kwargs.get("imdb", {}) + self.mal = kwargs.get("mal", {}) + self.fanartv = kwargs.get("fanartv", {}) + + self.image_list = [] + + for key, value in self.tmdb.items(): + for detail in value: self.image_list.append('http://image.tmdb.org/t/p/original' + detail["file_path"]) + for image in self.imdb: self.image_list.append(image["src"]) + for image, title in self.mal: self.image_list.append(image) + for key, value in self.fanartv.items(): + for image in value: self.image_list.append(image["url"]) + + #### Kodi 18 Compatibility #### + if config.get_platform(True)['num_version'] < 18: self.setCoordinateResolution(2) + log + self.background = xbmcgui.ControlImage(0, 0, 1280, 720, imagepath('white'), colorDiffuse='FF232323') + self.addControl(self.background) + main_image = self.image_list[0] if self.image_list else '' + self.main_image = xbmcgui.ControlImage(0, 0, 1280, 720, main_image, 2) + self.addControl(self.main_image) + + self.close_btn = xbmcgui.ControlButton(0, 0, 1280, 720, '' ,'', '') + self.addControl(self.close_btn) + + # BUTTON LEFT + self.btn_left = xbmcgui.ControlButton(0, 330, 60, 60, '', imagepath('previous_focus'), imagepath('previous_nofocus')) + self.addControl(self.btn_left) + self.btn_left.setAnimations([('WindowOpen', 'effect=slide start=-60,0 end=0,0 delay=100 time=200'),('WindowClose', 'effect=slide start=0,0 end=-60,0 delay=100 time=200')]) + + # BUTTON RIGHT + self.btn_right = xbmcgui.ControlButton(1220, 330, 60, 60, '', imagepath('next_focus'), imagepath('next_nofocus')) + self.addControl(self.btn_right) + self.btn_right.setAnimations([('WindowOpen', 'effect=slide start=60,0 end=0,0 delay=100 time=200'),('WindowClose', 'effect=slide start=0,0 end=60,0 delay=100 time=200')]) + + self.count = 0 + + def onAction(self, action): + if action in [BACKSPACE, EXIT]: + self.close() + + if action in [RIGHT, DOWN]: + self.count += 1 + if self.count > len(self.image_list) -1: self.count = 0 + self.main_image.setImage(self.image_list[self.count]) + + if action in [LEFT, UP]: + self.count -= 1 + if self.count < 0: self.count = len(self.image_list) -1 + self.main_image.setImage(self.image_list[self.count]) + + + def onControl(self, control): + if control.getId() == self.btn_right.getId(): + self.count += 1 + if self.count > len(self.image_list) -1: self.count = 0 + self.main_image.setImage(self.image_list[self.count]) + + elif control.getId() == self.btn_left.getId(): + self.count -= 1 + if self.count < 0: self.count = len(self.image_list) -1 + self.main_image.setImage(self.image_list[self.count]) + + else: + self.close() + def get_recomendations(info): recommendations = [info] diff --git a/platformcode/xbmc_config_menu.py b/platformcode/xbmc_config_menu.py index f578e2bd..c3a79e2a 100644 --- a/platformcode/xbmc_config_menu.py +++ b/platformcode/xbmc_config_menu.py @@ -371,32 +371,30 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): def add_control_text(self, c): - if xbmcgui.ControlEdit == ControlEdit: - control = xbmcgui.ControlEdit(0, -100, self.controls_width, self.height_control, c["label"], - os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), - os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'), 0, - textColor=c["color"], font=self.font, isPassword=c["hidden"], window=self) + control = xbmcgui.ControlEdit(0, -100, self.controls_width, self.height_control, + c["label"], self.font, c["color"], '', 1 | 4, + focusTexture='', + noFocusTexture='') + if c['hidden']: control.setType(xbmcgui.INPUT_TYPE_PASSWORD) - else: - control = xbmcgui.ControlEdit(0, -100, self.controls_width, self.height_control, - c["label"], self.font, c["color"], '', 1 | 4, isPassword=c["hidden"], - focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), - noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png')) + image = xbmcgui.ControlImage(0, -100, self.controls_width + 10, self.height_control, os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png')) + self.addControl(image) self.addControl(control) + image.setVisibleCondition('Control.HasFocus(%s)' % control.getId(), True) control.setVisible(False) control.setLabel(c["label"]) # frodo fix s = self.values[c["id"]] - if s is None: - s = '' + if s is None: s = c['default'] if 'default' in c else '' + control.setText(s) - # control.setText(self.values[c["id"]]) - control.setWidth(self.controls_width + 10) + control.setWidth(self.controls_width-10) control.setHeight(self.height_control) c["control"] = control + c['image'] = image def add_control_bool(self, c): # Old versions do not support some textures @@ -405,24 +403,34 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): label=c["label"], font=self.font, textColor=c["color"], focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png')) - else: + elif xbmcgui.__version__ in ["3.0", "3.0.0"]: control = xbmcgui.ControlRadioButton(0, -100, self.controls_width + 20, self.height_control, label=c["label"], font=self.font, textColor=c["color"], - focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), - noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'), focusOnTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-focus.png'), noFocusOnTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-focus.png'), focusOffTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-nofocus.png'), noFocusOffTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-nofocus.png')) - + else: + control = xbmcgui.ControlRadioButton(0, -100, self.controls_width + 20, + self.height_control, label=c["label"], font=self.font, + textColor=c["color"], + focusTexture='', + noFocusTexture='', + focusOnTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-focus.png'), + noFocusOnTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-focus.png'), + focusOffTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-nofocus.png'), + noFocusOffTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-nofocus.png')) + image = xbmcgui.ControlImage(0, -100, self.controls_width + 10, self.height_control, os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png')) + self.addControl(image) self.addControl(control) - + image.setVisibleCondition('Control.HasFocus(%s)' % control.getId(), True) control.setVisible(False) control.setRadioDimension(x=self.controls_width - (self.height_control - 5), y=0, width=self.height_control - 5, height=self.height_control - 5) control.setSelected(self.values[c["id"]]) c["control"] = control + c['image'] = image def onInit(self): self.getControl(10004).setEnabled(False) @@ -446,8 +454,6 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): self.getControl(10006).setLabel(self.custom_button['label']) else: self.getControl(10006).setVisible(False) - # self.getControl(10004).setPosition(self.getControl(10004).getPosition()[0], self.getControl(10004).getPosition()[1]) - # self.getControl(10005).setPosition(self.getControl(10005).getPosition()[0], self.getControl(10005).getPosition()[1]) # Control Area Dimensions self.controls_width = self.getControl(10007).getWidth() - 30 @@ -543,15 +549,17 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): c["y"] = self.controls_pos_y + visible_count * self.height_control visible_count += 1 - if c["type"] != "list": - if c["type"] == "bool": c["control"].setPosition(self.controls_pos_x, c["y"]) - else: c["control"].setPosition(self.controls_pos_x, c["y"]) - - else: + if c["type"] == "list": c["control"].setPosition(self.controls_pos_x, c["y"]) if xbmcgui.__version__ == "1.2": c["label"].setPosition(self.controls_pos_x + self.controls_width - 30, c["y"]) else: c["label"].setPosition(self.controls_pos_x, c["y"]) + else: + if c["type"] == "bool": c["control"].setPosition(self.controls_pos_x, c["y"]) + elif c['type'] == 'text': c["control"].setPosition(self.controls_pos_x +10, c["y"]) + else: c["control"].setPosition(self.controls_pos_x, c["y"]) + if c['type'] in ['bool', 'text']:c['image'].setPosition(self.controls_pos_x, c["y"]) + self.set_visible(c, True) # Calculate the position and size of the ScrollBar diff --git a/resources/skins/Default/media/Infoplus/next_focus.png b/resources/skins/Default/media/Infoplus/next_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..957621c3cabbd6facdbd67a74f814bf870e88323 GIT binary patch literal 4263 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 literal 0 HcmV?d00001 diff --git a/resources/skins/Default/media/Infoplus/next_nofocus.png b/resources/skins/Default/media/Infoplus/next_nofocus.png new file mode 100644 index 0000000000000000000000000000000000000000..124575fe4b962a7bc6aade39a66e7f5d906bdfc9 GIT binary patch literal 4325 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 I6z$Ug0-ez8y8r+H literal 0 HcmV?d00001 diff --git a/resources/skins/Default/media/Infoplus/previous_focus.png b/resources/skins/Default/media/Infoplus/previous_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..10ae7b4cc5edbc7f52ac417ee1c7744231bb26dc GIT binary patch literal 3271 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 QR4BKRosp}2HBH_0UsepyApigX literal 0 HcmV?d00001 diff --git a/resources/skins/Default/media/Infoplus/white.png b/resources/skins/Default/media/Infoplus/white.png new file mode 100644 index 0000000000000000000000000000000000000000..528c66f6e8ed820dff50fb927f805aebd269327b GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^EFjDXBp4dI7GDNZ3dtTpz6=aiY77hwEes65fIO>_%)r1c48n{Iv*t(u z1=&kHeO=k_bFwnXa0y>fiUJDpc)B=-a9mIRae$$XfuDo