jellyfin/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzArtistProvider.cs

169 lines
5.3 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
2020-08-17 21:10:02 +02:00
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
using Jellyfin.Extensions;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Providers;
using MediaBrowser.Providers.Music;
using MetaBrainz.MusicBrainz;
using MetaBrainz.MusicBrainz.Interfaces.Entities;
using MetaBrainz.MusicBrainz.Interfaces.Searches;
namespace MediaBrowser.Providers.Plugins.MusicBrainz;
2014-03-14 04:23:58 +01:00
/// <summary>
/// MusicBrainz artist provider.
/// </summary>
public class MusicBrainzArtistProvider : IRemoteMetadataProvider<MusicArtist, ArtistInfo>, IDisposable
{
private readonly Query _musicBrainzQuery;
2017-10-20 18:16:56 +02:00
/// <summary>
/// Initializes a new instance of the <see cref="MusicBrainzArtistProvider"/> class.
/// </summary>
public MusicBrainzArtistProvider()
{
_musicBrainzQuery = new Query();
}
/// <inheritdoc />
public string Name => "MusicBrainz";
2014-03-14 04:23:58 +01:00
/// <inheritdoc />
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ArtistInfo searchInfo, CancellationToken cancellationToken)
{
var artistId = searchInfo.GetMusicBrainzArtistId();
if (!string.IsNullOrWhiteSpace(artistId))
{
var artistResult = await _musicBrainzQuery.LookupArtistAsync(new Guid(artistId), Include.Artists, null, null, cancellationToken).ConfigureAwait(false);
return GetResultFromResponse(artistResult).SingleItemAsEnumerable();
2014-03-14 04:23:58 +01:00
}
var artistSearchResults = await _musicBrainzQuery.FindArtistsAsync($"\"{searchInfo.Name}\"", null, null, false, cancellationToken)
.ConfigureAwait(false);
if (artistSearchResults.Results.Count > 0)
2014-03-14 04:23:58 +01:00
{
return GetResultsFromResponse(artistSearchResults.Results);
2016-10-27 21:03:23 +02:00
}
if (searchInfo.Name.HasDiacritics())
2016-10-27 21:03:23 +02:00
{
// Try again using the search with an accented characters query
var artistAccentsSearchResults = await _musicBrainzQuery.FindArtistsAsync($"artistaccent:\"{searchInfo.Name}\"", null, null, false, cancellationToken)
.ConfigureAwait(false);
if (artistAccentsSearchResults.Results.Count > 0)
{
return GetResultsFromResponse(artistAccentsSearchResults.Results);
2016-10-27 21:03:23 +02:00
}
}
return Enumerable.Empty<RemoteSearchResult>();
}
private IEnumerable<RemoteSearchResult> GetResultsFromResponse(IEnumerable<ISearchResult<IArtist>>? releaseSearchResults)
{
if (releaseSearchResults is null)
2016-10-27 21:03:23 +02:00
{
yield break;
}
2014-03-14 04:23:58 +01:00
foreach (var result in releaseSearchResults)
{
yield return GetResultFromResponse(result.Item);
}
}
2016-10-27 23:05:25 +02:00
private IEnumerable<RemoteSearchResult> GetResultsFromResponse(IEnumerable<IArtist>? releaseSearchResults)
{
if (releaseSearchResults is null)
{
yield break;
}
2014-03-14 04:23:58 +01:00
foreach (var result in releaseSearchResults)
{
yield return GetResultFromResponse(result);
}
}
2020-09-28 22:04:31 +02:00
private RemoteSearchResult GetResultFromResponse(IArtist artist)
{
var searchResult = new RemoteSearchResult
{
Name = artist.Name,
ProductionYear = artist.LifeSpan?.Begin?.Year,
PremiereDate = artist.LifeSpan?.Begin?.NearestDate
};
2020-06-15 23:43:52 +02:00
searchResult.SetProviderId(MetadataProvider.MusicBrainzArtist, artist.Id.ToString());
return searchResult;
}
2016-10-27 21:03:23 +02:00
/// <inheritdoc />
public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo info, CancellationToken cancellationToken)
{
var result = new MetadataResult<MusicArtist> { Item = new MusicArtist() };
2016-10-27 21:03:23 +02:00
var musicBrainzId = info.GetMusicBrainzArtistId();
2014-03-14 04:23:58 +01:00
if (string.IsNullOrWhiteSpace(musicBrainzId))
2014-03-14 04:23:58 +01:00
{
var searchResults = await GetSearchResults(info, cancellationToken).ConfigureAwait(false);
var singleResult = searchResults.FirstOrDefault();
if (singleResult != null)
2014-03-14 04:23:58 +01:00
{
musicBrainzId = singleResult.GetProviderId(MetadataProvider.MusicBrainzArtist);
result.Item.Overview = singleResult.Overview;
2014-03-14 04:23:58 +01:00
if (Plugin.Instance!.Configuration.ReplaceArtistName)
{
result.Item.Name = singleResult.Name;
}
}
}
if (!string.IsNullOrWhiteSpace(musicBrainzId))
{
result.HasMetadata = true;
result.Item.SetProviderId(MetadataProvider.MusicBrainzArtist, musicBrainzId);
}
return result;
}
/// <inheritdoc />
public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
/// <inheritdoc />
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Dispose all resources.
/// </summary>
/// <param name="disposing">Whether to dispose.</param>
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
_musicBrainzQuery.Dispose();
}
}
}