Przeglądaj źródła

First cut at LastfmArtistProvider

Eric Reed 12 lat temu
rodzic
commit
d7cdf06326

+ 1 - 1
MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs

@@ -77,7 +77,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
             {
                 var handler = new WebRequestHandler
                 {
-                    AutomaticDecompression = DecompressionMethods.Deflate,
+                    //AutomaticDecompression = DecompressionMethods.Deflate,
                     CachePolicy = new RequestCachePolicy(RequestCacheLevel.Revalidate)
                 };
 

+ 5 - 0
MediaBrowser.Common/Kernel/ResourcePool.cs

@@ -38,6 +38,11 @@ namespace MediaBrowser.Common.Kernel
         /// </summary>
         public readonly SemaphoreSlim Mb = new SemaphoreSlim(5, 5);
 
+        /// <summary>
+        /// The mb
+        /// </summary>
+        public readonly SemaphoreSlim Lastfm = new SemaphoreSlim(5, 5);
+
         /// <summary>
         /// Apple doesn't seem to like too many simulataneous requests.
         /// </summary>

+ 60 - 2
MediaBrowser.Controller/Providers/Music/LastfmArtistProvider.cs

@@ -1,12 +1,15 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Net;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Net;
 using MediaBrowser.Model.Serialization;
 
 namespace MediaBrowser.Controller.Providers.Music
@@ -18,9 +21,64 @@ namespace MediaBrowser.Controller.Providers.Music
         {
         }
 
-        protected override Task FetchLastfmData(BaseItem item, string id, CancellationToken cancellationToken)
+        protected override async Task<string> FindId(Entities.BaseItem item, System.Threading.CancellationToken cancellationToken)
         {
-            throw new NotImplementedException();
+            //Execute the Artist search against our name and assume first one is the one we want
+            var url = RootUrl + string.Format("method=artist.search&artist={0}&api_key={1}&format=json", UrlEncode(item.Name), ApiKey);
+
+            LastfmArtistSearchResults searchResult = null;
+
+            try
+            {
+                using (var json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+                {
+                    searchResult = JsonSerializer.DeserializeFromStream<LastfmArtistSearchResults>(json);
+                }
+            }
+            catch (HttpException e)
+            {
+                if (e.StatusCode == HttpStatusCode.NotFound)
+                {
+                    return null;
+                }
+                throw;
+            }
+
+            if (searchResult != null && searchResult.results != null && searchResult.results.artistmatches != null && searchResult.results.artistmatches.artist.Any())
+            {
+                return searchResult.results.artistmatches.artist.First().mbid;
+            }
+
+            return null;
+        }
+
+        protected override async Task FetchLastfmData(BaseItem item, string id, CancellationToken cancellationToken)
+        {
+            // Get artist info with provided id
+            var url = RootUrl + string.Format("method=artist.getInfo&mbid={0}&api_key={1}&format=json", UrlEncode(id), ApiKey);
+
+            LastfmGetArtistResult result = null;
+
+            try
+            {
+                using (var json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.Lastfm, cancellationToken).ConfigureAwait(false))
+                {
+                    result = JsonSerializer.DeserializeFromStream<LastfmGetArtistResult>(json);
+                }
+            }
+            catch (HttpException e)
+            {
+                if (e.StatusCode == HttpStatusCode.NotFound)
+                {
+                    throw new LastfmProviderException(string.Format("Unable to retrieve artist info for {0} with id {0}", item.Name, id));
+                }
+                throw;
+            }
+
+            if (result != null && result.artist != null)
+            {
+                ProcessArtistData(item as MusicArtist, result.artist);
+            }
         }
     }
 }

+ 12 - 29
MediaBrowser.Controller/Providers/Music/LastfmBaseArtistProvider.cs

@@ -14,7 +14,7 @@ namespace MediaBrowser.Controller.Providers.Music
 {
     public abstract class LastfmBaseArtistProvider : LastfmBaseProvider
     {
-        protected LastfmBaseArtistProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, ILogManager logManager) 
+        protected LastfmBaseArtistProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, ILogManager logManager)
             : base(jsonSerializer, httpClient, logManager)
         {
             LocalMetaFileName = "MBArtist.json";
@@ -25,38 +25,17 @@ namespace MediaBrowser.Controller.Providers.Music
             return item is MusicArtist;
         }
 
-        protected override async Task<string> FindId(Entities.BaseItem item, System.Threading.CancellationToken cancellationToken)
+        protected void ProcessArtistData(MusicArtist artist, LastfmArtist data)
         {
-            //Execute the Artist search against our name and assume first one is the one we want
-            var url = RootUrl + string.Format("method=artist.search&artist={0}&api_key={1}&format=json", UrlEncode(item.Name), ApiKey);
-
-            LastfmArtistSearchResults searchResult = null;
-
-            try
-            {
-                using (var json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
-                {
-                    searchResult = JsonSerializer.DeserializeFromStream<LastfmArtistSearchResults>(json);
-                }
-            }
-            catch (HttpException e)
-            {
-                if (e.StatusCode == HttpStatusCode.NotFound)
-                {
-                    return null;
-                }
-                throw;
-            }
-
-            if (searchResult != null && searchResult.results != null && searchResult.results.artistmatches != null && searchResult.results.artistmatches.artist.Any())
+            artist.Overview = data.bio.summary;
+            foreach (var tag in data.tags.tag)
             {
-                return searchResult.results.artistmatches.artist.First().mbid;
+                artist.AddGenre(tag.name);
             }
-
-            return null;
         }
     }
 
+
     #region Result Objects
 
     public class LastfmStats
@@ -71,6 +50,11 @@ namespace MediaBrowser.Controller.Providers.Music
         public string url { get; set; }
     }
 
+    public class LastfmTags
+    {
+        public List<LastfmTag> tag  { get; set; }
+    }
+
     public class LastfmFormationInfo
     {
         public string yearfrom { get; set; }
@@ -96,7 +80,7 @@ namespace MediaBrowser.Controller.Providers.Music
         public string ontour { get; set; }
         public LastfmStats stats { get; set; }
         public List<LastfmArtist> similar { get; set; }
-        public List<LastfmTag> tags { get; set; }
+        public LastfmTags tags { get; set; }
         public LastFmBio bio { get; set; }
     }
 
@@ -119,6 +103,5 @@ namespace MediaBrowser.Controller.Providers.Music
     {
         public LastfmArtistSearchResult results { get; set; }
     }
-
     #endregion
 }