From 9fccf9015ac024ea9350ff1dfee7d60f32f87946 Mon Sep 17 00:00:00 2001 From: zebra Date: Sat, 13 Jun 2026 21:52:14 -0700 Subject: [PATCH] =?UTF-8?q?feat:=20=5Fis=5Fdirect=5Furl=20=E2=80=94=20rout?= =?UTF-8?q?e=20YouTube/SoundCloud=20links=20to=20direct=20download?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- musicfetch | 17 +++++++++++++++++ tests/test_odesli.py | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/musicfetch b/musicfetch index 70098fe..47ead33 100755 --- a/musicfetch +++ b/musicfetch @@ -746,6 +746,23 @@ def _is_youtube_playlist_url(url: str) -> bool: return "list" in qs and "v" not in qs +_DIRECT_HOSTS = ("youtube.com", "youtu.be", "music.youtube.com", + "soundcloud.com", "api.soundcloud.com") + + +def _is_direct_url(url: str) -> bool: + """True for links yt-dlp downloads well directly (YouTube, SoundCloud). + These skip Odesli resolution and use the existing handle_url path.""" + if not is_url(url): + return False + host = (urlparse(url).hostname or "").lower() + if host.startswith("www."): + host = host[4:] + if host.endswith(("youtube.com", "youtu.be", "soundcloud.com")): + return True + return host in _DIRECT_HOSTS + + def _ytmusic_playlist(pid: str) -> tuple[str, list[Hit]]: """Expand a YouTube Music playlist via ytmusicapi. Returns ("", []) on failure.""" try: diff --git a/tests/test_odesli.py b/tests/test_odesli.py index bb5cd1d..62415a5 100644 --- a/tests/test_odesli.py +++ b/tests/test_odesli.py @@ -66,3 +66,23 @@ def test_odesli_resolve_network_error_returns_none(monkeypatch): raise mf.RequestException("down") monkeypatch.setattr(mf.requests, "get", boom) assert mf.odesli_resolve("https://open.spotify.com/track/abc") is None + + +def test_is_direct_url_youtube(): + assert mf._is_direct_url("https://music.youtube.com/watch?v=abc") + assert mf._is_direct_url("https://www.youtube.com/watch?v=abc") + assert mf._is_direct_url("https://youtu.be/abc") + + +def test_is_direct_url_soundcloud(): + assert mf._is_direct_url("https://soundcloud.com/dj/track") + + +def test_is_direct_url_other_platforms_false(): + assert not mf._is_direct_url("https://open.spotify.com/track/abc") + assert not mf._is_direct_url("https://music.apple.com/us/album/x/1?i=2") + assert not mf._is_direct_url("https://tidal.com/browse/track/123") + + +def test_is_direct_url_youtube_playlist_true(): + assert mf._is_direct_url("https://www.youtube.com/playlist?list=PLabc")