fix: 兼容 Jellyfin zho 语言代码并增强搜索日志

- 修复:优化 NormalizeLanguage 逻辑,增加对 zho, zh, chi 等多种语言代码映射的支持,解决 Jellyfin 10.11+ 搜索失效问题。
- 增强:在搜索日志中显式输出目标文件名和语言。
- 监控:引入 Stopwatch 记录并输出文件哈希计算耗时,便于排查性能瓶颈。
- 诊断:在日志中记录完整的异常类型信息。
- 日志:恢复字幕接口原始返回内容的 Info 级别记录,方便问题排查。
This commit is contained in:
Meiam
2025-12-22 15:28:39 +08:00
parent 01c6911855
commit b88712ead1
5 changed files with 225 additions and 269 deletions

View File

@@ -7,6 +7,7 @@ using MediaBrowser.Model.Providers;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
@@ -92,16 +93,21 @@ namespace Jellyfin.MeiamSub.Shooter
{
var language = NormalizeLanguage(request.Language);
_logger.LogInformation("{Provider} Search | Target -> {File} | Language -> {Lang}", Name, Path.GetFileName(request.MediaPath), language);
if (language != "chi" && language != "eng")
{
_logger.LogInformation("{Provider} Search | Summary -> Language not supported, skip search.", Name);
return Array.Empty<RemoteSubtitleInfo>();
}
FileInfo fileInfo = new(request.MediaPath);
var stopWatch = Stopwatch.StartNew();
var hash = await ComputeFileHashAsync(fileInfo);
stopWatch.Stop();
_logger.LogInformation($"{Name} Search | FileHash -> {hash}");
_logger.LogInformation("{Provider} Search | FileHash -> {Hash} (Took {Elapsed}ms)", Name, hash, stopWatch.ElapsedMilliseconds);
var formData = new Dictionary<string, string>
{
@@ -121,18 +127,18 @@ namespace Jellyfin.MeiamSub.Shooter
// 发送 POST 请求
var response = await httpClient.PostAsync(ApiUrl, content);
_logger.LogDebug($"{Name} Search | Response -> {JsonSerializer.Serialize(response)}");
_logger.LogInformation($"{Name} Search | Response -> {JsonSerializer.Serialize(response)}");
// 处理响应
if (response.IsSuccessStatusCode && response.Content.Headers.Any(m => m.Value.Contains("application/json; charset=utf-8")))
{
var responseBody = await response.Content.ReadAsStringAsync();
_logger.LogDebug($"{Name} Search | ResponseBody -> {responseBody} ");
_logger.LogInformation($"{Name} Search | ResponseBody -> {responseBody} ");
var subtitles = JsonSerializer.Deserialize<List<SubtitleResponseRoot>>(responseBody);
_logger.LogDebug($"{Name} Search | Response -> {JsonSerializer.Serialize(subtitles)}");
_logger.LogInformation($"{Name} Search | Response -> {JsonSerializer.Serialize(subtitles)}");
if (subtitles != null)
{
@@ -171,7 +177,7 @@ namespace Jellyfin.MeiamSub.Shooter
}
catch (Exception ex)
{
_logger.LogError(ex, "{0} Search | Error -> {1}", Name, ex.Message);
_logger.LogError(ex, "{Provider} Search | Exception -> [{Type}] {Message}", Name, ex.GetType().Name, ex.Message);
}
_logger.LogInformation($"{Name} Search | Summary -> Get 0 Subtitles");
@@ -307,11 +313,15 @@ namespace Jellyfin.MeiamSub.Shooter
if (language.Equals("zh-CN", StringComparison.OrdinalIgnoreCase) ||
language.Equals("zh-TW", StringComparison.OrdinalIgnoreCase) ||
language.Equals("zh-HK", StringComparison.OrdinalIgnoreCase))
language.Equals("zh-HK", StringComparison.OrdinalIgnoreCase) ||
language.Equals("zh", StringComparison.OrdinalIgnoreCase) ||
language.Equals("zho", StringComparison.OrdinalIgnoreCase) ||
language.Equals("chi", StringComparison.OrdinalIgnoreCase))
{
return "chi";
}
if (language.Equals("en", StringComparison.OrdinalIgnoreCase))
if (language.Equals("en", StringComparison.OrdinalIgnoreCase) ||
language.Equals("eng", StringComparison.OrdinalIgnoreCase))
{
return "eng";
}