diff --git a/Kyoo.Common/Models/MetadataID.cs b/Kyoo.Common/Models/MetadataID.cs
index 34872314..de6ac817 100644
--- a/Kyoo.Common/Models/MetadataID.cs
+++ b/Kyoo.Common/Models/MetadataID.cs
@@ -19,6 +19,12 @@ namespace Kyoo.Models
/// The URL of the resource on the external provider.
///
public string Link { get; set; }
+
+ ///
+ /// A shortcut to access the provider of this metadata.
+ /// Unlike the property, this is serializable.
+ ///
+ public Provider Provider => Second;
///
/// The expression to retrieve the unique ID of a MetadataID. This is an aggregate of the two resources IDs.
diff --git a/Kyoo.WebApp b/Kyoo.WebApp
index dcdebad1..87783a5b 160000
--- a/Kyoo.WebApp
+++ b/Kyoo.WebApp
@@ -1 +1 @@
-Subproject commit dcdebad14cbcdf1f9486cb9178e6518d10c0e97f
+Subproject commit 87783a5bfdd79f21d72bad13da1d96ec8e08cd42
diff --git a/Kyoo/CoreModule.cs b/Kyoo/CoreModule.cs
index 4d4baf7d..1632644f 100644
--- a/Kyoo/CoreModule.cs
+++ b/Kyoo/CoreModule.cs
@@ -115,6 +115,7 @@ namespace Kyoo
builder.RegisterTask();
builder.RegisterTask();
builder.RegisterTask();
+ builder.RegisterTask();
static bool DatabaseIsPresent(IComponentRegistryBuilder x)
=> x.IsRegistered(new TypedService(typeof(DatabaseContext)));
diff --git a/Kyoo/Tasks/MetadataProviderLoader.cs b/Kyoo/Tasks/MetadataProviderLoader.cs
index 899a2657..db50f9ec 100644
--- a/Kyoo/Tasks/MetadataProviderLoader.cs
+++ b/Kyoo/Tasks/MetadataProviderLoader.cs
@@ -1,46 +1,75 @@
-// using System;
-// using System.Collections.Generic;
-// using System.Threading;
-// using System.Threading.Tasks;
-// using Kyoo.Controllers;
-// using Kyoo.Models;
-// using Microsoft.Extensions.DependencyInjection;
-//
-// namespace Kyoo.Tasks
-// {
-// public class MetadataProviderLoader : ITask
-// {
-// public string Slug => "reload-metdata";
-// public string Name => "Reload Metadata Providers";
-// public string Description => "Add every loaded metadata provider to the database.";
-// public string HelpMessage => null;
-// public bool RunOnStartup => true;
-// public int Priority => 1000;
-//
-// public async Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string arguments = null)
-// {
-// using IServiceScope serviceScope = serviceProvider.CreateScope();
-// IProviderRepository providers = serviceScope.ServiceProvider.GetService();
-// IThumbnailsManager thumbnails = serviceScope.ServiceProvider.GetService();
-// IPluginManager pluginManager = serviceScope.ServiceProvider.GetService();
-//
-// foreach (IMetadataProvider provider in pluginManager!.GetPlugins())
-// {
-// if (string.IsNullOrEmpty(provider.Provider.Slug))
-// throw new ArgumentException($"Empty provider slug (name: {provider.Provider.Name}).");
-// await providers!.CreateIfNotExists(provider.Provider);
-// await thumbnails!.Validate(provider.Provider);
-// }
-// }
-//
-// public Task> GetPossibleParameters()
-// {
-// return Task.FromResult>(null);
-// }
-//
-// public int? Progress()
-// {
-// return null;
-// }
-// }
-// }
\ No newline at end of file
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Kyoo.Controllers;
+using Kyoo.Models.Attributes;
+using Kyoo.Models.Exceptions;
+
+namespace Kyoo.Tasks
+{
+ ///
+ /// A task that download metadata providers images.
+ ///
+ public class MetadataProviderLoader : ITask
+ {
+ ///
+ public string Slug => "reload-metdata";
+
+ ///
+ public string Name => "Reload Metadata Providers";
+
+ ///
+ public string Description => "Add every loaded metadata provider to the database.";
+
+ ///
+ public string HelpMessage => null;
+
+ ///
+ public bool RunOnStartup => true;
+
+ ///
+ public int Priority => 1000;
+
+ ///
+ public bool IsHidden => true;
+
+ ///
+ /// The provider repository used to create in-db providers from metadata providers.
+ ///
+ [Injected] public IProviderRepository Providers { private get; set; }
+ ///
+ /// The thumbnail manager used to download providers logo.
+ ///
+ [Injected] public IThumbnailsManager Thumbnails { private get; set; }
+ ///
+ /// The list of metadata providers to register.
+ ///
+ [Injected] public ICollection MetadataProviders { private get; set; }
+
+
+ ///
+ 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);
+ }
+ }
+}
\ No newline at end of file