Files
music-meta-tagger/Client.AllMusicGuide/Services/TrackRater.cs
T

58 lines
1.6 KiB
C#

using System;
using System.Linq;
using MusicMetaTagger.Core.Model;
using MusicMetaTagger.Core.Services;
namespace MusicMetaTagger.Client.AllMusicGuide.Services
{
public class TrackRater : ITrackRater
{
private readonly IMusicGuide _musicGuide;
public TrackRater(IMusicGuide musicGuide)
{
_musicGuide = musicGuide;
}
public int? RateTrack(Track track)
{
if (track == null)
throw new ArgumentNullException("track");
if (track.PerformerIds == null || track.PerformerIds.Count == 0)
return null;
// get the track pick statistics for this album
var albumInfo = _musicGuide.GetAlbum(track.AlbumId);
if (!albumInfo.Rating.HasValue)
return null;
// get the album rating statistics for this artist
double artistAlbumRatingMean = 0;
var artistInfo = _musicGuide.GetArtist(albumInfo.ArtistId);
if (artistInfo != null)
{
var currentDi =
artistInfo.Discography.Find(di => di.AlbumId == albumInfo.AlbumId);
artistAlbumRatingMean =
(from di in artistInfo.Discography
where currentDi == null || di.ReleaseType == currentDi.ReleaseType
where di.Rating.HasValue
select di.Rating.Value).Average();
}
// calculate the track rating
var trackRating = albumInfo.Rating.Value;
if (albumInfo.Rating.Value >= 9 && albumInfo.Tracks.Any(t => t.Pick)) trackRating -= 1;
if (artistAlbumRatingMean >= 8 && albumInfo.Tracks.Any(t => t.Pick)) trackRating -= 1;
if (albumInfo.Pick) trackRating += 1;
if (track.Pick) trackRating += 2;
return Math.Min(Math.Max(0, trackRating), 10);
}
}
}