/// <summary>Gets the subset audio file IDs.</summary> /// <param name="subsetID">The subset identifier.</param> /// <param name="minDuration">The minimum duration.</param> /// <param name="maxDuration">The maximum duration.</param> /// <returns></returns> public IList <long> GetSubsetAudioFileIDs(long subsetID, TimeSpan minDuration, TimeSpan maxDuration) { Search search = Search.None; #region whitelist { var whitelist = SubsetFilters.GetStructs(Search.FieldEquals(nameof(MDBSubsetFilter.SubsetID), subsetID) & Search.FieldEquals(nameof(MDBSubsetFilter.Mode), MDBSubsetFilterMode.Whitelist)); foreach (MDBSubsetFilter filter in whitelist) { switch (filter.Type) { case MDBSubsetFilterType.Album: foreach (long albumID in Albums.FindRows(Search.FieldLike(nameof(MDBAlbum.Name), MDBSearch.Text(filter.Text)))) { search |= Search.FieldEquals(nameof(MDBAudioFile.AlbumID), albumID); } break; case MDBSubsetFilterType.Artist: foreach (long artistID in Artists.FindRows(Search.FieldLike(nameof(MDBArtist.Name), MDBSearch.Text(filter.Text)))) { search |= Search.FieldEquals(nameof(MDBAudioFile.SongArtistID), artistID); } break; case MDBSubsetFilterType.Category: { var ids = Categories.FindRows(nameof(MDBCategory.Name), MDBSearch.Text(filter.Text)); if (ids.Count != 1) { this.LogError(string.Format("Error at SubsetFilter {0}", filter)); } foreach (long id in ids) { search |= Search.FieldEquals(nameof(MDBAudioFile.CategoryID), id); } break; } case MDBSubsetFilterType.Tag: { search |= Search.FieldLike(nameof(MDBAudioFile.Tags), MDBSearch.Text(filter.Text)); break; } case MDBSubsetFilterType.Genre: { search |= Search.FieldLike(nameof(MDBAudioFile.Genres), MDBSearch.Text(filter.Text)); break; } case MDBSubsetFilterType.Title: { search |= Search.FieldLike("Title", MDBSearch.Text(filter.Text)); break; } default: this.LogError(string.Format("Unknown SubsetType at SubsetFilter {0}", filter)); break; } } } #endregion #region blacklist { var blacklist = SubsetFilters.GetStructs(Search.FieldEquals(nameof(MDBSubsetFilter.SubsetID), subsetID) & Search.FieldEquals(nameof(MDBSubsetFilter.Mode), MDBSubsetFilterMode.Blacklist)); foreach (MDBSubsetFilter filter in blacklist) { switch (filter.Type) { case MDBSubsetFilterType.Album: foreach (long albumID in Albums.FindRows(Search.FieldLike(nameof(MDBAlbum.Name), MDBSearch.Text(filter.Text)))) { search &= !Search.FieldEquals(nameof(MDBAudioFile.AlbumID), albumID); } break; case MDBSubsetFilterType.Artist: foreach (long artistID in Artists.FindRows(Search.FieldLike(nameof(MDBArtist.Name), MDBSearch.Text(filter.Text)))) { search &= !Search.FieldEquals(nameof(MDBAudioFile.SongArtistID), artistID); } break; case MDBSubsetFilterType.Category: { var ids = Categories.FindRows(nameof(MDBCategory.Name), MDBSearch.Text(filter.Text)); if (ids.Count != 1) { this.LogError(string.Format("Error at SubsetFilter {0}", filter)); } foreach (long id in ids) { search &= !Search.FieldEquals(nameof(MDBAudioFile.CategoryID), id); } break; } case MDBSubsetFilterType.Tag: { search &= !Search.FieldLike(nameof(MDBAudioFile.Tags), MDBSearch.Text(filter.Text)); break; } case MDBSubsetFilterType.Genre: { search &= !Search.FieldLike(nameof(MDBAudioFile.Genres), MDBSearch.Text(filter.Text)); break; } case MDBSubsetFilterType.Title: { search &= !Search.FieldLike("Title", MDBSearch.Text(filter.Text)); break; } default: this.LogError(string.Format("Unknown SubsetType at SubsetFilter {0}", filter)); break; } } } #endregion if (minDuration > TimeSpan.Zero) { search &= Search.FieldGreaterOrEqual(nameof(MDBAudioFile.Duration), minDuration); } if (maxDuration > minDuration) { search &= Search.FieldSmallerOrEqual(nameof(MDBAudioFile.Duration), maxDuration); } return(AudioFiles.FindRows(search)); }