Merge pull request #53 from Musi13/master

Allow AniDB as an agent for movies
This commit is contained in:
dkanada 2020-03-09 12:06:31 +09:00 committed by GitHub
commit f1cf9ef0d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 99 additions and 66 deletions

View File

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
@ -7,7 +8,7 @@ namespace Jellyfin.Plugin.Anime.Providers.AniDB
public class AniDbExternalId : IExternalId
{
public bool Supports(IHasProviderIds item)
=> item is Series;
=> item is Series || item is Movie;
public string Name
=> "AniDB";

View File

@ -8,18 +8,20 @@ using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Providers;
namespace Jellyfin.Plugin.Anime.Providers.AniDB.Metadata
{
public class AniDbSeriesImagesProvider : IRemoteImageProvider
public class AniDbImageProvider : IRemoteImageProvider
{
public string Name => "AniDB";
private readonly IHttpClient _httpClient;
private readonly IApplicationPaths _appPaths;
public AniDbSeriesImagesProvider(IHttpClient httpClient, IApplicationPaths appPaths)
public AniDbImageProvider(IHttpClient httpClient, IApplicationPaths appPaths)
{
_httpClient = httpClient;
_appPaths = appPaths;
@ -38,8 +40,7 @@ namespace Jellyfin.Plugin.Anime.Providers.AniDB.Metadata
public Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
{
var series = (Series)item;
var seriesId = series.GetProviderId(ProviderNames.AniDb);
var seriesId = item.GetProviderId(ProviderNames.AniDb);
return GetImages(seriesId, cancellationToken);
}
@ -70,11 +71,9 @@ namespace Jellyfin.Plugin.Anime.Providers.AniDB.Metadata
return new[] { ImageType.Primary };
}
public string Name => "AniDB";
public bool Supports(BaseItem item)
{
return item is Series;
return item is Series || item is Season || item is Movie;
}
private async Task<string> FindImageUrl(string seriesDataPath)

View File

@ -0,0 +1,91 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Providers;
using Microsoft.Extensions.Logging;
namespace Jellyfin.Plugin.Anime.Providers.AniDB.Metadata
{
public class AniDbMovieProvider : IRemoteMetadataProvider<Movie, MovieInfo>
{
private readonly AniDbSeriesProvider _seriesProvider;
private readonly ILogger _log;
public string Name => "AniDB";
public AniDbMovieProvider(IApplicationPaths appPaths, IHttpClient httpClient, ILoggerFactory loggerFactory)
{
_seriesProvider = new AniDbSeriesProvider(appPaths, httpClient);
_log = loggerFactory.CreateLogger("AniDB");
}
public async Task<MetadataResult<Movie>> GetMetadata(MovieInfo info, CancellationToken cancellationToken)
{
// Empty result
var result = new MetadataResult<Movie>
{
HasMetadata = false,
Item = new Movie
{
Name = info.Name
}
};
var seriesId = info.ProviderIds.GetOrDefault(ProviderNames.AniDb);
if (seriesId == null)
{
return result;
}
var seriesInfo = new SeriesInfo();
seriesInfo.ProviderIds.Add(ProviderNames.AniDb, seriesId);
var seriesResult = await _seriesProvider.GetMetadata(seriesInfo, cancellationToken);
if (seriesResult.HasMetadata)
{
result = new MetadataResult<Movie>
{
HasMetadata = true,
Item = new Movie
{
Name = seriesResult.Item.Name,
Overview = seriesResult.Item.Overview,
PremiereDate = seriesResult.Item.PremiereDate,
ProductionYear = seriesResult.Item.ProductionYear,
EndDate = seriesResult.Item.EndDate,
CommunityRating = seriesResult.Item.CommunityRating,
Studios = seriesResult.Item.Studios,
Genres = seriesResult.Item.Genres,
ProviderIds = seriesResult.Item.ProviderIds,
},
People = seriesResult.People,
Images = seriesResult.Images
};
}
return result;
}
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(MovieInfo searchInfo, CancellationToken cancellationToken)
{
var seriesInfo = new SeriesInfo();
var seriesId = searchInfo.ProviderIds.GetOrDefault(ProviderNames.AniDb);
if (seriesId != null)
{
seriesInfo.ProviderIds.Add(ProviderNames.AniDb, seriesId);
}
seriesInfo.Name = searchInfo.Name;
return await _seriesProvider.GetSearchResults(seriesInfo, cancellationToken);
}
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
{
return _seriesProvider.GetImageResponse(url, cancellationToken);
}
}
}

View File

@ -1,58 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Providers;
namespace Jellyfin.Plugin.Anime.Providers.AniDB.Metadata
{
/// <summary>
/// Copies the series image into a season, if the season does not otherwise have any primary image.
/// </summary>
public class AniDbSeasonImageProvider : IRemoteImageProvider
{
private readonly IApplicationPaths _appPaths;
private readonly IHttpClient _httpClient;
public AniDbSeasonImageProvider(IApplicationPaths appPaths, IHttpClient httpClient)
{
_appPaths = appPaths;
_httpClient = httpClient;
}
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
{
return new AniDbSeriesImagesProvider(_httpClient, _appPaths).GetImageResponse(url, cancellationToken);
}
public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
{
var season = (Season)item;
var series = season.Series;
var seriesId = series.ProviderIds.GetOrDefault(ProviderNames.AniDb);
if (string.IsNullOrEmpty(seriesId))
return Enumerable.Empty<RemoteImageInfo>();
return await new AniDbSeriesImagesProvider(_httpClient, _appPaths).GetImages(seriesId, cancellationToken);
}
public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
{
return new[] { ImageType.Primary };
}
public string Name => "AniDB";
public bool Supports(BaseItem item)
{
return item is Season;
}
}
}