< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.Library.Validators.MusicGenresValidator
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/Library/Validators/MusicGenresValidator.cs
Line coverage
50%
Covered lines: 16
Uncovered lines: 16
Coverable lines: 32
Total lines: 93
Line coverage: 50%
Branch coverage
25%
Covered branches: 1
Total branches: 4
Branch coverage: 25%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 1/23/2026 - 12:11:06 AM Line coverage: 100% (4/4) Total lines: 804/19/2026 - 12:14:27 AM Line coverage: 41.6% (10/24) Branch coverage: 50% (1/2) Total lines: 805/4/2026 - 12:15:16 AM Line coverage: 50% (16/32) Branch coverage: 25% (1/4) Total lines: 93 4/19/2026 - 12:14:27 AM Line coverage: 41.6% (10/24) Branch coverage: 50% (1/2) Total lines: 805/4/2026 - 12:15:16 AM Line coverage: 50% (16/32) Branch coverage: 25% (1/4) Total lines: 93

Coverage delta

Coverage delta 59 -59

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Run()25%7442.85%

File(s)

/srv/git/jellyfin/Emby.Server.Implementations/Library/Validators/MusicGenresValidator.cs

#LineLine coverage
 1using System;
 2using System.Linq;
 3using System.Threading;
 4using System.Threading.Tasks;
 5using Jellyfin.Data.Enums;
 6using MediaBrowser.Controller.Entities;
 7using MediaBrowser.Controller.Library;
 8using MediaBrowser.Controller.Persistence;
 9using Microsoft.Extensions.Logging;
 10
 11namespace Emby.Server.Implementations.Library.Validators;
 12
 13/// <summary>
 14/// Class MusicGenresValidator.
 15/// </summary>
 16public class MusicGenresValidator
 17{
 18    /// <summary>
 19    /// The library manager.
 20    /// </summary>
 21    private readonly ILibraryManager _libraryManager;
 22
 23    /// <summary>
 24    /// The logger.
 25    /// </summary>
 26    private readonly ILogger<MusicGenresValidator> _logger;
 27    private readonly IItemRepository _itemRepo;
 28
 29    /// <summary>
 30    /// Initializes a new instance of the <see cref="MusicGenresValidator" /> class.
 31    /// </summary>
 32    /// <param name="libraryManager">The library manager.</param>
 33    /// <param name="logger">The logger.</param>
 34    /// <param name="itemRepo">The item repository.</param>
 35    public MusicGenresValidator(ILibraryManager libraryManager, ILogger<MusicGenresValidator> logger, IItemRepository it
 36    {
 1637        _libraryManager = libraryManager;
 1638        _logger = logger;
 1639        _itemRepo = itemRepo;
 1640    }
 41
 42    /// <summary>
 43    /// Runs the specified progress.
 44    /// </summary>
 45    /// <param name="progress">The progress.</param>
 46    /// <param name="cancellationToken">The cancellation token.</param>
 47    /// <returns>Task.</returns>
 48    public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
 49    {
 1650        var names = _itemRepo.GetMusicGenreNames();
 1651        var existingMusicGenreIds = _libraryManager.GetItemIds(new InternalItemsQuery
 1652        {
 1653            IncludeItemTypes = [BaseItemKind.MusicGenre]
 1654        }).ToHashSet();
 55
 1656        var numComplete = 0;
 1657        var count = names.Count;
 1658        var refreshed = 0;
 59
 3260        foreach (var name in names)
 61        {
 62            try
 63            {
 064                var item = _libraryManager.GetMusicGenre(name);
 065                if (!existingMusicGenreIds.Contains(item.Id))
 66                {
 067                    await item.RefreshMetadata(cancellationToken).ConfigureAwait(false);
 068                    refreshed++;
 69                }
 070            }
 071            catch (OperationCanceledException)
 72            {
 73                // Don't clutter the log
 074                throw;
 75            }
 076            catch (Exception ex)
 77            {
 078                _logger.LogError(ex, "Error refreshing {GenreName}", name);
 079            }
 80
 081            numComplete++;
 082            double percent = numComplete;
 083            percent /= count;
 084            percent *= 100;
 85
 086            progress.Report(percent);
 087        }
 88
 1689        _logger.LogInformation("Refreshed metadata for {RefreshedCount} new music genres out of {TotalCount} total", ref
 90
 1691        progress.Report(100);
 1692    }
 93}