mirror of
https://github.com/leiurayer/downkyi.git
synced 2024-04-21 12:41:55 +00:00
完成下载列表存储功能
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
namespace DownKyi.Core.BiliApi.BiliUtils
|
||||
using System;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.BiliUtils
|
||||
{
|
||||
[Serializable]
|
||||
public class Quality
|
||||
{
|
||||
public string Name { get; set; }
|
||||
|
||||
@@ -79,7 +79,6 @@ namespace DownKyi.Core.Storage.Database
|
||||
{
|
||||
string sql = $"select * from {tableName} where url glob '{url}'";
|
||||
List<Cover> query = Query(sql);
|
||||
|
||||
return query.Count > 0 ? query[0] : null;
|
||||
}
|
||||
|
||||
@@ -91,16 +90,8 @@ namespace DownKyi.Core.Storage.Database
|
||||
public Cover QueryByMd5(string md5)
|
||||
{
|
||||
string sql = $"select * from {tableName} where md5 glob '{md5}'";
|
||||
var query = Query(sql);
|
||||
|
||||
if (query.Count > 0)
|
||||
{
|
||||
return query[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
List<Cover> query = Query(sql);
|
||||
return query.Count > 0 ? query[0] : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -57,7 +57,60 @@ namespace DownKyi.Core.Storage.Database.Download
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("Insert()发生异常: {0}", e);
|
||||
LogManager.Error("DownloadingDb", e);
|
||||
LogManager.Error($"{tableName}", e);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除uuid对应的数据
|
||||
/// </summary>
|
||||
/// <param name="uuid"></param>
|
||||
public void Delete(string uuid)
|
||||
{
|
||||
try
|
||||
{
|
||||
string sql = $"delete from {tableName} where id glob '{uuid}'";
|
||||
dbHelper.ExecuteNonQuery(sql);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("Delete()发生异常: {0}", e);
|
||||
LogManager.Error($"{tableName}", e);
|
||||
}
|
||||
}
|
||||
|
||||
public void Update(string uuid, object obj)
|
||||
{
|
||||
// 定义一个流
|
||||
Stream stream = new MemoryStream();
|
||||
// 定义一个格式化器
|
||||
BinaryFormatter formatter = new BinaryFormatter();
|
||||
// 序列化
|
||||
formatter.Serialize(stream, obj);
|
||||
|
||||
byte[] array = null;
|
||||
array = new byte[stream.Length];
|
||||
|
||||
//将二进制流写入数组
|
||||
stream.Position = 0;
|
||||
stream.Read(array, 0, (int)stream.Length);
|
||||
|
||||
//关闭流
|
||||
stream.Close();
|
||||
|
||||
try
|
||||
{
|
||||
string sql = $"update {tableName} set data=@data where id glob @id";
|
||||
dbHelper.ExecuteNonQuery(sql, new Action<SQLiteParameterCollection>((para) =>
|
||||
{
|
||||
para.Add("@id", DbType.String).Value = uuid;
|
||||
para.Add("@data", DbType.Binary).Value = array;
|
||||
}));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("Insert()发生异常: {0}", e);
|
||||
LogManager.Error($"{tableName}", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,6 +125,27 @@ namespace DownKyi.Core.Storage.Database.Download
|
||||
return Query(sql);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询uuid对应的数据
|
||||
/// </summary>
|
||||
/// <param name="uuid"></param>
|
||||
/// <returns></returns>
|
||||
public object QueryById(string uuid)
|
||||
{
|
||||
string sql = $"select * from {tableName} where id glob '{uuid}'";
|
||||
Dictionary<string, object> query = Query(sql);
|
||||
|
||||
if (query.ContainsKey(uuid))
|
||||
{
|
||||
query.TryGetValue(uuid, out object obj);
|
||||
return obj;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询数据
|
||||
/// </summary>
|
||||
@@ -88,7 +162,7 @@ namespace DownKyi.Core.Storage.Database.Download
|
||||
// 读取字节数组
|
||||
byte[] array = (byte[])reader["data"];
|
||||
// 定义一个流
|
||||
MemoryStream stream = new MemoryStream(null);
|
||||
MemoryStream stream = new MemoryStream(array);
|
||||
//定义一个格式化器
|
||||
BinaryFormatter formatter = new BinaryFormatter();
|
||||
// 反序列化
|
||||
|
||||
@@ -78,11 +78,9 @@ namespace DownKyi.Core.Storage.Database
|
||||
{
|
||||
string sql = $"select * from {tableName} where mid={mid}";
|
||||
List<Header> query = Query(sql);
|
||||
|
||||
return query.Count > 0 ? query[0] : null;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 查询数据
|
||||
/// </summary>
|
||||
|
||||
+82
-1
@@ -15,7 +15,9 @@ using Prism.Ioc;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Collections.Specialized;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
|
||||
namespace DownKyi
|
||||
@@ -25,6 +27,7 @@ namespace DownKyi
|
||||
/// </summary>
|
||||
public partial class App
|
||||
{
|
||||
public static Dictionary<string, object> Dictionary = new Dictionary<string, object>();
|
||||
public static ObservableCollection<DownloadingItem> DownloadingList { get; set; }
|
||||
public static ObservableCollection<DownloadedItem> DownloadedList { get; set; }
|
||||
|
||||
@@ -45,7 +48,68 @@ namespace DownKyi
|
||||
DownloadingList = new ObservableCollection<DownloadingItem>();
|
||||
DownloadedList = new ObservableCollection<DownloadedItem>();
|
||||
|
||||
// TODO 从数据库读取
|
||||
// 下载数据存储服务
|
||||
DownloadStorageService downloadStorageService = new DownloadStorageService();
|
||||
|
||||
// 从数据库读取
|
||||
List<DownloadingItem> downloadingItems = downloadStorageService.GetDownloading();
|
||||
List<DownloadedItem> downloadedItems = downloadStorageService.GetDownloaded();
|
||||
DownloadingList.AddRange(downloadingItems);
|
||||
DownloadedList.AddRange(downloadedItems);
|
||||
|
||||
// 下载列表发生变化时执行的任务
|
||||
DownloadingList.CollectionChanged += new NotifyCollectionChangedEventHandler((object sender, NotifyCollectionChangedEventArgs e) =>
|
||||
{
|
||||
if (e.Action == NotifyCollectionChangedAction.Add)
|
||||
{
|
||||
foreach (object item in e.NewItems)
|
||||
{
|
||||
if (item is DownloadingItem downloading)
|
||||
{
|
||||
//Console.WriteLine("DownloadingList添加");
|
||||
downloadStorageService.AddDownloading(downloading);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (e.Action == NotifyCollectionChangedAction.Remove)
|
||||
{
|
||||
foreach (object item in e.OldItems)
|
||||
{
|
||||
if (item is DownloadingItem downloading)
|
||||
{
|
||||
//Console.WriteLine("DownloadingList移除");
|
||||
downloadStorageService.RemoveDownloading(downloading);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 下载完成列表发生变化时执行的任务
|
||||
DownloadedList.CollectionChanged += new NotifyCollectionChangedEventHandler((object sender, NotifyCollectionChangedEventArgs e) =>
|
||||
{
|
||||
if (e.Action == NotifyCollectionChangedAction.Add)
|
||||
{
|
||||
foreach (object item in e.NewItems)
|
||||
{
|
||||
if (item is DownloadedItem downloaded)
|
||||
{
|
||||
//Console.WriteLine("DownloadedList添加");
|
||||
downloadStorageService.AddDownloaded(downloaded);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (e.Action == NotifyCollectionChangedAction.Remove)
|
||||
{
|
||||
foreach (object item in e.OldItems)
|
||||
{
|
||||
if (item is DownloadedItem downloaded)
|
||||
{
|
||||
//Console.WriteLine("DownloadedList移除");
|
||||
downloadStorageService.RemoveDownloaded(downloaded);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 启动下载服务
|
||||
downloadService = new AriaDownloadService(DownloadingList, DownloadedList);
|
||||
@@ -54,6 +118,23 @@ namespace DownKyi
|
||||
return Container.Resolve<MainWindow>();
|
||||
}
|
||||
|
||||
protected override void OnStartup(StartupEventArgs e)
|
||||
{
|
||||
Thread thread = new Thread(() =>
|
||||
{
|
||||
SplashWindow sw = new SplashWindow();
|
||||
// 储存
|
||||
Dictionary["SplashWindow"] = sw;
|
||||
// 不能用Show
|
||||
sw.ShowDialog();
|
||||
});
|
||||
// 设置单线程
|
||||
thread.SetApartmentState(ApartmentState.STA);
|
||||
thread.Start();
|
||||
|
||||
base.OnStartup(e);
|
||||
}
|
||||
|
||||
protected override void OnExit(ExitEventArgs e)
|
||||
{
|
||||
// 关闭下载服务
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
<Compile Include="Models\Downloaded.cs" />
|
||||
<Compile Include="Models\Downloading.cs" />
|
||||
<Compile Include="Models\DownloadStatus.cs" />
|
||||
<Compile Include="Services\Download\DownloadStorageService.cs" />
|
||||
<Compile Include="ViewModels\PageViewModels\Favorites.cs" />
|
||||
<Compile Include="ViewModels\PageViewModels\FavoritesMedia.cs" />
|
||||
<Compile Include="ViewModels\Settings\DisplayFileNamePart.cs" />
|
||||
@@ -168,6 +169,9 @@
|
||||
<Compile Include="Views\Settings\ViewVideo.xaml.cs">
|
||||
<DependentUpon>ViewVideo.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\SplashWindow.xaml.cs">
|
||||
<DependentUpon>SplashWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\Toolbox\ViewBiliHelper.xaml.cs">
|
||||
<DependentUpon>ViewBiliHelper.xaml</DependentUpon>
|
||||
</Compile>
|
||||
@@ -320,6 +324,10 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\SplashWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\Toolbox\ViewBiliHelper.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace DownKyi.Models
|
||||
public string Uuid { get; }
|
||||
|
||||
// 需要下载的内容
|
||||
public Dictionary<string, bool> NeedDownloadContent { get; private set; }
|
||||
public Dictionary<string, bool> NeedDownloadContent { get; set; }
|
||||
|
||||
// 视频的id
|
||||
public string Bvid { get; set; }
|
||||
|
||||
@@ -10,14 +10,14 @@ namespace DownKyi.Models
|
||||
public Downloading() : base()
|
||||
{
|
||||
// 初始化下载的文件列表
|
||||
DownloadFiles = new List<string>();
|
||||
DownloadFiles = new Dictionary<string, string>();
|
||||
}
|
||||
|
||||
// Aria相关
|
||||
public string Gid { get; set; }
|
||||
|
||||
// 下载的文件
|
||||
public List<string> DownloadFiles { get; private set; }
|
||||
public Dictionary<string, string> DownloadFiles { get; set; }
|
||||
|
||||
// 视频类别
|
||||
public PlayStreamType PlayStreamType { get; set; }
|
||||
|
||||
@@ -125,8 +125,18 @@ namespace DownKyi.Services.Download
|
||||
// 下载文件名
|
||||
string fileName = Guid.NewGuid().ToString("N");
|
||||
|
||||
// 记录本次下载的文件
|
||||
downloading.Downloading.DownloadFiles.Add(fileName);
|
||||
string key = $"{downloadVideo.Id}_{downloadVideo.Codecs}";
|
||||
if (downloading.Downloading.DownloadFiles.ContainsKey(key))
|
||||
{
|
||||
// 如果存在,表示下载过,
|
||||
// 则继续使用上次下载的文件名
|
||||
fileName = downloading.Downloading.DownloadFiles[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
// 记录本次下载的文件
|
||||
downloading.Downloading.DownloadFiles.Add(key, fileName);
|
||||
}
|
||||
|
||||
// 开始下载
|
||||
DownloadResult downloadStatus = DownloadByAria(downloading, urls, path, fileName);
|
||||
@@ -173,7 +183,10 @@ namespace DownKyi.Services.Download
|
||||
File.Copy(cover, fileName, true);
|
||||
|
||||
// 记录本次下载的文件
|
||||
downloading.Downloading.DownloadFiles.Add(fileName);
|
||||
if (!downloading.Downloading.DownloadFiles.ContainsKey(coverUrl))
|
||||
{
|
||||
downloading.Downloading.DownloadFiles.Add(coverUrl, fileName);
|
||||
}
|
||||
|
||||
return fileName;
|
||||
}
|
||||
@@ -204,7 +217,10 @@ namespace DownKyi.Services.Download
|
||||
string assFile = $"{downloading.DownloadBase.FilePath}.ass";
|
||||
|
||||
// 记录本次下载的文件
|
||||
downloading.Downloading.DownloadFiles.Add(assFile);
|
||||
if (!downloading.Downloading.DownloadFiles.ContainsKey("danmaku"))
|
||||
{
|
||||
downloading.Downloading.DownloadFiles.Add("danmaku", assFile);
|
||||
}
|
||||
|
||||
int screenWidth = SettingsManager.GetInstance().GetDanmakuScreenWidth();
|
||||
int screenHeight = SettingsManager.GetInstance().GetDanmakuScreenHeight();
|
||||
@@ -272,7 +288,10 @@ namespace DownKyi.Services.Download
|
||||
File.WriteAllText(srtFile, subRip.SrtString);
|
||||
|
||||
// 记录本次下载的文件
|
||||
downloading.Downloading.DownloadFiles.Add(srtFile);
|
||||
if (!downloading.Downloading.DownloadFiles.ContainsKey("subtitle"))
|
||||
{
|
||||
downloading.Downloading.DownloadFiles.Add("subtitle", srtFile);
|
||||
}
|
||||
|
||||
srtFiles.Add(srtFile);
|
||||
}
|
||||
@@ -345,6 +364,9 @@ namespace DownKyi.Services.Download
|
||||
return;
|
||||
}
|
||||
|
||||
// 设置下载状态
|
||||
downloading.Downloading.DownloadStatus = DownloadStatus.DOWNLOADING;
|
||||
|
||||
// 解析
|
||||
switch (downloading.Downloading.PlayStreamType)
|
||||
{
|
||||
@@ -367,8 +389,18 @@ namespace DownKyi.Services.Download
|
||||
/// </summary>
|
||||
public void End()
|
||||
{
|
||||
// TODO
|
||||
// 下载数据存储服务
|
||||
DownloadStorageService downloadStorageService = new DownloadStorageService();
|
||||
// 保存数据
|
||||
foreach (DownloadingItem item in downloadingList)
|
||||
{
|
||||
item.Downloading.DownloadStatus = DownloadStatus.WAIT_FOR_DOWNLOAD;
|
||||
downloadStorageService.UpdateDownloading(item);
|
||||
}
|
||||
foreach (DownloadedItem item in downloadedList)
|
||||
{
|
||||
downloadStorageService.UpdateDownloaded(item);
|
||||
}
|
||||
|
||||
// 关闭Aria服务器
|
||||
CloseAriaServer();
|
||||
@@ -430,7 +462,7 @@ namespace DownKyi.Services.Download
|
||||
}
|
||||
|
||||
// 降低CPU占用
|
||||
Thread.Sleep(100);
|
||||
Thread.Sleep(200);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -452,12 +484,10 @@ namespace DownKyi.Services.Download
|
||||
|
||||
await Task.Run(new Action(() =>
|
||||
{
|
||||
downloading.Downloading.DownloadStatus = DownloadStatus.DOWNLOADING;
|
||||
|
||||
// 初始化
|
||||
downloading.DownloadStatusTitle = string.Empty;
|
||||
downloading.DownloadContent = string.Empty;
|
||||
downloading.Downloading.DownloadFiles.Clear();
|
||||
//downloading.Downloading.DownloadFiles.Clear();
|
||||
|
||||
// 解析并依次下载音频、视频、弹幕、字幕、封面等内容
|
||||
Parse(downloading);
|
||||
@@ -465,6 +495,9 @@ namespace DownKyi.Services.Download
|
||||
// 暂停
|
||||
Pause(downloading);
|
||||
|
||||
// 设置下载状态
|
||||
downloading.Downloading.DownloadStatus = DownloadStatus.DOWNLOADING;
|
||||
|
||||
string audioUid = null;
|
||||
// 如果需要下载音频
|
||||
if (downloading.DownloadBase.NeedDownloadContent["downloadAudio"])
|
||||
@@ -509,7 +542,6 @@ namespace DownKyi.Services.Download
|
||||
// 如果需要下载封面
|
||||
if (downloading.DownloadBase.NeedDownloadContent["downloadCover"])
|
||||
{
|
||||
|
||||
string fileName = $"{downloading.DownloadBase.FilePath}.{GetImageExtension(downloading.DownloadBase.PageCoverUrl)}";
|
||||
|
||||
// page的封面
|
||||
@@ -595,8 +627,8 @@ namespace DownKyi.Services.Download
|
||||
App.PropertyChangeAsync(new Action(() =>
|
||||
{
|
||||
// 加入到下载完成list中,并从下载中list去除
|
||||
App.DownloadedList.Add(downloadedItem);
|
||||
App.DownloadingList.Remove(downloading);
|
||||
downloadedList.Add(downloadedItem);
|
||||
downloadingList.Remove(downloading);
|
||||
|
||||
// 下载完成列表排序
|
||||
DownloadFinishedSort finishedSort = SettingsManager.GetInstance().GetDownloadFinishedSort();
|
||||
|
||||
@@ -0,0 +1,219 @@
|
||||
using DownKyi.Core.Storage.Database.Download;
|
||||
using DownKyi.Models;
|
||||
using DownKyi.ViewModels.DownloadManager;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Services.Download
|
||||
{
|
||||
public class DownloadStorageService
|
||||
{
|
||||
#region 下载中数据
|
||||
|
||||
/// <summary>
|
||||
/// 添加下载中数据
|
||||
/// </summary>
|
||||
/// <param name="downloadingItem"></param>
|
||||
public void AddDownloading(DownloadingItem downloadingItem)
|
||||
{
|
||||
AddDownloadBase(downloadingItem.DownloadBase);
|
||||
|
||||
DownloadingDb downloadingDb = new DownloadingDb();
|
||||
object obj = downloadingDb.QueryById(downloadingItem.DownloadBase.Uuid);
|
||||
if (obj == null)
|
||||
{
|
||||
downloadingDb.Insert(downloadingItem.DownloadBase.Uuid, downloadingItem.Downloading);
|
||||
}
|
||||
downloadingDb.Close();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除下载中数据
|
||||
/// </summary>
|
||||
/// <param name="downloadingItem"></param>
|
||||
public void RemoveDownloading(DownloadingItem downloadingItem)
|
||||
{
|
||||
RemoveDownloadBase(downloadingItem.DownloadBase.Uuid);
|
||||
|
||||
DownloadingDb downloadingDb = new DownloadingDb();
|
||||
downloadingDb.Delete(downloadingItem.DownloadBase.Uuid);
|
||||
downloadingDb.Close();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有的下载中数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<DownloadingItem> GetDownloading()
|
||||
{
|
||||
// 从数据库获取数据
|
||||
DownloadingDb downloadingDb = new DownloadingDb();
|
||||
Dictionary<string, object> dic = downloadingDb.QueryAll();
|
||||
downloadingDb.Close();
|
||||
|
||||
// 遍历
|
||||
List<DownloadingItem> list = new List<DownloadingItem>();
|
||||
foreach (KeyValuePair<string, object> item in dic)
|
||||
{
|
||||
if (item.Value is Downloading downloading)
|
||||
{
|
||||
DownloadingItem downloadingItem = new DownloadingItem
|
||||
{
|
||||
DownloadBase = GetDownloadBase(item.Key),
|
||||
Downloading = downloading
|
||||
};
|
||||
|
||||
list.Add(downloadingItem);
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 修改下载中数据
|
||||
/// </summary>
|
||||
/// <param name="downloadingItem"></param>
|
||||
public void UpdateDownloading(DownloadingItem downloadingItem)
|
||||
{
|
||||
UpdateDownloadBase(downloadingItem.DownloadBase);
|
||||
|
||||
DownloadingDb downloadingDb = new DownloadingDb();
|
||||
downloadingDb.Update(downloadingItem.DownloadBase.Uuid, downloadingItem.Downloading);
|
||||
downloadingDb.Close();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 下载完成数据
|
||||
|
||||
/// <summary>
|
||||
/// 添加下载完成数据
|
||||
/// </summary>
|
||||
/// <param name="downloadedItem"></param>
|
||||
public void AddDownloaded(DownloadedItem downloadedItem)
|
||||
{
|
||||
AddDownloadBase(downloadedItem.DownloadBase);
|
||||
|
||||
DownloadedDb downloadedDb = new DownloadedDb();
|
||||
object obj = downloadedDb.QueryById(downloadedItem.DownloadBase.Uuid);
|
||||
if (obj == null)
|
||||
{
|
||||
downloadedDb.Insert(downloadedItem.DownloadBase.Uuid, downloadedItem.Downloaded);
|
||||
}
|
||||
downloadedDb.Close();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除下载完成数据
|
||||
/// </summary>
|
||||
/// <param name="downloadedItem"></param>
|
||||
public void RemoveDownloaded(DownloadedItem downloadedItem)
|
||||
{
|
||||
RemoveDownloadBase(downloadedItem.DownloadBase.Uuid);
|
||||
|
||||
DownloadedDb downloadedDb = new DownloadedDb();
|
||||
downloadedDb.Delete(downloadedItem.DownloadBase.Uuid);
|
||||
downloadedDb.Close();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有的下载完成数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<DownloadedItem> GetDownloaded()
|
||||
{
|
||||
// 从数据库获取数据
|
||||
DownloadedDb downloadedDb = new DownloadedDb();
|
||||
Dictionary<string, object> dic = downloadedDb.QueryAll();
|
||||
downloadedDb.Close();
|
||||
|
||||
// 遍历
|
||||
List<DownloadedItem> list = new List<DownloadedItem>();
|
||||
foreach (KeyValuePair<string, object> item in dic)
|
||||
{
|
||||
if (item.Value is Downloaded downloaded)
|
||||
{
|
||||
DownloadedItem downloadingItem = new DownloadedItem
|
||||
{
|
||||
DownloadBase = GetDownloadBase(item.Key),
|
||||
Downloaded = downloaded
|
||||
};
|
||||
|
||||
list.Add(downloadingItem);
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 修改下载完成数据
|
||||
/// </summary>
|
||||
/// <param name="downloadedItem"></param>
|
||||
public void UpdateDownloaded(DownloadedItem downloadedItem)
|
||||
{
|
||||
UpdateDownloadBase(downloadedItem.DownloadBase);
|
||||
|
||||
DownloadedDb downloadedDb = new DownloadedDb();
|
||||
downloadedDb.Update(downloadedItem.DownloadBase.Uuid, downloadedItem.Downloaded);
|
||||
downloadedDb.Close();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region DownloadBase
|
||||
|
||||
/// <summary>
|
||||
/// 向数据库添加DownloadBase
|
||||
/// </summary>
|
||||
/// <param name="downloadBase"></param>
|
||||
private void AddDownloadBase(DownloadBase downloadBase)
|
||||
{
|
||||
DownloadBaseDb downloadBaseDb = new DownloadBaseDb();
|
||||
object obj = downloadBaseDb.QueryById(downloadBase.Uuid);
|
||||
if (obj == null)
|
||||
{
|
||||
downloadBaseDb.Insert(downloadBase.Uuid, downloadBase);
|
||||
}
|
||||
downloadBaseDb.Close();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从数据库删除DownloadBase
|
||||
/// </summary>
|
||||
/// <param name="downloadBase"></param>
|
||||
private void RemoveDownloadBase(string uuid)
|
||||
{
|
||||
DownloadBaseDb downloadBaseDb = new DownloadBaseDb();
|
||||
downloadBaseDb.Delete(uuid);
|
||||
downloadBaseDb.Close();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从数据库获取所有的DownloadBase
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private DownloadBase GetDownloadBase(string uuid)
|
||||
{
|
||||
DownloadBaseDb downloadBaseDb = new DownloadBaseDb();
|
||||
object obj = downloadBaseDb.QueryById(uuid);
|
||||
downloadBaseDb.Close();
|
||||
|
||||
return obj is DownloadBase downloadBase ? downloadBase : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从数据库修改DownloadBase
|
||||
/// </summary>
|
||||
/// <param name="downloadBase"></param>
|
||||
private void UpdateDownloadBase(DownloadBase downloadBase)
|
||||
{
|
||||
DownloadBaseDb downloadBaseDb = new DownloadBaseDb();
|
||||
downloadBaseDb.Update(downloadBase.Uuid, downloadBase);
|
||||
downloadBaseDb.Close();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
@@ -156,6 +156,17 @@ namespace DownKyi.ViewModels
|
||||
{ "Parameter", "start" }
|
||||
};
|
||||
regionManager.RequestNavigate("ContentRegion", ViewIndexViewModel.Tag, param);
|
||||
|
||||
// 关闭欢迎页
|
||||
if (App.Dictionary.ContainsKey("SplashWindow"))
|
||||
{
|
||||
Views.SplashWindow sw = App.Dictionary["SplashWindow"] as Views.SplashWindow;
|
||||
// 在sw的线程上关闭SplashWindow
|
||||
sw.Dispatcher.Invoke(() => sw.Close());
|
||||
}
|
||||
|
||||
// 设置焦点
|
||||
Application.Current.MainWindow.Activate();
|
||||
});
|
||||
|
||||
// 顶部caption栏的点击事件,包括双击和拖动
|
||||
|
||||
@@ -26,11 +26,11 @@
|
||||
Grid.Row="0"
|
||||
Background="{DynamicResource BrushCaptionBackground}"
|
||||
KeyboardNavigation.TabNavigation="None">
|
||||
<i:Interaction.Triggers>
|
||||
<!--<i:Interaction.Triggers>
|
||||
<i:EventTrigger EventName="MouseLeftButtonDown">
|
||||
<i:InvokeCommandAction Command="{Binding DragMoveCommand}" />
|
||||
</i:EventTrigger>
|
||||
</i:Interaction.Triggers>
|
||||
</i:Interaction.Triggers>-->
|
||||
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition />
|
||||
|
||||
@@ -26,11 +26,11 @@
|
||||
Grid.Row="0"
|
||||
Background="{DynamicResource BrushCaptionBackground}"
|
||||
KeyboardNavigation.TabNavigation="None">
|
||||
<i:Interaction.Triggers>
|
||||
<!--<i:Interaction.Triggers>
|
||||
<i:EventTrigger EventName="MouseLeftButtonDown">
|
||||
<i:InvokeCommandAction Command="{Binding DragMoveCommand}" />
|
||||
</i:EventTrigger>
|
||||
</i:Interaction.Triggers>
|
||||
</i:Interaction.Triggers>-->
|
||||
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition />
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
<Window
|
||||
x:Class="DownKyi.Views.SplashWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:DownKyi.Views"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
Title=""
|
||||
Width="500"
|
||||
Height="300"
|
||||
ResizeMode="NoResize"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
mc:Ignorable="d">
|
||||
<WindowChrome.WindowChrome>
|
||||
<WindowChrome
|
||||
CaptionHeight="0"
|
||||
CornerRadius="20"
|
||||
GlassFrameThickness="0"
|
||||
NonClientFrameEdges="None"
|
||||
ResizeBorderThickness="4"
|
||||
UseAeroCaptionButtons="False" />
|
||||
</WindowChrome.WindowChrome>
|
||||
<Grid Background="#FF00A1D6">
|
||||
<TextBlock
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="30"
|
||||
Foreground="White"
|
||||
Text="Welcome to DownKyi!" />
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace DownKyi.Views
|
||||
{
|
||||
/// <summary>
|
||||
/// SplashWindow.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class SplashWindow : Window
|
||||
{
|
||||
public SplashWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
+201
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2021 FlySelfLog
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@@ -0,0 +1,2 @@
|
||||
# 哔哩下载姬
|
||||
|
||||
Reference in New Issue
Block a user