diff --git a/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs b/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs index c58d880..8455117 100644 --- a/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs +++ b/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs @@ -112,14 +112,13 @@ namespace Jellyfin.Plugin.MetaShark.Api var key = cookieArr[0].Trim(); var value = cookieArr[1].Trim(); - Console.WriteLine($"key={key} value={value}"); try { cookieContainer.Add(new Cookie(key, value, "/", ".douban.com")); } catch (Exception ex) { - Console.WriteLine(ex.Message); + this._logger.LogError(ex, ex.Message); } } } @@ -495,7 +494,6 @@ namespace Jellyfin.Plugin.MetaShark.Api protected void LimitRequestFrequently() { - var startTime = DateTime.Now; lock (_lock) { var ts = DateTime.Now - lastRequestTime; @@ -506,9 +504,6 @@ namespace Jellyfin.Plugin.MetaShark.Api } lastRequestTime = DateTime.Now; } - var endTime = DateTime.Now; - var tt = (endTime - startTime).TotalMilliseconds; - Console.WriteLine(tt); } private string? GetText(IElement el, string css) diff --git a/Jellyfin.Plugin.MetaShark/Api/TmdbApi.cs b/Jellyfin.Plugin.MetaShark/Api/TmdbApi.cs index 1e2be59..fe4cb9e 100644 --- a/Jellyfin.Plugin.MetaShark/Api/TmdbApi.cs +++ b/Jellyfin.Plugin.MetaShark/Api/TmdbApi.cs @@ -27,6 +27,7 @@ namespace Jellyfin.Plugin.MetaShark.Api private readonly ILogger _logger; private readonly IMemoryCache _memoryCache; private readonly TMDbClient _tmDbClient; + private readonly PluginConfiguration _config; /// /// Initializes a new instance of the class. @@ -35,8 +36,8 @@ namespace Jellyfin.Plugin.MetaShark.Api { _logger = loggerFactory.CreateLogger(); _memoryCache = new MemoryCache(new MemoryCacheOptions()); - var config = Plugin.Instance?.Configuration ?? new PluginConfiguration(); - var apiKey = string.IsNullOrEmpty(config.TmdbApiKey) ? DEFAULT_API_KEY : config.TmdbApiKey; + _config = Plugin.Instance?.Configuration ?? new PluginConfiguration(); + var apiKey = string.IsNullOrEmpty(_config.TmdbApiKey) ? DEFAULT_API_KEY : _config.TmdbApiKey; _tmDbClient = new TMDbClient(apiKey); _tmDbClient.RequestTimeout = TimeSpan.FromSeconds(10); // Not really interested in NotFoundException @@ -53,6 +54,11 @@ namespace Jellyfin.Plugin.MetaShark.Api /// The TMDb movie or null if not found. public async Task GetMovieAsync(int tmdbId, string language, string imageLanguages, CancellationToken cancellationToken) { + if (!this._config.EnableTmdb) + { + return null; + } + var key = $"movie-{tmdbId.ToString(CultureInfo.InvariantCulture)}-{language}"; if (_memoryCache.TryGetValue(key, out Movie movie)) { @@ -119,6 +125,11 @@ namespace Jellyfin.Plugin.MetaShark.Api /// The TMDb tv show information or null if not found. public async Task GetSeriesAsync(int tmdbId, string language, string imageLanguages, CancellationToken cancellationToken) { + if (!this._config.EnableTmdb) + { + return null; + } + var key = $"series-{tmdbId.ToString(CultureInfo.InvariantCulture)}-{language}"; if (_memoryCache.TryGetValue(key, out TvShow series)) { @@ -153,10 +164,14 @@ namespace Jellyfin.Plugin.MetaShark.Api /// The TMDb tv season information or null if not found. public async Task GetSeasonAsync(int tvShowId, int seasonNumber, string language, string imageLanguages, CancellationToken cancellationToken) { + if (!this._config.EnableTmdb) + { + return null; + } + var key = $"season-{tvShowId.ToString(CultureInfo.InvariantCulture)}-s{seasonNumber.ToString(CultureInfo.InvariantCulture)}-{language}"; if (_memoryCache.TryGetValue(key, out TvSeason season)) { - Console.WriteLine("#season from cache."); return season; } @@ -223,6 +238,11 @@ namespace Jellyfin.Plugin.MetaShark.Api /// The TMDb person information or null if not found. public async Task GetPersonAsync(int personTmdbId, CancellationToken cancellationToken) { + if (!this._config.EnableTmdb) + { + return null; + } + var key = $"person-{personTmdbId.ToString(CultureInfo.InvariantCulture)}"; if (_memoryCache.TryGetValue(key, out Person person)) { @@ -289,6 +309,11 @@ namespace Jellyfin.Plugin.MetaShark.Api /// The TMDb tv show information. public async Task> SearchSeriesAsync(string name, string language, CancellationToken cancellationToken) { + if (!this._config.EnableTmdb) + { + return new List(); + } + var key = $"searchseries-{name}-{language}"; if (_memoryCache.TryGetValue(key, out SearchContainer series)) { @@ -366,6 +391,11 @@ namespace Jellyfin.Plugin.MetaShark.Api /// The TMDb movie information. public async Task> SearchMovieAsync(string name, int year, string language, CancellationToken cancellationToken) { + if (!this._config.EnableTmdb) + { + return new List(); + } + var key = $"moviesearch-{name}-{year.ToString(CultureInfo.InvariantCulture)}-{language}"; if (_memoryCache.TryGetValue(key, out SearchContainer movies)) { diff --git a/Jellyfin.Plugin.MetaShark/Providers/EpisodeImageProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/EpisodeImageProvider.cs index 11d7487..b53cb4a 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/EpisodeImageProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/EpisodeImageProvider.cs @@ -53,7 +53,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers /// public async Task> GetImages(BaseItem item, CancellationToken cancellationToken) { - Console.WriteLine(item.ProviderIds.ToJson()); this.Log($"GetEpisodeImages for item: {item.Name} number: {item.IndexNumber}"); var episode = (MediaBrowser.Controller.Entities.TV.Episode)item; @@ -81,7 +80,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers var seasonResult = await this._tmdbApi .GetSeasonAsync(seriesTmdbId, seasonNumber.Value, language, language, cancellationToken) .ConfigureAwait(false); - Console.WriteLine($"seasonResult.Episodes.Count={seasonResult?.Episodes.Count}"); if (seasonResult == null || seasonResult.Episodes.Count < episodeNumber.Value) { this.Log($"Not valid season data for seasonNumber: {seasonNumber} episodeNumber: {episodeNumber}"); @@ -90,7 +88,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers var result = new List(); var episodeResult = seasonResult.Episodes[episodeNumber.Value - 1]; - Console.WriteLine(episodeResult.ToJson()); if (!string.IsNullOrEmpty(episodeResult.StillPath)) { result.Add(new RemoteImageInfo diff --git a/Jellyfin.Plugin.MetaShark/Providers/EpisodeProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/EpisodeProvider.cs index 4e3833f..228cbf3 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/EpisodeProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/EpisodeProvider.cs @@ -53,8 +53,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers public async Task> GetMetadata(EpisodeInfo info, CancellationToken cancellationToken) { this.Log($"GetEpisodeMetadata of [name]: {info.Name} number: {info.IndexNumber}"); - Console.WriteLine(info.ToJson()); - Console.WriteLine(info.SeriesProviderIds.ToJson()); var result = new MetadataResult(); // 剧集信息只有tmdb有 @@ -62,17 +60,25 @@ namespace Jellyfin.Plugin.MetaShark.Providers var seasonNumber = info.ParentIndexNumber; // 没有season级目录时,会为null var episodeNumber = info.IndexNumber; var indexNumberEnd = info.IndexNumberEnd; - Console.WriteLine($"seasonNumber:{seasonNumber} episodeNumber:{episodeNumber} indexNumberEnd:{indexNumberEnd}"); if (episodeNumber is null or 0) { // 从文件名获取剧集的indexNumber var fileName = Path.GetFileName(info.Path) ?? string.Empty; episodeNumber = this.GuessEpisodeNumber(episodeNumber, fileName); + if (episodeNumber.HasValue && episodeNumber.Value > 0) + { + result.HasMetadata = true; + result.Item = new Episode + { + IndexNumber = episodeNumber + }; + } this.Log("GuessEpisodeNumber: fileName: {0} episodeNumber: {1}", fileName, episodeNumber); } if (episodeNumber is null or 0 || seasonNumber is null or 0 || string.IsNullOrEmpty(seriesTmdbId)) { + this.Log("Lack meta message. episodeNumber: {0} seasonNumber: {1} seriesTmdbId:{2}", episodeNumber, seasonNumber, seriesTmdbId); return result; } diff --git a/Jellyfin.Plugin.MetaShark/Providers/MovieImageProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/MovieImageProvider.cs index 5f6c0be..83147ed 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/MovieImageProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/MovieImageProvider.cs @@ -51,8 +51,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers /// public async Task> GetImages(BaseItem item, CancellationToken cancellationToken) { - Console.WriteLine(item.ToJson()); - Console.WriteLine(item.ProviderIds.ToJson()); var sid = item.GetProviderId(DoubanProviderId); var metaSource = item.GetProviderId(Plugin.ProviderId); this.Log($"GetImages for item: {item.Name} [metaSource]: {metaSource}"); diff --git a/Jellyfin.Plugin.MetaShark/Providers/MovieProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/MovieProvider.cs index 6e49d0b..2251bdd 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/MovieProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/MovieProvider.cs @@ -88,7 +88,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers this.Log($"GetMovieMetadata of [name]: {info.Name}"); var result = new MetadataResult(); - Console.WriteLine(info.ToJson()); var sid = info.GetProviderId(DoubanProviderId); var tmdbId = info.GetProviderId(MetadataProvider.Tmdb); var metaSource = info.GetProviderId(Plugin.ProviderId); @@ -133,7 +132,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers var movieResult = await this._tmdbApi.FindByExternalIdAsync(subject.Imdb, FindExternalSource.Imdb, null, cancellationToken).ConfigureAwait(false); if (movieResult?.MovieResults != null && movieResult.MovieResults.Count > 0) { - Console.WriteLine(movieResult.MovieResults.ToJson()); this.Log($"GetMovieMetadata of found tmdb [id]: \"{movieResult.MovieResults[0].Id}\""); movie.SetProviderId(MetadataProvider.Tmdb, $"{movieResult.MovieResults[0].Id}"); } diff --git a/Jellyfin.Plugin.MetaShark/Providers/PersonProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/PersonProvider.cs index ea701bd..a7a8c7b 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/PersonProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/PersonProvider.cs @@ -49,7 +49,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers MetadataResult result = new MetadataResult(); var cid = info.GetProviderId(DoubanProviderId); - this.Log($"GetMetadata of [cid]: {cid}"); + this.Log($"GetPersonMetadata of [cid]: {cid}"); if (!string.IsNullOrEmpty(cid)) { @@ -83,7 +83,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers } var personTmdbId = info.GetProviderId(MetadataProvider.Tmdb); - this.Log($"GetMetadata of [personTmdbId]: {personTmdbId}"); + this.Log($"GetPersonMetadata of [personTmdbId]: {personTmdbId}"); if (!string.IsNullOrEmpty(personTmdbId)) { var person = await this._tmdbApi.GetPersonAsync(personTmdbId.ToInt(), cancellationToken).ConfigureAwait(false); diff --git a/Jellyfin.Plugin.MetaShark/Providers/SeasonImageProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/SeasonImageProvider.cs index 978751f..7bdf7ff 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/SeasonImageProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/SeasonImageProvider.cs @@ -80,7 +80,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers // get image form TMDB var seriesTmdbId = Convert.ToInt32(series?.GetProviderId(MetadataProvider.Tmdb), CultureInfo.InvariantCulture); - Console.WriteLine($"seriesTmdbId={seriesTmdbId} season?.IndexNumber={season?.IndexNumber}"); if (seriesTmdbId <= 0 || season?.IndexNumber == null) { return Enumerable.Empty(); @@ -92,7 +91,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers .GetSeasonAsync(seriesTmdbId, season.IndexNumber.Value, language, language, cancellationToken) .ConfigureAwait(false); var posters = seasonResult?.Images?.Posters; - Console.WriteLine(posters?.ToJson()); if (posters == null) { return Enumerable.Empty(); diff --git a/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs index eb790c8..3ed8fa0 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/SeasonProvider.cs @@ -68,9 +68,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers info.SeriesProviderIds.TryGetValue(MetadataProvider.Tmdb.ToString(), out var seriesTmdbId); info.SeriesProviderIds.TryGetValue(Plugin.ProviderId, out var metaSource); info.SeriesProviderIds.TryGetValue(DoubanProviderId, out var sid); - Console.WriteLine(info.SeriesProviderIds.ToJson()); var seasonNumber = info.IndexNumber; - Console.WriteLine($"seriesTmdbId: {seriesTmdbId} seasonNumber: {seasonNumber}"); if (metaSource == MetaSource.Douban && !string.IsNullOrEmpty(sid)) { diff --git a/Jellyfin.Plugin.MetaShark/Providers/SeriesImageProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/SeriesImageProvider.cs index 68b54a3..84d815c 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/SeriesImageProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/SeriesImageProvider.cs @@ -51,8 +51,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers /// public async Task> GetImages(BaseItem item, CancellationToken cancellationToken) { - Console.WriteLine(item.ToJson()); - Console.WriteLine(item.ProviderIds.ToJson()); var sid = item.GetProviderId(DoubanProviderId); var metaSource = item.GetProviderId(Plugin.ProviderId); this.Log($"GetImages for item: {item.Name} [metaSource]: {metaSource}"); diff --git a/Jellyfin.Plugin.MetaShark/Providers/SeriesProvider.cs b/Jellyfin.Plugin.MetaShark/Providers/SeriesProvider.cs index 0a9576c..70c8fd8 100644 --- a/Jellyfin.Plugin.MetaShark/Providers/SeriesProvider.cs +++ b/Jellyfin.Plugin.MetaShark/Providers/SeriesProvider.cs @@ -57,7 +57,6 @@ namespace Jellyfin.Plugin.MetaShark.Providers })); // 尝试从tmdb搜索 - Console.WriteLine($"info.MetadataLanguage={info.MetadataLanguage}"); var tmdbList = await this._tmdbApi.SearchSeriesAsync(info.Name, info.MetadataLanguage, cancellationToken).ConfigureAwait(false); result.AddRange(tmdbList.Take(this._config.MaxSearchResult).Select(x => { diff --git a/README.md b/README.md index f25daa2..bbebb3c 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,9 @@ [![metashark](https://img.shields.io/badge/jellyfin-10.8.x-lightgrey)](https://github.com/cxfksword/jellyfin-plugin-metashark/releases) [![metashark](https://img.shields.io/github/license/cxfksword/jellyfin-plugin-metashark)](https://github.com/cxfksword/jellyfin-plugin-metashark/main/LICENSE) -jellyfin电影元数据插件,影片信息只要从豆瓣获取,并由TMDB补充缺失的季数据和剧集数据。 +jellyfin电影元数据插件,影片信息只要从豆瓣获取,并由TheMovieDb补充缺失的季数据和剧集数据。 +![preview](doc/logo.png) ## 安装插件 @@ -17,7 +18,11 @@ jellyfin电影元数据插件,影片信息只要从豆瓣获取,并由TMDB 国外访问:https://github.com/cxfksword/jellyfin-plugin-metashark/releases/download/manifest/manifest.json +## 如何使用 +* 进入`控制台 -> 媒体库`,在元数据下载器中勾选**MetaShark** +* 假如网络原因访问TheMovieDb比较慢,也可以到插件配置页关闭从TheMovieDb获取数据 + ## How to build @@ -29,7 +34,7 @@ jellyfin电影元数据插件,影片信息只要从豆瓣获取,并由TMDB ```sh $ dotnet restore -$ dotnet publish -c Release Jellyfin.Plugin.MetaShark/Jellyfin.Plugin.MetaShark.csproj +$ dotnet publish Jellyfin.Plugin.MetaShark/Jellyfin.Plugin.MetaShark.csproj ``` @@ -37,7 +42,7 @@ $ dotnet publish -c Release Jellyfin.Plugin.MetaShark/Jellyfin.Plugin.MetaShark. 1. Build the plugin -2. Create a folder, like `metashark` and copy `bin/Release/net6.0/*.dll` into it +2. Create a folder, like `metashark` and copy `bin/Debug/net6.0/*.dll` into it 3. Move folder `metashark` to jellyfin `data/plugin` folder diff --git a/doc/logo.png b/doc/logo.png index 9cebc39..8df1018 100644 Binary files a/doc/logo.png and b/doc/logo.png differ