add: 刮削演员信息并生成相应目录结构和演员图片

This commit is contained in:
Carol 2023-09-05 17:19:22 +08:00
parent a6e9038892
commit 725d04a768
13 changed files with 737 additions and 1 deletions

View File

@ -1,3 +1,22 @@
# tmdb-person
根据nfo文件信息刮削相关演员信息及图片
根据nfo文件信息刮削相关演员信息及图片
## example
> emby 存储于metadata/peopel 中的数据示例
> 电视剧tvs 和 电影movies 的保存 `.nfo` 命名格式不一样。movies的 `.nfo` 文件以电影名为前缀, tvs 统一以 `tvshow.nfo` 命名
* a: 英文演员信息
* 张: 中文演员信息
* person.nfo
* tvshow.nfo
## data
> 实际刮削的演员信息存放路径
## 接口
> https://developer.themoviedb.org/
1. 演员信息刮削https://developer.themoviedb.org/reference/person-details
2. 图片统一前缀路径https://www.themoviedb.org/t/p/original

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

11
example/person.nfo Executable file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<person>
<plot />
<outline />
<lockdata>false</lockdata>
<dateadded>2023-08-26 05:05:20</dateadded>
<title>朱一龙</title>
<sorttitle>朱一龙</sorttitle>
<tmdbid>1743471</tmdbid>
<uniqueid type="tmdb">1743471</uniqueid>
</person>

