diff --git a/scripts/youtube.py b/scripts/youtube.py new file mode 100644 index 0000000..f1ab112 --- /dev/null +++ b/scripts/youtube.py @@ -0,0 +1,56 @@ +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) \ No newline at end of file