From d0c3294314703b85398a6ce3e5458872baae09d8 Mon Sep 17 00:00:00 2001 From: Alhaziel01 Date: Thu, 18 Jun 2020 17:13:44 +0200 Subject: [PATCH] =?UTF-8?q?-=20Unico=20Tread=20per:=20=20=20-=20Segna=20co?= =?UTF-8?q?me=20visto=20=20=20-=20Episodio=20successivo=20-=20Rimosse=20im?= =?UTF-8?q?postazioni=20nascondi=20server=20(non=20pi=C3=B9=20necessarie)?= =?UTF-8?q?=20-=20Ottimizzazione=20grafica=20finestre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- channels/cineblog01.py | 2 +- core/support.py | 7 +- platformcode/launcher.py | 110 +++----- platformcode/platformtools.py | 100 ++++++- platformcode/xbmc_videolibrary.py | 266 +++++++++++------- .../resource.language.en_gb/strings.po | 4 + .../resource.language.it_it/strings.po | 4 + resources/settings.xml | 10 +- .../skins/Default/720p/ChannelSettings.xml | 24 +- .../skins/Default/720p/DarkShortCutMenu.xml | 14 +- resources/skins/Default/720p/InfoWindow.xml | 22 +- resources/skins/Default/720p/NextDialog.xml | 112 +++----- .../skins/Default/720p/NextDialogCompact.xml | 120 +++----- .../skins/Default/720p/NextDialogExtended.xml | 113 ++++---- resources/skins/Default/720p/Recaptcha.xml | 68 ++--- .../skins/Default/720p/ResumePlayback.xml | 44 ++- resources/skins/Default/720p/ShortCutMenu.xml | 14 +- .../media/Controls/DialogCloseButton.png | Bin 1471 -> 0 bytes .../Default/media/Controls/KeyboardKey.png | Bin 1162 -> 0 bytes .../Default/media/Controls/KeyboardKeyNF.png | Bin 1059 -> 0 bytes .../media/Controls/KeyboardKeyWhite.png | Bin 1183 -> 0 bytes .../Default/media/Controls/ScrollBack.png | Bin 1208 -> 0 bytes .../Default/media/Controls/ScrollBar.png | Bin 1162 -> 0 bytes .../media/Controls/background-diffuse.png | Bin 1627 -> 0 bytes .../Default/media/Controls/check_mark.png | Bin 2424 -> 2461 bytes .../dialog-bg-solid.png | Bin .../Default/media/Controls/dialogheader.png | Bin 1086 -> 0 bytes .../Default/media/Controls/spinDown-Focus.png | Bin 866 -> 0 bytes .../media/Controls/spinDown-noFocus.png | Bin 912 -> 0 bytes .../Default/media/Controls/spinUp-Focus.png | Bin 863 -> 0 bytes .../Default/media/Controls/spinUp-noFocus.png | Bin 902 -> 0 bytes .../media/NextDialog/background-diffuse.png | Bin 1627 -> 0 bytes .../media/NextDialog/background-play.png | Bin 3409 -> 3683 bytes .../Default/media/NextDialog/close-nf.png | Bin 11226 -> 0 bytes .../NextDialog/{close-fo.png => close.png} | Bin .../Default/media/NextDialog/play-fo.png | Bin 2012 -> 0 bytes .../Default/media/NextDialog/play-nf.png | Bin 2007 -> 0 bytes .../skins/Default/media/NextDialog/play.png | Bin 0 -> 2135 bytes .../DialogCloseButton-focus.png => close.png} | Bin resources/skins/Default/media/white.png | Bin 0 -> 167 bytes specials/autoplay.py | 11 +- specials/nextep.py | 207 -------------- specials/videolibrary.py | 6 +- 43 files changed, 557 insertions(+), 701 deletions(-) delete mode 100644 resources/skins/Default/media/Controls/DialogCloseButton.png delete mode 100644 resources/skins/Default/media/Controls/KeyboardKey.png delete mode 100644 resources/skins/Default/media/Controls/KeyboardKeyNF.png delete mode 100644 resources/skins/Default/media/Controls/KeyboardKeyWhite.png delete mode 100644 resources/skins/Default/media/Controls/ScrollBack.png delete mode 100644 resources/skins/Default/media/Controls/ScrollBar.png delete mode 100644 resources/skins/Default/media/Controls/background-diffuse.png rename resources/skins/Default/media/{Shortcut => Controls}/dialog-bg-solid.png (100%) delete mode 100644 resources/skins/Default/media/Controls/dialogheader.png delete mode 100644 resources/skins/Default/media/Controls/spinDown-Focus.png delete mode 100644 resources/skins/Default/media/Controls/spinDown-noFocus.png delete mode 100644 resources/skins/Default/media/Controls/spinUp-Focus.png delete mode 100644 resources/skins/Default/media/Controls/spinUp-noFocus.png delete mode 100644 resources/skins/Default/media/NextDialog/background-diffuse.png delete mode 100644 resources/skins/Default/media/NextDialog/close-nf.png rename resources/skins/Default/media/NextDialog/{close-fo.png => close.png} (100%) delete mode 100644 resources/skins/Default/media/NextDialog/play-fo.png delete mode 100644 resources/skins/Default/media/NextDialog/play-nf.png create mode 100644 resources/skins/Default/media/NextDialog/play.png rename resources/skins/Default/media/{Controls/DialogCloseButton-focus.png => close.png} (100%) create mode 100644 resources/skins/Default/media/white.png delete mode 100644 specials/nextep.py diff --git a/channels/cineblog01.py b/channels/cineblog01.py index aace84e3..31ced302 100644 --- a/channels/cineblog01.py +++ b/channels/cineblog01.py @@ -267,4 +267,4 @@ def findvid_serie(item): def play(item): support.log() - return servertools.find_video_items(data=item.url) + return servertools.find_video_items(item, data=item.url) diff --git a/core/support.py b/core/support.py index 17afbf28..5cdb85e8 100755 --- a/core/support.py +++ b/core/support.py @@ -1192,9 +1192,6 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru if patronTag: addQualityTag(item, verifiedItemlist, data, patronTag) - # Auto Play & Hide Links - AP = config.get_setting('autoplay') - # Check Links if not item.global_search and (config.get_setting('checklinks') or config.get_setting('checklinks', item.channel)): if config.get_setting('checklinks', item.channel): @@ -1210,8 +1207,8 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru videolibrary(verifiedItemlist, item) if Download: download(verifiedItemlist, item, function_level=3) - if item.contentChannel == 'videolibrary' or not config.get_setting('autoplay') or not config.get_setting('hide_servers'): - return verifiedItemlist + # if item.contentChannel == 'videolibrary' or not config.get_setting('autoplay'): + return verifiedItemlist def filterLang(item, itemlist): diff --git a/platformcode/launcher.py b/platformcode/launcher.py index 8ed62f79..a2c70eb5 100644 --- a/platformcode/launcher.py +++ b/platformcode/launcher.py @@ -400,7 +400,6 @@ def limit_itemlist(itemlist): def play_from_library(item): - # from core.support import dbg;dbg() """ The .strm files when played from kodi, this expects it to be a "playable" file so it cannot contain more items, at most a selection dialog can be placed. @@ -413,96 +412,65 @@ def play_from_library(item): """ import xbmcgui, xbmcplugin, xbmc from time import sleep, time - from specials import nextep - - def show_server(item, itemlist, p_dialog): - if item.show_server: - # The number of links to show is limited - if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist) - # The list of links is slightly "cleaned" - if config.get_setting("replace_VD", "videolibrary") == 1: itemlist = reorder_itemlist(itemlist) - - p_dialog.update(100, ''); sleep(0.5); p_dialog.close() - - if len(itemlist) > 0: - while not xbmc.Monitor().abortRequested(): - # The user chooses the mirror - options = [] - selection_implementation =0 - for item in itemlist: - item.thumbnail = "https://github.com/kodiondemand/media/raw/master/resources/servers/" + item.server.lower() + '.png' - quality = '[B][' + item.quality + '][/B]' if item.quality else '' - if item.server: - it = xbmcgui.ListItem('\n[B]%s[/B] %s - %s' % (item.server, quality, item.contentTitle)) - it.setArt({'thumb':item.thumbnail}) - options.append(it) - else: - selection_implementation += 1 - # The selection window opens - if (item.contentSerieName and item.contentSeason and item.contentEpisodeNumber): head = ("%s - %sx%s | %s" % (item.contentSerieName, item.contentSeason, item.contentEpisodeNumber, config.get_localized_string(30163))) - else: head = config.get_localized_string(30163) - selection = platformtools.dialog_select(head, options, preselect= -1, useDetails=True) - if selection == -1: - return - else: - item = videolibrary.play(itemlist[selection + selection_implementation])[0] - item.play_from = 'window' - platformtools.play_video(item) - if (platformtools.is_playing() and item.action) or item.server == 'torrent' or config.get_setting('autoplay'): break itemlist=[] item.fromLibrary = True logger.info() - logger.debug("item: \n" + item.tostring('\n')) + # logger.debug("item: \n" + item.tostring('\n')) - # We try to reproduce an image (this does nothing and also does not give an error) + # Try to reproduce an image (this does nothing and also does not give an error) xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xbmcgui.ListItem(path=os.path.join(config.get_runtime_path(), "resources", "kod.mp4"))) xbmc.Player().stop() - # we modify the action (currently the video library needs "findvideos" since this is where the sources are searched + # Modify the action (currently the video library needs "findvideos" since this is where the sources are searched item.action = "findvideos" - check_next_ep = nextep.check(item) window_type = config.get_setting("window_type", "videolibrary") - - # and we launch kodi again + # and launch kodi again if xbmc.getCondVisibility('Window.IsMedia') and not window_type == 1: # Conventional window xbmc.executebuiltin("Container.Update(" + sys.argv[0] + "?" + item.tourl() + ")") else: - # from core.support import dbg;dbg() # Pop-up window - if config.get_setting('autoplay') and config.get_setting('hide_servers'): - item.show_server = False - else: - item.show_server = True - from specials import videolibrary, autoplay p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), config.get_localized_string(60683)) p_dialog.update(0, '') - + item.play_from = 'window' itemlist = videolibrary.findvideos(item) + p_dialog.update(100, ''); sleep(0.5); p_dialog.close() + while platformtools.is_playing(): # Conventional window + sleep(1) + play_time = platformtools.resume_playback(item, True) + if not play_time: + return - # if not config.get_setting('autoplay'): show_server(item, itemlist, p_dialog) - - if check_next_ep: - item.show_server = True - # p_dialog.update(100, '') - # sleep(0.5) - # p_dialog.close() - if not config.get_setting('autoplay'): show_server(item, itemlist, p_dialog) - item = nextep.return_item(item) - if item.next_ep: return play_from_library(item) - else: - while platformtools.is_playing(): # Conventional window - sleep(5) - p_dialog.update(50, '') - - show_server(item, itemlist, p_dialog) - - if item.show_server and check_next_ep: - nextep.run(item) - sleep(0.5) - p_dialog.close() + # The number of links to show is limited + if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist) + # The list of links is slightly "cleaned" + if config.get_setting("replace_VD", "videolibrary") == 1: itemlist = reorder_itemlist(itemlist) + if len(itemlist) > 0: + while not xbmc.Monitor().abortRequested(): + # The user chooses the mirror + options = [] + selection_implementation = 0 + for item in itemlist: + item.thumbnail = "https://github.com/kodiondemand/media/raw/master/resources/servers/" + item.server.lower() + '.png' + quality = '[B][' + item.quality + '][/B]' if item.quality else '' + if item.server: + it = xbmcgui.ListItem('\n[B]%s[/B] %s - %s' % (item.server, quality, item.contentTitle)) + it.setArt({'thumb':item.thumbnail}) + options.append(it) + else: + selection_implementation += 1 + # The selection window opens + if (item.contentSerieName and item.contentSeason and item.contentEpisodeNumber): head = ("%s - %sx%s | %s" % (item.contentSerieName, item.contentSeason, item.contentEpisodeNumber, config.get_localized_string(30163))) + else: head = config.get_localized_string(30163) + selection = platformtools.dialog_select(head, options, preselect= -1, useDetails=True) + if selection == -1: + return + else: + item = videolibrary.play(itemlist[selection + selection_implementation])[0] + platformtools.play_video(item) + if (platformtools.is_playing() and item.action) or item.server == 'torrent' or config.get_setting('autoplay'): break \ No newline at end of file diff --git a/platformcode/platformtools.py b/platformcode/platformtools.py index 986c7985..df1def61 100644 --- a/platformcode/platformtools.py +++ b/platformcode/platformtools.py @@ -548,7 +548,10 @@ def play_video(item, strm=False, force_direct=False, autoplay=False): xlistitem.setProperty('inputstream.adaptive.manifest_type', 'mpd') if force_direct: item.play_from = 'window' - set_player(item, xlistitem, mediaurl, view, strm) + + + nfo_path, head_nfo, item_nfo = resume_playback(item) + set_player(item, xlistitem, mediaurl, view, strm, nfo_path, head_nfo, item_nfo) def stop_video(): @@ -876,9 +879,9 @@ def get_video_seleccionado(item, seleccion, video_urls): return mediaurl, view, mpd -def set_player(item, xlistitem, mediaurl, view, strm): +def set_player(item, xlistitem, mediaurl, view, strm, nfo_path=None, head_nfo=None, item_nfo=None): logger.info() - logger.debug("item:\n" + item.tostring('\n')) + # logger.debug("item:\n" + item.tostring('\n')) # Moved del conector "torrent" here if item.server == "torrent": play_torrent(item, xlistitem, mediaurl) @@ -914,7 +917,7 @@ def set_player(item, xlistitem, mediaurl, view, strm): # if it is a video library file send to mark as seen if strm or item.strm_path: from platformcode import xbmc_videolibrary - xbmc_videolibrary.mark_auto_as_watched(item) + xbmc_videolibrary.mark_auto_as_watched(item, nfo_path, head_nfo, item_nfo) xlistitem.setPath(mediaurl) xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xlistitem) xbmc.sleep(2500) @@ -938,7 +941,7 @@ def set_player(item, xlistitem, mediaurl, view, strm): # if it is a video library file send to mark as seen if strm or item.strm_path: from platformcode import xbmc_videolibrary - xbmc_videolibrary.mark_auto_as_watched(item) + xbmc_videolibrary.mark_auto_as_watched(item, nfo_path, head_nfo, item_nfo) def torrent_client_installed(show_tuple=False): @@ -998,4 +1001,89 @@ def play_torrent(item, xlistitem, mediaurl): def log(texto): - xbmc.log(texto, xbmc.LOGNOTICE) \ No newline at end of file + xbmc.log(texto, xbmc.LOGNOTICE) + +def resume_playback(item, return_played_time=False): + class ResumePlayback(xbmcgui.WindowXMLDialog): + Close = False + Resume = False + + def __init__(self, *args, **kwargs): + self.action_exitkeys_id = [xbmcgui.ACTION_BACKSPACE, xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK] + self.progress_control = None + self.item = kwargs.get('item') + m, s = divmod(float(self.item.played_time), 60) + h, m = divmod(m, 60) + self.setProperty("time", '%02d:%02d:%02d' % (h, m, s)) + + def set_values(self, value): + self.Resume = value + self.Close = True + + def is_close(self): + return self.Close + + def onClick(self, controlId): + if controlId == 3012: # Resume + self.set_values(True) + self.close() + elif controlId == 3013: # Cancel + self.set_values(False) + self.close() + + def onAction(self, action): + if action in self.action_exitkeys_id: + self.set_values(False) + self.close() + + + from core import videolibrarytools, filetools + + # if nfo and strm_path not exist + if not item.nfo: + if item.contentType == 'movie': + vl = xbmc.translatePath(filetools.join(config.get_setting("videolibrarypath"), config.get_setting("folder_movies"))) + path = '%s [%s]' % (item.contentTitle, item.infoLabels['IMDBNumber']) + item.nfo = filetools.join(vl, path, path + '.nfo') + if not item.strm_path: item.strm_path = filetools.join(path, item.contentTitle + '.strm') + else: + vl = xbmc.translatePath(filetools.join(config.get_setting("videolibrarypath"), config.get_setting("folder_tvshows"))) + path = '%s [%s]' % (item.contentSerieName, item.infoLabels['IMDBNumber']) + item.nfo = filetools.join(vl, path, 'tvshow.nfo') + if item.contentSeason and item.contentEpisodeNumber: + title = str(item.contentSeason) + 'x' + str(item.contentEpisodeNumber).zfill(2) + else: + season, episode = scrapertools.find_single_match(item.title, r'(\d+)x(\d+)') + item.contentSeason = int(season) + item.contentEpisodeNumber = int(episode) + title = season + 'x' + episode.zfill(2) + if not item.strm_path: item.strm_path = filetools.join(path, title + '.strm') + + # Read NFO FILE + if item.contentType == 'movie': + nfo_path = item.nfo + elif xbmc.translatePath(filetools.join(config.get_setting("videolibrarypath"), config.get_setting("folder_tvshows"))) in item.strm_path: + nfo_path = item.strm_path.replace('strm','nfo') + else: + nfo_path = xbmc.translatePath(filetools.join(config.get_setting("videolibrarypath"), config.get_setting("folder_tvshows"),item.strm_path.replace('strm','nfo'))) + if filetools.isfile(nfo_path): + head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path) + + if return_played_time: + return item_nfo.played_time + # Show Window + elif (config.get_setting("player_mode") not in [1, 3] or item.play_from == 'window') and item_nfo.played_time: + Dialog = ResumePlayback('ResumePlayback.xml', config.get_runtime_path(), item=item_nfo) + Dialog.show() + t = 0 + while not Dialog.is_close() and t < 50: + t += 1 + xbmc.sleep(100) + if not Dialog.Resume: item_nfo.played_time = 0 + else: + item_nfo.played_time = 0 + + return nfo_path, head_nfo, item_nfo + else: + item.nfo = item.strm_path = "" + return None, None, None \ No newline at end of file diff --git a/platformcode/xbmc_videolibrary.py b/platformcode/xbmc_videolibrary.py index 636a3131..08bc57bd 100644 --- a/platformcode/xbmc_videolibrary.py +++ b/platformcode/xbmc_videolibrary.py @@ -15,7 +15,7 @@ from core import scrapertools from xml.dom import minidom -def mark_auto_as_watched(item): +def mark_auto_as_watched(item, nfo_path=None, head_nfo=None, item_nfo=None): def mark_as_watched_subThread(item, nfo_path, head_nfo, item_nfo): logger.info() # logger.debug("item:\n" + item.tostring('\n')) @@ -25,22 +25,54 @@ def mark_auto_as_watched(item): time.sleep(1) sync_with_trakt = False + next_episode = None + show_server = True + EXIT = False + percentage = float(config.get_setting("watched_setting")) / 100 - while platformtools.is_playing(): + time_from_end = config.get_setting('next_ep_seconds') + + while platformtools.is_playing() and not EXIT: actual_time = xbmc.Player().getTime() - totaltime = xbmc.Player().getTotalTime() - if item_nfo.played_time and actual_time < item_nfo.played_time: + total_time = xbmc.Player().getTotalTime() + if item_nfo.played_time and item_nfo.played_time > actual_time > 1: xbmc.Player().seekTime(item_nfo.played_time) - mark_time = totaltime * percentage + mark_time = total_time * percentage + difference = total_time - actual_time + # Mark as Watched if actual_time > mark_time: logger.debug("Marked as Watched") item.playcount = 1 sync_with_trakt = True from specials import videolibrary videolibrary.mark_content_as_watched2(item) - break + show_server = False + if item.contentType == 'movie' or not config.get_setting('next_ep'): + EXIT = True + + # check for next Episode + if item.contentType != 'movie' and total_time > time_from_end >= difference: + next_dialogs = ['NextDialog.xml', 'NextDialogExtended.xml', 'NextDialogCompact.xml'] + next_ep_type = config.get_setting('next_ep_type') + ND = next_dialogs[next_ep_type] + next_episode = next_ep(item) + if next_episode: + nextdialog = NextDialog(ND, config.get_runtime_path()) + nextdialog.show() + while platformtools.is_playing() and not nextdialog.is_exit(): + xbmc.sleep(100) + pass + EXIT = True + nextdialog.close() + if nextdialog.continuewatching: + next_episode.next_ep = True + else: + EXIT = True + + if next_episode and next_episode.next_ep: + xbmc.Player().stop() time.sleep(1) @@ -51,91 +83,23 @@ def mark_auto_as_watched(item): # Silent sync with Trakt if sync_with_trakt and config.get_setting("trakt_sync"):sync_trakt_kodi() + while platformtools.is_playing(): + xbmc.sleep(100) + if not show_server and item.play_from != 'window': + xbmc.sleep(700) + xbmc.executebuiltin('Action(Back)') + xbmc.sleep(500) + if next_episode: + if next_episode.next_ep: + from platformcode.launcher import play_from_library + return play_from_library(next_episode) # If it is configured to mark as seen if config.get_setting("mark_as_watched", "videolibrary"): - nfo_path, head_nfo, item_nfo = resume_playback(item) threading.Thread(target=mark_as_watched_subThread, args=[item, nfo_path, head_nfo, item_nfo]).start() -def resume_playback(item): - class ResumePlayback(xbmcgui.WindowXMLDialog): - Close = False - Resume = False - def __init__(self, *args, **kwargs): - self.action_exitkeys_id = [xbmcgui.ACTION_BACKSPACE, xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK] - self.progress_control = None - self.item = kwargs.get('item') - m, s = divmod(float(self.item.played_time), 60) - h, m = divmod(m, 60) - self.setProperty("title", config.get_localized_string(30045) +' %02d:%02d:%02d' % (h, m, s)) - - def set_values(self, value): - self.Resume = value - self.Close = True - - def is_close(self): - return self.Close - - def onClick(self, controlId): - if controlId == 3012: # Resume - self.set_values(True) - self.close() - elif controlId == 3013: # Cancel - self.set_values(False) - self.close() - - def onAction(self, action): - if action in self.action_exitkeys_id: - self.set_values(False) - self.close() - - - from core import videolibrarytools - # from core.support import dbg;dbg() - - # if nfo and strm_path not exist - if not item.nfo: - if item.contentType == 'movie': - vl = xbmc.translatePath(filetools.join(config.get_setting("videolibrarypath"), config.get_setting("folder_movies"))) - path = '%s [%s]' % (item.contentTitle, item.infoLabels['IMDBNumber']) - item.nfo = filetools.join(vl, path, path + '.nfo') - if not item.strm_path: item.strm_path = filetools.join(path, item.contentTitle + '.strm') - else: - vl = xbmc.translatePath(filetools.join(config.get_setting("videolibrarypath"), config.get_setting("folder_tvshows"))) - path = '%s [%s]' % (item.contentSerieName, item.infoLabels['IMDBNumber']) - item.nfo = filetools.join(vl, path, 'tvshow.nfo') - if item.contentSeason and item.contentEpisodeNumber: - title = str(item.contentSeason) + 'x' + str(item.contentEpisodeNumber).zfill(2) - else: - season, episode = scrapertools.find_single_match(item.title, r'(\d+)x(\d+)') - item.contentSeason = int(season) - item.contentEpisodeNumber = int(episode) - title = season + 'x' + episode.zfill(2) - if not item.strm_path: item.strm_path = filetools.join(path, title + '.strm') - - # Read NFO FILE - if item.contentType == 'movie': - nfo_path = item.nfo - elif xbmc.translatePath(filetools.join(config.get_setting("videolibrarypath"), config.get_setting("folder_tvshows"))) in item.strm_path: - nfo_path = item.strm_path.replace('strm','nfo') - else: - nfo_path = xbmc.translatePath(filetools.join(config.get_setting("videolibrarypath"), config.get_setting("folder_tvshows"),item.strm_path.replace('strm','nfo'))) - head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path) - - # Show Window - if (config.get_setting("player_mode") not in [3] or item.play_from == 'window') and item_nfo.played_time: - Dialog = ResumePlayback('ResumePlayback.xml', config.get_runtime_path(), item=item_nfo) - Dialog.show() - t = 0 - while not Dialog.is_close() and t < 50: - t += 1 - xbmc.sleep(100) - if not Dialog.Resume: item_nfo.played_time = 0 - else: - item_nfo.played_time = 0 - return nfo_path, head_nfo, item_nfo def sync_trakt_addon(path_folder): @@ -164,7 +128,7 @@ def sync_trakt_addon(path_folder): shows = list(shows.items()) # we get the series id to compare - _id = re.findall("\[(.*?)\]", path_folder, flags=re.DOTALL)[0] + _id = re.findall(r"\[(.*?)\]", path_folder, flags=re.DOTALL)[0] logger.debug("the id is %s" % _id) if "tt" in _id: @@ -206,7 +170,7 @@ def sync_trakt_addon(path_folder): logger.debug("dict_trakt_show %s " % dict_trakt_show) # we get the keys that are episodes - regex_epi = re.compile('\d+x\d+') + regex_epi = re.compile(r'\d+x\d+') keys_episodes = [key for key in serie.library_playcounts if regex_epi.match(key)] # we get the keys that are seasons keys_seasons = [key for key in serie.library_playcounts if 'season ' in key] @@ -330,7 +294,6 @@ def mark_content_as_watched_on_kodi(item, value=1): path = filetools.join(tail, filename) for d in data['result']['episodes']: - if d['file'].replace("/", "\\").endswith(path.replace("/", "\\")): # logger.debug("I mark the episode as seen") episodeid = d['episodeid'] @@ -430,7 +393,7 @@ def mark_content_as_watched_on_kod(path): path1 = path.replace("\\\\", "\\") # Windows format if not path2: path2 = path1.replace("\\", "/") # Format no Windows - nfo_name = scrapertools.find_single_match(path2, '\]\/(.*?)$') # I build the name of the .nfo + nfo_name = scrapertools.find_single_match(path2, r'\]\/(.*?)$') # I build the name of the .nfo path1 = path1.replace(nfo_name, '') # for SQL I just need the folder path2 = path2.replace(nfo_name, '') # for SQL I just need the folder path2 = filetools.remove_smb_credential(path2) # If the file is on an SMB server, we remove the credentials @@ -448,7 +411,7 @@ def mark_content_as_watched_on_kod(path): if contentType == "episode_view": title_plain = title.replace('.strm', '') # If it is Serial, we remove the suffix .strm else: - title_plain = scrapertools.find_single_match(item.strm_path, '.(.*?\s\[.*?\])') # if it's a movie, we remove the title + title_plain = scrapertools.find_single_match(item.strm_path, r'.(.*?\s\[.*?\])') # if it's a movie, we remove the title if playCount is None or playCount == 0: # not yet seen, we set it to 0 playCount_final = 0 elif playCount >= 1: @@ -463,7 +426,7 @@ def mark_content_as_watched_on_kod(path): if item.infoLabels['mediatype'] == "tvshow": # We update the Season and Series playCounts for season in item.library_playcounts: if "season" in season: # we look for the tags "season" inside playCounts - season_num = int(scrapertools.find_single_match(season, 'season (\d+)')) # we save the season number + season_num = int(scrapertools.find_single_match(season, r'season (\d+)')) # we save the season number item = videolibrary.check_season_playcount(item, season_num) # We call the method that updates Temps. and series filetools.write(path, head_nfo + item.tojson()) @@ -551,7 +514,7 @@ def update(folder_content=config.get_setting("folder_tvshows"), folder=""): # update_path = filetools.join(videolibrarypath, folder_content, folder) + "/" # Encoder problems in "folder" update_path = filetools.join(videolibrarypath, folder_content, ' ').rstrip() - if videolibrarypath.startswith("special:") or not scrapertools.find_single_match(update_path, '(^\w+:\/\/)'): + if videolibrarypath.startswith("special:") or not scrapertools.find_single_match(update_path, r'(^\w+:\/\/)'): payload["params"] = {"directory": update_path} while xbmc.getCondVisibility('Library.IsScanningVideo()'): @@ -593,7 +556,7 @@ def set_content(content_type, silent=False, custom=False): if not xbmc.getCondVisibility('System.HasAddon(metadata.themoviedb.org)'): if not silent: # Ask if we want to install metadata.themoviedb.org - install = platformtools.dialog_yesno(config.get_localized_string(60046)) + install = platformtools.dialog_yesno(config.get_localized_string(60046),'') else: install = True @@ -617,7 +580,7 @@ def set_content(content_type, silent=False, custom=False): continuar = False if not silent: # Ask if we want to install metadata.universal - install = platformtools.dialog_yesno(config.get_localized_string(70095)) + install = platformtools.dialog_yesno(config.get_localized_string(70095),'') else: install = True @@ -647,7 +610,7 @@ def set_content(content_type, silent=False, custom=False): if not xbmc.getCondVisibility('System.HasAddon(metadata.tvdb.com)'): if not silent: #Ask if we want to install metadata.tvdb.com - install = platformtools.dialog_yesno(config.get_localized_string(60048)) + install = platformtools.dialog_yesno(config.get_localized_string(60048),'') else: install = True @@ -671,7 +634,7 @@ def set_content(content_type, silent=False, custom=False): continuar = False if not silent: # Ask if we want to install metadata.tvshows.themoviedb.org - install = platformtools.dialog_yesno(config.get_localized_string(60050)) + install = platformtools.dialog_yesno(config.get_localized_string(60050),'') else: install = True @@ -705,7 +668,7 @@ def set_content(content_type, silent=False, custom=False): if sql_videolibrarypath.startswith("special://"): sql_videolibrarypath = sql_videolibrarypath.replace('/profile/', '/%/').replace('/home/userdata/', '/%/') sep = '/' - elif scrapertools.find_single_match(sql_videolibrarypath, '(^\w+:\/\/)'): + elif scrapertools.find_single_match(sql_videolibrarypath, r'(^\w+:\/\/)'): sep = '/' else: sep = os.sep @@ -1282,4 +1245,113 @@ def ask_set_content(silent=False): # configuration from the settings menu else: platformtools.dialog_ok(config.get_localized_string(80026), config.get_localized_string(80023)) - do_config(True) \ No newline at end of file + do_config(True) + + +def next_ep(item): + from core.item import Item + logger.info() + item.next_ep = False + + if config.get_setting('next_ep'): # play next file if exist + # check if next file exist + current_filename = filetools.basename(item.strm_path) + base_path = filetools.basename(filetools.dirname(item.strm_path)) + path = filetools.join(config.get_videolibrary_path(), config.get_setting("folder_tvshows"),base_path) + fileList = [] + for file in filetools.listdir(path): + if file.endswith('.strm'): + fileList.append(file) + + fileList.sort() + + nextIndex = fileList.index(current_filename) + 1 + if nextIndex == 0 or nextIndex == len(fileList): + next_file = None + else: + next_file = fileList[nextIndex] + logger.info('Next File:' + next_file) + + # start next episode window afther x time + if next_file: + season_ep = next_file.split('.')[0] + season = season_ep.split('x')[0] + episode = season_ep.split('x')[1] + next_ep = '%sx%s' % (season, episode) + item = Item( + action= 'play_from_library', + channel= 'videolibrary', + contentEpisodeNumber= episode, + contentSeason= season, + contentTitle= next_ep, + contentType= 'episode', + infoLabels= {'episode': episode, 'mediatype': 'episode', 'season': season, 'title': next_ep}, + strm_path= filetools.join(base_path, next_file), + play_from = item.play_from) + + global INFO + INFO = filetools.join(path, next_file.replace("strm", "nfo")) + # logger.info('Next Info:\n' + str(INFO)) + + return item + + +class NextDialog(xbmcgui.WindowXMLDialog): + item = None + cancel = False + EXIT = False + continuewatching = True + + def __init__(self, *args, **kwargs): + self.action_exitkeys_id = [xbmcgui.ACTION_STOP, xbmcgui.ACTION_BACKSPACE, xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK] + self.progress_control = None + + # set info + f = filetools.file_open(INFO, 'r') + full_info = f.read().split('\n') + full_info = full_info[1:] + f.close() + full_info = "".join(full_info) + info = jsontools.load(full_info) + if "thumbnail" in info: + img = info["thumbnail"] + else: + img = filetools.join(config.get_runtime_path(), "resources", "noimage.png") + self.setProperty("next_img", img) + info = info["infoLabels"] + self.setProperty("title", info["tvshowtitle"]) + self.setProperty("ep_title", "%dx%02d - %s" % (info["season"], info["episode"], info["title"])) + + def set_exit(self, EXIT): + self.EXIT = EXIT + + def set_continue_watching(self, continuewatching): + self.continuewatching = continuewatching + + def is_exit(self): + return self.EXIT + + def onFocus(self, controlId): + pass + + def doAction(self): + pass + + def closeDialog(self): + self.close() + + def onClick(self, controlId): + if controlId == 3012: # Still watching + self.set_exit(True) + self.set_continue_watching(True) + self.close() + elif controlId == 3013: # Cancel + self.set_exit(True) + self.set_continue_watching(False) + self.close() + + def onAction(self, action): + if action in self.action_exitkeys_id: + self.set_exit(True) + self.set_continue_watching(False) + self.close() \ No newline at end of file diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po index 55e2497a..c4f3db0d 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/resources/language/resource.language.en_gb/strings.po @@ -195,6 +195,10 @@ msgctxt "#30045" msgid "Resume from:" msgstr "" +msgctxt "#30046" +msgid "Resume from start" +msgstr "" + msgctxt "#30050" msgid "Server connection error" msgstr "" diff --git a/resources/language/resource.language.it_it/strings.po b/resources/language/resource.language.it_it/strings.po index 6d2e2fc1..d444157b 100644 --- a/resources/language/resource.language.it_it/strings.po +++ b/resources/language/resource.language.it_it/strings.po @@ -195,6 +195,10 @@ msgctxt "#30045" msgid "Resume from:" msgstr "Riprendi da:" +msgctxt "#30046" +msgid "Resume from start" +msgstr "Riprendi dall'inizio" + msgctxt "#30050" msgid "Server connection error" msgstr "Errore connessione server" diff --git a/resources/settings.xml b/resources/settings.xml index b6d82544..6a3462d1 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -20,7 +20,7 @@ - + @@ -35,10 +35,10 @@ - - - - + + + + diff --git a/resources/skins/Default/720p/ChannelSettings.xml b/resources/skins/Default/720p/ChannelSettings.xml index e095e11f..ebb5d276 100644 --- a/resources/skins/Default/720p/ChannelSettings.xml +++ b/resources/skins/Default/720p/ChannelSettings.xml @@ -19,7 +19,7 @@ 100% 100% - Shortcut/white.png + white.png @@ -27,7 +27,7 @@ 0 100% 1 - Shortcut/white.png + white.png @@ -47,8 +47,8 @@ 25 30 30 - Controls/DialogCloseButton-focus.png - Controls/DialogCloseButton-focus.png + close.png + close.png @@ -58,8 +58,8 @@ 60 110 FFFFFFFF - Shortcut/white.png - Shortcut/white.png + white.png + white.png center center @@ -72,8 +72,8 @@ 60 110 FFFFFFFF - Shortcut/white.png - Shortcut/white.png + white.png + white.png center center @@ -86,8 +86,8 @@ 60 110 FFFFFFFF - Shortcut/white.png - Shortcut/white.png + white.png + white.png center center @@ -116,14 +116,14 @@ 0 10 540 - Shortcut/white.png + white.png 120 0 10 540 - Shortcut/white.png + white.png diff --git a/resources/skins/Default/720p/DarkShortCutMenu.xml b/resources/skins/Default/720p/DarkShortCutMenu.xml index cee155c4..037af2a7 100644 --- a/resources/skins/Default/720p/DarkShortCutMenu.xml +++ b/resources/skins/Default/720p/DarkShortCutMenu.xml @@ -12,8 +12,8 @@ 0 100% 100% - Shortcut/white.png - Shortcut/white.png + white.png + white.png WindowOpen WindowClose Action(close) @@ -39,9 +39,9 @@ 219 1100 10 - Shortcut/white.png - Shortcut/white.png - Shortcut/white.png + white.png + white.png + white.png false horizontal 32500 @@ -50,7 +50,7 @@ 1100 218 - Shortcut/white.png + white.png -130 @@ -78,7 +78,7 @@ 1 220 218 - Shortcut/white.png + white.png 0 diff --git a/resources/skins/Default/720p/InfoWindow.xml b/resources/skins/Default/720p/InfoWindow.xml index d971eff0..27045eb4 100644 --- a/resources/skins/Default/720p/InfoWindow.xml +++ b/resources/skins/Default/720p/InfoWindow.xml @@ -18,7 +18,7 @@ 100% 100% - Shortcut/white.png + white.png @@ -47,8 +47,8 @@ 25 30 30 - Controls/DialogCloseButton-focus.png - Controls/DialogCloseButton-focus.png + close.png + close.png @@ -315,8 +315,8 @@ 200 50 110 - Shortcut/white.png - Shortcut/white.png + white.png + white.png center center @@ -327,8 +327,8 @@ 200 50 110 - Shortcut/white.png - Shortcut/white.png + white.png + white.png center center @@ -339,8 +339,8 @@ 200 50 110 - Shortcut/white.png - Shortcut/white.png + white.png + white.png center center @@ -351,8 +351,8 @@ 200 50 110 - Shortcut/white.png - Shortcut/white.png + white.png + white.png center center diff --git a/resources/skins/Default/720p/NextDialog.xml b/resources/skins/Default/720p/NextDialog.xml index 4b5fbbb9..fd1e5a83 100644 --- a/resources/skins/Default/720p/NextDialog.xml +++ b/resources/skins/Default/720p/NextDialog.xml @@ -5,82 +5,60 @@ Dialog.Close(videoosd,true) + 0 + 0 + 100% - - + + - - + + - - 0 + + horizontal 15 40 - 100% - - - 0 - 100% + 0 + right + + 40 - NextDialog/background-diffuse.png + auto + font30_title + 20 + 80FFFFFF + FFFFFFFF + 80FFFFFF + 22000000 + center + center + white.png + white.png + no - + + + 40 + auto + font30_title + 20 + 80FFFFFF + FFFFFFFF + 80FFFFFF + 22000000 + center + center + white.png + white.png + no + + 0 - 0 - 100% - - - -1000 - -1000 - 1 - 1 - - - horizontal - 40 - 0 - right - - - SendClick(3012) - 40 - auto - font30_title - 20 - 80FFFFFF - FFFFFFFF - 80FFFFFF - 22000000 - center - center - NextDialog/background-diffuse.png - NextDialog/background-diffuse.png - no - - - - 40 - auto - font30_title - 20 - 80FFFFFF - FFFFFFFF - 80FFFFFF - 22000000 - center - center - NextDialog/background-diffuse.png - NextDialog/background-diffuse.png - no - - - 0 - 30 - 40 - NextDialog/background-diffuse.png - - + 30 + 40 + white.png diff --git a/resources/skins/Default/720p/NextDialogCompact.xml b/resources/skins/Default/720p/NextDialogCompact.xml index dd348317..d698b0da 100644 --- a/resources/skins/Default/720p/NextDialogCompact.xml +++ b/resources/skins/Default/720p/NextDialogCompact.xml @@ -4,85 +4,57 @@ Dialog.Close(fullscreeninfo,true) Dialog.Close(videoosd,true) - + + horizontal + 15 + 40 + 0 + right - - + + - - + + - - 0 - 15 - 50 - 100% - + + + 40 + 80 + font30_title + 10 + 80FFFFFF + FFFFFFFF + 80FFFFFF + 22000000 + center + left + NextDialog/play.png + NextDialog/play.png + no + + + + 40 + 40 + font30_title + 30 + 80FFFFFF + FFFFFFFF + 80FFFFFF + 22000000 + center + center + NextDialog/close.png + NextDialog/close.png + no + - 0 - 100% - 40 - - - - 0 - 0 - 100% - - - -1000 - -1000 - 1 - 1 - - - horizontal - 40 - 0 - right - - - SendClick(3012) - - 40 - 100 - font30_title - 12 - 80FFFFFF - FFFFFFFF - 80FFFFFF - 22000000 - center - left - NextDialog/play-fo.png - NextDialog/play-nf.png - no - - - - 40 - 40 - font30_title - 30 - 80FFFFFF - FFFFFFFF - 80FFFFFF - 22000000 - center - center - NextDialog/close-fo.png - NextDialog/close-nf.png - no - - - 0 - 20 - 40 - NextDialog/background.png - - - + 0 + 20 + 40 + NextDialog/background.png diff --git a/resources/skins/Default/720p/NextDialogExtended.xml b/resources/skins/Default/720p/NextDialogExtended.xml index 22bf4c44..54b8d906 100644 --- a/resources/skins/Default/720p/NextDialogExtended.xml +++ b/resources/skins/Default/720p/NextDialogExtended.xml @@ -6,12 +6,12 @@ - - + + - - + + 30 @@ -26,59 +26,47 @@ 180 $INFO[Window.Property(next_img)] - - 0 + + vertical + 220 + 326 + 0 0 - 100% - - -1000 - -1000 - 1 - 1 - - - vertical - 220 - 326 - 0 + + 180 + 326 0 - - - SendClick(3012) - 180 - 326 - 0 - font30_title - 20 - FFFFFFFF - FFFFFFFF - FFFFFFFF - 22000000 - top - center - NextDialog/background-play.png - NextDialog/background-diffuse.png - no - - - - 40 - 326 - font30_title - 20 - 80FFFFFF - FFFFFFFF - 80FFFFFF - 22000000 - center - center - NextDialog/background-diffuse.png - NextDialog/background-diffuse.png - no - + font30_title + 20 + FFFFFFFF + FFFFFFFF + FFFFFFFF + 22000000 + top + center + NextDialog/background-play.png + white.png + no - + + + 40 + 326 + font30_title + 20 + 80FFFFFF + FFFFFFFF + FFFFFFFF + 22000000 + center + center + white.png + white.png + no + + + 60 40 center @@ -86,12 +74,12 @@ center true 50 - FFFFFFFF - ff000000 + FFFFFFFF + FF000000 Window.Property(title) font30_title - + 40 40 center @@ -99,26 +87,25 @@ center true 50 - FFFFFFFF - ff000000 + FFFFFFFF + FF000000 Window.Property(ep_title) font20_title - + 20 - 25 + 25 auto top true right true 50 - FFFFFFFF - ff000000 + FFFFFFFF + FF000000 Player.TimeRemaining(secs),, font30_title - diff --git a/resources/skins/Default/720p/Recaptcha.xml b/resources/skins/Default/720p/Recaptcha.xml index cc552796..4168b44e 100644 --- a/resources/skins/Default/720p/Recaptcha.xml +++ b/resources/skins/Default/720p/Recaptcha.xml @@ -19,7 +19,7 @@ 510 640 45 - Shortcut/dialog-bg-solid.png + Controls/dialog-bg-solid.png 30 @@ -39,8 +39,8 @@ 110 FFFFFFFF FFFFFFFF - Controls/KeyboardKey.png - Controls/KeyboardKeyNF.png + white.png + white.png center center @@ -57,8 +57,8 @@ 110 FFFFFFFF FFFFFFFF - Controls/KeyboardKey.png - Controls/KeyboardKeyNF.png + white.png + white.png center center @@ -75,8 +75,8 @@ 110 FFFFFFFF FFFFFFFF - Controls/KeyboardKey.png - Controls/KeyboardKeyNF.png + white.png + white.png center center @@ -96,9 +96,9 @@ 75 150 150 - Controls/background-diffuse.png - Controls/background-diffuse.png - Controls/check_mark.png + white.png + white.png + Controls/check_mark.png Controls/check_mark.png 10002 10008 @@ -110,9 +110,9 @@ 225 150 150 - Controls/background-diffuse.png - Controls/background-diffuse.png - Controls/check_mark.png + white.png + white.png + Controls/check_mark.png Controls/check_mark.png 10003 10009 @@ -124,9 +124,9 @@ 375 150 150 - Controls/background-diffuse.png - Controls/background-diffuse.png - Controls/check_mark.png + white.png + white.png + Controls/check_mark.png Controls/check_mark.png 10004 10010 @@ -138,9 +138,9 @@ 75 150 150 - Controls/background-diffuse.png - Controls/background-diffuse.png - Controls/check_mark.png + white.png + white.png + Controls/check_mark.png Controls/check_mark.png 10005 10011 @@ -152,9 +152,9 @@ 225 150 150 - Controls/background-diffuse.png - Controls/background-diffuse.png - Controls/check_mark.png + white.png + white.png + Controls/check_mark.png Controls/check_mark.png 10006 10012 @@ -166,9 +166,9 @@ 375 150 150 - Controls/background-diffuse.png - Controls/background-diffuse.png - Controls/check_mark.png + white.png + white.png + Controls/check_mark.png Controls/check_mark.png 10007 10013 @@ -180,9 +180,9 @@ 75 150 150 - Controls/background-diffuse.png - Controls/background-diffuse.png - Controls/check_mark.png + white.png + white.png + Controls/check_mark.png Controls/check_mark.png 10008 10002 @@ -194,9 +194,9 @@ 225 150 150 - Controls/background-diffuse.png - Controls/background-diffuse.png - Controls/check_mark.png + white.png + white.png + Controls/check_mark.png Controls/check_mark.png 10009 10003 @@ -208,9 +208,9 @@ 375 150 150 - Controls/background-diffuse.png - Controls/background-diffuse.png - Controls/check_mark.png + white.png + white.png + Controls/check_mark.png Controls/check_mark.png 10010 10004 diff --git a/resources/skins/Default/720p/ResumePlayback.xml b/resources/skins/Default/720p/ResumePlayback.xml index 8337c989..3f6830cb 100644 --- a/resources/skins/Default/720p/ResumePlayback.xml +++ b/resources/skins/Default/720p/ResumePlayback.xml @@ -6,53 +6,45 @@ - - + - - + - 0 - 15 + 440 + 320 40 - 100% + 400 - horizontal - 40 + vertical + 80 0 - right + center - + SendClick(3012) 40 - auto + 400 font30_title 20 - 80FFFFFF - FFFFFFFF - 80FFFFFF - 22000000 + FFFFFFFF center center - NextDialog/background-diffuse.png - NextDialog/background-diffuse.png + white.png + white.png no - + 40 - auto + 400 font30_title 20 - 80FFFFFF - FFFFFFFF - 80FFFFFF - 22000000 + FFFFFFFF center center - NextDialog/background-diffuse.png - NextDialog/background-diffuse.png + white.png + white.png no diff --git a/resources/skins/Default/720p/ShortCutMenu.xml b/resources/skins/Default/720p/ShortCutMenu.xml index dfb2a0eb..bc93587d 100644 --- a/resources/skins/Default/720p/ShortCutMenu.xml +++ b/resources/skins/Default/720p/ShortCutMenu.xml @@ -12,8 +12,8 @@ 0 100% 100% - Shortcut/white.png - Shortcut/white.png + white.png + white.png WindowOpen WindowClose Action(close) @@ -39,9 +39,9 @@ 219 1100 10 - Shortcut/white.png - Shortcut/white.png - Shortcut/white.png + white.png + white.png + white.png false horizontal 32500 @@ -50,7 +50,7 @@ 1100 218 - Shortcut/white.png + white.png -130 @@ -78,7 +78,7 @@ 1 220 218 - Shortcut/white.png + white.png 0 diff --git a/resources/skins/Default/media/Controls/DialogCloseButton.png b/resources/skins/Default/media/Controls/DialogCloseButton.png deleted file mode 100644 index cd9e52f0dfcf2958c56c540db058265c10eb79a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1471 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2o;fF#gXBi71Ki^|4CM&(%vz$xlkv ztH>-n*TA>HIW;5GqpB!1xXLdi zxhgx^GDXSWj?1RP3TQxXYDuC(MQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}6yY17;GAES zs$i;Ts%M~N$E9FXl#*r@k>g7FXt#Bv$C=6)S^`fSBQuTAW;zSx}OhpQivaGchT@w8U0P2`H}sH9WBt=r*X~ zdBsrQ1H(Z-wIVZ3-%!s$AE-hfSqDhMH3F_FIkO;9FRK8d9$9TkW*WlnD8_?iz{Z1> z1MRT#NzE&Ux(#9lSj0C!B{c^s4ANuenVXoN3RIh3l3}Z4Yy{ShkO04Xv%bU4k!+CcT(_lbv84!G&9pR(lcaW z(3n^{alf}ypvZCitiTzG0nW|M9j2jE8n0YhFopH%0=Bs#b+uO0FxHkVec>ho2r%9_%tO;^T zo+^^b^`$dv$}7%J&x^uFMpMrG`~Px4p25^?vH%A2udE@0B;$ z9&%kbZN7cO#PW-$P0#M;KgVmadrjs?S&REE@7PV39j#NHy~A{7%XQ(5_=a=Y8}vh~ z!tOr*A-CxDr_k^XyV>^^-P`$xIf5zue#V;xXMwqov%n*=n1O*?7=#%aX3dcRM$rvV z7srr{#<#Pqiw+qGwCy+LHE-~AovIvo@TJGmi9vye1mIe`hQ&V`nW?y}z&Qo3~2=L>)J5=_{)9dHYc&t^3bQETJfz? zh;zA@&HBrOEs6KcnWf4bgeUTUFE2_i;ZFQ2BEjEsRkp{%O_5`DV4|Eu#NQ^tMJ&uCP?LCFEAS_>#88w{qDXvn*4J3eT#qJ~5PFnUtva?6P$yw}#bR_eKXJpPos_mShO5;F=tx zs?z8nI%7?cx+F{2p%n4?kqQAU%RE?RCwuNOVtn)Sq@UrgfQ)T3c|V0u;eAxHcFHy@ zuCpfpnQvVC!G~k@ z9f>1z@@_0K6G*(gnrFs#J`2X@9*4DNFFd!!GEMpe&zxH~=auy=uTMB&IPaez-|>oH w?O8I(+?yYC3i#QGJ?mj#biN{p{rov55FG|-pw6wI;H!#vS zGSUUA&@HaaD@m--%_~+0838fFCAB!YD6^m>Ge1uOWM*PgerbuVk`ho}0cvKRGtfs?o?4Na<{ANaPI6{JqFz>kK1ditZDJ|V+fa9-m<(49Q~@y^ zWS5m^Zen_>PikIzNrtVGsRh_tghY5|3P{}0)DkQKaflUAd9iPPN@@<&S3ncNVnD7w zC?xfvK?#f#eR!k*Iq+yr%>%||5irtRc53x8FfcY{Iy(mx2e~^bc)B{98Csf|=^E)7 zGB9XNES3oXEAMa)1+}5;q zfx@i{(O=>j+7aAMi#U>!lh%8K`>y_hfrtzar6@ph`d6^7l$$<7z*bM$_u`xX_xHW(WQ<=~<;;*J$NP9Ix6JGhTN5SZ+1oyra%^L_ zI3M<@__x6iwO?+o#qS+2OU;Q3*>b~d&RXZ&d!?=}vY+I8XO_o-(}pJJ98Zg0(VbEi zcJKKMKBd*4LZ@%o%zd|LU*<>Y!1(k#spiTbf!U9FVdQ&MBb@055dNGynhq diff --git a/resources/skins/Default/media/Controls/KeyboardKeyNF.png b/resources/skins/Default/media/Controls/KeyboardKeyNF.png deleted file mode 100644 index 877b11b6d7beedd683f6f37b798d73949d140d5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1059 zcmeAS@N?(olHy`uVBq!ia0vp^^MTlkgAGWoJJr3Hfq{u3GbExU!q>+tIX_n~F(p4K zRj(qq04UGEU}IlVkeHmETB4AYnx2_wtMq>NekFy>6kDZmQ(pt$0_W6>OpmIf)Zi+= zkmRcDWXlvKdpj8?tx|+2mF zWMI&kSUPd1x3i-_`+k{86$=-%Hn~p7NS-30n2|j30c+Momk(K!()kpRKi8x#|M;E{-2SctB^jh@ZU zN#VZtgz`dzE~-8hPV83`7ujd{HKKFAuivyEms50wxSF;`-kAF5=*IXpOSbfE*dtS} z78`KtyJ7q#f%E5DRLi=`7YHZyFzBgCD0a-RYfJfdxx3#kGEnvY@5%PQenp})L%T9` zCabv0^{-%EDK~wFfUTag@5ML&@9%rn$r!(~%9$Zcj`#6aZkgF1wkAr*v$uUL<=Dn< zaX#!*@o$44YQNlEi{Cq5mYNe6vgL-^oVCuk_exz|WIxIG&Mc1urwvWcIi421qC2H3 z?B4Sid`hc7g-+kFnfq?hzRZu(f$`~gQq7e=0<#}yfk$L90|U1(2s1Lwnj--ewDxpy v45^s&_MjmnkauXoSN~kL`UOBHA<%H2VL}iCv55FG|-pw6wI;H!#vS zGSUUA&@HaaD@m--%_~+0838fFCAB!YD6^m>Ge1uOWM*PgerbuVk`ho}0cv<^MP{07 z1l;`O%z{L{tO9+Iu)d+5fj+X@lFT%OOY(}LK?MvneUJ=>^2Ac0x1sJvQ4Kd7r~+aE z#1&TViMhFnwn~PE`leuep~60?dBwi@DXBS7r-N*>^2|+4PX)@Pmt@!~nOcC=BP7Bz zQ$XT|rj}p{phZ?7Q-B8Og92C|8p6P+(ucM4_LD% zx_ro*l+LGk{PA8E&TUO=7bx7S5d9^dp&h~9w1^`qIeBfy;!ktZnFI|tpE5noc=S+b>P!ycJ(wb+1D-woq037kLIqFUBfzCbvshe1zGLa}3hU0cex%iaBU zk%6lBe^0je^(zvc8QPVhGg-w|u73sVO1bGX1Z?$`eJ{TGe}CVrPR96^Rn81qa=eeX za?8yAur*Oap1tj3DaST;i}PWhihmpYQ2XWPTKwMevecZokS#aN=B#zTy;th$BKt|c zcV>AUIBjTh&hfP972PRSVfUWD;8R-tDRlaV&D?j3_GNyQ4vbH~lWMN~5tu7E3p^r= z85p>QL70(Y)*K0--~vw<$B>FSZ!a=(GAIZfaM)V^+`N_JvEIRi>NK&y=j9CiJENcF g&D@>(ZrXq_Vi$8U7hcv3cLJ3wp00i_>zopr02o)w)Bpeg diff --git a/resources/skins/Default/media/Controls/ScrollBack.png b/resources/skins/Default/media/Controls/ScrollBack.png deleted file mode 100644 index 07f88c5c31a1daaae4a6a697ace49918b14adf2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1208 zcmeAS@N?(olHy`uVBq!ia0vp^k_-$?3><7gR{8qlU`}R8L`j6Nk5zJhu3lnFep0Gl zMQ#C5o`J!}zM>#8IXksPAt^OIGtXA({qFrr3YjUkO5vuy2EGN(sTr9bRYj@6RemAK zRoTgwDN6QsTs9R}Km&49OA-|-a&z*EttxDlz~)*3*&tzkB?YjOl5AV02;Tq&=lr5n z1yem!Jp&~>E(M#Slr*a#7dNP8AkS7Qqokz3N?*Ucyj-u`STDaQUEk2s(o)~RNZ-gv z7pOwFxH7LKu|hYmSQ%sl#0;0z;^d;tf|AVqJOz-MiAnjTCALaRKzRkI;fbX{w?Pfh zD~9?W7!LZW6`5)JhI$72Ko$DPIzSSx5pYe(nFWb@Sp^97$ZAV6(-3Y)F&-oXHXf`T zXorZ8tEA_ zFlbCHow(oIDNy9NeOBO%!~o~!<_^=)DUDYyEttZ3bphMos4q|Z56Jg_pEBXvf>4c) zs9&a6;sdfT$gsEyx_EmR2YMfUy+>rqiDJv|HSfOPE8g)vW`motS6IGOOU}9ltVA-^l0v~5}w&{>4M$64KqG2yT9h@k30LXZJTsKbi)>|e$7>30`o-X z#c8il%jYiFe0ihm!^(pBYT_dMOutsN#{2k%{y3eYE5+Be)%nKURgWuVwKH|Kb@Y$V zJ}WZyRqdJS7D79BcDVHK;GS!s$h2c-(j0}lHi@Y>{q618Qe2z=9K8Q0^3$Z%C)NZx zB~KN}OFRVPg5k)23&4^Pl6j*u5t6qpZdKmUrx?%Z}Em&fZ}<#*% zRbh9Z|Bzes`cr85hTZIYi|+0G!yLhsem~>Qg0sNv$64SJS7q2zLq%waP}3(d-ulK~b6|nU QUQmJK>FVdQ&MBb@042P*rvLx| diff --git a/resources/skins/Default/media/Controls/ScrollBar.png b/resources/skins/Default/media/Controls/ScrollBar.png deleted file mode 100644 index ce738d65fdba973310fd22735e0598a25e664159..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1162 zcmeAS@N?(olHy`uVBq!ia0vp^k_-$?3>-{A){nCRejrX}NJL45ua8x7ey(0(N`6wR zUPW#JP@aLo#=fE;F*!T6L?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C z$yM3OmMKd1c3d_URzL%CQ%e#RDspr3imfVamB8j&0ofp7eI*63l9Fs&r3l{u1?T*t zR0UH#Q#}JEJ1zyAqLehNAQv~NW+2a2DWjyMz)D}gyu4hm+*mKaC|%#s($Z4jz)0W7 zNEfI=x41H|B(Xv_uUHvm1jG!N)Z*l#%z~24{5%DanTbjHr6smXNI282FHM&D4+Kp$CoYDH$6YXsam$(aR-dRYbfAYlx(iKReqL*0#HGF&xK1;lia zT~?mCiRr06sd?!o8MaEMhDKm}5i;SKDIf_WQ?NM1Ayz=;#lHC|sX0(z0Zjyp0lE61 zkkp3;B`{9(;gJI5z@s%a4;Yt4z({)$)Y8Pjz}S@O>>N-WFR7|XlZ7qYouq$ zz@Ra)bmC5LXGekd{W6m(7A|OQa-EQoJVin=BYENj)~tyxAF?K;^C=#GyqAS@ThrPF z3b!gme~D*kM{qYS;z&wPUYoJ_)0}iBLBq{w&TZd+SF$Yqpp>V!C?@>CBN4f<5M6y6J)51A z!hP=v<%I@aRDCF%*smrovd{2qMCW{8ziB@%r|1fCHEoT&G4;>Ujqz)iZ0XssN2XjY zHsI8E!}v=A=g+mMmUWdc5Kii0&{LC8?3iEImh$a#cfVa^pz8hKlkI)|ibQ9Ic4g>H zR&kZ* zz2`6ZlvaNVoxWi+_uZm>nIEMCPZ}t=$kW9! zq+-t7Glq-|3@i)=F5|0=pOMsND*r$qxvm2MHd%Ie}Ie_sVugm}98 KxvX-n*TA>HIW;5GqpB!1xXLdi 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 delta 1908 zcmV-)2aEWf6ZjI4BLV^eu_b{4ldu9+0WXs>1ulPYY^kpR00Dw&Lqkw=Qb$4{Nkv08 zF*!CiEix`K001bFb&*3XdtORuG;P zo?a`cCT|OODe2gX@TqX0CKnXGHT8IfUrbI__{(H18V-WBL)e|F<9Hn_X)P-(FUOnB z6qV|I%$GP4xw(i$kGKn+Fd+iCnPQwEeujS-mDx`}J_ck(gZ#nY{8{pntH`WULSvN_ zX$tg-T9oPuiAm8DGBT9R{{QW(o*ed7syhPE{A3t!JU(aSZ>yARF{IJ>NA@f|qdgzg75rp10Go47TZgx3>jUx3bQurF15R^8|L9-@Ei z@>N%`y9d2;-nsk(SORC?XzZZP00009a7bBm000XU000XU0RWnu7ytkTk4Z#9RCt{2 z-Aj)YRUC%#r!X=`7lNQ*a2UWl-T1T*F4UDDKob{!3QgRan7Co#CG2$L!o-#0 znCMCeQGoQ|Fwj_gONb&wnbvboF#~p91HcbIv*E zoO8}O=bUrSIp>^n&N=6t3sn(&05@Hd4gk*phk%2?ufTC&33#I@ic1m4bD@*8S<=gr z{?^)El=NimSzVwc-7M*=bpWjFh@?%i=XNbNLU4Kp1XXVuLr-dez!>_Hq@8~a5g0@6 zwTQqNaxDM?W5}%$f>Qwy7(*^~fWR11uR{dJkZL0Y-*$+=7*b2pjz|cMA(aw9P<15s zu^4Ph2SL?S)oi{D-BFTu0E@ugv1b|UXJCI(6qkIS=%5jTk4Osvz)s+K07D3zq?;%a z?2kRm8a)h#5VR43Mbbq8@DP6(La;JH0I&rNAxIe^0Qdq7q4hF&O|Y`h!4O()48c9I zXPL5pfp@?VT1(Q6m7*w?z;7tE(g?vKc_BCj94d<9Pw+EB<1$5X1~^Kg)R`P3k3lca0fe9V8;8X-7Fj}Sl$ z5F{-~dR5Y=l;6<(UD8QOMBLmMJ!l%zt^3zB}@;KL7ZN!k)* zhz^sqUDDUBd>o{^zL#`M$b&K`>Ae{SIw$GQU;_nCMlkW9%t?B`#$XpE-4SfCK*Vl-(gALkJGJ=T*r7Z+i=Ox`1Y~Y4T+9o4dbx_(y zP?aPG8NtMZ5(+_8QW!K~1Z%#bBxw$K7kHxSBI~pZSd?^Yz%`~y(l*LBi|&s-%M7*l zX3@lJ4ILpE?>yx%bf%;Au4oLw12NXGS*!0Du7VH&LDf0RU+jNumx~%f*%haThzJ1Y zfsZBa>uSLff)5!u0$BYT;cem|sG6sI&9FE0LXvKvL~tPVS}hjr0@5-BNzVdLx4l4( zc2hnx1j8^wa10|@t^km<3-|`OKExt5`w@7&D2gB2d{85pT=k6b9BCl{SfD&j>}l%( zjbQC62oHu_q(OfRl&6V3O&`dw3Dz%l2yhw0Lfr=#LvXOQslwM80=Nv}>Mj;*P;CrG zFkKad6J0IXpgokY8Fo+mABLu)0A0H)k1!x$QuGy<4m#}s3zUGfNE#;tRV zVdky4>9x-0d#P`h8|()EduE1#vMJt&}#(H;T?ZmGRDw*1kmxVd@{r^2m}z}o=zEI z7z_f4baSr^FboO-M7+ye!WagJ03zS+FF_20L;wlg_c0+1gGG=`lD0}(s=ZNt^TOWm zz)fF73`USz5il4*s&$CL2vV;D3`USk0WlasZUw+#1i98C1|!J57BCn=UuuBC2>R9t z!)IJGAo$J*dYYuol3tSZ*E#_Hlk}RT>tfIA0w?K!q}L^#7@_z_(n(22B|RE@J{KXC u_prV;_8iVR=bUrSIp>^n&N=7Y0Q(=rd7el$`je&r0000DSr zy^7odkTM1v`-+0Z0VfjnEKjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(y zU7!lx;>x^|#0uTKVr7sK5Hnm-i<65o3raHc^Atd4CMM;Vme?vO0p%5-hL>cfAxzIJ zhI$_u5c(h)eM3D1ePrdS6`5(S5pd@uXBH&tWfkaygfY}6mIA#EbvKI1aMeH+5Ys_+ zS$XCrrlVra3 z9~zXvIMIhk3XlVj*3>*;TowT%?eB4EX$A(yrc7t&fZ`x`Ck0PeXEQ@fGc#QyJwpZt zjftfbcX~TJ3bgN+nN+cGL2HxigpA}V5{eng6Cbc@%ZDtES%e#)-F)E zRU!IIJVQHzyJ-}&D=sJ}rm;Rhax$c2UI>f7kq?3@(t zdrv4YH0Yx0L*c}JHF1%BhF>E(=ll9i`*Ar%SBR@=Yvhfoe~xa9U$bOO&xSoR=x(4 zJ{A8q_@Va8&9(Tw<7KHiaUol7n9W)1e0#6d)kXG`eDBQiIB?p~1F) zf5E4;`cvri4V$^|7VXRYC>v55FG|-pw6wI;H!#vS zGSUUA&@HaaD@m--%_~+0838fFCAB!YD6^m>Ge1uOWM*PgerbuVl9E2i5`CyGKXGQAQXkbOah z#Z}P7+q*c>`{?UEB2!KjTYj&3_x)b+j_)xW+>E`#@}*jG)-7mtX8iu=(4yT>XQsv6 z`1qhlbC;Fy%#KSJ?A~pd@p0MxHCKP!*?(=@qzj@Ows7@pt_l;FCo(Tidxcs)ce&=v z8(kk(7R*-@7ujd}wW2lN$1n89=@eZlzNW3tH|DN-Tp_ESsjID{e|+{?k*Tk0&rG)v z+PSmCrGE$aTmwa>9W#^WDAct{OugxEZ^xG6+WhC>{XdbPCapfPCdesysz@f+m(Hju zuQ)qBFA5tOO*!-L|J&8`WWI&2vSzyQCq*LP_QEFC`>BV2*qHRZSKeTI$aUSc`SuMH z%P*cbJ-eI#9IwUhHJKk}E$+9xV>exPv`%&Q4%3+}*M&3U8_s2K&=0K&yZiiy+@jZ? zLc=%gX5U+MZ|5K82&VM=8E+Px1*S~S0*}aI1_r((Aj~*bn@<`j81L!g7-G@8_v~rT z0|o-jfzzLFiYd!`?9HUOp~C*wnaD@H35n&5#VpLv{%(yrAJDe@;`N0+?SZWG+_Wns z&pt3RX*zw8VV(Qj3jSF~Ofv+oFY?>NZu?;GipKxVbstQ2F+M8(y?OG}#Wz7&!_(Ez JWt~$(695frVbK5p diff --git a/resources/skins/Default/media/Controls/spinDown-noFocus.png b/resources/skins/Default/media/Controls/spinDown-noFocus.png deleted file mode 100644 index 4987fbbc60fccd63946c8942f49ef0f789fa4d07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 912 zcmeAS@N?(olHy`uVBq!ia0vp^azM<_!3HEh@2a1}z`!V-84^(v;p=0SoS&v55FG|-pw6wI;H!#vS zGSUUA&@HaaD@m--%_~+0838fFCAB!YD6^m>Ge1uOWM*PgerbuVl9E2i5`CyGKXGQAQXkbOah z#Z}P7+q*c>`{?UEB2!KjTYj&3_x)b+j_)xW+>E`#@}*jG)-7mtX8iu=(4yT>XQsv6 z`1qhlbC;Fy%#KSJ?A~pd@p0MxHCKP!*?(=@qzj@Ows7@pt_l;FCo(Tidxcs)ce&=v z8(kk(7R*-@7ujd}wW2lN$1n89=@eZlzNW3tH|DN-Tp_ESsjID{e|+{?k*Tk0&rG)v z+PSmCrGE$aTmwa>9W#^WDAct{OugxEZ^xG6+WhC>{XdbPCapfPCdesysz@f+m(Hju zuQ)qBFA5tOO*!-L|J&8`WWI&2vSzyQCq*LP_QEFC`>BV2*qHRZSKeTI$aUSc`SuMH z%P*cbJ-eI#9IwUhHJKk}E$+9xV>exPv`%&Q4%3+}*M&3U8_s2K&=0K&yZiiy+@jZ? zLc=%gX5U+MZ|5K82&VM=8E+Px1*S~S0*}aI1_r((Aj~*bn@<`j*z4)y7-G@8_S`{U zCPM+|!00Vb@;Q=IJS21EZ*v(Y?7wOm_ISuOSDJg4Gx#%X zKX~fgwjbtqoKBki^G_=jXJwd|AO3;mZ{zBUuCj+B>lZlRIC|UCZTW`I#Z7UC*zB^p zq6!%IyX0CN&^2k|z2lZ#(d3@N`R;+?t|?2_)-Jdr&iu3J*z&vYyg?bs)78&qol`;+ E03W?^M*si- diff --git a/resources/skins/Default/media/Controls/spinUp-Focus.png b/resources/skins/Default/media/Controls/spinUp-Focus.png deleted file mode 100644 index 0ce1fcc5ab4477e0c8ceac7a83b8e7a344a3b394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 863 zcmeAS@N?(olHy`uVBq!ia0vp^azM<_!3HEh@2a1}z`!V-84^(v;p=0SoS&v55FG|-pw6wI;H!#vS zGSUUA&@HaaD@m--%_~+0838fFCAB!YD6^m>Ge1uOWM*PgerbuVl9E2i5`CyGKXGQAQXkbOah z#Z}P7+q*c>`{?UEB2!KjTYj&3_x)b+j_)xW+>E`#@}*jG)-7mtX8iu=(4yT>XQsv6 z`1qhlbC;Fy%#KSJ?A~pd@p0MxHCKP!*?(=@qzj@Ows7@pt_l;FCo(Tidxcs)ce&=v z8(kk(7R*-@7ujd}wW2lN$1n89=@eZlzNW3tH|DN-Tp_ESsjID{e|+{?k*Tk0&rG)v z+PSmCrGE$aTmwa>9W#^WDAct{OugxEZ^xG6+WhC>{XdbPCapfPCdesysz@f+m(Hju zuQ)qBFA5tOO*!-L|J&8`WWI&2vSzyQCq*LP_QEFC`>BV2*qHRZSKeTI$aUSc`SuMH z%P*cbJ-eI#9IwUhHJKk}E$+9xV>exPv`%&Q4%3+}*M&3U8_s2K&=0K&yZiiy+@jZ? zLc=%gX5U+MZ|5K82&VM=8E+Px1*S~S0*}aI1_r((Aj~*bn@<`j7~|>U7-G@8_v~p- z1_d7GfaAq$`rhisX>}-kn=Exg_u*DC9tK8*i}h@=Kbz%W$p2}&_K1HAoB5)cJDo)z z*sZq2+-WG&<=?*G_O#~e04X`g%N1gQu&X%Q~lo FCII9%S_=RG diff --git a/resources/skins/Default/media/Controls/spinUp-noFocus.png b/resources/skins/Default/media/Controls/spinUp-noFocus.png deleted file mode 100644 index cbbc1b7039d3ae753d004666e3797cd1c54d5515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 902 zcmeAS@N?(olHy`uVBq!ia0vp^azM<_!3HEh@2a1}z`!V-84^(v;p=0SoS&v55FG|-pw6wI;H!#vS zGSUUA&@HaaD@m--%_~+0838fFCAB!YD6^m>Ge1uOWM*PgerbuVl9E2i5`CyGKXGQAQXkbOah z#Z}P7+q*c>`{?UEB2!KjTYj&3_x)b+j_)xW+>E`#@}*jG)-7mtX8iu=(4yT>XQsv6 z`1qhlbC;Fy%#KSJ?A~pd@p0MxHCKP!*?(=@qzj@Ows7@pt_l;FCo(Tidxcs)ce&=v z8(kk(7R*-@7ujd}wW2lN$1n89=@eZlzNW3tH|DN-Tp_ESsjID{e|+{?k*Tk0&rG)v z+PSmCrGE$aTmwa>9W#^WDAct{OugxEZ^xG6+WhC>{XdbPCapfPCdesysz@f+m(Hju zuQ)qBFA5tOO*!-L|J&8`WWI&2vSzyQCq*LP_QEFC`>BV2*qHRZSKeTI$aUSc`SuMH z%P*cbJ-eI#9IwUhHJKk}E$+9xV>exPv`%&Q4%3+}*M&3U8_s2K&=0K&yZiiy+@jZ? zLc=%gX5U+MZ|5K82&VM=8E+Px1*S~S0*}aI1_r((Aj~*bn@<`j*zD=z7-G@8_Uu94 z1_K`E0}%#X)dwVcPDpHEU%lYN$^gMB$MpWG^joB>9lNVuKL1MH`bBAG%kDC)dBeYD zL8O`3@&`;>4-;VTO<S@wbe@OI;$L8PDEoN2`njxgN@xNAMJI0h diff --git a/resources/skins/Default/media/NextDialog/background-diffuse.png b/resources/skins/Default/media/NextDialog/background-diffuse.png deleted file mode 100644 index f636860396124eee9d8e0ad0a22357ac4938892c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1627 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 delta 1579 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 diff --git a/resources/skins/Default/media/NextDialog/close-fo.png b/resources/skins/Default/media/NextDialog/close.png similarity index 100% rename from resources/skins/Default/media/NextDialog/close-fo.png rename to resources/skins/Default/media/NextDialog/close.png diff --git a/resources/skins/Default/media/NextDialog/play-fo.png b/resources/skins/Default/media/NextDialog/play-fo.png deleted file mode 100644 index 1f82754c78558a4bd1fbd5ab06356ad990f68ea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2012 zcmb7F4Qvx-7``eSY-2J4gDPWmw}>FLch}Lu&K|S0qaChW**e$7sN8yA+hc97ySvdJ z$Dd9JKVgVJ_=Ae_;|7EgV}t^RX@-md0tyL8#vlwNI9Oan7!2{dw(JLn#!Ig4_dU=1 ze((F-b8lBz3XRE$&mI9V@+cJ4cXDp-a>%QR-(?9&4mYYOq8Bvfd%hbrwk44OML zQ5zs(0uK;rMZn|s3S@vnBY8>qTiV7@MT8<&QmD;rQRq1yC^RaK3P)!qDzrS~Ad3yN zW5IAmp)OJMkr?Lp`&Ird6~{X&Z9po(lUNJMG zgrp0p=iD4$0<8fkG+U#|()2+VHUQi<1M2}^0SZr{1dcz1miI%aMZsR>qN&Xs12Yqm zxIQRfueb1=gLOm9$b+C@r`1yas$vF|Id{78JHqs3J&CnukphZ}w8du{=T&={jtV9ku zjUd%IQ*eTeNfP064C@H~7hCeQLJRq3GihQ4k>i7rt*FsUKvi@VUAozb!zGVPeA+H` zN1;BRW2)_diF6Tp10+=79HO7*fzAmZF@@?J4i@SVR9GadD+tweRo1`&zYD-*(Z&cR zk!>YrkVF=VYhsOIgO(Dp++$0LqW`0mXh8o`2GclJiWZaJ{s$syu}5T#68en`*g|v< zjv+YDu-<_N7ri49c;Ou6;lL|x!b{+=Y-OQ82lx^}8!32X*|q_9rc` zj0>;qh+Cdl9(EtU^KR?S(7tt@mp_^GdDF?WXSIiQJ@d~OG`1bBOrJM(*2rhK#u=)% zrR~0SY=2Pc*TcrAHk#lwl?w=x zG)lT<$j2Mx2qJqm-=MSF-nO4I+2v!Fup7s}sKl?m^L_kmN`0oO-WWeleskEuB`Mp} z##TK)G;G{FqpWPNDP&{vEr0J*x;%)*8+?(NRF1j+Q-r%My&?_rj&HOl2P0&|jH7{BYc4>B%8XyU{J zEvYB9Q*F%EPWharJFj0sl{3YY8CM~eaQR?qMpu1>{^!i$@VbBEwypTwg`wCD$MHRX zC6u~{h1$C=Zccsu?~SXTBI{c&>4$6b zp|@Q7Q>KjgeG}JQpVm%v-MF={t+^rXYmZWVNVn{C8L~|`n+Rv5XG(v{`FVwgowMe> F`40+cwDAA{ diff --git a/resources/skins/Default/media/NextDialog/play-nf.png b/resources/skins/Default/media/NextDialog/play-nf.png deleted file mode 100644 index 64531f6bac97f3e2d970b02dd554242db7864fc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2007 zcmb7E4NMbf7(RmdgRo)L$);jGVnngMyO!d5>+#o?mPu>DI?Lu_kM>&5{#>~`Y)jPW ztfJ0oCefLx8Clf%lMNStHm2LyL}fwUjJn7iU_f1FRGgD2f^OekD?byr?2_yC`=0lG zzW06Zxp$q}q)&{0B_4vH!~%o17(5-|P8&H4{C-^iK_djkscDOqw;Bs^JL8p+4yKfn z1-*WNLy$T<=qK%NikFm9F4{-HoyWd~CA5Qp7buOW(XXM(XhS7S&8sw7?3Hf2$^mC* z#jArjAn;N=DG7Q#J`N8Ou*i#p|H3u`OT-Y~O~6*8S)yTBN}`l0Whk5#FHy4&Ctj@0 zk0yf^0hjT-A4iZtARr4UWDM&7xM9BQ0n7S1&RoVmg4Lz?dNI6 zClNTwQl^3@U>M+%C^;3R``LY5w0$51A|MDRLy>{u{xXJVxH87ySJ9xHKKPkLo_0Rx z907SI9LP8H2|?07RIt(b@8MqWpf)&Ow*&|g6?ISxPY>WMAwPu_Qyf#l+9}-<%EzaQ zN(j2(8pgx0^MExd0?t$_70Q0dOb02CRZDv*9|wddU<^h7ftCzFGa_K0auI4H;{eQ< znAZ;#Xf$S)anc@u=~*ho*+~y2(JCVpf{=KDmvm8ul+VSN5pa~dA6P&;g#D)#iGa|e zr$X?^d>;)&k&B0lkhLEp;MsEEPQf`MR5Bz4UK?%%{&tW&sU>+(rW}={QdBNQ6&6f| zXJEJ@BOS%?s3c-M{T37;BqY57&2rjqUD}jN(B8Mr9=`2mNJya(Nffi@by0xNsT-sV9{2L2r6O9)EdQemDuI;LpS4yx&7F1z_! ztof~pb?a}%Rq0CVJU>3FZt1E#wz>2A_Oy@c&o?)#f5`1!+*(-McE+7zo0T_a+MYOV z`Tj{?beugNk_I%xOU4!HS|_ZVw6SMw@6OZX*W8$+aXoJ9QQeRmhIJPn4qIk)n-Vte z+m-pt#oa9pw~JrgJGv;C#MCZVPHDJ+)fHN<=1i?0HEP(>@I~eQpTc(@TycH9H1$^9 zjNt2EjX!F&uNqg;nzC&V_eSll75k7Y+90msZdo=?ax*YDL2pP1Y=av3zD z8cHvpIigPgu*B`Lgw__R8j0`g>zj5m9cd;)4>=LmjkM-9NC2UZn#UgEUv;KTE zegEa8`;ABR7ixPSRmt!M^}Wu&TGQPrrPVJNr*wC_e{Zg4K5t5#y6JdN#_jtZonJbt zHt6qUZD;?uvgp@)nub)pZ`L=f7M)DG+t``yJ~uh2GhC{9(D+I1AyeCvJnQ6+t10jO zW^1=Sxw}1i%PMvL^4^}6MP1|w&CyR+zc4_qMqBKOQ>oBSQx4glm$MKE4;AQ4+RyTA G@B9tB!@Ge1 diff --git a/resources/skins/Default/media/NextDialog/play.png b/resources/skins/Default/media/NextDialog/play.png new file mode 100644 index 0000000000000000000000000000000000000000..12aedfa5a9efe5392c9620b786d4a1199d05a316 GIT binary patch literal 2135 zcmc&$eM}Q)96o}4SZ0S`f#{IiX*P{%@1s=OOIu(RDQdCOI!opp<$9$jZLeOhv_gvpF*-Mn$6$Wgv5Ln+_3%j?7G*SzNaHfwHL^al^5xLEL-S%Ev_gbAMdh_kEuC zdEejjKKD!4neubTNG3@j2pW@T&=-Jj6L_Y_j{={q%#rmF6!R5hvGP{qJd$GFa+{qk zrsYAm7vK=2$q0IFR4L8F#dHbd(IU6MXhvYhu0<9pjhNA!O*k^>*3i>FietPy z!+Kyr(^ky-c`bqf9FB<7L1s|hI7mP+oSniDMm%3t+h%9r95&7Y*x`VF|%UGS6)*q36+_65gprBHDw%BE~MvM-C*; z3kACTLP8dL7+?t@?kPgnK}?IJ6Cj&HZbYbXLQTh(Khc#i`YcyegRX=Z40UCs z>yEghL4`K-=)N@QV>cQm4C!0I&F~!PhoG^d1DzEN26{8?0S%c0o%epaYAop5KQrJ> z8TN)iQ1TYP>A2)%X7b#`niUQn^RZ6xoO&wbGzifzkF@V5o1k4-+On1y>*4RG5_hD-J=pD zQ;Jt7das(dp35Eo`Q^9Xc+frh>S<$(`TU`V*4Wqd`+NRwORH&GS+acI#@^HiWn1gH z=0gP=+Y`S1gE)1*eQ7BubhOt{=!2ky@xl`YZQGsNf^v{vS<>EF~6!@JXym_K(_Ns%}LGfYS8C7W|6PPPcd zqPuI`PmTL6I&R5NXLc;>9)I8>%w6ef&71jUUsh7eG-=;I?49)ovLE(S9nVSP`tK69 z_LDze?24_3zO0k)SlJ_!{}2_p(yjQqYRSVkSw@4juQ@Sy%_qEzo literal 0 HcmV?d00001 diff --git a/resources/skins/Default/media/Controls/DialogCloseButton-focus.png b/resources/skins/Default/media/close.png similarity index 100% rename from resources/skins/Default/media/Controls/DialogCloseButton-focus.png rename to resources/skins/Default/media/close.png diff --git a/resources/skins/Default/media/white.png b/resources/skins/Default/media/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= 3: - from concurrent import futures -else: - from concurrent_py2 import futures - -next_dialogs = ['NextDialog.xml', 'NextDialogExtended.xml', 'NextDialogCompact.xml'] -next_ep_type = config.get_setting('next_ep_type') - -# compatibility with previous version -if type(next_ep_type) == bool: - ND = 'NextDialogCompact.xml' if config.get_setting('next_ep_type') else 'NextDialog.xml' -else: - ND = next_dialogs[next_ep_type] - -def check(item): - return True if config.get_setting('next_ep') > 0 and item.contentType != 'movie' else False - - -def return_item(item): - log() - with futures.ThreadPoolExecutor() as executor: - future = executor.submit(next_ep, item) - item = future.result() - return item - -def run(item): - log() - with futures.ThreadPoolExecutor() as executor: - future = executor.submit(next_ep, item) - item = future.result() - if item.next_ep: - return play_from_library(item) - - -def videolibrary(item): - from threading import Thread - item.videolibrary = True - Thread(target=next_ep, args=[item]).start() - - -def next_ep(item): - log() - - condition = config.get_setting('next_ep') - item.next_ep = False - item.show_server = True - - VL = True if item.videolibrary else False - - time_over = False - time_limit = time() + 30 - time_setting = config.get_setting('next_ep_seconds') - TimeFromEnd = time_setting - - # wait until the video plays - while not platformtools.is_playing() and time() < time_limit: - sleep(1) - - while platformtools.is_playing() and not time_over: - try: - Total = xbmc.Player().getTotalTime() - Actual = xbmc.Player().getTime() - Difference = Total - Actual - if Total > TimeFromEnd >= Difference: - time_over = True - except: - break - - if time_over: - if condition == 1: # hide server afther x second - item.show_server = False - elif condition == 2: # play next file if exist - # check if next file exist - current_filename = filetools.basename(item.strm_path) - base_path = filetools.basename(filetools.dirname(item.strm_path)) - path = filetools.join(config.get_videolibrary_path(), config.get_setting("folder_tvshows"),base_path) - fileList = [] - for file in filetools.listdir(path): - if file.endswith('.strm'): - fileList.append(file) - - fileList.sort() - - nextIndex = fileList.index(current_filename) + 1 - if nextIndex == 0 or nextIndex == len(fileList): - next_file = None - else: - next_file = fileList[nextIndex] - log('Next File:', next_file) - - # start next episode window afther x time - if next_file: - season_ep = next_file.split('.')[0] - season = season_ep.split('x')[0] - episode = season_ep.split('x')[1] - next_ep = '%sx%s' % (season, episode) - item = Item( - action= 'play_from_library', - channel= 'videolibrary', - contentEpisodeNumber= episode, - contentSeason= season, - contentTitle= next_ep, - contentType= 'episode', - infoLabels= {'episode': episode, 'mediatype': 'episode', 'season': season, 'title': next_ep}, - strm_path= os.sep + filetools.join(base_path, next_file)) - - global INFO - INFO = filetools.join(path, next_file.replace("strm", "nfo")) - log('Next Info:',INFO) - - nextDialog = NextDialog(ND, config.get_runtime_path()) - nextDialog.show() - while platformtools.is_playing() and not nextDialog.is_still_watching(): - xbmc.sleep(100) - pass - - nextDialog.close() - log('Next Episode:', nextDialog.stillwatching) - - if nextDialog.stillwatching or nextDialog.continuewatching: - item.next_ep = True - xbmc.Player().stop() - if VL: - sleep(1) - xbmc.executebuiltin('Action(Back)') - sleep(0.5) - return play_from_library(item) - else: - item.show_server = False - if VL: - sleep(1) - xbmc.executebuiltin('Action(Back)') - sleep(0.5) - return None - - return item - - -class NextDialog(xbmcgui.WindowXMLDialog): - item = None - cancel = False - stillwatching = False - continuewatching = True - - def __init__(self, *args, **kwargs): - log() - self.action_exitkeys_id = [xbmcgui.ACTION_STOP, xbmcgui.ACTION_BACKSPACE, xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK] - self.progress_control = None - - # set info - f = filetools.file_open(INFO, 'r') - full_info = f.read().split('\n') - full_info = full_info[1:] - f.close() - full_info = "".join(full_info) - info = jsontools.load(full_info) - info = info["infoLabels"] - self.setProperty("title", info["tvshowtitle"]) - self.setProperty("ep_title", "%dx%02d - %s" % (info["season"], info["episode"], info["title"])) - if "episodio_imagen" in info: - img = info["episodio_imagen"] - else: - img = filetools.join(config.get_runtime_path(), "resources", "noimage.png") - self.setProperty("next_img", img) - - def set_still_watching(self, stillwatching): - self.stillwatching = stillwatching - - def set_continue_watching(self, continuewatching): - self.continuewatching = continuewatching - - def is_still_watching(self): - return self.stillwatching - - def onFocus(self, controlId): - pass - - def doAction(self): - pass - - def closeDialog(self): - self.close() - - def onClick(self, controlId): - if controlId == 3012: # Still watching - self.set_still_watching(True) - self.set_continue_watching(False) - self.close() - elif controlId == 3013: # Cancel - self.set_continue_watching(False) - self.close() - - def onAction(self, action): - log() - if action in self.action_exitkeys_id: - self.set_continue_watching(False) - self.close() diff --git a/specials/videolibrary.py b/specials/videolibrary.py index c9f8c192..27a2790e 100644 --- a/specials/videolibrary.py +++ b/specials/videolibrary.py @@ -582,6 +582,7 @@ def findvideos(item): # We run find_videos, from the channel or common item_json.contentChannel = 'videolibrary' + item_json.play_from = item.play_from if hasattr(channel, 'findvideos'): from core import servertools if item_json.videolibray_emergency_urls: @@ -629,10 +630,7 @@ def findvideos(item): if autoplay.play_multi_channel(item, itemlist): # hideserver return [] - from inspect import stack - from specials import nextep - if nextep.check(item) and stack()[1][3] == 'run': - nextep.videolibrary(item) + add_download_items(item, itemlist) return itemlist