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
|
||||
{
|
||||
var result = await api.SearchAsync(keyword, CancellationToken.None);
|
||||
var str = result.ToJson();
|
||||
TestContext.WriteLine(result.ToJson());
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using Jellyfin.Plugin.MetaShark.Api;
|
||||
using Jellyfin.Plugin.MetaShark.Core;
|
||||
using Jellyfin.Plugin.MetaShark.Model;
|
||||
using Jellyfin.Plugin.MetaShark.Providers;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
|
@ -56,5 +57,30 @@ namespace Jellyfin.Plugin.MetaShark.Test
|
|||
}).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特典
|
||||
fileName = "[KissSub][Steins;Gate][SP][GB_BIG5_JP][BDrip][1080P][HEVC] 边界曲面的缺失之环";
|
||||
parseResult = NameParser.Parse(fileName);
|
||||
Assert.IsTrue(parseResult.IsSpecial);
|
||||
Assert.AreEqual(parseResult.Name, "边界曲面的缺失之环");
|
||||
Assert.AreEqual(parseResult.ParentIndexNumber, 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]
|
||||
|
@ -47,12 +67,7 @@ namespace Jellyfin.Plugin.MetaShark.Test
|
|||
{
|
||||
try
|
||||
{
|
||||
var result = await api.GetSeriesAsync(13372, "zh", BaseProvider.GetImageLanguagesParam("zh"), CancellationToken.None)
|
||||
.ConfigureAwait(false);
|
||||
Assert.IsNotNull(result);
|
||||
TestContext.WriteLine(result.Images.ToJson());
|
||||
|
||||
result = await api.GetSeriesAsync(13372, "zh", null, CancellationToken.None)
|
||||
var result = await api.GetSeriesAsync(13372, "zh", "zh", CancellationToken.None)
|
||||
.ConfigureAwait(false);
|
||||
Assert.IsNotNull(result);
|
||||
TestContext.WriteLine(result.Images.ToJson());
|
||||
|
@ -74,15 +89,10 @@ namespace Jellyfin.Plugin.MetaShark.Test
|
|||
{
|
||||
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);
|
||||
Assert.IsNotNull(result);
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -30,6 +30,12 @@ namespace Jellyfin.Plugin.MetaShark.Api
|
|||
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)
|
||||
{
|
||||
if (!this.IsEnable())
|
||||
|
|
|
@ -219,14 +219,23 @@ namespace Jellyfin.Plugin.MetaShark.Core
|
|||
|
||||
public static bool IsSpecialDirectory(string path)
|
||||
{
|
||||
var fileName = Path.GetFileNameWithoutExtension(path) ?? string.Empty;
|
||||
if (IsAnime(fileName) && fileName.Contains("[SP]"))
|
||||
{
|
||||
return true;
|
||||
var folder = Path.GetFileName(Path.GetDirectoryName(path))?.ToUpper() ?? string.Empty;
|
||||
return folder == "SPS" || folder == "SPECIALS" || folder.Contains("特典");
|
||||
}
|
||||
|
||||
var folder = Path.GetFileName(Path.GetDirectoryName(path)) ?? string.Empty;
|
||||
return folder == "SPs" || folder == "Specials" || folder.Contains("特典");
|
||||
public static bool IsExtraDirectory(string path)
|
||||
{
|
||||
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)
|
||||
{
|
||||
// movie放在文件夹中时,应该使用文件夹名
|
||||
switch (info)
|
||||
{
|
||||
case SeriesInfo:
|
||||
|
|
|
@ -77,7 +77,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
|||
}
|
||||
|
||||
var tmdbId = item.GetProviderId(MetadataProvider.Tmdb);
|
||||
if (!string.IsNullOrEmpty(tmdbId))
|
||||
if (metaSource == MetaSource.Tmdb && !string.IsNullOrEmpty(tmdbId))
|
||||
{
|
||||
var language = item.GetPreferredMetadataLanguage();
|
||||
var movie = await _tmdbApi
|
||||
|
@ -101,6 +101,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
|||
VoteCount = poster.VoteCount,
|
||||
Width = poster.Width,
|
||||
Height = poster.Height,
|
||||
Language = AdjustImageLanguage(poster.Iso_639_1, language),
|
||||
ProviderName = Name,
|
||||
Type = ImageType.Primary,
|
||||
});
|
||||
|
|
|
@ -58,7 +58,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
|||
return new RemoteSearchResult
|
||||
{
|
||||
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),
|
||||
ProductionYear = x.Year,
|
||||
Name = x.Name,
|
||||
|
@ -75,7 +75,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
|||
return new RemoteSearchResult
|
||||
{
|
||||
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),
|
||||
ImageUrl = this._tmdbApi.GetPosterUrl(x.PosterPath),
|
||||
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}\"");
|
||||
var movieResult = await _tmdbApi
|
||||
|
@ -265,6 +265,13 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
|||
}
|
||||
|
||||
var tmdbId = item.GetProviderId(MetadataProvider.Tmdb);
|
||||
if (!string.IsNullOrEmpty(tmdbId))
|
||||
if (metaSource == MetaSource.Tmdb && !string.IsNullOrEmpty(tmdbId))
|
||||
{
|
||||
var language = item.GetPreferredMetadataLanguage();
|
||||
var movie = await _tmdbApi
|
||||
|
@ -101,6 +101,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
|||
VoteCount = poster.VoteCount,
|
||||
Width = poster.Width,
|
||||
Height = poster.Height,
|
||||
Language = AdjustImageLanguage(poster.Iso_639_1, language),
|
||||
ProviderName = Name,
|
||||
Type = ImageType.Primary,
|
||||
});
|
||||
|
|
|
@ -50,7 +50,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
|||
return new RemoteSearchResult
|
||||
{
|
||||
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),
|
||||
ProductionYear = x.Year,
|
||||
Name = x.Name,
|
||||
|
@ -66,7 +66,7 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
|||
return new RemoteSearchResult
|
||||
{
|
||||
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),
|
||||
ImageUrl = this._tmdbApi.GetPosterUrl(x.PosterPath),
|
||||
Overview = x.Overview,
|
||||
|
|
Loading…
Reference in New Issue