Ejemplo n.º 1
0
        /// <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());
        }
Ejemplo n.º 2
0
        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);
        }