Example #1
0
 public static MusicBrainzAliasMusicBrainzRecord NewShadow(MusicBrainzRecord record, MusicBrainzAlias alias)
 {
     return(new MusicBrainzAliasMusicBrainzRecord
     {
         MusicBrainzRecord = record
         , MusicBrainzRecordUniqueId = record.UniqueId
         , MusicBrainzAlias = alias
         , MusicBrainzAliasUniqueId = alias.UniqueId
     });
 }
Example #2
0
 public static MusicBrainzReleaseMusicBrainzRecord NewShadow(MusicBrainzRecord record, MusicBrainzRelease release)
 {
     return(new MusicBrainzReleaseMusicBrainzRecord
     {
         MusicBrainzRecord = record
         , MusicBrainzRecordUniqueId = record.UniqueId
         , MusicBrainzRelease = release
         , MusicBrainzReleaseUniqueId = release.UniqueId
     });
 }
Example #3
0
 public static MusicBrainzTagMusicBrainzRecord NewShadow(MusicBrainzRecord record, MusicBrainzTag tag)
 {
     return(new MusicBrainzTagMusicBrainzRecord
     {
         MusicBrainzRecord = record
         , MusicBrainzRecordUniqueId = record.UniqueId
         , MusicBrainzTag = tag
         , MusicBrainzTagUniqueId = tag.UniqueId
     });
 }
        private void HandleResponse(MusicBrainzRecord mbr, JsonMusicBrainzRequest json, DataContext context)
        {
            LoggerBundle.Trace("Handling response...");

            mbr.Disambiguation = json.Disambiguation;
            mbr.Length         = json.Length;
            mbr.Title          = json.Title;
            mbr.Video          = json.Video;

            // aliases
            List <MusicBrainzAlias> aliases = json.Aliases?.Select(x => MusicBrainzMapper.Map(context, x)).ToList()
                                              ?? new List <MusicBrainzAlias>();
            IEnumerable <Int32> existingAliasIds =
                mbr.MusicBrainzAliasMusicBrainzRecords.Select(x => x.MusicBrainzAliasUniqueId);
            IEnumerable <Int32> newAliasIds = aliases.Select(x => x.UniqueId).Except(existingAliasIds).Distinct();
            IEnumerable <MusicBrainzAliasMusicBrainzRecord> newAliases = aliases.Where(x => newAliasIds.Contains(x.UniqueId))
                                                                         .Select(x => MusicBrainzMapper.NewShadow(mbr, x));

            mbr.MusicBrainzAliasMusicBrainzRecords.AddRange(newAliases);

            // artist credits
            List <MusicBrainzArtistCredit> credits = json.ArtistCredit?.Select(x => MusicBrainzMapper.Map(context, x)).ToList()
                                                     ?? new List <MusicBrainzArtistCredit>();
            IEnumerable <Int32> existingCreditIds =
                mbr.MusicBrainzArtistCreditMusicBrainzRecords.Select(x => x.MusicBrainzArtistCreditUniqueId);
            IEnumerable <Int32> newCreditIds = credits.Select(x => x.UniqueId).Except(existingCreditIds).Distinct();
            IEnumerable <MusicBrainzArtistCreditMusicBrainzRecord> newCredits = credits
                                                                                .Where(x => newCreditIds.Contains(x.UniqueId))
                                                                                .Select(x => MusicBrainzMapper.NewShadow(mbr, x));

            mbr.MusicBrainzArtistCreditMusicBrainzRecords.AddRange(newCredits);

            // releases
            List <MusicBrainzRelease> releases = json.Releases?.Select(x => MusicBrainzMapper.Map(context, x)).ToList()
                                                 ?? new List <MusicBrainzRelease>();
            IEnumerable <Int32> existingReleaseIds =
                mbr.MusicBrainzReleaseMusicBrainzRecords.Select(x => x.MusicBrainzReleaseUniqueId);
            IEnumerable <Int32> newReleaseIds = releases.Select(x => x.UniqueId).Except(existingReleaseIds).Distinct();
            IEnumerable <MusicBrainzReleaseMusicBrainzRecord> newReleases = releases
                                                                            .Where(x => newReleaseIds.Contains(x.UniqueId))
                                                                            .Select(x => MusicBrainzMapper.NewShadow(mbr, x));

            mbr.MusicBrainzReleaseMusicBrainzRecords.AddRange(newReleases);

            // tags
            List <MusicBrainzTag> tags = json.Tags?.Select(x => MusicBrainzMapper.Map(context, x)).ToList()
                                         ?? new List <MusicBrainzTag>();
            IEnumerable <Int32> existingTagIds = mbr.MusicBrainzTagMusicBrainzRecords.Select(x => x.MusicBrainzTagUniqueId);
            IEnumerable <Int32> newTagIds      = tags.Select(x => x.UniqueId).Except(existingTagIds).Distinct();
            IEnumerable <MusicBrainzTagMusicBrainzRecord> newTags = tags.Where(x => newTagIds.Contains(x.UniqueId))
                                                                    .Select(x => MusicBrainzMapper.NewShadow(mbr, x));

            mbr.MusicBrainzTagMusicBrainzRecords.AddRange(newTags);
        }
Example #5
0
 public static MusicBrainzArtistCreditMusicBrainzRecord NewShadow(MusicBrainzRecord record
                                                                  , MusicBrainzArtistCredit artistCredit)
 {
     return(new MusicBrainzArtistCreditMusicBrainzRecord
     {
         MusicBrainzRecord = record
         , MusicBrainzRecordUniqueId = record.UniqueId
         , MusicBrainzArtistCredit = artistCredit
         , MusicBrainzArtistCreditUniqueId = artistCredit.UniqueId
     });
 }
