Initial import: Music_Server, MusicFree, catalog-sync

This commit is contained in:
2026-05-23 16:51:14 +08:00
commit 069af30dba
847 changed files with 179878 additions and 0 deletions
@@ -0,0 +1,91 @@
"""Lazy source registry to avoid importing every source at module import time."""
from __future__ import annotations
import importlib
from ..utils import BaseModuleBuilder
from .base import BaseMusicClient
CLIENT_IMPORT_PATHS = {
# Platforms in Greater China
"QQMusicClient": ("musicdl.modules.sources.qq", "QQMusicClient"),
"KugouMusicClient": ("musicdl.modules.sources.kugou", "KugouMusicClient"),
"StreetVoiceMusicClient": ("musicdl.modules.sources.streetvoice", "StreetVoiceMusicClient"),
"SodaMusicClient": ("musicdl.modules.sources.soda", "SodaMusicClient"),
"FiveSingMusicClient": ("musicdl.modules.sources.fivesing", "FiveSingMusicClient"),
"NeteaseMusicClient": ("musicdl.modules.sources.netease", "NeteaseMusicClient"),
"QianqianMusicClient": ("musicdl.modules.sources.qianqian", "QianqianMusicClient"),
"MiguMusicClient": ("musicdl.modules.sources.migu", "MiguMusicClient"),
"KuwoMusicClient": ("musicdl.modules.sources.kuwo", "KuwoMusicClient"),
"BilibiliMusicClient": ("musicdl.modules.sources.bilibili", "BilibiliMusicClient"),
# Global Streaming / Indie
"YouTubeMusicClient": ("musicdl.modules.sources.youtube", "YouTubeMusicClient"),
"JooxMusicClient": ("musicdl.modules.sources.joox", "JooxMusicClient"),
"AppleMusicClient": ("musicdl.modules.sources.apple", "AppleMusicClient"),
"JamendoMusicClient": ("musicdl.modules.sources.jamendo", "JamendoMusicClient"),
"SoundCloudMusicClient": ("musicdl.modules.sources.soundcloud", "SoundCloudMusicClient"),
"DeezerMusicClient": ("musicdl.modules.sources.deezer", "DeezerMusicClient"),
"QobuzMusicClient": ("musicdl.modules.sources.qobuz", "QobuzMusicClient"),
"SpotifyMusicClient": ("musicdl.modules.sources.spotify", "SpotifyMusicClient"),
"TIDALMusicClient": ("musicdl.modules.sources.tidal", "TIDALMusicClient"),
# Audio / Radio
"XimalayaMusicClient": ("musicdl.modules.audiobooks.ximalaya", "XimalayaMusicClient"),
"LizhiMusicClient": ("musicdl.modules.audiobooks.lizhi", "LizhiMusicClient"),
"QingtingMusicClient": ("musicdl.modules.audiobooks.qingting", "QingtingMusicClient"),
"LRTSMusicClient": ("musicdl.modules.audiobooks.lrts", "LRTSMusicClient"),
# Aggregators / Multi-Source Gateways
"MP3JuiceMusicClient": ("musicdl.modules.common.mp3juice", "MP3JuiceMusicClient"),
"TuneHubMusicClient": ("musicdl.modules.common.tunehub", "TuneHubMusicClient"),
"GDStudioMusicClient": ("musicdl.modules.common.gdstudio", "GDStudioMusicClient"),
"MyFreeMP3MusicClient": ("musicdl.modules.common.myfreemp3", "MyFreeMP3MusicClient"),
"JBSouMusicClient": ("musicdl.modules.common.jbsou", "JBSouMusicClient"),
# Unofficial Download Sites / Scrapers
"MituMusicClient": ("musicdl.modules.thirdpartysites.mitu", "MituMusicClient"),
"BuguyyMusicClient": ("musicdl.modules.thirdpartysites.buguyy", "BuguyyMusicClient"),
"GequbaoMusicClient": ("musicdl.modules.thirdpartysites.gequbao", "GequbaoMusicClient"),
"YinyuedaoMusicClient": ("musicdl.modules.thirdpartysites.yinyuedao", "YinyuedaoMusicClient"),
"FLMP3MusicClient": ("musicdl.modules.thirdpartysites.flmp3", "FLMP3MusicClient"),
"FangpiMusicClient": ("musicdl.modules.thirdpartysites.fangpi", "FangpiMusicClient"),
"FiveSongMusicClient": ("musicdl.modules.thirdpartysites.fivesong", "FiveSongMusicClient"),
"KKWSMusicClient": ("musicdl.modules.thirdpartysites.kkws", "KKWSMusicClient"),
"GequhaiMusicClient": ("musicdl.modules.thirdpartysites.gequhai", "GequhaiMusicClient"),
"LivePOOMusicClient": ("musicdl.modules.thirdpartysites.livepoo", "LivePOOMusicClient"),
"HTQYYMusicClient": ("musicdl.modules.thirdpartysites.htqyy", "HTQYYMusicClient"),
"JCPOOMusicClient": ("musicdl.modules.thirdpartysites.jcpoo", "JCPOOMusicClient"),
"TwoT58MusicClient": ("musicdl.modules.thirdpartysites.twot58", "TwoT58MusicClient"),
"ZhuolinMusicClient": ("musicdl.modules.thirdpartysites.zhuolin", "ZhuolinMusicClient"),
}
def _load_client_class(client_name: str):
module_path, attr_name = CLIENT_IMPORT_PATHS[client_name]
module = importlib.import_module(module_path)
return getattr(module, attr_name)
def _build_client_factory(client_name: str):
def factory(**kwargs):
return _load_client_class(client_name)(**kwargs)
factory.__name__ = client_name
return factory
class MusicClientBuilder(BaseModuleBuilder):
REGISTERED_MODULES = {
client_name: _build_client_factory(client_name)
for client_name in CLIENT_IMPORT_PATHS
}
def __getattr__(name: str):
if name in CLIENT_IMPORT_PATHS:
return _load_client_class(name)
raise AttributeError(name)
BuildMusicClient = MusicClientBuilder().build
__all__ = ["BaseMusicClient", "BuildMusicClient", "MusicClientBuilder", *CLIENT_IMPORT_PATHS.keys()]