Commit 3e4c3ef
Changed files (1)
src
others
src/others/tmdb.py
@@ -20,7 +20,7 @@ HELP = f"""
使用说明:
1. `{PREFIX.TMDB}` + 关键词: 查询影视作品简介及ID
2. `{PREFIX.TMDB}` + @演员名: 查询演员简介及ID
-3. `{PREFIX.TMDB}` + ID: 根据ID查询详细信息
+3. `/{{ID}}` + : 根据ID查询详细信息
ID有三种前缀:
- M: 电影
- T: 电视剧
@@ -31,30 +31,30 @@ ID有三种前缀:
示例:
- `{PREFIX.TMDB} 泰坦尼克`: 查找“泰坦尼克”相关作品
- `{PREFIX.TMDB} @莱昂纳多`: 查找演员“莱昂纳多”
- - `{PREFIX.TMDB} M597`: 查询ID为597的电影详情
- - `{PREFIX.TMDB} P6193`: 查询ID为6193的演员详情
+ - `/M597`: 查询ID为597的电影详情
+ - `/P6193`: 查询ID为6193的演员详情
"""
HEADERS = {"accept": "application/json", "Authorization": f"Bearer {TOKEN.TMDB}"}
async def search_tmdb(client: Client, message: Message, *, include_adult: bool = True, **kwargs) -> None:
"""TMDB command handler."""
- if not startswith_prefix(message.content, prefix=PREFIX.TMDB):
+ if not (startswith_prefix(message.content, prefix=PREFIX.TMDB) or message.content.startswith(("/M", "/T", "/P"))):
return
# send docs if without reply
if equal_prefix(message.text, prefix=PREFIX.TMDB) and not message.reply_to_message:
await send2tg(client, message, texts=HELP, **kwargs)
return
- info = parse_msg(message, silent=True)
- # reply a message with /audio or /voice
- if message.reply_to_message:
+ # reply a message with /tmdb
+ if equal_prefix(message.text, prefix=PREFIX.TMDB) and message.reply_to_message:
message = message.reply_to_message
- info = parse_msg(message, use_cache=False, silent=True) # parse again
+ info = parse_msg(message, silent=True)
await set_reaction(client, message, reaction="👌")
-
query = remove_prefix(info["text"], prefix=PREFIX.TMDB)
- if query.startswith(("M", "T", "P")) and query[1:].isdigit(): # check if the query is a TMDB ID
- resp = await get_details(query)
+ if query.startswith(("/M", "/T", "/P")):
+ if not query[2:].isdigit():
+ return
+ resp = await get_details(query[1:])
elif query.startswith("@"):
resp = await search_people(query[1:], include_adult=include_adult)
else:
@@ -82,7 +82,7 @@ async def search_keyword(query: str, tmdb_lang: Literal["en-US", "zh-CN"] = "zh-
type_initial = item["media_type"][0].upper() # M: movie, T: TV
original_title = glom(item, Coalesce("original_title", "original_name"), default="")
if title := glom(item, Coalesce("title", "original_title", "name", "original_name"), default=""):
- this_msg += f"`{type_initial}{item['id']}`:[《{title}》](https://www.themoviedb.org/{item['media_type']}/{item['id']})"
+ this_msg += f"/{type_initial}{item['id']}:[《{title}》](https://www.themoviedb.org/{item['media_type']}/{item['id']})"
if date := glom(item, Coalesce("release_date", "first_air_date"), default=""):
this_msg += f"({date[:4]})"
@@ -117,11 +117,9 @@ async def search_people(query: str, tmdb_lang: Literal["en-US", "zh-CN"] = "zh-C
this_msg = ""
name = glom(item, Coalesce("name", "original_name"), default="")
url = f"https://www.themoviedb.org/person/{item['id']}"
- this_msg += f"\n`P{item['id']}`{gender_emoji(item.get('gender'))}: [{name}]({url})"
+ this_msg += f"\n/P{item['id']}: {gender_emoji(item.get('gender'))}{'🔞' if item.get('adult') else ''}[{name}]({url})"
if item.get("original_name") and item["original_name"] != name:
this_msg += f"({item['original_name']})"
- if item.get("adult"):
- this_msg += "🔞"
if item.get("known_for"):
this_msg += f"\n代表作: {', '.join([glom(x, Coalesce('title', 'name'), default='') for x in item['known_for']])}\n"
if await count_without_entities(final_msg + this_msg) > TEXT_LENGTH:
@@ -186,19 +184,29 @@ async def get_details(query: str, tmdb_lang: Literal["en-US", "zh-CN"] = "zh-CN"
if overview := resp.get("overview"):
texts += f"简介: {overview}\n"
- # prefer English Poster
+ # choose poster language
media = []
- img_urls = []
+
posters = defaultdict(list)
for poster in glom(resp, "images.posters", default=[]):
posters[poster.get("iso_639_1", "unknown")].append(poster)
- if posters.get("en"):
- img_urls = [x.get("file_path", "") for x in sorted(posters["en"], key=lambda x: x.get("height", 0), reverse=True)]
- if posters.get("cn"):
- img_urls = [x.get("file_path", "") for x in sorted(posters["en"], key=lambda x: x.get("height", 0), reverse=True)]
- if posters.get("zh"):
- img_urls = [x.get("file_path", "") for x in sorted(posters["en"], key=lambda x: x.get("height", 0), reverse=True)]
- img_urls = [f"https://image.tmdb.org/t/p/original{url}" for url in img_urls]
+ movie_lang = glom(
+ resp,
+ Coalesce(
+ "spoken_languages.0.iso_639_1",
+ "original_language",
+ "origin_country.0",
+ "production_countries.0.iso_3166_1",
+ "production_companies.0.origin_country",
+ ),
+ default="en",
+ ).lower()
+ lang_order = ["cn", "zh", "en"] if movie_lang in ["cn", "zh"] else ["en", "cn", "zh"]
+ url_paths = []
+ for lang in lang_order:
+ urls = [x.get("file_path", "") for x in sorted(posters.get(lang, []), key=lambda x: x.get("height", 0), reverse=True)]
+ url_paths.extend(urls)
+ img_urls = [f"https://image.tmdb.org/t/p/original{url}" for url in url_paths]
# add fallback posters
if resp.get("poster_path"):
img_urls.append(f"https://image.tmdb.org/t/p/original{resp['poster_path']}")
@@ -265,10 +273,10 @@ async def get_people_details(people_id: int, tmdb_lang: Literal["en-US", "zh-CN"
full_date = glom(item, Coalesce("release_date", "first_air_date"), default="")
date = full_date[:4] if full_date else ""
if date:
- productions_for_caption.append(f"`{type_initial}{item['id']}`: {title} ({date})\n")
+ productions_for_caption.append(f"/{type_initial}{item['id']}: {title} ({date})\n")
productions_for_html += f'<br>{type_initial}{item["id"]}: <a href="https://www.themoviedb.org/{item["media_type"]}/{item["id"]}">{title}</a> ({full_date})'
else:
- productions_for_caption.append(f"`{type_initial}{item['id']}`: {title}\n")
+ productions_for_caption.append(f"/{type_initial}{item['id']}: {title}\n")
productions_for_html += f'<br>{type_initial}{item["id"]}: <a href="https://www.themoviedb.org/{item["media_type"]}/{item["id"]}">{title}</a>'
if overview := item.get("overview"):
productions_for_html += f"<br>简介: {overview}"
@@ -279,12 +287,11 @@ async def get_people_details(people_id: int, tmdb_lang: Literal["en-US", "zh-CN"
images = sorted(images, key=lambda x: x.get("width", 0), reverse=True)[:10] # kepp 10 images
media = [{"photo": download_file(f"https://image.tmdb.org/t/p/original{img.get('file_path')}", proxy=PROXY.TMDB)} for img in images]
media = await download_media(media)
- # html = "\n".join([f"<p>{s}</p>" for s in productions_for_html.split("\n")])
telegraph_url = await publish_telegraph(title=name, html=productions_for_html.strip("<br>"), author=name, url=f"https://www.themoviedb.org/person/{people_id}")
description = f"简介: {resp['biography']}" if resp.get("biography") else ""
+ description = description.replace("\\n", "\n")
max_length = CAPTION_LENGTH if media else TEXT_LENGTH
-
if await count_without_entities(f"{texts}\n{description}") > max_length - 10: # long desc
if telegraph_url:
texts += f"\n[查看作品列表]({telegraph_url})"