def handle_unresolved_url(data, action): url = unquote(data) logger.info(u'Trying to resolve URL (%s): %s' % (action, url)) if xbmc.Player().isPlaying(): utils.show_info_notification(utils.translation(32007), 1000) else: utils.show_info_notification(utils.translation(32007)) if 'youtube.com' in url or 'youtu.be' in url: youtube_addon = xbmcaddon.Addon(id="plugin.video.youtube") if youtube_addon: if utils.get_setting('preferYoutubeAddon') == 'true' or youtube_addon.getSetting("kodion.video.quality.mpd") == "true": logger.info(u'Youtube addon have DASH enabled or is configured as preferred use it') clean_url = list(urlparse(url)) clean_url[4] = '&'.join( [x for x in clean_url[4].split('&') if not re.match(r'app=', x)]) url = urlunparse(clean_url) utils.play_url('plugin://plugin.video.youtube/uri2addon/?uri=%s' % url, action) return logger.info(u'Trying to resolve with YoutubeDL') result = resolve_with_youtube_dl(url, {'format': 'best', 'no_color': 'true', 'ignoreerrors': 'true'}, action) if result: return # Second pass with new params to fix site like reddit dash streams logger.info(u'Trying to resolve with YoutubeDL other options') result = resolve_with_youtube_dl(url, {'format': 'bestvideo+bestaudio/best', 'no_color': 'true', 'ignoreerrors': 'true'}, action) if result: return logger.error(u'Url not resolved by YoutubeDL') logger.info(u'Trying to play as basic url') utils.play_url(url, action) if url: utils.show_error_notification(utils.translation(32006))
def resolve_with_youtube_dl(url, parameters, action): youtube_dl_resolver = YoutubeDL(parameters) youtube_dl_resolver.add_default_info_extractors() try: result = youtube_dl_resolver.extract_info(url, download=False) if result is None: result = {} except Exception as e: logger.error(u'Error with YoutubeDL: %s' % e) result = {} logger.info(u'YoutubeDL full result: %s' % result) if 'entries' in result: logger.info(u'Playlist resolved by YoutubeDL: %s items' % len(result['entries'])) item_list = [] for entry in result['entries']: if entry is not None and 'url' in entry: item_list.append(entry) logger.info(u'Media found: %s' % entry['url']) if len(item_list) > 0: utils.play_items(item_list, action) return True else: logger.info(u'No playable urls in the playlist') if 'url' in result: logger.info(u'Url resolved by YoutubeDL: %s' % result['url']) utils.play_url(result['url'], action, result) return True if 'requested_formats' in result: if have_adaptive_plugin: logger.info(u'Adaptive plugin enabled looking for dash content') for entry in result['requested_formats']: if 'container' in entry and 'manifest_url' in entry: if 'dash' in entry['container']: logger.info(u'Url resolved by YoutubeDL: %s' % entry['manifest_url']) utils.play_url(entry['manifest_url'], action, result, True) return True for entry in result['requested_formats']: if 'protocol' in entry and 'manifest_url' in entry: if 'm3u8' in entry['protocol']: logger.info(u'Url resolved by YoutubeDL: %s' % entry['manifest_url']) utils.play_url(entry['manifest_url'], action, result) return True return False
def handle_unresolved_url(data, action): url = unquote(data) logger.info(u'Trying to resolve URL (%s): %s' % (action, url)) if xbmc.Player().isPlaying(): utils.show_info_notification(utils.translation(32007), 1000) else: utils.show_info_notification(utils.translation(32007)) if 'youtube.com' in url or 'youtu.be' in url: youtube_addon = xbmcaddon.Addon(id="plugin.video.youtube") if youtube_addon: if youtube_addon.getSetting("kodion.video.quality.mpd") == "true": logger.info(u'Youtube addon have DASH enabled use it') utils.play_url('plugin://plugin.video.youtube/uri2addon/?uri=%s' % url, action) return logger.info(u'Trying to resolve with YoutubeDL') result = resolve_with_youtube_dl(url, {'format': 'best', 'no_color': 'true', 'ignoreerrors': 'true'}, action) if result: return # Second pass with new params to fix site like reddit dash streams logger.info(u'Trying to resolve with YoutubeDL other options') result = resolve_with_youtube_dl(url, {'format': 'bestvideo+bestaudio/best', 'no_color': 'true', 'ignoreerrors': 'true'}, action) if result: return logger.error(u'Url not resolved by YoutubeDL') if utils.is_python_3(): logger.info(u'Skipping urlResolver as running on Python 3') else: logger.info(u'Trying to resolve with urlResolver') stream_url = urlresolver.HostedMediaFile(url=url).resolve() if stream_url: logger.info(u'Url resolved by urlResolver: %s' % stream_url) utils.play_url(stream_url, action) return logger.info(u'Trying to play as basic url') utils.play_url(url, action) if url: utils.show_error_notification(utils.translation(32006))