using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Kyoo.Abstractions.Controllers;
using Kyoo.Abstractions.Models.Attributes;
using Kyoo.Abstractions.Models.Exceptions;
namespace Kyoo.Core.Tasks
{
///
/// A task that download metadata providers images.
///
[TaskMetadata("reload-metadata", "Reload Metadata Providers", "Add every loaded metadata provider to the database.",
RunOnStartup = true, Priority = 1000, IsHidden = true)]
public class MetadataProviderLoader : ITask
{
///
/// The provider repository used to create in-db providers from metadata providers.
///
private readonly IProviderRepository _providers;
///
/// The thumbnail manager used to download providers logo.
///
private readonly IThumbnailsManager _thumbnails;
///
/// The list of metadata providers to register.
///
private readonly ICollection _metadataProviders;
///
/// Create a new task.
///
///
/// The provider repository used to create in-db providers from metadata providers.
///
///
/// The thumbnail manager used to download providers logo.
///
///
/// The list of metadata providers to register.
///
public MetadataProviderLoader(IProviderRepository providers,
IThumbnailsManager thumbnails,
ICollection metadataProviders)
{
_providers = providers;
_thumbnails = thumbnails;
_metadataProviders = metadataProviders;
}
///
public TaskParameters GetParameters()
{
return new();
}
///
public async Task Run(TaskParameters arguments, IProgress progress, CancellationToken cancellationToken)
{
float percent = 0;
progress.Report(0);
foreach (IMetadataProvider provider in _metadataProviders)
{
if (string.IsNullOrEmpty(provider.Provider.Slug))
throw new TaskFailedException($"Empty provider slug (name: {provider.Provider.Name}).");
await _providers.CreateIfNotExists(provider.Provider);
await _thumbnails.DownloadImages(provider.Provider);
percent += 100f / _metadataProviders.Count;
progress.Report(percent);
}
progress.Report(100);
}
}
}