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.
Readarr/src/NzbDrone.Core/Datastore/Migration/011_update_audio_qualities.cs

156 lines
5.0 KiB

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<List<ProfileItem10>>(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<ProfileItem10> Items { get; set; }
}
public class ProfileItem10
{
public int Quality { get; set; }
public bool Allowed { get; set; }
public List<ProfileItem10> Items { get; set; } = new List<ProfileItem10>();
}
public class ProfileUpdater10
{
private readonly IDbConnection _connection;
private readonly IDbTransaction _transaction;
private List<Profile10> _profiles;
private HashSet<Profile10> _changedProfiles = new HashSet<Profile10>();
public ProfileUpdater10(IDbConnection conn, IDbTransaction tran)
{
_connection = conn;
_transaction = tran;
_profiles = _connection.Query<Profile10>(@"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);
}
}
}
}
}