/// <summary> /// Return if releases exist in repository for artist, if not fetch from MusicBrainz and populate then return /// </summary> /// <param name="artistMbId">Artist Music Brainz Id</param> /// <returns>Collection of Music Brainz Releases</returns> public async Task <IEnumerable <Release> > ReleasesForArtist(string artistMbId) { IEnumerable <Release> results = null; try { using (var db = new LiteDatabase(FileName)) { var col = db.GetCollection <RepositoryRelease>("releases"); col.EnsureIndex(x => x.ArtistMbId); col.EnsureIndex(x => x.Release.id); var releases = col.Find(x => x.ArtistMbId == artistMbId); if (releases == null || !releases.Any()) { // Query to get collection of Releases for Artist var pageSize = 50; var page = 0; var url = MusicBrainzRequestHelper.CreateArtistBrowseTemplate(artistMbId, pageSize, 0); var mbReleaseBrowseResult = await MusicBrainzRequestHelper.GetAsync <ReleaseBrowseResult>(url); var totalReleases = mbReleaseBrowseResult != null ? mbReleaseBrowseResult.releasecount : 0; var totalPages = Math.Ceiling((decimal)totalReleases / pageSize); var fetchResult = new List <Release>(); do { if (mbReleaseBrowseResult != null) { fetchResult.AddRange(mbReleaseBrowseResult.releases.Where(x => !string.IsNullOrEmpty(x.date))); } page++; mbReleaseBrowseResult = await MusicBrainzRequestHelper.GetAsync <ReleaseBrowseResult>(MusicBrainzRequestHelper.CreateArtistBrowseTemplate(artistMbId, pageSize, pageSize *page)); } while (page < totalPages); col.InsertBulk(fetchResult.Select(x => new RepositoryRelease { ArtistMbId = artistMbId, Release = x })); results = fetchResult; } else { results = releases.Select(x => x.Release).ToArray(); } } } catch (HttpRequestException ex) { Logger.LogTrace($"MusicBrainz:ReleasesForArtist, Artist [{ artistMbId }], Ex [{ ex.ToString() }]"); } catch (Exception ex) { Logger.LogError(ex); } return(results.OrderBy(x => x.date).ThenBy(x => x.title).ToArray()); }
public async Task <IEnumerable <Release> > ReleasesForArtist(string artist, string artistMusicBrainzId = null) { try { var artistSearch = await this.PerformArtistSearch(artist, 1); if (artistSearch == null || !artistSearch.IsSuccess) { return(null); } var mbArtist = artistSearch.Data.First(); if (string.IsNullOrEmpty(artistMusicBrainzId)) { if (mbArtist == null) { return(null); } artistMusicBrainzId = mbArtist.MusicBrainzId; } var cacheKey = string.Format("uri:musicbrainz:ReleasesForArtist:{0}", artistMusicBrainzId); var result = this.CacheManager.Get <List <Release> >(cacheKey); if (result == null) { var pageSize = 50; var page = 0; var url = MusicBrainzRequestHelper.CreateArtistBrowseTemplate(artistMusicBrainzId, pageSize, 0); var mbReleaseBrowseResult = await MusicBrainzRequestHelper.GetAsync <ReleaseBrowseResult>(url); var totalReleases = mbReleaseBrowseResult != null ? mbReleaseBrowseResult.releasecount : 0; var totalPages = Math.Ceiling((decimal)totalReleases / (decimal)pageSize); result = new List <Release>(); do { if (mbReleaseBrowseResult != null) { result.AddRange(mbReleaseBrowseResult.releases); } page++; mbReleaseBrowseResult = await MusicBrainzRequestHelper.GetAsync <ReleaseBrowseResult>(MusicBrainzRequestHelper.CreateArtistBrowseTemplate(artistMusicBrainzId, pageSize, pageSize *page)); } while (page < totalPages); result = result.OrderBy(x => x.date).ThenBy(x => x.title).ToList(); this.CacheManager.Add(cacheKey, result); } return(result); } catch (HttpRequestException) { } catch (Exception ex) { this.Logger.LogError(ex); } return(null); }