Generalize URL handling beyond YouTube to any yt-dlp-supported site (SoundCloud, Bandcamp, etc), single tracks and playlists/sets/albums. - probe_url(): one yt-dlp --flat-playlist probe classifies playlist vs track and returns per-entry Hits; YouTube playlists still use ytmusicapi. - _track_url(): YouTube tracks keep the music.youtube album-art URL; other platforms download via their native entry URL (no more videoId reconstruction). - Per-source folders: <root>/<artist>/<extractor>/ (soundcloud/bandcamp/youtube) instead of hardcoded youtube; download_single derives source from metadata. - download_hits() downloads pre-probed Hits; API probes once and passes hits into the job closure. Replaces YouTube-only is_playlist_url/expand_playlist. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
35 lines
1.4 KiB
Python
35 lines
1.4 KiB
Python
"""Loads the sibling standalone `musicfetch` script (no .py extension) as a
|
|
module and re-exports the symbols the API reuses. This is the single seam
|
|
between the REST API and the CLI; musicfetch itself is unchanged."""
|
|
import importlib.machinery
|
|
import importlib.util
|
|
import os
|
|
import sys
|
|
|
|
_HERE = os.path.dirname(os.path.abspath(__file__))
|
|
_MF_PATH = os.environ.get("MUSICFETCH_BIN", os.path.join(_HERE, "..", "musicfetch"))
|
|
|
|
# spec_from_file_location returns None for extension-less files, so use
|
|
# SourceFileLoader directly to handle the bare `musicfetch` binary.
|
|
_loader = importlib.machinery.SourceFileLoader("musicfetch_core", _MF_PATH)
|
|
_spec = importlib.util.spec_from_loader("musicfetch_core", _loader)
|
|
_mod = importlib.util.module_from_spec(_spec)
|
|
_spec.loader.exec_module(_mod) # safe: musicfetch guards main() behind __main__
|
|
sys.modules["musicfetch_core"] = _mod
|
|
|
|
Hit = _mod.Hit
|
|
build_combined_hits = _mod.build_combined_hits
|
|
pick = _mod.pick
|
|
act_youtube = _mod.act_youtube
|
|
act_lidarr_album = _mod.act_lidarr_album
|
|
act_lidarr_artist = _mod.act_lidarr_artist
|
|
QUALITY_CHOICES = _mod.QUALITY_CHOICES
|
|
is_url = _mod.is_url
|
|
probe_url = _mod.probe_url
|
|
download_hits = _mod.download_hits
|
|
download_single = _mod.download_single
|
|
|
|
__all__ = ["Hit", "build_combined_hits", "pick", "act_youtube",
|
|
"act_lidarr_album", "act_lidarr_artist", "QUALITY_CHOICES",
|
|
"is_url", "probe_url", "download_hits", "download_single"]
|