update
This commit is contained in:
@@ -25,6 +25,18 @@ from API.httpx_shared import get_shared_httpx_client
|
||||
from SYS.logger import log
|
||||
|
||||
|
||||
_DEFAULT_TIDAL_TRACK_API_BASES = (
|
||||
"https://triton.squid.wtf",
|
||||
"https://wolf.qqdl.site",
|
||||
"https://maus.qqdl.site",
|
||||
"https://vogel.qqdl.site",
|
||||
"https://katze.qqdl.site",
|
||||
"https://hund.qqdl.site",
|
||||
"https://tidal.kinoplus.online",
|
||||
"https://tidal-api.binimum.org",
|
||||
)
|
||||
|
||||
|
||||
def resolve_tidal_manifest_path(item: Any) -> Optional[str]:
|
||||
"""Persist the Tidal manifest (MPD) and return a local path or URL.
|
||||
|
||||
@@ -114,6 +126,41 @@ def resolve_tidal_manifest_path(item: Any) -> Optional[str]:
|
||||
return _persist_mpd_bytes(item, metadata, manifest_bytes)
|
||||
|
||||
|
||||
def _normalize_api_base(candidate: Any) -> Optional[str]:
|
||||
text = str(candidate or "").strip()
|
||||
if not text:
|
||||
return None
|
||||
if not re.match(r"^https?://", text, flags=re.IGNORECASE):
|
||||
return None
|
||||
return text.rstrip("/")
|
||||
|
||||
|
||||
def _iter_track_api_bases(metadata: Dict[str, Any]) -> list[str]:
|
||||
bases: list[str] = []
|
||||
seen: set[str] = set()
|
||||
|
||||
dynamic_candidates = [
|
||||
metadata.get("_tidal_api_base"),
|
||||
metadata.get("_api_base"),
|
||||
metadata.get("api_base"),
|
||||
metadata.get("base_url"),
|
||||
]
|
||||
|
||||
for candidate in dynamic_candidates:
|
||||
normalized = _normalize_api_base(candidate)
|
||||
if normalized and normalized not in seen:
|
||||
seen.add(normalized)
|
||||
bases.append(normalized)
|
||||
|
||||
for candidate in _DEFAULT_TIDAL_TRACK_API_BASES:
|
||||
normalized = _normalize_api_base(candidate)
|
||||
if normalized and normalized not in seen:
|
||||
seen.add(normalized)
|
||||
bases.append(normalized)
|
||||
|
||||
return bases
|
||||
|
||||
|
||||
def _maybe_fetch_track_manifest(item: Any, metadata: Dict[str, Any]) -> None:
|
||||
"""If we only have a track id, fetch details from the proxy to populate `manifest`."""
|
||||
|
||||
@@ -155,29 +202,40 @@ def _maybe_fetch_track_manifest(item: Any, metadata: Dict[str, Any]) -> None:
|
||||
|
||||
try:
|
||||
client = get_shared_httpx_client()
|
||||
except Exception:
|
||||
return
|
||||
|
||||
resp = client.get(
|
||||
"https://tidal-api.binimum.org/track/",
|
||||
params={"id": str(track_int)},
|
||||
timeout=10.0,
|
||||
)
|
||||
resp.raise_for_status()
|
||||
payload = resp.json()
|
||||
data = payload.get("data") if isinstance(payload, dict) else None
|
||||
if isinstance(data, dict) and data:
|
||||
attempted = False
|
||||
for base in _iter_track_api_bases(metadata):
|
||||
attempted = True
|
||||
|
||||
track_data: Optional[Dict[str, Any]] = None
|
||||
for params in ({"id": str(track_int)}, {"id": str(track_int), "quality": "LOSSLESS"}):
|
||||
try:
|
||||
metadata.update(data)
|
||||
resp = client.get(
|
||||
f"{base}/track/",
|
||||
params=params,
|
||||
timeout=10.0,
|
||||
)
|
||||
resp.raise_for_status()
|
||||
payload = resp.json()
|
||||
data = payload.get("data") if isinstance(payload, dict) else None
|
||||
if isinstance(data, dict) and data:
|
||||
track_data = data
|
||||
break
|
||||
except Exception:
|
||||
pass
|
||||
continue
|
||||
|
||||
if isinstance(track_data, dict) and track_data:
|
||||
try:
|
||||
metadata["_tidal_track_details_fetched"] = True
|
||||
metadata.update(track_data)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if not metadata.get("url"):
|
||||
if not metadata.get("manifest") or not metadata.get("url"):
|
||||
try:
|
||||
resp_info = client.get(
|
||||
"https://tidal-api.binimum.org/info/",
|
||||
f"{base}/info/",
|
||||
params={"id": str(track_int)},
|
||||
timeout=10.0,
|
||||
)
|
||||
@@ -186,21 +244,22 @@ def _maybe_fetch_track_manifest(item: Any, metadata: Dict[str, Any]) -> None:
|
||||
info_data = info_payload.get("data") if isinstance(info_payload, dict) else None
|
||||
if isinstance(info_data, dict) and info_data:
|
||||
try:
|
||||
for k, v in info_data.items():
|
||||
if k not in metadata:
|
||||
metadata[k] = v
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
if info_data.get("url"):
|
||||
metadata["url"] = info_data.get("url")
|
||||
for key, value in info_data.items():
|
||||
if key not in metadata or not metadata.get(key):
|
||||
metadata[key] = value
|
||||
except Exception:
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
except Exception:
|
||||
return
|
||||
if metadata.get("manifest"):
|
||||
break
|
||||
|
||||
if attempted:
|
||||
try:
|
||||
metadata["_tidal_track_details_fetched"] = True
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def _resolve_json_manifest_urls(metadata: Dict[str, Any], manifest_bytes: bytes) -> Optional[str]:
|
||||
|
||||
Reference in New Issue
Block a user