aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs')
-rw-r--r--MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs80
1 files changed, 79 insertions, 1 deletions
diff --git a/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs b/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs
index 43ee7bdbc0..e36d8a3201 100644
--- a/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs
+++ b/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs
@@ -7,6 +7,7 @@ using MediaBrowser.Model.Providers;
using System;
using System.Collections.Generic;
using System.IO;
+using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
@@ -31,9 +32,86 @@ namespace MediaBrowser.Providers.Music
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(AlbumInfo searchInfo, CancellationToken cancellationToken)
{
+ var releaseId = searchInfo.GetReleaseId();
+
+ string url = null;
+
+ if (!string.IsNullOrEmpty(releaseId))
+ {
+ url = string.Format("http://www.musicbrainz.org/ws/2/release/?query=reid:{0}", releaseId);
+ }
+ else
+ {
+ var artistMusicBrainzId = searchInfo.GetMusicBrainzArtistId();
+
+ if (!string.IsNullOrWhiteSpace(artistMusicBrainzId))
+ {
+ url = string.Format("http://www.musicbrainz.org/ws/2/release/?query=\"{0}\" AND arid:{1}",
+ WebUtility.UrlEncode(searchInfo.Name),
+ artistMusicBrainzId);
+ }
+ else
+ {
+ url = string.Format("http://www.musicbrainz.org/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"",
+ WebUtility.UrlEncode(searchInfo.Name),
+ WebUtility.UrlEncode(searchInfo.GetAlbumArtist()));
+ }
+ }
+
+ if (!string.IsNullOrWhiteSpace(url))
+ {
+ var doc = await GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false);
+
+ return GetResultsFromResponse(doc);
+ }
+
return new List<RemoteSearchResult>();
}
+ private IEnumerable<RemoteSearchResult> GetResultsFromResponse(XmlDocument doc)
+ {
+ var ns = new XmlNamespaceManager(doc.NameTable);
+ ns.AddNamespace("mb", "http://musicbrainz.org/ns/mmd-2.0#");
+
+ var list = new List<RemoteSearchResult>();
+
+ var nodes = doc.SelectNodes("//mb:release-list/mb:release", ns);
+
+ if (nodes != null)
+ {
+ foreach (var node in nodes.Cast<XmlNode>())
+ {
+ if (node.Attributes != null)
+ {
+ string name = null;
+
+ string mbzId = node.Attributes["id"].Value;
+
+ var nameNode = node.SelectSingleNode("//mb:title", ns);
+
+ if (nameNode != null)
+ {
+ name = nameNode.InnerText;
+ }
+
+ if (!string.IsNullOrWhiteSpace(mbzId) && !string.IsNullOrWhiteSpace(name))
+ {
+ var result = new RemoteSearchResult
+ {
+ Name = name
+ };
+
+ result.SetProviderId(MetadataProviders.MusicBrainzAlbum, mbzId);
+
+ list.Add(result);
+ }
+ }
+ }
+ }
+
+ return list;
+ }
+
public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo id, CancellationToken cancellationToken)
{
var releaseId = id.GetReleaseId();
@@ -146,7 +224,7 @@ namespace MediaBrowser.Providers.Music
{
result.ReleaseGroupId = releaseGroupIdNode.Value;
}
-
+
return result;
}