kodi.plugin.video.youtube/resources/lib/youtube_resolver.py
MoojMidge 8a2f9559b2 Rename youtube.client.PlayerClient to youtube.client.YouTubePlayerClient
- Inherits from youtube.client.YouTube rather than youtube.client.LoginClient
- Avoids creating new player client instance for every playback event
2025-10-06 11:35:31 +11:00

61 lines
1.7 KiB
Python

# -*- coding: utf-8 -*-
"""
Copyright (C) 2017-2025 plugin.video.youtube
SPDX-License-Identifier: GPL-2.0-only
See LICENSES/GPL-2.0-only for more information.
"""
from __future__ import absolute_import, division, unicode_literals
import re
from youtube_plugin.youtube.provider import Provider
from youtube_plugin.kodion.context import XbmcContext
def _get_core_components(addon_id=None):
provider = Provider()
if addon_id is not None:
context = XbmcContext(params={'addon_id': addon_id})
else:
context = XbmcContext()
client = provider.get_client(context=context)
return provider, context, client
def resolve(video_id, sort=True, addon_id=None):
"""
:param video_id: video id / video url
:param sort: sort results by quality highest->lowest
:param addon_id: addon id associated with developer keys to use for requests
:type video_id: str
:type sort: bool
:type addon_id: str
:return: all video items (resolved urls and metadata) for the given video id
:rtype: list of dict
"""
provider, context, client = _get_core_components(addon_id)
matched_id = None
streams = None
patterns = [r'(?P<video_id>[\w-]{11})',
r'(?:http)*s*:*[/]{0,2}(?:w{3}\.|m\.)*youtu(?:\.be/|be\.com/'
r'(?:embed/|watch/|v/|.*?[?&/]v=))(?P<video_id>[\w-]{11}).*']
for pattern in patterns:
v_id = re.search(pattern, video_id)
if v_id:
matched_id = v_id.group('video_id')
break
if matched_id:
streams, _ = client.load_stream_info(video_id=matched_id)
if sort and streams:
streams = sorted(streams, key=lambda x: x.get('sort', (0, 0)))
return streams