添加欢迎页;完成下载列表存储功能

croire 3 years ago
parent 53be15c7ab
commit f10c2d2d80

@ -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>

@ -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="SplashWindow"
Width="500"
Height="300"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<WindowChrome.WindowChrome>
<WindowChrome
CaptionHeight="0"
CornerRadius="0"
GlassFrameThickness="0"
NonClientFrameEdges="None"
ResizeBorderThickness="4"
UseAeroCaptionButtons="False" />
</WindowChrome.WindowChrome>
<Grid Background="#FF00A1D6">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="28"
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();
}
}
}
Loading…
Cancel
Save