Release v1.0.4: fix TheTVDB search ID parsing.

Parse series-76320 style search hits from TheTVDB v4, document Gear Lever Forgejo setup, and adjust AppImage build metadata for update detection.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Bulk Renamer
2026-07-03 17:17:49 -05:00
co-authored by Cursor
parent b3ce276d1b
commit db460fb9b3
6 changed files with 96 additions and 47 deletions
+28 -4
View File
@@ -4,6 +4,7 @@ TheTVDB API v4 client (read-only). Uses stdlib urllib — no extra dependencies.
from __future__ import annotations
import json
import re
import urllib.error
import urllib.parse
import urllib.request
@@ -42,6 +43,29 @@ class TvdbError(Exception):
pass
def _parse_series_id(item: dict[str, Any]) -> Optional[int]:
"""Extract numeric series id from a TheTVDB v4 search hit."""
tvdb_id = item.get("tvdb_id")
if tvdb_id is not None:
try:
return int(tvdb_id)
except (TypeError, ValueError):
pass
raw_id = item.get("id")
if raw_id is None:
return None
if isinstance(raw_id, int):
return raw_id
if isinstance(raw_id, str):
if raw_id.isdigit():
return int(raw_id)
m = re.match(r"^series-(\d+)$", raw_id, re.IGNORECASE)
if m:
return int(m.group(1))
return None
class TvdbClient:
def __init__(self, api_key: str, pin: str = ""):
self.api_key = api_key.strip()
@@ -112,11 +136,11 @@ class TvdbClient:
)
results: list[TvdbSeries] = []
for item in payload.get("data") or []:
if item.get("type") != "series":
item_type = item.get("type") or item.get("primary_type")
if item_type and item_type != "series":
continue
try:
series_id = int(item["id"])
except (KeyError, TypeError, ValueError):
series_id = _parse_series_id(item)
if series_id is None:
continue
year = item.get("year")
if year is not None: