Commit 3e4c3ef

benny-dou <60535774+benny-dou@users.noreply.github.com>
2025-09-10 18:35:24
fix(tmdb): choose poster language based on movie language
1 parent ca6bf84
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})"