LastfmArtistProvider.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using MediaBrowser.Common.Net;
  9. using MediaBrowser.Model.Entities;
  10. using MediaBrowser.Controller.Entities;
  11. using MediaBrowser.Controller.Entities.Audio;
  12. using MediaBrowser.Model.Logging;
  13. using MediaBrowser.Model.Net;
  14. using MediaBrowser.Model.Serialization;
  15. namespace MediaBrowser.Controller.Providers.Music
  16. {
  17. public class LastfmArtistProvider : LastfmBaseArtistProvider
  18. {
  19. public LastfmArtistProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, ILogManager logManager)
  20. : base(jsonSerializer, httpClient, logManager)
  21. {
  22. }
  23. protected override async Task<string> FindId(Entities.BaseItem item, System.Threading.CancellationToken cancellationToken)
  24. {
  25. //Execute the Artist search against our name and assume first one is the one we want
  26. var url = RootUrl + string.Format("method=artist.search&artist={0}&api_key={1}&format=json", UrlEncode(item.Name), ApiKey);
  27. LastfmArtistSearchResults searchResult = null;
  28. try
  29. {
  30. using (var json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
  31. {
  32. searchResult = JsonSerializer.DeserializeFromStream<LastfmArtistSearchResults>(json);
  33. }
  34. }
  35. catch (HttpException e)
  36. {
  37. if (e.StatusCode == HttpStatusCode.NotFound)
  38. {
  39. return null;
  40. }
  41. throw;
  42. }
  43. if (searchResult != null && searchResult.results != null && searchResult.results.artistmatches != null && searchResult.results.artistmatches.artist.Any())
  44. {
  45. return searchResult.results.artistmatches.artist.First().mbid;
  46. }
  47. return null;
  48. }
  49. protected override async Task FetchLastfmData(BaseItem item, string id, CancellationToken cancellationToken)
  50. {
  51. // Get artist info with provided id
  52. var url = RootUrl + string.Format("method=artist.getInfo&mbid={0}&api_key={1}&format=json", UrlEncode(id), ApiKey);
  53. LastfmGetArtistResult result = null;
  54. try
  55. {
  56. using (var json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.Lastfm, cancellationToken).ConfigureAwait(false))
  57. {
  58. result = JsonSerializer.DeserializeFromStream<LastfmGetArtistResult>(json);
  59. }
  60. }
  61. catch (HttpException e)
  62. {
  63. if (e.StatusCode == HttpStatusCode.NotFound)
  64. {
  65. throw new LastfmProviderException(string.Format("Unable to retrieve artist info for {0} with id {0}", item.Name, id));
  66. }
  67. throw;
  68. }
  69. if (result != null && result.artist != null)
  70. {
  71. ProcessArtistData(item as MusicArtist, result.artist);
  72. }
  73. }
  74. }
  75. }