96
example/tvshow.nfo Normal file
View File

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<tvshow>
<plot><![CDATA[温婉可人、处事低调的业内顶尖配音演员时宜,一日在机场偶遇了儒雅的海归化学教授周生辰,两人一见如故颇有眼缘,短暂交往后彼此都留下了深刻印象。为了拯救日渐没落的紫砂壶工厂,周生辰答应母亲的 条件,订婚承业。他婉拒了家里安排,向颇有好感的时宜提出了订婚的请求。时宜内心早已认定 ,欣然答应。点滴相处中,两人默契逐渐产生,两颗心慢慢靠近。周生辰为了振兴家乡的紫砂壶工艺,与长辈产生了经营理念上的巨大分歧,面对亲情和事业的两难境地,幸得时宜始终相伴,并给予了最坚实的支持和鼓励,两人最终携手最大程度地保全了传统手工艺。风雨过后,情意更为深重。然而此时,时宜为了救周生辰遭奸人陷害,身受重伤重度昏迷。周生辰暂时放下事业悉心陪伴照料,终将爱妻唤醒,两人约定相伴此生此世永不分离。]]></plot>
<outline><![CDATA[温婉可人、处事低调的业内顶尖配音演员时宜,一日在机场偶遇了儒雅的海归化学教授周生辰,两人一见如故颇有眼缘,短暂交往后彼此都留下了深刻印象。为了拯救日渐没落的紫砂壶工厂,周生辰答应母亲的 条件,订婚承业。他婉拒了家里安排,向颇有好感的时宜提出了订婚的请求。时宜内心早已认定 ,欣然答应。点滴相处中,两人默契逐渐产生,两颗心慢慢靠近。周生辰为了振兴家乡的紫砂壶工艺,与长辈产生了经营理念上的巨大分歧,面对亲情和事业的两难境地,幸得时宜始终相伴,并给予了最坚实的支持和鼓励,两人最终携手最大程度地保全了传统手工艺。风雨过后,情意更为深重。然而此时,时宜为了救周生辰遭奸人陷害,身受重伤重度昏迷。周生辰暂时放下事业悉心陪伴照料,终将爱妻唤醒,两人约定相伴此生此世永不分离。]]></outline>
<lockdata>false</lockdata>
<dateadded>2023-09-02 22:49:29</dateadded>
<title>一生一世</title>
<originaltitle>一生一世</originaltitle>
<actor>
<name>Ren Jialun</name>
<role>Zhousheng Chen</role>
<type>Actor</type>
<tmdbid>2084465</tmdbid>
</actor>
<actor>
<name>Bai Lu</name>
<role>Shi Yi</role>
<type>Actor</type>
<tmdbid>1879666</tmdbid>
</actor>
<actor>
<name>Ci Sha</name>
<role>Mei Xing</role>
<type>Actor</type>
<tmdbid>3167855</tmdbid>
</actor>
<actor>
<name>Wang Yueyi</name>
<role>Hong Xiaoyu</role>
<type>Actor</type>
<tmdbid>3161424</tmdbid>
</actor>
<actor>
<name>Luo Mingjie</name>
<role>Zhou Wenchuan</role>
<type>Actor</type>
<tmdbid>2359338</tmdbid>
</actor>
<actor>
<name>Wang Ruixin</name>
<role>Zhou Wenxing</role>
<type>Actor</type>
<tmdbid>3177467</tmdbid>
</actor>
<actor>
<name>Luo Haiqiong</name>
<role>Qin Wan</role>
<type>Actor</type>
<tmdbid>1363325</tmdbid>
</actor>
<actor>
<name>Feng Jia-Yi</name>
<role>Zhou Shengxing</role>
<type>Actor</type>
<tmdbid>1613707</tmdbid>
</actor>
<actor>
<name>Wang Xiwen</name>
<type>Actor</type>
<tmdbid>3177468</tmdbid>
</actor>
<actor>
<name>Ye Xiaowei</name>
<type>Actor</type>
<tmdbid>2790196</tmdbid>
</actor>
<actor>
<name>Liu Ruogu</name>
<role>Zhou Shengren</role>
<type>Actor</type>
<tmdbid>2747081</tmdbid>
</actor>
<director tmdbid="2665899">Shen Yang</director>
<trailer>http://www.youtube.com/watch?v=ZGymduZZhqg</trailer>
<rating>7.4</rating>
<year>2021</year>
<sorttitle>一生一世</sorttitle>
<imdb_id>tt14324128</imdb_id>
<tmdbid>130107</tmdbid>
<premiered>2021-09-06</premiered>
<releasedate>2021-09-06</releasedate>
<enddate>2021-10-03</enddate>
<runtime>50</runtime>
<genre>剧情</genre>
<studio>iQiyi</studio>
<uniqueid type="imdb">tt14324128</uniqueid>
<uniqueid type="tmdb">130107</uniqueid>
<uniqueid type="tvdb">402985</uniqueid>
<tvdbid>402985</tvdbid>
<episodeguide>{"imdb":"tt14324128","tmdb":"130107","tvdb":"402985"}</episodeguide>
<id>402985</id>
<season>-1</season>
<episode>-1</episode>
<displayorder>aired</displayorder>
<status>Ended</status>
</tvshow>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<person>
<plot />
<outline />
<lockdata>false</lockdata>
<dateadded>2023-08-26 16:06:51</dateadded>
<title>张晚意</title>
<sorttitle>张晚意</sorttitle>
<imdbid>nm9545744</imdbid>
<tmdbid>3028958</tmdbid>
<uniqueid type="tmdb">3028958</uniqueid>
<uniqueid type="imdb">nm9545744</uniqueid>
</person>

View File

