diff --git a/Jellyfin.Plugin.MetaShark.Test/DoubanApiTest.cs b/Jellyfin.Plugin.MetaShark.Test/DoubanApiTest.cs index 410660f..c7bdd0f 100644 --- a/Jellyfin.Plugin.MetaShark.Test/DoubanApiTest.cs +++ b/Jellyfin.Plugin.MetaShark.Test/DoubanApiTest.cs @@ -1,3 +1,4 @@ +using System.Reflection; using System; using System.Collections.Generic; using System.Linq; @@ -147,7 +148,7 @@ namespace Jellyfin.Plugin.MetaShark.Test [TestMethod] public void TestGetCelebritiesByCidAsync() { - var sid = "1340364"; + var cid = "1340364"; var api = new DoubanApi(loggerFactory); @@ -155,7 +156,7 @@ namespace Jellyfin.Plugin.MetaShark.Test { try { - var result = await api.GetCelebrityAsync(sid, CancellationToken.None); + var result = await api.GetCelebrityAsync(cid, CancellationToken.None); TestContext.WriteLine(result.ToJson()); } catch (Exception ex) @@ -164,5 +165,53 @@ namespace Jellyfin.Plugin.MetaShark.Test } }).GetAwaiter().GetResult(); } + + [TestMethod] + public void TestGetCelebrityPhotosAsync() + { + var cid = "1322205"; + + var api = new DoubanApi(loggerFactory); + + Task.Run(async () => + { + try + { + var result = await api.GetCelebrityPhotosAsync(cid, CancellationToken.None); + TestContext.WriteLine(result.ToJson()); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + }).GetAwaiter().GetResult(); + } + + + + [TestMethod] + public void TestParseCelebrityName() + { + + var api = new DoubanApi(loggerFactory); + + + var name = "佩吉·陆 Peggy Lu"; + var result = api.ParseCelebrityName(name); + Assert.AreEqual(result, "佩吉·陆"); + + name = "Antony Coleman Antony Coleman"; + result = api.ParseCelebrityName(name); + Assert.AreEqual(result, "Antony Coleman"); + + name = "Dick Cook"; + result = api.ParseCelebrityName(name); + Assert.AreEqual(result, "Dick Cook"); + + name = "李凡秀"; + result = api.ParseCelebrityName(name); + Assert.AreEqual(result, "李凡秀"); + + } } } diff --git a/Jellyfin.Plugin.MetaShark.Test/EpisodeProviderTest.cs b/Jellyfin.Plugin.MetaShark.Test/EpisodeProviderTest.cs index 7621c07..cbae6ea 100644 --- a/Jellyfin.Plugin.MetaShark.Test/EpisodeProviderTest.cs +++ b/Jellyfin.Plugin.MetaShark.Test/EpisodeProviderTest.cs @@ -30,13 +30,15 @@ namespace Jellyfin.Plugin.MetaShark.Test })); + [TestMethod] public void TestGetMetadata() { - var doubanApi = new DoubanApi(loggerFactory); var tmdbApi = new TmdbApi(loggerFactory); var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); + var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); @@ -52,7 +54,7 @@ namespace Jellyfin.Plugin.MetaShark.Test SeriesProviderIds = new Dictionary() { { MetadataProvider.Tmdb.ToString(), "26707" } }, IsAutomated = false, }; - var provider = new EpisodeProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new EpisodeProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetMetadata(info, CancellationToken.None); Assert.IsNotNull(result); @@ -64,15 +66,17 @@ namespace Jellyfin.Plugin.MetaShark.Test [TestMethod] public void TestFixParseInfo() { + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); + var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); - var provider = new EpisodeProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new EpisodeProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var parseResult = provider.FixParseInfo(new EpisodeInfo() { Path = "/test/[POPGO][Stand_Alone_Complex][05][1080P][BluRay][x264_FLACx2_AC3x1][chs_jpn][D87C36B6].mkv" }); Assert.AreEqual(parseResult.IndexNumber, 5); diff --git a/Jellyfin.Plugin.MetaShark.Test/ImdbApiTest.cs b/Jellyfin.Plugin.MetaShark.Test/ImdbApiTest.cs new file mode 100644 index 0000000..e1ca810 --- /dev/null +++ b/Jellyfin.Plugin.MetaShark.Test/ImdbApiTest.cs @@ -0,0 +1,67 @@ +using System.Reflection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Jellyfin.Plugin.MetaShark.Api; +using Jellyfin.Plugin.MetaShark.Core; +using Jellyfin.Plugin.MetaShark.Model; +using Jellyfin.Plugin.MetaShark.Providers; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; + +namespace Jellyfin.Plugin.MetaShark.Test +{ + [TestClass] + public class ImdbApiTest + { + private TestContext testContextInstance; + + /// + /// Gets or sets the test context which provides + /// information about and functionality for the current test run. + /// + public TestContext TestContext + { + get { return testContextInstance; } + set { testContextInstance = value; } + } + + ILoggerFactory loggerFactory = LoggerFactory.Create(builder => + builder.AddSimpleConsole(options => + { + options.IncludeScopes = true; + options.SingleLine = true; + options.TimestampFormat = "hh:mm:ss "; + })); + + + + [TestMethod] + public void TestCheckPersonNewImdbID() + { + var api = new ImdbApi(loggerFactory); + + Task.Run(async () => + { + try + { + var id = "nm1123737"; + var result = await api.CheckPersonNewIDAsync(id, CancellationToken.None); + Assert.AreEqual("nm0170924", result); + + id = "nm0170924"; + result = await api.CheckPersonNewIDAsync(id, CancellationToken.None); + Assert.AreEqual(null, result); + } + catch (Exception ex) + { + TestContext.WriteLine(ex.Message); + } + }).GetAwaiter().GetResult(); + } + + + } +} diff --git a/Jellyfin.Plugin.MetaShark.Test/MovieImageProviderTest.cs b/Jellyfin.Plugin.MetaShark.Test/MovieImageProviderTest.cs index d4a8d89..1ba365c 100644 --- a/Jellyfin.Plugin.MetaShark.Test/MovieImageProviderTest.cs +++ b/Jellyfin.Plugin.MetaShark.Test/MovieImageProviderTest.cs @@ -29,7 +29,6 @@ namespace Jellyfin.Plugin.MetaShark.Test })); - [TestMethod] public void TestGetMovieImage() { @@ -39,16 +38,17 @@ namespace Jellyfin.Plugin.MetaShark.Test PreferredMetadataLanguage = "zh", ProviderIds = new Dictionary { { BaseProvider.DoubanProviderId, "2043546" }, { MetadataProvider.Tmdb.ToString(), "38142" } } }; - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { - var provider = new MovieImageProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new MovieImageProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetImages(info, CancellationToken.None); Assert.IsNotNull(result); @@ -65,16 +65,17 @@ namespace Jellyfin.Plugin.MetaShark.Test PreferredMetadataLanguage = "zh", ProviderIds = new Dictionary { { MetadataProvider.Tmdb.ToString(), "752" }, { Plugin.ProviderId, MetaSource.Tmdb } } }; - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { - var provider = new MovieImageProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new MovieImageProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetImages(info, CancellationToken.None); Assert.IsNotNull(result); @@ -86,16 +87,17 @@ namespace Jellyfin.Plugin.MetaShark.Test [TestMethod] public void TestGetImageResponse() { - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { - var provider = new MovieImageProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new MovieImageProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetImageResponse("https://img1.doubanio.com/view/photo/m/public/p2893270877.jpg", CancellationToken.None); Assert.IsNotNull(result); diff --git a/Jellyfin.Plugin.MetaShark.Test/MovieProviderTest.cs b/Jellyfin.Plugin.MetaShark.Test/MovieProviderTest.cs index 6da87e9..4327bed 100644 --- a/Jellyfin.Plugin.MetaShark.Test/MovieProviderTest.cs +++ b/Jellyfin.Plugin.MetaShark.Test/MovieProviderTest.cs @@ -29,22 +29,21 @@ namespace Jellyfin.Plugin.MetaShark.Test })); - [TestMethod] public void TestGetMetadata() { - - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { var info = new MovieInfo() { Name = "我", MetadataLanguage = "zh" }; - var provider = new MovieProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new MovieProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetSearchResults(info, CancellationToken.None); Assert.IsNotNull(result); @@ -57,16 +56,17 @@ namespace Jellyfin.Plugin.MetaShark.Test public void TestGetMetadataAnime() { var info = new MovieInfo() { Name = "[SAIO-Raws] もののけ姫 Mononoke Hime [BD 1920x1036 HEVC-10bit OPUSx2 AC3]" }; - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { - var provider = new MovieProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new MovieProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetMetadata(info, CancellationToken.None); Assert.IsNotNull(result); @@ -79,16 +79,17 @@ namespace Jellyfin.Plugin.MetaShark.Test public void TestGetMetadataByTMDB() { var info = new MovieInfo() { Name = "人生大事", MetadataLanguage = "zh", ProviderIds = new Dictionary { { Plugin.ProviderId, MetaSource.Tmdb }, { MetadataProvider.Tmdb.ToString(), "945664" } } }; - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { - var provider = new MovieProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new MovieProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetMetadata(info, CancellationToken.None); Assert.IsNotNull(result); diff --git a/Jellyfin.Plugin.MetaShark.Test/PersonProviderTest.cs b/Jellyfin.Plugin.MetaShark.Test/PersonProviderTest.cs index c48054e..c33f422 100644 --- a/Jellyfin.Plugin.MetaShark.Test/PersonProviderTest.cs +++ b/Jellyfin.Plugin.MetaShark.Test/PersonProviderTest.cs @@ -28,22 +28,21 @@ namespace Jellyfin.Plugin.MetaShark.Test })); - [TestMethod] public void TestGetMetadata() { - - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { var info = new PersonLookupInfo() { ProviderIds = new Dictionary() { { BaseProvider.DoubanProviderId, "1016771" } } }; - var provider = new PersonProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new PersonProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetMetadata(info, CancellationToken.None); Assert.IsNotNull(result); @@ -55,18 +54,18 @@ namespace Jellyfin.Plugin.MetaShark.Test [TestMethod] public void TestGetMetadataByTmdb() { - - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { var info = new PersonLookupInfo() { ProviderIds = new Dictionary() { { MetadataProvider.Tmdb.ToString(), "78871" } } }; - var provider = new PersonProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new PersonProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetMetadata(info, CancellationToken.None); Assert.IsNotNull(result); diff --git a/Jellyfin.Plugin.MetaShark.Test/SeasonProviderTest.cs b/Jellyfin.Plugin.MetaShark.Test/SeasonProviderTest.cs index 53a8798..c405314 100644 --- a/Jellyfin.Plugin.MetaShark.Test/SeasonProviderTest.cs +++ b/Jellyfin.Plugin.MetaShark.Test/SeasonProviderTest.cs @@ -28,21 +28,21 @@ namespace Jellyfin.Plugin.MetaShark.Test })); - [TestMethod] public void TestGetMetadata() { var info = new SeasonInfo() { Name = "第 18 季", IndexNumber = 18, SeriesProviderIds = new Dictionary() { { BaseProvider.DoubanProviderId, "2059529" }, { MetadataProvider.Tmdb.ToString(), "34860" } } }; - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { - var provider = new SeasonProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new SeasonProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetMetadata(info, CancellationToken.None); Assert.IsNotNull(result); @@ -55,14 +55,15 @@ namespace Jellyfin.Plugin.MetaShark.Test public void TestGuessSeasonNumberByFileName() { var info = new SeasonInfo() { }; - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); - var provider = new SeasonProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new SeasonProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = provider.GuessSeasonNumberByDirectoryName("/data/downloads/jellyfin/tv/向往的生活/第2季"); Assert.AreEqual(result, 2); @@ -88,15 +89,17 @@ namespace Jellyfin.Plugin.MetaShark.Test [TestMethod] public void TestGuestDoubanSeasonByYearAsync() { - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); + Task.Run(async () => { - var provider = new SeasonProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new SeasonProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GuestDoubanSeasonByYearAsync("机动战士高达0083 星尘的回忆", 1991, null, CancellationToken.None); Assert.AreEqual(result, "1766564"); }).GetAwaiter().GetResult(); diff --git a/Jellyfin.Plugin.MetaShark.Test/SeriesImageProviderTest.cs b/Jellyfin.Plugin.MetaShark.Test/SeriesImageProviderTest.cs index 62c1dd7..9efd3e7 100644 --- a/Jellyfin.Plugin.MetaShark.Test/SeriesImageProviderTest.cs +++ b/Jellyfin.Plugin.MetaShark.Test/SeriesImageProviderTest.cs @@ -29,8 +29,6 @@ namespace Jellyfin.Plugin.MetaShark.Test })); - - [TestMethod] public void TestGetMovieImageFromTMDB() { @@ -39,16 +37,17 @@ namespace Jellyfin.Plugin.MetaShark.Test PreferredMetadataLanguage = "zh", ProviderIds = new Dictionary { { MetadataProvider.Tmdb.ToString(), "67534" }, { Plugin.ProviderId, MetaSource.Tmdb } } }; - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { - var provider = new SeriesImageProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new SeriesImageProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetImages(info, CancellationToken.None); Assert.IsNotNull(result); diff --git a/Jellyfin.Plugin.MetaShark.Test/SeriesProviderTest.cs b/Jellyfin.Plugin.MetaShark.Test/SeriesProviderTest.cs index c35319d..05a1dd2 100644 --- a/Jellyfin.Plugin.MetaShark.Test/SeriesProviderTest.cs +++ b/Jellyfin.Plugin.MetaShark.Test/SeriesProviderTest.cs @@ -27,21 +27,21 @@ namespace Jellyfin.Plugin.MetaShark.Test })); - [TestMethod] public void TestGetMetadata() { var info = new SeriesInfo() { Name = "一年一度喜剧大赛" }; - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { - var provider = new SeriesProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new SeriesProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetMetadata(info, CancellationToken.None); Assert.IsNotNull(result); @@ -54,16 +54,17 @@ namespace Jellyfin.Plugin.MetaShark.Test public void TestGetAnimeMetadata() { var info = new SeriesInfo() { Name = "命运-冠位嘉年华" }; - var doubanApi = new DoubanApi(loggerFactory); - var tmdbApi = new TmdbApi(loggerFactory); - var omdbApi = new OmdbApi(loggerFactory); var httpClientFactory = new DefaultHttpClientFactory(); var libraryManagerStub = new Mock(); var httpContextAccessorStub = new Mock(); + var doubanApi = new DoubanApi(loggerFactory); + var tmdbApi = new TmdbApi(loggerFactory); + var omdbApi = new OmdbApi(loggerFactory); + var imdbApi = new ImdbApi(loggerFactory); Task.Run(async () => { - var provider = new SeriesProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi); + var provider = new SeriesProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi, imdbApi); var result = await provider.GetMetadata(info, CancellationToken.None); Assert.AreEqual(result.Item.Name, "命运/冠位指定嘉年华 公元2020奥林匹亚英灵限界大祭"); Assert.AreEqual(result.Item.OriginalTitle, "Fate/Grand Carnival"); diff --git a/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs b/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs index f65e5e8..794a394 100644 --- a/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs +++ b/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs @@ -67,6 +67,7 @@ namespace Jellyfin.Plugin.MetaShark.Api Regex regImgHost = new Regex(@"\/\/(img\d+?)\.", RegexOptions.Compiled); // 匹配除了换行符之外所有空白 Regex regOverviewSpace = new Regex(@"\n[^\S\n]+", RegexOptions.Compiled); + Regex regPhotoId = new Regex(@"/photo/(\d+?)/", RegexOptions.Compiled); // 默认200毫秒请求1次 private TimeLimiter _defaultTimeConstraint = TimeLimiter.GetFromMaxCountByInterval(1, TimeSpan.FromMilliseconds(200)); @@ -442,8 +443,7 @@ namespace Jellyfin.Plugin.MetaShark.Api var celebrityImgStr = node.GetAttr("div.avatar", "style") ?? string.Empty; var celebrityImg = celebrityImgStr.GetMatchGroup(this.regBackgroundImage); var celebrityNameStr = node.GetText("div.info a.name") ?? string.Empty; - var arr = celebrityNameStr.Split(" "); - var celebrityName = arr.Length > 1 ? arr[0].Trim() : celebrityNameStr; + var celebrityName = this.ParseCelebrityName(celebrityNameStr); // 有时存在演员信息缺少名字的 if (string.IsNullOrEmpty(celebrityName)) { @@ -502,8 +502,8 @@ namespace Jellyfin.Plugin.MetaShark.Api { var img = contentNode.GetAttr("#headline .nbg img", "src") ?? string.Empty; var nameStr = contentNode.GetText("h1") ?? string.Empty; - var arr = nameStr.Split(" "); - var name = arr.Length > 1 ? arr[0] : nameStr; + var name = this.ParseCelebrityName(nameStr); + var englishName = nameStr.Replace(name, "").Trim(); var intro = contentNode.GetText("#intro span.all") ?? string.Empty; if (string.IsNullOrEmpty(intro)) @@ -534,7 +534,8 @@ namespace Jellyfin.Plugin.MetaShark.Api celebrity.Gender = gender; celebrity.Birthdate = birthdate; celebrity.Enddate = enddate; - celebrity.Nickname = nickname; + celebrity.NickName = nickname; + celebrity.EnglishName = englishName; celebrity.Imdb = imdb; celebrity.Birthplace = birthplace; celebrity.Name = name; @@ -551,6 +552,106 @@ namespace Jellyfin.Plugin.MetaShark.Api } + public async Task> GetCelebrityPhotosAsync(string cid, CancellationToken cancellationToken) + { + var list = new List(); + if (string.IsNullOrEmpty(cid)) + { + return list; + } + + var cacheKey = $"celebrity_photo_{cid}"; + var expiredOption = new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30) }; + if (_memoryCache.TryGetValue>(cacheKey, out var photos)) + { + return photos; + } + + await LimitRequestFrequently(); + + try + { + var url = $"https://movie.douban.com/celebrity/{cid}/photos/"; + var response = await httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); + if (!response.IsSuccessStatusCode) + { + return list; + } + + var body = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + var context = BrowsingContext.New(); + var doc = await context.OpenAsync(req => req.Content(body), cancellationToken).ConfigureAwait(false); + var elements = doc.QuerySelectorAll(".poster-col3>li"); + + foreach (var node in elements) + { + + var href = node.QuerySelector("a")?.GetAttribute("href") ?? string.Empty; + var id = href.GetMatchGroup(this.regPhotoId); + var raw = node.QuerySelector("img")?.GetAttribute("src") ?? string.Empty; + var size = node.GetText("div.prop") ?? string.Empty; + + var photo = new DoubanPhoto(); + photo.Id = id; + photo.Size = size; + photo.Raw = raw; + if (!string.IsNullOrEmpty(size)) + { + var arr = size.Split('x'); + if (arr.Length == 2) + { + photo.Width = arr[0].ToInt(); + photo.Height = arr[1].ToInt(); + } + } + + list.Add(photo); + } + + _memoryCache.Set>(cacheKey, list, expiredOption); + } + catch (Exception ex) + { + this._logger.LogError(ex, "GetCelebrityPhotosAsync error. cid: {0}", cid); + } + + return list; + } + + public string ParseCelebrityName(string nameString) + { + if (string.IsNullOrEmpty(nameString)) + { + return string.Empty; + } + + // 只有中文名情况 + var idx = nameString.IndexOf(" ", StringComparison.OrdinalIgnoreCase); + if (idx < 0) + { + return nameString.Trim(); + } + + // 中英名混合情况 + var firstName = nameString.Substring(0, idx); + if (firstName.HasChinese()) + { + return firstName.Trim(); + } + + // 英文名重复两次的情况 + var nextIndex = nameString[idx..].IndexOf(firstName, StringComparison.OrdinalIgnoreCase); + if (nextIndex >= 0) + { + nextIndex = idx + nextIndex; + return nameString[..nextIndex].Trim(); + } + + // 只有英文名情况 + return nameString.Trim(); + } + + public async Task> SearchCelebrityAsync(string keyword, CancellationToken cancellationToken) { var list = new List(); @@ -561,8 +662,7 @@ namespace Jellyfin.Plugin.MetaShark.Api var cacheKey = $"search_celebrity_{keyword}"; var expiredOption = new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30) }; - List searchResult; - if (_memoryCache.TryGetValue>(cacheKey, out searchResult)) + if (_memoryCache.TryGetValue>(cacheKey, out var searchResult)) { return searchResult; } @@ -613,8 +713,7 @@ namespace Jellyfin.Plugin.MetaShark.Api var cacheKey = $"photo_{sid}"; var expiredOption = new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30) }; - List photos; - if (_memoryCache.TryGetValue>(cacheKey, out photos)) + if (_memoryCache.TryGetValue>(cacheKey, out var photos)) { return photos; } diff --git a/Jellyfin.Plugin.MetaShark/Api/ImdbApi.cs b/Jellyfin.Plugin.MetaShark/Api/ImdbApi.cs new file mode 100644 index 0000000..dfdadfb --- /dev/null +++ b/Jellyfin.Plugin.MetaShark/Api/ImdbApi.cs @@ -0,0 +1,129 @@ +using Jellyfin.Plugin.MetaShark.Core; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Logging; +using System; +using System.Linq; +using System.Net.Http; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; + +namespace Jellyfin.Plugin.MetaShark.Api +{ + public class ImdbApi : IDisposable + { + private readonly ILogger _logger; + private readonly IMemoryCache _memoryCache; + private readonly HttpClient httpClient; + + Regex regId = new Regex(@"/(tt\d+)", RegexOptions.Compiled); + Regex regPersonId = new Regex(@"/(nm\d+)", RegexOptions.Compiled); + + public ImdbApi(ILoggerFactory loggerFactory) + { + _logger = loggerFactory.CreateLogger(); + _memoryCache = new MemoryCache(new MemoryCacheOptions()); + + var handler = new HttpClientHandler() + { + AllowAutoRedirect = false + }; + httpClient = new HttpClient(handler); + httpClient.Timeout = TimeSpan.FromSeconds(5); + } + + /// + /// 通过imdb获取信息(会返回最新的imdb id) + /// + public async Task CheckNewIDAsync(string id, CancellationToken cancellationToken) + { + var cacheKey = $"CheckNewImdbID_{id}"; + var expiredOption = new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30) }; + if (this._memoryCache.TryGetValue(cacheKey, out var item)) + { + return item; + } + + try + { + var url = $"https://www.imdb.com/title/{id}/"; + var resp = await this.httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); + if (resp.Headers.TryGetValues("Location", out var values)) + { + var location = values.First(); + var newId = location.GetMatchGroup(this.regId); + if (!string.IsNullOrEmpty(newId)) + { + item = newId; + } + } + this._memoryCache.Set(cacheKey, item, expiredOption); + return item; + } + catch (Exception ex) + { + this._logger.LogError(ex, "CheckNewImdbID error. id: {0}", id); + this._memoryCache.Set(cacheKey, null, expiredOption); + return null; + } + + return null; + } + + /// + /// 通过imdb获取信息(会返回最新的imdb id) + /// + public async Task CheckPersonNewIDAsync(string id, CancellationToken cancellationToken) + { + var cacheKey = $"CheckPersonNewImdbID_{id}"; + var expiredOption = new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30) }; + if (this._memoryCache.TryGetValue(cacheKey, out var item)) + { + return item; + } + + try + { + var url = $"https://www.imdb.com/name/{id}/"; + var resp = await this.httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); + if (resp.Headers.TryGetValues("Location", out var values)) + { + var location = values.First(); + var newId = location.GetMatchGroup(this.regPersonId); + if (!string.IsNullOrEmpty(newId)) + { + item = newId; + } + } + this._memoryCache.Set(cacheKey, item, expiredOption); + return item; + } + catch (Exception ex) + { + this._logger.LogError(ex, "CheckPersonNewImdbID error. id: {0}", id); + this._memoryCache.Set(cacheKey, null, expiredOption); + return null; + } + } + + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _memoryCache.Dispose(); + } + } + + private bool IsEnable() + { + return Plugin.Instance?.Configuration.EnableTmdb ?? true; + } + } +} diff --git a/Jellyfin.Plugin.MetaShark/Api/OmdbApi.cs b/Jellyfin.Plugin.MetaShark/Api/OmdbApi.cs index 436c376..af6fc37 100644 --- a/Jellyfin.Plugin.MetaShark/Api/OmdbApi.cs +++ b/Jellyfin.Plugin.MetaShark/Api/OmdbApi.cs @@ -1,15 +1,9 @@ -using Jellyfin.Extensions.Json; -using Jellyfin.Plugin.MetaShark.Api.Http; -using Jellyfin.Plugin.MetaShark.Model; +using Jellyfin.Plugin.MetaShark.Model; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; using System; -using System.Collections.Generic; -using System.Linq; using System.Net.Http; using System.Net.Http.Json; -using System.Text; -using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -45,8 +39,7 @@ namespace Jellyfin.Plugin.MetaShark.Api var cacheKey = $"GetByImdbID_{id}"; var expiredOption = new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30) }; - OmdbItem? item; - if (this._memoryCache.TryGetValue(cacheKey, out item)) + if (this._memoryCache.TryGetValue(cacheKey, out var item)) { return item; } diff --git a/Jellyfin.Plugin.MetaShark/Model/DoubanSubject.cs b/Jellyfin.Plugin.MetaShark/Model/DoubanSubject.cs index 80d047b..4dcd997 100644 --- a/Jellyfin.Plugin.MetaShark/Model/DoubanSubject.cs +++ b/Jellyfin.Plugin.MetaShark/Model/DoubanSubject.cs @@ -122,7 +122,8 @@ namespace Jellyfin.Plugin.MetaShark.Model public string Birthdate { get; set; } public string Enddate { get; set; } public string Birthplace { get; set; } - public string Nickname { get; set; } + public string NickName { get; set; } + public string EnglishName { get; set; } public string Imdb { get; set; } public string Site { get; set; } @@ -143,6 +144,20 @@ namespace Jellyfin.Plugin.MetaShark.Model _roleType = value; } } + + public string? DisplayOriginalName + { + get + { + // 外国人才显示英文名 + if (Name.Contains("·") && Birthplace != null && !Birthplace.Contains("中国")) + { + return EnglishName; + } + + return null; + } + } } public class DoubanPhoto diff --git a/Jellyfin.Plugin.MetaShark/Providers/BaseProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/BaseProvider.cs index be337da..d3235c1 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/BaseProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/BaseProvider.cs @@ -44,6 +44,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers protected readonly DoubanApi _doubanApi; protected readonly TmdbApi _tmdbApi; protected readonly OmdbApi _omdbApi; + protected readonly ImdbApi _imdbApi; protected readonly ILibraryManager _libraryManager; protected readonly IHttpContextAccessor _httpContextAccessor; @@ -58,43 +59,12 @@ namespace Jellyfin.Plugin.MetaShark.Providers } } - protected string RequestDomain - { - get - { - if (_httpContextAccessor.HttpContext != null) - { - return _httpContextAccessor.HttpContext.Request.Scheme + System.Uri.SchemeDelimiter + _httpContextAccessor.HttpContext.Request.Host; - } - else - { - return string.Empty; - } - - } - } - - protected string RequestPath - { - get - { - if (_httpContextAccessor.HttpContext != null) - { - return _httpContextAccessor.HttpContext.Request.Path.ToString(); - } - else - { - return string.Empty; - } - - } - } - - protected BaseProvider(IHttpClientFactory httpClientFactory, ILogger logger, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) + protected BaseProvider(IHttpClientFactory httpClientFactory, ILogger logger, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) { this._doubanApi = doubanApi; this._tmdbApi = tmdbApi; this._omdbApi = omdbApi; + this._imdbApi = imdbApi; this._libraryManager = libraryManager; this._logger = logger; this._httpClientFactory = httpClientFactory; diff --git a/Jellyfin.Plugin.MetaShark/Providers/EpisodeImageProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/EpisodeImageProvider.cs index 4e1c700..ce10c56 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/EpisodeImageProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/EpisodeImageProvider.cs @@ -19,8 +19,8 @@ namespace Jellyfin.Plugin.MetaShark.Providers { public class EpisodeImageProvider : BaseProvider, IRemoteImageProvider { - public EpisodeImageProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) - : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi) + public EpisodeImageProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) + : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi, imdbApi) { } diff --git a/Jellyfin.Plugin.MetaShark/Providers/EpisodeProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/EpisodeProvider.cs index 2048bf4..0bbb34d 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/EpisodeProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/EpisodeProvider.cs @@ -22,8 +22,8 @@ namespace Jellyfin.Plugin.MetaShark.Providers { private readonly IMemoryCache _memoryCache; - public EpisodeProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) - : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi) + public EpisodeProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) + : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi, imdbApi) { this._memoryCache = new MemoryCache(new MemoryCacheOptions()); } diff --git a/Jellyfin.Plugin.MetaShark/Providers/MovieImageProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/MovieImageProvider.cs index c483ad6..da672b5 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/MovieImageProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/MovieImageProvider.cs @@ -21,8 +21,8 @@ namespace Jellyfin.Plugin.MetaShark.Providers { public class MovieImageProvider : BaseProvider, IRemoteImageProvider { - public MovieImageProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) - : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi) + public MovieImageProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) + : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi, imdbApi) { } @@ -57,7 +57,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers var res = new List { new RemoteImageInfo { - ProviderName = primary.Name, + ProviderName = this.Name, Url = this.GetProxyImageUrl(primary.ImgMiddle), Type = ImageType.Primary, }, diff --git a/Jellyfin.Plugin.MetaShark/Providers/MovieProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/MovieProvider.cs index 72ec7c6..70a02a6 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/MovieProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/MovieProvider.cs @@ -23,8 +23,8 @@ namespace Jellyfin.Plugin.MetaShark.Providers { public class MovieProvider : BaseProvider, IRemoteMetadataProvider { - public MovieProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) - : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi) + public MovieProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) + : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi, imdbApi) { } diff --git a/Jellyfin.Plugin.MetaShark/Providers/PersonImageProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/PersonImageProvider.cs index 76649ff..f853762 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/PersonImageProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/PersonImageProvider.cs @@ -7,7 +7,6 @@ using MediaBrowser.Model.Providers; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System.Collections.Generic; -using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -16,8 +15,8 @@ namespace Jellyfin.Plugin.MetaShark.Providers { public class PersonImageProvider : BaseProvider, IRemoteImageProvider { - public PersonImageProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) - : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi) + public PersonImageProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) + : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi, imdbApi) { } @@ -36,6 +35,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers /// public async Task> GetImages(BaseItem item, CancellationToken cancellationToken) { + var list = new List(); var cid = item.GetProviderId(DoubanProviderId); var metaSource = item.GetProviderId(Plugin.ProviderId); this.Log($"GetImages for item: {item.Name} [metaSource]: {metaSource}"); @@ -44,19 +44,36 @@ namespace Jellyfin.Plugin.MetaShark.Providers var celebrity = await this._doubanApi.GetCelebrityAsync(cid, cancellationToken).ConfigureAwait(false); if (celebrity != null) { - return new List { - new RemoteImageInfo - { - ProviderName = celebrity.Name, - Url = this.GetProxyImageUrl(celebrity.Img), - Type = ImageType.Primary - } - }; + list.Add(new RemoteImageInfo + { + ProviderName = this.Name, + Url = this.GetProxyImageUrl(celebrity.Img), + Type = ImageType.Primary, + }); } + + var photos = await this._doubanApi.GetCelebrityPhotosAsync(cid, cancellationToken).ConfigureAwait(false); + photos.ForEach(x => + { + // 过滤不是竖图 + if (x.Width < 400 || x.Height < x.Width * 1.3) + { + return; + } + + list.Add(new RemoteImageInfo + { + ProviderName = this.Name, + Url = this.GetProxyImageUrl(x.Raw), + Width = x.Width, + Height = x.Height, + Type = ImageType.Primary, + }); + }); } this.Log($"Got images failed because the images of \"{item.Name}\" is empty!"); - return new List(); + return list; } } diff --git a/Jellyfin.Plugin.MetaShark/Providers/PersonProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/PersonProvider.cs index 2906638..3b8e34f 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/PersonProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/PersonProvider.cs @@ -23,8 +23,8 @@ namespace Jellyfin.Plugin.MetaShark.Providers /// public class PersonProvider : BaseProvider, IRemoteMetadataProvider { - public PersonProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) - : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi) + public PersonProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) + : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi, imdbApi) { } @@ -89,6 +89,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers var item = new Person { // Name = c.Name.Trim(), // 名称需保持和info.Name一致,不然会导致关联不到影片,自动被删除 + OriginalTitle = c.DisplayOriginalName, // 外国人显示英文名 HomePageUrl = c.Site, Overview = c.Intro, }; @@ -109,6 +110,11 @@ namespace Jellyfin.Plugin.MetaShark.Providers item.SetProviderId(DoubanProviderId, cid); if (!string.IsNullOrEmpty(c.Imdb)) { + var newImdbId = await this._imdbApi.CheckPersonNewIDAsync(c.Imdb, cancellationToken).ConfigureAwait(false); + if (!string.IsNullOrEmpty(newImdbId)) + { + c.Imdb = newImdbId; + } item.SetProviderId(MetadataProvider.Imdb, c.Imdb); // 通过imdb获取TMDB id var findResult = await this._tmdbApi.FindByExternalIdAsync(c.Imdb, FindExternalSource.Imdb, info.MetadataLanguage, cancellationToken).ConfigureAwait(false); diff --git a/Jellyfin.Plugin.MetaShark/Providers/SeasonImageProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/SeasonImageProvider.cs index b12723f..7131f95 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/SeasonImageProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/SeasonImageProvider.cs @@ -21,8 +21,8 @@ namespace Jellyfin.Plugin.MetaShark.Providers { public class SeasonImageProvider : BaseProvider, IRemoteImageProvider { - public SeasonImageProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) - : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi) + public SeasonImageProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) + : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi, imdbApi) { } diff --git a/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs index 44369bc..8275451 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs @@ -20,8 +20,8 @@ namespace Jellyfin.Plugin.MetaShark.Providers public class SeasonProvider : BaseProvider, IRemoteMetadataProvider { - public SeasonProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) - : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi) + public SeasonProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) + : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi, imdbApi) { } diff --git a/Jellyfin.Plugin.MetaShark/Providers/SeriesImageProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/SeriesImageProvider.cs index 7cfd877..cca62d2 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/SeriesImageProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/SeriesImageProvider.cs @@ -21,8 +21,8 @@ namespace Jellyfin.Plugin.MetaShark.Providers { public class SeriesImageProvider : BaseProvider, IRemoteImageProvider { - public SeriesImageProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) - : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi) + public SeriesImageProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) + : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi, imdbApi) { } @@ -57,7 +57,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers var res = new List { new RemoteImageInfo { - ProviderName = primary.Name, + ProviderName = this.Name, Url = this.GetProxyImageUrl(primary.ImgMiddle), Type = ImageType.Primary, }, diff --git a/Jellyfin.Plugin.MetaShark/Providers/SeriesProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/SeriesProvider.cs index 7800cff..e306176 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/SeriesProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/SeriesProvider.cs @@ -22,8 +22,8 @@ namespace Jellyfin.Plugin.MetaShark.Providers { public class SeriesProvider : BaseProvider, IRemoteMetadataProvider { - public SeriesProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) - : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi) + public SeriesProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, IHttpContextAccessor httpContextAccessor, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi, ImdbApi imdbApi) + : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, httpContextAccessor, doubanApi, tmdbApi, omdbApi, imdbApi) { } diff --git a/Jellyfin.Plugin.MetaShark/ServiceRegistrator.cs b/Jellyfin.Plugin.MetaShark/ServiceRegistrator.cs index 42864c6..7c0b590 100644 --- a/Jellyfin.Plugin.MetaShark/ServiceRegistrator.cs +++ b/Jellyfin.Plugin.MetaShark/ServiceRegistrator.cs @@ -34,6 +34,10 @@ namespace Jellyfin.Plugin.MetaShark { return new OmdbApi(ctx.GetRequiredService()); }); + serviceCollection.AddSingleton((ctx) => + { + return new ImdbApi(ctx.GetRequiredService()); + }); } } }