using System ;
using System.Threading ;
using System.Threading.Tasks ;
using MediaBrowser.Controller.Library ;
using MediaBrowser.Controller.Persistence ;
using Microsoft.Extensions.Logging ;
namespace Emby.Server.Implementations.Library.Validators
{
/// <summary>
/// Class MusicGenresValidator.
/// </summary>
public class MusicGenresValidator
{
/// <summary>
/// The library manager.
/// </summary>
private readonly ILibraryManager _libraryManager ;
/// <summary>
/// The logger.
/// </summary>
private readonly ILogger < MusicGenresValidator > _logger ;
private readonly IItemRepository _itemRepo ;
/// <summary>
/// Initializes a new instance of the <see cref="MusicGenresValidator" /> class.
/// </summary>
/// <param name="libraryManager">The library manager.</param>
/// <param name="logger">The logger.</param>
/// <param name="itemRepo">The item repository.</param>
public MusicGenresValidator ( ILibraryManager libraryManager , ILogger < MusicGenresValidator > logger , IItemRepository itemRepo )
{
_libraryManager = libraryManager ;
_logger = logger ;
_itemRepo = itemRepo ;
}
/// <summary>
/// Runs the specified progress.
/// </summary>
/// <param name="progress">The progress.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
public async Task Run ( IProgress < double > progress , CancellationToken cancellationToken )
{
var names = _itemRepo . GetMusicGenreNames ( ) ;
var numComplete = 0 ;
var count = names . Count ;
foreach ( var name in names )
{
try
{
var item = _libraryManager . GetMusicGenre ( name ) ;
await item . RefreshMetadata ( cancellationToken ) . ConfigureAwait ( false ) ;
}
catch ( OperationCanceledException )
{
// Don't clutter the log
throw ;
}
catch ( Exception ex )
{
_logger . LogError ( ex , "Error refreshing {GenreName}" , name ) ;
}
numComplete + + ;
double percent = numComplete ;
percent / = count ;
percent * = 100 ;
progress . Report ( percent ) ;
}
progress . Report ( 100 ) ;
}
}
}