Example #6
0
        private static void HandleRecordings(DataContext context, JsonAcoustIdRequest.JsonResult json, AcoustId ai)
        {
            json.Recordings?.ForEach(recording =>
            {
                MusicBrainzRecord mbr = context.SetMusicBrainzRecords.Include(x => x.MusicBrainzRecordAcoustIds)
                                        .ThenInclude(x => x.AcoustId)
                                        .FirstOrDefault(x => x.MusicbrainzId.Equals(recording.Id));

                if (null == mbr)
                {
                    // not found in database
                    mbr = new MusicBrainzRecord
                    {
                        MusicbrainzId = recording.Id
                        , MusicBrainzRecordAcoustIds = new List <MusicBrainzRecordAcoustId>()
                    };
                    context.SetMusicBrainzRecords.Add(mbr);
                    context.SaveChanges();
                    mbr.MusicBrainzRecordAcoustIds.Add(new MusicBrainzRecordAcoustId
                    {
                        AcoustIdUniqueId            = ai.UniqueId
                        , AcoustId                  = ai
                        , MusicBrainzRecord         = mbr
                        , MusicBrainzRecordUniqueId = mbr.UniqueId
                    });
                    context.SaveChanges();

                    return; // continue in foreach
                }

                if (mbr.MusicBrainzRecordAcoustIds.Any(x => x.AcoustId.Id.Equals(ai.Id)))
                {
                    // reference already exists
                    return;
                }

                // no reference yet -> create one
                mbr.MusicBrainzRecordAcoustIds.Add(new MusicBrainzRecordAcoustId
                {
                    AcoustIdUniqueId            = ai.UniqueId
                    , AcoustId                  = ai
                    , MusicBrainzRecord         = mbr
                    , MusicBrainzRecordUniqueId = mbr.UniqueId
                });
                context.SaveChanges();
            });
        }
Example #7
0
 public static IDictionary <String, Object> ToJsonDictionary(this MusicBrainzRecord record)
 {
     return(new Dictionary <String, Object>
     {
         {
             "UniqueId", record.UniqueId
         }
         ,
         {
             "Title", record.Title
         }
         ,
         {
             "Disambiguation", record.Disambiguation
         }
         ,
         {
             "Length", record.Length
         }
     });
 }
        public IActionResult GetById(Int32?id)
        {
            try
            {
                LoggerBundle.Trace("Registered GET request on RecordsController.GetById");
                if (!IsAuthorized(out IActionResult result))
                {
                    LoggerBundle.Trace("Request not authorized");
                    return(result);
                }

                // validate
                if (id == null)
                {
                    LoggerBundle.Trace("Validation failed: id is null");
                    return(StatusCode((Int32)HttpStatusCode.BadRequest));
                }

                // get data
                using (DataContext dc = DataContextFactory.GetInstance())
                {
                    MusicBrainzRecord record = dc.SetMusicBrainzRecords.AsNoTracking()
                                               .FirstOrDefault(x => x.UniqueId.Equals(id));

                    if (null == record)
                    {
                        LoggerBundle.Trace($"No record found for given id '{id}'");
                        // no matching record found
                        return(StatusCode((Int32)HttpStatusCode.NotFound));
                    }

                    return(Ok(record.ToJsonDictionary()));
                }
            }
            catch (Exception ex)
            {
                return(HandleException(ex));
            }
        }
Example #9
0
        public IActionResult GetRecordsById(Int32?id)
        {
            try
            {
                LoggerBundle.Trace("Registered GET request on TracksController.GetRecordsById");
                if (!IsAuthorized(out IActionResult result))
                {
                    LoggerBundle.Trace("Request not authorized");
                    return(result);
                }

                // validate
                if (id == null)
                {
                    LoggerBundle.Trace("Validation failed: id is null");
                    return(StatusCode((Int32)HttpStatusCode.BadRequest));
                }

                // get data
                using (DataContext dc = DataContextFactory.GetInstance())
                {
                    Track track = dc.SetTracks.AsNoTracking()
                                  .Include(x => x.AcoustIdResults)
                                  .ThenInclude(x => x.AcoustId)
                                  .ThenInclude(x => x.MusicBrainzRecordAcoustIds)
                                  .ThenInclude(x => x.MusicBrainzRecord)
                                  .FirstOrDefault(x => x.UniqueId.Equals(id));

                    if (null == track)
                    {
                        LoggerBundle.Trace($"No track found for given id '{id}'");
                        return(StatusCode((Int32)HttpStatusCode.NotFound));
                    }

                    // todo might need optimization with a direct database sql query

                    // loop references and keep track of relevant stats
                    Dictionary <MusicBrainzRecord, (Int32 count, Double sum)> ret =
                        new Dictionary <MusicBrainzRecord, (Int32, Double)>();

                    track.AcoustIdResults.ForEach(x =>
                    {
                        Double score = x.Score;
                        x.AcoustId.MusicBrainzRecordAcoustIds.ForEach(y =>
                        {
                            MusicBrainzRecord record = y.MusicBrainzRecord;
                            if (!ret.ContainsKey(record))
                            {
                                ret.Add(record, (1, score));
                                return; // continue
                            }

                            ret[record] = (ret[record].count + 1, ret[record].sum + score);
                        });
                    });

                    return(Ok(ret.Select(x => new Dictionary <String, Object>
                    {
                        {
                            "Score", x.Value.sum / x.Value.count
                        }
                        , // calculate match score (average)
                        {
                            "Record", x.Key.ToJsonDictionary()
                        }
                    })));
                }
            }
            catch (Exception ex)
            {
                return(HandleException(ex));
            }
        }