diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml index 76e1c82ef..ded5f8ed1 100644 --- a/.github/workflows/make-release.yml +++ b/.github/workflows/make-release.yml @@ -20,7 +20,7 @@ jobs: id: release run: | version=${GITHUB_REF/refs\/tags\//} - if [[ $version == *-dev ]] ; + if [[ $version == *[-+]@(alpha|beta|dev)*([.0-9a-z]) ]] ; then echo "pre-release=true" >> $GITHUB_OUTPUT else @@ -64,11 +64,14 @@ jobs: - name: Create Zip (Nexus-Unofficial) id: zip-unofficial-nexus + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | git reset git checkout . + git fetch origin/nexus-unofficial + git cherry-pick ...nexus-unofficial -n git clean -fdx - git apply .patches/unofficial.patch mv .git .. rm -rf .??* rm *.md @@ -104,11 +107,14 @@ jobs: - name: Create Zip (Matrix-Unofficial) id: zip-unofficial-matrix + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | git reset git checkout . + git fetch origin/nexus-unofficial + git cherry-pick ...nexus-unofficial -n git clean -fdx - git apply .patches/unofficial.patch mv .git .. rm -rf .??* rm *.md diff --git a/.github/workflows/submit-release.yml b/.github/workflows/submit-release.yml index 5057f6dd3..320950dc0 100644 --- a/.github/workflows/submit-release.yml +++ b/.github/workflows/submit-release.yml @@ -74,7 +74,7 @@ jobs: version=$(xmlstarlet sel -t -v 'string(/addon/@version)' addon.xml) xmlstarlet ed -L -u '/addon/@version' -v "${version}+matrix.1" addon.xml xmlstarlet ed -L -u '/addon/requires/import[@addon="xbmc.python"]/@version' -v '3.0.0' addon.xml - xmlstarlet ed -L -u '/addon/requires/import[@addon="inputstream.adaptive"]/@version' -v '19.0.7' addon.xml + xmlstarlet ed -L -u '/addon/requires/import[@addon="inputstream.adaptive"]/@version' -v '19.0.0' addon.xml xmlstarlet ed -L -d '/addon/requires/import[@addon="script.module.infotagger"]' addon.xml git add . git commit -m "Kodi 19 Patch" diff --git a/.patches/unofficial.patch b/.patches/unofficial.patch deleted file mode 100644 index 32e255cce..000000000 --- a/.patches/unofficial.patch +++ /dev/null @@ -1,615 +0,0 @@ - addon.xml | 1 + - .../kodion/abstract_provider.py | 21 ++- - .../kodion/constants/const_settings.py | 4 + - .../kodion/impl/abstract_context_ui.py | 6 + - .../kodion/impl/abstract_settings.py | 3 + - .../kodion/impl/xbmc/xbmc_context.py | 1 + - .../kodion/impl/xbmc/xbmc_context_ui.py | 12 ++ - .../kodion/impl/xbmc/xbmc_runner.py | 8 + - .../youtube_plugin/kodion/utils/__init__.py | 3 +- - .../kodion/utils/view_manager.py | 166 ++++++++++++++++++ - .../youtube_plugin/youtube/helper/utils.py | 2 +- - .../youtube/helper/yt_specials.py | 18 +- - .../lib/youtube_plugin/youtube/provider.py | 22 +-- - resources/settings.xml | 33 +++- - 14 files changed, 276 insertions(+), 24 deletions(-) - create mode 100644 resources/lib/youtube_plugin/kodion/utils/view_manager.py - -diff --git a/addon.xml b/addon.xml -index 57d0b3c6..13eba70c 100644 ---- a/addon.xml -+++ b/addon.xml -@@ -107,3 +107,4 @@ - 此附加元件未由Google支持 - - -+ -diff --git a/resources/lib/youtube_plugin/kodion/abstract_provider.py b/resources/lib/youtube_plugin/kodion/abstract_provider.py -index ff8ffd44..1306ca2c 100644 ---- a/resources/lib/youtube_plugin/kodion/abstract_provider.py -+++ b/resources/lib/youtube_plugin/kodion/abstract_provider.py -@@ -72,10 +72,29 @@ class AbstractProvider(object): - self._dict_path[re_path] = method_name - - def _process_wizard(self, context): -+ def _setup_views(_context, _view): -+ view_manager = utils.ViewManager(_context) -+ if not view_manager.update_view_mode(_context.localize('setup_wizard.view.%s' % _view]), -+ _view): -+ return -+ -+ _context.get_settings().set_bool(constants.setting.VIEW_OVERRIDE, True) -+ - # start the setup wizard - wizard_steps = [] - if context.get_settings().is_setup_wizard_enabled(): - context.get_settings().set_bool(constants.setting.SETUP_WIZARD, False) -+ if utils.ViewManager(context).has_supported_views(): -+ views = self.get_wizard_supported_views() -+ for view in views: -+ if view in utils.ViewManager.SUPPORTED_VIEWS: -+ wizard_steps.append((_setup_views, [context, view])) -+ else: -+ context.log_warning('[Setup-Wizard] Unsupported view "%s"' % view) -+ else: -+ skin_id = context.get_ui().get_skin_id() -+ context.log("ViewManager: Unknown skin id '%s'" % skin_id) -+ - wizard_steps.extend(self.get_wizard_steps(context)) - - if wizard_steps and context.get_ui().on_yes_no_input(context.get_name(), -@@ -278,7 +297,7 @@ class AbstractProvider(object): - query = query.decode('utf-8') - return self.on_search(query, context, re_match) - else: -- context.set_content_type(constants.content_type.FILES) -+ context.set_content_type(constants.content_type.VIDEOS) - result = [] - - location = str(context.get_param('location', False)).lower() == 'true' -diff --git a/resources/lib/youtube_plugin/kodion/constants/const_settings.py b/resources/lib/youtube_plugin/kodion/constants/const_settings.py -index 6f64ca46..a751a1c1 100644 ---- a/resources/lib/youtube_plugin/kodion/constants/const_settings.py -+++ b/resources/lib/youtube_plugin/kodion/constants/const_settings.py -@@ -31,6 +31,10 @@ HIDE_SHORT_VIDEOS = 'youtube.hide_shorts' # (bool) - SUPPORT_ALTERNATIVE_PLAYER = 'kodion.support.alternative_player' # (bool) - ALTERNATIVE_PLAYER_WEB_URLS = 'kodion.alternative_player.web.urls' # (bool) - -+VIEW_OVERRIDE = 'kodion.view.override' # (bool) -+VIEW_DEFAULT = 'kodion.view.default' # (int) -+VIEW_X = 'kodion.view.%s' # (int) -+ - ALLOW_DEV_KEYS = 'youtube.allow.dev.keys' # (bool) - - VIDEO_QUALITY = 'kodion.video.quality' # (int) -diff --git a/resources/lib/youtube_plugin/kodion/impl/abstract_context_ui.py b/resources/lib/youtube_plugin/kodion/impl/abstract_context_ui.py -index 7ed3feff..46eabf26 100644 ---- a/resources/lib/youtube_plugin/kodion/impl/abstract_context_ui.py -+++ b/resources/lib/youtube_plugin/kodion/impl/abstract_context_ui.py -@@ -16,6 +16,12 @@ class AbstractContextUI(object): - def create_progress_dialog(self, heading, text=None, background=False): - raise NotImplementedError() - -+ def set_view_mode(self, view_mode): -+ raise NotImplementedError() -+ -+ def get_view_mode(self): -+ raise NotImplementedError() -+ - def get_skin_id(self): - raise NotImplementedError() - -diff --git a/resources/lib/youtube_plugin/kodion/impl/abstract_settings.py b/resources/lib/youtube_plugin/kodion/impl/abstract_settings.py -index 47ec7ed2..4a314d65 100644 ---- a/resources/lib/youtube_plugin/kodion/impl/abstract_settings.py -+++ b/resources/lib/youtube_plugin/kodion/impl/abstract_settings.py -@@ -90,6 +90,9 @@ class AbstractSettings(object): - def is_setup_wizard_enabled(self): - return self.get_bool(SETTINGS.SETUP_WIZARD, False) - -+ def is_override_view_enabled(self): -+ return self.get_bool(SETTINGS.VIEW_OVERRIDE, False) -+ - def is_support_alternative_player_enabled(self): - return self.get_bool(SETTINGS.SUPPORT_ALTERNATIVE_PLAYER, False) - -diff --git a/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context.py b/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context.py -index 03b9cee7..6704d974 100644 ---- a/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context.py -+++ b/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context.py -@@ -215,6 +215,7 @@ class XbmcContext(AbstractContext): - def set_content_type(self, content_type): - self.log_debug('Setting content-type: "%s" for "%s"' % (content_type, self.get_path())) - xbmcplugin.setContent(self._plugin_handle, content_type) -+ self.get_ui().set_view_mode(content_type) - - def add_sort_method(self, *sort_methods): - for sort_method in sort_methods: -diff --git a/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context_ui.py b/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context_ui.py -index 147d4e5e..b83f101b 100644 ---- a/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context_ui.py -+++ b/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_context_ui.py -@@ -33,6 +33,18 @@ class XbmcContextUI(AbstractContextUI): - - return XbmcProgressDialog(heading, text) - -+ def set_view_mode(self, view_mode): -+ if isinstance(view_mode, str): -+ view_mode = self._context.get_settings().get_int(constants.setting.VIEW_X % view_mode, self._context.get_settings().get_int(constants.setting.VIEW_DEFAULT, 50)) -+ -+ self._view_mode = view_mode -+ -+ def get_view_mode(self): -+ if self._view_mode is not None: -+ return self._view_mode -+ -+ return self._context.get_settings().get_int(constants.setting.VIEW_DEFAULT, 50) -+ - def get_skin_id(self): - return xbmc.getSkinDir() - -diff --git a/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_runner.py b/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_runner.py -index 46fda8a7..1f35935a 100644 ---- a/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_runner.py -+++ b/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_runner.py -@@ -8,6 +8,7 @@ - See LICENSES/GPL-2.0-only for more information. - """ - -+import xbmc - import xbmcgui - import xbmcplugin - -@@ -66,6 +67,13 @@ class XbmcRunner(AbstractProviderRunner): - self.handle, succeeded=True, - updateListing=options.get(AbstractProvider.RESULT_UPDATE_LISTING, False), - cacheToDisc=options.get(AbstractProvider.RESULT_CACHE_TO_DISC, True)) -+ -+ # set alternative view mode -+ if context.get_settings().is_override_view_enabled(): -+ view_mode = context.get_ui().get_view_mode() -+ if view_mode is not None: -+ context.log_debug('Override view mode to "%d"' % view_mode) -+ xbmc.executebuiltin('Container.SetViewMode(%d)' % view_mode) - else: - # handle exception - pass -diff --git a/resources/lib/youtube_plugin/kodion/utils/__init__.py b/resources/lib/youtube_plugin/kodion/utils/__init__.py -index 717fb4dc..da0c45b1 100644 ---- a/resources/lib/youtube_plugin/kodion/utils/__init__.py -+++ b/resources/lib/youtube_plugin/kodion/utils/__init__.py -@@ -15,6 +15,7 @@ from .favorite_list import FavoriteList - from .watch_later_list import WatchLaterList - from .function_cache import FunctionCache - from .access_manager import AccessManager -+from .view_manager import ViewManager - from .http_server import get_http_server, is_httpd_live, get_client_ip_address - from .monitor import YouTubeMonitor - from .player import YouTubePlayer -@@ -24,7 +25,7 @@ from .system_version import SystemVersion - from . import ip_api - - --__all__ = ['SearchHistory', 'FavoriteList', 'WatchLaterList', 'FunctionCache', 'AccessManager', -+__all__ = ['SearchHistory', 'FavoriteList', 'WatchLaterList', 'FunctionCache', 'AccessManager', 'ViewManager', - 'strip_html_from_text', 'create_path', 'create_uri_path', 'find_best_fit', 'to_unicode', 'to_utf8', - 'datetime_parser', 'select_stream', 'get_http_server', 'is_httpd_live', 'YouTubeMonitor', - 'make_dirs', 'loose_version', 'ip_api', 'PlaybackHistory', 'DataCache', 'get_client_ip_address', -diff --git a/resources/lib/youtube_plugin/kodion/utils/view_manager.py b/resources/lib/youtube_plugin/kodion/utils/view_manager.py -new file mode 100644 -index 00000000..9a5fe5ae ---- /dev/null -+++ b/resources/lib/youtube_plugin/kodion/utils/view_manager.py -@@ -0,0 +1,166 @@ -+# -*- coding: utf-8 -*- -+""" -+ -+ Copyright (C) 2014-2016 bromix (plugin.video.youtube) -+ Copyright (C) 2016-2018 plugin.video.youtube -+ -+ SPDX-License-Identifier: GPL-2.0-only -+ See LICENSES/GPL-2.0-only for more information. -+""" -+ -+from .. import constants -+ -+ -+class ViewManager(object): -+ SUPPORTED_VIEWS = ['default', 'movies', 'tvshows', 'episodes', 'musicvideos', 'songs', 'albums', 'artists'] -+ SKIN_DATA = { -+ 'skin.confluence': { -+ 'default': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Big List', 'id': 51}, -+ {'name': 'Thumbnail', 'id': 500} -+ ], -+ 'movies': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Big List', 'id': 51}, -+ {'name': 'Thumbnail', 'id': 500}, -+ {'name': 'Media info', 'id': 504}, -+ {'name': 'Media info 2', 'id': 503} -+ ], -+ 'episodes': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Big List', 'id': 51}, -+ {'name': 'Thumbnail', 'id': 500}, -+ {'name': 'Media info', 'id': 504}, -+ {'name': 'Media info 2', 'id': 503} -+ ], -+ 'tvshows': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Big List', 'id': 51}, -+ {'name': 'Thumbnail', 'id': 500}, -+ {'name': 'Poster', 'id': 500}, -+ {'name': 'Wide', 'id': 505}, -+ {'name': 'Media info', 'id': 504}, -+ {'name': 'Media info 2', 'id': 503}, -+ {'name': 'Fanart', 'id': 508} -+ ], -+ 'musicvideos': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Big List', 'id': 51}, -+ {'name': 'Thumbnail', 'id': 500}, -+ {'name': 'Media info', 'id': 504}, -+ {'name': 'Media info 2', 'id': 503} -+ ], -+ 'songs': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Big List', 'id': 51}, -+ {'name': 'Thumbnail', 'id': 500}, -+ {'name': 'Media info', 'id': 506} -+ ], -+ 'albums': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Big List', 'id': 51}, -+ {'name': 'Thumbnail', 'id': 500}, -+ {'name': 'Media info', 'id': 506} -+ ], -+ 'artists': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Big List', 'id': 51}, -+ {'name': 'Thumbnail', 'id': 500}, -+ {'name': 'Media info', 'id': 506} -+ ] -+ }, -+ 'skin.aeon.nox.5': { -+ 'default': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Episodes', 'id': 502}, -+ {'name': 'LowList', 'id': 501}, -+ {'name': 'BannerWall', 'id': 58}, -+ {'name': 'Shift', 'id': 57}, -+ {'name': 'Posters', 'id': 56}, -+ {'name': 'ShowCase', 'id': 53}, -+ {'name': 'Landscape', 'id': 52}, -+ {'name': 'InfoWall', 'id': 51} -+ ] -+ }, -+ 'skin.xperience1080+': { -+ 'default': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Thumbnail', 'id': 500}, -+ ], -+ 'episodes': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Info list', 'id': 52}, -+ {'name': 'Fanart', 'id': 502}, -+ {'name': 'Landscape', 'id': 54}, -+ {'name': 'Poster', 'id': 55}, -+ {'name': 'Thumbnail', 'id': 500}, -+ {'name': 'Banner', 'id': 60} -+ ], -+ }, -+ 'skin.xperience1080': { -+ 'default': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Thumbnail', 'id': 500}, -+ ], -+ 'episodes': [ -+ {'name': 'List', 'id': 50}, -+ {'name': 'Info list', 'id': 52}, -+ {'name': 'Fanart', 'id': 502}, -+ {'name': 'Landscape', 'id': 54}, -+ {'name': 'Poster', 'id': 55}, -+ {'name': 'Thumbnail', 'id': 500}, -+ {'name': 'Banner', 'id': 60} -+ ], -+ }, -+ 'skin.estuary': { -+ 'default': [ -+ {'name': 'Shift', 'id': 53}, -+ {'name': 'InfoWall', 'id': 54}, -+ {'name': 'Wall', 'id': 500}, -+ {'name': 'WideList', 'id': 55}, -+ ], -+ 'episodes': [ -+ {'name': 'InfoWall', 'id': 54}, -+ {'name': 'Wall', 'id': 500}, -+ {'name': 'WideList', 'id': 55}, -+ ] -+ } -+ } -+ -+ def __init__(self, context): -+ self._context = context -+ -+ def has_supported_views(self): -+ """ -+ Returns True if the View of the current skin are supported -+ :return: True if the View of the current skin are supported -+ """ -+ return self._context.get_ui().get_skin_id() in self.SKIN_DATA -+ -+ def update_view_mode(self, title, view='default'): -+ view_id = -1 -+ settings = self._context.get_settings() -+ -+ skin_id = self._context.get_ui().get_skin_id() -+ skin_data = self.SKIN_DATA.get(skin_id, {}).get(view, []) -+ if skin_data: -+ items = [] -+ for view_data in skin_data: -+ items.append((view_data['name'], view_data['id'])) -+ view_id = self._context.get_ui().on_select(title, items) -+ else: -+ self._context.log_notice("ViewManager: Unknown skin id '%s'" % skin_id) -+ -+ if view_id == -1: -+ old_value = settings.get_string(constants.setting.VIEW_X % view, '') -+ if old_value: -+ result, view_id = self._context.get_ui().on_numeric_input(title, old_value) -+ if not result: -+ view_id = -1 -+ -+ if view_id > -1: -+ settings.set_int(constants.setting.VIEW_X % view, view_id) -+ return True -+ -+ return False -diff --git a/resources/lib/youtube_plugin/youtube/helper/utils.py b/resources/lib/youtube_plugin/youtube/helper/utils.py -index 734e0a12..784468b2 100644 ---- a/resources/lib/youtube_plugin/youtube/helper/utils.py -+++ b/resources/lib/youtube_plugin/youtube/helper/utils.py -@@ -254,7 +254,7 @@ def update_video_infos(provider, context, video_id_dict, playlist_item_id_dict=N - video_item = video_id_dict[video_id] - - # set mediatype -- video_item.set_mediatype('video') # using video -+ video_item.set_mediatype('episode') # using video - - if not yt_item: - continue -diff --git a/resources/lib/youtube_plugin/youtube/helper/yt_specials.py b/resources/lib/youtube_plugin/youtube/helper/yt_specials.py -index 89ad2b11..c5c8fec3 100644 ---- a/resources/lib/youtube_plugin/youtube/helper/yt_specials.py -+++ b/resources/lib/youtube_plugin/youtube/helper/yt_specials.py -@@ -15,7 +15,7 @@ from . import utils - - - def _process_related_videos(provider, context): -- provider.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ provider.set_content_type(context, kodion.constants.content_type.EPISODES) - result = [] - - page_token = context.get_param('page_token', '') -@@ -60,7 +60,7 @@ def _process_child_comments(provider, context): - - - def _process_recommendations(provider, context): -- provider.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ provider.set_content_type(context, kodion.constants.content_type.EPISODES) - result = [] - - page_token = context.get_param('page_token', '') -@@ -72,7 +72,7 @@ def _process_recommendations(provider, context): - - - def _process_popular_right_now(provider, context): -- provider.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ provider.set_content_type(context, kodion.constants.content_type.EPISODES) - result = [] - - page_token = context.get_param('page_token', '') -@@ -85,7 +85,7 @@ def _process_popular_right_now(provider, context): - - - def _process_browse_channels(provider, context): -- provider.set_content_type(context, kodion.constants.content_type.FILES) -+ provider.set_content_type(context, kodion.constants.content_type.VIDEOS) - result = [] - - # page_token = context.get_param('page_token', '') -@@ -107,7 +107,7 @@ def _process_browse_channels(provider, context): - - - def _process_disliked_videos(provider, context): -- provider.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ provider.set_content_type(context, kodion.constants.content_type.EPISODES) - result = [] - - page_token = context.get_param('page_token', '') -@@ -122,7 +122,7 @@ def _process_live_events(provider, context, event_type='live'): - def _sort(x): - return x.get_aired() - -- provider.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ provider.set_content_type(context, kodion.constants.content_type.EPISODES) - result = [] - - # TODO: cache result -@@ -142,7 +142,7 @@ def _process_description_links(provider, context): - addon_id = context.get_param('addon_id', '') - - def _extract_urls(_video_id): -- provider.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ provider.set_content_type(context, kodion.constants.content_type.EPISODES) - url_resolver = UrlResolver(context) - - result = [] -@@ -304,7 +304,7 @@ def _process_purchases_tv(provider, context): - - - def _process_new_uploaded_videos_tv(provider, context): -- provider.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ provider.set_content_type(context, kodion.constants.content_type.EPISODES) - - result = [] - next_page_token = context.get_param('next_page_token', '') -@@ -316,7 +316,7 @@ def _process_new_uploaded_videos_tv(provider, context): - - - def _process_new_uploaded_videos_tv_filtered(provider, context): -- provider.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ provider.set_content_type(context, kodion.constants.content_type.EPISODES) - - result = [] - next_page_token = context.get_param('next_page_token', '') -diff --git a/resources/lib/youtube_plugin/youtube/provider.py b/resources/lib/youtube_plugin/youtube/provider.py -index bdab6658..2503e380 100644 ---- a/resources/lib/youtube_plugin/youtube/provider.py -+++ b/resources/lib/youtube_plugin/youtube/provider.py -@@ -437,7 +437,7 @@ class Provider(kodion.AbstractProvider): - - @kodion.RegisterProviderPath('^/playlist/(?P[^/]+)/$') - def _on_playlist(self, context, re_match): -- self.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ self.set_content_type(context, kodion.constants.content_type.EPISODES) - - result = [] - -@@ -461,7 +461,7 @@ class Provider(kodion.AbstractProvider): - - @kodion.RegisterProviderPath('^/channel/(?P[^/]+)/playlist/(?P[^/]+)/$') - def _on_channel_playlist(self, context, re_match): -- self.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ self.set_content_type(context, kodion.constants.content_type.EPISODES) - client = self.get_client(context) - result = [] - -@@ -484,7 +484,7 @@ class Provider(kodion.AbstractProvider): - - @kodion.RegisterProviderPath('^/channel/(?P[^/]+)/playlists/$') - def _on_channel_playlists(self, context, re_match): -- self.set_content_type(context, kodion.constants.content_type.FILES) -+ self.set_content_type(context, kodion.constants.content_type.VIDEOS) - result = [] - - channel_id = re_match.group('channel_id') -@@ -525,7 +525,7 @@ class Provider(kodion.AbstractProvider): - - @kodion.RegisterProviderPath('^/channel/(?P[^/]+)/live/$') - def _on_channel_live(self, context, re_match): -- self.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ self.set_content_type(context, kodion.constants.content_type.EPISODES) - result = [] - - channel_id = re_match.group('channel_id') -@@ -560,7 +560,7 @@ class Provider(kodion.AbstractProvider): - if method == 'channel' and not channel_id: - return False - -- self.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ self.set_content_type(context, kodion.constants.content_type.EPISODES) - - resource_manager = self.get_resource_manager(context) - -@@ -648,7 +648,7 @@ class Provider(kodion.AbstractProvider): - # noinspection PyUnusedLocal - @kodion.RegisterProviderPath('^/location/mine/$') - def _on_my_location(self, context, re_match): -- self.set_content_type(context, kodion.constants.content_type.FILES) -+ self.set_content_type(context, kodion.constants.content_type.VIDEOS) - - settings = context.get_settings() - result = list() -@@ -793,7 +793,7 @@ class Provider(kodion.AbstractProvider): - subscriptions = yt_subscriptions.process(method, self, context) - - if method == 'list': -- self.set_content_type(context, kodion.constants.content_type.FILES) -+ self.set_content_type(context, kodion.constants.content_type.VIDEOS) - channel_ids = [] - for subscription in subscriptions: - channel_ids.append(subscription.get_channel_id()) -@@ -1025,9 +1025,9 @@ class Provider(kodion.AbstractProvider): - context.set_param('q', search_text) - - if search_type == 'video': -- self.set_content_type(context, kodion.constants.content_type.VIDEOS) -+ self.set_content_type(context, kodion.constants.content_type.EPISODES) - else: -- self.set_content_type(context, kodion.constants.content_type.FILES) -+ self.set_content_type(context, kodion.constants.content_type.VIDEOS) - - if page == 1 and search_type == 'video' and not event_type and not hide_folders: - if not channel_id and not location: -@@ -1360,7 +1360,7 @@ class Provider(kodion.AbstractProvider): - settings = context.get_settings() - _ = self.get_client(context) # required for self.is_logged_in() - -- self.set_content_type(context, kodion.constants.content_type.FILES) -+ self.set_content_type(context, kodion.constants.content_type.VIDEOS) - - result = [] - -@@ -1595,7 +1595,7 @@ class Provider(kodion.AbstractProvider): - @staticmethod - def set_content_type(context, content_type): - context.set_content_type(content_type) -- if content_type == kodion.constants.content_type.VIDEOS: -+ if content_type == kodion.constants.content_type.EPISODES: - context.add_sort_method(kodion.constants.sort_method.UNSORTED, - kodion.constants.sort_method.VIDEO_RUNTIME, - kodion.constants.sort_method.DATE_ADDED, -diff --git a/resources/settings.xml b/resources/settings.xml -index 70429df9..65206514 100644 ---- a/resources/settings.xml -+++ b/resources/settings.xml -@@ -663,6 +663,37 @@ - - - -+ -+ 0 -+ false -+ -+ -+ -+ 0 -+ 50 -+ -+ -+ true -+ -+ -+ -+ 30027 -+ -+ -+ -+ 0 -+ 50 -+ -+ -+ true -+ -+ -+ -+ 30028 -+ -+ -+ -+ - - 0 - 10 -@@ -681,7 +712,7 @@ - - - -- -+ - - 0 - en-US