using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.IO; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist; using Jellyfin.Plugin.TubeArchivistMetadata.Utilities; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Providers; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers { /// /// Metadata provider which interacts with TubeArchivist library. /// public class EpisodeMetadataProvider : IRemoteMetadataProvider { private ILogger _logger; /// /// Initializes a new instance of the class. /// public EpisodeMetadataProvider() { if (Plugin.Instance == null) { throw new DataException("Uninitialized plugin!"); } else { _logger = Plugin.Instance.Logger; } } /// /// Gets the provider name. /// public string Name => "TubeArchivist"; /// public async Task> GetMetadata(EpisodeInfo info, CancellationToken cancellationToken) { var result = new MetadataResult(); if (string.IsNullOrWhiteSpace(info.Path)) { return result; } var taApi = TubeArchivistApi.GetInstance(); var videoTAId = Utils.GetVideoNameFromPath(info.Path); var video = await taApi.GetVideo(videoTAId).ConfigureAwait(true); _logger.LogDebug("{Message}", string.Format(CultureInfo.CurrentCulture, "Getting metadata for video: {0} ({1})", video?.Title, videoTAId)); _logger.LogDebug("{Message}", "Received metadata: \n" + JsonConvert.SerializeObject(video)); if (video != null) { var peopleInfo = new List(); PeopleHelper.AddPerson(peopleInfo, new PersonInfo { Name = video.Channel.Name, ImageUrl = video.Channel.ThumbUrl, Type = Data.Enums.PersonKind.Actor, }); result.HasMetadata = true; result.Item = video.ToEpisode(); result.Item.Path = info.Path; result.Provider = Name; result.People = peopleInfo; } return result; } /// public async Task> GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken) { var results = new List(); if (string.IsNullOrWhiteSpace(searchInfo.Path)) { return results; } var taApi = TubeArchivistApi.GetInstance(); var videoTAId = Utils.GetVideoNameFromPath(searchInfo.Path); var video = await taApi.GetVideo(videoTAId).ConfigureAwait(true); if (video != null) { results.Add(video.ToSearchResult()); } return results; } /// public async Task GetImageResponse(string url, CancellationToken cancellationToken) { if (Plugin.Instance == null) { throw new DataException("Uninitialized plugin!"); } else { return await Plugin.Instance.HttpClient.GetAsync(new Uri(Utils.SanitizeUrl(Plugin.Instance.Configuration.TubeArchivistUrl + url).TrimEnd('/')), cancellationToken).ConfigureAwait(false); } } } }