| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | using System;using System.Globalization;using System.Linq;using System.Threading;using System.Threading.Tasks;using Jellyfin.Data.Enums;using MediaBrowser.Controller.Entities;using MediaBrowser.Controller.Entities.Audio;using MediaBrowser.Controller.Library;using MediaBrowser.Controller.Persistence;using Microsoft.Extensions.Logging;namespace Emby.Server.Implementations.Library.Validators;/// <summary>/// Class ArtistsValidator./// </summary>public class ArtistsValidator{    /// <summary>    /// The library manager.    /// </summary>    private readonly ILibraryManager _libraryManager;    /// <summary>    /// The logger.    /// </summary>    private readonly ILogger<ArtistsValidator> _logger;    private readonly IItemRepository _itemRepo;    /// <summary>    /// Initializes a new instance of the <see cref="ArtistsValidator" /> class.    /// </summary>    /// <param name="libraryManager">The library manager.</param>    /// <param name="logger">The logger.</param>    /// <param name="itemRepo">The item repository.</param>    public ArtistsValidator(ILibraryManager libraryManager, ILogger<ArtistsValidator> 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.GetAllArtistNames();        var numComplete = 0;        var count = names.Count;        foreach (var name in names)        {            try            {                var item = _libraryManager.GetArtist(name);                await item.RefreshMetadata(cancellationToken).ConfigureAwait(false);            }            catch (OperationCanceledException)            {                // Don't clutter the log                throw;            }            catch (Exception ex)            {                _logger.LogError(ex, "Error refreshing {ArtistName}", name);            }            numComplete++;            double percent = numComplete;            percent /= count;            percent *= 100;            progress.Report(percent);        }        var deadEntities = _libraryManager.GetItemList(new InternalItemsQuery        {            IncludeItemTypes = [BaseItemKind.MusicArtist],            IsDeadArtist = true,            IsLocked = false        }).Cast<MusicArtist>().ToList();        foreach (var item in deadEntities)        {            if (!item.IsAccessedByName)            {                continue;            }            _logger.LogInformation("Deleting dead {ItemType} {ItemId} {ItemName}", item.GetType().Name, item.Id.ToString("N", CultureInfo.InvariantCulture), item.Name);            _libraryManager.DeleteItem(                item,                new DeleteOptions                {                    DeleteFileLocation = false                },                false);        }        progress.Report(100);    }}
 |