< Summary - Jellyfin

Information
Class: MediaBrowser.Providers.Plugins.ListenBrainz.ListenBrainzSimilarArtistProvider
Assembly: MediaBrowser.Providers
File(s): /srv/git/jellyfin/MediaBrowser.Providers/Plugins/ListenBrainz/ListenBrainzSimilarArtistProvider.cs
Line coverage
12%
Covered lines: 3
Uncovered lines: 22
Coverable lines: 25
Total lines: 89
Line coverage: 12%
Branch coverage
0%
Covered branches: 0
Total branches: 10
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 5/16/2026 - 12:15:55 AM Line coverage: 12% (3/25) Branch coverage: 0% (0/10) Total lines: 89 5/16/2026 - 12:15:55 AM Line coverage: 12% (3/25) Branch coverage: 0% (0/10) Total lines: 89

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Name()100%210%
get_Type()100%210%
get_CacheDuration()0%2040%
GetSimilarItemsAsync()0%4260%

File(s)

/srv/git/jellyfin/MediaBrowser.Providers/Plugins/ListenBrainz/ListenBrainzSimilarArtistProvider.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Net.Http;
 4using System.Runtime.CompilerServices;
 5using System.Threading;
 6using MediaBrowser.Controller.Entities.Audio;
 7using MediaBrowser.Controller.Library;
 8using MediaBrowser.Model.Configuration;
 9using MediaBrowser.Model.Entities;
 10using MediaBrowser.Providers.Plugins.ListenBrainz.Api;
 11using Microsoft.Extensions.Logging;
 12
 13namespace MediaBrowser.Providers.Plugins.ListenBrainz;
 14
 15/// <summary>
 16/// ListenBrainz-based similar items provider for music artists.
 17/// </summary>
 18public class ListenBrainzSimilarArtistProvider : IRemoteSimilarItemsProvider<MusicArtist>
 19{
 20    private readonly ListenBrainzLabsClient _labsClient;
 21    private readonly ILogger<ListenBrainzSimilarArtistProvider> _logger;
 22
 23    /// <summary>
 24    /// Initializes a new instance of the <see cref="ListenBrainzSimilarArtistProvider"/> class.
 25    /// </summary>
 26    /// <param name="labsClient">The ListenBrainz Labs API client.</param>
 27    /// <param name="logger">The logger.</param>
 28    public ListenBrainzSimilarArtistProvider(
 29        ListenBrainzLabsClient labsClient,
 30        ILogger<ListenBrainzSimilarArtistProvider> logger)
 31    {
 2132        _labsClient = labsClient;
 2133        _logger = logger;
 2134    }
 35
 36    /// <inheritdoc/>
 037    public string Name => "ListenBrainz";
 38
 39    /// <inheritdoc/>
 040    public MetadataPluginType Type => MetadataPluginType.SimilarityProvider;
 41
 42    /// <inheritdoc/>
 43    public TimeSpan? CacheDuration
 44    {
 45        get
 46        {
 047            var days = ListenBrainzPlugin.Instance?.Configuration.SimilarItemsCacheDays ?? 0;
 048            return days > 0 ? TimeSpan.FromDays(days) : null;
 49        }
 50    }
 51
 52    /// <inheritdoc/>
 53    public async IAsyncEnumerable<SimilarItemReference> GetSimilarItemsAsync(
 54        MusicArtist item,
 55        SimilarItemsQuery query,
 56        [EnumeratorCancellation] CancellationToken cancellationToken)
 57    {
 058        ArgumentNullException.ThrowIfNull(item);
 059        ArgumentNullException.ThrowIfNull(query);
 60
 061        if (!item.TryGetProviderId(MetadataProvider.MusicBrainzArtist, out var mbidStr) || !Guid.TryParse(mbidStr, out v
 62        {
 063            _logger.LogDebug("No MusicBrainz Artist ID found for {ArtistName}", item.Name);
 064            yield break;
 65        }
 66
 67        IReadOnlyList<Guid> similarMbids;
 68        try
 69        {
 070            similarMbids = await _labsClient.GetSimilarArtistsAsync(mbid, cancellationToken).ConfigureAwait(false);
 071        }
 072        catch (HttpRequestException ex)
 73        {
 074            _logger.LogWarning(ex, "Failed to fetch similar artists from ListenBrainz for {ArtistMbid}", mbid);
 075            yield break;
 76        }
 77
 078        var providerName = MetadataProvider.MusicBrainzArtist.ToString();
 79
 080        foreach (var similarMbid in similarMbids)
 81        {
 082            yield return new SimilarItemReference
 083            {
 084                ProviderName = providerName,
 085                ProviderId = similarMbid.ToString()
 086            };
 87        }
 088    }
 89}