refactor: 重构数据库并优化下载列表相关逻辑

This commit is contained in:
yaobiao131
2025-06-16 21:02:26 +08:00
parent 58d66986c8
commit 31dfd6ffaf
24 changed files with 912 additions and 731 deletions

View File

@@ -12,17 +12,16 @@ using DownKyi.Core.BiliApi.Login;
using DownKyi.Core.Storage;
using DownKyi.Core.Storage.Database;
using DownKyi.Models;
using FreeSql;
using Prism.Commands;
using Prism.Services.Dialogs;
using SqlSugar;
using Exception = System.Exception;
namespace DownKyi.ViewModels.Dialogs;
public class ViewUpgradingDialogViewModel : BaseDialogViewModel
{
public const string Tag = "DialogLoading";
private readonly ISqlSugarClient _sqlSugarClient;
private readonly IBaseRepository<Downloaded> _downloadedRepository;
#region
@@ -70,9 +69,9 @@ public class ViewUpgradingDialogViewModel : BaseDialogViewModel
#endregion
public ViewUpgradingDialogViewModel(ISqlSugarClient sqlSugarClient)
public ViewUpgradingDialogViewModel(IBaseRepository<Downloaded> downloadedRepository)
{
_sqlSugarClient = sqlSugarClient;
_downloadedRepository = downloadedRepository;
Message = "数据迁移中、请不要关闭软件";
}
@@ -90,7 +89,6 @@ public class ViewUpgradingDialogViewModel : BaseDialogViewModel
{
Task.Run(() => { Upgrade1_0_20To1_0_21(); });
}
private void Upgrade1_0_20To1_0_21()
{
@@ -137,18 +135,25 @@ public class ViewUpgradingDialogViewModel : BaseDialogViewModel
{
noMigrate = true;
}
#if DEBUG
var oldDbPath = StorageManager.GetDownload().Replace(".db", "_debug.db");
#else
var oldDbPath = StorageManager.GetDownload();
#endif
if (File.Exists(oldDbPath))
{
SetMessage("正在迁移下载信息");
#if DEBUG
var dbHelper = new SqliteDatabase(oldDbPath);
#else
var dbHelper = new SqliteDatabase(oldDbPath, "bdb8eb69-3698-4af9-b722-9312d0fba623");
#endif
var validRecords = new Dictionary<string, DownloadedWithData>();
var totalCount = 0;
dbHelper.ExecuteQuery(@"SELECT d.id, d.data as downloaded_data, db.data as download_base_data
FROM downloaded d
JOIN download_base db ON d.id = db.id",reader =>
JOIN download_base db ON d.id = db.id", reader =>
{
while (reader.Read())
{
@@ -161,23 +166,24 @@ public class ViewUpgradingDialogViewModel : BaseDialogViewModel
// 反序列化
var record = NrbfDecoder.DecodeClassRecord(stream);
if (!record.TypeNameMatches(typeof(Downloaded))) continue;
var downloadedObj = new Downloaded
{
Id = reader["id"].ToString() ?? Guid.NewGuid().ToString("N"),
MaxSpeedDisplay = record.GetString($"<{nameof(Downloaded.MaxSpeedDisplay)}>k__BackingField"),
FinishedTime = record.GetString($"<{nameof(Downloaded.FinishedTime)}>k__BackingField") ?? "",
FinishedTimestamp = record.GetInt64($"<{nameof(Downloaded.FinishedTimestamp)}>k__BackingField")
};
validRecords.Add(
(string)reader["id"],
new DownloadedWithData
{
(string)reader["id"],
new DownloadedWithData
{
Downloaded = downloadedObj,
DownloadBaseData = (byte[])reader["download_base_data"]
});
totalCount++;
}
catch (Exception e)
@@ -212,15 +218,13 @@ public class ViewUpgradingDialogViewModel : BaseDialogViewModel
return quality;
});
var i = 0;
try
{
int batchSize = 200;
const int batchSize = 200;
var downloadedList = new List<Downloaded>();
int processedCount = 0;
var processedCount = 0;
_sqlSugarClient.Ado.BeginTran();
foreach (var item in validRecords)
{
try
@@ -229,17 +233,16 @@ public class ViewUpgradingDialogViewModel : BaseDialogViewModel
var record = NrbfDecoder.DecodeClassRecord(stream);
if (record.TypeNameMatches(typeof(DownloadBase)))
{
var needDownloadContentRecord =
record.GetClassRecord($"<{nameof(DownloadBase.NeedDownloadContent)}>k__BackingField");
var needDownloadContent = needDownloadContentRecord != null
? readNeedDownloadContent(needDownloadContentRecord)
: new Dictionary<string, bool>();
var needDownloadContentRecord = record.GetClassRecord($"<{nameof(DownloadBase.NeedDownloadContent)}>k__BackingField");
var needDownloadContent = needDownloadContentRecord != null ? readNeedDownloadContent(needDownloadContentRecord) : new Dictionary<string, bool>();
var download = new Downloaded
{
Id = item.Value.Downloaded.Id,
MaxSpeedDisplay = item.Value.Downloaded.MaxSpeedDisplay,
FinishedTime = item.Value.Downloaded.FinishedTime,
FinishedTimestamp = item.Value.Downloaded.FinishedTimestamp,
DownloadBase = new DownloadBase
{
NeedDownloadContent = needDownloadContent,
@@ -247,77 +250,56 @@ public class ViewUpgradingDialogViewModel : BaseDialogViewModel
Avid = record.GetInt64($"<{nameof(DownloadBase.Avid)}>k__BackingField"),
Cid = record.GetInt64($"<{nameof(DownloadBase.Cid)}>k__BackingField"),
EpisodeId = record.GetInt64($"<{nameof(DownloadBase.EpisodeId)}>k__BackingField"),
CoverUrl = record.GetString($"<{nameof(DownloadBase.CoverUrl)}>k__BackingField") ??
"",
PageCoverUrl =
record.GetString($"<{nameof(DownloadBase.PageCoverUrl)}>k__BackingField") ?? "",
CoverUrl = record.GetString($"<{nameof(DownloadBase.CoverUrl)}>k__BackingField") ?? "",
PageCoverUrl = record.GetString($"<{nameof(DownloadBase.PageCoverUrl)}>k__BackingField") ?? "",
ZoneId = record.GetInt32($"<{nameof(DownloadBase.ZoneId)}>k__BackingField"),
Order = record.GetInt32($"<{nameof(DownloadBase.Order)}>k__BackingField"),
MainTitle =
record.GetString($"<{nameof(DownloadBase.MainTitle)}>k__BackingField") ?? "",
MainTitle = record.GetString($"<{nameof(DownloadBase.MainTitle)}>k__BackingField") ?? "",
Name = record.GetString($"<{nameof(DownloadBase.Name)}>k__BackingField") ?? "",
Duration = record.GetString($"<{nameof(DownloadBase.Duration)}>k__BackingField") ??
"",
VideoCodecName =
record.GetString($"<{nameof(DownloadBase.VideoCodecName)}>k__BackingField") ??
"",
Resolution =
readQuality(
record.GetClassRecord(
$"<{nameof(DownloadBase.Resolution)}>k__BackingField")),
AudioCodec =
readQuality(
record.GetClassRecord(
$"<{nameof(DownloadBase.AudioCodec)}>k__BackingField")),
FilePath = record.GetString($"<{nameof(DownloadBase.FilePath)}>k__BackingField") ??
"",
FileSize = record.GetString($"<{nameof(DownloadBase.FileSize)}>k__BackingField") ??
"",
Duration = record.GetString($"<{nameof(DownloadBase.Duration)}>k__BackingField") ?? "",
VideoCodecName = record.GetString($"<{nameof(DownloadBase.VideoCodecName)}>k__BackingField") ?? "",
Resolution = readQuality(record.GetClassRecord($"<{nameof(DownloadBase.Resolution)}>k__BackingField")),
AudioCodec = readQuality(record.GetClassRecord($"<{nameof(DownloadBase.AudioCodec)}>k__BackingField")),
FilePath = record.GetString($"<{nameof(DownloadBase.FilePath)}>k__BackingField") ?? "",
FileSize = record.GetString($"<{nameof(DownloadBase.FileSize)}>k__BackingField") ?? "",
Page = record.GetInt32($"<{nameof(DownloadBase.Page)}>k__BackingField")
}
};
downloadedList.Add(download);
processedCount++;
if (processedCount % batchSize == 0 || processedCount == totalCount)
if (processedCount % batchSize != 0 && processedCount != totalCount) continue;
_downloadedRepository.Insert(downloadedList);
downloadedList.Clear();
// 更新进度
var percent = processedCount / (double)totalCount * 100;
Dispatcher.UIThread.Invoke(() =>
{
_sqlSugarClient.InsertNav(downloadedList)
.Include(o1 => o1.DownloadBase)
.ExecuteCommand();
downloadedList.Clear();
// 更新进度
var percent = processedCount / (double)totalCount * 100;
Dispatcher.UIThread.Invoke(() =>
{
Percent = percent;
SetMessage($"正在迁移下载信息({processedCount}/{totalCount})");
});
}
Percent = percent;
SetMessage($"正在迁移下载信息({processedCount}/{totalCount})");
});
}
}
catch (Exception ex)
{
/*忽略*/
Console.WriteLine(ex.ToString());
}
}
_sqlSugarClient.Ado.CommitTran();
dbHelper.Dispose();
File.Delete(oldDbPath);
Dispatcher.UIThread.Invoke(() =>
{
RestartVisible = true;
SetMessage("下载信息迁移完成");
App.Current.RefreshDownloadedList();
});
}
catch (Exception e)
{
_sqlSugarClient.Ado.RollbackTran();
SetMessage($"迁移失败: {e.Message}");
}
}
else
{
@@ -329,11 +311,10 @@ public class ViewUpgradingDialogViewModel : BaseDialogViewModel
Dispatcher.UIThread.Invoke(() => RaiseRequestClose(new DialogResult()));
}
}
private class DownloadedWithData
{
public Downloaded Downloaded { get; set; }
public byte[] DownloadBaseData { get; set; }
public Downloaded Downloaded { get; set; } = new();
public byte[] DownloadBaseData { get; set; } = Array.Empty<byte>();
}
}