diff --git a/src/NzbDrone.Core/Datastore/Migration/011_update_audio_qualities.cs b/src/NzbDrone.Core/Datastore/Migration/011_update_audio_qualities.cs new file mode 100644 index 000000000..6092e2598 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/011_update_audio_qualities.cs @@ -0,0 +1,155 @@ +using System.Collections.Generic; +using System.Data; +using System.Linq; +using Dapper; +using FluentMigrator; +using NzbDrone.Core.Datastore.Converters; +using NzbDrone.Core.Datastore.Migration.Framework; +using NzbDrone.Core.Profiles.Qualities; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(011)] + public class update_audio_qualities : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Execute.WithConnection(UpdateAudioQualities); + } + + private void UpdateAudioQualities(IDbConnection conn, IDbTransaction tran) + { + SqlMapper.AddTypeHandler(new EmbeddedDocumentConverter>(new QualityIntConverter())); + var updater = new ProfileUpdater10(conn, tran); + updater.SplitQualityAppend(10, 12); // Add M4B above MP3 + updater.SplitQualityPrepend(10, 13); // Add UnknownAudio below MP3 + updater.Commit(); + } + + public class Profile10 + { + public int Id { get; set; } + public string Name { get; set; } + public int Cutoff { get; set; } + public List Items { get; set; } + } + + public class ProfileItem10 + { + public int Quality { get; set; } + public bool Allowed { get; set; } + public List Items { get; set; } = new List(); + } + + public class ProfileUpdater10 + { + private readonly IDbConnection _connection; + private readonly IDbTransaction _transaction; + + private List _profiles; + private HashSet _changedProfiles = new HashSet(); + + public ProfileUpdater10(IDbConnection conn, IDbTransaction tran) + { + _connection = conn; + _transaction = tran; + + _profiles = _connection.Query(@"SELECT Id, Name, Cutoff, Items FROM QualityProfiles", + transaction: _transaction).ToList(); + } + + public void Commit() + { + var sql = "UPDATE QualityProfiles SET Name = @Name, Cutoff = @Cutoff, Items = @Items WHERE Id = @Id"; + _connection.Execute(sql, _changedProfiles, transaction: _transaction); + + _changedProfiles.Clear(); + } + + public void PrependQuality(int quality) + { + foreach (var profile in _profiles) + { + if (profile.Items.Any(v => v.Quality == quality)) + { + continue; + } + + profile.Items.Insert(0, new ProfileItem10 + { + Quality = quality, + Allowed = false + }); + + _changedProfiles.Add(profile); + } + } + + public void AppendQuality(int quality) + { + foreach (var profile in _profiles) + { + if (profile.Items.Any(v => v.Quality == quality)) + { + continue; + } + + profile.Items.Add(new ProfileItem10 + { + Quality = quality, + Allowed = false + }); + + _changedProfiles.Add(profile); + } + } + + public void SplitQualityPrepend(int find, int quality) + { + foreach (var profile in _profiles) + { + if (profile.Items.Any(v => v.Quality == quality)) + { + continue; + } + + var findIndex = profile.Items.FindIndex(v => v.Quality == find); + + profile.Items.Insert(findIndex, new ProfileItem10 + { + Quality = quality, + Allowed = profile.Items[findIndex].Allowed + }); + + if (profile.Cutoff == find) + { + profile.Cutoff = quality; + } + + _changedProfiles.Add(profile); + } + } + + public void SplitQualityAppend(int find, int quality) + { + foreach (var profile in _profiles) + { + if (profile.Items.Any(v => v.Quality == quality)) + { + continue; + } + + var findIndex = profile.Items.FindIndex(v => v.Quality == find); + + profile.Items.Insert(findIndex + 1, new ProfileItem10 + { + Quality = quality, + Allowed = profile.Items[findIndex].Allowed + }); + + _changedProfiles.Add(profile); + } + } + } + } +} diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileExtensions.cs b/src/NzbDrone.Core/MediaFiles/MediaFileExtensions.cs index 29346de64..f865e318b 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileExtensions.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileExtensions.cs @@ -33,7 +33,7 @@ namespace NzbDrone.Core.MediaFiles { ".wma", Quality.MP3_320 }, { ".m4a", Quality.MP3_320 }, { ".m4p", Quality.MP3_320 }, - { ".m4b", Quality.MP3_320 }, + { ".m4b", Quality.M4B }, { ".aac", Quality.MP3_320 }, { ".mp4a", Quality.MP3_320 }, { ".ogg", Quality.MP3_320 }, diff --git a/src/NzbDrone.Core/Parser/QualityParser.cs b/src/NzbDrone.Core/Parser/QualityParser.cs index 2f30c8c44..5f743416e 100644 --- a/src/NzbDrone.Core/Parser/QualityParser.cs +++ b/src/NzbDrone.Core/Parser/QualityParser.cs @@ -71,6 +71,9 @@ namespace NzbDrone.Core.Parser case Codec.WAVPACK: result.Quality = Quality.FLAC; break; + case Codec.AAC: + result.Quality = Quality.M4B; + break; case Codec.MP1: case Codec.MP2: case Codec.MP3VBR: @@ -78,7 +81,6 @@ namespace NzbDrone.Core.Parser case Codec.APE: case Codec.WMA: case Codec.WAV: - case Codec.AAC: case Codec.AACVBR: case Codec.OGG: case Codec.OPUS: @@ -219,15 +221,8 @@ namespace NzbDrone.Core.Parser case Codec.WAVPACK: case Codec.WAV: return Quality.FLAC; - case Codec.MP1: - case Codec.MP2: - case Codec.MP3VBR: - case Codec.MP3CBR: - case Codec.APE: - case Codec.WMA: case Codec.AAC: - case Codec.OGG: - case Codec.OPUS: + return Quality.M4B; default: return Quality.MP3_320; } diff --git a/src/NzbDrone.Core/Profiles/Qualities/QualityProfileService.cs b/src/NzbDrone.Core/Profiles/Qualities/QualityProfileService.cs index a130721dd..fd25eec9b 100644 --- a/src/NzbDrone.Core/Profiles/Qualities/QualityProfileService.cs +++ b/src/NzbDrone.Core/Profiles/Qualities/QualityProfileService.cs @@ -96,16 +96,17 @@ namespace NzbDrone.Core.Profiles.Qualities Quality.MOBI, Quality.EPUB, Quality.AZW3, + Quality.UnknownAudio, Quality.MP3_320, + Quality.M4B, Quality.FLAC); - AddDefaultProfile("Lossless Audio", - Quality.FLAC, - Quality.FLAC); - - AddDefaultProfile("Standard Audio", + AddDefaultProfile("Audio", Quality.MP3_320, - Quality.MP3_320); + Quality.UnknownAudio, + Quality.MP3_320, + Quality.M4B, + Quality.FLAC); AddDefaultProfile("Text", Quality.MOBI, diff --git a/src/NzbDrone.Core/Qualities/Quality.cs b/src/NzbDrone.Core/Qualities/Quality.cs index 35c7b451e..aaac812d8 100644 --- a/src/NzbDrone.Core/Qualities/Quality.cs +++ b/src/NzbDrone.Core/Qualities/Quality.cs @@ -70,13 +70,15 @@ namespace NzbDrone.Core.Qualities return !Equals(left, right); } - public static Quality Unknown => new Quality(0, "Unknown"); + public static Quality Unknown => new Quality(0, "Unknown Text"); public static Quality PDF => new Quality(1, "PDF"); public static Quality MOBI => new Quality(2, "MOBI"); public static Quality EPUB => new Quality(3, "EPUB"); public static Quality AZW3 => new Quality(4, "AZW3"); public static Quality MP3_320 => new Quality(10, "MP3-320"); public static Quality FLAC => new Quality(11, "FLAC"); + public static Quality M4B => new Quality(12, "M4B"); + public static Quality UnknownAudio => new Quality(13, "Unknown Audio"); static Quality() { @@ -87,7 +89,9 @@ namespace NzbDrone.Core.Qualities MOBI, EPUB, AZW3, + UnknownAudio, MP3_320, + M4B, FLAC }; @@ -99,13 +103,15 @@ namespace NzbDrone.Core.Qualities DefaultQualityDefinitions = new HashSet { - new QualityDefinition(Quality.Unknown) { Weight = 1, MinSize = 0, MaxSize = 350, GroupWeight = 1 }, - new QualityDefinition(Quality.PDF) { Weight = 5, MinSize = 0, MaxSize = 350, GroupWeight = 2 }, - new QualityDefinition(Quality.MOBI) { Weight = 10, MinSize = 0, MaxSize = 350, GroupWeight = 10 }, - new QualityDefinition(Quality.EPUB) { Weight = 11, MinSize = 0, MaxSize = 350, GroupWeight = 11 }, - new QualityDefinition(Quality.AZW3) { Weight = 12, MinSize = 0, MaxSize = 350, GroupWeight = 12 }, - new QualityDefinition(Quality.MP3_320) { Weight = 100, MinSize = 0, MaxSize = 350, GroupWeight = 100 }, - new QualityDefinition(Quality.FLAC) { Weight = 110, MinSize = 0, MaxSize = null, GroupWeight = 110 }, + new QualityDefinition(Quality.Unknown) { Weight = 1, MinSize = 0, MaxSize = 350, GroupWeight = 1 }, + new QualityDefinition(Quality.PDF) { Weight = 5, MinSize = 0, MaxSize = 350, GroupWeight = 2 }, + new QualityDefinition(Quality.MOBI) { Weight = 10, MinSize = 0, MaxSize = 350, GroupWeight = 10 }, + new QualityDefinition(Quality.EPUB) { Weight = 11, MinSize = 0, MaxSize = 350, GroupWeight = 11 }, + new QualityDefinition(Quality.AZW3) { Weight = 12, MinSize = 0, MaxSize = 350, GroupWeight = 12 }, + new QualityDefinition(Quality.UnknownAudio) { Weight = 50, MinSize = 0, MaxSize = 350, GroupWeight = 50 }, + new QualityDefinition(Quality.MP3_320) { Weight = 100, MinSize = 0, MaxSize = 350, GroupWeight = 100 }, + new QualityDefinition(Quality.M4B) { Weight = 105, MinSize = 0, MaxSize = 350, GroupWeight = 105 }, + new QualityDefinition(Quality.FLAC) { Weight = 110, MinSize = 0, MaxSize = null, GroupWeight = 110 }, }; }