tmdb-person/tmdb.py

139 lines
5.9 KiB
Python
Raw Normal View History

2023-09-06 14:40:57 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
2023-09-09 10:07:43 +08:00
import logging
2023-09-06 14:40:57 +08:00
import requests
import json
import os
2023-09-06 16:35:11 +08:00
from analyze import Make
import utils.DateUtil as DateUtil
2023-09-06 14:40:57 +08:00
2023-09-07 15:12:42 +08:00
# https://api.tmdb.org
# https://tmdb.nastool.org
# https://t.nastool.workers.dev
2023-09-07 15:13:29 +08:00
# https://api.themoviedb.org
2023-09-08 14:21:29 +08:00
api_url = "https://api.tmdb.org"
2023-09-07 15:12:42 +08:00
image_url = "https://www.themoviedb.org"
2023-09-06 14:40:57 +08:00
class Tmdb:
def __init__(self, log, tmdb_id, actor_path, tmdb_token, language="zh-CN"):
self.log = log
self.image_path = None
self.tmdb_id = tmdb_id
self.actor_path = actor_path
self.header = {
"accept": "application/json",
"Authorization": "Bearer " + tmdb_token
}
self.language = language
def get_actor_info(self):
2023-09-07 15:12:42 +08:00
url = api_url + "/3/person/" + self.tmdb_id + "?language=" + self.language
2023-09-06 14:40:57 +08:00
headers = self.header
response = requests.get(url, headers=headers)
if 200 == response.status_code:
return response.text.encode("utf-8")
else:
return "{}"
2023-09-06 14:40:57 +08:00
def get_actor_image(self):
ac_json = json.loads(self.get_actor_info())
if len(ac_json.keys()) > 0:
image_path = json.loads(self.get_actor_info())["profile_path"]
self.log.logger.info("当前刮削到的演员海报路径:{0}".format(image_path))
if None is not image_path:
url = image_url + '/t/p/original' + image_path
response = requests.get(url)
if response.status_code == 200:
suffix = image_path.split(".")[1]
with open(os.path.join(self.actor_path, "folder." + suffix), 'wb') as f:
f.write(response.content)
2023-09-06 14:40:57 +08:00
def __translations(self):
2023-09-07 15:12:42 +08:00
url = api_url + "/3/person/" + self.tmdb_id + "/translations"
2023-09-06 14:40:57 +08:00
headers = self.header
response = requests.get(url, headers=headers)
2023-09-09 10:07:43 +08:00
if 200 == response.status_code:
return response.text
else:
return "{}"
2023-09-06 14:40:57 +08:00
2023-09-06 16:35:11 +08:00
def get_actor_plot(self):
2023-09-06 14:40:57 +08:00
plot = ""
2023-09-09 10:07:43 +08:00
translations = self.__translations()
translations_json = json.loads(translations)
if "translations" in translations_json:
translations_list = json.loads(translations)["translations"]
translations_json = {}
for translation in translations_list:
translations_json[translation["iso_3166_1"]] = translation
if "CN" in translations_json.keys():
zh = translations_json["CN"]
plot = zh["data"]["biography"]
elif "US" in translations_json.keys():
us = translations_json["US"]
plot = us["data"]["biography"]
plot = plot.replace("\n", "").replace("\r\n", "")
2023-09-06 14:40:57 +08:00
return plot
2023-09-12 10:29:19 +08:00
def create_actor_nfo(self, redo=False):
2023-09-06 16:35:11 +08:00
actor_json = {}
plot = self.get_actor_plot()
actor_json["plot"] = plot
actor_json["outline"] = plot
actor_json["lockdata"] = "true"
actor_json["lockedfields"] = "Name|SortName"
actor_json["dateadded"] = DateUtil.get_now(DateUtil.FULL_DATE_FORMAT)
2023-09-06 16:35:11 +08:00
actor_info = self.get_actor_info()
self.log.logger.info("当前刮削到的演员元数据:{0}".format(actor_info))
info_json = json.loads(actor_info)
if len(info_json.keys()) > 0:
name = info_json["name"]
actor_json["title"] = name
birthday = info_json["birthday"]
actor_json["premiered"] = birthday
actor_json["releasedate"] = birthday
2023-09-06 16:35:11 +08:00
year = "" if birthday is None else birthday.split("-")[0]
2023-09-06 16:35:11 +08:00
actor_json["year"] = year
actor_json["sorttitle"] = name
actor_json["tmdbid"] = self.tmdb_id
actor_json["language"] = "zh-CN"
actor_json["countrycode"] = "CN"
actor_json["placeofbirth"] = info_json["place_of_birth"]
actor_json["uniqueid"] = self.tmdb_id
2023-09-06 16:35:11 +08:00
actor_json["adult"] = "" if info_json["adult"] is None else str(info_json["adult"])
# 不建议使用存在gbk转码问题
# actor_json["alsoknownas"] = "" if info_json["also_known_as"] is None else info_json["also_known_as"]
actor_json["deathday"] = "" if info_json["deathday"] is None else str(info_json["deathday"])
actor_json["gender"] = "" if info_json["gender"] is None else str(info_json["gender"])
actor_json["homepage"] = "" if info_json["homepage"] is None else str(info_json["homepage"])
actor_json["imdbid"] = "" if info_json["imdb_id"] is None else str(info_json["imdb_id"])
actor_json["knownfordepartment"] = "" if info_json["known_for_department"] is None else str(
info_json["known_for_department"])
2023-09-06 16:35:11 +08:00
actor_data = json.dumps(actor_json)
2023-09-11 21:24:42 +08:00
person_nfo = os.path.join(self.actor_path, "person.nfo")
2023-09-11 00:48:34 +08:00
try:
2023-09-11 21:24:42 +08:00
Make(xml_path=person_nfo, data=actor_data).create()
2023-09-12 10:29:19 +08:00
# 重做模式下删除重新成功刮削的信息
if redo:
error_file_read = open("./error_tmdb_ids.txt", "r+")
new_read = error_file_read.read().replace(os.path.basename(self.actor_path) + ",", "")
error_file_w = open("./error_tmdb_ids.txt", "w")
error_file_w.write(new_read)
error_file_w.close()
2023-09-11 00:48:34 +08:00
except Exception as e:
2023-09-11 21:24:42 +08:00
os.remove(person_nfo)
2023-09-12 10:29:19 +08:00
# 非重做模式下记录刮削异常信息,重做模式下不再重复记录
if not redo:
error_file = open("./error_tmdb_ids.txt", "w+")
error_file.write(os.path.basename(self.actor_path) + ",")
error_file.close()
2023-09-11 00:49:14 +08:00
self.log.logger.error(actor_data)
2023-09-11 00:48:34 +08:00
self.log.logger.error("当前写入元数据出现异常,路径:{0}, 异常:{1}".format(self.actor_path, e))