mirror of
https://github.com/yaobiao131/downkyicore.git
synced 2025-08-10 00:52:31 +00:00
refactor: 重构数据库并优化下载列表相关逻辑
This commit is contained in:
@@ -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>();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user