fix tvdb api

This commit is contained in:
jxxghp
2025-05-29 08:03:12 +08:00
parent 8761c82afe
commit d5f7f1ba91
+67 -49
View File
@@ -4,12 +4,10 @@ __author__ = "Weylin Wagnon"
__version__ = "1.0.12" __version__ = "1.0.12"
import json import json
import ssl import urllib.parse
import string
import urllib
import urllib.request
from http import HTTPStatus from http import HTTPStatus
from urllib.error import HTTPError
from app.utils.http import RequestUtils
class Auth: class Auth:
@@ -18,21 +16,31 @@ class Auth:
if pin != "": if pin != "":
loginInfo["pin"] = pin loginInfo["pin"] = pin
loginInfoBytes = json.dumps(loginInfo, indent=2).encode("utf-8") loginInfoBytes = json.dumps(loginInfo, indent=2)
if proxy:
proxy_handler = urllib.request.ProxyHandler(proxy)
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
req = urllib.request.Request(url, data=loginInfoBytes)
req.add_header("Content-Type", "application/json")
try: try:
context = ssl._create_unverified_context() # 使用项目统一的RequestUtils类
with urllib.request.urlopen(req, context=context, data=loginInfoBytes) as response: req_utils = RequestUtils(proxies=proxy, timeout=30)
res = json.load(response) response = req_utils.post_res(
url=url,
data=loginInfoBytes,
headers={"Content-Type": "application/json"}
)
if response and response.status_code == 200:
res = response.json()
self.token = res["data"]["token"] self.token = res["data"]["token"]
except HTTPError as e: else:
res = json.load(e) error_msg = f"登录失败,状态码: {response.status_code if response else 'None'}"
raise Exception("Code:{}, {}".format(e, res["message"])) if response:
try:
error_data = response.json()
error_msg = f"Code: {response.status_code}, {error_data.get('message', '未知错误')}"
except:
error_msg = f"Code: {response.status_code}, 响应解析失败"
raise Exception(error_msg)
except Exception as e:
raise Exception(f"TVDB认证失败: {str(e)}")
def get_token(self): def get_token(self):
return self.token return self.token
@@ -46,36 +54,46 @@ class Request:
def make_request(self, url, if_modified_since=None): def make_request(self, url, if_modified_since=None):
"""Makes a request to the given URL and returns the data""" """Makes a request to the given URL and returns the data"""
if self.proxy: headers = {"Authorization": f"Bearer {self.auth_token}"}
proxy_handler = urllib.request.ProxyHandler(self.proxy)
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
req = urllib.request.Request(url)
req.add_header("Authorization", "Bearer {}".format(self.auth_token))
if if_modified_since: if if_modified_since:
req.add_header("If-Modified-Since", "{}".format(if_modified_since)) headers["If-Modified-Since"] = str(if_modified_since)
try: try:
context = ssl._create_unverified_context() # 使用项目统一的RequestUtils类
with urllib.request.urlopen(req, context=context) as response: req_utils = RequestUtils(proxies=self.proxy, timeout=30)
res = json.load(response) response = req_utils.get_res(url=url, headers=headers)
except HTTPError as e:
try: if response is None:
if e.code == HTTPStatus.NOT_MODIFIED: raise ValueError(f"failed to get {url}\n 网络连接失败")
return {
"code": HTTPStatus.NOT_MODIFIED.real, if response.status_code == HTTPStatus.NOT_MODIFIED:
"message": "Not-Modified", return {
} "code": HTTPStatus.NOT_MODIFIED.real,
res = json.load(e) "message": "Not-Modified",
except: }
res = {}
data = res.get("data", None) if response.status_code == 200:
if data is not None and res.get("status", "failure") != "failure": res = response.json()
self.links = res.get("links", None) data = res.get("data", None)
return data if data is not None and res.get("status", "failure") != "failure":
msg = res.get("message", None) self.links = res.get("links", None)
if not msg: return data
msg = "UNKNOWN FAILURE"
raise ValueError("failed to get " + url + "\n " + str(msg)) msg = res.get("message", "UNKNOWN FAILURE")
raise ValueError(f"failed to get {url}\n {str(msg)}")
else:
# 处理其他HTTP错误状态码
try:
error_data = response.json()
msg = error_data.get("message", f"HTTP {response.status_code}")
except:
msg = f"HTTP {response.status_code}"
raise ValueError(f"failed to get {url}\n {str(msg)}")
except Exception as e:
if isinstance(e, ValueError):
raise
raise ValueError(f"failed to get {url}\n {str(e)}")
class Url: class Url:
@@ -198,7 +216,7 @@ class TVDB:
return self.request.make_request(url, if_modified_since) return self.request.make_request(url, if_modified_since)
def get_series_by_slug( def get_series_by_slug(
self, slug: string, meta=None, if_modified_since=None self, slug: str, meta=None, if_modified_since=None
) -> dict: ) -> dict:
"""Returns a series dictionary""" """Returns a series dictionary"""
url = self.url.construct("series/slug", slug, meta=meta) url = self.url.construct("series/slug", slug, meta=meta)
@@ -257,7 +275,7 @@ class TVDB:
return self.request.make_request(url, if_modified_since) return self.request.make_request(url, if_modified_since)
def get_movie_by_slug( def get_movie_by_slug(
self, slug: string, meta=None, if_modified_since=None self, slug: str, meta=None, if_modified_since=None
) -> dict: ) -> dict:
"""Returns a movie dictionary""" """Returns a movie dictionary"""
url = self.url.construct("movies/slug", slug, meta=meta) url = self.url.construct("movies/slug", slug, meta=meta)
@@ -415,7 +433,7 @@ class TVDB:
url = self.url.construct("lists", id, meta=meta) url = self.url.construct("lists", id, meta=meta)
return self.request.make_request(url), if_modified_since return self.request.make_request(url), if_modified_since
def get_list_by_slug(self, slug: string, meta=None, if_modified_since=None) -> dict: def get_list_by_slug(self, slug: str, meta=None, if_modified_since=None) -> dict:
"""Returns a movie dictionary""" """Returns a movie dictionary"""
url = self.url.construct("lists/slug", slug, meta=meta) url = self.url.construct("lists/slug", slug, meta=meta)
return self.request.make_request(url, if_modified_since) return self.request.make_request(url, if_modified_since)