mirror of
https://github.com/leiurayer/downkyi.git
synced 2025-04-27 05:30:47 +08:00
修复下载中的一些问题
This commit is contained in:
parent
871f60df6b
commit
9f443cb809
README.md
src
DownKyi.Core
DownKyi
@ -9,8 +9,8 @@
|
||||
- [x] 支持4K下载
|
||||
- [x] 支持视频、番剧、剧集、电影、课程下载
|
||||
- [x] **支持用户收藏夹、订阅、稍后再看、历史记录下载**
|
||||
- [x] ~~**支持港澳台番剧下载,解除地区限制**~~
|
||||
- [x] 支持弹幕下载、样式设置
|
||||
- [x] 支持字幕下载
|
||||
- [x] 支持封面下载
|
||||
- [x] 支持断点续传
|
||||
- [x] 支持Aria2c
|
||||
@ -20,6 +20,7 @@
|
||||
- [x] 支持音视频分离
|
||||
- [x] 支持去水印
|
||||
- [x] 支持检查更新
|
||||
……
|
||||
|
||||
## 使用方法
|
||||
|
||||
|
@ -4,25 +4,43 @@ namespace DownKyi.Core.BiliApi.BiliUtils
|
||||
{
|
||||
public static class Constant
|
||||
{
|
||||
/// <summary>
|
||||
/// 音质id及含义
|
||||
/// </summary>
|
||||
public static Dictionary<int, string> AudioQuality { get; } = new Dictionary<int, string>()
|
||||
private static readonly List<Quality> resolutions = new List<Quality>
|
||||
{
|
||||
{ 30216, "64K" },
|
||||
{ 30232, "132K" },
|
||||
{ 30280, "192K" }
|
||||
new Quality { Name = "HDR 真彩", Id = 125 },
|
||||
new Quality { Name = "4K 超清", Id = 120 },
|
||||
new Quality { Name = "1080P 60帧", Id = 116 },
|
||||
new Quality { Name = "1080P 高码率", Id = 112 },
|
||||
new Quality { Name = "1080P 高清", Id = 80 },
|
||||
new Quality { Name = "720P 60帧", Id = 74 },
|
||||
new Quality { Name = "720P 高清", Id = 64 },
|
||||
new Quality { Name = "480P 清晰", Id = 32 },
|
||||
new Quality { Name = "360P 流畅", Id = 16 },
|
||||
};
|
||||
|
||||
private static readonly List<Quality> qualities = new List<Quality>
|
||||
{
|
||||
new Quality { Name = "64K", Id = 30216 },
|
||||
new Quality { Name = "132K", Id = 30232 },
|
||||
new Quality { Name = "192K", Id = 30280 },
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 音质id及含义
|
||||
/// 获取支持的视频画质
|
||||
/// </summary>
|
||||
public static Dictionary<string, int> AudioQualityId { get; } = new Dictionary<string, int>()
|
||||
/// <returns></returns>
|
||||
public static List<Quality> GetResolutions()
|
||||
{
|
||||
{ "64K", 30216 },
|
||||
{ "132K", 30232 },
|
||||
{ "192K", 30280 }
|
||||
};
|
||||
return resolutions;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取支持的视频音质
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static List<Quality> GetAudioQualities()
|
||||
{
|
||||
return qualities;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
8
src/DownKyi.Core/BiliApi/BiliUtils/Quality.cs
Normal file
8
src/DownKyi.Core/BiliApi/BiliUtils/Quality.cs
Normal file
@ -0,0 +1,8 @@
|
||||
namespace DownKyi.Core.BiliApi.BiliUtils
|
||||
{
|
||||
public class Quality
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public int Id { get; set; }
|
||||
}
|
||||
}
|
@ -36,16 +36,16 @@
|
||||
<Reference Include="Brotli.Core, Version=2.1.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Brotli.NET.2.1.1\lib\net45\Brotli.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Protobuf, Version=3.18.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Google.Protobuf.3.18.1\lib\net45\Google.Protobuf.dll</HintPath>
|
||||
<Reference Include="Google.Protobuf, Version=3.19.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Google.Protobuf.3.19.1\lib\net45\Google.Protobuf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
<Reference Include="QRCoder, Version=1.4.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\QRCoder.1.4.1\lib\net40\QRCoder.dll</HintPath>
|
||||
<Reference Include="QRCoder, Version=1.4.3.0, Culture=neutral, PublicKeyToken=c4ed5b9ae8358a28, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\QRCoder.1.4.3\lib\net40\QRCoder.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
@ -64,8 +64,8 @@
|
||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
|
||||
@ -129,6 +129,7 @@
|
||||
<Compile Include="BiliApi\Bangumi\Models\BangumiUpInfo.cs" />
|
||||
<Compile Include="BiliApi\BiliUtils\Constant.cs" />
|
||||
<Compile Include="BiliApi\BiliUtils\ParseEntrance.cs" />
|
||||
<Compile Include="BiliApi\BiliUtils\Quality.cs" />
|
||||
<Compile Include="BiliApi\Cheese\CheeseInfo.cs" />
|
||||
<Compile Include="BiliApi\Cheese\Models\CheeseBrief.cs" />
|
||||
<Compile Include="BiliApi\Cheese\Models\CheeseEpisode.cs" />
|
||||
@ -279,8 +280,8 @@
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\packages\Brotli.NET.2.1.1\build\Brotli.NET.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Brotli.NET.2.1.1\build\Brotli.NET.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\System.Data.SQLite.Core.1.0.112.2\build\net40\System.Data.SQLite.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.Data.SQLite.Core.1.0.112.2\build\net40\System.Data.SQLite.Core.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Google.Protobuf.Tools.3.18.1\build\Google.Protobuf.Tools.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Google.Protobuf.Tools.3.18.1\build\Google.Protobuf.Tools.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Google.Protobuf.Tools.3.19.1\build\Google.Protobuf.Tools.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Google.Protobuf.Tools.3.19.1\build\Google.Protobuf.Tools.targets'))" />
|
||||
</Target>
|
||||
<Import Project="..\packages\System.Data.SQLite.Core.1.0.112.2\build\net40\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.112.2\build\net40\System.Data.SQLite.Core.targets')" />
|
||||
<Import Project="..\packages\Google.Protobuf.Tools.3.18.1\build\Google.Protobuf.Tools.targets" Condition="Exists('..\packages\Google.Protobuf.Tools.3.18.1\build\Google.Protobuf.Tools.targets')" />
|
||||
<Import Project="..\packages\Google.Protobuf.Tools.3.19.1\build\Google.Protobuf.Tools.targets" Condition="Exists('..\packages\Google.Protobuf.Tools.3.19.1\build\Google.Protobuf.Tools.targets')" />
|
||||
</Project>
|
@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("DownKyi")]
|
||||
[assembly: AssemblyProduct("DownKyi.Core")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2021")]
|
||||
[assembly: AssemblyCopyright("Copyright © Downkyi 2020-2021")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
||||
//通过使用 "*",如下所示:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("2.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("2.0.0.0")]
|
||||
[assembly: AssemblyVersion("2.1.0.0")]
|
||||
[assembly: AssemblyFileVersion("2.1.0.0")]
|
||||
|
@ -4,7 +4,7 @@
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
|
@ -1,14 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Brotli.NET" version="2.1.1" targetFramework="net472" />
|
||||
<package id="Google.Protobuf" version="3.18.1" targetFramework="net472" />
|
||||
<package id="Google.Protobuf.Tools" version="3.18.1" targetFramework="net472" />
|
||||
<package id="Google.Protobuf" version="3.19.1" targetFramework="net472" />
|
||||
<package id="Google.Protobuf.Tools" version="3.19.1" targetFramework="net472" />
|
||||
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
|
||||
<package id="QRCoder" version="1.4.1" targetFramework="net472" />
|
||||
<package id="QRCoder" version="1.4.3" targetFramework="net472" />
|
||||
<package id="System.Buffers" version="4.5.1" targetFramework="net472" />
|
||||
<package id="System.Data.SQLite.Core" version="1.0.112.2" targetFramework="net472" />
|
||||
<package id="System.Memory" version="4.5.4" targetFramework="net472" />
|
||||
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0" targetFramework="net472" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net472" />
|
||||
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net472" />
|
||||
</packages>
|
@ -96,7 +96,6 @@
|
||||
<Compile Include="Models\DisplayFileNamePart.cs" />
|
||||
<Compile Include="Models\ParseScopeDisplay.cs" />
|
||||
<Compile Include="Models\PlayStreamType.cs" />
|
||||
<Compile Include="Models\Resolution.cs" />
|
||||
<Compile Include="Models\TabHeader.cs" />
|
||||
<Compile Include="Models\VideoQuality.cs" />
|
||||
<Compile Include="Models\VideoInfoView.cs" />
|
||||
@ -110,8 +109,6 @@
|
||||
<Compile Include="Services\Download\IDownloadService.cs" />
|
||||
<Compile Include="Services\IFavoritesService.cs" />
|
||||
<Compile Include="Services\IInfoService.cs" />
|
||||
<Compile Include="Services\IResolutionService.cs" />
|
||||
<Compile Include="Services\ResolutionService.cs" />
|
||||
<Compile Include="Services\Utils.cs" />
|
||||
<Compile Include="Services\VideoInfoService.cs" />
|
||||
<Compile Include="Utils\ClipboardHooker.cs" />
|
||||
|
@ -119,6 +119,7 @@
|
||||
<system:String x:Key="Video">视频</system:String>
|
||||
<system:String x:Key="FirstVideoCodecs">优先下载的视频编码:</system:String>
|
||||
<system:String x:Key="FirstVideoQuality">优先下载的视频画质:</system:String>
|
||||
<system:String x:Key="FirstAudioQuality">优先下载的视频音质:</system:String>
|
||||
<system:String x:Key="IsTranscodingFlvToMp4">下载FLV视频后转码为mp4</system:String>
|
||||
<system:String x:Key="IsUseDefaultDirectory">使用默认下载目录</system:String>
|
||||
<system:String x:Key="DefaultDirectory">默认下载目录:</system:String>
|
||||
@ -136,6 +137,7 @@
|
||||
<system:String x:Key="DisplayVideoQuality">画质</system:String>
|
||||
<system:String x:Key="DisplayVideoCodec">视频编码</system:String>
|
||||
<system:String x:Key="DisplaySpace">空格</system:String>
|
||||
<system:String x:Key="Reset">恢复默认</system:String>
|
||||
|
||||
<system:String x:Key="SettingDanmaku">弹幕</system:String>
|
||||
<system:String x:Key="FilterType">按类型屏蔽</system:String>
|
||||
|
@ -1,4 +1,5 @@
|
||||
using Prism.Mvvm;
|
||||
using DownKyi.Core.BiliApi.BiliUtils;
|
||||
using Prism.Mvvm;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows.Media;
|
||||
@ -38,6 +39,9 @@ namespace DownKyi.Models
|
||||
// 视频封面的url
|
||||
public string CoverUrl { get; set; }
|
||||
|
||||
// 视频page的封面的url
|
||||
public string PageCoverUrl { get; set; }
|
||||
|
||||
private DrawingImage zoneImage;
|
||||
public DrawingImage ZoneImage
|
||||
{
|
||||
@ -77,15 +81,6 @@ namespace DownKyi.Models
|
||||
set => SetProperty(ref duration, value);
|
||||
}
|
||||
|
||||
// 音频编码
|
||||
public int AudioCodecId { get; set; }
|
||||
private string audioCodecName;
|
||||
public string AudioCodecName
|
||||
{
|
||||
get => audioCodecName;
|
||||
set => SetProperty(ref audioCodecName, value);
|
||||
}
|
||||
|
||||
// 视频编码
|
||||
// "hev1.2.4.L156.90"
|
||||
// "avc1.640034"
|
||||
@ -100,13 +95,21 @@ namespace DownKyi.Models
|
||||
}
|
||||
|
||||
// 视频画质
|
||||
private Resolution resolution;
|
||||
public Resolution Resolution
|
||||
private Quality resolution;
|
||||
public Quality Resolution
|
||||
{
|
||||
get => resolution;
|
||||
set => SetProperty(ref resolution, value);
|
||||
}
|
||||
|
||||
// 音频编码
|
||||
private Quality audioCodec;
|
||||
public Quality AudioCodec
|
||||
{
|
||||
get => audioCodec;
|
||||
set => SetProperty(ref audioCodec, value);
|
||||
}
|
||||
|
||||
// 文件路径,不包含扩展名,所有内容均以此路径下载
|
||||
public string FilePath { get; set; }
|
||||
|
||||
|
@ -59,7 +59,7 @@ namespace DownKyi.Services.Download
|
||||
PlayUrlDashVideo downloadAudio = null;
|
||||
foreach (PlayUrlDashVideo audio in downloading.PlayUrl.Dash.Audio)
|
||||
{
|
||||
if (audio.Id == downloading.AudioCodecId)
|
||||
if (audio.Id == downloading.AudioCodec.Id)
|
||||
{
|
||||
downloadAudio = audio;
|
||||
break;
|
||||
@ -148,7 +148,7 @@ namespace DownKyi.Services.Download
|
||||
/// 下载封面
|
||||
/// </summary>
|
||||
/// <param name="downloading"></param>
|
||||
public string DownloadCover(DownloadingItem downloading)
|
||||
public string DownloadCover(DownloadingItem downloading, string coverUrl, string fileName)
|
||||
{
|
||||
// 更新状态显示
|
||||
downloading.DownloadStatusTitle = DictionaryResource.GetString("WhileDownloading");
|
||||
@ -160,24 +160,16 @@ namespace DownKyi.Services.Download
|
||||
|
||||
// 查询、保存封面
|
||||
StorageCover storageCover = new StorageCover();
|
||||
string cover = storageCover.GetCover(downloading.Avid, downloading.Bvid, downloading.Cid, downloading.CoverUrl);
|
||||
string cover = storageCover.GetCover(downloading.Avid, downloading.Bvid, downloading.Cid, coverUrl);
|
||||
if (cover == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// 图片的扩展名
|
||||
string[] temp = downloading.CoverUrl.Split('.');
|
||||
string fileExtension = temp[temp.Length - 1];
|
||||
|
||||
// 图片的地址
|
||||
string coverPath = $"{StorageManager.GetCover()}/{cover}";
|
||||
|
||||
// 复制图片到指定位置
|
||||
try
|
||||
{
|
||||
string fileName = $"{downloading.FilePath}.{fileExtension}";
|
||||
File.Copy(coverPath, fileName);
|
||||
File.Copy(cover, fileName, true);
|
||||
|
||||
// 记录本次下载的文件
|
||||
downloading.DownloadFiles.Add(fileName);
|
||||
@ -448,6 +440,15 @@ namespace DownKyi.Services.Download
|
||||
/// <returns></returns>
|
||||
private async void SingleDownload(DownloadingItem downloading)
|
||||
{
|
||||
// 路径
|
||||
string[] temp = downloading.FilePath.Split('/');
|
||||
string path = downloading.FilePath.Replace(temp[temp.Length - 1], "");
|
||||
// 路径不存在则创建
|
||||
if (!Directory.Exists(path))
|
||||
{
|
||||
Directory.CreateDirectory(path);
|
||||
}
|
||||
|
||||
await Task.Run(new Action(() =>
|
||||
{
|
||||
downloading.DownloadStatus = DownloadStatus.DOWNLOADING;
|
||||
@ -507,14 +508,24 @@ namespace DownKyi.Services.Download
|
||||
// 如果需要下载封面
|
||||
if (downloading.NeedDownloadContent["downloadCover"])
|
||||
{
|
||||
outputCover = DownloadCover(downloading);
|
||||
|
||||
string fileName = $"{downloading.FilePath}.{GetImageExtension(downloading.PageCoverUrl)}";
|
||||
|
||||
// page的封面
|
||||
outputCover = DownloadCover(downloading, downloading.PageCoverUrl, fileName);
|
||||
// 封面
|
||||
DownloadCover(downloading, downloading.CoverUrl, $"{path}/Cover.{GetImageExtension(downloading.CoverUrl)}");
|
||||
}
|
||||
|
||||
// 暂停
|
||||
Pause(downloading);
|
||||
|
||||
// 混流
|
||||
string outputMedia = MixedFlow(downloading, audioUid, videoUid);
|
||||
string outputMedia = string.Empty;
|
||||
if (downloading.NeedDownloadContent["downloadAudio"] || downloading.NeedDownloadContent["downloadVideo"])
|
||||
{
|
||||
outputMedia = MixedFlow(downloading, audioUid, videoUid);
|
||||
}
|
||||
|
||||
// 暂停
|
||||
Pause(downloading);
|
||||
@ -570,6 +581,24 @@ namespace DownKyi.Services.Download
|
||||
}));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取图片的扩展名
|
||||
/// </summary>
|
||||
/// <param name="coverUrl"></param>
|
||||
/// <returns></returns>
|
||||
private string GetImageExtension(string coverUrl)
|
||||
{
|
||||
if (coverUrl == null)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
// 图片的扩展名
|
||||
string[] temp = coverUrl.Split('.');
|
||||
string fileExtension = temp[temp.Length - 1];
|
||||
return fileExtension;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 强制暂停
|
||||
/// </summary>
|
||||
|
@ -10,7 +10,7 @@ namespace DownKyi.Services.Download
|
||||
string DownloadVideo(DownloadingItem downloading);
|
||||
string DownloadDanmaku(DownloadingItem downloading);
|
||||
List<string> DownloadSubtitle(DownloadingItem downloading);
|
||||
string DownloadCover(DownloadingItem downloading);
|
||||
string DownloadCover(DownloadingItem downloading, string coverUrl, string fileName);
|
||||
string MixedFlow(DownloadingItem downloading, string audioUid, string videoUid);
|
||||
|
||||
void Start();
|
||||
|
@ -1,4 +1,5 @@
|
||||
using DownKyi.Core.BiliApi.VideoStream.Models;
|
||||
using DownKyi.Core.BiliApi.BiliUtils;
|
||||
using DownKyi.Core.BiliApi.VideoStream.Models;
|
||||
using DownKyi.Core.Settings;
|
||||
using DownKyi.Core.Settings.Models;
|
||||
using DownKyi.Core.Utils;
|
||||
@ -101,9 +102,10 @@ namespace DownKyi.Services
|
||||
// 音质id大于设置画质时,跳过
|
||||
if (audio.Id > defaultAudioQuality) { continue; }
|
||||
|
||||
if (Core.BiliApi.BiliUtils.Constant.AudioQuality.ContainsKey(audio.Id))
|
||||
Quality audioQuality = Constant.GetAudioQualities().FirstOrDefault(t => { return t.Id == audio.Id; });
|
||||
if (audioQuality != null)
|
||||
{
|
||||
ListHelper.AddUnique(audioQualityFormatList, Core.BiliApi.BiliUtils.Constant.AudioQuality[audio.Id]);
|
||||
ListHelper.AddUnique(audioQualityFormatList, audioQuality.Name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
using DownKyi.Core.FileName;
|
||||
using DownKyi.Core.BiliApi.BiliUtils;
|
||||
using DownKyi.Core.FileName;
|
||||
using DownKyi.Core.Settings;
|
||||
using DownKyi.Events;
|
||||
using DownKyi.Models;
|
||||
using DownKyi.Services;
|
||||
using DownKyi.Utils;
|
||||
using Prism.Commands;
|
||||
using Prism.Events;
|
||||
@ -36,20 +36,34 @@ namespace DownKyi.ViewModels.Settings
|
||||
set => SetProperty(ref selectedVideoCodec, value);
|
||||
}
|
||||
|
||||
private List<Resolution> videoQualityList;
|
||||
public List<Resolution> VideoQualityList
|
||||
private List<Quality> videoQualityList;
|
||||
public List<Quality> VideoQualityList
|
||||
{
|
||||
get => videoQualityList;
|
||||
set => SetProperty(ref videoQualityList, value);
|
||||
}
|
||||
|
||||
private Resolution selectedVideoQuality;
|
||||
public Resolution SelectedVideoQuality
|
||||
private Quality selectedVideoQuality;
|
||||
public Quality SelectedVideoQuality
|
||||
{
|
||||
get => selectedVideoQuality;
|
||||
set => SetProperty(ref selectedVideoQuality, value);
|
||||
}
|
||||
|
||||
private List<Quality> audioQualityList;
|
||||
public List<Quality> AudioQualityList
|
||||
{
|
||||
get => audioQualityList;
|
||||
set => SetProperty(ref audioQualityList, value);
|
||||
}
|
||||
|
||||
private Quality selectedAudioQuality;
|
||||
public Quality SelectedAudioQuality
|
||||
{
|
||||
get => selectedAudioQuality;
|
||||
set => SetProperty(ref selectedAudioQuality, value);
|
||||
}
|
||||
|
||||
private bool isTranscodingFlvToMp4;
|
||||
public bool IsTranscodingFlvToMp4
|
||||
{
|
||||
@ -104,11 +118,14 @@ namespace DownKyi.ViewModels.Settings
|
||||
VideoCodecs = new List<string>
|
||||
{
|
||||
"H.264/AVC",
|
||||
"H.265/HEVC"
|
||||
"H.265/HEVC",
|
||||
};
|
||||
|
||||
// 优先下载画质
|
||||
VideoQualityList = new ResolutionService().GetResolution();
|
||||
VideoQualityList = Constant.GetResolutions();
|
||||
|
||||
// 优先下载音质
|
||||
AudioQualityList = Constant.GetAudioQualities();
|
||||
|
||||
// 文件命名格式
|
||||
SelectedFileName = new ObservableCollection<DisplayFileNamePart>();
|
||||
@ -143,6 +160,10 @@ namespace DownKyi.ViewModels.Settings
|
||||
int quality = SettingsManager.GetInstance().GetQuality();
|
||||
SelectedVideoQuality = VideoQualityList.FirstOrDefault(t => { return t.Id == quality; });
|
||||
|
||||
// 优先下载音质
|
||||
int audioQuality = SettingsManager.GetInstance().GetAudioQuality();
|
||||
SelectedAudioQuality = AudioQualityList.FirstOrDefault(t => { return t.Id == audioQuality; });
|
||||
|
||||
// 是否下载flv视频后转码为mp4
|
||||
AllowStatus isTranscodingFlvToMp4 = SettingsManager.GetInstance().IsTranscodingFlvToMp4();
|
||||
IsTranscodingFlvToMp4 = isTranscodingFlvToMp4 == AllowStatus.YES;
|
||||
@ -194,12 +215,28 @@ namespace DownKyi.ViewModels.Settings
|
||||
/// <param name="parameter"></param>
|
||||
private void ExecuteVideoQualityCommand(object parameter)
|
||||
{
|
||||
if (!(parameter is Resolution resolution)) { return; }
|
||||
if (!(parameter is Quality resolution)) { return; }
|
||||
|
||||
bool isSucceed = SettingsManager.GetInstance().SetQuality(resolution.Id);
|
||||
PublishTip(isSucceed);
|
||||
}
|
||||
|
||||
// 优先下载音质事件
|
||||
private DelegateCommand<object> audioQualityCommand;
|
||||
public DelegateCommand<object> AudioQualityCommand => audioQualityCommand ?? (audioQualityCommand = new DelegateCommand<object>(ExecuteAudioQualityCommand));
|
||||
|
||||
/// <summary>
|
||||
/// 优先下载音质事件
|
||||
/// </summary>
|
||||
/// <param name="parameter"></param>
|
||||
private void ExecuteAudioQualityCommand(object parameter)
|
||||
{
|
||||
if (!(parameter is Quality quality)) { return; }
|
||||
|
||||
bool isSucceed = SettingsManager.GetInstance().SetAudioQuality(quality.Id);
|
||||
PublishTip(isSucceed);
|
||||
}
|
||||
|
||||
// 是否下载flv视频后转码为mp4事件
|
||||
private DelegateCommand isTranscodingFlvToMp4Command;
|
||||
public DelegateCommand IsTranscodingFlvToMp4Command => isTranscodingFlvToMp4Command ?? (isTranscodingFlvToMp4Command = new DelegateCommand(ExecuteIsTranscodingFlvToMp4Command));
|
||||
@ -307,6 +344,27 @@ namespace DownKyi.ViewModels.Settings
|
||||
SelectedOptionalField = -1;
|
||||
}
|
||||
|
||||
// 重置选中文件名字段
|
||||
private DelegateCommand resetCommand;
|
||||
public DelegateCommand ResetCommand => resetCommand ?? (resetCommand = new DelegateCommand(ExecuteResetCommand));
|
||||
|
||||
/// <summary>
|
||||
/// 重置选中文件名字段
|
||||
/// </summary>
|
||||
private void ExecuteResetCommand()
|
||||
{
|
||||
bool isSucceed = SettingsManager.GetInstance().SetFileNameParts(null);
|
||||
PublishTip(isSucceed);
|
||||
|
||||
List<FileNamePart> fileNameParts = SettingsManager.GetInstance().GetFileNameParts();
|
||||
SelectedFileName.Clear();
|
||||
foreach (FileNamePart item in fileNameParts)
|
||||
{
|
||||
string display = DisplayFileNamePart(item);
|
||||
SelectedFileName.Add(new DisplayFileNamePart { Id = item, Title = display });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -568,7 +568,7 @@ namespace DownKyi.ViewModels
|
||||
// 如果存在正在下载列表,则跳过,并提示
|
||||
foreach (DownloadingItem item in App.DownloadingList)
|
||||
{
|
||||
if (item.Cid == page.Cid && item.Resolution.Id == page.VideoQuality.Quality && item.AudioCodecName == page.AudioQualityFormat && item.VideoCodecName == page.VideoQuality.SelectedVideoCodec)
|
||||
if (item.Cid == page.Cid && item.Resolution.Id == page.VideoQuality.Quality && item.AudioCodec.Name == page.AudioQualityFormat && item.VideoCodecName == page.VideoQuality.SelectedVideoCodec)
|
||||
{
|
||||
eventAggregator.GetEvent<MessageEvent>().Publish($"{page.Name}{DictionaryResource.GetString("TipAlreadyToAddDownloading")}");
|
||||
continue;
|
||||
@ -578,7 +578,7 @@ namespace DownKyi.ViewModels
|
||||
// 如果存在下载完成列表,弹出选择框是否再次下载
|
||||
foreach (DownloadedItem item in App.DownloadedList)
|
||||
{
|
||||
if (item.Cid == page.Cid && item.Resolution.Id == page.VideoQuality.Quality && item.AudioCodecName == page.AudioQualityFormat && item.VideoCodecName == page.VideoQuality.SelectedVideoCodec)
|
||||
if (item.Cid == page.Cid && item.Resolution.Id == page.VideoQuality.Quality && item.AudioCodec.Name == page.AudioQualityFormat && item.VideoCodecName == page.VideoQuality.SelectedVideoCodec)
|
||||
{
|
||||
eventAggregator.GetEvent<MessageEvent>().Publish($"{page.Name}{DictionaryResource.GetString("TipAlreadyToAddDownloaded")}");
|
||||
continue;
|
||||
@ -591,10 +591,17 @@ namespace DownKyi.ViewModels
|
||||
ZoneAttr zone = zoneList.Find(it => it.Id == VideoInfoView.TypeId);
|
||||
if (zone != null)
|
||||
{
|
||||
ZoneAttr zoneParent = zoneList.Find(it => it.Id == zone.ParentId);
|
||||
if (zoneParent != null)
|
||||
if (zone.ParentId == 0)
|
||||
{
|
||||
zoneId = zoneParent.Id;
|
||||
zoneId = zone.Id;
|
||||
}
|
||||
else
|
||||
{
|
||||
ZoneAttr zoneParent = zoneList.Find(it => it.Id == zone.ParentId);
|
||||
if (zoneParent != null)
|
||||
{
|
||||
zoneId = zoneParent.Id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -663,22 +670,23 @@ namespace DownKyi.ViewModels
|
||||
Cid = page.Cid,
|
||||
EpisodeId = page.EpisodeId,
|
||||
|
||||
CoverUrl = page.FirstFrame,
|
||||
CoverUrl = VideoInfoView.CoverUrl,
|
||||
PageCoverUrl = page.FirstFrame,
|
||||
ZoneImage = (DrawingImage)Application.Current.Resources[VideoZoneIcon.Instance().GetZoneImageKey(zoneId)],
|
||||
|
||||
Order = page.Order,
|
||||
MainTitle = VideoInfoView.Title,
|
||||
Name = page.Name,
|
||||
Duration = page.Duration,
|
||||
AudioCodecId = Constant.AudioQualityId[page.AudioQualityFormat],
|
||||
AudioCodecName = page.AudioQualityFormat,
|
||||
VideoCodecName = page.VideoQuality.SelectedVideoCodec,
|
||||
Resolution = new Resolution { Name = page.VideoQuality.QualityFormat, Id = page.VideoQuality.Quality },
|
||||
Resolution = new Quality { Name = page.VideoQuality.QualityFormat, Id = page.VideoQuality.Quality },
|
||||
AudioCodec = Constant.GetAudioQualities().FirstOrDefault(t => { return t.Name == page.AudioQualityFormat; }),
|
||||
FilePath = filePath,
|
||||
|
||||
PlayStreamType = playStreamType,
|
||||
DownloadStatus = DownloadStatus.NOT_STARTED,
|
||||
};
|
||||
|
||||
// 需要下载的内容
|
||||
downloading.NeedDownloadContent["downloadAudio"] = downloadAudio;
|
||||
downloading.NeedDownloadContent["downloadVideo"] = downloadVideo;
|
||||
|
@ -39,14 +39,24 @@
|
||||
VerticalAlignment="Center"
|
||||
FontSize="14"
|
||||
Foreground="{DynamicResource BrushTextDark}"
|
||||
TextTrimming="CharacterEllipsis"
|
||||
ToolTip="{Binding MainTitle}">
|
||||
TextTrimming="CharacterEllipsis">
|
||||
<TextBlock.Text>
|
||||
<MultiBinding StringFormat="{}{0}-{1}">
|
||||
<MultiBinding StringFormat="{}{0}-{1}-{2}">
|
||||
<Binding Path="Order" />
|
||||
<Binding Path="MainTitle" />
|
||||
<Binding Path="Name" />
|
||||
</MultiBinding>
|
||||
</TextBlock.Text>
|
||||
<TextBlock.ToolTip>
|
||||
<TextBlock>
|
||||
<TextBlock.Text>
|
||||
<MultiBinding StringFormat="{}{0}-{1}">
|
||||
<Binding Path="MainTitle" />
|
||||
<Binding Path="Name" />
|
||||
</MultiBinding>
|
||||
</TextBlock.Text>
|
||||
</TextBlock>
|
||||
</TextBlock.ToolTip>
|
||||
</TextBlock>
|
||||
|
||||
<TextBlock
|
||||
@ -60,7 +70,7 @@
|
||||
<Binding Path="Duration" />
|
||||
<Binding Path="Resolution.Name" />
|
||||
<Binding Path="VideoCodecName" />
|
||||
<Binding Path="AudioCodecName" />
|
||||
<Binding Path="AudioCodec.Name" />
|
||||
</MultiBinding>
|
||||
</TextBlock.Text>
|
||||
</TextBlock>
|
||||
|
@ -188,7 +188,7 @@
|
||||
Grid.Column="2"
|
||||
FontSize="12"
|
||||
Foreground="{DynamicResource BrushTextDark}"
|
||||
Text="3.17.3" />
|
||||
Text="3.19.1" />
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
Grid.Column="3"
|
||||
@ -269,7 +269,7 @@
|
||||
Grid.Column="2"
|
||||
FontSize="12"
|
||||
Foreground="{DynamicResource BrushTextDark}"
|
||||
Text="1.4.1" />
|
||||
Text="1.4.3" />
|
||||
<TextBlock
|
||||
Grid.Row="5"
|
||||
Grid.Column="3"
|
||||
|
@ -54,6 +54,28 @@
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
|
||||
|
||||
<StackPanel Margin="0,20,0,0" Orientation="Horizontal">
|
||||
<TextBlock
|
||||
VerticalAlignment="Center"
|
||||
FontSize="12"
|
||||
Foreground="{DynamicResource BrushTextDark}"
|
||||
Text="{DynamicResource FirstAudioQuality}" />
|
||||
<ComboBox
|
||||
Name="nameAudioQualityList"
|
||||
Width="120"
|
||||
VerticalContentAlignment="Center"
|
||||
DisplayMemberPath="Name"
|
||||
ItemsSource="{Binding AudioQualityList}"
|
||||
SelectedItem="{Binding SelectedAudioQuality}">
|
||||
<i:Interaction.Triggers>
|
||||
<i:EventTrigger EventName="SelectionChanged">
|
||||
<i:InvokeCommandAction Command="{Binding AudioQualityCommand}" CommandParameter="{Binding ElementName=nameAudioQualityList, Path=SelectedItem}" />
|
||||
</i:EventTrigger>
|
||||
</i:Interaction.Triggers>
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
|
||||
<CheckBox
|
||||
Margin="0,20,0,0"
|
||||
HorizontalAlignment="Left"
|
||||
@ -144,6 +166,7 @@
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="100" />
|
||||
@ -194,6 +217,18 @@
|
||||
</i:EventTrigger>
|
||||
</i:Interaction.Triggers>
|
||||
</ListBox>
|
||||
|
||||
<Button
|
||||
Grid.Row="2"
|
||||
Grid.Column="1"
|
||||
Width="75"
|
||||
Margin="0,20,0,0"
|
||||
HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center"
|
||||
Command="{Binding ResetCommand}"
|
||||
Content="{DynamicResource Reset}"
|
||||
FontSize="12"
|
||||
Style="{StaticResource BtnBorderStyle}" />
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
|
@ -3,4 +3,12 @@
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
|
||||
</startup>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
Loading…
Reference in New Issue
Block a user