2017-09-04 02:20:56 +00:00
using System ;
2020-01-03 12:49:24 +00:00
using System.Collections.Generic ;
2017-06-28 02:25:51 +00:00
using System.Linq ;
2020-01-03 12:49:24 +00:00
using NzbDrone.Common.Extensions ;
2017-06-18 02:27:01 +00:00
using NzbDrone.Core.Datastore ;
2020-08-18 20:11:44 +00:00
using NzbDrone.Core.MediaFiles ;
2017-06-18 02:27:01 +00:00
using NzbDrone.Core.Messaging.Events ;
2017-10-17 04:05:03 +00:00
using NzbDrone.Core.Qualities ;
2017-06-18 02:27:01 +00:00
namespace NzbDrone.Core.Music
{
public interface IAlbumRepository : IBasicRepository < Album >
{
List < Album > GetAlbums ( int artistId ) ;
2019-08-17 07:04:59 +00:00
List < Album > GetLastAlbums ( IEnumerable < int > artistMetadataIds ) ;
List < Album > GetNextAlbums ( IEnumerable < int > artistMetadataIds ) ;
2018-12-15 00:02:43 +00:00
List < Album > GetAlbumsByArtistMetadataId ( int artistMetadataId ) ;
2022-01-26 00:08:27 +00:00
List < Album > GetAlbumsForRefresh ( int artistMetadataId , List < string > foreignIds ) ;
2018-12-15 00:02:43 +00:00
Album FindByTitle ( int artistMetadataId , string title ) ;
2019-12-16 21:21:32 +00:00
Album FindById ( string foreignAlbumId ) ;
2017-07-02 00:21:39 +00:00
PagingSpec < Album > AlbumsWithoutFiles ( PagingSpec < Album > pagingSpec ) ;
2019-08-02 11:50:09 +00:00
PagingSpec < Album > AlbumsWhereCutoffUnmet ( PagingSpec < Album > pagingSpec , List < QualitiesBelowCutoff > qualitiesBelowCutoff ) ;
2017-06-28 02:25:51 +00:00
List < Album > AlbumsBetweenDates ( DateTime startDate , DateTime endDate , bool includeUnmonitored ) ;
2018-02-10 04:03:12 +00:00
List < Album > ArtistAlbumsBetweenDates ( Artist artist , DateTime startDate , DateTime endDate , bool includeUnmonitored ) ;
2017-06-25 13:17:49 +00:00
void SetMonitoredFlat ( Album album , bool monitored ) ;
2017-09-04 02:20:56 +00:00
void SetMonitored ( IEnumerable < int > ids , bool monitored ) ;
2018-12-15 00:02:43 +00:00
Album FindAlbumByRelease ( string albumReleaseId ) ;
Album FindAlbumByTrack ( int trackId ) ;
2018-04-08 06:25:34 +00:00
List < Album > GetArtistAlbumsWithFiles ( Artist artist ) ;
2017-06-18 02:27:01 +00:00
}
public class AlbumRepository : BasicRepository < Album > , IAlbumRepository
{
2019-12-16 21:21:32 +00:00
public AlbumRepository ( IMainDatabase database , IEventAggregator eventAggregator )
2017-06-18 02:27:01 +00:00
: base ( database , eventAggregator )
{
}
2017-10-08 03:01:49 +00:00
2017-06-18 02:27:01 +00:00
public List < Album > GetAlbums ( int artistId )
{
2020-08-18 20:11:44 +00:00
return Query ( Builder ( ) . Join < Album , Artist > ( ( l , r ) = > l . ArtistMetadataId = = r . ArtistMetadataId ) . Where < Artist > ( a = > a . Id = = artistId ) ) ;
2019-08-17 07:04:59 +00:00
}
public List < Album > GetLastAlbums ( IEnumerable < int > artistMetadataIds )
{
2020-08-18 20:11:44 +00:00
var now = DateTime . UtcNow ;
2022-01-26 00:08:27 +00:00
var inner = Builder ( )
. Select ( "MIN(\"Albums\".\"Id\") as id, MAX(\"Albums\".\"ReleaseDate\") as date" )
. Where < Album > ( x = > artistMetadataIds . Contains ( x . ArtistMetadataId ) & & x . ReleaseDate < now )
. GroupBy < Album > ( x = > x . ArtistMetadataId )
. AddSelectTemplate ( typeof ( Album ) ) ;
var outer = Builder ( )
. Join ( $"({inner.RawSql}) ids on ids.id = \" Albums \ ".\"Id\" and ids.date = \"Albums\".\"ReleaseDate\"" )
. AddParameters ( inner . Parameters ) ;
return Query ( outer ) ;
2019-08-17 07:04:59 +00:00
}
public List < Album > GetNextAlbums ( IEnumerable < int > artistMetadataIds )
{
2020-08-18 20:11:44 +00:00
var now = DateTime . UtcNow ;
2022-01-26 00:08:27 +00:00
var inner = Builder ( )
. Select ( "MIN(\"Albums\".\"Id\") as id, MIN(\"Albums\".\"ReleaseDate\") as date" )
. Where < Album > ( x = > artistMetadataIds . Contains ( x . ArtistMetadataId ) & & x . ReleaseDate > now )
. GroupBy < Album > ( x = > x . ArtistMetadataId )
. AddSelectTemplate ( typeof ( Album ) ) ;
var outer = Builder ( )
. Join ( $"({inner.RawSql}) ids on ids.id = \" Albums \ ".\"Id\" and ids.date = \"Albums\".\"ReleaseDate\"" )
. AddParameters ( inner . Parameters ) ;
return Query ( outer ) ;
2018-12-15 00:02:43 +00:00
}
public List < Album > GetAlbumsByArtistMetadataId ( int artistMetadataId )
{
2020-08-18 20:11:44 +00:00
return Query ( s = > s . ArtistMetadataId = = artistMetadataId ) ;
2017-06-18 02:27:01 +00:00
}
2022-01-26 00:08:27 +00:00
public List < Album > GetAlbumsForRefresh ( int artistMetadataId , List < string > foreignIds )
2017-06-18 02:27:01 +00:00
{
2020-08-18 20:11:44 +00:00
return Query ( a = > a . ArtistMetadataId = = artistMetadataId | | foreignIds . Contains ( a . ForeignAlbumId ) ) ;
2017-06-18 02:27:01 +00:00
}
2019-03-15 12:10:45 +00:00
public Album FindById ( string foreignAlbumId )
2019-01-12 16:56:13 +00:00
{
2020-08-18 20:11:44 +00:00
return Query ( s = > s . ForeignAlbumId = = foreignAlbumId ) . SingleOrDefault ( ) ;
2019-01-12 16:56:13 +00:00
}
2020-08-18 20:11:44 +00:00
//x.Id == null is converted to SQL, so warning incorrect
#pragma warning disable CS0472
2022-01-26 00:08:27 +00:00
private SqlBuilder AlbumsWithoutFilesBuilder ( DateTime currentTime )
{
return Builder ( )
. Join < Album , Artist > ( ( l , r ) = > l . ArtistMetadataId = = r . ArtistMetadataId )
. Join < Album , AlbumRelease > ( ( a , r ) = > a . Id = = r . AlbumId )
. Join < AlbumRelease , Track > ( ( r , t ) = > r . Id = = t . AlbumReleaseId )
. LeftJoin < Track , TrackFile > ( ( t , f ) = > t . TrackFileId = = f . Id )
. Where < TrackFile > ( f = > f . Id = = null )
. Where < AlbumRelease > ( r = > r . Monitored = = true )
. Where < Album > ( a = > a . ReleaseDate < = currentTime ) ;
}
2020-08-18 20:11:44 +00:00
#pragma warning restore CS0472
2017-07-02 00:21:39 +00:00
public PagingSpec < Album > AlbumsWithoutFiles ( PagingSpec < Album > pagingSpec )
{
var currentTime = DateTime . UtcNow ;
2020-08-18 20:11:44 +00:00
pagingSpec . Records = GetPagedRecords ( AlbumsWithoutFilesBuilder ( currentTime ) , pagingSpec , PagedQuery ) ;
pagingSpec . TotalRecords = GetPagedRecordCount ( AlbumsWithoutFilesBuilder ( currentTime ) . SelectCountDistinct < Album > ( x = > x . Id ) , pagingSpec ) ;
2017-10-17 04:05:03 +00:00
return pagingSpec ;
}
2022-01-26 00:08:27 +00:00
private SqlBuilder AlbumsWhereCutoffUnmetBuilder ( List < QualitiesBelowCutoff > qualitiesBelowCutoff )
{
return Builder ( )
. Join < Album , Artist > ( ( l , r ) = > l . ArtistMetadataId = = r . ArtistMetadataId )
. Join < Album , AlbumRelease > ( ( a , r ) = > a . Id = = r . AlbumId )
. Join < AlbumRelease , Track > ( ( r , t ) = > r . Id = = t . AlbumReleaseId )
. LeftJoin < Track , TrackFile > ( ( t , f ) = > t . TrackFileId = = f . Id )
. Where < AlbumRelease > ( r = > r . Monitored = = true )
. Where ( BuildQualityCutoffWhereClause ( qualitiesBelowCutoff ) ) ;
}
2017-07-04 10:49:07 +00:00
2020-08-18 20:11:44 +00:00
private string BuildQualityCutoffWhereClause ( List < QualitiesBelowCutoff > qualitiesBelowCutoff )
2017-07-04 10:49:07 +00:00
{
2020-08-18 20:11:44 +00:00
var clauses = new List < string > ( ) ;
2017-07-04 10:49:07 +00:00
2020-08-18 20:11:44 +00:00
foreach ( var profile in qualitiesBelowCutoff )
2017-07-04 10:49:07 +00:00
{
2020-08-18 20:11:44 +00:00
foreach ( var belowCutoff in profile . QualityIds )
{
2022-01-26 00:08:27 +00:00
clauses . Add ( string . Format ( "(\"Artists\".\"QualityProfileId\" = {0} AND \"TrackFiles\".\"Quality\" LIKE '%_quality_: {1},%')" , profile . ProfileId , belowCutoff ) ) ;
2020-08-18 20:11:44 +00:00
}
2017-07-04 10:49:07 +00:00
}
2017-10-08 03:01:49 +00:00
2020-08-18 20:11:44 +00:00
return string . Format ( "({0})" , string . Join ( " OR " , clauses ) ) ;
2017-07-02 00:21:39 +00:00
}
2020-08-18 20:11:44 +00:00
public PagingSpec < Album > AlbumsWhereCutoffUnmet ( PagingSpec < Album > pagingSpec , List < QualitiesBelowCutoff > qualitiesBelowCutoff )
2017-10-17 04:05:03 +00:00
{
2020-08-18 20:11:44 +00:00
pagingSpec . Records = GetPagedRecords ( AlbumsWhereCutoffUnmetBuilder ( qualitiesBelowCutoff ) , pagingSpec , PagedQuery ) ;
2017-10-17 04:05:03 +00:00
2022-01-26 00:08:27 +00:00
var countTemplate = $"SELECT COUNT(*) FROM (SELECT /**select**/ FROM \" { TableMapping . Mapper . TableNameMapping ( typeof ( Album ) ) } \ " /**join**/ /**innerjoin**/ /**leftjoin**/ /**where**/ /**groupby**/ /**having**/) AS \"Inner\"" ;
2020-08-18 20:11:44 +00:00
pagingSpec . TotalRecords = GetPagedRecordCount ( AlbumsWhereCutoffUnmetBuilder ( qualitiesBelowCutoff ) . Select ( typeof ( Album ) ) , pagingSpec , countTemplate ) ;
2017-10-17 04:05:03 +00:00
2020-08-18 20:11:44 +00:00
return pagingSpec ;
2017-10-17 04:05:03 +00:00
}
2020-08-18 20:11:44 +00:00
public List < Album > AlbumsBetweenDates ( DateTime startDate , DateTime endDate , bool includeUnmonitored )
2017-10-17 04:05:03 +00:00
{
2022-01-26 00:08:27 +00:00
SqlBuilder builder ;
builder = Builder ( ) . Where < Album > ( rg = > rg . ReleaseDate > = startDate & & rg . ReleaseDate < = endDate ) ;
2017-10-17 04:05:03 +00:00
2020-08-18 20:11:44 +00:00
if ( ! includeUnmonitored )
2017-10-17 04:05:03 +00:00
{
2020-08-18 20:11:44 +00:00
builder = builder . Where < Album > ( e = > e . Monitored = = true )
2022-01-26 00:08:27 +00:00
. Join < Album , Artist > ( ( l , r ) = > l . ArtistMetadataId = = r . ArtistMetadataId )
. Where < Artist > ( e = > e . Monitored = = true ) ;
2017-10-17 04:05:03 +00:00
}
2020-08-18 20:11:44 +00:00
return Query ( builder ) ;
2017-10-17 04:05:03 +00:00
}
2020-08-18 20:11:44 +00:00
public List < Album > ArtistAlbumsBetweenDates ( Artist artist , DateTime startDate , DateTime endDate , bool includeUnmonitored )
2017-10-17 04:05:03 +00:00
{
2022-01-26 00:08:27 +00:00
SqlBuilder builder ;
builder = Builder ( ) . Where < Album > ( rg = > rg . ReleaseDate > = startDate & &
rg . ReleaseDate < = endDate & &
rg . ArtistMetadataId = = artist . ArtistMetadataId ) ;
2017-10-17 04:05:03 +00:00
2020-08-18 20:11:44 +00:00
if ( ! includeUnmonitored )
2017-10-17 04:05:03 +00:00
{
2020-08-18 20:11:44 +00:00
builder = builder . Where < Album > ( e = > e . Monitored = = true )
2022-01-26 00:08:27 +00:00
. Join < Album , Artist > ( ( l , r ) = > l . ArtistMetadataId = = r . ArtistMetadataId )
. Where < Artist > ( e = > e . Monitored = = true ) ;
2017-10-17 04:05:03 +00:00
}
2020-08-18 20:11:44 +00:00
return Query ( builder ) ;
2017-10-17 04:05:03 +00:00
}
2017-06-25 13:17:49 +00:00
public void SetMonitoredFlat ( Album album , bool monitored )
{
album . Monitored = monitored ;
SetFields ( album , p = > p . Monitored ) ;
}
2017-09-04 02:20:56 +00:00
public void SetMonitored ( IEnumerable < int > ids , bool monitored )
{
2020-08-18 20:11:44 +00:00
var albums = ids . Select ( x = > new Album { Id = x , Monitored = monitored } ) . ToList ( ) ;
SetFields ( albums , p = > p . Monitored ) ;
2017-09-04 02:20:56 +00:00
}
2018-12-15 00:02:43 +00:00
public Album FindByTitle ( int artistMetadataId , string title )
2017-08-14 02:58:42 +00:00
{
2018-10-20 22:09:12 +00:00
var cleanTitle = Parser . Parser . CleanArtistName ( title ) ;
2020-01-03 12:49:24 +00:00
2018-10-20 22:09:12 +00:00
if ( string . IsNullOrEmpty ( cleanTitle ) )
2020-01-03 12:49:24 +00:00
{
2018-10-20 22:09:12 +00:00
cleanTitle = title ;
2020-01-03 12:49:24 +00:00
}
2020-08-18 20:11:44 +00:00
return Query ( s = > ( s . CleanTitle = = cleanTitle | | s . Title = = title ) & & s . ArtistMetadataId = = artistMetadataId )
. ExclusiveOrDefault ( ) ;
2017-07-03 18:39:06 +00:00
}
2018-04-07 04:52:28 +00:00
2018-12-15 00:02:43 +00:00
public Album FindAlbumByRelease ( string albumReleaseId )
2018-04-07 04:52:28 +00:00
{
2020-08-18 20:11:44 +00:00
return Query ( Builder ( ) . Join < Album , AlbumRelease > ( ( a , r ) = > a . Id = = r . AlbumId )
. Where < AlbumRelease > ( x = > x . ForeignReleaseId = = albumReleaseId ) ) . FirstOrDefault ( ) ;
2018-04-07 04:52:28 +00:00
}
2018-04-08 06:25:34 +00:00
2018-12-15 00:02:43 +00:00
public Album FindAlbumByTrack ( int trackId )
2018-04-08 06:25:34 +00:00
{
2020-08-18 20:11:44 +00:00
return Query ( Builder ( ) . Join < Album , AlbumRelease > ( ( a , r ) = > a . Id = = r . AlbumId )
. Join < AlbumRelease , Track > ( ( r , t ) = > r . Id = = t . AlbumReleaseId )
. Where < Track > ( x = > x . Id = = trackId ) ) . FirstOrDefault ( ) ;
2018-12-15 00:02:43 +00:00
}
2018-04-08 06:25:34 +00:00
2018-12-15 00:02:43 +00:00
public List < Album > GetArtistAlbumsWithFiles ( Artist artist )
{
2020-08-18 20:11:44 +00:00
var id = artist . ArtistMetadataId ;
2022-01-26 00:08:27 +00:00
2020-08-18 20:11:44 +00:00
return Query ( Builder ( ) . Join < Album , AlbumRelease > ( ( a , r ) = > a . Id = = r . AlbumId )
. Join < AlbumRelease , Track > ( ( r , t ) = > r . Id = = t . AlbumReleaseId )
. Join < Track , TrackFile > ( ( t , f ) = > t . TrackFileId = = f . Id )
. Where < Album > ( x = > x . ArtistMetadataId = = id )
. Where < AlbumRelease > ( r = > r . Monitored = = true )
. GroupBy < Album > ( x = > x . Id ) ) ;
2018-04-08 06:25:34 +00:00
}
2017-06-18 02:27:01 +00:00
}
}