using NzbDrone.Core.Datastore; using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Qualities; using NzbDrone.Core.MediaFiles; using Marr.Data.QGen; using NzbDrone.Core.Datastore.Extensions; using System; namespace NzbDrone.Core.Music { public interface ITrackRepository : IBasicRepository { Track Find(int artistId, int albumId, int mediumNumber, int trackNumber); List GetTracks(int artistId); List GetTracksByAlbum(int albumId); List GetTracksByRelease(int albumReleaseId); List GetTracksByForeignReleaseId(string foreignReleaseId); List GetTracksByMedium(int albumId, int mediumNumber); List GetTracksByFileId(int fileId); List TracksWithFiles(int artistId); void SetFileId(int trackId, int fileId); } public class TrackRepository : BasicRepository, ITrackRepository { private readonly IMainDatabase _database; private readonly Logger _logger; public TrackRepository(IMainDatabase database, IEventAggregator eventAggregator, Logger logger) : base(database, eventAggregator) { _database = database; _logger = logger; } public Track Find(int artistId, int albumId, int mediumNumber, int trackNumber) { string query = string.Format("SELECT Tracks.* " + "FROM Artists " + "JOIN Albums ON Albums.ArtistMetadataId == Artists.ArtistMetadataId " + "JOIN AlbumReleases ON AlbumReleases.AlbumId == Albums.Id " + "JOIN Tracks ON Tracks.AlbumReleaseId == AlbumReleases.Id " + "WHERE Artists.Id = {0} " + "AND Albums.Id = {1} " + "AND AlbumReleases.Monitored = 1 " + "AND Tracks.MediumNumber = {2} " + "AND Tracks.AbsoluteTrackNumber = {3}", artistId, albumId, mediumNumber, trackNumber); return Query.QueryText(query).SingleOrDefault(); } public List GetTracks(int artistId) { string query = string.Format("SELECT Tracks.* " + "FROM Artists " + "JOIN Albums ON Albums.ArtistMetadataId == Artists.ArtistMetadataId " + "JOIN AlbumReleases ON AlbumReleases.AlbumId == Albums.Id " + "JOIN Tracks ON Tracks.AlbumReleaseId == AlbumReleases.Id " + "WHERE Artists.Id = {0} " + "AND AlbumReleases.Monitored = 1", artistId); return Query.QueryText(query).ToList(); } public List GetTracksByAlbum(int albumId) { string query = string.Format("SELECT Tracks.* " + "FROM Albums " + "JOIN AlbumReleases ON AlbumReleases.AlbumId == Albums.Id " + "JOIN Tracks ON Tracks.AlbumReleaseId == AlbumReleases.Id " + "WHERE Albums.Id = {0} " + "AND AlbumReleases.Monitored = 1", albumId); return Query.QueryText(query).ToList(); } public List GetTracksByRelease(int albumReleaseId) { return Query.Where(t => t.AlbumReleaseId == albumReleaseId).ToList(); } public List GetTracksByForeignReleaseId(string foreignReleaseId) { string query = string.Format("SELECT Tracks.* " + "FROM AlbumReleases " + "JOIN Tracks ON Tracks.AlbumReleaseId == AlbumReleases.Id " + "WHERE AlbumReleases.ForeignReleaseId = '{0}'", foreignReleaseId); return Query.QueryText(query).ToList(); } public List GetTracksByMedium(int albumId, int mediumNumber) { if (mediumNumber < 1) { return GetTracksByAlbum(albumId); } string query = string.Format("SELECT Tracks.* " + "FROM Albums " + "JOIN AlbumReleases ON AlbumReleases.AlbumId == Albums.Id " + "JOIN Tracks ON Tracks.AlbumReleaseId == AlbumReleases.Id " + "WHERE Albums.Id = {0} " + "AND AlbumReleases.Monitored = 1 " + "AND Tracks.MediumNumber = {1}", albumId, mediumNumber); return Query.QueryText(query).ToList(); } public List GetTracksByFileId(int fileId) { return Query.Where(e => e.TrackFileId == fileId).ToList(); } public List TracksWithFiles(int artistId) { string query = string.Format("SELECT Tracks.* " + "FROM Artists " + "JOIN Albums ON Albums.ArtistMetadataId = Artists.ArtistMetadataId " + "JOIN AlbumReleases ON AlbumReleases.AlbumId == Albums.Id " + "JOIN Tracks ON Tracks.AlbumReleaseId == AlbumReleases.Id " + "JOIN TrackFiles ON TrackFiles.Id == Tracks.TrackFileId " + "WHERE Artists.Id == {0} " + "AND AlbumReleases.Monitored = 1 ", artistId); return Query.QueryText(query).ToList(); } public void SetFileId(int trackId, int fileId) { SetFields(new Track { Id = trackId, TrackFileId = fileId }, track => track.TrackFileId); } } }