mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
fix tvdb api
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user