72 lines
3.4 KiB
C#
72 lines
3.4 KiB
C#
using Jellyfin.Plugin.Vanguard.Services;
|
|
using MediaBrowser.Controller.Entities;
|
|
using MediaBrowser.Controller.Entities.TV;
|
|
using MediaBrowser.Controller.Providers;
|
|
using MediaBrowser.Model.Entities;
|
|
using MediaBrowser.Model.Providers;
|
|
|
|
namespace Jellyfin.Plugin.Vanguard.Providers;
|
|
|
|
/// <summary>A show is a streamer/submitter folder: display name and overview from Discord.</summary>
|
|
public sealed class VanguardSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo>, IHasOrder
|
|
{
|
|
private readonly IdentityResolver _identity;
|
|
private readonly IHttpClientFactory _http;
|
|
public VanguardSeriesProvider(IdentityResolver identity, IHttpClientFactory http) { _identity = identity; _http = http; }
|
|
|
|
public string Name => "Vanguard Metadata";
|
|
public int Order => 0;
|
|
|
|
public async Task<MetadataResult<Series>> GetMetadata(SeriesInfo info, CancellationToken ct)
|
|
{
|
|
var result = new MetadataResult<Series>();
|
|
var folder = string.IsNullOrEmpty(info.Path) ? info.Name : Path.GetFileName(info.Path.TrimEnd(Path.DirectorySeparatorChar));
|
|
if (string.IsNullOrEmpty(folder)) return result;
|
|
var m = await _identity.ResolveFolderAsync(folder, ct).ConfigureAwait(false);
|
|
result.Item = new Series
|
|
{
|
|
Name = m?.DisplayName ?? folder,
|
|
Overview = m is null ? $"Recordings from {folder}." : $"Recordings from {m.DisplayName} (@{m.Username} on Discord).",
|
|
Status = SeriesStatus.Continuing,
|
|
};
|
|
result.HasMetadata = true;
|
|
return result;
|
|
}
|
|
|
|
public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo searchInfo, CancellationToken ct) =>
|
|
Task.FromResult<IEnumerable<RemoteSearchResult>>([]);
|
|
|
|
public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken ct) =>
|
|
_http.CreateClient(MediaBrowser.Common.Net.NamedClient.Default).GetAsync(url, ct);
|
|
}
|
|
|
|
/// <summary>Series poster = the Discord avatar (guild-specific if set).</summary>
|
|
public sealed class VanguardSeriesImageProvider : IRemoteImageProvider, IHasOrder
|
|
{
|
|
private readonly IdentityResolver _identity;
|
|
private readonly IHttpClientFactory _http;
|
|
public VanguardSeriesImageProvider(IdentityResolver identity, IHttpClientFactory http) { _identity = identity; _http = http; }
|
|
|
|
public string Name => "Vanguard Metadata";
|
|
public int Order => 0;
|
|
|
|
public bool Supports(BaseItem item) => item is Series;
|
|
public IEnumerable<ImageType> GetSupportedImages(BaseItem item) => [ImageType.Primary, ImageType.Thumb];
|
|
|
|
public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken ct)
|
|
{
|
|
var folder = Path.GetFileName(item.Path?.TrimEnd(Path.DirectorySeparatorChar) ?? string.Empty);
|
|
if (string.IsNullOrEmpty(folder)) return [];
|
|
var m = await _identity.ResolveFolderAsync(folder, ct).ConfigureAwait(false);
|
|
if (m?.AvatarUrl is null) return [];
|
|
return
|
|
[
|
|
new RemoteImageInfo { ProviderName = Name, Type = ImageType.Primary, Url = m.AvatarUrl, Width = 512, Height = 512 },
|
|
new RemoteImageInfo { ProviderName = Name, Type = ImageType.Thumb, Url = m.AvatarUrl, Width = 512, Height = 512 },
|
|
];
|
|
}
|
|
|
|
public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken ct) =>
|
|
_http.CreateClient(MediaBrowser.Common.Net.NamedClient.Default).GetAsync(url, ct);
|
|
}
|