adding shazam, and LRClib support
This commit is contained in:
52
core/recognize.py
Normal file
52
core/recognize.py
Normal file
@@ -0,0 +1,52 @@
|
||||
"""Audio fingerprinting via Shazam (unofficial, no API key needed).
|
||||
|
||||
Wraps shazamlite. If Shazam can't identify the track — return None.
|
||||
Never raises on 'not found', only on missing dependency.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
|
||||
@dataclass
|
||||
class ShazamResult:
|
||||
title: str
|
||||
artist: str
|
||||
album: Optional[str] = None
|
||||
year: Optional[str] = None
|
||||
|
||||
|
||||
def recognize(audio_wav: Path) -> Optional[ShazamResult]:
|
||||
"""Run Shazam fingerprinting on a WAV file. Returns None if not found."""
|
||||
try:
|
||||
from shazamlite import Shazam
|
||||
except ImportError as e:
|
||||
raise RuntimeError(
|
||||
"shazamlite не установлен. Установите: pip install shazamlite numpy soundfile"
|
||||
) from e
|
||||
|
||||
shazam = Shazam()
|
||||
try:
|
||||
track = shazam.recognize(str(audio_wav))
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
if track is None:
|
||||
return None
|
||||
|
||||
title = getattr(track, "title", None) or getattr(track, "track", None)
|
||||
artist = getattr(track, "artist", None) or getattr(track, "subtitle", None)
|
||||
album = getattr(track, "album", None)
|
||||
year = getattr(track, "year", None) or getattr(track, "released", None)
|
||||
|
||||
if not title or not artist:
|
||||
return None
|
||||
|
||||
return ShazamResult(
|
||||
title=str(title),
|
||||
artist=str(artist),
|
||||
album=str(album) if album else None,
|
||||
year=str(year) if year else None,
|
||||
)
|
||||
Reference in New Issue
Block a user