@ -0,0 +1,522 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<movie>
<plot><![CDATA[忠厚老实的科尔(克里斯·埃文斯 Chris Evans 饰)爱上了神秘莫测的赛迪(安娜·德·阿玛斯 Ana de Armas 饰),却惊诧地发现她是一名秘密特工。在他们决定是否进行第二次约会之前,科尔和赛迪被卷入了一场拯救世界的国际冒险。]]></plot>
<outline />
<lockdata>false</lockdata>
<dateadded>2023-04-23 19:26:54</dateadded>
<title>神出鬼没</title>
<originaltitle>Ghosted</originaltitle>
<actor>
<name>Chris Evans</name>
<role>Cole Turner</role>
<type>Actor</type>
<tmdbid>16828</tmdbid>
</actor>
<actor>
<name>Ana de Armas</name>
<role>Sadie Rhodes</role>
<type>Actor</type>
<tmdbid>224513</tmdbid>
</actor>
<actor>
<name>艾德里安·布洛迪</name>
<role>Leveque</role>
<type>Actor</type>
<tmdbid>3490</tmdbid>
</actor>
<actor>
<name>麦克·莫</name>
<role>Wagner</role>
<type>Actor</type>
<tmdbid>1324443</tmdbid>
</actor>
<actor>
<name>泰特·多诺万</name>
<role>Dad</role>
<type>Actor</type>
<tmdbid>15455</tmdbid>
</actor>
<actor>
<name>艾米·塞德丽丝</name>
<role>Mom</role>
<type>Actor</type>
<tmdbid>12110</tmdbid>
</actor>
<actor>
<name>丽兹·布罗德威</name>
<role>Mattie Turner</role>
<type>Actor</type>
<tmdbid>1376782</tmdbid>
</actor>
<actor>
<name>Mustafa Shakir</name>
<role>Monte Jackson</role>
<type>Actor</type>
<tmdbid>62385</tmdbid>
</actor>
<actor>
<name>Anthony Mackie</name>
<role>Grandson of Sam</role>
<type>Actor</type>
<tmdbid>53650</tmdbid>
</actor>
<actor>
<name>John Cho</name>
<role>The Leopard</role>
<type>Actor</type>
<tmdbid>68842</tmdbid>
</actor>
<actor>
<name>Sebastian Stan</name>
<role>God</role>
<type>Actor</type>
<tmdbid>60898</tmdbid>
</actor>
<actor>
<name>Ryan Reynolds</name>
<role>Jonas</role>
<type>Actor</type>
<tmdbid>10859</tmdbid>
</actor>
<actor>
<name>安娜·迪佛·史密斯</name>
<role>Claudia Yates</role>
<type>Actor</type>
<tmdbid>63279</tmdbid>
</actor>
<actor>
<name>Tim Blake Nelson</name>
<role>Borislov</role>
<type>Actor</type>
<tmdbid>1462</tmdbid>
</actor>
<actor>
<name>蒂娅·希尔卡</name>
<role>Patti</role>
<type>Actor</type>
<tmdbid>109046</tmdbid>
</actor>
<actor>
<name>Steve Park</name>
<role>Utami</role>
<type>Actor</type>
<tmdbid>4025</tmdbid>
</actor>
<actor>
<name>Burn Gorman</name>
<role>English Cabbie</role>
<type>Actor</type>
<tmdbid>39659</tmdbid>
</actor>
<actor>
<name>Marwan Kenzari</name>
<role>Marco</role>
<type>Actor</type>
<tmdbid>935235</tmdbid>
</actor>
<actor>
<name>Victoria Garcia-Kelleher</name>
<role>Edna</role>
<type>Actor</type>
<tmdbid>1500108</tmdbid>
</actor>
<actor>
<name>Jordan Blair Mangold Brown</name>
<role>Joann</role>
<type>Actor</type>
<tmdbid>1999675</tmdbid>
</actor>
<actor>
<name>德克斯特·弗莱彻</name>
<role>Raoul</role>
<type>Actor</type>
<tmdbid>974</tmdbid>
</actor>
<director tmdbid="974">德克斯特·弗莱彻</director>
<trailer>plugin://plugin.video.youtube/?action=play_video&amp;videoid=IAdCsNtEuBU</trailer>
<rating>5.8</rating>
<year>2023</year>
<sorttitle>神出鬼没</sorttitle>
<mpaa>PG-13</mpaa>
<imdbid>tt15326988</imdbid>
<tmdbid>868759</tmdbid>
<premiered>2023-04-21</premiered>
<releasedate>2023-04-21</releasedate>
<runtime>117</runtime>
<country>United States of America</country>
<genre>爱情</genre>
<genre>动作</genre>
<genre>喜剧</genre>
<studio>Skydance Media</studio>
<studio>Apple Studios</studio>
<uniqueid type="imdb">tt15326988</uniqueid>
<uniqueid type="tmdb">868759</uniqueid>
<id>tt15326988</id>
<fileinfo>
<streamdetails>
<video>
<codec>hevc</codec>
<micodec>hevc</micodec>
<bitrate>24860682</bitrate>
<width>3840</width>
<height>2076</height>
<aspect>320:173</aspect>
<aspectratio>320:173</aspectratio>
<framerate>23.976025</framerate>
<language>eng</language>
<scantype>progressive</scantype>
<default>True</default>
<forced>False</forced>
<duration>116</duration>
<durationinseconds>7014</durationinseconds>
</video>
<audio>
<codec>eac3</codec>
<micodec>eac3</micodec>
<bitrate>768000</bitrate>
<language>eng</language>
<scantype>progressive</scantype>
<channels>6</channels>
<samplingrate>48000</samplingrate>
<default>True</default>
<forced>False</forced>
</audio>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>eng</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>eng</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>ara</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>bul</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>cze</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>dan</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>ger</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>gre</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>spa</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>spa</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>est</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>fin</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>fre</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>fre</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>heb</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>hin</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>hun</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>ind</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>ita</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>jpn</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>kor</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>lit</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>lav</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>may</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>dut</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>nor</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>pol</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>por</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>por</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>rus</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>slo</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>slv</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>swe</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>tam</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>tel</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>tha</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>tur</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>ukr</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>vie</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>chi</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>chi</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
<subtitle>
<codec>subrip</codec>
<micodec>subrip</micodec>
<language>chi</language>
<scantype>progressive</scantype>
<default>False</default>
<forced>False</forced>
</subtitle>
</streamdetails>
</fileinfo>
</movie>

