From 527e3747a0d044ce628c3d22ffd95596a13c7e62 Mon Sep 17 00:00:00 2001 From: Marvin Schenkel Date: Sun, 10 Aug 2025 13:28:20 +0200 Subject: [PATCH] YTMusic: Auto update dependencies for frequently breaking packages (#2311) Chore(deps): Bump ruff from 0.12.5 to 0.12.7 (#2299) Bumps [ruff](https://github.com/astral-sh/ruff) from 0.12.5 to 0.12.7. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.12.5...0.12.7) --- updated-dependencies: - dependency-name: ruff dependency-version: 0.12.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- music_assistant/providers/ytmusic/__init__.py | 14 +++++++++++++- music_assistant/providers/ytmusic/manifest.json | 4 +--- requirements_all.txt | 2 -- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/music_assistant/providers/ytmusic/__init__.py b/music_assistant/providers/ytmusic/__init__.py index 05647335..0b021633 100644 --- a/music_assistant/providers/ytmusic/__init__.py +++ b/music_assistant/providers/ytmusic/__init__.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio +import importlib import logging from collections.abc import AsyncGenerator from contextlib import suppress @@ -11,7 +12,6 @@ from io import StringIO from typing import TYPE_CHECKING, Any from urllib.parse import unquote -import yt_dlp from aiohttp import ClientConnectorError from duration_parser import parse as parse_str_duration from music_assistant_models.config_entries import ConfigEntry, ConfigValueType @@ -52,6 +52,7 @@ from ytmusicapi.helpers import get_authorization, sapisid_from_cookie from music_assistant.constants import CONF_USERNAME, VERBOSE_LOG_LEVEL from music_assistant.controllers.cache import use_cache +from music_assistant.helpers.util import install_package from music_assistant.models.music_provider import MusicProvider from .helpers import ( @@ -115,6 +116,7 @@ YT_PERSONAL_PLAYLISTS = ( "RDTMAK5uy_mZtXeU08kxXJOUhL0ETdAuZTh1z7aAFAo", # Archive Mix ) YTM_PREMIUM_CHECK_TRACK_ID = "dQw4w9WgXcQ" +PACKAGES_TO_INSTALL = ("yt-dlp", "bgutil-ytdlp-pot-provider") SUPPORTED_FEATURES = { ProviderFeature.LIBRARY_ARTISTS, @@ -194,6 +196,7 @@ class YoutubeMusicProvider(MusicProvider): async def handle_async_init(self) -> None: """Set up the YTMusic provider.""" logging.getLogger("yt_dlp").setLevel(self.logger.level + 10) + await self._install_packages() self._cookie = self.config.get_value(CONF_COOKIE) self._po_token_server_url = ( self.config.get_value(CONF_PO_TOKEN_SERVER_URL) or DEFAULT_PO_TOKEN_SERVER_URL @@ -920,6 +923,7 @@ class YoutubeMusicProvider(MusicProvider): """Figure out the stream URL to use and return the highest quality.""" def _extract_best_stream_url_format() -> dict[str, Any]: + yt_dlp = importlib.import_module("yt_dlp") url = f"{YTM_DOMAIN}/watch?v={item_id}" ydl_opts = { "quiet": self.logger.level > logging.DEBUG, @@ -1013,3 +1017,11 @@ class YoutubeMusicProvider(MusicProvider): ) ) return result + + async def _install_packages(self) -> None: + """Install frequently changing packages dynamically.""" + # NOTE: Google breaks things quite often which requires us to update + # some packages very frequently. Installing them dynamically prevents + # us from having to update MA to ensure this provider works. + for package_name in PACKAGES_TO_INSTALL: + await install_package(package_name) diff --git a/music_assistant/providers/ytmusic/manifest.json b/music_assistant/providers/ytmusic/manifest.json index 1b04803d..7f2df11e 100644 --- a/music_assistant/providers/ytmusic/manifest.json +++ b/music_assistant/providers/ytmusic/manifest.json @@ -7,9 +7,7 @@ "codeowners": ["@MarvinSchenkel"], "requirements": [ "ytmusicapi==1.10.3", - "yt-dlp==2025.6.30", - "duration-parser==1.0.1", - "bgutil-ytdlp-pot-provider==1.1.0" + "duration-parser==1.0.1" ], "documentation": "https://music-assistant.io/music-providers/youtube-music/", "multi_instance": true diff --git a/requirements_all.txt b/requirements_all.txt index 79cdaa0c..aad444da 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -16,7 +16,6 @@ aiosqlite==0.21.0 alexapy==1.29.5 async-upnp-client==0.45.0 audible==0.10.0 -bgutil-ytdlp-pot-provider==1.1.0 bidict==0.23.1 certifi==2025.7.14 chardet>=5.2.0 @@ -57,6 +56,5 @@ sxm==0.2.8 unidecode==1.4.0 websocket-client==1.8.0 xmltodict==0.14.2 -yt-dlp==2025.6.30 ytmusicapi==1.10.3 zeroconf==0.147.0 -- 2.34.1