You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Lidarr/src/NzbDrone.Core/Music/Track.cs

115 lines
3.8 KiB

using NzbDrone.Core.Datastore;
using NzbDrone.Core.MediaFiles;
using Marr.Data;
using NzbDrone.Common.Extensions;
using System;
using NzbDrone.Common.Serializer;
namespace NzbDrone.Core.Music
{
public class Track : ModelBase, IEquatable<Track>
{
public Track()
{
}
// These are model fields
public string ForeignTrackId { get; set; }
public string ForeignRecordingId { get; set; }
public int AlbumReleaseId { get; set; }
public int ArtistMetadataId { get; set; }
public string TrackNumber { get; set; }
public int AbsoluteTrackNumber { get; set; }
public string Title { get; set; }
public int Duration { get; set; }
public bool Explicit { get; set; }
public Ratings Ratings { get; set; }
public int MediumNumber { get; set; }
public int TrackFileId { get; set; }
public bool HasFile => TrackFileId > 0;
// These are dynamically queried from the DB
public LazyLoaded<AlbumRelease> AlbumRelease { get; set; }
public LazyLoaded<ArtistMetadata> ArtistMetadata { get; set; }
public LazyLoaded<TrackFile> TrackFile { get; set; }
public LazyLoaded<Artist> Artist { get; set; }
// These are retained for compatibility
// TODO: Remove set, bodged in because tests expect this to be writable
public int AlbumId { get { return AlbumRelease.Value?.Album.Value?.Id ?? 0; } set { /* empty */ } }
public Album Album { get; set; }
public override string ToString()
{
return string.Format("[{0}]{1}", ForeignTrackId, Title.NullSafe());
}
public bool Equals(Track other)
{
if (other == null)
{
return false;
}
if (Id == other.Id &&
ForeignTrackId == other.ForeignTrackId &&
ForeignRecordingId == other.ForeignRecordingId &&
AlbumReleaseId == other.AlbumReleaseId &&
ArtistMetadataId == other.ArtistMetadataId &&
TrackNumber == other.TrackNumber &&
AbsoluteTrackNumber == other.AbsoluteTrackNumber &&
Title == other.Title &&
Duration == other.Duration &&
Explicit == other.Explicit &&
Ratings?.ToJson() == other.Ratings?.ToJson() &&
MediumNumber == other.MediumNumber &&
TrackFileId == other.TrackFileId)
{
return true;
}
return false;
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
var other = obj as Track;
if (other == null)
{
return false;
}
else
{
return Equals(other);
}
}
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + Id;
hash = hash * 23 + ForeignTrackId.GetHashCode();
hash = hash * 23 + ForeignRecordingId.GetHashCode();
hash = hash * 23 + AlbumReleaseId;
hash = hash * 23 + ArtistMetadataId;
hash = hash * 23 + TrackNumber?.GetHashCode() ?? 0;
hash = hash * 23 + AbsoluteTrackNumber;
hash = hash * 23 + Title?.GetHashCode() ?? 0;
hash = hash * 23 + Duration;
hash = hash * 23 + Explicit.GetHashCode();
hash = hash * 23 + Ratings?.GetHashCode() ?? 0;
hash = hash * 23 + MediumNumber;
hash = hash * 23 + TrackFileId;
return hash;
}
}
}
}