75
person.py Normal file
View File

@ -0,0 +1,75 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import os
import xml.etree.ElementTree as ET
import json
class Analyze:
def __init__(self, file_path):
self.file_path = file_path
def analyze(self):
tree = ET.parse(self.file_path)
root = tree.getroot()
if "tvshow" in root.tag:
data_json = {}
self.__list_nodes(root, data_json)
return data_json
if "movie" in root.tag:
data_json = {}
self.__list_nodes(root, data_json)
return data_json
def __list_nodes(self, root, data):
actors = []
for node in root:
if 0 == len(list(node)):
data[node.tag] = node.text
elif "actor" == node.tag:
actor_json = {}
self.__list_nodes(node, actor_json)
actors.append(actor_json)
data["actors"] = actors
class Tmdb:
def __init__(self, tmdb_id, actor_path):
self.image_path = None
self.tmdb_id = tmdb_id
self.actor_path = actor_path
def get_actor_info(self):
url = "https://api.themoviedb.org/3/person/" + self.tmdb_id + "?language=zh-CN"
headers = {
"accept": "application/json",
"Authorization": "Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxYTU4ODAxMGY5OTUwYWEyNThhYjFhYjJlMjI4NGVmYSIsInN1YiI6IjYxYmRmOGNjMzgzZGYyMDA0MjIzNDhjOSIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.RPG8F8AELlK7MgrXDR2U0YRv61VteZZ9ponilnkQqkE"
}
response = requests.get(url, headers=headers)
return response.text
def get_actor_image(self):
image_path = json.loads(self.get_actor_info())["profile_path"]
url = 'https://www.themoviedb.org/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)
if __name__ == '__main__':
__nfo_data = Analyze(file_path="example/神出鬼没 (2023) - 2160p.nfo").analyze()
for __actor in __nfo_data["actors"]:
__tmdbid = __actor["tmdbid"]
__actor_name = __actor["name"]
__name = __actor_name[1].lower()
__path_dir = os.path.join("data", __name, __actor_name)
if not os.path.exists(__path_dir):
os.makedirs(__path_dir)
if ".nfo" not in os.listdir(__path_dir):
__actor_info = Tmdb(tmdb_id=__tmdbid, actor_path=__path_dir).get_actor_info()
print(__actor_info)
if "folder" not in os.listdir(__path_dir):
Tmdb(tmdb_id=__tmdbid, actor_path=__path_dir).get_actor_image()