55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
from typing import Optional
|
|
import traceback
|
|
|
|
# Initialize classes from lyrics_dl/providers
|
|
import lyrics_dl.providers
|
|
from lyrics_dl.core import Song
|
|
from lyrics_dl.registry import Registry
|
|
from lyrics_dl.config import LyricsDlConfig
|
|
from lyrics_dl.logger import DefaultLogger, AbstractLogger
|
|
|
|
|
|
class LyricsDl:
|
|
logger: AbstractLogger
|
|
|
|
def __init__(self, config: LyricsDlConfig = LyricsDlConfig(), logger: AbstractLogger = DefaultLogger()):
|
|
self.logger = logger
|
|
|
|
providers_classes = Registry.get_synced_providers()
|
|
|
|
self.providers = []
|
|
|
|
for name in config.order:
|
|
Provider = providers_classes[name]
|
|
provider_config = config.providers_configs.get(name)
|
|
|
|
if not provider_config:
|
|
provider_config = {}
|
|
|
|
try:
|
|
provider = Provider(**provider_config)
|
|
except TypeError as e:
|
|
self.logger.error(f"[lyrics-dl] {e}")
|
|
continue
|
|
|
|
self.providers.append(provider)
|
|
|
|
def fetch_lyrics(self, song: Song) -> Optional[str]:
|
|
self.logger.info(f"[lyrics-dl] Fetching lyrics for \"{song.artist} - {song.title}\"")
|
|
for provider in self.providers:
|
|
self.logger.info(f"[{provider.name}] Fetching lyrics...")
|
|
|
|
try:
|
|
lyrics = provider.fetch_lyrics(song)
|
|
except Exception as e:
|
|
lyrics = None
|
|
self.logger.error(f"[{provider.name}] Got exception while fetching lyrics! ({type(e).__name__}: {e})")
|
|
self.logger.debug(f"[{provider.name}] {traceback.format_exc()}")
|
|
|
|
if lyrics:
|
|
self.logger.info(f"[{provider.name}] Found lyrics!")
|
|
return lyrics
|
|
|
|
self.logger.info(f"[{provider.name}] No lyrics was found!")
|
|
|
|
return None
|