feat: retry MusicBrainz barcode lookup with random delay on empty result
Up to 3 retries with 2–6 s random wait between attempts, as MusicBrainz occasionally returns no results on the first try. retries parameter is configurable (default: 3). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
468fac6d2b
commit
65164d428c
2 changed files with 58 additions and 10 deletions
|
|
@ -3,6 +3,7 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import random
|
||||
import time
|
||||
|
||||
import httpx
|
||||
|
|
@ -28,29 +29,43 @@ def _get(path: str, params: dict) -> dict:
|
|||
return response.json()
|
||||
|
||||
|
||||
def lookup_by_barcode(ean: str) -> Album:
|
||||
def lookup_by_barcode(ean: str, retries: int = 3) -> Album:
|
||||
"""Schlägt ein Album anhand des EAN-Barcodes in MusicBrainz nach.
|
||||
|
||||
Führt zwei API-Requests durch:
|
||||
1. Barcode-Suche → MBID des ersten Treffers
|
||||
2. Release-Details mit Recordings → Trackliste
|
||||
|
||||
Bei fehlendem Treffer wird die Suche bis zu `retries`-mal mit
|
||||
zufälligem Warteabstand (2–6 s) wiederholt, da MusicBrainz manchmal
|
||||
beim ersten Versuch keinen Treffer liefert.
|
||||
|
||||
Args:
|
||||
ean: EAN-13- oder UPC-12-Barcode
|
||||
ean: EAN-13- oder UPC-12-Barcode
|
||||
retries: Anzahl Wiederholungsversuche bei leerem Ergebnis (Standard: 3)
|
||||
|
||||
Returns:
|
||||
Album mit vollständiger Trackliste
|
||||
|
||||
Raises:
|
||||
ValueError: Kein Eintrag für diesen Barcode gefunden
|
||||
ValueError: Kein Eintrag für diesen Barcode gefunden (nach allen Versuchen)
|
||||
httpx.HTTPError: Netzwerk- oder API-Fehler
|
||||
"""
|
||||
# Schritt 1: Barcode-Suche
|
||||
logger.info("MusicBrainz: Suche nach Barcode %s", ean)
|
||||
data = _get("/release/", {"query": f"barcode:{ean}", "fmt": "json"})
|
||||
for attempt in range(retries + 1):
|
||||
# Schritt 1: Barcode-Suche
|
||||
logger.info("MusicBrainz: Suche nach Barcode %s (Versuch %d/%d)",
|
||||
ean, attempt + 1, retries + 1)
|
||||
data = _get("/release/", {"query": f"barcode:{ean}", "fmt": "json"})
|
||||
releases = data.get("releases", [])
|
||||
|
||||
releases = data.get("releases", [])
|
||||
if not releases:
|
||||
if releases:
|
||||
break
|
||||
|
||||
if attempt < retries:
|
||||
wait = random.uniform(2.0, 6.0)
|
||||
logger.info("Kein Treffer — warte %.1f s vor erneutem Versuch...", wait)
|
||||
time.sleep(wait)
|
||||
else:
|
||||
raise ValueError(f"Kein MusicBrainz-Eintrag für Barcode {ean!r} gefunden.")
|
||||
|
||||
mbid = releases[0]["id"]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue