From 4f4433fe63559c1df59e83dc7d3e04dd9d0f5927 Mon Sep 17 00:00:00 2001 From: cxfksword <718792+cxfksword@users.noreply.github.com> Date: Sat, 25 Feb 2023 09:58:42 +0800 Subject: [PATCH] Optimize identity --- Jellyfin.Plugin.MetaShark/Core/Utils.cs | 24 ++++++++++++ .../Providers/BaseProvider.cs | 37 ++++++++++++++++++- .../Providers/SeasonProvider.cs | 12 +++++- 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/Jellyfin.Plugin.MetaShark/Core/Utils.cs b/Jellyfin.Plugin.MetaShark/Core/Utils.cs index 448fad5..e082f7e 100644 --- a/Jellyfin.Plugin.MetaShark/Core/Utils.cs +++ b/Jellyfin.Plugin.MetaShark/Core/Utils.cs @@ -45,5 +45,29 @@ namespace Jellyfin.Plugin.MetaShark.Core return null; } + + /// + /// 转换中文数字 + /// + public static string? ToChineseNumber(int? number) + { + if (number is null) return null; + + var chineseNumberMap = new Dictionary() { + {'1','一'}, + {'2','二'}, + {'3','三'}, + {'4','四'}, + {'5','五'}, + {'6','六'}, + {'7','七'}, + {'8','八'}, + {'9','九'}, + {'0','零'}, + }; + + var numberArr = $"{number}".ToCharArray().Select(x => chineseNumberMap.ContainsKey(x) ? chineseNumberMap[x] : x).ToArray(); + return new string(numberArr); + } } } diff --git a/Jellyfin.Plugin.MetaShark/Providers/BaseProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/BaseProvider.cs index 58590c8..b708255 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/BaseProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/BaseProvider.cs @@ -51,7 +51,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers protected readonly IHttpContextAccessor _httpContextAccessor; protected Regex regMetaSourcePrefix = new Regex(@"^\[.+\]", RegexOptions.Compiled); - protected Regex regSeasonNameSuffix = new Regex(@"\s第[0-9一二三四五六七八九十]+?季$", RegexOptions.Compiled); + protected Regex regSeasonNameSuffix = new Regex(@"\s第[0-9一二三四五六七八九十]+?季$|(? GuestDoubanSeasonBySeasonNameAsync(string name, int? seasonNumber, CancellationToken cancellationToken) + { + if (seasonNumber is null or 0) + { + return null; + } + + var chineseSeasonNumber = Utils.ToChineseNumber(seasonNumber); + if (string.IsNullOrEmpty(chineseSeasonNumber)) + { + return null; + } + + var seasonName = $"{name}{seasonNumber}"; + var chineseSeasonName = $"{name} 第{chineseSeasonNumber}季"; + if (seasonNumber == 1) + { + seasonName = name; + } + this.Log($"GuestDoubanSeasonBySeasonNameAsync of [name]: {seasonName} 或 {chineseSeasonName}"); + + // 通过名称精确匹配 + var result = await this._doubanApi.SearchAsync(name, cancellationToken).ConfigureAwait(false); + var item = result.Where(x => x.Category == "电视剧" && x.Rating > 0 && (x.Name == seasonName || x.Name == chineseSeasonName)).FirstOrDefault(); + if (item != null && !string.IsNullOrEmpty(item.Sid)) + { + this.Log($"Found douban [id]: {item.Name}({item.Sid})"); + return item.Sid; + } + + + this.Log($"GuestDoubanSeasonBySeasonNameAsync not found!"); + return null; + } + protected async Task GuestByTmdbAsync(string name, int? year, ItemLookupInfo info, CancellationToken cancellationToken) { diff --git a/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs index 06b3d9a..6c5654b 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs @@ -165,7 +165,17 @@ namespace Jellyfin.Plugin.MetaShark.Providers if (!string.IsNullOrEmpty(seriesName) && seasonYear > 0) { - return await this.GuestDoubanSeasonByYearAsync(seriesName, seasonYear, cancellationToken).ConfigureAwait(false); + var seasonSid = await this.GuestDoubanSeasonByYearAsync(seriesName, seasonYear, cancellationToken).ConfigureAwait(false); + if (!string.IsNullOrEmpty(seasonSid)) + { + return seasonSid; + } + } + + // 通过季名匹配douban id,作为关闭tmdb api/api超时的后备方法使用 + if (!string.IsNullOrEmpty(seriesName) && seasonNumber.HasValue && seasonNumber > 0) + { + return await this.GuestDoubanSeasonBySeasonNameAsync(seriesName, seasonNumber, cancellationToken).ConfigureAwait(false); } return null;