fix(tmdb): preserve search pagination when adult filter is false

This commit is contained in:
jxxghp
2026-10-17 00:38:37 +08:00
parent 5b66cae2fc
commit 36cf26d892
2 changed files with 43 additions and 13 deletions

View File

@@ -1,12 +1,11 @@
from ..tmdb import TMDb
from urllib.parse import quote
try:
from urllib import quote
except ImportError:
from urllib.parse import quote
from ..tmdb import TMDb
class Search(TMDb):
"""提供电影、剧集、人物及其他实体的同步和异步搜索。"""
_urls = {
"companies": "/search/company",
"collections": "/search/collection",
@@ -69,7 +68,7 @@ class Search(TMDb):
"""
params = "query=%s&page=%s" % (quote(term), page)
if adult is not None:
params += "&include_adult=%s" % "true" if adult else "false"
params += "&include_adult=%s" % ("true" if adult else "false")
if region is not None:
params += "&region=%s" % quote(region)
if year is not None:
@@ -94,7 +93,7 @@ class Search(TMDb):
"""
params = "query=%s&page=%s" % (quote(term), page)
if adult is not None:
params += "&include_adult=%s" % "true" if adult else "false"
params += "&include_adult=%s" % ("true" if adult else "false")
if region is not None:
params += "&region=%s" % quote(region)
return self._request_obj(
@@ -114,7 +113,7 @@ class Search(TMDb):
"""
params = "query=%s&page=%s" % (quote(term), page)
if adult is not None:
params += "&include_adult=%s" % "true" if adult else "false"
params += "&include_adult=%s" % ("true" if adult else "false")
if region is not None:
params += "&region=%s" % quote(region)
return self._request_obj(
@@ -134,7 +133,7 @@ class Search(TMDb):
"""
params = "query=%s&page=%s" % (quote(term), page)
if adult is not None:
params += "&include_adult=%s" % "true" if adult else "false"
params += "&include_adult=%s" % ("true" if adult else "false")
if release_year is not None:
params += "&first_air_date_year=%s" % release_year
return self._request_obj(
@@ -194,7 +193,7 @@ class Search(TMDb):
"""
params = "query=%s&page=%s" % (quote(term), page)
if adult is not None:
params += "&include_adult=%s" % "true" if adult else "false"
params += "&include_adult=%s" % ("true" if adult else "false")
if region is not None:
params += "&region=%s" % quote(region)
return await self._async_request_obj(
@@ -215,7 +214,7 @@ class Search(TMDb):
"""
params = "query=%s&page=%s" % (quote(term), page)
if adult is not None:
params += "&include_adult=%s" % "true" if adult else "false"
params += "&include_adult=%s" % ("true" if adult else "false")
if region is not None:
params += "&region=%s" % quote(region)
return await self._async_request_obj(
@@ -237,7 +236,7 @@ class Search(TMDb):
"""
params = "query=%s&page=%s" % (quote(term), page)
if adult is not None:
params += "&include_adult=%s" % "true" if adult else "false"
params += "&include_adult=%s" % ("true" if adult else "false")
if region is not None:
params += "&region=%s" % quote(region)
if year is not None:
@@ -262,7 +261,7 @@ class Search(TMDb):
"""
params = "query=%s&page=%s" % (quote(term), page)
if adult is not None:
params += "&include_adult=%s" % "true" if adult else "false"
params += "&include_adult=%s" % ("true" if adult else "false")
if release_year is not None:
params += "&first_air_date_year=%s" % release_year
return await self._async_request_obj(

View File

@@ -0,0 +1,31 @@
"""TMDb 成人内容开关须生成独立参数,不能损坏分页参数。"""
import asyncio
from unittest.mock import AsyncMock, Mock
from urllib.parse import parse_qs
import pytest
from app.modules.themoviedb.tmdbv3api.objs.search import Search
@pytest.mark.parametrize("method", ["movies", "multi", "people", "tv_shows"])
@pytest.mark.parametrize("asynchronous", [False, True])
@pytest.mark.parametrize("adult", [None, False, True])
def test_adult_option_preserves_query_and_page(monkeypatch, method, asynchronous, adult):
"""双入口保持查询和页码,显式 False 与未传开关分别对应 false 与省略。"""
payload = [{"id": 42}]
request = (AsyncMock if asynchronous else Mock)(return_value=payload)
monkeypatch.setattr(Search, "_async_request_obj" if asynchronous else "_request_obj", request)
client = object.__new__(Search)
operation = getattr(client, f"async_{method}" if asynchronous else method)
arguments = {"term": "测试 & movie", "page": 2, "adult": adult}
result = asyncio.run(operation(**arguments)) if asynchronous else operation(**arguments)
assert result is payload
request.assert_called_once()
parameters = parse_qs(request.call_args.kwargs["params"])
expected = {"query": ["测试 & movie"], "page": ["2"]}
if adult is not None:
expected["include_adult"] = ["true" if adult else "false"]
assert parameters == expected
assert request.call_args.kwargs["key"] == "results"