diff --git a/backend/config.py b/backend/config.py index cfbe4a1..35dfbb3 100644 --- a/backend/config.py +++ b/backend/config.py @@ -23,6 +23,9 @@ class Config: # Proxy URL for yt_proxied downloader (can be used for geo-restricted content) self.yt_proxy = os.getenv('YT_PROXY') or None + # Proxy for soundcloud + self.sc_proxy = os.getenv('SC_PROXY') or None + self.save_lyrics = _parse_bool(os.getenv('SAVE_LYRICS'), True) self.save_cover = _parse_bool(os.getenv('SAVE_COVER'), True) diff --git a/backend/id3pp.py b/backend/id3pp.py index 7f2fd77..4348568 100644 --- a/backend/id3pp.py +++ b/backend/id3pp.py @@ -22,7 +22,7 @@ class InfoYouTubePP(PostProcessor): if not 'track' in information: information['track'] = information['title'] if not 'artist' in information: - information['artist'] = information['channel'].removesuffix(' - Topic') + information['artist'] = information['uploader'].removesuffix(' - Topic') if not 'artists' in information: information['artists'] = [information['artist']] diff --git a/backend/ydl_pool.py b/backend/ydl_pool.py index 309a065..825e532 100644 --- a/backend/ydl_pool.py +++ b/backend/ydl_pool.py @@ -27,6 +27,16 @@ class _CreateYDL: ydl.params['proxy'] = proxy return ydl + @staticmethod + def soundcloud() -> YoutubeDL: + ydl = YoutubeDL({'format': 'ba[ext=mp3]/ba'}) + ydl.add_post_processor(id3pp.InfoYouTubePP(), when='pre_process') + proxy = config.get().sc_proxy + if proxy is not None: + ydl.params['proxy'] = proxy + ydl.add_post_processor(FFmpegExtractAudioPP(preferredcodec='mp3'), when='post_process') + return ydl + @staticmethod def yandex() -> YoutubeDL: return YoutubeDL() @@ -35,13 +45,14 @@ class _CreateYDL: create_ydl_fn = { 'youtube': _CreateYDL.youtube, 'yt_proxied': _CreateYDL.yt_proxied, + 'soundcloud': _CreateYDL.soundcloud, 'yandex': _CreateYDL.yandex, } ydl_fn_keys = create_ydl_fn.keys() # need process=True for track title in extract_info output -NP_YDLS = {'yandex'} +NP_YDLS = {'yandex', 'soundcloud'} class YdlLogger: @@ -73,9 +84,8 @@ class Downloader: def __init__(self, logger: YdlLogger | None = None) -> None: self.ydls: dict[str, YoutubeDL | None] = { - 'youtube': None, - 'yt_proxied': None, - 'yandex': None, + key: None + for key in ydl_fn_keys } self.cur_ydl: YoutubeDL | None = None diff --git a/frontend/index.html b/frontend/index.html index 521c10b..5b72722 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -16,6 +16,7 @@