From 425e989bc89d28abbe3292250acb97344bb22e26 Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Mon, 29 May 2017 17:32:09 +0200 Subject: [PATCH 01/14] Update German --- resources/language/resource.language.de_DE/strings.po | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/language/resource.language.de_DE/strings.po b/resources/language/resource.language.de_DE/strings.po index 1e290da7..0b5fd9a1 100644 --- a/resources/language/resource.language.de_DE/strings.po +++ b/resources/language/resource.language.de_DE/strings.po @@ -2124,3 +2124,11 @@ msgid "" msgstr "" "Kodi kann die Datei {0} nicht übersetzen. PKC wird nicht richtig " "funktionieren. Bitte {1} besuchen und die Datei korrigieren!" + +# Shown once on first installation to comply with the terms of use of +# themoviedb.org +msgctxt "#39717" +msgid "PKC uses free additional artwork from www.themoviedb.org. Many thanks!" +msgstr "" +"PKC benutzt gratis zusätzliche Bilder von www.themoviedb.org. Vielen Dank " +"dafür!" From 9c79a6ddca06becf415b4e8b340cffda10d12042 Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Mon, 29 May 2017 17:34:09 +0200 Subject: [PATCH 02/14] Version bump --- README.md | 4 ++-- addon.xml | 10 ++++++++-- changelog.txt | 6 ++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 498f80e9..53854fde 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![stable version](https://img.shields.io/badge/stable_version-1.8.0-blue.svg?maxAge=60&style=flat) ](https://dl.bintray.com/croneter/PlexKodiConnect/bin/repository.plexkodiconnect/repository.plexkodiconnect-1.0.0.zip) -[![beta version](https://img.shields.io/badge/beta_version-1.8.0-red.svg?maxAge=60&style=flat) ](https://dl.bintray.com/croneter/PlexKodiConnect_BETA/bin-BETA/repository.plexkodiconnectbeta/repository.plexkodiconnectbeta-1.0.0.zip) +[![stable version](https://img.shields.io/badge/stable_version-1.8.1-blue.svg?maxAge=60&style=flat) ](https://dl.bintray.com/croneter/PlexKodiConnect/bin/repository.plexkodiconnect/repository.plexkodiconnect-1.0.0.zip) +[![beta version](https://img.shields.io/badge/beta_version-1.8.1-red.svg?maxAge=60&style=flat) ](https://dl.bintray.com/croneter/PlexKodiConnect_BETA/bin-BETA/repository.plexkodiconnectbeta/repository.plexkodiconnectbeta-1.0.0.zip) [![Installation](https://img.shields.io/badge/wiki-installation-brightgreen.svg?maxAge=60&style=flat)](https://github.com/croneter/PlexKodiConnect/wiki/Installation) [![FAQ](https://img.shields.io/badge/wiki-FAQ-brightgreen.svg?maxAge=60&style=flat)](https://github.com/croneter/PlexKodiConnect/wiki/faq) diff --git a/addon.xml b/addon.xml index 04fbf2a8..f24edd75 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@ - + @@ -44,7 +44,13 @@ Gebruik op eigen risico 使用風險由您自己承擔 Usar a su propio riesgo - version 1.8.0 + version 1.8.1: +- Fix library sync crash due to UnicodeDecodeError +- Fix fanart for collections +- Comply with themoviedb.org terms of use +- Add some translations + +version 1.8.0 Featuring: - Major music overhaul: Direct Paths should now work! Many thanks @Memesa for the pointers! Don't forget to reset your database - Big transcoding overhaul diff --git a/changelog.txt b/changelog.txt index 5b7d3fd1..8f7b807d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +version 1.8.1: +- Fix library sync crash due to UnicodeDecodeError +- Fix fanart for collections +- Comply with themoviedb.org terms of use +- Add some translations + version 1.8.0 Featuring: - Major music overhaul: Direct Paths should now work! Many thanks @Memesa for the pointers! Don't forget to reset your database From 0fd4a641ad34c4289547369be67d84fae5d3341d Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 09:56:23 +0200 Subject: [PATCH 03/14] Increase logging --- resources/lib/PlexAPI.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/lib/PlexAPI.py b/resources/lib/PlexAPI.py index 670bba42..49b14dbe 100644 --- a/resources/lib/PlexAPI.py +++ b/resources/lib/PlexAPI.py @@ -1900,7 +1900,8 @@ class API(): log.info('Plex did not provide ID for IMDB or TVDB. Start ' 'lookup process') else: - log.info('Start movie set/collection lookup on themoviedb') + log.info('Start movie set/collection lookup on themoviedb using %s' + % item.get('title', '')) apiKey = settings('themoviedbAPIKey') if media_type == v.PLEX_TYPE_SHOW: From 3817e6afb808d1ad8cabbbde01b7a7ed515fbf19 Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 10:05:50 +0200 Subject: [PATCH 04/14] Use https for themoviedb --- resources/lib/PlexAPI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/PlexAPI.py b/resources/lib/PlexAPI.py index 49b14dbe..0b8b5a10 100644 --- a/resources/lib/PlexAPI.py +++ b/resources/lib/PlexAPI.py @@ -1910,7 +1910,7 @@ class API(): # if the title has the year in remove it as tmdb cannot deal with it... # replace e.g. 'The Americans (2015)' with 'The Americans' title = sub(r'\s*\(\d{4}\)$', '', title, count=1) - url = 'http://api.themoviedb.org/3/search/%s' % media_type + url = 'https://api.themoviedb.org/3/search/%s' % media_type parameters = { 'api_key': apiKey, 'language': v.KODILANGUAGE, From f4507a36307efa2877d1b59be7a258b1c2ab365e Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 10:10:54 +0200 Subject: [PATCH 05/14] Use https for themoviedb --- resources/lib/PlexAPI.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lib/PlexAPI.py b/resources/lib/PlexAPI.py index 0b8b5a10..4b9c2f02 100644 --- a/resources/lib/PlexAPI.py +++ b/resources/lib/PlexAPI.py @@ -2002,10 +2002,10 @@ class API(): for language in [v.KODILANGUAGE, "en"]: parameters['language'] = language if media_type == "movie": - url = 'http://api.themoviedb.org/3/movie/%s' % tmdbId + url = 'https://api.themoviedb.org/3/movie/%s' % tmdbId parameters['append_to_response'] = 'videos' elif media_type == "tv": - url = 'http://api.themoviedb.org/3/tv/%s' % tmdbId + url = 'https://api.themoviedb.org/3/tv/%s' % tmdbId parameters['append_to_response'] = 'external_ids,videos' data = DownloadUtils().downloadUrl( url, From 2fcdda48fbe7f1c0d6d4c9ab68637240870ec0ac Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 11:21:14 +0200 Subject: [PATCH 06/14] More collection artwork: use TheMovieDB art --- resources/lib/PlexAPI.py | 41 +++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/resources/lib/PlexAPI.py b/resources/lib/PlexAPI.py index 4b9c2f02..7c45147c 100644 --- a/resources/lib/PlexAPI.py +++ b/resources/lib/PlexAPI.py @@ -1881,7 +1881,8 @@ class API(): If not found in item's Plex metadata, check themovidedb.org - collection=True will try to return the collection's ID + collection=True will try to return the three-tuple: + collection ID, poster-path, background-path None is returned if unsuccessful """ @@ -2026,9 +2027,28 @@ class API(): mediaId = str(data["external_ids"].get("tvdb_id")) break else: - if data.get("belongs_to_collection") is not None: - mediaId = str(data.get("belongs_to_collection").get("id")) - log.debug('Retrieved collections tmdb id %s' % mediaId) + if data.get("belongs_to_collection") is None: + continue + mediaId = str(data.get("belongs_to_collection").get("id")) + log.debug('Retrieved collections tmdb id %s for %s' + % (mediaId, title)) + url = 'https://api.themoviedb.org/3/collection/%s' % mediaId + data = DownloadUtils().downloadUrl( + url, + authenticate=False, + parameters=parameters, + timeout=7) + try: + data.get('poster_path') + except AttributeError: + log.info('Could not find TheMovieDB poster paths for %s in' + 'the language %s' % (title, language)) + continue + else: + poster = 'https://image.tmdb.org/t/p/original%s' % data.get('poster_path') + background = 'https://image.tmdb.org/t/p/original%s' % data.get('backdrop_path') + mediaId = mediaId, poster, background + break return mediaId def getFanartTVArt(self, mediaId, allartworks, setInfo=False): @@ -2159,8 +2179,19 @@ class API(): # fanart tv only for movie or tv show externalId = self.getExternalItemId(collection=True) if externalId is not None: + try: + externalId, poster, background = externalId + except TypeError: + poster, background = None, None + if poster is not None: + allartworks['Primary'] = poster + if background is not None: + allartworks['Backdrop'].append(background) allartworks = self.getFanartTVArt(externalId, allartworks, True) - return allartworks + else: + log.info('Did not find a set/collection ID on TheMovieDB using %s.' + ' Artwork will be missing.' % self.getTitle()) + return allartworks def shouldStream(self): """ From 5698d30541cad5ab7b4fed76b846e4edf638bc44 Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 12:28:26 +0200 Subject: [PATCH 07/14] Increase logging --- resources/lib/companion.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/lib/companion.py b/resources/lib/companion.py index 9733acce..1373b162 100644 --- a/resources/lib/companion.py +++ b/resources/lib/companion.py @@ -115,6 +115,8 @@ def process_command(request_path, params, queue=None): volume = int(params['volume']) log.debug("Adjusting the volume to %s" % volume) JSONRPC('Application.SetVolume').execute({"volume": volume}) + else: + log.error('Unknown parameters: %s' % params) elif request_path == "player/playback/play": for playerid in getPlayerIds(): From e16a212a4ecdf398d1a1a4a83c3fb8ef0fd914e8 Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 12:51:03 +0200 Subject: [PATCH 08/14] Fix TypeError --- resources/lib/PlexAPI.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lib/PlexAPI.py b/resources/lib/PlexAPI.py index 7c45147c..3c867928 100644 --- a/resources/lib/PlexAPI.py +++ b/resources/lib/PlexAPI.py @@ -2189,8 +2189,8 @@ class API(): allartworks['Backdrop'].append(background) allartworks = self.getFanartTVArt(externalId, allartworks, True) else: - log.info('Did not find a set/collection ID on TheMovieDB using %s.' - ' Artwork will be missing.' % self.getTitle()) + log.info('Artwork will be missing: Did not find a set/collection ' + 'ID on TheMovieDB using %s.' % self.getTitle()) return allartworks def shouldStream(self): From d57e4ff2ef70de262cfb59d8b5a4f837de11b70f Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 12:55:58 +0200 Subject: [PATCH 09/14] Revert "Fix TypeError" This reverts commit e16a212a4ecdf398d1a1a4a83c3fb8ef0fd914e8. --- resources/lib/PlexAPI.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lib/PlexAPI.py b/resources/lib/PlexAPI.py index 3c867928..7c45147c 100644 --- a/resources/lib/PlexAPI.py +++ b/resources/lib/PlexAPI.py @@ -2189,8 +2189,8 @@ class API(): allartworks['Backdrop'].append(background) allartworks = self.getFanartTVArt(externalId, allartworks, True) else: - log.info('Artwork will be missing: Did not find a set/collection ' - 'ID on TheMovieDB using %s.' % self.getTitle()) + log.info('Did not find a set/collection ID on TheMovieDB using %s.' + ' Artwork will be missing.' % self.getTitle()) return allartworks def shouldStream(self): From 93009aa444c0cb3a2495f10bff09f04977bfa8c1 Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 12:56:15 +0200 Subject: [PATCH 10/14] Fix TypeError --- resources/lib/PlexAPI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/PlexAPI.py b/resources/lib/PlexAPI.py index 7c45147c..2311c32a 100644 --- a/resources/lib/PlexAPI.py +++ b/resources/lib/PlexAPI.py @@ -2190,7 +2190,7 @@ class API(): allartworks = self.getFanartTVArt(externalId, allartworks, True) else: log.info('Did not find a set/collection ID on TheMovieDB using %s.' - ' Artwork will be missing.' % self.getTitle()) + ' Artwork will be missing.' % self.getTitle()[0]) return allartworks def shouldStream(self): From 17ab1613698f0f440c5b92d678fe2d4abf9c9abf Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 12:57:53 +0200 Subject: [PATCH 11/14] Fix another TypeError --- resources/lib/PlexAPI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/PlexAPI.py b/resources/lib/PlexAPI.py index 2311c32a..8c307811 100644 --- a/resources/lib/PlexAPI.py +++ b/resources/lib/PlexAPI.py @@ -2191,7 +2191,7 @@ class API(): else: log.info('Did not find a set/collection ID on TheMovieDB using %s.' ' Artwork will be missing.' % self.getTitle()[0]) - return allartworks + return allartworks def shouldStream(self): """ From 3fdb58385118475522880245e14bcc5ad33afbb5 Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 13:44:04 +0200 Subject: [PATCH 12/14] Support new Companion command "refreshPlayQueue" --- resources/lib/PlexCompanion.py | 21 ++++++++++++++++++ resources/lib/companion.py | 6 ++++++ resources/lib/playlist_func.py | 39 ++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/resources/lib/PlexCompanion.py b/resources/lib/PlexCompanion.py index a16bf50e..9cf71bf5 100644 --- a/resources/lib/PlexCompanion.py +++ b/resources/lib/PlexCompanion.py @@ -12,6 +12,7 @@ from plexbmchelper import listener, plexgdm, subscribers, functions, \ httppersist, plexsettings from PlexFunctions import ParseContainerKey, GetPlexMetadata from PlexAPI import API +from playlist_func import get_pms_playqueue, get_plextype_from_xml import player import variables as v import state @@ -149,6 +150,26 @@ class PlexCompanion(Thread): offset=data.get('offset')) playqueue.plex_transient_token = token + elif task['action'] == 'refreshPlayQueue': + # example data: {'playQueueID': '8475', 'commandID': '11'} + xml = get_pms_playqueue(data['playQueueID']) + if xml is None: + return + if len(xml) == 0: + log.debug('Empty playqueue received - clearing playqueue') + plex_type = get_plextype_from_xml(xml) + if plex_type is None: + return + playqueue = self.mgr.playqueue.get_playqueue_from_type( + v.KODI_PLAYLIST_TYPE_FROM_PLEX_TYPE[plex_type]) + playqueue.clear() + return + playqueue = self.mgr.playqueue.get_playqueue_from_type( + v.KODI_PLAYLIST_TYPE_FROM_PLEX_TYPE[xml[0].attrib['type']]) + self.mgr.playqueue.update_playqueue_from_PMS( + playqueue, + data['playQueueID']) + def run(self): # Ensure that sockets will be closed no matter what try: diff --git a/resources/lib/companion.py b/resources/lib/companion.py index 1373b162..7608c920 100644 --- a/resources/lib/companion.py +++ b/resources/lib/companion.py @@ -110,6 +110,12 @@ def process_command(request_path, params, queue=None): 'data': params }) + elif request_path == 'player/playback/refreshPlayQueue': + queue.put({ + 'action': 'refreshPlayQueue', + 'data': params + }) + elif request_path == "player/playback/setParameters": if 'volume' in params: volume = int(params['volume']) diff --git a/resources/lib/playlist_func.py b/resources/lib/playlist_func.py index f1371acd..7ed52a52 100644 --- a/resources/lib/playlist_func.py +++ b/resources/lib/playlist_func.py @@ -1,16 +1,19 @@ import logging from urllib import quote from urlparse import parse_qsl, urlsplit +from re import compile as re_compile import plexdb_functions as plexdb from downloadutils import DownloadUtils as DU from utils import JSONRPC, tryEncode, escape_html from PlexAPI import API +from PlexFunctions import GetPlexMetadata ############################################################################### log = logging.getLogger("PLEX."+__name__) +REGEX = re_compile(r'''metadata%2F(\d+)''') ############################################################################### # kodi_item dict: @@ -566,3 +569,39 @@ def remove_from_Kodi_playlist(playlist, pos): del playlist.items[pos] except IndexError: log.error('Cannot delete position %s for %s' % (pos, playlist)) + + +def get_pms_playqueue(playqueue_id): + """ + Returns the Plex playqueue as an etree XML or None if unsuccessful + """ + xml = DU().downloadUrl( + "{server}/playQueues/%s" % playqueue_id, + headerOptions={'Accept': 'application/xml'}) + try: + xml.attrib + except AttributeError: + log.error('Could not download Plex playqueue %s' % playqueue_id) + xml = None + return xml + + +def get_plextype_from_xml(xml): + """ + Needed if PMS returns an empty playqueue. Will get the Plex type from the + empty playlist playQueueSourceURI. Feed with (empty) etree xml + + returns None if unsuccessful + """ + try: + plex_id = REGEX.findall(xml.attrib['playQueueSourceURI'])[0] + except IndexError: + log.error('Could not get plex_id from xml: %s' % xml.attrib) + return + new_xml = GetPlexMetadata(plex_id) + try: + new_xml[0].attrib + except (TypeError, IndexError, AttributeError): + log.error('Could not get plex metadata for plex id %s' % plex_id) + return + return new_xml[0].attrib.get('type') From 8282283a65dabc3bdac6dbde49c1239870f3bd2e Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 13:45:01 +0200 Subject: [PATCH 13/14] Remove obsolete method --- resources/lib/playlist_func.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/resources/lib/playlist_func.py b/resources/lib/playlist_func.py index 7ed52a52..61ab9ac3 100644 --- a/resources/lib/playlist_func.py +++ b/resources/lib/playlist_func.py @@ -66,9 +66,6 @@ class Playlist_Object_Baseclase(object): self.plex_transient_token = None log.debug('Playlist cleared: %s' % self) - def log_Kodi_playlist(self): - log.debug('Current Kodi playlist: %s' % get_kodi_playlist_items(self)) - class Playlist_Object(Playlist_Object_Baseclase): kind = 'playList' From d4c290effb5917503ee17dd14ff877f764172dcc Mon Sep 17 00:00:00 2001 From: tomkat83 Date: Wed, 31 May 2017 14:13:45 +0200 Subject: [PATCH 14/14] Choose to replace user ratings with #media versions --- .../language/resource.language.en_gb/strings.po | 12 +++++++++++- resources/lib/PlexAPI.py | 13 ++++++++++--- resources/lib/initialsetup.py | 6 ++++++ resources/lib/state.py | 2 ++ resources/lib/userclient.py | 2 ++ resources/settings.xml | 1 + 6 files changed, 32 insertions(+), 4 deletions(-) diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po index 73e05ece..6a5d051c 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/resources/language/resource.language.en_gb/strings.po @@ -1943,4 +1943,14 @@ msgstr "" # Shown once on first installation to comply with the terms of use of themoviedb.org msgctxt "#39717" msgid "PKC uses free additional artwork from www.themoviedb.org. Many thanks!" -msgstr "" \ No newline at end of file +msgstr "" + +# Shown during very first PKC setup only +msgctxt "#39718" +msgid "Do you want to replace your custom user ratings with an indicator of how many versions of a media item you posses?" +msgstr "" + +# In PKC Settings under Sync +msgctxt "#39719" +msgid "Replace user ratings with number of media versions" +msgstr "" diff --git a/resources/lib/PlexAPI.py b/resources/lib/PlexAPI.py index 8c307811..03f360f6 100644 --- a/resources/lib/PlexAPI.py +++ b/resources/lib/PlexAPI.py @@ -1288,10 +1288,17 @@ class API(): except (KeyError, ValueError): lastPlayedDate = None - try: - userrating = int(float(item['userRating'])) - except (KeyError, ValueError): + if state.INDICATE_MEDIA_VERSIONS is True: userrating = 0 + for entry in self.item.findall('./Media'): + userrating += 1 + # Don't show a value of '1' + userrating = 0 if userrating == 1 else userrating + else: + try: + userrating = int(float(item['userRating'])) + except (KeyError, ValueError): + userrating = 0 try: rating = float(item['audienceRating']) diff --git a/resources/lib/initialsetup.py b/resources/lib/initialsetup.py index 0c1d83ad..f29afa72 100644 --- a/resources/lib/initialsetup.py +++ b/resources/lib/initialsetup.py @@ -488,10 +488,16 @@ class InitialSetup(): if dialog.yesno(heading=lang(29999), line1=lang(39061)): log.debug("User opted to use FanArtTV") settings('FanartTV', value="true") + # Do you want to replace your custom user ratings with an indicator of + # how many versions of a media item you posses? + if dialog.yesno(heading=lang(29999), line1=lang(39718)): + log.debug("User opted to replace user ratings with version number") + settings('indicate_media_versions', value="true") # If you use several Plex libraries of one kind, e.g. "Kids Movies" and # "Parents Movies", be sure to check https://goo.gl/JFtQV9 dialog.ok(heading=lang(29999), line1=lang(39076)) + # Need to tell about our image source for collections: themoviedb.org dialog.ok(heading=lang(29999), line1=lang(39717)) # Make sure that we only ask these questions upon first installation diff --git a/resources/lib/state.py b/resources/lib/state.py index 865f4556..b364f749 100644 --- a/resources/lib/state.py +++ b/resources/lib/state.py @@ -22,6 +22,8 @@ RESTRICTED_USER = False # Direct Paths (True) or Addon Paths (False)? Along with # window('useDirectPaths') DIRECT_PATHS = False +# Shall we replace custom user ratings with the number of versions available? +INDICATE_MEDIA_VERSIONS = False # Along with window('plex_authenticated') AUTHENTICATED = False diff --git a/resources/lib/userclient.py b/resources/lib/userclient.py index 587bf1c7..f9671263 100644 --- a/resources/lib/userclient.py +++ b/resources/lib/userclient.py @@ -165,6 +165,8 @@ class UserClient(threading.Thread): if settings('useDirectPaths') == "1" else 'false') state.DIRECT_PATHS = True if settings('useDirectPaths') == "1" \ else False + state.INDICATE_MEDIA_VERSIONS = True \ + if settings('indicate_media_versions') == "true" else False window('plex_force_transcode_pix', value='true' if settings('force_transcode_pix') == "1" else 'false') diff --git a/resources/settings.xml b/resources/settings.xml index 8ff636c0..52865be1 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -59,6 +59,7 @@ +