Fix search tmdb identity. close #21
This commit is contained in:
parent
f93134139a
commit
7b779a79b2
|
@ -48,7 +48,6 @@ namespace Jellyfin.Plugin.MetaShark.Test
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var result = await api.SearchAsync(keyword, CancellationToken.None);
|
var result = await api.SearchAsync(keyword, CancellationToken.None);
|
||||||
var str = result.ToJson();
|
|
||||||
TestContext.WriteLine(result.ToJson());
|
TestContext.WriteLine(result.ToJson());
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using Jellyfin.Plugin.MetaShark.Api;
|
using Jellyfin.Plugin.MetaShark.Api;
|
||||||
using Jellyfin.Plugin.MetaShark.Core;
|
using Jellyfin.Plugin.MetaShark.Core;
|
||||||
|
using Jellyfin.Plugin.MetaShark.Model;
|
||||||
using Jellyfin.Plugin.MetaShark.Providers;
|
using Jellyfin.Plugin.MetaShark.Providers;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
using MediaBrowser.Controller.Providers;
|
using MediaBrowser.Controller.Providers;
|
||||||
|
@ -56,5 +57,30 @@ namespace Jellyfin.Plugin.MetaShark.Test
|
||||||
}).GetAwaiter().GetResult();
|
}).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void TestGetMovieImageFromTMDB()
|
||||||
|
{
|
||||||
|
var info = new MediaBrowser.Controller.Entities.Movies.Movie()
|
||||||
|
{
|
||||||
|
PreferredMetadataLanguage = "zh",
|
||||||
|
ProviderIds = new Dictionary<string, string> { { 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<ILibraryManager>();
|
||||||
|
var httpContextAccessorStub = new Mock<IHttpContextAccessor>();
|
||||||
|
|
||||||
|
Task.Run(async () =>
|
||||||
|
{
|
||||||
|
var provider = new MovieImageProvider(httpClientFactory, loggerFactory, libraryManagerStub.Object, httpContextAccessorStub.Object, doubanApi, tmdbApi, omdbApi);
|
||||||
|
var result = await provider.GetImages(info, CancellationToken.None);
|
||||||
|
Assert.IsNotNull(result);
|
||||||
|
|
||||||
|
var str = result.ToJson();
|
||||||
|
Console.WriteLine(result.ToJson());
|
||||||
|
}).GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -233,6 +233,7 @@ namespace Jellyfin.Plugin.MetaShark.Test
|
||||||
// anime特典
|
// anime特典
|
||||||
fileName = "[KissSub][Steins;Gate][SP][GB_BIG5_JP][BDrip][1080P][HEVC] 边界曲面的缺失之环";
|
fileName = "[KissSub][Steins;Gate][SP][GB_BIG5_JP][BDrip][1080P][HEVC] 边界曲面的缺失之环";
|
||||||
parseResult = NameParser.Parse(fileName);
|
parseResult = NameParser.Parse(fileName);
|
||||||
|
Assert.IsTrue(parseResult.IsSpecial);
|
||||||
Assert.AreEqual(parseResult.Name, "边界曲面的缺失之环");
|
Assert.AreEqual(parseResult.Name, "边界曲面的缺失之环");
|
||||||
Assert.AreEqual(parseResult.ParentIndexNumber, null);
|
Assert.AreEqual(parseResult.ParentIndexNumber, null);
|
||||||
Assert.AreEqual(parseResult.IndexNumber, null);
|
Assert.AreEqual(parseResult.IndexNumber, null);
|
||||||
|
|
|
@ -36,6 +36,26 @@ namespace Jellyfin.Plugin.MetaShark.Test
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void TestGetMovie()
|
||||||
|
{
|
||||||
|
var api = new TmdbApi(loggerFactory);
|
||||||
|
|
||||||
|
Task.Run(async () =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result = await api.GetMovieAsync(752, "zh", "zh", CancellationToken.None)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
Assert.IsNotNull(result);
|
||||||
|
TestContext.WriteLine(result.Images.ToJson());
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
TestContext.WriteLine(ex.Message);
|
||||||
|
}
|
||||||
|
}).GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
@ -47,12 +67,7 @@ namespace Jellyfin.Plugin.MetaShark.Test
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var result = await api.GetSeriesAsync(13372, "zh", BaseProvider.GetImageLanguagesParam("zh"), CancellationToken.None)
|
var result = await api.GetSeriesAsync(13372, "zh", "zh", CancellationToken.None)
|
||||||
.ConfigureAwait(false);
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
TestContext.WriteLine(result.Images.ToJson());
|
|
||||||
|
|
||||||
result = await api.GetSeriesAsync(13372, "zh", null, CancellationToken.None)
|
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
Assert.IsNotNull(result);
|
Assert.IsNotNull(result);
|
||||||
TestContext.WriteLine(result.Images.ToJson());
|
TestContext.WriteLine(result.Images.ToJson());
|
||||||
|
@ -74,15 +89,10 @@ namespace Jellyfin.Plugin.MetaShark.Test
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var result = await api.GetEpisodeAsync(13372, 1, 1, "zh", BaseProvider.GetImageLanguagesParam("zh"), CancellationToken.None)
|
var result = await api.GetEpisodeAsync(13372, 1, 1, "zh", "zh", CancellationToken.None)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
Assert.IsNotNull(result);
|
Assert.IsNotNull(result);
|
||||||
TestContext.WriteLine(result.Images.Stills.ToJson());
|
TestContext.WriteLine(result.Images.Stills.ToJson());
|
||||||
|
|
||||||
result = await api.GetEpisodeAsync(13372, 1, 1, null, null, CancellationToken.None)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
TestContext.WriteLine(result.ToJson());
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,6 +30,12 @@ namespace Jellyfin.Plugin.MetaShark.Api
|
||||||
httpClient.Timeout = TimeSpan.FromSeconds(5);
|
httpClient.Timeout = TimeSpan.FromSeconds(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 通过imdb获取信息(会返回最新的imdb id)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">imdb id</param>
|
||||||
|
/// <param name="cancellationToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
public async Task<OmdbItem?> GetByImdbID(string id, CancellationToken cancellationToken)
|
public async Task<OmdbItem?> GetByImdbID(string id, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
if (!this.IsEnable())
|
if (!this.IsEnable())
|
||||||
|
|
|
@ -219,14 +219,23 @@ namespace Jellyfin.Plugin.MetaShark.Core
|
||||||
|
|
||||||
public static bool IsSpecialDirectory(string path)
|
public static bool IsSpecialDirectory(string path)
|
||||||
{
|
{
|
||||||
var fileName = Path.GetFileNameWithoutExtension(path) ?? string.Empty;
|
var folder = Path.GetFileName(Path.GetDirectoryName(path))?.ToUpper() ?? string.Empty;
|
||||||
if (IsAnime(fileName) && fileName.Contains("[SP]"))
|
return folder == "SPS" || folder == "SPECIALS" || folder.Contains("特典");
|
||||||
{
|
}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var folder = Path.GetFileName(Path.GetDirectoryName(path)) ?? string.Empty;
|
public static bool IsExtraDirectory(string path)
|
||||||
return folder == "SPs" || folder == "Specials" || folder.Contains("特典");
|
{
|
||||||
|
var folder = Path.GetFileName(Path.GetDirectoryName(path))?.ToUpper() ?? string.Empty;
|
||||||
|
return folder == "EXTRA"
|
||||||
|
|| folder == "MENU"
|
||||||
|
|| folder == "MENUS"
|
||||||
|
|| folder == "PV"
|
||||||
|
|| folder == "PV&CM"
|
||||||
|
|| folder == "CM"
|
||||||
|
|| folder == "BONUS"
|
||||||
|
|| folder.Contains("OPED")
|
||||||
|
|| folder.Contains("NCED")
|
||||||
|
|| folder.Contains("花絮");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -492,67 +492,10 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Normalizes a language string for use with TMDb's include image language parameter.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="preferredLanguage">The preferred language as either a 2 letter code with or without country code.</param>
|
|
||||||
/// <returns>The comma separated language string.</returns>
|
|
||||||
public static string GetImageLanguagesParam(string preferredLanguage)
|
|
||||||
{
|
|
||||||
var languages = new List<string>();
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(preferredLanguage))
|
|
||||||
{
|
|
||||||
preferredLanguage = NormalizeLanguage(preferredLanguage);
|
|
||||||
|
|
||||||
languages.Add(preferredLanguage);
|
|
||||||
|
|
||||||
if (preferredLanguage.Length == 5) // like en-US
|
|
||||||
{
|
|
||||||
// Currently, TMDB supports 2-letter language codes only
|
|
||||||
// They are planning to change this in the future, thus we're
|
|
||||||
// supplying both codes if we're having a 5-letter code.
|
|
||||||
languages.Add(preferredLanguage.Substring(0, 2));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
languages.Add("null");
|
|
||||||
|
|
||||||
if (!string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
languages.Add("en");
|
|
||||||
}
|
|
||||||
|
|
||||||
return string.Join(',', languages);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Normalizes a language string for use with TMDb's language parameter.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="language">The language code.</param>
|
|
||||||
/// <returns>The normalized language code.</returns>
|
|
||||||
public static string NormalizeLanguage(string language)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(language))
|
|
||||||
{
|
|
||||||
return language;
|
|
||||||
}
|
|
||||||
|
|
||||||
// They require this to be uppercase
|
|
||||||
// Everything after the hyphen must be written in uppercase due to a way TMDB wrote their api.
|
|
||||||
// See here: https://www.themoviedb.org/talk/5119221d760ee36c642af4ad?page=3#56e372a0c3a3685a9e0019ab
|
|
||||||
var parts = language.Split('-');
|
|
||||||
|
|
||||||
if (parts.Length == 2)
|
|
||||||
{
|
|
||||||
language = parts[0] + "-" + parts[1].ToUpperInvariant();
|
|
||||||
}
|
|
||||||
|
|
||||||
return language;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected string GetOriginalFileName(ItemLookupInfo info)
|
protected string GetOriginalFileName(ItemLookupInfo info)
|
||||||
{
|
{
|
||||||
|
// movie放在文件夹中时,应该使用文件夹名
|
||||||
switch (info)
|
switch (info)
|
||||||
{
|
{
|
||||||
case SeriesInfo:
|
case SeriesInfo:
|
||||||
|
|
|
@ -77,7 +77,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
}
|
}
|
||||||
|
|
||||||
var tmdbId = item.GetProviderId(MetadataProvider.Tmdb);
|
var tmdbId = item.GetProviderId(MetadataProvider.Tmdb);
|
||||||
if (!string.IsNullOrEmpty(tmdbId))
|
if (metaSource == MetaSource.Tmdb && !string.IsNullOrEmpty(tmdbId))
|
||||||
{
|
{
|
||||||
var language = item.GetPreferredMetadataLanguage();
|
var language = item.GetPreferredMetadataLanguage();
|
||||||
var movie = await _tmdbApi
|
var movie = await _tmdbApi
|
||||||
|
@ -101,6 +101,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
VoteCount = poster.VoteCount,
|
VoteCount = poster.VoteCount,
|
||||||
Width = poster.Width,
|
Width = poster.Width,
|
||||||
Height = poster.Height,
|
Height = poster.Height,
|
||||||
|
Language = AdjustImageLanguage(poster.Iso_639_1, language),
|
||||||
ProviderName = Name,
|
ProviderName = Name,
|
||||||
Type = ImageType.Primary,
|
Type = ImageType.Primary,
|
||||||
});
|
});
|
||||||
|
|
|
@ -58,7 +58,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
return new RemoteSearchResult
|
return new RemoteSearchResult
|
||||||
{
|
{
|
||||||
SearchProviderName = DoubanProviderName,
|
SearchProviderName = DoubanProviderName,
|
||||||
ProviderIds = new Dictionary<string, string> { { DoubanProviderId, x.Sid } },
|
ProviderIds = new Dictionary<string, string> { { DoubanProviderId, x.Sid }, { Plugin.ProviderId, MetaSource.Douban } },
|
||||||
ImageUrl = this.GetProxyImageUrl(x.Img),
|
ImageUrl = this.GetProxyImageUrl(x.Img),
|
||||||
ProductionYear = x.Year,
|
ProductionYear = x.Year,
|
||||||
Name = x.Name,
|
Name = x.Name,
|
||||||
|
@ -75,7 +75,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
return new RemoteSearchResult
|
return new RemoteSearchResult
|
||||||
{
|
{
|
||||||
SearchProviderName = TmdbProviderName,
|
SearchProviderName = TmdbProviderName,
|
||||||
ProviderIds = new Dictionary<string, string> { { MetadataProvider.Tmdb.ToString(), x.Id.ToString(CultureInfo.InvariantCulture) } },
|
ProviderIds = new Dictionary<string, string> { { MetadataProvider.Tmdb.ToString(), x.Id.ToString(CultureInfo.InvariantCulture) }, { Plugin.ProviderId, MetaSource.Tmdb } },
|
||||||
Name = string.Format("[TMDB]{0}", x.Title ?? x.OriginalTitle),
|
Name = string.Format("[TMDB]{0}", x.Title ?? x.OriginalTitle),
|
||||||
ImageUrl = this._tmdbApi.GetPosterUrl(x.PosterPath),
|
ImageUrl = this._tmdbApi.GetPosterUrl(x.PosterPath),
|
||||||
Overview = x.Overview,
|
Overview = x.Overview,
|
||||||
|
@ -188,7 +188,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(tmdbId))
|
if (metaSource == MetaSource.Tmdb && !string.IsNullOrEmpty(tmdbId))
|
||||||
{
|
{
|
||||||
this.Log($"GetMovieMetadata of tmdb [id]: \"{tmdbId}\"");
|
this.Log($"GetMovieMetadata of tmdb [id]: \"{tmdbId}\"");
|
||||||
var movieResult = await _tmdbApi
|
var movieResult = await _tmdbApi
|
||||||
|
@ -265,6 +265,13 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
return new MetadataResult<Movie>();
|
return new MetadataResult<Movie>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 动画常用特典文件夹
|
||||||
|
if (NameParser.IsSpecialDirectory(info.Path) || NameParser.IsExtraDirectory(info.Path))
|
||||||
|
{
|
||||||
|
this.Log($"Found extra of [name]: {fileName}");
|
||||||
|
return new MetadataResult<Movie>();
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
}
|
}
|
||||||
|
|
||||||
var tmdbId = item.GetProviderId(MetadataProvider.Tmdb);
|
var tmdbId = item.GetProviderId(MetadataProvider.Tmdb);
|
||||||
if (!string.IsNullOrEmpty(tmdbId))
|
if (metaSource == MetaSource.Tmdb && !string.IsNullOrEmpty(tmdbId))
|
||||||
{
|
{
|
||||||
var language = item.GetPreferredMetadataLanguage();
|
var language = item.GetPreferredMetadataLanguage();
|
||||||
var movie = await _tmdbApi
|
var movie = await _tmdbApi
|
||||||
|
@ -101,6 +101,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
VoteCount = poster.VoteCount,
|
VoteCount = poster.VoteCount,
|
||||||
Width = poster.Width,
|
Width = poster.Width,
|
||||||
Height = poster.Height,
|
Height = poster.Height,
|
||||||
|
Language = AdjustImageLanguage(poster.Iso_639_1, language),
|
||||||
ProviderName = Name,
|
ProviderName = Name,
|
||||||
Type = ImageType.Primary,
|
Type = ImageType.Primary,
|
||||||
});
|
});
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
return new RemoteSearchResult
|
return new RemoteSearchResult
|
||||||
{
|
{
|
||||||
SearchProviderName = DoubanProviderName,
|
SearchProviderName = DoubanProviderName,
|
||||||
ProviderIds = new Dictionary<string, string> { { DoubanProviderId, x.Sid } },
|
ProviderIds = new Dictionary<string, string> { { DoubanProviderId, x.Sid }, { Plugin.ProviderId, MetaSource.Douban } },
|
||||||
ImageUrl = this.GetProxyImageUrl(x.Img),
|
ImageUrl = this.GetProxyImageUrl(x.Img),
|
||||||
ProductionYear = x.Year,
|
ProductionYear = x.Year,
|
||||||
Name = x.Name,
|
Name = x.Name,
|
||||||
|
@ -66,7 +66,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
return new RemoteSearchResult
|
return new RemoteSearchResult
|
||||||
{
|
{
|
||||||
SearchProviderName = TmdbProviderName,
|
SearchProviderName = TmdbProviderName,
|
||||||
ProviderIds = new Dictionary<string, string> { { MetadataProvider.Tmdb.ToString(), x.Id.ToString(CultureInfo.InvariantCulture) } },
|
ProviderIds = new Dictionary<string, string> { { MetadataProvider.Tmdb.ToString(), x.Id.ToString(CultureInfo.InvariantCulture) }, { Plugin.ProviderId, MetaSource.Tmdb } },
|
||||||
Name = string.Format("[TMDB]{0}", x.Name ?? x.OriginalName),
|
Name = string.Format("[TMDB]{0}", x.Name ?? x.OriginalName),
|
||||||
ImageUrl = this._tmdbApi.GetPosterUrl(x.PosterPath),
|
ImageUrl = this._tmdbApi.GetPosterUrl(x.PosterPath),
|
||||||
Overview = x.Overview,
|
Overview = x.Overview,
|
||||||
|
|
Loading…
Reference in New Issue