fix(imdb): handle null optional title fields

This commit is contained in:
jxxghp
2026-09-02 22:59:07 +08:00
parent 3371925d55
commit dd2a4b22e1
2 changed files with 48 additions and 11 deletions
+15 -11
View File
@@ -415,27 +415,31 @@ class ImdbApi:
item = cls._first_title(data)
if not item:
return None
genres = item.get("titleGenres", {}).get("genres") or []
countries = item.get("countriesOfOrigin", {}).get("countries") or []
languages = item.get("spokenLanguages", {}).get("spokenLanguages") or []
genres = (item.get("titleGenres") or {}).get("genres") or []
countries = (item.get("countriesOfOrigin") or {}).get("countries") or []
languages = (item.get("spokenLanguages") or {}).get("spokenLanguages") or []
return cls._parse(
ImdbTitle,
{
"id": item.get("id"),
"type": item.get("titleType", {}).get("id"),
"type": (item.get("titleType") or {}).get("id"),
"isAdult": item.get("isAdult"),
"primaryTitle": item.get("titleText", {}).get("text"),
"originalTitle": item.get("originalTitleText", {}).get("text"),
"primaryTitle": (item.get("titleText") or {}).get("text"),
"originalTitle": (item.get("originalTitleText") or {}).get(
"text"
),
"primaryImage": item.get("primaryImage"),
"startYear": item.get("releaseYear", {}).get("year"),
"runtimeSeconds": item.get("runtime", {}).get("seconds"),
"startYear": (item.get("releaseYear") or {}).get("year"),
"runtimeSeconds": (item.get("runtime") or {}).get("seconds"),
"genres": [
entry.get("genre", {}).get("text")
(entry.get("genre") or {}).get("text")
for entry in genres
if entry.get("genre", {}).get("text")
if (entry.get("genre") or {}).get("text")
],
"rating": item.get("ratingsSummary"),
"plot": item.get("plot", {}).get("plotText", {}).get("plainText"),
"plot": ((item.get("plot") or {}).get("plotText") or {}).get(
"plainText"
),
"originCountries": [
{"code": entry.get("id"), "name": entry.get("text")}
for entry in countries
+33
View File
@@ -169,6 +169,39 @@ def test_imdb_graphql_error_is_not_cached() -> None:
assert api._request.post_json.call_count == 2
def test_imdb_title_parser_accepts_null_optional_objects() -> None:
"""GraphQL 可选对象为 null 时应保留可用详情并归一为空值。"""
detail = ImdbApi._parse_title(
{
"titles": [
{
"id": "tt30836097",
"titleType": {"id": "tvSeries"},
"titleText": {"text": "19th Floor"},
"originalTitleText": None,
"releaseYear": None,
"runtime": None,
"titleGenres": None,
"countriesOfOrigin": None,
"spokenLanguages": None,
"plot": None,
}
]
}
)
assert detail is not None
assert detail.id == "tt30836097"
assert detail.primary_title == "19th Floor"
assert detail.original_title is None
assert detail.start_year is None
assert detail.runtime_seconds is None
assert detail.genres == []
assert detail.origin_countries == []
assert detail.spoken_languages == []
assert detail.plot is None
def test_imdb_clear_cache_registers_async_cleanup_in_running_loop() -> None:
"""同步清缓存入口在异步宿主中应登记任务,并保留原同步调用约定。"""