from urllib.parse import ParseResult, urlunparse, urlparse import logging from microkodi.repository import I from microkodi.config import Config from microkodi.helpers import recursive_dict_merge import yt_dlp DEFAULT_CONFIG = { "format": "bestvideo[width<=1920]+bestaudio", "ytdlp_options": {} } def youtube_url_transformer(url: ParseResult) -> tuple[list[str], str]: logger = logging.getLogger("Youtube") youtube_config = I.get("YoutubeConfig") opts = { "format": youtube_config["format"], **youtube_config["ytdlp_options"], } logger.debug("Using config for yt-dlp: %s", opts) with yt_dlp.YoutubeDL(opts) as ytdl: info = ytdl.extract_info(urlunparse(url), download=False) user_agent = None audio_url = None video_url = None for format in info["requested_formats"]: if format["width"] is None: audio_url = format["url"] else: user_agent = format["http_headers"]["User-Agent"] video_url = format["url"] args = [ f'--input-slave={audio_url}', ] if audio_url else None return args, urlparse(video_url) def init(): # Create the config config: Config = I.get("Config") youtube_config = recursive_dict_merge( DEFAULT_CONFIG, config.options.get( "me.polynom.microkodi.youtube", {}, ), ) I.register("YoutubeConfig", youtube_config) # Register the transformers I.get("VlcConfig").register_domain_transformer("youtu.be", youtube_url_transformer) I.get("VlcConfig").register_domain_transformer("www.youtube.com", youtube_url_transformer)