mirror of
https://github.com/leiurayer/downkyi.git
synced 2026-10-19 16:16:50 +00:00
Compare commits
111
Commits
v1.5.0-alpha3
...
v1.5.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37b2d96747 | ||
|
|
3fe2044f1a | ||
|
|
362fda1379 | ||
|
|
0969f08c98 | ||
|
|
0d0f2e8cfe | ||
|
|
e40581107b | ||
|
|
4941e2df97 | ||
|
|
d0ba992d33 | ||
|
|
c18bd43819 | ||
|
|
7d6ddfb451 | ||
|
|
87b6387872 | ||
|
|
4a932a7f85 | ||
|
|
3e1f3a74c5 | ||
|
|
8f54122e37 | ||
|
|
becb4e3e58 | ||
|
|
8cd0f82e09 | ||
|
|
6f3273d411 | ||
|
|
e23c59deb4 | ||
|
|
99edb6c369 | ||
|
|
5d4f23d8c4 | ||
|
|
683159b87b | ||
|
|
d36a2b06e2 | ||
|
|
b3af82b3a3 | ||
|
|
8d744eb106 | ||
|
|
e4f1f9dce2 | ||
|
|
cc4dd706fe | ||
|
|
9f55fde526 | ||
|
|
cac7adf53f | ||
|
|
a93f74d088 | ||
|
|
7b45274cad | ||
|
|
d8b747a48d | ||
|
|
eef382c867 | ||
|
|
eb274f82b9 | ||
|
|
15c31ee6b8 | ||
|
|
2afa3f96d6 | ||
|
|
91c9f9ceff | ||
|
|
f4d0585008 | ||
|
|
e06f239557 | ||
|
|
d572d3d6ae | ||
|
|
ef4a87b478 | ||
|
|
6b7fb239ad | ||
|
|
ffdc9f884a | ||
|
|
e09b4bc0ee | ||
|
|
6a511ca590 | ||
|
|
3edcf6fc0e | ||
|
|
f76b02b9f9 | ||
|
|
81ccea2310 | ||
|
|
ea8a4c300e | ||
|
|
7deee50280 | ||
|
|
395f8df0ec | ||
|
|
3b70055729 | ||
|
|
49895b8b7f | ||
|
|
259271ec8c | ||
|
|
bfad734d59 | ||
|
|
be9b148765 | ||
|
|
a318cb9b54 | ||
|
|
4a8b313943 | ||
|
|
a2a627a477 | ||
|
|
f8f9211046 | ||
|
|
94969e461d | ||
|
|
fcf60053ab | ||
|
|
6327a29ef9 | ||
|
|
85178d9b57 | ||
|
|
720549c04e | ||
|
|
661a6cc477 | ||
|
|
a8ac5cea9b | ||
|
|
dccbd771c2 | ||
|
|
0e93b038ae | ||
|
|
f66ecb9e49 | ||
|
|
47515e32ce | ||
|
|
aaf9775221 | ||
|
|
47ac54fba7 | ||
|
|
b22de4b5b4 | ||
|
|
8f71753df9 | ||
|
|
f10a92b181 | ||
|
|
ac70a32c14 | ||
|
|
3aa7b2c110 | ||
|
|
1f514599ac | ||
|
|
3712ea7528 | ||
|
|
92f1cd374c | ||
|
|
161decff22 | ||
|
|
fdc46bf941 | ||
|
|
505dab3310 | ||
|
|
b5c5776ac8 | ||
|
|
cf3221d601 | ||
|
|
c82e3277fd | ||
|
|
00c930072f | ||
|
|
9a1dbd274a | ||
|
|
1e8dd0bf3e | ||
|
|
7263df8b98 | ||
|
|
06a4a57183 | ||
|
|
6fd1b6d4c9 | ||
|
|
12ffc5efea | ||
|
|
c9d68907df | ||
|
|
31c256792a | ||
|
|
d37387e08d | ||
|
|
4f10bbf1b6 | ||
|
|
95a02925d5 | ||
|
|
d6cfc47b50 | ||
|
|
0e2058548f | ||
|
|
4fd747d382 | ||
|
|
bc03b53ee8 | ||
|
|
e69fd47e30 | ||
|
|
99f8bb6ca5 | ||
|
|
bbfa57f407 | ||
|
|
6652d27bfe | ||
|
|
c5e277941a | ||
|
|
f2804b3cd7 | ||
|
|
c42147cf28 | ||
|
|
577631c295 | ||
|
|
4cf196cdc2 |
+107
-1
@@ -1,5 +1,111 @@
|
||||
# 更新日志
|
||||
|
||||
## `2023/04/30` v1.5.8
|
||||
|
||||
* [新增] 视频详情页搜索功能。
|
||||
* [优化] 确认下载路径之前检查盘符是否存在。
|
||||
* [优化] 弹出框的UI。
|
||||
* [优化] 音质描述【普通音质有3档质量,但不是固定的320K或192K,因此仅用高中低表述,以免产生误解】。
|
||||
* [修复] 下载管理在只下载音频的情况下点击打开文件夹无响应。
|
||||
* [修复] 解决tabId溢出的问题。
|
||||
|
||||
## `2023/02/18` v1.5.7
|
||||
|
||||
* [新增] 自定义UserAgent。
|
||||
* [新增] 程序检查更新。
|
||||
* [优化] 下载前检测无效的下载目录。
|
||||
* [优化] 更新依赖版本。
|
||||
* [优化] 输出Aria2错误信息到UI。
|
||||
* [修复] 默认编码为AVC,但画质为杜比视界时,不会自动选中HEVC编码的问题。
|
||||
* [修复] 删除下载项时内建下载器崩溃的问题。
|
||||
|
||||
## `2023/01/06` v1.5.6
|
||||
|
||||
* [修复] 文件名包含非法字符。
|
||||
* [修复] 多线程下载的bug。
|
||||
* [修复] 弹幕无法下载的bug。
|
||||
|
||||
## `2022/11/06` v1.5.5
|
||||
|
||||
* [优化] 更新分区列表。
|
||||
* [优化] 更新依赖包。
|
||||
* [新增] 关注和粉丝页面。
|
||||
* [修复] 命名格式无AV1编码的问题。
|
||||
* [修复] 优先解析视频编码顺序为AV1、HEVC、AVC。
|
||||
* [修复] 自定义aria服务器监听端口设置无效的问题。
|
||||
|
||||
## `2022/10/16` v1.5.4
|
||||
|
||||
* [新增] 支持AV1编码视频。
|
||||
* [新增] 支持Hi-Res无损音频格式。
|
||||
* [新增] 支持UP主用户空间的合集和列表。
|
||||
* [新增] 支持自定义aria服务器。
|
||||
* [新增] 音视频分离支持多选。
|
||||
* [修复] 视频无杜比视界时支持杜比全景声。
|
||||
|
||||
## `2022/06/05` v1.5.3
|
||||
|
||||
* [优化] 封面命名。
|
||||
* [新增] 启用https控制。
|
||||
* [新增] 支持出行分区。
|
||||
* [新增] 下载管理页面入口。
|
||||
* [修复] 批量操作时偶尔崩溃的问题。
|
||||
* [修复] 监听剪贴板失效的问题。
|
||||
|
||||
## `2022/05/09` v1.5.2
|
||||
|
||||
* [优化] 更新依赖版本。
|
||||
* [新增] 内建下载器。
|
||||
* [新增] 下载器切换设置。
|
||||
* [修复] 问题 SSL/TLS handshake failure。
|
||||
|
||||
---
|
||||
|
||||
* `2022/05/09` v1.5.1
|
||||
1. [优化] 当复制视频详情页的输入框中的字符时,不读取剪贴板内容。
|
||||
2. [优化] Aria下载器添加header。
|
||||
3. [新增] 向下载管理页面添加弹窗提示。
|
||||
4. [新增] 文件命名模块中序号格式设置。
|
||||
5. [新增] 支持WebP图像。
|
||||
6. [修复] 未获取到杜比全景声却仍然显示出此选项的问题。
|
||||
7. [修复] 运动分区无法显示的问题。
|
||||
8. [修复] 文件名异常导致的下载失败。
|
||||
9. [修复] 偶尔VideoSection重复的问题。
|
||||
|
||||
* `2022/04/04` v1.5.0
|
||||
1. [优化] 跳过数据库中的不完整数据。
|
||||
2. [优化] 文件命名格式设置支持拖拽。
|
||||
3. [修复] 下载完成后的动作设置无效的问题。
|
||||
4. [修复] 视频BV1rr4y1i74o无法加载的问题。
|
||||
5. [修复] 下载内容设置偶尔不生效的问题。
|
||||
|
||||
* `2022/03/26` v1.5.0-alpha7
|
||||
1. [优化] 批量下载时过滤UGC、其他季或花絮内容。
|
||||
2. [优化] 保存下载视频内容到设置。
|
||||
3. [优化] 更新ffmpeg为gpl版本。
|
||||
4. [优化] 默认的aria的文件预分配改为NONE。
|
||||
5. [新增] “解析后自动下载已解析视频”设置。
|
||||
6. [修复] 只下载音频失败的问题。
|
||||
7. [修复] Settings被占用无法读取的问题。
|
||||
8. [修复] 因路径导致无法下载的问题。
|
||||
9. [修复] 无法正确关闭数据库的问题。
|
||||
|
||||
* `2022/03/20` v1.5.0-alpha6
|
||||
1. [修复] 一些已知问题。
|
||||
|
||||
* `2022/03/19` v1.5.0-alpha5
|
||||
1. [优化] 文件命名格式中,时间格式可设置。
|
||||
2. [修复] 数据库异常锁定的问题。
|
||||
3. [修复] 视频标题和分P标题相同时找不到下载文件的问题。
|
||||
4. [修复] 150%缩放下的窗口不超出屏幕。
|
||||
5. [修复] 其他已知问题。
|
||||
|
||||
* `2022/03/13` v1.5.0-alpha4
|
||||
1. [优化] 配置文件目录改为当前程序目录。
|
||||
2. [修复] 部分UI显示。
|
||||
3. [修复] 因数据库中的重复内容导致的闪退问题。
|
||||
4. [修复] 其他已知问题。
|
||||
|
||||
* `2022/03/12` v1.5.0-alpha3
|
||||
1. [修复] 当用户性别为保密时,程序闪退的问题。
|
||||
2. [修复] 批量下载UP主视频时,程序偶尔闪退的问题。
|
||||
@@ -17,7 +123,7 @@
|
||||
2. [新增] 最高支持8K视频。
|
||||
3. [新增] 支持杜比全景声和杜比视界。
|
||||
4. [新增] 支持字幕下载。
|
||||
5. [新增] 支持部分短链接(如 https://b23.tv/BV17x411w7KC )。
|
||||
5. [新增] 支持部分短链接(如 <https://b23.tv/BV17x411w7KC> )。
|
||||
6. [新增] 下载内容可选,可根据需要选择下载视频、音频、弹幕、字幕、封面。
|
||||
7. [新增] 下载文件命名模块,可自主设置文件名。
|
||||
|
||||
|
||||
@@ -1,30 +1,70 @@
|
||||
# 哔哩下载姬
|
||||

|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/leiurayer/downkyi/stargazers" style="text-decoration:none" >
|
||||
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/leiurayer/downkyi">
|
||||
</a>
|
||||
<a href="https://github.com/leiurayer/downkyi/network" style="text-decoration:none" >
|
||||
<img alt="GitHub forks" src="https://img.shields.io/github/forks/leiurayer/downkyi">
|
||||
</a>
|
||||
<a href="https://github.com/leiurayer/downkyi/issues" style="text-decoration:none">
|
||||
<img alt="GitHub issues" src="https://img.shields.io/github/issues/leiurayer/downkyi">
|
||||
</a>
|
||||
<a href="https://github.com/leiurayer/downkyi/blob/main/LICENSE" style="text-decoration:none" >
|
||||
<img alt="GitHub" src="https://img.shields.io/github/license/leiurayer/downkyi">
|
||||
</a>
|
||||
</p>
|
||||
|
||||

|
||||
|
||||
哔哩下载姬(DownKyi)是一个简单易用的哔哩哔哩视频下载工具,具有简洁的界面,流畅的操作逻辑。哔哩下载姬可以下载几乎所有的B站视频,并输出mp4格式的文件;采用Aria下载器多线程下载,采用FFmpeg对视频进行混流、提取音视频等操作。
|
||||
|
||||
[更多详情](src/README.md)
|
||||
|
||||
## 更新日志
|
||||
|
||||
[全部更新日志](CHANGELOG.md)
|
||||
|
||||
* `2022/03/12` v1.5.0-alpha3
|
||||
1. [修复] 当用户性别为保密时,程序闪退的问题。
|
||||
2. [修复] 批量下载UP主视频时,程序偶尔闪退的问题。
|
||||
3. [修复] 其他已知问题。
|
||||
|
||||
## 下载
|
||||
|
||||
- [哔哩下载姬最新版](https://github.com/FlySelfLog/downkyi/releases/download/v1.5.0-alpha3/DownKyi-1.5.0-alpha3.zip)
|
||||
<p align="left">
|
||||
<a href="https://github.com/leiurayer/downkyi/releases/latest" style="text-decoration:none">
|
||||
<img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/leiurayer/downkyi">
|
||||
</a>
|
||||
<a href="https://github.com/leiurayer/downkyi/releases/latest" style="text-decoration:none">
|
||||
<img alt="GitHub Release Date" src="https://img.shields.io/github/release-date/leiurayer/downkyi">
|
||||
</a>
|
||||
<a href="https://github.com/leiurayer/downkyi/releases" style="text-decoration:none">
|
||||
<img alt="GitHub all releases" src="https://img.shields.io/github/downloads/leiurayer/downkyi/total">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
- [下载页面](https://github.com/FlySelfLog/downkyi/releases)
|
||||
[更新日志](CHANGELOG.md)
|
||||
|
||||
## 问题
|
||||
|
||||
- Aria下载失败:检查aria2c.exe是否可以正常工作和是否允许通过防火墙;或者尝试切换端口号。
|
||||
- 内建下载器失败:请提issue,也欢迎pr。
|
||||
- 下载时卡在“混流中”:检查ffmpeg.exe是否可以正常工作。
|
||||
- 去水印:宽/高为水印的尺寸,X/Y为水印在图像中的位置(以左上角为原点),这四个数据可通过Photoshop获得。
|
||||
|
||||
## 赞助
|
||||
|
||||
如果这个项目对您有很大帮助,并且您希望支持该项目的开发和维护,请随时扫描一下二维码进行捐赠。非常感谢您的捐款,谢谢!
|
||||
|
||||

|
||||

|
||||
|
||||
## 开发
|
||||
|
||||
### x86 & x64
|
||||
|
||||
发布的压缩包中aria2c.exe和ffmpeg.exe均为32位,如果需要请用下面链接中的文件替换。
|
||||
|
||||
- [aria2-1.36.0-win-32bit](third_party/aria2-1.36.0-win-32bit-build1.zip)
|
||||
- [aria2-1.36.0-win-64bit](third_party/aria2-1.36.0-win-64bit-build1.zip)
|
||||
- [FFmpeg](https://github.com/leiurayer/FFmpeg-Builds/releases/tag/latest)
|
||||
|
||||
### 相关项目
|
||||
|
||||
- [哔哩哔哩-API收集整理](https://github.com/SocialSisterYi/bilibili-API-collect):B站API归档
|
||||
- [Prism](https://github.com/PrismLibrary/Prism):MVVM框架
|
||||
- [WebPSharp](https://github.com/leiurayer/WebPSharp):WebP格式图片支持,[NuGet程序包](third_party/WebPSharp.0.5.1.nupkg)
|
||||
|
||||
## 免责申明
|
||||
|
||||
|
||||
@@ -16,7 +16,12 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
public static class AriaClient
|
||||
{
|
||||
private static readonly string JSONRPC = "2.0";
|
||||
private static readonly string TOKEN = "downkyi";
|
||||
private const string LOCAL_HOST = "http://localhost";
|
||||
private const string TOKEN = "downkyi";
|
||||
private const int LISTEN_PORT = 6800;
|
||||
private static string host = LOCAL_HOST;
|
||||
private static string token = TOKEN;
|
||||
private static int listenPort = LISTEN_PORT;
|
||||
|
||||
/// <summary>
|
||||
/// This method adds a new download.
|
||||
@@ -41,7 +46,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
uris,
|
||||
option
|
||||
};
|
||||
@@ -91,7 +96,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
torrent,
|
||||
uris,
|
||||
option
|
||||
@@ -136,7 +141,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
metalink,
|
||||
uris,
|
||||
option
|
||||
@@ -168,7 +173,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -193,7 +198,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -220,7 +225,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -242,7 +247,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -266,7 +271,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -288,7 +293,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -311,7 +316,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -333,7 +338,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -360,7 +365,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -384,7 +389,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -408,7 +413,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -433,7 +438,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -457,7 +462,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -480,7 +485,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -520,7 +525,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
offset,
|
||||
num
|
||||
};
|
||||
@@ -552,7 +557,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
offset,
|
||||
num
|
||||
};
|
||||
@@ -591,7 +596,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid,
|
||||
pos,
|
||||
how.ToString("G")
|
||||
@@ -635,7 +640,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid,
|
||||
fileIndex,
|
||||
delUris,
|
||||
@@ -669,7 +674,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
|
||||
@@ -705,7 +710,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid,
|
||||
option
|
||||
};
|
||||
@@ -735,7 +740,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -770,7 +775,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
option
|
||||
};
|
||||
|
||||
@@ -793,7 +798,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -814,7 +819,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -836,7 +841,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN,
|
||||
"token:" + token,
|
||||
gid
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
@@ -858,7 +863,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -881,7 +886,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -902,7 +907,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -926,7 +931,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -947,7 +952,7 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
{
|
||||
List<object> ariaParams = new List<object>
|
||||
{
|
||||
"token:" + TOKEN
|
||||
"token:" + token,
|
||||
};
|
||||
AriaSendData ariaSend = new AriaSendData
|
||||
{
|
||||
@@ -1018,13 +1023,36 @@ namespace DownKyi.Core.Aria2cNet.Client
|
||||
return await GetRpcResponseAsync<SystemListNotifications>(ariaSend);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置aria token
|
||||
/// </summary>
|
||||
/// <param name="token"></param>
|
||||
public static void SetToken(string token = TOKEN)
|
||||
{
|
||||
AriaClient.token = token;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置aria host
|
||||
/// </summary>
|
||||
/// <param name="host"></param>
|
||||
public static void SetHost(string host = LOCAL_HOST)
|
||||
{
|
||||
AriaClient.host = host;
|
||||
}
|
||||
|
||||
public static void SetListenPort(int listenPort = LISTEN_PORT)
|
||||
{
|
||||
AriaClient.listenPort = listenPort;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取jsonrpc的地址
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private static string GetRpcUri(int listenPort = 6800)
|
||||
private static string GetRpcUri()
|
||||
{
|
||||
return $"http://localhost:{listenPort}/jsonrpc";
|
||||
return $"{host}:{AriaClient.listenPort}/jsonrpc";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -42,8 +42,8 @@ namespace DownKyi.Core.Aria2cNet.Client.Entity
|
||||
//[JsonProperty("use-head")]
|
||||
//public string UseHead { get; set; }
|
||||
|
||||
//[JsonProperty("user-agent")]
|
||||
//public string UserAgent { get; set; }
|
||||
[JsonProperty("user-agent")]
|
||||
public string UserAgent { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
namespace DownKyi.Core.Aria2cNet
|
||||
{
|
||||
/// <summary>
|
||||
/// 下载状态
|
||||
/// </summary>
|
||||
public enum DownloadStatus
|
||||
{
|
||||
SUCCESS = 1,
|
||||
FAILED,
|
||||
ABORT
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
/// </summary>
|
||||
public enum AriaConfigFileAllocation
|
||||
{
|
||||
NOT_SET = 0,
|
||||
NONE = 1, // 没有预分配
|
||||
PREALLOC, // 预分配,默认
|
||||
FALLOC // NTFS建议使用
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
/// </summary>
|
||||
public enum AriaConfigLogLevel
|
||||
{
|
||||
NOT_SET = 0,
|
||||
DEBUG = 1,
|
||||
INFO,
|
||||
NOTICE,
|
||||
|
||||
@@ -5,8 +5,6 @@ using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace DownKyi.Core.Aria2cNet.Server
|
||||
{
|
||||
@@ -22,7 +20,7 @@ namespace DownKyi.Core.Aria2cNet.Server
|
||||
/// <param name="output"></param>
|
||||
/// <param name="window"></param>
|
||||
/// <returns></returns>
|
||||
public static async Task<bool> StartServerAsync(AriaConfig config, TextBox output = null, Window window = null)
|
||||
public static async Task<bool> StartServerAsync(AriaConfig config, Action<string> action)
|
||||
{
|
||||
// aria端口
|
||||
ListenPort = config.ListenPort;
|
||||
@@ -90,6 +88,7 @@ namespace DownKyi.Core.Aria2cNet.Server
|
||||
|
||||
ExcuteProcess("aria2c.exe",
|
||||
$"--enable-rpc --rpc-listen-all=true --rpc-allow-origin-all=true " +
|
||||
$"--check-certificate=false " + // 解决问题 SSL/TLS handshake failure
|
||||
$"--rpc-listen-port={config.ListenPort} " +
|
||||
$"--rpc-secret={config.Token} " +
|
||||
$"--input-file=\"{sessionFile}\" --save-session=\"{sessionFile}\" " +
|
||||
@@ -113,17 +112,11 @@ namespace DownKyi.Core.Aria2cNet.Server
|
||||
null, (s, e) =>
|
||||
{
|
||||
if (e.Data == null || e.Data == "" || e.Data.Replace(" ", "") == "") { return; }
|
||||
|
||||
Utils.Debugging.Console.PrintLine(e.Data);
|
||||
LogManager.Debug("AriaServer", e.Data);
|
||||
|
||||
if (output != null && window != null)
|
||||
{
|
||||
window.Dispatcher.Invoke(new Action(() =>
|
||||
{
|
||||
output.Text += e.Data + "\n";
|
||||
output.ScrollToEnd();
|
||||
}));
|
||||
}
|
||||
action.Invoke(e.Data);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -137,6 +130,18 @@ namespace DownKyi.Core.Aria2cNet.Server
|
||||
public static async Task<bool> CloseServerAsync()
|
||||
{
|
||||
await AriaClient.ShutdownAsync();
|
||||
// 等待进程结束
|
||||
await Task.Run(() =>
|
||||
{
|
||||
Server.WaitForExit(30000);
|
||||
try
|
||||
{
|
||||
Server.Kill();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -166,7 +171,18 @@ namespace DownKyi.Core.Aria2cNet.Server
|
||||
{
|
||||
var task = AriaClient.ShutdownAsync();
|
||||
if (task.Result != null && task.Result.Result != null && task.Result.Result == "OK")
|
||||
{ return true; }
|
||||
{
|
||||
// 等待进程结束
|
||||
Server.WaitForExit(30000);
|
||||
try
|
||||
{
|
||||
Server.Kill();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -208,39 +224,35 @@ namespace DownKyi.Core.Aria2cNet.Server
|
||||
|
||||
private static void ExcuteProcess(string exe, string arg, string workingDirectory, DataReceivedEventHandler output)
|
||||
{
|
||||
using (var p = new Process())
|
||||
var p = new Process();
|
||||
Server = p;
|
||||
|
||||
p.StartInfo.FileName = exe;
|
||||
p.StartInfo.Arguments = arg;
|
||||
|
||||
// 工作目录
|
||||
if (workingDirectory != null)
|
||||
{
|
||||
Server = p;
|
||||
|
||||
p.StartInfo.FileName = exe;
|
||||
p.StartInfo.Arguments = arg;
|
||||
|
||||
// 工作目录
|
||||
if (workingDirectory != null)
|
||||
{
|
||||
p.StartInfo.WorkingDirectory = workingDirectory;
|
||||
}
|
||||
|
||||
// 输出信息重定向
|
||||
p.StartInfo.UseShellExecute = false;
|
||||
p.StartInfo.CreateNoWindow = true;
|
||||
p.StartInfo.RedirectStandardError = true;
|
||||
p.StartInfo.RedirectStandardOutput = true;
|
||||
|
||||
// 将 StandardErrorEncoding 改为 UTF-8 才不会出现中文乱码
|
||||
p.StartInfo.StandardOutputEncoding = Encoding.UTF8;
|
||||
p.StartInfo.StandardErrorEncoding = Encoding.UTF8;
|
||||
|
||||
p.OutputDataReceived += output;
|
||||
p.ErrorDataReceived += output;
|
||||
|
||||
// 启动线程
|
||||
p.Start();
|
||||
p.BeginOutputReadLine();
|
||||
p.BeginErrorReadLine();
|
||||
// 等待进程结束
|
||||
p.WaitForExit();
|
||||
p.StartInfo.WorkingDirectory = workingDirectory;
|
||||
}
|
||||
|
||||
// 输出信息重定向
|
||||
p.StartInfo.UseShellExecute = false;
|
||||
p.StartInfo.CreateNoWindow = true;
|
||||
p.StartInfo.RedirectStandardError = true;
|
||||
p.StartInfo.RedirectStandardOutput = true;
|
||||
|
||||
// 将 StandardErrorEncoding 改为 UTF-8 才不会出现中文乱码
|
||||
p.StartInfo.StandardOutputEncoding = Encoding.UTF8;
|
||||
p.StartInfo.StandardErrorEncoding = Encoding.UTF8;
|
||||
|
||||
p.OutputDataReceived += output;
|
||||
p.ErrorDataReceived += output;
|
||||
|
||||
// 启动线程
|
||||
p.Start();
|
||||
p.BeginOutputReadLine();
|
||||
p.BeginErrorReadLine();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -6,25 +6,36 @@ namespace DownKyi.Core.BiliApi.BiliUtils
|
||||
{
|
||||
private static readonly List<Quality> resolutions = new List<Quality>
|
||||
{
|
||||
new Quality { Name = "超高清 8K", Id = 127 },
|
||||
new Quality { Name = "杜比视界", Id = 126 },
|
||||
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 },
|
||||
new Quality { Name = "480P 清晰", Id = 32 },
|
||||
new Quality { Name = "720P 高清", Id = 64 },
|
||||
new Quality { Name = "720P 60帧", Id = 74 },
|
||||
new Quality { Name = "1080P 高清", Id = 80 },
|
||||
new Quality { Name = "1080P 高码率", Id = 112 },
|
||||
new Quality { Name = "1080P 60帧", Id = 116 },
|
||||
new Quality { Name = "4K 超清", Id = 120 },
|
||||
new Quality { Name = "HDR 真彩", Id = 125 },
|
||||
new Quality { Name = "杜比视界", Id = 126 },
|
||||
new Quality { Name = "超高清 8K", Id = 127 },
|
||||
};
|
||||
|
||||
private static readonly List<Quality> codecIds = new List<Quality>
|
||||
{
|
||||
new Quality { Name = "H.264/AVC", Id = 7 },
|
||||
new Quality { Name = "H.265/HEVC", Id = 12 },
|
||||
new Quality { Name = "AV1", Id = 13 },
|
||||
};
|
||||
|
||||
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 },
|
||||
//new Quality { Name = "64K", Id = 30216 },
|
||||
//new Quality { Name = "132K", Id = 30232 },
|
||||
//new Quality { Name = "192K", Id = 30280 },
|
||||
new Quality { Name = "低质量", Id = 30216 },
|
||||
new Quality { Name = "中质量", Id = 30232 },
|
||||
new Quality { Name = "高质量", Id = 30280 },
|
||||
new Quality { Name = "Dolby Atmos", Id = 30250 },
|
||||
new Quality { Name = "Hi-Res无损", Id = 30251 },
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
@@ -39,6 +50,18 @@ namespace DownKyi.Core.BiliApi.BiliUtils
|
||||
return new List<Quality>(resolutions);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取视频编码代码
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static List<Quality> GetCodecIds()
|
||||
{
|
||||
// 使用深复制,
|
||||
// 保证外部修改list后,
|
||||
// 不会影响其他调用处
|
||||
return new List<Quality>(codecIds);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取支持的视频音质
|
||||
/// </summary>
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace DownKyi.Core.BiliApi.Favorites
|
||||
/// <returns></returns>
|
||||
public static List<FavoritesMedia> GetFavoritesMedia(long mediaId, int pn, int ps)
|
||||
{
|
||||
string url = $"https://api.bilibili.com/x/v3/fav/resource/list?media_id={mediaId}&pn={pn}&ps={ps}";
|
||||
string url = $"https://api.bilibili.com/x/v3/fav/resource/list?media_id={mediaId}&pn={pn}&ps={ps}&platform=web";
|
||||
string referer = "https://www.bilibili.com";
|
||||
string response = WebClient.RequestWeb(url, referer);
|
||||
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
using DownKyi.Core.BiliApi.Login.Models;
|
||||
using DownKyi.Core.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Login
|
||||
{
|
||||
/// <summary>
|
||||
/// 登录基本信息
|
||||
/// </summary>
|
||||
public static class LoginInfo
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 导航栏用户信息
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static UserInfoForNavigation GetUserInfoForNavigation()
|
||||
{
|
||||
string url = "https://api.bilibili.com/x/web-interface/nav";
|
||||
string referer = "https://www.bilibili.com";
|
||||
string response = WebClient.RequestWeb(url, referer);
|
||||
|
||||
try
|
||||
{
|
||||
var userInfo = JsonConvert.DeserializeObject<UserInfoForNavigationOrigin>(response);
|
||||
if (userInfo == null || userInfo.Data == null) { return null; }
|
||||
|
||||
if (userInfo.Data.IsLogin) { return userInfo.Data; }
|
||||
else { return null; }
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("GetUserInfoForNavigation()发生异常: {0}", e);
|
||||
LogManager.Error("LoginInfo", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Login.Models
|
||||
{
|
||||
// https://api.bilibili.com/x/web-interface/nav
|
||||
[JsonObject]
|
||||
public class UserInfoForNavigationOrigin : BaseModel
|
||||
{
|
||||
//[JsonProperty("code")]
|
||||
//public int Code { get; set; }
|
||||
[JsonProperty("data")]
|
||||
public UserInfoForNavigation Data { get; set; }
|
||||
//[JsonProperty("message")]
|
||||
//public string Message { get; set; }
|
||||
//[JsonProperty("ttl")]
|
||||
//public int Ttl { get; set; }
|
||||
}
|
||||
|
||||
[JsonObject]
|
||||
public class UserInfoForNavigation : BaseModel
|
||||
{
|
||||
//public int allowance_count { get; set; }
|
||||
//public int answer_status { get; set; }
|
||||
//public int email_verified { get; set; }
|
||||
[JsonProperty("face")]
|
||||
public string Face { get; set; }
|
||||
//public bool has_shop { get; set; }
|
||||
[JsonProperty("isLogin")]
|
||||
public bool IsLogin { get; set; }
|
||||
//public NavDataLevelInfo level_info { get; set; }
|
||||
[JsonProperty("mid")]
|
||||
public long Mid { get; set; }
|
||||
//public int mobile_verified { get; set; }
|
||||
[JsonProperty("money")]
|
||||
public float Money { get; set; }
|
||||
//public int moral { get; set; }
|
||||
//public NavDataOfficial official { get; set; }
|
||||
//public NavDataOfficialVerify officialVerify { get; set; }
|
||||
//public NavDataPendant pendant { get; set; }
|
||||
//public int scores { get; set; }
|
||||
//public string shop_url { get; set; }
|
||||
[JsonProperty("uname")]
|
||||
public string Name { get; set; }
|
||||
//public long vipDueDate { get; set; }
|
||||
[JsonProperty("vipStatus")]
|
||||
public int VipStatus { get; set; }
|
||||
//public int vipType { get; set; }
|
||||
//public int vip_avatar_subscript { get; set; }
|
||||
//public NavDataVipLabel vip_label { get; set; }
|
||||
//public string vip_nickname_color { get; set; }
|
||||
//public int vip_pay_type { get; set; }
|
||||
//public int vip_theme_type { get; set; }
|
||||
[JsonProperty("wallet")]
|
||||
public UserInfoWallet Wallet { get; set; }
|
||||
}
|
||||
|
||||
//public class NavDataLevelInfo
|
||||
//{
|
||||
// public int current_exp { get; set; }
|
||||
// public int current_level { get; set; }
|
||||
// public int current_min { get; set; }
|
||||
// //public int next_exp { get; set; } // 当等级为6时,next_exp为string类型,值为"--"
|
||||
//}
|
||||
|
||||
//public class NavDataOfficial
|
||||
//{
|
||||
// public string desc { get; set; }
|
||||
// public int role { get; set; }
|
||||
// public string title { get; set; }
|
||||
// public int type { get; set; }
|
||||
//}
|
||||
|
||||
//public class NavDataOfficialVerify
|
||||
//{
|
||||
// public string desc { get; set; }
|
||||
// public int type { get; set; }
|
||||
//}
|
||||
|
||||
//public class NavDataPendant
|
||||
//{
|
||||
// public int expire { get; set; }
|
||||
// public string image { get; set; }
|
||||
// public string image_enhance { get; set; }
|
||||
// public string name { get; set; }
|
||||
// public int pid { get; set; }
|
||||
//}
|
||||
|
||||
//public class NavDataVipLabel
|
||||
//{
|
||||
// public string label_theme { get; set; }
|
||||
// public string path { get; set; }
|
||||
// public string text { get; set; }
|
||||
//}
|
||||
|
||||
[JsonObject]
|
||||
public class UserInfoWallet : BaseModel
|
||||
{
|
||||
[JsonProperty("bcoin_balance")]
|
||||
public float BcoinBalance { get; set; }
|
||||
[JsonProperty("coupon_balance")]
|
||||
public float CouponBalance { get; set; }
|
||||
[JsonProperty("coupon_due_time")]
|
||||
public long CouponDueTime { get; set; }
|
||||
[JsonProperty("mid")]
|
||||
public long Mid { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,9 @@ namespace DownKyi.Core.BiliApi.Users.Models
|
||||
public string Face { get; set; }
|
||||
[JsonProperty("sign")]
|
||||
public string Sign { get; set; }
|
||||
// face_nft
|
||||
// official_verify
|
||||
// vip
|
||||
// nft_icon
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,14 @@ namespace DownKyi.Core.BiliApi.Users.Models
|
||||
public class RelationWhisper : BaseModel
|
||||
{
|
||||
[JsonProperty("data")]
|
||||
public List<RelationFollowInfo> Data { get; set; }
|
||||
public RelationWhisperData Data { get; set; }
|
||||
}
|
||||
|
||||
public class RelationWhisperData : BaseModel
|
||||
{
|
||||
[JsonProperty("list")]
|
||||
public List<RelationFollowInfo> List { get; set; }
|
||||
// re_version
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace DownKyi.Core.BiliApi.Users.Models
|
||||
public SpacePublicationListTypeVideoZone Technology { get; set; }
|
||||
[JsonProperty("188")]
|
||||
public SpacePublicationListTypeVideoZone Digital { get; set; }
|
||||
[JsonProperty("224")]
|
||||
[JsonProperty("234")]
|
||||
public SpacePublicationListTypeVideoZone Sports { get; set; }
|
||||
[JsonProperty("223")]
|
||||
public SpacePublicationListTypeVideoZone Car { get; set; }
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Users.Models
|
||||
{
|
||||
// https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid={mid}&season_id={seasonId}&page_num={pageNum}&page_size={pageSize}&sort_reverse=false
|
||||
public class SpaceSeasonsDetailOrigin : BaseModel
|
||||
{
|
||||
//[JsonProperty("code")]
|
||||
//public int Code { get; set; }
|
||||
//[JsonProperty("message")]
|
||||
//public string Message { get; set; }
|
||||
//[JsonProperty("ttl")]
|
||||
//public int Ttl { get; set; }
|
||||
[JsonProperty("data")]
|
||||
public SpaceSeasonsDetail Data { get; set; }
|
||||
}
|
||||
|
||||
public class SpaceSeasonsDetail : BaseModel
|
||||
{
|
||||
[JsonProperty("aids")]
|
||||
public List<long> Aids { get; set; }
|
||||
[JsonProperty("archives")]
|
||||
public List<SpaceSeasonsSeriesArchives> Archives { get; set; }
|
||||
[JsonProperty("meta")]
|
||||
public SpaceSeasonsMeta Meta { get; set; }
|
||||
[JsonProperty("page")]
|
||||
public SpaceSeasonsSeriesPage Page { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Users.Models
|
||||
{
|
||||
public class SpaceSeasons : BaseModel
|
||||
{
|
||||
[JsonProperty("archives")]
|
||||
public List<SpaceSeasonsSeriesArchives> Archives { get; set; }
|
||||
[JsonProperty("meta")]
|
||||
public SpaceSeasonsMeta Meta { get; set; }
|
||||
[JsonProperty("recent_aids")]
|
||||
public List<long> RecentAids { get; set; }
|
||||
}
|
||||
|
||||
public class SpaceSeries : BaseModel
|
||||
{
|
||||
[JsonProperty("archives")]
|
||||
public List<SpaceSeasonsSeriesArchives> Archives { get; set; }
|
||||
[JsonProperty("meta")]
|
||||
public SpaceSeriesMeta Meta { get; set; }
|
||||
[JsonProperty("recent_aids")]
|
||||
public List<long> RecentAids { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Users.Models
|
||||
{
|
||||
public class SpaceSeasonsSeriesArchives : BaseModel
|
||||
{
|
||||
[JsonProperty("aid")]
|
||||
public long Aid { get; set; }
|
||||
[JsonProperty("bvid")]
|
||||
public string Bvid { get; set; }
|
||||
[JsonProperty("ctime")]
|
||||
public long Ctime { get; set; }
|
||||
[JsonProperty("duration")]
|
||||
public long Duration { get; set; }
|
||||
[JsonProperty("interactive_video")]
|
||||
public bool InteractiveVideo { get; set; }
|
||||
[JsonProperty("pic")]
|
||||
public string Pic { get; set; }
|
||||
[JsonProperty("pubdate")]
|
||||
public long Pubdate { get; set; }
|
||||
[JsonProperty("stat")]
|
||||
public SpaceSeasonsSeriesStat Stat { get; set; }
|
||||
// state
|
||||
[JsonProperty("title")]
|
||||
public string Title { get; set; }
|
||||
// ugc_pay
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Users.Models
|
||||
{
|
||||
public class SpaceSeasonsSeriesMeta : BaseModel
|
||||
{
|
||||
[JsonProperty("category")]
|
||||
public int Category { get; set; }
|
||||
[JsonProperty("cover")]
|
||||
public string Cover { get; set; }
|
||||
[JsonProperty("description")]
|
||||
public string Description { get; set; }
|
||||
[JsonProperty("mid")]
|
||||
public long Mid { get; set; }
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; set; }
|
||||
[JsonProperty("total")]
|
||||
public int Total { get; set; }
|
||||
}
|
||||
|
||||
public class SpaceSeasonsMeta : SpaceSeasonsSeriesMeta
|
||||
{
|
||||
[JsonProperty("ptime")]
|
||||
public long Ptime { get; set; }
|
||||
[JsonProperty("season_id")]
|
||||
public long SeasonId { get; set; }
|
||||
}
|
||||
|
||||
public class SpaceSeriesMeta : SpaceSeasonsSeriesMeta
|
||||
{
|
||||
[JsonProperty("creator")]
|
||||
public string Creator { get; set; }
|
||||
[JsonProperty("ctime")]
|
||||
public long Ctime { get; set; }
|
||||
[JsonProperty("keywords")]
|
||||
public List<string> Keywords { get; set; }
|
||||
[JsonProperty("last_update_ts")]
|
||||
public long LastUpdate { get; set; }
|
||||
[JsonProperty("mtime")]
|
||||
public long Mtime { get; set; }
|
||||
[JsonProperty("raw_keywords")]
|
||||
public string RawKeywords { get; set; }
|
||||
[JsonProperty("series_id")]
|
||||
public long SeriesId { get; set; }
|
||||
[JsonProperty("state")]
|
||||
public int State { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Users.Models
|
||||
{
|
||||
// https://api.bilibili.com/x/space/channel/video?mid={mid}&page_num={pageNum}&page_size={pageSize}
|
||||
public class SpaceSeasonsSeriesOrigin : BaseModel
|
||||
{
|
||||
//[JsonProperty("code")]
|
||||
//public int Code { get; set; }
|
||||
//[JsonProperty("message")]
|
||||
//public string Message { get; set; }
|
||||
//[JsonProperty("ttl")]
|
||||
//public int Ttl { get; set; }
|
||||
[JsonProperty("data")]
|
||||
public SpaceSeasonsSeriesData Data { get; set; }
|
||||
}
|
||||
|
||||
public class SpaceSeasonsSeriesData : BaseModel
|
||||
{
|
||||
[JsonProperty("items_lists")]
|
||||
public SpaceSeasonsSeries ItemsLists { get; set; }
|
||||
}
|
||||
|
||||
public class SpaceSeasonsSeries : BaseModel
|
||||
{
|
||||
[JsonProperty("page")]
|
||||
public SpaceSeasonsSeriesPage Page { get; set; }
|
||||
[JsonProperty("seasons_list")]
|
||||
public List<SpaceSeasons> SeasonsList { get; set; }
|
||||
[JsonProperty("series_list")]
|
||||
public List<SpaceSeries> SeriesList { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Users.Models
|
||||
{
|
||||
public class SpaceSeasonsSeriesPage : BaseModel
|
||||
{
|
||||
[JsonProperty("page_num")]
|
||||
public int PageNum;
|
||||
[JsonProperty("page_size")]
|
||||
public int PageSize;
|
||||
[JsonProperty("total")]
|
||||
public int Total;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Users.Models
|
||||
{
|
||||
public class SpaceSeasonsSeriesStat : BaseModel
|
||||
{
|
||||
[JsonProperty("view")]
|
||||
public long View { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Users.Models
|
||||
{
|
||||
// https://api.bilibili.com/x/series/archives?mid={mid}&series_id={seriesId}&only_normal=true&sort=desc&pn={pn}&ps={ps}
|
||||
public class SpaceSeriesDetailOrigin : BaseModel
|
||||
{
|
||||
//[JsonProperty("code")]
|
||||
//public int Code { get; set; }
|
||||
//[JsonProperty("message")]
|
||||
//public string Message { get; set; }
|
||||
//[JsonProperty("ttl")]
|
||||
//public int Ttl { get; set; }
|
||||
[JsonProperty("data")]
|
||||
public SpaceSeriesDetail Data { get; set; }
|
||||
}
|
||||
|
||||
public class SpaceSeriesDetail : BaseModel
|
||||
{
|
||||
[JsonProperty("aids")]
|
||||
public List<long> Aids { get; set; }
|
||||
// page
|
||||
[JsonProperty("archives")]
|
||||
public List<SpaceSeasonsSeriesArchives> Archives { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.Users.Models
|
||||
{
|
||||
// https://api.bilibili.com/x/series/series?series_id={seriesId}
|
||||
public class SpaceSeriesMetaOrigin : BaseModel
|
||||
{
|
||||
//[JsonProperty("code")]
|
||||
//public int Code { get; set; }
|
||||
//[JsonProperty("message")]
|
||||
//public string Message { get; set; }
|
||||
//[JsonProperty("ttl")]
|
||||
//public int Ttl { get; set; }
|
||||
[JsonProperty("data")]
|
||||
public SpaceSeriesMetaData Data { get; set; }
|
||||
}
|
||||
|
||||
public class SpaceSeriesMetaData : BaseModel
|
||||
{
|
||||
[JsonProperty("meta")]
|
||||
public SpaceSeriesMeta Meta { get; set; }
|
||||
[JsonProperty("recent_aids")]
|
||||
public List<long> RecentAids { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
@@ -139,8 +139,8 @@ namespace DownKyi.Core.BiliApi.Users
|
||||
try
|
||||
{
|
||||
RelationWhisper relationWhisper = JsonConvert.DeserializeObject<RelationWhisper>(response);
|
||||
if (relationWhisper == null || relationWhisper.Data == null) { return null; }
|
||||
return relationWhisper.Data;
|
||||
if (relationWhisper == null || relationWhisper.Data == null || relationWhisper.Data.List == null) { return null; }
|
||||
return relationWhisper.Data.List;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -210,7 +210,7 @@ namespace DownKyi.Core.BiliApi.Users
|
||||
/// <param name="ps">每页项数</param>
|
||||
/// <param name="order">排序方式</param>
|
||||
/// <returns></returns>
|
||||
public static List<RelationFollowInfo> GetFollowingGroupContent(int tagId, int pn, int ps, FollowingOrder order = FollowingOrder.DEFAULT)
|
||||
public static List<RelationFollowInfo> GetFollowingGroupContent(long tagId, int pn, int ps, FollowingOrder order = FollowingOrder.DEFAULT)
|
||||
{
|
||||
string orderType = "";
|
||||
if (order == FollowingOrder.ATTENTION)
|
||||
|
||||
@@ -112,7 +112,7 @@ namespace DownKyi.Core.BiliApi.Users
|
||||
/// <param name="tid">视频分区</param>
|
||||
/// <param name="keyword">搜索关键词</param>
|
||||
/// <returns></returns>
|
||||
public static SpacePublicationList GetPublication(long mid, int pn, int ps, int tid = 0, PublicationOrder order = PublicationOrder.PUBDATE, string keyword = "")
|
||||
public static SpacePublicationList GetPublication(long mid, int pn, int ps, long tid = 0, PublicationOrder order = PublicationOrder.PUBDATE, string keyword = "")
|
||||
{
|
||||
string url = $"https://api.bilibili.com/x/space/arc/search?mid={mid}&pn={pn}&ps={ps}&order={order.ToString("G").ToLower()}&tid={tid}&keyword={keyword}";
|
||||
string referer = "https://www.bilibili.com";
|
||||
@@ -232,20 +232,125 @@ namespace DownKyi.Core.BiliApi.Users
|
||||
|
||||
#region 合集和列表
|
||||
|
||||
// TODO
|
||||
// https://api.bilibili.com/x/polymer/space/seasons_series_list?mid=27899754&page_num=1&page_size=18
|
||||
// page_size最大值为20
|
||||
/// <summary>
|
||||
/// 查询用户的合集和列表
|
||||
/// </summary>
|
||||
/// <param name="mid"></param>
|
||||
/// <param name="pageNum">第几页</param>
|
||||
/// <param name="pageSize">每页的数量;最大值为20</param>
|
||||
/// <returns></returns>
|
||||
public static SpaceSeasonsSeries GetSeasonsSeries(long mid, int pageNum, int pageSize)
|
||||
{
|
||||
// https://api.bilibili.com/x/polymer/space/seasons_series_list?mid=49246269&page_num=1&page_size=18
|
||||
string url = $"https://api.bilibili.com/x/polymer/space/seasons_series_list?mid={mid}&page_num={pageNum}&page_size={pageSize}";
|
||||
string referer = "https://www.bilibili.com";
|
||||
string response = WebClient.RequestWeb(url, referer);
|
||||
|
||||
// https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid=23947287&season_id=665&sort_reverse=false&page_num=1&page_size=30
|
||||
try
|
||||
{
|
||||
SpaceSeasonsSeriesOrigin origin = JsonConvert.DeserializeObject<SpaceSeasonsSeriesOrigin>(response);
|
||||
if (origin == null || origin.Data == null || origin.Data.ItemsLists == null)
|
||||
{ return null; }
|
||||
return origin.Data.ItemsLists;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("GetSeasonsSeries()发生异常: {0}", e);
|
||||
LogManager.Error("UserSpace", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// https://api.bilibili.com/x/series/archives?mid=27899754&series_id=1253087&only_normal=true&sort=desc&pn=1&ps=30
|
||||
// https://api.bilibili.com/x/series/archives?mid=27899754&series_id=1253087&only_normal=true&sort=asc&pn=1&ps=30
|
||||
// https://api.bilibili.com/x/series/series?series_id=1253087
|
||||
/// <summary>
|
||||
/// 查询用户的合集的视频详情
|
||||
/// </summary>
|
||||
/// <param name="mid"></param>
|
||||
/// <param name="seasonId"></param>
|
||||
/// <param name="pageNum"></param>
|
||||
/// <param name="pageSize"></param>
|
||||
public static SpaceSeasonsDetail GetSeasonsDetail(long mid, long seasonId, int pageNum, int pageSize)
|
||||
{
|
||||
// https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid=23947287&season_id=665&sort_reverse=false&page_num=1&page_size=30
|
||||
string url = $"https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid={mid}&season_id={seasonId}&page_num={pageNum}&page_size={pageSize}&sort_reverse=false";
|
||||
string referer = "https://www.bilibili.com";
|
||||
string response = WebClient.RequestWeb(url, referer);
|
||||
|
||||
try
|
||||
{
|
||||
SpaceSeasonsDetailOrigin origin = JsonConvert.DeserializeObject<SpaceSeasonsDetailOrigin>(response);
|
||||
if (origin == null || origin.Data == null)
|
||||
{ return null; }
|
||||
return origin.Data;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("GetSeasonsDetail()发生异常: {0}", e);
|
||||
LogManager.Error("UserSpace", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询用户的列表元数据
|
||||
/// </summary>
|
||||
/// <param name="seriesId"></param>
|
||||
/// <returns></returns>
|
||||
public static SpaceSeriesMetaData GetSeriesMeta(long seriesId)
|
||||
{
|
||||
// https://api.bilibili.com/x/series/series?series_id=1253087
|
||||
string url = $"https://api.bilibili.com/x/series/series?series_id={seriesId}";
|
||||
string referer = "https://www.bilibili.com";
|
||||
string response = WebClient.RequestWeb(url, referer);
|
||||
|
||||
try
|
||||
{
|
||||
SpaceSeriesMetaOrigin origin = JsonConvert.DeserializeObject<SpaceSeriesMetaOrigin>(response);
|
||||
if (origin == null || origin.Data == null)
|
||||
{ return null; }
|
||||
return origin.Data;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("GetSeriesMeta()发生异常: {0}", e);
|
||||
LogManager.Error("UserSpace", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询用户的列表的视频详情
|
||||
/// </summary>
|
||||
/// <param name="mid"></param>
|
||||
/// <param name="seriesId"></param>
|
||||
/// <param name="pn"></param>
|
||||
/// <param name="ps"></param>
|
||||
/// <returns></returns>
|
||||
public static SpaceSeriesDetail GetSeriesDetail(long mid, long seriesId, int pn, int ps)
|
||||
{
|
||||
// https://api.bilibili.com/x/series/archives?mid=27899754&series_id=1253087&only_normal=true&sort=desc&pn=1&ps=30
|
||||
|
||||
string url = $"https://api.bilibili.com/x/series/archives?mid={mid}&series_id={seriesId}&only_normal=true&sort=desc&pn={pn}&ps={ps}";
|
||||
string referer = "https://www.bilibili.com";
|
||||
string response = WebClient.RequestWeb(url, referer);
|
||||
|
||||
try
|
||||
{
|
||||
SpaceSeriesDetailOrigin origin = JsonConvert.DeserializeObject<SpaceSeriesDetailOrigin>(response);
|
||||
if (origin == null || origin.Data == null)
|
||||
{ return null; }
|
||||
return origin.Data;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("GetSeriesDetail()发生异常: {0}", e);
|
||||
LogManager.Error("UserSpace", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 课程
|
||||
|
||||
/// <summary>
|
||||
/// 查询用户发布的课程列表
|
||||
/// </summary>
|
||||
|
||||
@@ -18,5 +18,7 @@ namespace DownKyi.Core.BiliApi.VideoStream.Models
|
||||
public List<PlayUrlDashVideo> Audio { get; set; }
|
||||
[JsonProperty("dolby")]
|
||||
public PlayUrlDashDolby Dolby { get; set; }
|
||||
[JsonProperty("flac")]
|
||||
public PlayUrlDashFlac Flac { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
using DownKyi.Core.BiliApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace DownKyi.Core.BiliApi.VideoStream.Models
|
||||
{
|
||||
public class PlayUrlDashFlac : BaseModel
|
||||
{
|
||||
[JsonProperty("audio")]
|
||||
public PlayUrlDashVideo Audio { get; set; }
|
||||
//bool display { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -30,6 +30,7 @@ namespace DownKyi.Core.BiliApi.VideoStream.Models
|
||||
// start_with_sap
|
||||
// SegmentBase
|
||||
// segment_base
|
||||
// codecid
|
||||
[JsonProperty("codecid")]
|
||||
public int CodecId { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Brotli;
|
||||
using DownKyi.Core.BiliApi.Login;
|
||||
using DownKyi.Core.Settings;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
@@ -50,11 +51,7 @@ namespace DownKyi.Core.BiliApi
|
||||
request.Method = method;
|
||||
request.Timeout = 30 * 1000;
|
||||
|
||||
// MacOS Safari
|
||||
//string safari = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15";
|
||||
// Windows 10 Chrome
|
||||
string chrome = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36";
|
||||
request.UserAgent = chrome;
|
||||
request.UserAgent = SettingsManager.GetInstance().GetUserAgent();
|
||||
|
||||
//request.ContentType = "application/json,text/html,application/xhtml+xml,application/xml;charset=UTF-8";
|
||||
request.Headers["accept-language"] = "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7";
|
||||
|
||||
@@ -31,173 +31,180 @@ namespace DownKyi.Core.BiliApi.Zone
|
||||
|
||||
//动画
|
||||
zones.Add(new ZoneAttr(1, "douga", "动画")); // 主分区
|
||||
zones.Add(new ZoneAttr(24, "mad", "MAD·AMV", 1)); //具有一定制作程度的动画或静画的二次创作视频
|
||||
zones.Add(new ZoneAttr(25, "mmd", "MMD·3D", 1)); //使用MMD(MikuMikuDance)和其他3D建模类软件制作的视频
|
||||
zones.Add(new ZoneAttr(47, "voice", "短片·手书·配音", 1)); //追求创新并具有强烈特色的短片、手书(绘)及ACG相关配音
|
||||
zones.Add(new ZoneAttr(210, "garage_kit", "手办·模玩", 1)); //手办模玩的测评、改造或其他衍生内容
|
||||
zones.Add(new ZoneAttr(86, "tokusatsu", "特摄", 1)); //特摄相关衍生视频
|
||||
zones.Add(new ZoneAttr(27, "other", "综合", 1)); //以动画及动画相关内容为素材,包括但不仅限于音频替换、杂谈、排行榜等内容
|
||||
zones.Add(new ZoneAttr(24, "mad", "MAD·AMV", 1)); // 具有一定制作程度的动画或静画的二次创作视频
|
||||
zones.Add(new ZoneAttr(25, "mmd", "MMD·3D", 1)); // 使用MMD(MikuMikuDance)和其他3D建模类软件制作的视频
|
||||
zones.Add(new ZoneAttr(47, "voice", "短片·手书·配音", 1)); // 追求个人特色和创意表达的自制动画短片、手书(绘)及ACGN相关配音
|
||||
zones.Add(new ZoneAttr(210, "garage_kit", "手办·模玩", 1)); // 手办模玩的测评、改造或其他衍生内容
|
||||
zones.Add(new ZoneAttr(86, "tokusatsu", "特摄", 1)); // 特摄相关衍生视频
|
||||
zones.Add(new ZoneAttr(253, "acgntalks", "动漫杂谈", 1)); // 以谈话形式对ACGN文化圈进行的鉴赏、吐槽、评点、解说、推荐、科普等内容
|
||||
zones.Add(new ZoneAttr(27, "other", "综合", 1)); // 以动画及动画相关内容为素材,包括但不仅限于音频替换、恶搞改编、排行榜等内容
|
||||
|
||||
//番剧
|
||||
zones.Add(new ZoneAttr(13, "anime", "番剧")); // 主分区
|
||||
zones.Add(new ZoneAttr(33, "serial", "连载动画", 13)); //当季连载的动画番剧
|
||||
zones.Add(new ZoneAttr(32, "finish", "完结动画", 13)); //已完结的动画番剧合集
|
||||
zones.Add(new ZoneAttr(51, "information", "资讯", 13)); //动画番剧相关资讯视频
|
||||
zones.Add(new ZoneAttr(152, "offical", "官方延伸", 13)); //动画番剧为主题的宣传节目、采访视频,及声优相关视频
|
||||
zones.Add(new ZoneAttr(33, "serial", "连载动画", 13)); // 当季连载的动画番剧
|
||||
zones.Add(new ZoneAttr(32, "finish", "完结动画", 13)); // 已完结的动画番剧合集
|
||||
zones.Add(new ZoneAttr(51, "information", "资讯", 13)); // 动画番剧相关资讯视频
|
||||
zones.Add(new ZoneAttr(152, "offical", "官方延伸", 13)); // 动画番剧为主题的宣传节目、采访视频,及声优相关视频
|
||||
|
||||
//国创
|
||||
zones.Add(new ZoneAttr(167, "guochuang", "国创")); // 主分区
|
||||
zones.Add(new ZoneAttr(153, "chinese", "国产动画", 167)); //我国出品的PGC动画
|
||||
zones.Add(new ZoneAttr(168, "original", "国产原创相关", 167)); //
|
||||
zones.Add(new ZoneAttr(169, "puppetry", "布袋戏", 167)); //
|
||||
zones.Add(new ZoneAttr(195, "motioncomic", "动态漫·广播剧", 167)); //
|
||||
zones.Add(new ZoneAttr(170, "information", "资讯", 167)); //
|
||||
zones.Add(new ZoneAttr(153, "chinese", "国产动画", 167)); // 我国出品的PGC动画
|
||||
zones.Add(new ZoneAttr(168, "original", "国产原创相关", 167)); //
|
||||
zones.Add(new ZoneAttr(169, "puppetry", "布袋戏", 167)); //
|
||||
zones.Add(new ZoneAttr(195, "motioncomic", "动态漫·广播剧", 167)); //
|
||||
zones.Add(new ZoneAttr(170, "information", "资讯", 167)); //
|
||||
|
||||
//音乐
|
||||
zones.Add(new ZoneAttr(3, "music", "音乐")); // 主分区
|
||||
zones.Add(new ZoneAttr(28, "original", "原创音乐", 3)); //个人或团队制作以音乐为主要原创因素的歌曲或纯音乐
|
||||
zones.Add(new ZoneAttr(31, "cover", "翻唱", 3)); //一切非官方的人声再演绎歌曲作品
|
||||
zones.Add(new ZoneAttr(30, "vocaloid", "VOCALOID·UTAU", 3)); //以雅马哈Vocaloid和UTAU引擎为基础,包含其他调教引擎,运用各类音源进行的歌曲创作内容
|
||||
zones.Add(new ZoneAttr(194, "electronic", "电音", 3)); //以电子合成器、音乐软体等产生的电子声响制作的音乐
|
||||
zones.Add(new ZoneAttr(59, "perform", "演奏", 3)); //传统或非传统乐器及器材的演奏作品
|
||||
zones.Add(new ZoneAttr(193, "mv", "MV", 3)); //音乐录影带,为搭配音乐而拍摄或制作的视频
|
||||
zones.Add(new ZoneAttr(29, "live", "音乐现场", 3)); //音乐实况表演视频
|
||||
zones.Add(new ZoneAttr(130, "other", "音乐综合", 3)); //收录无法定义到其他音乐子分区的音乐视频
|
||||
zones.Add(new ZoneAttr(28, "original", "原创音乐", 3)); // 原创歌曲及纯音乐,包括改编、重编曲及remix
|
||||
zones.Add(new ZoneAttr(31, "cover", "翻唱", 3)); // 对曲目的人声再演绎视频
|
||||
zones.Add(new ZoneAttr(59, "perform", "演奏", 3)); // 乐器和非传统乐器器材的演奏作品
|
||||
zones.Add(new ZoneAttr(30, "vocaloid", "VOCALOID·UTAU", 3)); // 以VOCALOID等歌声合成引擎为基础,运用各类音源进行的创作
|
||||
zones.Add(new ZoneAttr(29, "live", "音乐现场", 3)); // 音乐表演的实况视频,包括官方/个人拍摄的综艺节目、音乐剧、音乐节、演唱会等
|
||||
zones.Add(new ZoneAttr(193, "mv", "MV", 3)); // 为音乐作品配合拍摄或制作的音乐录影带(Music Video),以及自制拍摄、剪辑、翻拍MV
|
||||
zones.Add(new ZoneAttr(243, "commentary", "乐评盘点", 3)); // 音乐类新闻、盘点、点评、reaction、榜单、采访、幕后故事、唱片开箱等
|
||||
zones.Add(new ZoneAttr(244, "tutorial", "音乐教学", 3)); // 以音乐教学为目的的内容
|
||||
zones.Add(new ZoneAttr(130, "other", "音乐综合", 3)); // 所有无法被收纳到其他音乐二级分区的音乐类视频
|
||||
|
||||
//舞蹈
|
||||
zones.Add(new ZoneAttr(129, "dance", "舞蹈")); // 主分区
|
||||
zones.Add(new ZoneAttr(20, "otaku", "宅舞", 129)); //与ACG相关的翻跳、原创舞蹈
|
||||
zones.Add(new ZoneAttr(198, "hiphop", "街舞", 129)); //收录街舞相关内容,包括赛事现场、舞室作品、个人翻跳、FREESTYLE等
|
||||
zones.Add(new ZoneAttr(199, "star", "明星舞蹈", 129)); //国内外明星发布的官方舞蹈及其翻跳内容
|
||||
zones.Add(new ZoneAttr(200, "china", "中国舞", 129)); //传承中国艺术文化的舞蹈内容,包括古典舞、民族民间舞、汉唐舞、古风舞等
|
||||
zones.Add(new ZoneAttr(154, "three_d", "舞蹈综合", 129)); //收录无法定义到其他舞蹈子分区的舞蹈视频
|
||||
zones.Add(new ZoneAttr(156, "demo", "舞蹈教程", 129)); //镜面慢速,动作分解,基础教程等具有教学意义的舞蹈视频
|
||||
zones.Add(new ZoneAttr(20, "otaku", "宅舞", 129)); // 与ACG相关的翻跳、原创舞蹈
|
||||
zones.Add(new ZoneAttr(198, "hiphop", "街舞", 129)); // 收录街舞相关内容,包括赛事现场、舞室作品、个人翻跳、FREESTYLE等
|
||||
zones.Add(new ZoneAttr(199, "star", "明星舞蹈", 129)); // 国内外明星发布的官方舞蹈及其翻跳内容
|
||||
zones.Add(new ZoneAttr(200, "china", "中国舞", 129)); // 传承中国艺术文化的舞蹈内容,包括古典舞、民族民间舞、汉唐舞、古风舞等
|
||||
zones.Add(new ZoneAttr(154, "three_d", "舞蹈综合", 129)); // 收录无法定义到其他舞蹈子分区的舞蹈视频
|
||||
zones.Add(new ZoneAttr(156, "demo", "舞蹈教程", 129)); // 镜面慢速,动作分解,基础教程等具有教学意义的舞蹈视频
|
||||
|
||||
//游戏
|
||||
zones.Add(new ZoneAttr(4, "game", "游戏")); // 主分区
|
||||
zones.Add(new ZoneAttr(17, "stand_alone", "单机游戏", 4)); //以所有平台(PC、主机、移动端)的单机或联机游戏为主的视频内容,包括游戏预告、CG、实况解说及相关的评测、杂谈与视频剪辑等
|
||||
zones.Add(new ZoneAttr(171, "esports", "电子竞技", 4)); //具有高对抗性的电子竞技游戏项目,其相关的赛事、实况、攻略、解说、短剧等视频。
|
||||
zones.Add(new ZoneAttr(172, "mobile", "手机游戏", 4)); //以手机及平板设备为主要平台的游戏,其相关的实况、攻略、解说、短剧、演示等视频。
|
||||
zones.Add(new ZoneAttr(65, "online", "网络游戏", 4)); //由网络运营商运营的多人在线游戏,以及电子竞技的相关游戏内容。包括赛事、攻略、实况、解说等相关视频
|
||||
zones.Add(new ZoneAttr(173, "board", "桌游棋牌", 4)); //桌游、棋牌、卡牌对战等及其相关电子版游戏的实况、攻略、解说、演示等视频。
|
||||
zones.Add(new ZoneAttr(121, "gmv", "GMV", 4)); //由游戏素材制作的MV视频。以游戏内容或CG为主制作的,具有一定创作程度的MV类型的视频
|
||||
zones.Add(new ZoneAttr(136, "music", "音游", 4)); //各个平台上,通过配合音乐与节奏而进行的音乐类游戏视频
|
||||
zones.Add(new ZoneAttr(19, "mugen", "Mugen", 4)); //以Mugen引擎为平台制作、或与Mugen相关的游戏视频
|
||||
zones.Add(new ZoneAttr(17, "stand_alone", "单机游戏", 4)); // 以所有平台(PC、主机、移动端)的单机或联机游戏为主的视频内容,包括游戏预告、CG、实况解说及相关的评测、杂谈与视频剪辑等
|
||||
zones.Add(new ZoneAttr(171, "esports", "电子竞技", 4)); // 具有高对抗性的电子竞技游戏项目,其相关的赛事、实况、攻略、解说、短剧等视频。
|
||||
zones.Add(new ZoneAttr(172, "mobile", "手机游戏", 4)); // 以手机及平板设备为主要平台的游戏,其相关的实况、攻略、解说、短剧、演示等视频。
|
||||
zones.Add(new ZoneAttr(65, "online", "网络游戏", 4)); // 由网络运营商运营的多人在线游戏,以及电子竞技的相关游戏内容。包括赛事、攻略、实况、解说等相关视频
|
||||
zones.Add(new ZoneAttr(173, "board", "桌游棋牌", 4)); // 桌游、棋牌、卡牌对战等及其相关电子版游戏的实况、攻略、解说、演示等视频。
|
||||
zones.Add(new ZoneAttr(121, "gmv", "GMV", 4)); // 由游戏素材制作的MV视频。以游戏内容或CG为主制作的,具有一定创作程度的MV类型的视频
|
||||
zones.Add(new ZoneAttr(136, "music", "音游", 4)); // 各个平台上,通过配合音乐与节奏而进行的音乐类游戏视频
|
||||
zones.Add(new ZoneAttr(19, "mugen", "Mugen", 4)); // 以Mugen引擎为平台制作、或与Mugen相关的游戏视频
|
||||
|
||||
//知识
|
||||
zones.Add(new ZoneAttr(36, "knowledge", "知识")); // 主分区
|
||||
zones.Add(new ZoneAttr(201, "science", "科学科普", 36)); //回答你的十万个为什么
|
||||
zones.Add(new ZoneAttr(124, "social_science", "社科·法律·心理", 36)); //基于社会科学、法学、心理学展开或个人观点输出的知识视频
|
||||
zones.Add(new ZoneAttr(228, "humanity_history", "人文历史", 36)); //看看古今人物,聊聊历史过往,品品文学典籍
|
||||
zones.Add(new ZoneAttr(207, "business", "财经商业", 36)); //说金融市场,谈宏观经济,一起畅聊商业故事
|
||||
zones.Add(new ZoneAttr(208, "campus", "校园学习", 36)); //老师很有趣,学生也有才,我们一起搞学习
|
||||
zones.Add(new ZoneAttr(209, "career", "职业职场", 36)); //职业分享、升级指南,一起成为最有料的职场人
|
||||
zones.Add(new ZoneAttr(229, "design", "设计·创意", 36)); //天马行空,创意设计,都在这里
|
||||
zones.Add(new ZoneAttr(122, "skill", "野生技能协会", 36)); //技能党集合,是时候展示真正的技术了
|
||||
zones.Add(new ZoneAttr(201, "science", "科学科普", 36)); // 回答你的十万个为什么
|
||||
zones.Add(new ZoneAttr(124, "social_science", "社科·法律·心理", 36)); // 基于社会科学、法学、心理学展开或个人观点输出的知识视频
|
||||
zones.Add(new ZoneAttr(228, "humanity_history", "人文历史", 36)); // 看看古今人物,聊聊历史过往,品品文学典籍
|
||||
zones.Add(new ZoneAttr(207, "business", "财经商业", 36)); // 说金融市场,谈宏观经济,一起畅聊商业故事
|
||||
zones.Add(new ZoneAttr(208, "campus", "校园学习", 36)); // 老师很有趣,学生也有才,我们一起搞学习
|
||||
zones.Add(new ZoneAttr(209, "career", "职业职场", 36)); // 职业分享、升级指南,一起成为最有料的职场人
|
||||
zones.Add(new ZoneAttr(229, "design", "设计·创意", 36)); // 天马行空,创意设计,都在这里
|
||||
zones.Add(new ZoneAttr(122, "skill", "野生技能协会", 36)); // 技能党集合,是时候展示真正的技术了
|
||||
|
||||
//科技
|
||||
zones.Add(new ZoneAttr(188, "tech", "科技")); // 主分区
|
||||
zones.Add(new ZoneAttr(95, "digital", "数码", 188)); //科技数码产品大全,一起来做发烧友
|
||||
zones.Add(new ZoneAttr(230, "application", "软件应用", 188)); //超全软件应用指南
|
||||
zones.Add(new ZoneAttr(231, "computer_tech", "计算机技术", 188)); //研究分析、教学演示、经验分享......有关计算机技术的都在这里
|
||||
zones.Add(new ZoneAttr(232, "industry", "工业·工程·机械", 188)); //前方高能,机甲重工即将出没
|
||||
zones.Add(new ZoneAttr(233, "diy", "极客DIY", 188)); //炫酷技能,极客文化,硬核技巧,准备好你的惊讶
|
||||
zones.Add(new ZoneAttr(95, "digital", "数码", 188)); // 科技数码产品大全,一起来做发烧友
|
||||
zones.Add(new ZoneAttr(230, "application", "软件应用", 188)); // 超全软件应用指南
|
||||
zones.Add(new ZoneAttr(231, "computer_tech", "计算机技术", 188)); // 研究分析、教学演示、经验分享......有关计算机技术的都在这里
|
||||
zones.Add(new ZoneAttr(232, "industry", "科工机械", 188)); // 从小芯片到大工程,一起见证科工力量
|
||||
zones.Add(new ZoneAttr(233, "diy", "极客DIY", 188)); // 炫酷技能,极客文化,硬核技巧,准备好你的惊讶
|
||||
|
||||
//运动
|
||||
zones.Add(new ZoneAttr(234, "sports", "运动")); // 主分区
|
||||
zones.Add(new ZoneAttr(235, "basketballfootball", "篮球·足球", 234)); //与篮球、足球相关的视频,包括但不限于篮足球赛事、教学、评述、剪辑、剧情等相关内容
|
||||
zones.Add(new ZoneAttr(164, "aerobics", "健身", 234)); //与健身相关的视频,包括但不限于瑜伽、CrossFit、健美、力量举、普拉提、街健等相关内容
|
||||
zones.Add(new ZoneAttr(236, "athletic", "竞技体育", 234)); //与竞技体育相关的视频,包括但不限于乒乓、羽毛球、排球、赛车等竞技项目的赛事、评述、剪辑、剧情等相关内容
|
||||
zones.Add(new ZoneAttr(237, "culture", "运动文化", 234)); //与运动文化相关的视频,包络但不限于球鞋、球衣、球星卡等运动衍生品的分享、解读,体育产业的分析、科普等相关内容
|
||||
zones.Add(new ZoneAttr(238, "comprehensive", "运动综合", 234)); //与运动综合相关的视频,包括但不限于钓鱼、骑行、滑板等日常运动分享、教学、Vlog等相关内容
|
||||
zones.Add(new ZoneAttr(235, "basketball", "篮球", 234)); // 与篮球相关的视频,包括但不限于篮球赛事、教学、评述、剪辑、剧情等相关内容
|
||||
zones.Add(new ZoneAttr(249, "football", "足球", 234)); // 与足球相关的视频,包括但不限于足球赛事、教学、评述、剪辑、剧情等相关内容
|
||||
zones.Add(new ZoneAttr(164, "aerobics", "健身", 234)); // 与健身相关的视频,包括但不限于瑜伽、CrossFit、健美、力量举、普拉提、街健等相关内容
|
||||
zones.Add(new ZoneAttr(236, "athletic", "竞技体育", 234)); // 与竞技体育相关的视频,包括但不限于乒乓、羽毛球、排球、赛车等竞技项目的赛事、评述、剪辑、剧情等相关内容
|
||||
zones.Add(new ZoneAttr(237, "culture", "运动文化", 234)); // 与运动文化相关的视频,包络但不限于球鞋、球衣、球星卡等运动衍生品的分享、解读,体育产业的分析、科普等相关内容
|
||||
zones.Add(new ZoneAttr(238, "comprehensive", "运动综合", 234)); // 与运动综合相关的视频,包括但不限于钓鱼、骑行、滑板等日常运动分享、教学、Vlog等相关内容
|
||||
|
||||
//汽车
|
||||
zones.Add(new ZoneAttr(223, "car", "汽车")); // 主分区
|
||||
zones.Add(new ZoneAttr(176, "life", "汽车生活", 223)); //分享汽车及出行相关的生活体验类视频
|
||||
zones.Add(new ZoneAttr(224, "culture", "汽车文化", 223)); //车迷的精神圣地,包括汽车赛事、品牌历史、汽车改装、经典车型和汽车模型等
|
||||
zones.Add(new ZoneAttr(225, "geek", "汽车极客", 223)); //汽车硬核达人聚集地,包括DIY造车、专业评测和技术知识分享
|
||||
zones.Add(new ZoneAttr(240, "motorcycle", "摩托车", 223)); //骑士们集合啦
|
||||
zones.Add(new ZoneAttr(226, "smart", "智能出行", 223)); //探索新能源汽车和未来智能出行的前沿阵地
|
||||
zones.Add(new ZoneAttr(227, "strategy", "购车攻略", 223)); //丰富详实的购车建议和新车体验
|
||||
zones.Add(new ZoneAttr(245, "racing", "赛车", 223)); // F1等汽车运动相关
|
||||
zones.Add(new ZoneAttr(246, "modifiedvehicle", "改装玩车", 223)); // 汽车文化及改装车相关内容,包括改装车、老车修复介绍、汽车聚会分享等内容
|
||||
zones.Add(new ZoneAttr(247, "newenergyvehicle", "新能源车", 223)); // 新能源汽车相关内容,包括电动汽车、混合动力汽车等车型种类,包含不限于新车资讯、试驾体验、专业评测、技术解读、知识科普等内容
|
||||
zones.Add(new ZoneAttr(248, "touringcar", "房车", 223)); // 房车及营地相关内容,包括不限于产品介绍、驾驶体验、房车生活和房车旅行等内容
|
||||
zones.Add(new ZoneAttr(240, "motorcycle", "摩托车", 223)); // 骑士们集合啦
|
||||
zones.Add(new ZoneAttr(227, "strategy", "购车攻略", 223)); // 丰富详实的购车建议和新车体验
|
||||
zones.Add(new ZoneAttr(176, "life", "汽车生活", 223)); // 分享汽车及出行相关的生活体验类视频
|
||||
|
||||
//生活
|
||||
zones.Add(new ZoneAttr(160, "life", "生活")); // 主分区
|
||||
zones.Add(new ZoneAttr(138, "funny", "搞笑", 160)); //各种沙雕有趣的搞笑剪辑,挑战,表演,配音等视频
|
||||
zones.Add(new ZoneAttr(239, "home", "家居房产", 160)); //与买房、装修、居家生活相关的分享
|
||||
zones.Add(new ZoneAttr(161, "handmake", "手工", 160)); //手工制品的制作过程或成品展示、教程、测评类视频
|
||||
zones.Add(new ZoneAttr(162, "painting", "绘画", 160)); //绘画过程或绘画教程,以及绘画相关的所有视频
|
||||
zones.Add(new ZoneAttr(21, "daily", "日常", 160)); //记录日常生活,分享生活故事
|
||||
zones.Add(new ZoneAttr(138, "funny", "搞笑", 160)); // 各种沙雕有趣的搞笑剪辑,挑战,表演,配音等视频
|
||||
zones.Add(new ZoneAttr(250, "travel", "Energy", 160)); // 为达到观光游览、休闲娱乐为目的的远途旅行、中近途户外生活、本地探店
|
||||
zones.Add(new ZoneAttr(251, "rurallife", "三农", 160)); // 分享美好农村生活
|
||||
zones.Add(new ZoneAttr(239, "home", "家居房产", 160)); // 与买房、装修、居家生活相关的分享
|
||||
zones.Add(new ZoneAttr(161, "handmake", "手工", 160)); // 手工制品的制作过程或成品展示、教程、测评类视频
|
||||
zones.Add(new ZoneAttr(162, "painting", "绘画", 160)); // 绘画过程或绘画教程,以及绘画相关的所有视频
|
||||
zones.Add(new ZoneAttr(21, "daily", "日常", 160)); // 记录日常生活,分享生活故事
|
||||
|
||||
//美食
|
||||
zones.Add(new ZoneAttr(211, "food", "美食")); // 主分区
|
||||
zones.Add(new ZoneAttr(76, "make", "美食制作", 211)); //学做人间美味,展示精湛厨艺
|
||||
zones.Add(new ZoneAttr(212, "detective", "美食侦探", 211)); //寻找美味餐厅,发现街头美食
|
||||
zones.Add(new ZoneAttr(213, "measurement", "美食测评", 211)); //吃货世界,品尝世间美味
|
||||
zones.Add(new ZoneAttr(214, "rural", "田园美食", 211)); //品味乡野美食,寻找山与海的味道
|
||||
zones.Add(new ZoneAttr(215, "record", "美食记录", 211)); //记录一日三餐,给生活添一点幸福感
|
||||
zones.Add(new ZoneAttr(76, "make", "美食制作", 211)); // 学做人间美味,展示精湛厨艺
|
||||
zones.Add(new ZoneAttr(212, "detective", "美食侦探", 211)); // 寻找美味餐厅,发现街头美食
|
||||
zones.Add(new ZoneAttr(213, "measurement", "美食测评", 211)); // 吃货世界,品尝世间美味
|
||||
zones.Add(new ZoneAttr(214, "rural", "田园美食", 211)); // 品味乡野美食,寻找山与海的味道
|
||||
zones.Add(new ZoneAttr(215, "record", "美食记录", 211)); // 记录一日三餐,给生活添一点幸福感
|
||||
|
||||
//动物圈
|
||||
zones.Add(new ZoneAttr(217, "animal", "动物圈")); // 主分区
|
||||
zones.Add(new ZoneAttr(218, "cat", "喵星人", 217)); //喵喵喵喵喵
|
||||
zones.Add(new ZoneAttr(219, "dog", "汪星人", 217)); //汪汪汪汪汪
|
||||
zones.Add(new ZoneAttr(220, "panda", "大熊猫", 217)); //芝麻汤圆营业中
|
||||
zones.Add(new ZoneAttr(221, "wild_animal", "野生动物", 217)); //内有“猛兽”出没
|
||||
zones.Add(new ZoneAttr(222, "reptiles", "爬宠", 217)); //鳞甲有灵
|
||||
zones.Add(new ZoneAttr(75, "animal_composite", "动物综合", 217)); //收录除上述子分区外,其余动物相关视频以及非动物主体或多个动物主体的动物相关延伸内容
|
||||
zones.Add(new ZoneAttr(218, "cat", "喵星人", 217)); // 喵喵喵喵喵
|
||||
zones.Add(new ZoneAttr(219, "dog", "汪星人", 217)); // 汪汪汪汪汪
|
||||
zones.Add(new ZoneAttr(220, "panda", "大熊猫", 217)); // 芝麻汤圆营业中
|
||||
zones.Add(new ZoneAttr(221, "wild_animal", "野生动物", 217)); // 内有“猛兽”出没
|
||||
zones.Add(new ZoneAttr(222, "reptiles", "爬宠", 217)); // 鳞甲有灵
|
||||
zones.Add(new ZoneAttr(75, "animal_composite", "动物综合", 217)); // 收录除上述子分区外,其余动物相关视频以及非动物主体或多个动物主体的动物相关延伸内容
|
||||
|
||||
//鬼畜
|
||||
zones.Add(new ZoneAttr(119, "kichiku", "鬼畜")); // 主分区
|
||||
zones.Add(new ZoneAttr(22, "guide", "鬼畜调教", 119)); //使用素材在音频、画面上做一定处理,达到与BGM一定的同步感
|
||||
zones.Add(new ZoneAttr(26, "mad", "音MAD", 119)); //使用素材音频进行一定的二次创作来达到还原原曲的非商业性质稿件
|
||||
zones.Add(new ZoneAttr(126, "manual_vocaloid", "人力VOCALOID", 119)); //将人物或者角色的无伴奏素材进行人工调音,使其就像VOCALOID一样歌唱的技术
|
||||
zones.Add(new ZoneAttr(216, "theatre", "鬼畜剧场", 119)); //使用素材进行人工剪辑编排的有剧情的作品
|
||||
zones.Add(new ZoneAttr(127, "course", "教程演示", 119)); //鬼畜相关的教程演示
|
||||
zones.Add(new ZoneAttr(22, "guide", "鬼畜调教", 119)); // 使用素材在音频、画面上做一定处理,达到与BGM一定的同步感
|
||||
zones.Add(new ZoneAttr(26, "mad", "音MAD", 119)); // 使用素材音频进行一定的二次创作来达到还原原曲的非商业性质稿件
|
||||
zones.Add(new ZoneAttr(126, "manual_vocaloid", "人力VOCALOID", 119)); // 将人物或者角色的无伴奏素材进行人工调音,使其就像VOCALOID一样歌唱的技术
|
||||
zones.Add(new ZoneAttr(216, "theatre", "鬼畜剧场", 119)); // 使用素材进行人工剪辑编排的有剧情的作品
|
||||
zones.Add(new ZoneAttr(127, "course", "教程演示", 119)); // 鬼畜相关的教程演示
|
||||
|
||||
//时尚
|
||||
zones.Add(new ZoneAttr(155, "fashion", "时尚")); // 主分区
|
||||
zones.Add(new ZoneAttr(157, "makeup", "美妆护肤", 155)); //彩妆护肤、美甲美发、仿妆、医美相关内容分享或产品测评
|
||||
zones.Add(new ZoneAttr(158, "clothing", "穿搭", 155)); //穿搭风格、穿搭技巧的展示分享,涵盖衣服、鞋靴、箱包配件、配饰(帽子、钟表、珠宝首饰)等
|
||||
zones.Add(new ZoneAttr(159, "trend", "时尚潮流", 155)); //时尚街拍、时装周、时尚大片,时尚品牌、潮流等行业相关记录及知识科普
|
||||
zones.Add(new ZoneAttr(157, "makeup", "美妆护肤", 155)); // 彩妆护肤、美甲美发、仿妆、医美相关内容分享或产品测评
|
||||
zones.Add(new ZoneAttr(252, "cos", "仿妆cos", 155)); // 对二次元、三次元人物角色进行模仿、还原、展示、演绎的内容
|
||||
zones.Add(new ZoneAttr(158, "clothing", "穿搭", 155)); // 穿搭风格、穿搭技巧的展示分享,涵盖衣服、鞋靴、箱包配件、配饰(帽子、钟表、珠宝首饰)等
|
||||
zones.Add(new ZoneAttr(159, "trend", "时尚潮流", 155)); // 时尚街拍、时装周、时尚大片,时尚品牌、潮流等行业相关记录及知识科普
|
||||
|
||||
//资讯
|
||||
zones.Add(new ZoneAttr(202, "information", "资讯")); // 主分区
|
||||
zones.Add(new ZoneAttr(203, "hotspot", "热点", 202)); //全民关注的时政热门资讯
|
||||
zones.Add(new ZoneAttr(204, "global", "环球", 202)); //全球范围内发生的具有重大影响力的事件动态
|
||||
zones.Add(new ZoneAttr(205, "social", "社会", 202)); //日常生活的社会事件、社会问题、社会风貌的报道
|
||||
zones.Add(new ZoneAttr(206, "multiple", "综合", 202)); //除上述领域外其它垂直领域的综合资讯
|
||||
zones.Add(new ZoneAttr(203, "hotspot", "热点", 202)); // 全民关注的时政热门资讯
|
||||
zones.Add(new ZoneAttr(204, "global", "环球", 202)); // 全球范围内发生的具有重大影响力的事件动态
|
||||
zones.Add(new ZoneAttr(205, "social", "社会", 202)); // 日常生活的社会事件、社会问题、社会风貌的报道
|
||||
zones.Add(new ZoneAttr(206, "multiple", "综合", 202)); // 除上述领域外其它垂直领域的综合资讯
|
||||
|
||||
//娱乐
|
||||
zones.Add(new ZoneAttr(5, "ent", "娱乐")); // 主分区
|
||||
zones.Add(new ZoneAttr(71, "variety", "综艺", 5)); //所有综艺相关,全部一手掌握!
|
||||
zones.Add(new ZoneAttr(241, "talker", "娱乐杂谈", 5)); //娱乐人物解读、娱乐热点点评、娱乐行业分析
|
||||
zones.Add(new ZoneAttr(242, "fans", "粉丝创作", 5)); //粉丝向创作视频
|
||||
zones.Add(new ZoneAttr(137, "celebrity", "明星综合", 5)); //娱乐圈动态、明星资讯相关
|
||||
zones.Add(new ZoneAttr(71, "variety", "综艺", 5)); // 所有综艺相关,全部一手掌握!
|
||||
zones.Add(new ZoneAttr(241, "talker", "娱乐杂谈", 5)); // 娱乐人物解读、娱乐热点点评、娱乐行业分析
|
||||
zones.Add(new ZoneAttr(242, "fans", "粉丝创作", 5)); // 粉丝向创作视频
|
||||
zones.Add(new ZoneAttr(137, "celebrity", "明星综合", 5)); // 娱乐圈动态、明星资讯相关
|
||||
|
||||
//影视
|
||||
zones.Add(new ZoneAttr(181, "cinephile", "影视")); // 主分区
|
||||
zones.Add(new ZoneAttr(182, "cinecism", "影视杂谈", 181)); //影视评论、解说、吐槽、科普等
|
||||
zones.Add(new ZoneAttr(183, "montage", "影视剪辑", 181)); //对影视素材进行剪辑再创作的视频
|
||||
zones.Add(new ZoneAttr(85, "shortfilm", "短片", 181)); //追求自我表达且具有特色的短片
|
||||
zones.Add(new ZoneAttr(184, "trailer_info", "预告·资讯", 181)); //影视类相关资讯,预告,花絮等视频
|
||||
zones.Add(new ZoneAttr(182, "cinecism", "影视杂谈", 181)); // 影视评论、解说、吐槽、科普等
|
||||
zones.Add(new ZoneAttr(183, "montage", "影视剪辑", 181)); // 对影视素材进行剪辑再创作的视频
|
||||
zones.Add(new ZoneAttr(85, "shortfilm", "小剧场", 181)); // 有场景、有剧情的演绎类内容
|
||||
zones.Add(new ZoneAttr(184, "trailer_info", "预告·资讯", 181)); // 影视类相关资讯,预告,花絮等视频
|
||||
|
||||
//纪录片
|
||||
zones.Add(new ZoneAttr(177, "documentary", "纪录片")); // 主分区
|
||||
zones.Add(new ZoneAttr(37, "history", "人文·历史", 177)); //
|
||||
zones.Add(new ZoneAttr(178, "science", "科学·探索·自然", 177)); //
|
||||
zones.Add(new ZoneAttr(179, "military", "军事", 177)); //
|
||||
zones.Add(new ZoneAttr(180, "travel", "社会·美食·旅行", 177)); //
|
||||
zones.Add(new ZoneAttr(37, "history", "人文·历史", 177)); //
|
||||
zones.Add(new ZoneAttr(178, "science", "科学·探索·自然", 177)); //
|
||||
zones.Add(new ZoneAttr(179, "military", "军事", 177)); //
|
||||
zones.Add(new ZoneAttr(180, "travel", "社会·美食·旅行", 177)); //
|
||||
|
||||
//电影
|
||||
zones.Add(new ZoneAttr(23, "movie", "电影")); // 主分区
|
||||
zones.Add(new ZoneAttr(147, "chinese", "华语电影", 23)); //
|
||||
zones.Add(new ZoneAttr(145, "west", "欧美电影", 23)); //
|
||||
zones.Add(new ZoneAttr(146, "japan", "日本电影", 23)); //
|
||||
zones.Add(new ZoneAttr(83, "movie", "其他国家", 23)); //
|
||||
zones.Add(new ZoneAttr(147, "chinese", "华语电影", 23)); //
|
||||
zones.Add(new ZoneAttr(145, "west", "欧美电影", 23)); //
|
||||
zones.Add(new ZoneAttr(146, "japan", "日本电影", 23)); //
|
||||
zones.Add(new ZoneAttr(83, "movie", "其他国家", 23)); //
|
||||
|
||||
//电视剧
|
||||
zones.Add(new ZoneAttr(11, "tv", "电视剧")); // 主分区
|
||||
zones.Add(new ZoneAttr(185, "mainland", "国产剧", 11)); //
|
||||
zones.Add(new ZoneAttr(187, "overseas", "海外剧", 11)); //
|
||||
zones.Add(new ZoneAttr(185, "mainland", "国产剧", 11)); //
|
||||
zones.Add(new ZoneAttr(187, "overseas", "海外剧", 11)); //
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,308 +0,0 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<DrawingImage x:Key="Zone.adDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF9796ED" Geometry="F1 M1024,1024z M0,0z M576.768,153.6C609.536,121.088 708.864,167.424 798.72,257.28 888.576,347.136 935.168,446.464 902.4,479.232A27.648,27.648,0,0,1,896.256,483.84C858.624,506.624,256.256,861.44,256.256,861.44A110.592,110.592,0,0,1,207.872,830.464A140.288,140.288,0,0,1,173.312,781.312C173.312,781.312,554.496,192.512,572.672,160.512A34.56,34.56,0,0,1,576.768,153.6z" />
|
||||
<GeometryDrawing Brush="#FF9289F0" Geometry="F1 M1024,1024z M0,0z M172.288,780.032C167.424,783.36,136.96,800,121.088,808.96A18.688,18.688,0,0,0,111.36,828.416A104.192,104.192,0,0,0,142.848,886.784A117.504,117.504,0,0,0,202.24,919.808A19.2,19.2,0,0,0,222.208,911.36C232.96,894.208,254.208,860.16,255.232,860.16A110.592,110.592,0,0,1,206.848,829.184A140.288,140.288,0,0,1,172.288,780.032z" />
|
||||
<GeometryDrawing Brush="#FFF7DF88" Geometry="F1 M1024,1024z M0,0z M576.768,153.6C609.536,121.088 708.864,167.424 798.72,257.28 888.576,347.136 935.168,446.464 902.4,479.232A27.648,27.648,0,0,1,896.256,483.84C858.624,506.624 793.856,544 793.856,544 793.856,544 729.856,539.904 620.544,430.336 518.144,327.936 508.416,259.328 508.416,259.328 508.416,259.328 548.352,197.632 570.88,160.512A34.56,34.56,0,0,1,576.768,153.6z" />
|
||||
<GeometryDrawing Brush="#FF8683EA" Geometry="F1 M1024,1024z M0,0z M680.45816,374.49224A230.144,83.712,45,1,0,798.844805,256.105595A230.144,83.712,45,1,0,680.45816,374.49224z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.animalDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFB7299" Geometry="F1 M1024,1024z M0,0z M517.376,465.152A144.924444,144.924444,0,0,1,654.904889,564.366222C656.184889,568.291555,657.180445,572.216889,657.806222,576.170667A132.266667,132.266667,0,0,1,643.527111,839.936L380.472889,839.936A132.266667,132.266667,0,0,1,366.222222,576.142222C366.848,572.16,367.815111,568.234666,369.095111,564.366222A144.924444,144.924444,0,0,1,506.624,465.152L517.376,465.152z M420.693333,418.104889C470.954666,414.321778 506.311111,358.940445 499.740444,294.371556 493.141333,229.802667 447.089777,180.48 396.828444,184.263111 346.595555,188.017778 311.210666,243.427555 317.809778,307.996444 324.408889,372.565333 370.460445,421.859555 420.721778,418.076444z M603.306667,418.104889C653.539556,421.859556 699.591111,372.593778 706.190222,307.996444 712.789333,243.427555 677.404444,188.017777 627.171556,184.263111 576.910223,180.48 530.858667,229.774222 524.259556,294.343111 517.660445,358.912 553.045334,414.321778 603.278222,418.076444z M717.425778,551.139556C756.508445,572.956445 814.336,546.872889 846.563556,492.913778 878.819556,438.954667 873.272889,377.543111 834.190222,355.726222 795.079111,333.909333 737.251555,359.992889 705.024,413.952 672.768,467.911111 678.314667,529.322667 717.425778,551.139556z M306.574222,551.139556C345.685333,529.322667 351.232,467.911112 318.976,413.952 286.748444,359.992889 228.920889,333.909333 189.838222,355.726222 150.727111,377.543111 145.180444,438.954666 177.408,492.913778 209.664,546.872889 267.491556,572.956445 306.574222,551.139556z" />
|
||||
<GeometryDrawing Brush="#FFFFD7E7" Geometry="F1 M1024,1024z M0,0z M621.511111,113.777778C697.742222,112.839111 759.978667,187.790222 771.015111,287.118222 808.760889,273.806222 846.876444,274.204444 878.307556,291.441778 949.020445,330.211556 959.061334,439.409778 900.750222,535.352889A272.327111,272.327111,0,0,1,829.639111,613.688889C838.798222,636.558222,843.861333,661.532445,843.861333,687.672889L843.861333,711.111111A199.111111,199.111111,0,0,1,644.750222,910.222222L379.249778,910.222222A199.111111,199.111111,0,0,1,180.138667,711.111111L180.138667,687.672889C180.138667,661.504,185.201778,636.558222,194.360889,613.660444A272.099556,272.099556,0,0,1,123.249778,535.352889C64.9386670000001,439.409778 74.9795560000001,330.211556 145.692444,291.441778 177.123555,274.204445 215.239111,273.806222 253.013333,287.089778 264.021333,187.790222 326.257778,112.839111 402.488889,113.777778 444.899556,114.318222 483.640889,138.24 512,176.554667 540.359111,138.268445 579.100444,114.318223 621.511111,113.777778z" />
|
||||
<GeometryDrawing Brush="#FFFB7299" Geometry="F1 M1024,1024z M0,0z M512,465.152A141.198222,141.198222,0,0,1,646.741333,564.110222L646.826667,564.366222C648.732445,570.453333,649.841778,576.597333,650.183111,582.656A132.266667,132.266667,0,0,1,640.455111,846.819556L383.544889,846.819556A132.266667,132.266667,0,0,1,373.873778,582.627556L373.674667,587.207111C373.674667,579.470222,374.869334,571.761778,377.173333,564.366222L377.258667,564.081778A141.198222,141.198222,0,0,1,512,465.180444z M420.693333,418.104889C470.954666,414.321778 506.311111,358.940445 499.740444,294.371556 493.141333,229.802667 447.089777,180.48 396.828444,184.263111 346.595555,188.017778 311.210666,243.427555 317.809778,307.996444 324.408889,372.565333 370.460445,421.859555 420.721778,418.076444z M603.306667,418.104889C653.539556,421.859556 699.591111,372.593778 706.190222,307.996444 712.789333,243.427555 677.404444,188.017777 627.171556,184.263111 576.910223,180.48 530.858667,229.774222 524.259556,294.343111 517.660445,358.912 553.045334,414.321778 603.278222,418.076444z M717.425778,551.139556C756.508445,572.956445 814.336,546.872889 846.563556,492.913778 878.819556,438.954667 873.272889,377.543111 834.190222,355.726222 795.079111,333.909333 737.251555,359.992889 705.024,413.952 672.768,467.911111 678.314667,529.322667 717.425778,551.139556z M306.574222,551.139556C345.685333,529.322667 351.232,467.911112 318.976,413.952 286.748444,359.992889 228.920889,333.909333 189.838222,355.726222 150.727111,377.543111 145.180444,438.954666 177.408,492.913778 209.664,546.872889 267.491556,572.956445 306.574222,551.139556z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.animeDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFB813A" Geometry="F1 M1024,1024z M0,0z M588.8,359.68L576.768,352.256 727.04,145.664A30.976,30.976,0,0,0,675.84,109.312L522.24,319.488 281.6,170.24A30.976,30.976,0,1,0,248.576,222.976L486.4,369.92 463.616,401.408A30.976,30.976,0,1,0,514.816,437.76L540.416,402.688 556.544,412.416A30.976,30.976,0,1,0,588.8,359.68z" />
|
||||
<GeometryDrawing Brush="#FFFB813A" Geometry="F1 M1024,1024z M0,0z M763.648,850.688 M710.4,850.688A53.248,53.248,0,1,0,816.896,850.688A53.248,53.248,0,1,0,710.4,850.688z" />
|
||||
<GeometryDrawing Brush="#FFFB813A" Geometry="F1 M1024,1024z M0,0z M261.12,797.44A53.248,53.248,0,1,0,314.624,850.688A53.248,53.248,0,0,0,261.12,797.44z" />
|
||||
<GeometryDrawing Brush="#FFFDDE80" Geometry="F1 M1024,1024z M0,0z M141.312,314.368 M234.24,314.368L790.528,314.368Q883.456,314.368,883.456,407.296L883.456,768Q883.456,860.928,790.528,860.928L234.24,860.928Q141.312,860.928,141.312,768L141.312,407.296Q141.312,314.368,234.24,314.368z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M1024,1024z M0,0z M520.448,575.232 M392.192,575.232A128.256,128.256,0,1,0,648.704,575.232A128.256,128.256,0,1,0,392.192,575.232z" />
|
||||
<GeometryDrawing Brush="#FFFB813A" Geometry="F1 M1024,1024z M0,0z M476.928,546.56C476.928,519.68,496.128,508.928,519.168,520.96L568.832,549.632A25.6,25.6,0,0,1,568.832,598.272L519.168,626.944C496.128,640.512,476.928,629.504,476.928,602.624z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.carDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF23ADE5" Geometry="F1 M210.688,588.8L236.288,588.8A51.2,51.2,0,0,1,287.488,634.368L301.568,762.368A51.2,51.2,0,0,1,256,819.2L225.024,819.2A51.2,51.2,0,0,1,173.824,773.632L159.744,645.632A51.2,51.2,0,0,1,204.8,588.8z M788.224,588.8L813.824,588.8A51.2,51.2,0,0,1,865.024,640A41.984,41.984,0,0,1,865.024,645.632L850.944,773.632A51.2,51.2,0,0,1,799.744,819.2L774.144,819.2A51.2,51.2,0,0,1,722.944,768A41.984,41.984,0,0,1,722.944,762.368L737.024,634.368A51.2,51.2,0,0,1,788.224,588.8z M906.496,392.96A38.656,38.656,0,0,1,880.896,441.088L855.296,448.512A38.4,38.4,0,0,1,832.768,375.04L858.368,367.616A38.144,38.144,0,0,1,906.496,392.96z M215.296,422.912A38.4,38.4,0,0,1,167.424,448.512L141.824,441.088A38.656,38.656,0,0,1,116.224,392.96A38.144,38.144,0,0,1,164.096,367.36L189.696,374.784A38.4,38.4,0,0,1,215.296,422.912z" />
|
||||
<GeometryDrawing Brush="#FF48CFE5" Geometry="F1 M292.608,201.216A1109.76,1109.76,0,0,1,512,179.2A1165.568,1165.568,0,0,1,736,201.216A51.2,51.2,0,0,1,774.144,233.216L870.4,486.4 870.4,716.8A25.6,25.6,0,0,1,844.8,742.4L179.2,742.4A25.6,25.6,0,0,1,153.6,716.8L153.6,486.4 256,232.704A51.2,51.2,0,0,1,292.608,201.216z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M204.8,512 M230.4,512L332.8,512Q358.4,512,358.4,537.6L358.4,563.2Q358.4,588.8,332.8,588.8L230.4,588.8Q204.8,588.8,204.8,563.2L204.8,537.6Q204.8,512,230.4,512z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M665.6,512 M691.2,512L793.6,512Q819.2,512,819.2,537.6L819.2,563.2Q819.2,588.8,793.6,588.8L691.2,588.8Q665.6,588.8,665.6,563.2L665.6,537.6Q665.6,512,691.2,512z" />
|
||||
<GeometryDrawing Brush="#FFFDDE80" Geometry="F1 M327.68,270.848A1000.96,1000.96,0,0,1,499.712,256A1429.248,1429.248,0,0,1,696.576,271.36A25.6,25.6,0,0,1,717.568,289.536L757.248,424.192A25.6,25.6,0,0,1,739.84,455.936A24.064,24.064,0,0,1,730.368,455.936Q605.184,443.904,499.968,443.904A1894.4,1894.4,0,0,0,295.168,455.168A25.6,25.6,0,0,1,267.008,432.384A25.6,25.6,0,0,1,267.008,422.4L307.2,288.768A25.6,25.6,0,0,1,327.68,270.848z" />
|
||||
<GeometryDrawing Brush="#FF23ADE5" Geometry="F1 M614.4,358.4A102.4,102.4,0,0,0,513.536,445.184L564.736,445.184A51.2,51.2,0,0,1,663.808,450.304L715.008,454.656A102.4,102.4,0,0,0,614.4,358.4z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.cheeseDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V128 H128 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFBC92A" Geometry="F1 M128,128z M0,0z M105.8,0C109.2,0 112.3,0.9 115.2,2.6 118.1,4.3 120.3,6.6 122,9.5 123.7,12.4 124.5,15.5 124.5,19L124.5,108.9C124.5,112.4 123.7,115.6 122,118.4 120.3,121.3 118,123.6 115.2,125.3 112.4,127 109.2,127.9 105.8,127.9L61.6,127.9C61.6,126.6 60.6,125.4 58.7,124.4 56.8,123.4 54.5,122.9 51.9,122.9 49.3,122.9 47,123.4 45.1,124.4 43.2,125.4 42.2,126.6 42.2,127.9L22.2,127.9C18.8,127.9 15.7,127 12.8,125.3 9.9,123.6 7.7,121.3 6,118.4 4.3,115.5 3.5,112.4 3.5,108.9L3.5,19.1C3.6,15.6 4.5,12.4 6.1,9.6 7.7,6.8 10,4.4 12.8,2.7 15.7,1 18.8,0.100000000000001 22.2,0.100000000000001L105.8,0.100000000000001 105.8,0z" />
|
||||
<GeometryDrawing Brush="#FFFFEA85" Geometry="F1 M128,128z M0,0z M105.8,0C109.2,0 112.3,0.9 115.2,2.6 118.1,4.3 120.3,6.6 122,9.5 123.7,12.4 124.5,15.5 124.5,19L124.5,54.2C120.2,54.7 116.7,55.5 114,56.9 111.3,58.3 110,59.8 110,61.5 110,63.2 111.3,64.7 114,66.1 116.7,67.4 120.2,68.3 124.5,68.6L124.5,74.5C124.5,78 123.7,81.2 122,84 120.3,86.9 118,89.1 115.2,90.8 112.4,92.5 109.2,93.3 105.8,93.3L22.2,93.3C18.8,93.3 15.7,92.5 12.8,90.8 9.9,89.1 7.7,86.8 6,84 4.3,81.1 3.5,78 3.5,74.5L3.5,19.1C3.6,15.6 4.5,12.4 6.1,9.6 7.7,6.8 10,4.4 12.8,2.7 15.7,1 18.8,0.100000000000001 22.2,0.100000000000001L105.8,0 105.8,0z" />
|
||||
<GeometryDrawing Brush="#FFFBC92A" Geometry="F1 M128,128z M0,0z M32.6,93.4C32.6,95.2 33.4,96.9 35.1,98.4 36.8,99.9 39.1,101.1 42.1,102 45.1,102.9 48.3,103.3 51.9,103.3 55.4,103.3 58.7,102.9 61.6,102 64.5,101.1 66.9,99.9 68.6,98.4 70.3,96.9 71.2,95.3 71.2,93.5 71.2,91.8 70.3,90.1 68.6,88.6 66.9,87.1 64.5,85.9 61.6,85 58.7,84.1 55.4,83.7 51.9,83.7 48.4,83.7 45.1,84.1 42.1,85 39.1,85.9 36.8,87.1 35.1,88.6 33.5,90.1 32.6,91.7 32.6,93.4L32.6,93.4z" />
|
||||
<GeometryDrawing Brush="#FFF4B828" Geometry="F1 M128,128z M0,0z M18.1,113.2C18.1,115.2 18.8,116.9 20.2,118.3 21.6,119.6 23.3,120.3 25.3,120.3 27.3,120.3 29,119.6 30.4,118.3 31.9,117 32.6,115.3 32.6,113.3 32.6,111.3 31.9,109.6 30.4,108.2 28.9,106.8 27.2,106.1 25.3,106.1 23.4,106.1 21.6,106.8 20.2,108.2 18.8,109.6 18.1,111.2 18.1,113.2L18.1,113.2z" />
|
||||
<GeometryDrawing Brush="#FFF4B828" Geometry="F1 M128,128z M0,0z M56.7,113.2C56.7,115.2 57.9,116.9 60.2,118.3 62.5,119.7 65.4,120.3 68.7,120.3 72,120.3 74.9,119.6 77.3,118.3 79.7,117 80.9,115.3 80.9,113.3 80.9,111.3 79.7,109.6 77.3,108.2 74.9,106.8 72,106.1 68.7,106.1 65.4,106.1 62.5,106.8 60.2,108.2 57.9,109.6 56.7,111.2 56.7,113.2L56.7,113.2z" />
|
||||
<GeometryDrawing Brush="#FFF0BF4C" Geometry="F1 M128,128z M0,0z M87.9,58.2C88.8,57.3 89.9,56.9 91.2,56.9 92.5,57 93.6,57.5 94.4,58.4 95.2,59.3 95.7,60.5 95.7,61.8 95.7,63.1 95.2,64.2 94.2,65.1 89.1,70 83.2,73.4 76.5,75.1 69.8,76.8 63,76.8 56.3,75.1 49.6,73.4 43.6,70 38.4,65.1 37.5,64.2 37,63.1 37,61.8 36.9,60.5 37.4,59.4 38.3,58.4 39.2,57.4 40.3,56.9 41.6,56.9 42.9,56.8 44,57.3 44.9,58.2 48.8,62 53.4,64.6 58.6,66 63.8,67.3 69,67.3 74.2,66 79.4,64.7 83.9,62 87.9,58.2L87.9,58.2z" />
|
||||
<GeometryDrawing Brush="#FFF0BF4C" Geometry="F1 M128,128z M0,0z M98.1,23.8L98.9,23.8C100.8,23.8 102.5,24.5 103.9,25.9 105.3,27.3 106,29 105.8,30.9L105.8,40.3C105.8,42.3 105.1,44 103.8,45.4 102.5,46.8 100.8,47.5 98.9,47.5L98.1,47.5C96.1,47.4 94.4,46.7 93,45.3 91.6,43.9 91,42.3 91,40.2L91,30.8C91,28.9 91.7,27.2 93.1,25.8 94.5,24.5 96.2,23.8 98.1,23.8z" />
|
||||
<GeometryDrawing Brush="#FFF0BF4C" Geometry="F1 M128,128z M0,0z M33.8,23.8L34.6,23.8C36.5,23.8 38.2,24.5 39.6,25.9 41,27.3 41.7,29 41.5,30.9L41.5,40.3C41.5,42.3 40.8,44 39.5,45.4 38.2,46.8 36.5,47.5 34.6,47.5L33.8,47.5C31.8,47.4 30.1,46.7 28.7,45.3 27.4,44 26.7,42.3 26.7,40.2L26.7,30.8C26.7,28.9 27.4,27.2 28.8,25.8 30.2,24.5 31.9,23.8 33.8,23.8z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.cinephileDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF9796ED" Geometry="F1 M1024,1024z M0,0z M147.2,201.728 M226.816,201.728L797.952,201.728Q877.568,201.728,877.568,281.344L877.568,739.584Q877.568,819.2,797.952,819.2L226.816,819.2Q147.2,819.2,147.2,739.584L147.2,281.344Q147.2,201.728,226.816,201.728z" />
|
||||
<GeometryDrawing Brush="#FF7B78EA" Geometry="F1 M1024,1024z M0,0z M222.976,269.312L300.032,269.312 300.032,327.168 222.976,327.168z M390.144,269.312L467.2,269.312 467.2,327.168 390.144,327.168z M557.312,269.312L634.368,269.312 634.368,327.168 557.312,327.168z M724.48,269.312L801.536,269.312 801.536,327.168 724.48,327.168z M222.976,693.76L300.032,693.76 300.032,751.616 222.976,751.616z M390.144,693.76L467.2,693.76 467.2,751.616 390.144,751.616z M557.312,693.76L634.368,693.76 634.368,751.616 557.312,751.616z M147.2,375.296L877.568,375.296 877.568,645.376 147.2,645.376z" />
|
||||
<GeometryDrawing Brush="#FFFFD043" Geometry="F1 M1024,1024z M0,0z M521.369822,529.707066 M544.721316,506.355571L547.255587,503.821301Q570.607081,480.469807,593.958576,503.821301L793.622903,703.485628Q816.974397,726.837122,793.622903,750.188617L791.088632,752.722888Q767.737138,776.074382,744.385644,752.722888L544.721316,553.05856Q521.369822,529.707066,544.721316,506.355571z" />
|
||||
<GeometryDrawing Brush="#FFFFD778" Geometry="F1 M1024,1024z M0,0z M708.352,418.816L682.752,418.816 682.752,394.496A13.568,13.568,0,0,0,669.184,380.928L665.6,380.928A13.312,13.312,0,0,0,652.288,394.496L652.288,418.816 626.688,418.816A13.568,13.568,0,0,0,613.12,432.384L613.12,438.016A13.568,13.568,0,0,0,626.688,451.584L652.288,451.584 652.288,475.904A13.312,13.312,0,0,0,665.6,489.472L671.232,489.472A13.568,13.568,0,0,0,684.8,475.904L684.8,451.584 710.4,451.584A13.312,13.312,0,0,0,723.712,438.016L723.712,432.384A13.312,13.312,0,0,0,708.352,418.816z M517.888,418.816L492.288,418.816 492.288,394.496A13.312,13.312,0,0,0,478.976,380.928L473.344,380.928A13.568,13.568,0,0,0,459.776,394.496L459.776,418.816 435.2,418.816A13.312,13.312,0,0,0,421.888,432.384L421.888,438.016A13.312,13.312,0,0,0,435.2,451.584L460.8,451.584 460.8,475.904A13.568,13.568,0,0,0,474.368,489.472L480,489.472A13.312,13.312,0,0,0,493.312,475.904L493.312,451.584 518.912,451.584A13.312,13.312,0,0,0,532.224,438.016L532.224,432.384A13.312,13.312,0,0,0,517.888,418.816z M493.568,572.16L475.136,572.16 475.136,553.728A10.24,10.24,0,0,0,464.896,543.488L460.8,543.488A10.24,10.24,0,0,0,450.56,553.728L450.56,572.16 432.128,572.16A10.24,10.24,0,0,0,421.888,582.4L421.888,586.752A10.24,10.24,0,0,0,432.128,596.992L450.56,596.992 450.56,614.4A10.24,10.24,0,0,0,460.8,624.64L465.152,624.64A10.24,10.24,0,0,0,475.392,614.4L475.392,595.968 493.824,595.968A10.24,10.24,0,0,0,504.064,585.728L504.064,581.376A10.24,10.24,0,0,0,493.568,572.16z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.comicDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFDDE80" Geometry="F1 M1024,1024z M0,0z M722.204444,843.491556L170.524444,843.491556A70.144,70.144,0,0,1,100.551111,773.575111L100.551111,400.896A70.144,70.144,0,0,1,170.524444,330.951111L722.204444,330.951111A70.144,70.144,0,0,1,792.120889,400.924444L792.120889,773.546667A70.144,70.144,0,0,1,722.204444,843.491556" />
|
||||
<GeometryDrawing Brush="#FF9796ED" Geometry="F1 M1024,1024z M0,0z M710.314667,341.703111C732.928,334.364444,748.515556,312.604444,746.382222,288.910222A143.616,143.616,0,0,0,739.84,256.768C700.359111,135.139556 510.72,87.722667 316.273778,150.869333 121.799111,214.016 -3.783111,363.804444 35.697778,485.461333 39.111111,495.985777 43.690667,505.912889 49.294222,515.271111 61.525333,535.694222 86.897778,544.142222 109.511111,536.803556L710.314667,341.703111z" />
|
||||
<GeometryDrawing Brush="#FF7B78EB" Geometry="F1 M1024,1024z M0,0z M281.031111,123.676444L292.266667,158.293333C297.244445,173.624889 313.884445,182.072889 329.187556,177.095111 344.519112,172.117333 352.995556,155.505778 348.017778,140.174222L336.782222,105.585778A29.383111,29.383111,0,0,0,299.861333,86.784C284.501333,91.733333,276.053333,108.373333,281.031111,123.676444" />
|
||||
<GeometryDrawing Brush="#FFFFAF66" Geometry="F1 M1024,1024z M0,0z M444.16,714.069333A139.747556,139.747556,0,0,0,582.456889,594.517333A17.493333,17.493333,0,0,0,565.333333,574.321778L322.986667,574.321778A17.493333,17.493333,0,0,0,305.863111,594.517333A139.776,139.776,0,0,0,444.16,714.069333" />
|
||||
<GeometryDrawing Brush="#FF9796ED" Geometry="F1 M1024,1024z M0,0z M704.796444,680.903111L618.951111,640.284444C618.951111,640.284444 631.239111,696.035555 690.346667,732.956444 690.261334,733.696 690.062223,734.378666 689.976889,735.146667 677.262222,829.696 728.177778,914.545778 803.669333,924.700444 879.160889,934.826666 950.641777,866.389333 963.356444,771.84 976.042666,677.319111 925.155555,592.440889 849.635556,582.314667 789.617778,574.236445 732.216889,615.964445 704.796444,680.903111z" />
|
||||
<GeometryDrawing Brush="#FFC5C2FF" Geometry="F1 M1024,1024z M0,0z M856.064,682.012444L836.266667,781.169778A6.570667,6.570667,0,0,1,829.809778,786.460444L812.032,786.460444A6.599111,6.599111,0,0,1,805.489778,778.922667L819.968,679.793778A6.542222,6.542222,0,0,1,826.453333,674.133333L849.607111,674.133333C853.788444,674.133333,856.888889,677.944889,856.064,682.012444 M833.166222,818.090667L830.179556,834.389333A6.570667,6.570667,0,0,1,823.722667,839.793778L802.759111,839.793778A6.599111,6.599111,0,0,1,796.273778,832.142222L798.919111,815.872A6.599111,6.599111,0,0,1,805.404444,810.325333L826.680889,810.325333C830.805333,810.325333,833.934222,814.051555,833.166222,818.090667" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.danceDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFC6B8A" Geometry="F1 M1024,1024z M0,0z M956.672,513.792A476.416,476.416,0,0,0,66.304,513.792L512,727.296 416.768,772.864A117.76,117.76,0,0,0,609.024,772.864L512,727.04z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M1024,1024z M0,0z M512,727.296L720.64,627.456A222.976,222.976,0,0,0,303.872,627.456z" />
|
||||
<GeometryDrawing Brush="#FFFF5C7A" Geometry="F1 M1024,1024z M0,0z M405.4528,751.5392L946.6368,492.9536 960.6656,522.2656 419.4816,780.8768z" />
|
||||
<GeometryDrawing Brush="#FFF14767" Geometry="F1 M1024,1024z M0,0z M666.624,545.792L647.936,530.432 535.296,665.856 575.488,492.8 551.936,487.168 511.744,659.712 471.296,487.168 447.488,492.8 488.192,665.856 375.296,530.432 356.608,545.792 468.224,679.936 76.544,493.056 62.72,522.24 603.904,780.8 617.984,751.36 530.432,709.632 666.624,545.792z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.digitalDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFFBA7B" Geometry="F1 M1024,1024z M0,0z M298.496,284.928L316.16,233.728A36.608,36.608,0,0,1,349.44,211.712L674.816,211.712A37.12,37.12,0,0,1,709.12,233.728L726.528,284.928 815.104,284.928A69.376,69.376,0,0,1,881.664,355.584L881.664,732.928A69.12,69.12,0,0,1,813.824,803.072L209.92,803.072A69.12,69.12,0,0,1,141.568,732.928L141.568,355.584A69.376,69.376,0,0,1,209.92,284.928z" />
|
||||
<GeometryDrawing Brush="#FFFB952C" Geometry="F1 M1024,1024z M0,0z M141.568,457.728L881.664,457.728 881.664,729.088A69.632,69.632,0,0,1,807.936,803.072L210.688,803.072A69.12,69.12,0,0,1,141.568,733.696z" />
|
||||
<GeometryDrawing Brush="#FFFB952C" Geometry="F1 M1024,1024z M0,0z M512,358.4A197.376,197.376,0,1,1,314.624,555.776A197.632,197.632,0,0,1,512,358.4z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M1024,1024z M0,0z M512,409.6A148.224,148.224,0,1,1,364.032,557.568A147.968,147.968,0,0,1,512,409.6z" />
|
||||
<GeometryDrawing Brush="#FFFB952C" Geometry="F1 M1024,1024z M0,0z M512,457.728A98.816,98.816,0,1,1,413.44,556.288A98.56,98.56,0,0,1,512,457.728z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M1024,1024z M0,0z M733.696,358.4L807.68,358.4A25.6,25.6,0,0,1,833.28,384A25.6,25.6,0,0,1,807.68,409.6L733.696,409.6A25.6,25.6,0,0,1,708.096,384A25.6,25.6,0,0,1,733.696,358.4z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.documentaryDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF47CFE5" Geometry="F1 M1024,1024z M0,0z M404.9,386.765C334.0025,384.2 261.5525,398.825 208.25,424.9475 159.4025,448.91 90.62,514.4075 86.3225,560.51L821.645,560.51C818.4275,560.51 809.63,551.0825 806.9075,548.99 801.89,545.165 797.165,541.1825 792.1475,537.4475 780.245,528.5375 767.4875,520.55 755,512.4725A1040.175,1040.175,0,0,0,677.9375,466.8875C625.4675,438.9425,570.0725,416.0825,512.2475,401.885A533.88,533.88,0,0,0,404.9,386.765" />
|
||||
<GeometryDrawing Brush="#FF47CFE5" Geometry="F1 M1024,1024z M0,0z M744.605,489.1625C731.8925,521.4725,607.895,525.9275,563.21,525.9275L137.8025,525.9275C122.57,525.9275 108.035,531.125 98.045,540.1925 88.145,549.17 83.9375,560.96 86.345,572.5475 86.345,572.66 86.345,572.8175 86.435,572.885 95.7275,616.5575 122.165,656.225 162.8,687.5675 164.42,688.8275 166.0625,690.0875 167.7275,691.3025 274.4675,769.76 460.25,772.46 591.1775,735.1775 632.6225,723.3875 672.0425,707.0075 706.355,685.5425 745.3475,661.1525 785.15,628.235 808.6625,593.81 812.1275,588.7475 849.8825,532.6325 850.625,532.925L744.605,489.1625z" />
|
||||
<GeometryDrawing Brush="#FF2BBAE4" Geometry="F1 M1024,1024z M0,0z M918.0575,505.3175L888.1775,488.24A75.0825,75.0825,0,0,0,818.0675,486.1025A75.375,75.375,0,0,0,780.65,426.7475L750.725,409.67A11.4525,11.4525,0,0,0,735.065,413.945L727.235,427.6475A59.0625,59.0625,0,0,0,749.195,508.22L764.99,517.265A0.045,0.045,0,0,1,764.945,517.31L816.425,546.74 816.47,546.695 833.93,556.685A59.085,59.085,0,0,0,914.5025,534.7475L922.3325,521.0225A11.5425,11.5425,0,0,0,918.0575,505.3175" />
|
||||
<GeometryDrawing Brush="#FFE5E6E6" Geometry="F1 M1024,1024z M0,0z M654.515,712.4975C351.3275,720.8675,266.3,564.425,266.3,564.425L85.7825,564.425A31.995,31.995,0,0,0,86.4125,572.885C95.705,616.5575 122.1425,656.225 162.7775,687.5675 164.3975,688.85 166.04,690.0875 167.705,691.3025 274.4225,769.76 460.205,772.4825 591.1325,735.1775A509.6925,509.6925,0,0,0,654.515,712.4975" />
|
||||
<GeometryDrawing Brush="#FFE4E5E4" Geometry="F1 M1024,1024z M0,0z M654.515,712.4975C589.355,714.2975 534.365,708.0875 487.9475,698.255 438.9425,687.8825 461.78,757.565 484.73,755.045 522.215,750.9725 558.395,744.4475 591.1325,735.1325A502.3575,502.3575,0,0,0,654.515,712.4975" />
|
||||
<GeometryDrawing Brush="#FF47CFE5" Geometry="F1 M1024,1024z M0,0z M407.1275,674.9225C428.705,744.7625 476.8325,792.575 523.9025,788.57 527.6375,788.2325 530.135,784.4975 529.415,780.83L504.98,655.2125A5.715,5.715,0,0,0,498.2975,650.7125L411.5825,667.61A5.7825,5.7825,0,0,0,407.1275,674.9225" />
|
||||
<GeometryDrawing Brush="#FF0099BC" Geometry="F1 M1024,1024z M0,0z M441.2375,614.7125A29.295,29.295,0,1,1,382.625,614.735A29.295,29.295,0,0,1,441.2375,614.7125" />
|
||||
<GeometryDrawing Brush="#FF47CFE5" Geometry="F1 M1024,1024z M0,0z M252.5975,310.4675A64.2825,64.2825,0,0,1,316.9025,246.365C335.7125,246.365,352.6325,254.4875,364.4225,267.4925A64.17,64.17,0,0,1,476.135,310.4675A16.56,16.56,0,0,1,459.5525,327.05A16.56,16.56,0,0,1,442.9475,310.4675A31.05,31.05,0,0,0,380.96,308.3075L380.78,308.3075 380.8925,385.775A16.5825,16.5825,0,1,1,347.705,385.775L347.705,310.3775C347.705,293.345,333.7775,279.44,316.745,279.44A31.05,31.05,0,0,0,285.7175,310.4675A16.56,16.56,0,1,1,252.5975,310.4675" />
|
||||
<GeometryDrawing Brush="#FF47CFE5" Geometry="F1 M1024,1024z M0,0z M364.3325,408.0275A22.2525,22.2525,0,0,1,342.125,385.7975L342.125,310.4A25.3575,25.3575,0,1,0,291.41,310.49A22.23,22.23,0,0,1,246.995,310.49C246.995,272.0375,278.36,240.74,316.9025,240.74A69.75,69.75,0,0,1,364.4225,259.505A70.2,70.2,0,0,1,412.0325,240.74C450.485,240.74,481.7825,272.0375,481.7825,310.49A22.23,22.23,0,0,1,437.345,310.49A25.425,25.425,0,0,0,386.6075,308.7125L386.45,311.0975 386.54,385.7975A22.2525,22.2525,0,0,1,364.3325,408.0275z M316.79,273.8375C336.95,273.8375,353.3525,290.24,353.3525,310.4L353.3525,385.82A10.98,10.98,0,1,0,375.2675,385.82L375.1775,302.7275 376.1,302.7275A36.7425,36.7425,0,0,1,411.92,273.86C432.125,273.86,448.5725,290.3075,448.5725,310.5125A10.98,10.98,0,0,0,470.51,310.5125C470.51,278.2475 444.275,252.0125 412.01,252.0125 395.5625,252.0125 379.7225,259.0325 368.5625,271.3175L364.4,275.8625 360.2375,271.25A58.635,58.635,0,0,0,316.9025,251.9675A58.635,58.635,0,0,0,258.245,310.4675A10.9575,10.9575,0,0,0,280.16,310.4675A36.675,36.675,0,0,1,316.79,273.8375z" />
|
||||
<GeometryDrawing Brush="#FF0099BC" Geometry="F1 M1024,1024z M0,0z M389.87,621.2825L323.54,621.2825A47.79,47.79,0,0,1,288.5075,605.69L264.7925,579.995A28.575,28.575,0,0,0,243.9125,570.7025L91.0475,570.7025A6.525,6.525,0,1,1,91.0475,557.6075L243.935,557.6075C255.3875,557.6075,266.5025,562.535,274.4225,571.13L298.1375,596.8475C304.7975,604.0475,314.0675,608.1875,323.5625,608.1875L389.8925,608.1875A6.525,6.525,0,1,1,389.87,621.2825" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.dougaDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF7B78EB" Geometry="F1 M1024,1024z M0,0z M273.408,166.912L751.104,166.912C809.472,166.912,857.088,214.528,857.088,272.896L857.088,750.592C857.088,808.96,809.472,856.576,751.104,856.576L273.408,856.576C215.04,856.576,167.424,808.96,167.424,750.592L167.424,273.408C166.912,215.04,215.04,166.912,273.408,166.912z" />
|
||||
<GeometryDrawing Brush="#FF9796ED" Geometry="F1 M1024,1024z M0,0z M512,525.312L512,624.128C545.28,609.28 584.704,624.64 599.552,657.92 614.4,691.2 599.04,730.624 565.76,745.472 548.864,753.152 529.92,753.152 512.512,745.472L512.512,857.088 273.408,857.088C215.04,857.088,167.424,809.472,167.424,751.104L167.424,512 304.64,512C283.136,531.456 280.576,565.248 300.032,586.752 319.488,608.256 353.28,610.816 374.784,591.36 396.288,572.416 398.848,538.112 379.392,516.608L374.784,512 512,512 512,471.04C507.904,471.552 502.784,471.552 498.688,471.04 447.488,471.04 412.672,423.424 412.672,365.056 412.672,306.688 433.664,257.024 498.688,257.024L512,257.024 512,166.912 750.592,166.912C808.96,166.912,856.576,214.528,856.576,272.896L856.576,524.8 735.744,524.8C756.736,501.248 755.2,465.408 732.16,443.904 708.608,422.912 672.768,424.448 651.264,447.488 631.296,468.992 631.296,502.784 651.264,524.288L512,524.288z" />
|
||||
<GeometryDrawing Brush="#FF6A68C6" Geometry="F1 M1024,1024z M0,0z M512,525.312L512,624.128 525.312,620.032C561.152,612.352 598.016,635.904 605.184,672.256 612.864,708.096 586.752,744.448 550.912,751.104 546.816,752.128 542.208,752.128 537.6,752.128 528.384,752.128 521.216,749.056 512.512,745.984L512.512,857.6 498.176,857.6 498.176,724.992 516.608,733.184C543.744,744.96 574.976,732.672 586.752,705.536 598.528,678.4 586.24,647.168 559.104,635.392 545.792,629.76 530.432,629.76 516.608,635.392L498.176,643.584 498.176,525.824 399.872,525.824C414.72,559.104 399.36,598.528 366.08,613.376 332.8,628.224 293.376,612.864 278.528,579.584 270.848,562.688 270.848,543.744 278.528,526.336L166.912,526.336 166.912,512 304.128,512C282.624,531.456 280.064,565.248 299.52,586.752 318.976,608.256 352.768,610.816 374.272,591.36 395.776,571.904 398.336,538.112 378.88,516.608L374.272,512 512,512 512,472.064 498.688,472.064C447.488,472.064 412.672,424.96 412.672,366.08 412.672,307.2 433.664,256.512 498.688,256.512L512,256.512 512,166.912 525.312,166.912 525.312,272.896 498.688,272.896C449.024,272.896 425.472,306.176 425.472,367.104 425.472,420.352 456.192,459.776 498.688,459.776 502.272,460.288 506.368,460.288 509.952,459.776L525.312,457.728 525.312,512 628.224,512C614.4,476.16 632.32,435.2 668.672,421.376 704.512,407.552 745.472,425.472 759.296,461.824 765.44,477.696 765.44,495.616 759.296,512L857.088,512 857.088,525.312 736.256,525.312C757.248,501.76 755.712,465.92 732.672,444.416 709.12,423.424 673.28,424.96 651.776,448 631.808,469.504 631.808,503.296 651.776,524.8L512,524.8z" />
|
||||
<GeometryDrawing Brush="#FFFDDE80" Geometry="F1 M1024,1024z M0,0z M444.928,693.248C421.888,706.56 392.704,698.368 379.904,675.84 375.808,668.16 373.76,660.48 373.76,651.776L373.76,392.192C373.76,365.568 394.752,344.576 421.376,344.576 430.08,344.576 438.272,346.624 445.952,351.232L667.648,483.84C690.688,497.152 697.856,526.336 684.544,548.864 680.448,555.52 674.304,561.664 667.648,565.76" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.entDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFF8693" Geometry="F1 M1024,1024z M0,0z M534.442796,378.982175 M570.646663,415.186042L601.238931,445.77831Q637.442798,481.982177,601.238931,518.186044L240.648413,878.776562Q204.444546,914.980429,168.240679,878.776562L137.648411,848.184294Q101.444544,811.980427,137.648411,775.776559L498.238929,415.186042Q534.442796,378.982175,570.646663,415.186042z" />
|
||||
<GeometryDrawing Brush="#FFFC6376" Geometry="F1 M1024,1024z M0,0z M369.92,543.744L507.392,406.272A38.912,38.912,0,0,1,561.92,406.272L610.304,454.912A38.4,38.4,0,0,1,610.304,509.44L472.32,647.424z" />
|
||||
<GeometryDrawing Brush="#FFFFA9B1" Geometry="F1 M1024,1024z M0,0z M286.133941,631.021801 M298.988557,643.871931L371.589979,716.448014Q384.444595,729.298143,371.594465,742.15276L369.965575,743.782218Q357.115446,756.636834,344.26083,743.786704L271.659408,671.210621Q258.804792,658.360492,271.654922,645.505876L273.283812,643.876417Q286.133941,631.021801,298.988557,643.871931z" />
|
||||
<GeometryDrawing Brush="#FFFDDE80" Geometry="F1 M1024,1024z M0,0z M737.024,547.584A99.328,99.328,0,0,1,799.744,484.864L850.944,471.296A27.136,27.136,0,0,0,864,421.632L826.624,384A98.816,98.816,0,0,1,803.84,298.24L820.736,235.008C827.904,207.872,811.776,191.488,784.64,198.912L721.408,215.808A98.816,98.816,0,0,1,635.648,192.768L598.272,155.904A27.136,27.136,0,0,0,548.864,169.216L535.04,220.416A97.792,97.792,0,0,1,472.576,283.136L421.376,296.96A27.136,27.136,0,0,0,408.064,346.368L445.44,384A97.536,97.536,0,0,1,468.48,469.504L451.584,532.736C444.16,560.128,460.544,576.256,487.68,569.088L550.912,552.192A97.792,97.792,0,0,1,636.672,574.976L674.048,612.352A26.88,26.88,0,0,0,723.456,599.04z" />
|
||||
<GeometryDrawing Brush="#FFFCC029" Geometry="F1 M1024,1024z M0,0z M886.272,417.536L811.52,342.528 841.984,228.096A41.216,41.216,0,0,0,833.28,186.624A41.728,41.728,0,0,0,791.808,179.2L677.376,209.92 602.624,133.888A41.728,41.728,0,0,0,563.2,120.576A41.216,41.216,0,0,0,534.784,152.064L507.392,254.464 404.48,281.6A42.24,42.24,0,0,0,372.736,309.76A42.24,42.24,0,0,0,386.048,350.208L460.8,425.216 430.08,539.648A41.728,41.728,0,0,0,439.04,581.12A37.888,37.888,0,0,0,466.432,591.872A56.832,56.832,0,0,0,480.512,589.824L594.944,559.104 669.696,634.112A45.824,45.824,0,0,0,700.928,648.448A34.304,34.304,0,0,0,709.888,648.448A41.216,41.216,0,0,0,738.304,616.96L765.696,514.56 868.096,487.168A41.984,41.984,0,0,0,899.584,458.752A40.96,40.96,0,0,0,886.272,417.536z M801.536,214.016L806.656,214.016A16.896,16.896,0,0,1,806.656,219.136L781.056,312.832 708.096,239.104z M769.536,353.792L734.976,481.792 606.976,516.352 504.576,413.952 539.136,285.952 667.136,251.392z M570.112,161.792C570.112,159.232,571.904,157.696,571.904,157.184A9.984,9.984,0,0,1,576,160.256L635.648,219.904 548.352,243.2z M412.416,323.84L409.6,320A12.8,12.8,0,0,1,414.464,317.952L495.616,296.192 472.064,384z M470.784,554.24A18.944,18.944,0,0,1,465.664,554.24A17.92,17.92,0,0,1,465.664,549.12L491.264,455.424 563.2,528.64z M701.184,605.44C701.184,608.256,699.648,609.536,699.648,610.304A20.992,20.992,0,0,1,695.296,606.976L635.904,547.584 723.2,524.032z M857.344,449.28L776.192,471.04 799.488,384 858.88,443.392A40.96,40.96,0,0,1,862.208,447.232A12.8,12.8,0,0,1,858.112,449.792z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.fashionDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFF6A9B" Geometry="F1 M1024,1024z M0,0z M691.2,204.8A44.032,44.032,0,0,1,721.152,238.848A117.76,117.76,0,0,1,708.096,315.648C708.096,315.648,688.896,345.6,683.776,355.584A235.008,235.008,0,0,0,658.176,462.592L658.176,503.296 365.312,503.296 365.312,463.872A235.008,235.008,0,0,0,339.712,356.864C334.592,346.88,315.392,316.928,315.392,316.928A117.76,117.76,0,0,1,302.336,240.128A44.544,44.544,0,0,1,336.896,204.8L336.896,147.712A29.952,29.952,0,0,1,364.032,115.968A29.952,29.952,0,0,1,391.68,147.712L391.68,221.44A237.056,237.056,0,0,0,512,253.952A241.408,241.408,0,0,0,637.184,218.88L637.184,147.712A27.136,27.136,0,1,1,690.944,147.712z" />
|
||||
<GeometryDrawing Brush="#FFFF9DC6" Geometry="F1 M1024,1024z M0,0z M658.432,487.936L365.312,487.936 204.8,780.288A36.352,36.352,0,0,0,215.04,826.88A492.288,492.288,0,0,0,810.496,826.88A36.608,36.608,0,0,0,819.2,779.52z" />
|
||||
<GeometryDrawing Brush="#FFFF6A9B" Geometry="F1 M1024,1024z M0,0z M409.6,537.6A9.984,9.984,0,0,0,396.032,542.208L271.872,792.832A10.496,10.496,0,0,0,276.48,806.4A14.848,14.848,0,0,0,281.088,806.4A9.984,9.984,0,0,0,290.048,800.768L414.208,549.888A10.24,10.24,0,0,0,409.6,537.6z M455.936,643.072A9.984,9.984,0,0,0,443.904,650.496L403.456,821.248A10.24,10.24,0,0,0,410.88,833.536L413.184,833.536A9.728,9.728,0,0,0,422.912,825.6L463.36,654.848A9.984,9.984,0,0,0,455.936,643.072z M750.848,791.808L626.688,541.184A9.984,9.984,0,0,0,614.4,537.6A10.24,10.24,0,0,0,609.792,550.912L733.952,801.792A9.984,9.984,0,0,0,742.912,807.424A14.848,14.848,0,0,0,747.52,807.424A10.496,10.496,0,0,0,750.848,791.808z M579.84,650.496A9.984,9.984,0,0,0,560.384,655.104L600.832,825.856A9.728,9.728,0,0,0,610.56,833.792L612.864,833.792A10.24,10.24,0,0,0,620.288,821.504z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.foodDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<DrawingGroup.Transform>
|
||||
<TranslateTransform X="0" Y="1.4210854715202004E-14" />
|
||||
</DrawingGroup.Transform>
|
||||
<GeometryDrawing Brush="#FFFA942D" Geometry="F1 M1024,1024z M0,0z M192.075294,503.883294 M116.781176,503.883294A75.294118,75.294118,0,1,0,267.369412,503.883294A75.294118,75.294118,0,1,0,116.781176,503.883294z" />
|
||||
<GeometryDrawing Brush="#FFFA942D" Geometry="F1 M1024,1024z M0,0z M342.663529,411.211294 M267.369412,411.211294A75.294118,75.294118,0,1,0,417.957647,411.211294A75.294118,75.294118,0,1,0,267.369412,411.211294z" />
|
||||
<GeometryDrawing Brush="#FFFE5D79" Geometry="F1 M1024,1024z M0,0z M284.747294,480.722824 M209.453176,480.722824A75.294118,75.294118,0,1,0,360.041412,480.722824A75.294118,75.294118,0,1,0,209.453176,480.722824z" />
|
||||
<GeometryDrawing Brush="#FFFA942D" Geometry="F1 M1024,1024z M0,0z M765.470118,532.841412 M638.042353,532.841412A127.427765,127.427765,0,1,0,892.897882,532.841412A127.427765,127.427765,0,1,0,638.042353,532.841412z" />
|
||||
<GeometryDrawing Brush="#FFFA942D" Geometry="F1 M1024,1024z M0,0z M632.259765,457.547294 M499.049412,457.547294A133.210353,133.210353,0,1,0,765.470118,457.547294A133.210353,133.210353,0,1,0,499.049412,457.547294z" />
|
||||
<GeometryDrawing Brush="#FFFE5D79" Geometry="F1 M1024,1024z M0,0z M672.798118,556.016941 M522.209882,556.016941A150.588235,150.588235,0,1,0,823.386353,556.016941A150.588235,150.588235,0,1,0,522.209882,556.016941z" />
|
||||
<GeometryDrawing Brush="#FFFDDC7A" Geometry="F1 M1024,1024z M0,0z M932.291765,474.925176A28.762353,28.762353,0,0,1,961.039059,503.687529L960.993882,505.042824 960.903529,506.398118C946.597647,657.317647,830.298353,779.264,680.161882,805.586824L700.340706,886.332235A23.160471,23.160471,0,0,1,677.872941,915.109647L343.371294,915.109647A23.160471,23.160471,0,0,1,320.903529,886.332235L341.082353,805.586824C192.813176,779.595294,77.552941,660.329412,60.928,512.015059L60.370824,506.639059A28.958118,28.958118,0,0,1,89.193412,474.925176L932.276706,474.925176z" />
|
||||
<GeometryDrawing Brush="#FFF6C338" Geometry="F1 M1024,1024z M0,0z M442.548706,196.924235L578.695529,196.924235C599.958588,196.924235,618.496,211.380706,623.646118,232.011294L684.378353,474.925176 336.865882,474.925176 397.598118,232.026353A46.336,46.336,0,0,1,442.548706,196.924235z" />
|
||||
<GeometryDrawing Brush="#FFC6D2E1" Geometry="F1 M1024,1024z M0,0z M688.037647,192.903529C697.479529,162.725647 716.423529,163.493647 722.718118,145.317647 729.780706,124.867765 732.084706,99.599059 729.645176,69.496471 746.496,87.43153 755.621647,106.511059 760.591059,131.779765 765.485177,156.717177 751.465412,175.962353 731.527529,206.260706 711.604705,236.574118 722.718117,273.874824 731.527529,301.176471 714.676705,283.256471 671.623529,245.398589 688.052706,192.903529z M283.361882,154.247529C294.686117,116.540235 317.424941,117.473882 324.969412,94.765176 333.462588,69.210352 336.233412,37.632 333.281882,-1.4210854715202E-14 353.520941,22.407529 364.483764,46.260706 370.447059,77.854118 376.32,109.025883 359.499294,133.074824 335.570824,170.962824 311.627295,208.835765 324.969412,255.442824 335.570824,289.596235 315.331765,267.173647 263.634824,219.873882 283.361882,154.247529z" />
|
||||
<GeometryDrawing Brush="#FFF5BC20" Geometry="F1 M1024,1024z M0,0z M510.629647,706.605176A92.672,92.672,0,0,1,603.301647,799.277176L603.301647,915.109647 417.957647,915.109647 417.957647,799.277176A92.672,92.672,0,0,1,510.629647,706.605176z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.gameDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF58D598" Geometry="F1 M1024,1024z M0,0z M166.4,166.144 M256.512,166.144L767.488,166.144Q857.6,166.144,857.6,256.256L857.6,767.232Q857.6,857.344,767.488,857.344L256.512,857.344Q166.4,857.344,166.4,767.232L166.4,256.256Q166.4,166.144,256.512,166.144z" />
|
||||
<GeometryDrawing Brush="#FF17AD8A" Geometry="F1 M1024,1024z M0,0z M307.2,325.632L443.648,325.632 443.648,462.08 307.2,462.08z M580.096,325.632L716.544,325.632 716.544,462.08 580.096,462.08z" />
|
||||
<GeometryDrawing Brush="#FF17AD8A" Geometry="F1 M1024,1024z M0,0z M443.648,462.336L443.648,538.112 379.392,538.112 379.392,742.656 438.784,742.656 438.784,674.56 585.216,674.56 585.216,742.656 644.352,742.656 644.352,538.112 580.096,538.112 580.096,462.336 443.648,462.336z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.guochuangDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF58D598" Geometry="F1 M1024,1024z M0,0z M873.472,321.792C827.392,275.2,771.072,248.32,711.936,281.6A177.152,177.152,0,0,0,660.736,120.064C660.736,120.064 577.28,227.584 645.632,339.712 633.344,353.28 621.312,366.848 609.28,379.136 582.4,406.272 623.872,448.256 650.496,421.12L719.104,351.488C759.808,310.528 795.904,327.68 832,363.776 858.624,390.656 900.096,348.672 873.472,321.792z" />
|
||||
<GeometryDrawing Brush="#FFFF5C7A" Geometry="F1 M1024,1024z M0,0z M705.024,344.576A189.696,189.696,0,0,0,434.176,344.576A195.072,195.072,0,0,0,392.96,407.04A249.088,249.088,0,0,0,215.296,481.536A256,256,0,0,0,215.296,841.216A248.576,248.576,0,0,0,570.112,841.216A256,256,0,0,0,643.584,662.016A190.976,190.976,0,0,0,705.024,620.288A195.84,195.84,0,0,0,705.024,344.576z" />
|
||||
<GeometryDrawing Brush="#FFF14767" Geometry="F1 M1024,1024z M0,0z M514.304,808.704A187.136,187.136,0,0,1,247.04,803.584A193.536,193.536,0,0,1,252.16,532.48C252.16,532.48,207.104,653.312,295.936,746.752A210.176,210.176,0,0,0,514.304,808.704" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.informationDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF7DD3E0" Geometry="F1 M1024,1024z M0,0z M760.685714,768A21.942857,21.942857,0,0,0,780.522057,789.840457L782.628571,789.942857A21.942857,21.942857,0,0,0,804.469029,770.106514L804.571429,768 804.571429,321.828571 833.828571,321.828571A58.514286,58.514286,0,0,1,892.342857,380.342857L892.342857,819.2A58.514286,58.514286,0,0,1,833.828571,877.714286L190.171429,877.714286A58.514286,58.514286,0,0,1,131.657143,819.2L131.657143,204.8A58.514286,58.514286,0,0,1,190.171429,146.285714L702.171429,146.285714A58.514286,58.514286,0,0,1,760.685714,204.8L760.685714,768z" />
|
||||
<GeometryDrawing Brush="#FF3DA9D3" Geometry="F1 M1024,1024z M0,0z M219.428571,234.057143 M248.685714,234.057143L643.657143,234.057143Q672.914286,234.057143,672.914286,263.314286L672.914286,526.628571Q672.914286,555.885714,643.657143,555.885714L248.685714,555.885714Q219.428571,555.885714,219.428571,526.628571L219.428571,263.314286Q219.428571,234.057143,248.685714,234.057143z" />
|
||||
<GeometryDrawing Brush="#FFFFD469" Geometry="F1 M1024,1024z M0,0z M404.772571,300.514743L534.235429,381.44A15.945143,15.945143,0,0,1,534.235429,408.502857L404.772571,489.428114A15.945143,15.945143,0,0,1,380.342857,475.896686L380.342857,314.046171A15.945143,15.945143,0,0,1,404.772571,300.514743z" />
|
||||
<GeometryDrawing Brush="#FF3DA9D3" Geometry="F1 M1024,1024z M0,0z M219.428571,614.4 M248.685714,614.4L643.657143,614.4Q672.914286,614.4,672.914286,643.657143L672.914286,643.657143Q672.914286,672.914286,643.657143,672.914286L248.685714,672.914286Q219.428571,672.914286,219.428571,643.657143L219.428571,643.657143Q219.428571,614.4,248.685714,614.4z" />
|
||||
<GeometryDrawing Brush="#FF3DA9D3" Geometry="F1 M1024,1024z M0,0z M219.428571,731.428571 M248.685714,731.428571L468.114286,731.428571Q497.371429,731.428571,497.371429,760.685714L497.371429,760.685714Q497.371429,789.942857,468.114286,789.942857L248.685714,789.942857Q219.428571,789.942857,219.428571,760.685714L219.428571,760.685714Q219.428571,731.428571,248.685714,731.428571z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.kichikuDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFC6B8A" Geometry="F1 M1024,1024z M0,0z M918.784,510.208A187.904,187.904,0,0,0,829.952,350.72A156.416,156.416,0,0,0,831.744,328.704A150.784,150.784,0,0,0,620.8,190.208A151.04,151.04,0,0,0,404.48,190.208A150.784,150.784,0,0,0,193.536,328.704A156.416,156.416,0,0,0,195.328,350.72A187.648,187.648,0,0,0,181.504,660.224L181.504,661.76A215.296,215.296,0,0,0,514.304,840.96A215.04,215.04,0,0,0,847.104,661.76L847.104,659.2A187.904,187.904,0,0,0,918.784,510.208z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M1024,1024z M0,0z M680.704,479.744A150.528,150.528,0,0,1,572.672,435.2A150.016,150.016,0,0,1,452.608,435.2A150.528,150.528,0,0,1,344.576,481.024L333.312,481.024 333.312,648.192A166.4,166.4,0,0,0,499.2,814.08L532.736,814.08A166.4,166.4,0,0,0,698.624,648.192L698.624,478.464A137.216,137.216,0,0,1,680.704,479.744z" />
|
||||
<GeometryDrawing Brush="#FFE2006C" Geometry="F1 M1024,1024z M0,0z M510.464,651.264 M476.928,651.264A33.536,33.536,0,1,0,544,651.264A33.536,33.536,0,1,0,476.928,651.264z" />
|
||||
<GeometryDrawing Brush="#FFFF5C7A" Geometry="F1 M1024,1024z M0,0z M635.904,554.496L614.4,554.496 614.4,532.992A12.032,12.032,0,0,0,602.624,521.216L597.76,521.216A12.032,12.032,0,0,0,585.984,532.992L585.984,554.496 564.736,554.496A11.776,11.776,0,0,0,552.96,566.016L552.96,571.136A11.776,11.776,0,0,0,564.736,582.656L585.984,582.656 585.984,604.16A12.032,12.032,0,0,0,597.76,615.936L602.624,615.936A12.032,12.032,0,0,0,614.4,604.16L614.4,582.656 635.648,582.656A11.776,11.776,0,0,0,647.424,571.136L647.424,566.016A11.776,11.776,0,0,0,635.904,554.496z M455.936,554.496L435.2,554.496 435.2,532.992A12.032,12.032,0,0,0,423.424,521.216L418.56,521.216A12.032,12.032,0,0,0,406.784,532.992L406.784,554.496 384,554.496A11.776,11.776,0,0,0,372.224,566.016L372.224,571.136A11.776,11.776,0,0,0,384,582.656L405.248,582.656 405.248,604.16A12.032,12.032,0,0,0,417.024,615.936L421.888,615.936A12.032,12.032,0,0,0,435.2,604.16L435.2,582.656 456.448,582.656A11.52,11.52,0,0,0,468.224,571.136L468.224,566.016A11.52,11.52,0,0,0,455.936,554.496z" />
|
||||
<GeometryDrawing Brush="#FFEB53A8" Geometry="F1 M1024,1024z M0,0z M600.32,651.008A12.288,12.288,0,0,0,588.032,663.552C588.032,697.6 553.216,725.248 511.232,725.248 469.248,725.248 434.432,697.6 434.432,663.552A12.544,12.544,0,1,0,408.832,663.552C408.832,711.168 454.656,750.08 511.232,750.08 567.808,750.08 613.632,711.168 613.632,663.552A12.544,12.544,0,0,0,600.32,651.008z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.lifeDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFFD778" Geometry="F1 M1024,1024z M0,0z M881.408,664.064L881.408,504.32A168.192,168.192,0,0,0,753.408,341.76L745.472,339.968 745.472,484.864A12.288,12.288,0,0,1,730.88,496.64A170.752,170.752,0,0,0,700.416,493.824L561.664,493.824 561.664,466.176A37.632,37.632,0,0,1,573.44,438.528A175.872,175.872,0,0,0,631.296,302.848A179.2,179.2,0,0,0,460.8,132.352A175.872,175.872,0,0,0,279.808,308.48L279.808,409.6 312.064,409.6A225.536,225.536,0,0,0,327.936,428.8A36.608,36.608,0,0,1,337.408,454.4L337.408,496.896A193.792,193.792,0,0,0,179.2,712.96A197.12,197.12,0,0,0,376.32,879.616L701.44,879.616A148.48,148.48,0,0,0,747.008,873.472A217.088,217.088,0,0,0,811.264,841.728A176.896,176.896,0,0,0,829.44,826.112L834.048,821.76A156.16,156.16,0,0,0,881.408,709.888L881.408,674.048C881.92,670.976,881.664,667.392,881.408,664.064z" />
|
||||
<GeometryDrawing Brush="#FFFB813A" Geometry="F1 M1024,1024z M0,0z M468.736,238.592A40.192,40.192,0,1,0,508.928,278.784A40.192,40.192,0,0,0,468.736,238.592z M323.584,362.752L217.6,362.752A34.816,34.816,0,1,0,217.6,432.128L323.84,432.128A34.816,34.816,0,1,0,323.84,362.752z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.movieDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFE5E6E6" Geometry="F1 M1024,1024z M0,0z M954.624,452.864L919.04,452.864 919.04,283.904A37.376,37.376,0,0,0,893.44,247.296A36.608,36.608,0,0,0,846.848,281.6L846.848,451.84 199.936,451.84 199.936,282.88A37.632,37.632,0,0,0,174.336,246.272A36.352,36.352,0,0,0,128,281.6L128,451.84 92.16,451.84A15.616,15.616,0,0,0,76.8,467.712L76.8,550.4A15.36,15.36,0,0,0,92.16,566.016L119.04,566.016 119.04,651.264A135.68,135.68,0,0,0,253.44,787.456L367.872,787.456A135.68,135.68,0,0,0,502.272,651.264L502.272,630.272A7.936,7.936,0,0,1,509.952,622.336L535.552,622.336A7.68,7.68,0,0,1,543.232,630.272L543.232,651.264A135.936,135.936,0,0,0,677.632,787.456L793.6,787.456A135.68,135.68,0,0,0,928,651.264L928,566.016 953.6,566.016A15.36,15.36,0,0,0,968.96,550.4L968.96,468.736A15.616,15.616,0,0,0,953.6,452.864" />
|
||||
<GeometryDrawing Brush="#FFFF5C7A" Geometry="F1 M1024,1024z M0,0z M361.216,727.552L258.816,727.552A87.296,87.296,0,0,1,172.8,640L172.8,560.128A61.184,61.184,0,0,1,233.216,498.688L386.816,498.688A61.184,61.184,0,0,1,447.232,560.128L447.232,640A87.296,87.296,0,0,1,360.704,727.552" />
|
||||
<GeometryDrawing Brush="#FF2CBAE5" Geometry="F1 M1024,1024z M0,0z M685.568,727.552L787.968,727.552A87.296,87.296,0,0,0,873.984,640L873.984,560.128A61.184,61.184,0,0,0,813.568,498.688L659.968,498.688A61.184,61.184,0,0,0,599.552,560.128L599.552,640A87.296,87.296,0,0,0,686.08,727.552" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.musicDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF45C7DD" Geometry="F1 M1024,1024z M0,0z M881.92,460.8A335.36,335.36,0,0,0,547.584,125.696L474.368,125.696A335.616,335.616,0,0,0,139.776,460.8L139.776,774.4A18.688,18.688,0,0,0,158.208,793.088L200.192,793.088C213.76,839.424,238.08,873.472,288.768,873.472L387.072,873.472A37.376,37.376,0,0,0,424.448,836.608L425.728,551.936A36.864,36.864,0,0,0,388.608,514.816L288.768,514.816A111.616,111.616,0,0,0,237.568,527.616L237.568,454.4A242.432,242.432,0,0,1,479.232,212.736L546.56,212.736A242.176,242.176,0,0,1,787.968,454.4L787.968,528.896A110.592,110.592,0,0,0,733.696,514.816L633.856,514.816A36.864,36.864,0,0,0,596.736,551.936L596.736,836.608A37.376,37.376,0,0,0,634.112,873.472L732.416,873.472C783.616,873.472,807.424,839.424,820.992,793.088L862.976,793.088A18.688,18.688,0,0,0,881.408,774.4z" />
|
||||
<GeometryDrawing Brush="#FFFF5C7A" Geometry="F1 M1024,1024z M0,0z M646.141043,825.220963 M646.186439,792.708994L646.46024,596.613185Q646.505635,564.101217,679.017604,564.146612L680.041603,564.148042Q712.553571,564.193437,712.508176,596.705406L712.234374,792.801215Q712.188979,825.313183,679.677011,825.267788L678.653012,825.266358Q646.141044,825.220963,646.186439,792.708994z" />
|
||||
<GeometryDrawing Brush="#FFFF5C7A" Geometry="F1 M1024,1024z M0,0z M307.222608,825.246563 M307.268003,792.734594L307.541804,596.638785Q307.587199,564.126817,340.099168,564.172212L341.123167,564.173642Q373.635135,564.219037,373.58974,596.731006L373.315939,792.826815Q373.270544,825.338783,340.758575,825.293388L339.734576,825.291958Q307.222608,825.246563,307.268003,792.734594z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.sportsDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF1BAD8B" Geometry="F1 M1024,1024z M0,0z M497.8944,517.8624L521.7792,547.1232A58.5728,58.5728,0,0,1,516.1728,627.1744L241.9456,880.7424A47.7184,47.7184,0,0,1,176.3328,879.9744A49.8176,49.8176,0,0,1,172.032,813.1584L280.6016,676.7872 406.7072,518.4256A58.5728,58.5728,0,0,1,497.8944,517.8624z" />
|
||||
<GeometryDrawing Brush="#FF57D59A" Geometry="F1 M1024,1024z M0,0z M698.9312,153.6A117.1456,117.1456,0,0,1,710.3488,387.328L770.7648,433.2288C775.1168,436.5568,780.928,437.1456,785.8688,434.816L859.4944,400.1792A46.2848,46.2848,0,0,1,918.6048,417.7664A44.3392,44.3392,0,0,1,906.6752,477.0816L780.7232,567.3472A58.5728,58.5728,0,0,1,714.7776,568.9088L648.7296,526.1568 604.5952,573.9264 675.2,657.2544C676.864,659.2,678.4,661.2736,679.808,663.4496L681.7536,666.752A58.5728,58.5728,0,0,1,658.8928,746.368L466.7904,852.7104A49.3824,49.3824,0,0,1,401.0496,835.712A52.096,52.096,0,0,1,412.9536,767.1296L518.5024,683.9552 412.2112,615.6544 410.6752,614.6304A59.7504,59.7504,0,0,1,409.7792,614.016L395.9552,606.848A58.5728,58.5728,0,0,1,372.6592,524.5696L444.3392,405.6832 413.6192,391.8592A14.6432,14.6432,0,0,0,399.2832,393.1904L318.7968,448.7936A48.8704,48.8704,0,0,1,256.128,442.8288A39.3472,39.3472,0,0,1,257.92,385.9712L386.2016,270.8224A58.5728,58.5728,0,0,1,443.648,258.7904L587.1872,306.048A117.1456,117.1456,0,0,1,698.9312,153.6z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.technologyDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFFA200" Geometry="F1 M1024,1024z M0,0z M492.270933,147.729067A255.342933,255.342933,0,0,1,627.2,620.2624L627.2,671.4624A37.546667,37.546667,0,0,1,601.6,705.595733L379.733333,705.595733A44.654933,44.654933,0,0,1,354.133333,671.4624L354.133333,620.2624A256.648533,256.648533,0,0,1,492.270933,147.729067z" />
|
||||
<GeometryDrawing Brush="#FFFFF0D3" Geometry="F1 M1024,1024z M0,0z M550.4,534.929067L550.4,458.129067 601.6,458.129067C648.209067,458.129067,652.8,431.342934,652.8,415.4624L652.8,287.4624C652.8,264.3456,635.5968,244.795733,601.6,244.795733L388.266667,244.795733C346.1632,244.795733,328.533334,265.9072,328.533333,287.4624L328.533333,364.2624 430.933333,364.2624 430.933333,295.995733 550.4,295.995733 550.4,415.4624 499.2,415.4624C438.698667,414.8992,422.4,439.867733,422.4,458.129067L422.4,534.929067 550.4,534.929067z M487.7312,559.4624A59.733333,59.733333,0,1,1,427.997867,619.195733A59.733333,59.733333,0,0,1,487.7312,559.4624z" />
|
||||
<GeometryDrawing Brush="#FF5FB5EC" Geometry="F1 M1024,1024z M0,0z M354.133333,739.7376L627.2,739.7376 627.2,748.270933A128,128,0,0,1,499.2,876.270933L482.133333,876.270933A128,128,0,0,1,354.133333,748.270933L354.133333,739.7376z" />
|
||||
<GeometryDrawing Brush="#FFFFE074" Geometry="F1 M1024,1024z M0,0z M746.666667,210.6624L866.133333,210.6624A17.066667,17.066667,0,0,1,866.133333,244.795733L746.666667,244.795733A17.066667,17.066667,0,0,1,746.666667,210.6624z M806.4,150.929067A17.066667,17.066667,0,0,1,823.466667,167.995733L823.466667,287.4624A17.066667,17.066667,0,0,1,789.333333,287.4624L789.333333,167.995733A17.066667,17.066667,0,0,1,806.4,150.929067z" />
|
||||
<GeometryDrawing Brush="#FFFFE074" Geometry="F1 M1024,1024z M0,0z M157.866667,662.929067L277.333333,662.929067A17.066667,17.066667,0,0,1,277.333333,697.0624L157.866667,697.0624A17.066667,17.066667,0,0,1,157.866667,662.929067z M217.6,603.195733A17.066667,17.066667,0,0,1,234.666667,620.2624L234.666667,739.729067A17.066667,17.066667,0,0,1,200.533333,739.729067L200.533333,620.2624A17.066667,17.066667,0,0,1,217.6,603.195733z" />
|
||||
<GeometryDrawing Brush="#FFFFE074" Geometry="F1 M1024,1024z M0,0z M200.533333,662.9376L234.666667,662.9376 234.666667,697.070933 200.533333,697.070933z" />
|
||||
<GeometryDrawing Brush="#FFFFE074" Geometry="F1 M1024,1024z M0,0z M789.333333,210.670933L823.466667,210.670933 823.466667,244.804267 789.333333,244.804267z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
<DrawingImage x:Key="Zone.techDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFFD778" Geometry="F1 M1024,1024z M0,0z M510.208,683.264L396.032,683.264 345.344,892.672 674.816,892.672 624.128,683.264 510.208,683.264z" />
|
||||
<GeometryDrawing Brush="#FF48CFE5" Geometry="F1 M1024,1024z M0,0z M535.552,150.528L535.552,122.368A25.6,25.6,0,1,0,484.352,122.368L484.352,150.528A271.872,271.872,0,0,0,239.36,420.096L239.36,517.376A25.6,25.6,0,0,0,266.24,544.256L754.176,544.256A25.6,25.6,0,0,0,779.776,517.376L779.776,420.096A271.616,271.616,0,0,0,535.552,150.528z" />
|
||||
<GeometryDrawing Brush="#FF2CBAE5" Geometry="F1 M1024,1024z M0,0z M125.696,464.64 M228.864,464.64L791.296,464.64Q894.464,464.64,894.464,567.808L894.464,583.168Q894.464,686.336,791.296,686.336L228.864,686.336Q125.696,686.336,125.696,583.168L125.696,567.808Q125.696,464.64,228.864,464.64z" />
|
||||
<GeometryDrawing Brush="#FFFFD778" Geometry="F1 M1024,1024z M0,0z M742.4,537.6A37.632,37.632,0,1,0,780.032,575.232A37.376,37.376,0,0,0,742.4,537.6z M276.736,537.6A37.632,37.632,0,1,0,314.368,575.232A37.632,37.632,0,0,0,276.736,537.6z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.technology_oldDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFFD778" Geometry="F1 M1024,1024z M0,0z M510.208,683.264L396.032,683.264 345.344,892.672 674.816,892.672 624.128,683.264 510.208,683.264z" />
|
||||
<GeometryDrawing Brush="#FF48CFE5" Geometry="F1 M1024,1024z M0,0z M535.552,150.528L535.552,122.368A25.6,25.6,0,1,0,484.352,122.368L484.352,150.528A271.872,271.872,0,0,0,239.36,420.096L239.36,517.376A25.6,25.6,0,0,0,266.24,544.256L754.176,544.256A25.6,25.6,0,0,0,779.776,517.376L779.776,420.096A271.616,271.616,0,0,0,535.552,150.528z" />
|
||||
<GeometryDrawing Brush="#FF2CBAE5" Geometry="F1 M1024,1024z M0,0z M125.696,464.64 M228.864,464.64L791.296,464.64Q894.464,464.64,894.464,567.808L894.464,583.168Q894.464,686.336,791.296,686.336L228.864,686.336Q125.696,686.336,125.696,583.168L125.696,567.808Q125.696,464.64,228.864,464.64z" />
|
||||
<GeometryDrawing Brush="#FFFFD778" Geometry="F1 M1024,1024z M0,0z M742.4,537.6A37.632,37.632,0,1,0,780.032,575.232A37.376,37.376,0,0,0,742.4,537.6z M276.736,537.6A37.632,37.632,0,1,0,314.368,575.232A37.632,37.632,0,0,0,276.736,537.6z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="Zone.teleplayDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V1024 H1024 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFFFB161" Geometry="F1 M1024,1024z M0,0z M271.616,247.808A212.224,212.224,0,0,0,221.952,420.608L247.552,547.328C304.384,569.088,307.712,634.88,314.88,696.576A1167.872,1167.872,0,0,1,505.088,682.496A1247.488,1247.488,0,0,1,701.184,696.576C708.864,634.88,705.536,569.856,761.088,547.84L786.688,419.84A211.712,211.712,0,0,0,736.768,247.552A218.624,218.624,0,0,0,571.648,172.8L436.736,172.8A218.624,218.624,0,0,0,271.616,247.552" />
|
||||
<GeometryDrawing Brush="#FFFFE494" Geometry="F1 M1024,1024z M0,0z M505.088,412.672L470.272,378.112A19.456,19.456,0,0,0,442.88,405.504L468.48,431.104 442.88,456.704A19.456,19.456,0,0,0,470.272,484.096L505.088,449.536 540.16,484.096A18.688,18.688,0,0,0,553.728,489.728A19.456,19.456,0,0,0,567.552,456.704L541.952,431.104 567.552,405.504A19.456,19.456,0,0,0,553.728,372.48A18.688,18.688,0,0,0,540.16,378.112z" />
|
||||
<GeometryDrawing Brush="#FFFB952C" Geometry="F1 M1024,1024z M0,0z M822.016,482.56A130.816,130.816,0,0,0,688.128,610.56L688.128,679.424 320,680.96 320,611.584A130.304,130.304,0,0,0,199.68,483.584L186.112,483.584A81.92,81.92,0,0,0,102.4,563.2A76.8,76.8,0,0,0,102.4,576.512A79.104,79.104,0,0,0,141.312,631.296L150.272,635.648 152.576,635.648A25.6,25.6,0,0,1,167.936,657.664L167.936,721.408A112.384,112.384,0,0,0,248.832,826.88A51.2,51.2,0,0,0,347.648,832.768L660.736,832.768A51.2,51.2,0,0,0,759.552,826.88A112.384,112.384,0,0,0,838.656,721.408L838.656,650.752A25.6,25.6,0,0,1,846.848,639.232L848.384,639.232 852.992,636.416A80.384,80.384,0,0,0,904.192,574.976L904.192,562.944A81.92,81.92,0,0,0,820.48,483.328" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
</ResourceDictionary>
|
||||
@@ -32,15 +32,31 @@
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<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.19.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Google.Protobuf.3.19.1\lib\net45\Google.Protobuf.dll</HintPath>
|
||||
<Reference Include="Google.Protobuf, Version=3.21.12.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Google.Protobuf.3.21.12\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>
|
||||
<HintPath>..\packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
@@ -57,8 +73,8 @@
|
||||
</Reference>
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Management" />
|
||||
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
|
||||
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Numerics" />
|
||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
@@ -78,6 +94,9 @@
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="WebPSharp, Version=0.5.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\WebPSharp.0.5.1\lib\net472\WebPSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@@ -198,6 +217,15 @@
|
||||
<Compile Include="BiliApi\Users\Models\SpacePublicationListTypeVideoZone.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpacePublicationListVideo.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpacePublicationPage.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSeasonsDetail.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSeasonsSeries.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSeasonsSeriesArchives.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSeasonsSeriesMeta.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSeasonsSeriesOrigin.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSeasonsSeriesPage.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSeasonsSeriesStat.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSeriesDetail.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSeriesMeta.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSettings.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\SpaceSettingsToutu.cs" />
|
||||
<Compile Include="BiliApi\Users\Models\UpStat.cs" />
|
||||
@@ -221,6 +249,7 @@
|
||||
<Compile Include="BiliApi\VideoStream\Models\PlayUrl.cs" />
|
||||
<Compile Include="BiliApi\VideoStream\Models\PlayUrlDash.cs" />
|
||||
<Compile Include="BiliApi\VideoStream\Models\PlayUrlDashDolby.cs" />
|
||||
<Compile Include="BiliApi\VideoStream\Models\PlayUrlDashFlac.cs" />
|
||||
<Compile Include="BiliApi\VideoStream\Models\PlayUrlDashVideo.cs" />
|
||||
<Compile Include="BiliApi\VideoStream\Models\PlayUrlDurl.cs" />
|
||||
<Compile Include="BiliApi\VideoStream\Models\PlayUrlSupportFormat.cs" />
|
||||
@@ -271,6 +300,9 @@
|
||||
<Compile Include="Logging\LogLevel.cs" />
|
||||
<Compile Include="Logging\LogManager.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Settings\Downloader.cs" />
|
||||
<Compile Include="Settings\Models\VideoContentSettings.cs" />
|
||||
<Compile Include="Settings\OrderFormat.cs" />
|
||||
<Compile Include="Settings\ParseScope.cs" />
|
||||
<Compile Include="Settings\SettingsManager.Video.cs" />
|
||||
<Compile Include="Settings\SettingsManager.Basic.cs" />
|
||||
@@ -333,6 +365,20 @@
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="aria2c.exe">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="aria2_COPYING.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="ffmpeg.exe">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="FFmpeg_LICENSE.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="..\packages\Brotli.NET.2.1.1\build\Brotli.NET.targets" Condition="Exists('..\packages\Brotli.NET.2.1.1\build\Brotli.NET.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
@@ -341,8 +387,10 @@
|
||||
</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.19.1\build\Google.Protobuf.Tools.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Google.Protobuf.Tools.3.19.1\build\Google.Protobuf.Tools.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\WebPSharp.0.5.1\build\WebPSharp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\WebPSharp.0.5.1\build\WebPSharp.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Google.Protobuf.Tools.3.21.12\build\Google.Protobuf.Tools.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Google.Protobuf.Tools.3.21.12\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.19.1\build\Google.Protobuf.Tools.targets" Condition="Exists('..\packages\Google.Protobuf.Tools.3.19.1\build\Google.Protobuf.Tools.targets')" />
|
||||
<Import Project="..\packages\WebPSharp.0.5.1\build\WebPSharp.targets" Condition="Exists('..\packages\WebPSharp.0.5.1\build\WebPSharp.targets')" />
|
||||
<Import Project="..\packages\Google.Protobuf.Tools.3.21.12\build\Google.Protobuf.Tools.targets" Condition="Exists('..\packages\Google.Protobuf.Tools.3.21.12\build\Google.Protobuf.Tools.targets')" />
|
||||
</Project>
|
||||
@@ -27,7 +27,8 @@ namespace DownKyi.Core.Downloader
|
||||
private bool _rangeAllowed;
|
||||
private readonly HttpWebRequest _request;
|
||||
private Action<HttpWebRequest> _requestConfigure = req => req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36";
|
||||
#endregion
|
||||
|
||||
#endregion 属性
|
||||
|
||||
#region 公共属性
|
||||
|
||||
@@ -68,11 +69,13 @@ namespace DownKyi.Core.Downloader
|
||||
{
|
||||
try
|
||||
{
|
||||
return PartialDownloaderList.Where(t => t != null).Sum(t => t.TotalBytesRead);
|
||||
lock (this)
|
||||
{
|
||||
return PartialDownloaderList.Where(t => t != null).Sum(t => t.TotalBytesRead);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
catch
|
||||
{
|
||||
Logging.LogManager.Error(e);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -91,7 +94,16 @@ namespace DownKyi.Core.Downloader
|
||||
/// <summary>
|
||||
/// 下载速度
|
||||
/// </summary>
|
||||
public float TotalSpeedInBytes => PartialDownloaderList.Sum(t => t.SpeedInBytes);
|
||||
public float TotalSpeedInBytes
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
return PartialDownloaderList.Sum(t => t.SpeedInBytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 下载块
|
||||
@@ -103,7 +115,7 @@ namespace DownKyi.Core.Downloader
|
||||
/// </summary>
|
||||
public string FilePath { get; set; }
|
||||
|
||||
#endregion
|
||||
#endregion 公共属性
|
||||
|
||||
#region 变量
|
||||
|
||||
@@ -124,7 +136,7 @@ namespace DownKyi.Core.Downloader
|
||||
|
||||
private readonly AsyncOperation _aop;
|
||||
|
||||
#endregion
|
||||
#endregion 变量
|
||||
|
||||
#region 下载管理器
|
||||
|
||||
@@ -166,7 +178,7 @@ namespace DownKyi.Core.Downloader
|
||||
{
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion 下载管理器
|
||||
|
||||
#region 事件
|
||||
|
||||
@@ -181,16 +193,16 @@ namespace DownKyi.Core.Downloader
|
||||
return;
|
||||
}
|
||||
|
||||
PartialDownloaderList.Sort((x, y) => y.RemainingBytes - x.RemainingBytes);
|
||||
int rem = PartialDownloaderList[0].RemainingBytes;
|
||||
PartialDownloaderList.Sort((x, y) => (int)(y.RemainingBytes - x.RemainingBytes));
|
||||
var rem = PartialDownloaderList[0].RemainingBytes;
|
||||
if (rem < 50 * 1024)
|
||||
{
|
||||
WaitOrResumeAll(PartialDownloaderList, false);
|
||||
return;
|
||||
}
|
||||
|
||||
int from = PartialDownloaderList[0].CurrentPosition + rem / 2;
|
||||
int to = PartialDownloaderList[0].To;
|
||||
var from = PartialDownloaderList[0].CurrentPosition + rem / 2;
|
||||
var to = PartialDownloaderList[0].To;
|
||||
if (from > to)
|
||||
{
|
||||
WaitOrResumeAll(PartialDownloaderList, false);
|
||||
@@ -202,16 +214,19 @@ namespace DownKyi.Core.Downloader
|
||||
var temp = new PartialDownloader(_url, TempFileDirectory, Guid.NewGuid().ToString(), from, to, true);
|
||||
temp.DownloadPartCompleted += temp_DownloadPartCompleted;
|
||||
temp.DownloadPartProgressChanged += temp_DownloadPartProgressChanged;
|
||||
PartialDownloaderList.Add(temp);
|
||||
lock (this)
|
||||
{
|
||||
PartialDownloaderList.Add(temp);
|
||||
}
|
||||
temp.Start(_requestConfigure);
|
||||
}
|
||||
|
||||
void temp_DownloadPartProgressChanged(object sender, EventArgs e)
|
||||
private void temp_DownloadPartProgressChanged(object sender, EventArgs e)
|
||||
{
|
||||
UpdateProgress();
|
||||
}
|
||||
|
||||
void UpdateProgress()
|
||||
private void UpdateProgress()
|
||||
{
|
||||
int pr = (int)(TotalBytesReceived * 1d / Size * 100);
|
||||
if (TotalProgress != pr)
|
||||
@@ -224,11 +239,11 @@ namespace DownKyi.Core.Downloader
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion 事件
|
||||
|
||||
#region 方法
|
||||
|
||||
void CreateFirstPartitions()
|
||||
private void CreateFirstPartitions()
|
||||
{
|
||||
Size = GetContentLength(ref _rangeAllowed, ref _url);
|
||||
int maximumPart = (int)(Size / (25 * 1024));
|
||||
@@ -247,17 +262,21 @@ namespace DownKyi.Core.Downloader
|
||||
var temp = CreateNew(i, NumberOfParts, Size);
|
||||
temp.DownloadPartProgressChanged += temp_DownloadPartProgressChanged;
|
||||
temp.DownloadPartCompleted += temp_DownloadPartCompleted;
|
||||
PartialDownloaderList.Add(temp);
|
||||
lock (this)
|
||||
{
|
||||
PartialDownloaderList.Add(temp);
|
||||
}
|
||||
temp.Start(_requestConfigure);
|
||||
}
|
||||
}
|
||||
|
||||
void MergeParts()
|
||||
private void MergeParts()
|
||||
{
|
||||
var mergeOrderedList = PartialDownloaderList.OrderBy(x => x.From);
|
||||
var dir = new FileInfo(FilePath).DirectoryName;
|
||||
Directory.CreateDirectory(dir);
|
||||
|
||||
|
||||
using (var fs = File.OpenWrite(FilePath))
|
||||
{
|
||||
long totalBytesWrite = 0;
|
||||
@@ -298,12 +317,12 @@ namespace DownKyi.Core.Downloader
|
||||
}
|
||||
}
|
||||
|
||||
PartialDownloader CreateNew(int order, int parts, long contentLength)
|
||||
private PartialDownloader CreateNew(int order, int parts, long contentLength)
|
||||
{
|
||||
int division = (int)contentLength / parts;
|
||||
int remaining = (int)contentLength % parts;
|
||||
int start = division * order;
|
||||
int end = start + division - 1;
|
||||
var division = contentLength / parts;
|
||||
var remaining = contentLength % parts;
|
||||
var start = division * order;
|
||||
var end = start + division - 1;
|
||||
end += order == parts - 1 ? remaining : 0;
|
||||
return new PartialDownloader(_url, TempFileDirectory, Guid.NewGuid().ToString("N"), start, end, true);
|
||||
}
|
||||
@@ -315,15 +334,15 @@ namespace DownKyi.Core.Downloader
|
||||
/// <param name="wait"></param>
|
||||
public static void WaitOrResumeAll(List<PartialDownloader> list, bool wait)
|
||||
{
|
||||
foreach (var item in list)
|
||||
for (var index = 0; index < list.Count; index++)
|
||||
{
|
||||
if (wait)
|
||||
{
|
||||
item.Wait();
|
||||
list[index].Wait();
|
||||
}
|
||||
else
|
||||
{
|
||||
item.ResumeAfterWait();
|
||||
list[index].ResumeAfterWait();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -349,23 +368,21 @@ namespace DownKyi.Core.Downloader
|
||||
_request.ServicePoint.ConnectionLimit = 4;
|
||||
_requestConfigure(_request);
|
||||
|
||||
long ctl;
|
||||
using (var resp = _request.GetResponse() as HttpWebResponse)
|
||||
{
|
||||
redirectedUrl = resp.ResponseUri.OriginalString;
|
||||
ctl = resp.ContentLength;
|
||||
var ctl = resp.ContentLength;
|
||||
rangeAllowed = resp.Headers.AllKeys.Select((v, i) => new
|
||||
{
|
||||
HeaderName = v,
|
||||
HeaderValue = resp.Headers[i]
|
||||
}).Any(k => k.HeaderName.ToLower().Contains("range") && k.HeaderValue.ToLower().Contains("byte"));
|
||||
_request.Abort();
|
||||
return ctl;
|
||||
}
|
||||
|
||||
return ctl;
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion 方法
|
||||
|
||||
#region 公共方法
|
||||
|
||||
@@ -374,9 +391,12 @@ namespace DownKyi.Core.Downloader
|
||||
/// </summary>
|
||||
public void Pause()
|
||||
{
|
||||
foreach (var t in PartialDownloaderList.Where(t => !t.Completed))
|
||||
lock (this)
|
||||
{
|
||||
t.Stop();
|
||||
foreach (var t in PartialDownloaderList.Where(t => !t.Completed))
|
||||
{
|
||||
t.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
Thread.Sleep(200);
|
||||
@@ -401,8 +421,8 @@ namespace DownKyi.Core.Downloader
|
||||
{
|
||||
if (PartialDownloaderList[i].Stopped)
|
||||
{
|
||||
int from = PartialDownloaderList[i].CurrentPosition + 1;
|
||||
int to = PartialDownloaderList[i].To;
|
||||
var from = PartialDownloaderList[i].CurrentPosition + 1;
|
||||
var to = PartialDownloaderList[i].To;
|
||||
if (from > to)
|
||||
{
|
||||
continue;
|
||||
@@ -411,13 +431,16 @@ namespace DownKyi.Core.Downloader
|
||||
var temp = new PartialDownloader(_url, TempFileDirectory, Guid.NewGuid().ToString(), from, to, _rangeAllowed);
|
||||
temp.DownloadPartProgressChanged += temp_DownloadPartProgressChanged;
|
||||
temp.DownloadPartCompleted += temp_DownloadPartCompleted;
|
||||
PartialDownloaderList.Add(temp);
|
||||
lock (this)
|
||||
{
|
||||
PartialDownloaderList.Add(temp);
|
||||
}
|
||||
PartialDownloaderList[i].To = PartialDownloaderList[i].CurrentPosition;
|
||||
temp.Start(_requestConfigure);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion 公共方法
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,11 +29,11 @@ namespace DownKyi.Core.Downloader
|
||||
public event EventHandler DownloadPartStopped;
|
||||
|
||||
private readonly AsyncOperation _aop = AsyncOperationManager.CreateOperation(null);
|
||||
readonly int[] _lastSpeeds;
|
||||
int _counter;
|
||||
private readonly int[] _lastSpeeds;
|
||||
private long _counter;
|
||||
private long _to;
|
||||
private long _totalBytesRead;
|
||||
private bool _wait;
|
||||
private int _to;
|
||||
private int _totalBytesRead;
|
||||
|
||||
/// <summary>
|
||||
/// 下载已停止
|
||||
@@ -83,7 +83,7 @@ namespace DownKyi.Core.Downloader
|
||||
/// <summary>
|
||||
/// to
|
||||
/// </summary>
|
||||
public int To
|
||||
public long To
|
||||
{
|
||||
get => _to;
|
||||
set
|
||||
@@ -96,17 +96,17 @@ namespace DownKyi.Core.Downloader
|
||||
/// <summary>
|
||||
/// from
|
||||
/// </summary>
|
||||
public int From { get; }
|
||||
public long From { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前位置
|
||||
/// </summary>
|
||||
public int CurrentPosition => From + _totalBytesRead - 1;
|
||||
public long CurrentPosition => From + _totalBytesRead - 1;
|
||||
|
||||
/// <summary>
|
||||
/// 剩余字节数
|
||||
/// </summary>
|
||||
public int RemainingBytes => (int)(ContentLength - _totalBytesRead);
|
||||
public long RemainingBytes => ContentLength - _totalBytesRead;
|
||||
|
||||
/// <summary>
|
||||
/// 完整路径
|
||||
@@ -139,7 +139,7 @@ namespace DownKyi.Core.Downloader
|
||||
/// <param name="from"></param>
|
||||
/// <param name="to"></param>
|
||||
/// <param name="rangeAllowed"></param>
|
||||
public PartialDownloader(string url, string dir, string fileGuid, int from, int to, bool rangeAllowed)
|
||||
public PartialDownloader(string url, string dir, string fileGuid, long from, long to, bool rangeAllowed)
|
||||
{
|
||||
From = from;
|
||||
_to = to;
|
||||
@@ -150,7 +150,7 @@ namespace DownKyi.Core.Downloader
|
||||
_lastSpeeds = new int[10];
|
||||
}
|
||||
|
||||
void DownloadProcedure(Action<HttpWebRequest> config)
|
||||
private void DownloadProcedure(Action<HttpWebRequest> config)
|
||||
{
|
||||
using (var file = new FileStream(FullPath, FileMode.Create, FileAccess.ReadWrite, FileShare.Delete))
|
||||
{
|
||||
@@ -163,6 +163,7 @@ namespace DownKyi.Core.Downloader
|
||||
req.ServicePoint.ConnectionLimit += 1;
|
||||
req.ServicePoint.Expect100Continue = true;
|
||||
req.ProtocolVersion = HttpVersion.Version11;
|
||||
req.Proxy = WebRequest.GetSystemWebProxy();
|
||||
config(req);
|
||||
if (RangeAllowed)
|
||||
{
|
||||
@@ -265,4 +266,4 @@ namespace DownKyi.Core.Downloader
|
||||
_wait = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,23 @@ namespace DownKyi.Core.FFmpeg
|
||||
{
|
||||
private const string Tag = "FFmpegHelper";
|
||||
|
||||
private static readonly bool is64Bit = false;
|
||||
private static readonly string exec = "";
|
||||
|
||||
static FFmpegHelper()
|
||||
{
|
||||
is64Bit = IntPtr.Size == 8;
|
||||
|
||||
if (is64Bit)
|
||||
{
|
||||
exec = Path.Combine(Environment.CurrentDirectory, "ffmpeg.exe");
|
||||
}
|
||||
else
|
||||
{
|
||||
exec = Path.Combine(Environment.CurrentDirectory, "ffmpeg.exe");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 合并音频和视频
|
||||
/// </summary>
|
||||
@@ -17,15 +34,19 @@ namespace DownKyi.Core.FFmpeg
|
||||
/// <param name="destVideo"></param>
|
||||
public static bool MergeVideo(string video1, string video2, string destVideo)
|
||||
{
|
||||
string param = $"-i \"{video1}\" -i \"{video2}\" -acodec copy -vcodec copy -f mp4 \"{destVideo}\"";
|
||||
string param = $"-y -i \"{video1}\" -i \"{video2}\" -strict -2 -acodec copy -vcodec copy -f mp4 \"{destVideo}\"";
|
||||
if (video1 == null || !File.Exists(video1))
|
||||
{
|
||||
param = $"-i \"{video2}\" -acodec copy -vcodec copy -f mp4 \"{destVideo}\"";
|
||||
param = $"-y -i \"{video2}\" -strict -2 -acodec copy -vcodec copy -f mp4 \"{destVideo}\"";
|
||||
}
|
||||
if (video2 == null || !File.Exists(video2))
|
||||
{
|
||||
param = $"-i \"{video1}\" -acodec copy -f aac \"{destVideo}\"";
|
||||
param = $"-y -i \"{video1}\" -strict -2 -acodec copy \"{destVideo}\"";
|
||||
}
|
||||
|
||||
// 支持flac格式音频
|
||||
//param += " -strict -2";
|
||||
|
||||
if (!File.Exists(video1) && !File.Exists(video2)) { return false; }
|
||||
|
||||
// 如果存在
|
||||
@@ -37,7 +58,7 @@ namespace DownKyi.Core.FFmpeg
|
||||
return false;
|
||||
}
|
||||
|
||||
ExcuteProcess("ffmpeg.exe", param, null, (s, e) => Console.WriteLine(e.Data));
|
||||
ExcuteProcess(exec, param, null, (s, e) => Console.WriteLine(e.Data));
|
||||
|
||||
try
|
||||
{
|
||||
@@ -89,10 +110,10 @@ namespace DownKyi.Core.FFmpeg
|
||||
return false;
|
||||
}
|
||||
|
||||
// ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mkv
|
||||
// ffmpeg -y -f concat -safe 0 -i filelist.txt -c copy output.mkv
|
||||
// 加上-y,表示如果有同名文件,则默认覆盖
|
||||
string param = $"-f concat -safe 0 -i {concatFileName} -c copy \"{destVideo}\" -y";
|
||||
ExcuteProcess("ffmpeg.exe", param, workingDirectory, (s, e) => Console.WriteLine(e.Data));
|
||||
string param = $"-y -f concat -safe 0 -i {concatFileName} -c copy \"{destVideo}\" -y";
|
||||
ExcuteProcess(exec, param, workingDirectory, (s, e) => Console.WriteLine(e.Data));
|
||||
|
||||
// 删除临时文件
|
||||
try
|
||||
@@ -126,9 +147,9 @@ namespace DownKyi.Core.FFmpeg
|
||||
/// <param name="action"></param>
|
||||
public static void Delogo(string video, string destVideo, int x, int y, int width, int height, Action<string> action)
|
||||
{
|
||||
// ffmpeg -i "video.mp4" -vf delogo=x=1670:y=50:w=180:h=70:show=1 "delogo.mp4"
|
||||
string param = $"-i \"{video}\" -vf delogo=x={x}:y={y}:w={width}:h={height}:show=0 \"{destVideo}\" -hide_banner -y";
|
||||
ExcuteProcess("ffmpeg.exe", param, null, (s, e) =>
|
||||
// ffmpeg -y -i "video.mp4" -vf delogo=x=1670:y=50:w=180:h=70:show=1 "delogo.mp4"
|
||||
string param = $"-y -i \"{video}\" -vf delogo=x={x}:y={y}:w={width}:h={height}:show=0 \"{destVideo}\" -hide_banner";
|
||||
ExcuteProcess(exec, param, null, (s, e) =>
|
||||
{
|
||||
Console.WriteLine(e.Data);
|
||||
action.Invoke(e.Data);
|
||||
@@ -147,7 +168,7 @@ namespace DownKyi.Core.FFmpeg
|
||||
// ffmpeg -i 3.mp4 -vn -y -acodec copy 3.aac
|
||||
// ffmpeg -i 3.mp4 -vn -y -acodec copy 3.m4a
|
||||
string param = $"-i \"{video}\" -vn -y -acodec copy \"{audio}\" -hide_banner";
|
||||
ExcuteProcess("ffmpeg.exe", param,
|
||||
ExcuteProcess(exec, param,
|
||||
null, (s, e) =>
|
||||
{
|
||||
Console.WriteLine(e.Data);
|
||||
@@ -166,7 +187,7 @@ namespace DownKyi.Core.FFmpeg
|
||||
// 提取视频 (Extract Video)
|
||||
// ffmpeg -i Life.of.Pi.has.subtitles.mkv -vcodec copy –an videoNoAudioSubtitle.mp4
|
||||
string param = $"-i \"{video}\" -y -vcodec copy -an \"{destVideo}\" -hide_banner";
|
||||
ExcuteProcess("ffmpeg.exe", param,
|
||||
ExcuteProcess(exec, param,
|
||||
null, (s, e) =>
|
||||
{
|
||||
Console.WriteLine(e.Data);
|
||||
@@ -185,7 +206,7 @@ namespace DownKyi.Core.FFmpeg
|
||||
// 提取帧
|
||||
// ffmpeg -i caiyilin.wmv -vframes 1 wm.bmp
|
||||
string param = $"-i \"{video}\" -y -vframes {number} \"{image}\"";
|
||||
ExcuteProcess("ffmpeg.exe", param, null, (s, e) => Console.WriteLine(e.Data));
|
||||
ExcuteProcess(exec, param, null, (s, e) => Console.WriteLine(e.Data));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace DownKyi.Core.FileName
|
||||
@@ -6,7 +7,7 @@ namespace DownKyi.Core.FileName
|
||||
public class FileName
|
||||
{
|
||||
private readonly List<FileNamePart> nameParts;
|
||||
private int order = -1;
|
||||
private string order = "ORDER";
|
||||
private string section = "SECTION";
|
||||
private string mainTitle = "MAIN_TITLE";
|
||||
private string pageTitle = "PAGE_TITLE";
|
||||
@@ -36,7 +37,15 @@ namespace DownKyi.Core.FileName
|
||||
|
||||
public FileName SetOrder(int order)
|
||||
{
|
||||
this.order = order;
|
||||
this.order = order.ToString();
|
||||
return this;
|
||||
}
|
||||
|
||||
public FileName SetOrder(int order, int count)
|
||||
{
|
||||
int length = Math.Abs(count).ToString().Length;
|
||||
this.order = order.ToString("D" + length);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -127,14 +136,7 @@ namespace DownKyi.Core.FileName
|
||||
switch (part)
|
||||
{
|
||||
case FileNamePart.ORDER:
|
||||
if (order != -1)
|
||||
{
|
||||
path += order;
|
||||
}
|
||||
else
|
||||
{
|
||||
path += "ORDER";
|
||||
}
|
||||
path += order;
|
||||
break;
|
||||
case FileNamePart.SECTION:
|
||||
path += section;
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace DownKyi.Core.Logging
|
||||
/// </summary>
|
||||
public class LogManager
|
||||
{
|
||||
static readonly ConcurrentQueue<Tuple<string, string>> LogQueue = new ConcurrentQueue<Tuple<string, string>>();
|
||||
private static readonly ConcurrentQueue<Tuple<string, string>> LogQueue = new ConcurrentQueue<Tuple<string, string>>();
|
||||
|
||||
/// <summary>
|
||||
/// 自定义事件
|
||||
@@ -63,14 +63,21 @@ namespace DownKyi.Core.Logging
|
||||
|
||||
private static AutoResetEvent Pause => new AutoResetEvent(false);
|
||||
|
||||
private static string logDirectory;
|
||||
/// <summary>
|
||||
/// 日志存放目录,默认日志放在当前应用程序运行目录下的logs文件夹中
|
||||
/// </summary>
|
||||
public static string LogDirectory
|
||||
{
|
||||
get => Storage.Constant.Logs; // Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
|
||||
get => logDirectory ?? (Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory).Any(s => s.Contains("Web.config")) ? AppDomain.CurrentDomain.BaseDirectory + @"App_Data\Logs\" : Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs"));
|
||||
set
|
||||
{
|
||||
//自定义目录
|
||||
if (!Directory.Exists(value))
|
||||
{
|
||||
Directory.CreateDirectory(value);
|
||||
}
|
||||
logDirectory = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("DownKyi")]
|
||||
[assembly: AssemblyProduct("DownKyi.Core")]
|
||||
[assembly: AssemblyCopyright("Copyright © Downkyi 2020-2021")]
|
||||
[assembly: AssemblyCopyright("Copyright © Downkyi 2020-2023")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
||||
//通过使用 "*",如下所示:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("2.1.0.0")]
|
||||
[assembly: AssemblyFileVersion("2.1.0.0")]
|
||||
[assembly: AssemblyVersion("2.1.8.0")]
|
||||
[assembly: AssemblyFileVersion("2.1.8.0")]
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
{
|
||||
public enum AfterDownloadOperation
|
||||
{
|
||||
NOT_SET = 0,
|
||||
NONE = 1,
|
||||
OPEN_FOLDER,
|
||||
CLOSE_APP,
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
{
|
||||
public enum DownloadFinishedSort
|
||||
{
|
||||
DOWNLOAD = 0,
|
||||
NOT_SET = 0,
|
||||
DOWNLOAD,
|
||||
NUMBER
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace DownKyi.Core.Settings
|
||||
{
|
||||
public enum Downloader
|
||||
{
|
||||
NOT_SET = 0,
|
||||
BUILT_IN,
|
||||
ARIA,
|
||||
CUSTOM_ARIA,
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
/// </summary>
|
||||
public class AboutSettings
|
||||
{
|
||||
public AllowStatus IsReceiveBetaVersion { get; set; }
|
||||
public AllowStatus AutoUpdateWhenLaunch { get; set; }
|
||||
public AllowStatus IsReceiveBetaVersion { get; set; } = AllowStatus.NONE;
|
||||
public AllowStatus AutoUpdateWhenLaunch { get; set; } = AllowStatus.NONE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,10 +5,11 @@
|
||||
/// </summary>
|
||||
public class BasicSettings
|
||||
{
|
||||
public AfterDownloadOperation AfterDownload { get; set; }
|
||||
public AllowStatus IsListenClipboard { get; set; }
|
||||
public AllowStatus IsAutoParseVideo { get; set; }
|
||||
public ParseScope ParseScope { get; set; }
|
||||
public DownloadFinishedSort DownloadFinishedSort { get; set; }
|
||||
public AfterDownloadOperation AfterDownload { get; set; } = AfterDownloadOperation.NOT_SET;
|
||||
public AllowStatus IsListenClipboard { get; set; } = AllowStatus.NONE;
|
||||
public AllowStatus IsAutoParseVideo { get; set; } = AllowStatus.NONE;
|
||||
public ParseScope ParseScope { get; set; } = ParseScope.NOT_SET;
|
||||
public AllowStatus IsAutoDownloadAll { get; set; } = AllowStatus.NONE;
|
||||
public DownloadFinishedSort DownloadFinishedSort { get; set; } = DownloadFinishedSort.NOT_SET;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,15 +5,15 @@
|
||||
/// </summary>
|
||||
public class DanmakuSettings
|
||||
{
|
||||
public AllowStatus DanmakuTopFilter { get; set; }
|
||||
public AllowStatus DanmakuBottomFilter { get; set; }
|
||||
public AllowStatus DanmakuScrollFilter { get; set; }
|
||||
public AllowStatus IsCustomDanmakuResolution { get; set; }
|
||||
public int DanmakuScreenWidth { get; set; }
|
||||
public int DanmakuScreenHeight { get; set; }
|
||||
public string DanmakuFontName { get; set; }
|
||||
public int DanmakuFontSize { get; set; }
|
||||
public int DanmakuLineCount { get; set; }
|
||||
public DanmakuLayoutAlgorithm DanmakuLayoutAlgorithm { get; set; }
|
||||
public AllowStatus DanmakuTopFilter { get; set; } = AllowStatus.NONE;
|
||||
public AllowStatus DanmakuBottomFilter { get; set; } = AllowStatus.NONE;
|
||||
public AllowStatus DanmakuScrollFilter { get; set; } = AllowStatus.NONE;
|
||||
public AllowStatus IsCustomDanmakuResolution { get; set; } = AllowStatus.NONE;
|
||||
public int DanmakuScreenWidth { get; set; } = -1;
|
||||
public int DanmakuScreenHeight { get; set; } = -1;
|
||||
public string DanmakuFontName { get; set; } = null;
|
||||
public int DanmakuFontSize { get; set; } = -1;
|
||||
public int DanmakuLineCount { get; set; } = -1;
|
||||
public DanmakuLayoutAlgorithm DanmakuLayoutAlgorithm { get; set; } = DanmakuLayoutAlgorithm.NONE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,17 +7,34 @@ namespace DownKyi.Core.Settings.Models
|
||||
/// </summary>
|
||||
public class NetworkSettings
|
||||
{
|
||||
public AllowStatus IsLiftingOfRegion { get; set; }
|
||||
public int AriaListenPort { get; set; }
|
||||
public AriaConfigLogLevel AriaLogLevel { get; set; }
|
||||
public int AriaMaxConcurrentDownloads { get; set; }
|
||||
public int AriaSplit { get; set; }
|
||||
public int AriaMaxOverallDownloadLimit { get; set; }
|
||||
public int AriaMaxDownloadLimit { get; set; }
|
||||
public AriaConfigFileAllocation AriaFileAllocation { get; set; }
|
||||
public AllowStatus IsLiftingOfRegion { get; set; } = AllowStatus.NONE;
|
||||
|
||||
public AllowStatus IsAriaHttpProxy { get; set; }
|
||||
public string AriaHttpProxy { get; set; }
|
||||
public int AriaHttpProxyListenPort { get; set; }
|
||||
public AllowStatus UseSSL { get; set; } = AllowStatus.NONE;
|
||||
public string UserAgent { get; set; } = string.Empty;
|
||||
|
||||
public Downloader Downloader { get; set; } = Downloader.NOT_SET;
|
||||
public int MaxCurrentDownloads { get; set; } = -1;
|
||||
|
||||
#region built-in
|
||||
public int Split { get; set; } = -1;
|
||||
public AllowStatus IsHttpProxy { get; set; } = AllowStatus.NONE;
|
||||
public string HttpProxy { get; set; } = null;
|
||||
public int HttpProxyListenPort { get; set; } = -1;
|
||||
#endregion
|
||||
|
||||
#region Aria
|
||||
public string AriaToken { get; set; } = null;
|
||||
public string AriaHost { get; set; } = null;
|
||||
public int AriaListenPort { get; set; } = -1;
|
||||
public AriaConfigLogLevel AriaLogLevel { get; set; } = AriaConfigLogLevel.NOT_SET;
|
||||
public int AriaSplit { get; set; } = -1;
|
||||
public int AriaMaxOverallDownloadLimit { get; set; } = -1;
|
||||
public int AriaMaxDownloadLimit { get; set; } = -1;
|
||||
public AriaConfigFileAllocation AriaFileAllocation { get; set; } = AriaConfigFileAllocation.NOT_SET;
|
||||
|
||||
public AllowStatus IsAriaHttpProxy { get; set; } = AllowStatus.NONE;
|
||||
public string AriaHttpProxy { get; set; } = null;
|
||||
public int AriaHttpProxyListenPort { get; set; } = -1;
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace DownKyi.Core.Settings.Models
|
||||
{
|
||||
public class VideoContentSettings
|
||||
{
|
||||
public bool DownloadAudio { get; set; } = true;
|
||||
public bool DownloadVideo { get; set; } = true;
|
||||
public bool DownloadDanmaku { get; set; } = true;
|
||||
public bool DownloadSubtitle { get; set; } = true;
|
||||
public bool DownloadCover { get; set; } = true;
|
||||
}
|
||||
}
|
||||
@@ -8,13 +8,16 @@ namespace DownKyi.Core.Settings.Models
|
||||
/// </summary>
|
||||
public class VideoSettings
|
||||
{
|
||||
public VideoCodecs VideoCodecs { get; set; } // AVC or HEVC
|
||||
public int Quality { get; set; } // 画质
|
||||
public int AudioQuality { get; set; } // 音质
|
||||
public AllowStatus IsTranscodingFlvToMp4 { get; set; } // 是否将flv转为mp4
|
||||
public string SaveVideoRootPath { get; set; } // 视频保存路径
|
||||
public List<string> HistoryVideoRootPaths { get; set; } // 历史视频保存路径
|
||||
public AllowStatus IsUseSaveVideoRootPath { get; set; } // 是否使用默认视频保存路径
|
||||
public List<FileNamePart> FileNameParts { get; set; } // 文件命名格式
|
||||
public int VideoCodecs { get; set; } = -1; // AVC or HEVC
|
||||
public int Quality { get; set; } = -1; // 画质
|
||||
public int AudioQuality { get; set; } = -1; // 音质
|
||||
public AllowStatus IsTranscodingFlvToMp4 { get; set; } = AllowStatus.NONE; // 是否将flv转为mp4
|
||||
public string SaveVideoRootPath { get; set; } = null; // 视频保存路径
|
||||
public List<string> HistoryVideoRootPaths { get; set; } = null; // 历史视频保存路径
|
||||
public AllowStatus IsUseSaveVideoRootPath { get; set; } = AllowStatus.NONE; // 是否使用默认视频保存路径
|
||||
public VideoContentSettings VideoContent { get; set; } = null; // 下载内容
|
||||
public List<FileNamePart> FileNameParts { get; set; } = null; // 文件命名格式
|
||||
public string FileNamePartTimeFormat { get; set; } = null; // 文件命名中的时间格式
|
||||
public OrderFormat OrderFormat { get; set; } = OrderFormat.NOT_SET; // 文件命名中的序号格式
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace DownKyi.Core.Settings
|
||||
{
|
||||
public enum OrderFormat
|
||||
{
|
||||
NOT_SET = 0,
|
||||
NATURAL, // 自然数
|
||||
LEADING_ZEROS, // 前导零填充
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
{
|
||||
public enum ParseScope
|
||||
{
|
||||
NOT_SET = 0,
|
||||
NONE = 1,
|
||||
SELECTED_ITEM,
|
||||
CURRENT_SECTION,
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
public AllowStatus IsReceiveBetaVersion()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.About.IsReceiveBetaVersion == 0)
|
||||
if (appSettings.About.IsReceiveBetaVersion == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
IsReceiveBetaVersion(isReceiveBetaVersion);
|
||||
@@ -42,7 +42,7 @@
|
||||
public AllowStatus GetAutoUpdateWhenLaunch()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.About.AutoUpdateWhenLaunch == 0)
|
||||
if (appSettings.About.AutoUpdateWhenLaunch == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAutoUpdateWhenLaunch(autoUpdateWhenLaunch);
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
// 默认的视频解析项
|
||||
private readonly ParseScope parseScope = ParseScope.NONE;
|
||||
|
||||
// 解析后自动下载解析视频
|
||||
private readonly AllowStatus isAutoDownloadAll = AllowStatus.NO;
|
||||
|
||||
// 下载完成列表排序
|
||||
private readonly DownloadFinishedSort finishedSort = DownloadFinishedSort.DOWNLOAD;
|
||||
|
||||
@@ -24,7 +27,7 @@
|
||||
public AfterDownloadOperation GetAfterDownloadOperation()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Basic.AfterDownload == 0)
|
||||
if (appSettings.Basic.AfterDownload == AfterDownloadOperation.NOT_SET)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAfterDownloadOperation(afterDownload);
|
||||
@@ -51,7 +54,7 @@
|
||||
public AllowStatus IsListenClipboard()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Basic.IsListenClipboard == 0)
|
||||
if (appSettings.Basic.IsListenClipboard == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
IsListenClipboard(isListenClipboard);
|
||||
@@ -78,7 +81,7 @@
|
||||
public AllowStatus IsAutoParseVideo()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Basic.IsAutoParseVideo == 0)
|
||||
if (appSettings.Basic.IsAutoParseVideo == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
IsAutoParseVideo(isAutoParseVideo);
|
||||
@@ -105,7 +108,7 @@
|
||||
public ParseScope GetParseScope()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Basic.ParseScope == 0)
|
||||
if (appSettings.Basic.ParseScope == ParseScope.NOT_SET)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetParseScope(parseScope);
|
||||
@@ -125,6 +128,33 @@
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解析后是否自动下载解析视频
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public AllowStatus IsAutoDownloadAll()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Basic.IsAutoDownloadAll == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
IsAutoDownloadAll(isAutoDownloadAll);
|
||||
return isAutoDownloadAll;
|
||||
}
|
||||
return appSettings.Basic.IsAutoDownloadAll;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解析后是否自动下载解析视频
|
||||
/// </summary>
|
||||
/// <param name="isAutoDownloadAll"></param>
|
||||
/// <returns></returns>
|
||||
public bool IsAutoDownloadAll(AllowStatus isAutoDownloadAll)
|
||||
{
|
||||
appSettings.Basic.IsAutoDownloadAll = isAutoDownloadAll;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取下载完成列表排序
|
||||
/// </summary>
|
||||
@@ -132,7 +162,7 @@
|
||||
public DownloadFinishedSort GetDownloadFinishedSort()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Basic.DownloadFinishedSort == 0)
|
||||
if (appSettings.Basic.DownloadFinishedSort == DownloadFinishedSort.NOT_SET)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetDownloadFinishedSort(finishedSort);
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
public AllowStatus GetDanmakuTopFilter()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Danmaku.DanmakuTopFilter == 0)
|
||||
if (appSettings.Danmaku.DanmakuTopFilter == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetDanmakuTopFilter(danmakuTopFilter);
|
||||
@@ -67,7 +67,7 @@
|
||||
public AllowStatus GetDanmakuBottomFilter()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Danmaku.DanmakuBottomFilter == 0)
|
||||
if (appSettings.Danmaku.DanmakuBottomFilter == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetDanmakuBottomFilter(danmakuBottomFilter);
|
||||
@@ -94,7 +94,7 @@
|
||||
public AllowStatus GetDanmakuScrollFilter()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Danmaku.DanmakuScrollFilter == 0)
|
||||
if (appSettings.Danmaku.DanmakuScrollFilter == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetDanmakuScrollFilter(danmakuScrollFilter);
|
||||
@@ -121,7 +121,7 @@
|
||||
public AllowStatus IsCustomDanmakuResolution()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Danmaku.IsCustomDanmakuResolution == 0)
|
||||
if (appSettings.Danmaku.IsCustomDanmakuResolution == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
IsCustomDanmakuResolution(isCustomDanmakuResolution);
|
||||
@@ -148,7 +148,7 @@
|
||||
public int GetDanmakuScreenWidth()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Danmaku.DanmakuScreenWidth == 0)
|
||||
if (appSettings.Danmaku.DanmakuScreenWidth == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetDanmakuScreenWidth(danmakuScreenWidth);
|
||||
@@ -175,7 +175,7 @@
|
||||
public int GetDanmakuScreenHeight()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Danmaku.DanmakuScreenHeight == 0)
|
||||
if (appSettings.Danmaku.DanmakuScreenHeight == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetDanmakuScreenHeight(danmakuScreenHeight);
|
||||
@@ -229,7 +229,7 @@
|
||||
public int GetDanmakuFontSize()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Danmaku.DanmakuFontSize == 0)
|
||||
if (appSettings.Danmaku.DanmakuFontSize == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetDanmakuFontSize(danmakuFontSize);
|
||||
@@ -256,7 +256,7 @@
|
||||
public int GetDanmakuLineCount()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Danmaku.DanmakuLineCount == 0)
|
||||
if (appSettings.Danmaku.DanmakuLineCount == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetDanmakuLineCount(danmakuLineCount);
|
||||
@@ -283,7 +283,7 @@
|
||||
public DanmakuLayoutAlgorithm GetDanmakuLayoutAlgorithm()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Danmaku.DanmakuLayoutAlgorithm == 0)
|
||||
if (appSettings.Danmaku.DanmakuLayoutAlgorithm == DanmakuLayoutAlgorithm.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetDanmakuLayoutAlgorithm(danmakuLayoutAlgorithm);
|
||||
|
||||
@@ -7,15 +7,38 @@ namespace DownKyi.Core.Settings
|
||||
// 是否开启解除地区限制
|
||||
private readonly AllowStatus isLiftingOfRegion = AllowStatus.YES;
|
||||
|
||||
// 启用https
|
||||
private readonly AllowStatus useSSL = AllowStatus.YES;
|
||||
|
||||
// UserAgent
|
||||
private readonly string userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36";
|
||||
|
||||
// 下载器
|
||||
private readonly Downloader downloader = Downloader.ARIA;
|
||||
|
||||
// 最大同时下载数(任务数)
|
||||
private readonly int maxCurrentDownloads = 3;
|
||||
|
||||
// 单文件最大线程数
|
||||
private readonly int split = 8;
|
||||
|
||||
// HttpProxy代理
|
||||
private readonly AllowStatus isHttpProxy = AllowStatus.NO;
|
||||
private readonly string httpProxy = string.Empty;
|
||||
private readonly int httpProxyListenPort = 0;
|
||||
|
||||
// Aria服务器token
|
||||
private readonly string ariaToken = "downkyi";
|
||||
|
||||
// Aria服务器host
|
||||
private readonly string ariaHost = "http://localhost";
|
||||
|
||||
// Aria服务器端口号
|
||||
private readonly int ariaListenPort = 6800;
|
||||
|
||||
// Aria日志等级
|
||||
private readonly AriaConfigLogLevel ariaLogLevel = AriaConfigLogLevel.INFO;
|
||||
|
||||
// Aria最大同时下载数(任务数)
|
||||
private readonly int ariaMaxConcurrentDownloads = 3;
|
||||
|
||||
// Aria单文件最大线程数
|
||||
private readonly int ariaSplit = 5;
|
||||
|
||||
@@ -26,11 +49,11 @@ namespace DownKyi.Core.Settings
|
||||
private readonly int ariaMaxDownloadLimit = 0;
|
||||
|
||||
// Aria文件预分配
|
||||
private readonly AriaConfigFileAllocation ariaFileAllocation = AriaConfigFileAllocation.PREALLOC;
|
||||
private readonly AriaConfigFileAllocation ariaFileAllocation = AriaConfigFileAllocation.NONE;
|
||||
|
||||
// Aria HttpProxy代理
|
||||
private readonly AllowStatus isAriaHttpProxy = AllowStatus.NO;
|
||||
private readonly string ariaHttpProxy = "";
|
||||
private readonly string ariaHttpProxy = string.Empty;
|
||||
private readonly int ariaHttpProxyListenPort = 0;
|
||||
|
||||
/// <summary>
|
||||
@@ -40,7 +63,7 @@ namespace DownKyi.Core.Settings
|
||||
public AllowStatus IsLiftingOfRegion()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.IsLiftingOfRegion == 0)
|
||||
if (appSettings.Network.IsLiftingOfRegion == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
IsLiftingOfRegion(isLiftingOfRegion);
|
||||
@@ -60,6 +83,276 @@ namespace DownKyi.Core.Settings
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取是否启用https
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public AllowStatus UseSSL()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.UseSSL == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
UseSSL(useSSL);
|
||||
return useSSL;
|
||||
}
|
||||
return appSettings.Network.UseSSL;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置是否启用https
|
||||
/// </summary>
|
||||
/// <param name="useSSL"></param>
|
||||
/// <returns></returns>
|
||||
public bool UseSSL(AllowStatus useSSL)
|
||||
{
|
||||
appSettings.Network.UseSSL = useSSL;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取UserAgent
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string GetUserAgent()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.UserAgent == string.Empty)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetUserAgent(userAgent);
|
||||
return userAgent;
|
||||
}
|
||||
return appSettings.Network.UserAgent;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置UserAgent
|
||||
/// </summary>
|
||||
/// <param name="userAgent"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetUserAgent(string userAgent)
|
||||
{
|
||||
appSettings.Network.UserAgent = userAgent;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取下载器
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public Downloader GetDownloader()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.Downloader == Downloader.NOT_SET)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetDownloader(downloader);
|
||||
return downloader;
|
||||
}
|
||||
return appSettings.Network.Downloader;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置下载器
|
||||
/// </summary>
|
||||
/// <param name="downloader"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetDownloader(Downloader downloader)
|
||||
{
|
||||
appSettings.Network.Downloader = downloader;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取最大同时下载数(任务数)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public int GetMaxCurrentDownloads()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.MaxCurrentDownloads == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetMaxCurrentDownloads(maxCurrentDownloads);
|
||||
return maxCurrentDownloads;
|
||||
}
|
||||
return appSettings.Network.MaxCurrentDownloads;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置最大同时下载数(任务数)
|
||||
/// </summary>
|
||||
/// <param name="ariaMaxConcurrentDownloads"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetMaxCurrentDownloads(int maxCurrentDownloads)
|
||||
{
|
||||
appSettings.Network.MaxCurrentDownloads = maxCurrentDownloads;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取单文件最大线程数
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public int GetSplit()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.Split == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetSplit(split);
|
||||
return split;
|
||||
}
|
||||
return appSettings.Network.Split;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置单文件最大线程数
|
||||
/// </summary>
|
||||
/// <param name="split"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetSplit(int split)
|
||||
{
|
||||
appSettings.Network.Split = split;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取是否开启Http代理
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public AllowStatus IsHttpProxy()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.IsHttpProxy == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
IsHttpProxy(isHttpProxy);
|
||||
return isHttpProxy;
|
||||
}
|
||||
return appSettings.Network.IsHttpProxy;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置是否开启Http代理
|
||||
/// </summary>
|
||||
/// <param name="isHttpProxy"></param>
|
||||
/// <returns></returns>
|
||||
public bool IsHttpProxy(AllowStatus isHttpProxy)
|
||||
{
|
||||
appSettings.Network.IsHttpProxy = isHttpProxy;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取Http代理的地址
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string GetHttpProxy()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.HttpProxy == null)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetHttpProxy(httpProxy);
|
||||
return httpProxy;
|
||||
}
|
||||
return appSettings.Network.HttpProxy;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置Aria的http代理的地址
|
||||
/// </summary>
|
||||
/// <param name="httpProxy"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetHttpProxy(string httpProxy)
|
||||
{
|
||||
appSettings.Network.HttpProxy = httpProxy;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取Http代理的端口
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public int GetHttpProxyListenPort()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.HttpProxyListenPort == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetHttpProxyListenPort(httpProxyListenPort);
|
||||
return httpProxyListenPort;
|
||||
}
|
||||
return appSettings.Network.HttpProxyListenPort;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置Http代理的端口
|
||||
/// </summary>
|
||||
/// <param name="httpProxyListenPort"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetHttpProxyListenPort(int httpProxyListenPort)
|
||||
{
|
||||
appSettings.Network.HttpProxyListenPort = httpProxyListenPort;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取Aria服务器的token
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string GetAriaToken()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.AriaToken == null)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetHttpProxy(ariaToken);
|
||||
return ariaToken;
|
||||
}
|
||||
return appSettings.Network.AriaToken;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置Aria服务器的token
|
||||
/// </summary>
|
||||
/// <param name="token"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetAriaToken(string token)
|
||||
{
|
||||
appSettings.Network.AriaToken = token;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取Aria服务器的host
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string GetAriaHost()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.AriaHost == null)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetHttpProxy(ariaHost);
|
||||
return ariaHost;
|
||||
}
|
||||
return appSettings.Network.AriaHost;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置Aria服务器的host
|
||||
/// </summary>
|
||||
/// <param name="host"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetAriaHost(string host)
|
||||
{
|
||||
appSettings.Network.AriaHost = host;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取Aria服务器的端口号
|
||||
/// </summary>
|
||||
@@ -67,7 +360,7 @@ namespace DownKyi.Core.Settings
|
||||
public int GetAriaListenPort()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.AriaListenPort == 0)
|
||||
if (appSettings.Network.AriaListenPort == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAriaListenPort(ariaListenPort);
|
||||
@@ -94,7 +387,7 @@ namespace DownKyi.Core.Settings
|
||||
public AriaConfigLogLevel GetAriaLogLevel()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.AriaLogLevel == 0)
|
||||
if (appSettings.Network.AriaLogLevel == AriaConfigLogLevel.NOT_SET)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAriaLogLevel(ariaLogLevel);
|
||||
@@ -114,33 +407,6 @@ namespace DownKyi.Core.Settings
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取Aria最大同时下载数(任务数)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public int GetAriaMaxConcurrentDownloads()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.AriaMaxConcurrentDownloads == 0)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAriaMaxConcurrentDownloads(ariaMaxConcurrentDownloads);
|
||||
return ariaMaxConcurrentDownloads;
|
||||
}
|
||||
return appSettings.Network.AriaMaxConcurrentDownloads;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置Aria最大同时下载数(任务数)
|
||||
/// </summary>
|
||||
/// <param name="ariaMaxConcurrentDownloads"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetAriaMaxConcurrentDownloads(int ariaMaxConcurrentDownloads)
|
||||
{
|
||||
appSettings.Network.AriaMaxConcurrentDownloads = ariaMaxConcurrentDownloads;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取Aria单文件最大线程数
|
||||
/// </summary>
|
||||
@@ -148,7 +414,7 @@ namespace DownKyi.Core.Settings
|
||||
public int GetAriaSplit()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.AriaSplit == 0)
|
||||
if (appSettings.Network.AriaSplit == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAriaSplit(ariaSplit);
|
||||
@@ -175,7 +441,7 @@ namespace DownKyi.Core.Settings
|
||||
public int GetAriaMaxOverallDownloadLimit()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.AriaMaxOverallDownloadLimit == 0)
|
||||
if (appSettings.Network.AriaMaxOverallDownloadLimit == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAriaMaxOverallDownloadLimit(ariaMaxOverallDownloadLimit);
|
||||
@@ -202,7 +468,7 @@ namespace DownKyi.Core.Settings
|
||||
public int GetAriaMaxDownloadLimit()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.AriaMaxDownloadLimit == 0)
|
||||
if (appSettings.Network.AriaMaxDownloadLimit == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAriaMaxDownloadLimit(ariaMaxDownloadLimit);
|
||||
@@ -229,7 +495,7 @@ namespace DownKyi.Core.Settings
|
||||
public AriaConfigFileAllocation GetAriaFileAllocation()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.AriaFileAllocation == 0)
|
||||
if (appSettings.Network.AriaFileAllocation == AriaConfigFileAllocation.NOT_SET)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAriaFileAllocation(ariaFileAllocation);
|
||||
@@ -256,7 +522,7 @@ namespace DownKyi.Core.Settings
|
||||
public AllowStatus IsAriaHttpProxy()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.IsAriaHttpProxy == 0)
|
||||
if (appSettings.Network.IsAriaHttpProxy == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
IsAriaHttpProxy(isAriaHttpProxy);
|
||||
@@ -310,7 +576,7 @@ namespace DownKyi.Core.Settings
|
||||
public int GetAriaHttpProxyListenPort()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Network.AriaHttpProxyListenPort == 0)
|
||||
if (appSettings.Network.AriaHttpProxyListenPort == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAriaHttpProxyListenPort(ariaHttpProxyListenPort);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using DownKyi.Core.FileName;
|
||||
using DownKyi.Core.Settings.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
@@ -8,7 +9,7 @@ namespace DownKyi.Core.Settings
|
||||
public partial class SettingsManager
|
||||
{
|
||||
// 设置优先下载的视频编码
|
||||
private readonly VideoCodecs videoCodecs = VideoCodecs.AVC;
|
||||
private readonly int videoCodecs = 7;
|
||||
|
||||
// 设置优先下载画质
|
||||
private readonly int quality = 120;
|
||||
@@ -28,6 +29,9 @@ namespace DownKyi.Core.Settings
|
||||
// 是否使用默认下载目录,如果是,则每次点击下载选中项时不再询问下载目录
|
||||
private readonly AllowStatus isUseSaveVideoRootPath = AllowStatus.NO;
|
||||
|
||||
// 下载内容
|
||||
private readonly VideoContentSettings videoContent = new VideoContentSettings();
|
||||
|
||||
// 文件命名格式
|
||||
private readonly List<FileNamePart> fileNameParts = new List<FileNamePart>
|
||||
{
|
||||
@@ -44,14 +48,20 @@ namespace DownKyi.Core.Settings
|
||||
FileNamePart.VIDEO_CODEC,
|
||||
};
|
||||
|
||||
// 文件命名中的时间格式
|
||||
private readonly string fileNamePartTimeFormat = "yyyy-MM-dd";
|
||||
|
||||
// 文件命名中的序号格式
|
||||
private readonly OrderFormat orderFormat = OrderFormat.NATURAL;
|
||||
|
||||
/// <summary>
|
||||
/// 获取优先下载的视频编码
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public VideoCodecs GetVideoCodecs()
|
||||
public int GetVideoCodecs()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Video.VideoCodecs == 0)
|
||||
if (appSettings.Video.VideoCodecs == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetVideoCodecs(videoCodecs);
|
||||
@@ -65,7 +75,7 @@ namespace DownKyi.Core.Settings
|
||||
/// </summary>
|
||||
/// <param name="videoCodecs"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetVideoCodecs(VideoCodecs videoCodecs)
|
||||
public bool SetVideoCodecs(int videoCodecs)
|
||||
{
|
||||
appSettings.Video.VideoCodecs = videoCodecs;
|
||||
return SetSettings();
|
||||
@@ -78,7 +88,7 @@ namespace DownKyi.Core.Settings
|
||||
public int GetQuality()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Video.Quality == 0)
|
||||
if (appSettings.Video.Quality == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetQuality(quality);
|
||||
@@ -105,7 +115,7 @@ namespace DownKyi.Core.Settings
|
||||
public int GetAudioQuality()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Video.AudioQuality == 0)
|
||||
if (appSettings.Video.AudioQuality == -1)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetAudioQuality(audioQuality);
|
||||
@@ -132,7 +142,7 @@ namespace DownKyi.Core.Settings
|
||||
public AllowStatus IsTranscodingFlvToMp4()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Video.IsTranscodingFlvToMp4 == 0)
|
||||
if (appSettings.Video.IsTranscodingFlvToMp4 == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
IsTranscodingFlvToMp4(isTranscodingFlvToMp4);
|
||||
@@ -213,7 +223,7 @@ namespace DownKyi.Core.Settings
|
||||
public AllowStatus IsUseSaveVideoRootPath()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Video.IsUseSaveVideoRootPath == 0)
|
||||
if (appSettings.Video.IsUseSaveVideoRootPath == AllowStatus.NONE)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
IsUseSaveVideoRootPath(isUseSaveVideoRootPath);
|
||||
@@ -233,6 +243,33 @@ namespace DownKyi.Core.Settings
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取下载内容
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public VideoContentSettings GetVideoContent()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Video.VideoContent == null)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetVideoContent(videoContent);
|
||||
return videoContent;
|
||||
}
|
||||
return appSettings.Video.VideoContent;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置下载内容
|
||||
/// </summary>
|
||||
/// <param name="videoContent"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetVideoContent(VideoContentSettings videoContent)
|
||||
{
|
||||
appSettings.Video.VideoContent = videoContent;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取文件命名格式
|
||||
/// </summary>
|
||||
@@ -260,5 +297,59 @@ namespace DownKyi.Core.Settings
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取文件命名中的时间格式
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string GetFileNamePartTimeFormat()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Video.FileNamePartTimeFormat == null || appSettings.Video.FileNamePartTimeFormat == string.Empty)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetFileNamePartTimeFormat(fileNamePartTimeFormat);
|
||||
return fileNamePartTimeFormat;
|
||||
}
|
||||
return appSettings.Video.FileNamePartTimeFormat;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置文件命名中的时间格式
|
||||
/// </summary>
|
||||
/// <param name="fileNamePartTimeFormat"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetFileNamePartTimeFormat(string fileNamePartTimeFormat)
|
||||
{
|
||||
appSettings.Video.FileNamePartTimeFormat = fileNamePartTimeFormat;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取文件命名中的序号格式
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public OrderFormat GetOrderFormat()
|
||||
{
|
||||
appSettings = GetSettings();
|
||||
if (appSettings.Video.OrderFormat == OrderFormat.NOT_SET)
|
||||
{
|
||||
// 第一次获取,先设置默认值
|
||||
SetOrderFormat(orderFormat);
|
||||
return orderFormat;
|
||||
}
|
||||
return appSettings.Video.OrderFormat;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置文件命名中的序号格式
|
||||
/// </summary>
|
||||
/// <param name="orderFormat"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetOrderFormat(OrderFormat orderFormat)
|
||||
{
|
||||
appSettings.Video.OrderFormat = orderFormat;
|
||||
return SetSettings();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,9 +57,11 @@ namespace DownKyi.Core.Settings
|
||||
{
|
||||
try
|
||||
{
|
||||
StreamReader streamReader = File.OpenText(settingsName);
|
||||
FileStream fileStream = new FileStream(settingsName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||||
StreamReader streamReader = new StreamReader(fileStream, System.Text.Encoding.UTF8);
|
||||
string jsonWordTemplate = streamReader.ReadToEnd();
|
||||
streamReader.Close();
|
||||
fileStream.Close();
|
||||
|
||||
#if DEBUG
|
||||
#else
|
||||
@@ -71,7 +73,8 @@ namespace DownKyi.Core.Settings
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logging.LogManager.Error(e);
|
||||
Utils.Debugging.Console.PrintLine("GetSettings()发生异常: {0}", e);
|
||||
Logging.LogManager.Error("SettingsManager", e);
|
||||
return new AppSettings();
|
||||
}
|
||||
}
|
||||
@@ -97,7 +100,8 @@ namespace DownKyi.Core.Settings
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logging.LogManager.Error(e);
|
||||
Utils.Debugging.Console.PrintLine("SetSettings()发生异常: {0}", e);
|
||||
Logging.LogManager.Error("SettingsManager", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,8 @@ namespace DownKyi.Core.Storage
|
||||
internal static class Constant
|
||||
{
|
||||
// 根目录
|
||||
private static string Root { get; } = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "/Downkyi";
|
||||
//private static string Root { get; } = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "/Downkyi";
|
||||
private static string Root { get; } = Environment.CurrentDirectory;
|
||||
|
||||
// Aria
|
||||
public static string Aria { get; } = $"{Root}/Aria";
|
||||
|
||||
@@ -1,20 +1,37 @@
|
||||
using System;
|
||||
using DownKyi.Core.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SQLite;
|
||||
|
||||
namespace DownKyi.Core.Storage.Database
|
||||
{
|
||||
public class DbHelper
|
||||
{
|
||||
private readonly string connStr;
|
||||
private readonly SQLiteConnection conn;
|
||||
|
||||
private static readonly Dictionary<string, SQLiteConnection> database = new Dictionary<string, SQLiteConnection>();
|
||||
|
||||
/// <summary>
|
||||
/// 创建一个数据库
|
||||
/// </summary>
|
||||
/// <param name="dbPath"></param>
|
||||
public DbHelper(string dbPath)
|
||||
{
|
||||
string connStr = $"Data Source={dbPath};Version=3;";
|
||||
connStr = $"Data Source={dbPath};Version=3;";
|
||||
|
||||
if (database.ContainsKey(connStr))
|
||||
{
|
||||
conn = database[connStr];
|
||||
|
||||
if (conn != null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
conn = new SQLiteConnection(connStr);
|
||||
database.Add(connStr, conn);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -24,9 +41,21 @@ namespace DownKyi.Core.Storage.Database
|
||||
/// <param name="secretKey"></param>
|
||||
public DbHelper(string dbPath, string secretKey)
|
||||
{
|
||||
string connStr = $"Data Source={dbPath};Version=3;";
|
||||
connStr = $"Data Source={dbPath};Version=3;";
|
||||
|
||||
if (database.ContainsKey(connStr))
|
||||
{
|
||||
conn = database[connStr];
|
||||
|
||||
if (conn != null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
conn = new SQLiteConnection(connStr);
|
||||
conn.SetPassword(secretKey);
|
||||
database.Add(connStr, conn);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -43,6 +72,8 @@ namespace DownKyi.Core.Storage.Database
|
||||
/// </summary>
|
||||
public void Open()
|
||||
{
|
||||
if (conn == null) { return; }
|
||||
|
||||
if (!IsOpen())
|
||||
{
|
||||
conn.Open();
|
||||
@@ -54,9 +85,13 @@ namespace DownKyi.Core.Storage.Database
|
||||
/// </summary>
|
||||
public void Close()
|
||||
{
|
||||
if (conn == null) { return; }
|
||||
|
||||
if (IsOpen())
|
||||
{
|
||||
conn.Close();
|
||||
|
||||
database.Remove(connStr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,21 +101,31 @@ namespace DownKyi.Core.Storage.Database
|
||||
/// <param name="sql"></param>
|
||||
public void ExecuteNonQuery(string sql, Action<SQLiteParameterCollection> action = null)
|
||||
{
|
||||
lock (conn)
|
||||
if (conn == null) { return; }
|
||||
|
||||
try
|
||||
{
|
||||
Open();
|
||||
using (var tr = conn.BeginTransaction())
|
||||
lock (conn)
|
||||
{
|
||||
using (var command = conn.CreateCommand())
|
||||
Open();
|
||||
using (var tr = conn.BeginTransaction())
|
||||
{
|
||||
command.CommandText = sql;
|
||||
// 添加参数
|
||||
action?.Invoke(command.Parameters);
|
||||
command.ExecuteNonQuery();
|
||||
using (var command = conn.CreateCommand())
|
||||
{
|
||||
command.CommandText = sql;
|
||||
// 添加参数
|
||||
action?.Invoke(command.Parameters);
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
tr.Commit();
|
||||
}
|
||||
tr.Commit();
|
||||
}
|
||||
}
|
||||
catch (SQLiteException e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("DbHelper ExecuteNonQuery()发生异常: {0}", e);
|
||||
LogManager.Error("DbHelper ExecuteNonQuery()", e);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -90,16 +135,26 @@ namespace DownKyi.Core.Storage.Database
|
||||
/// <param name="action"></param>
|
||||
public void ExecuteQuery(string sql, Action<SQLiteDataReader> action)
|
||||
{
|
||||
lock (conn)
|
||||
if (conn == null) { return; }
|
||||
|
||||
try
|
||||
{
|
||||
Open();
|
||||
using (var command = conn.CreateCommand())
|
||||
lock (conn)
|
||||
{
|
||||
command.CommandText = sql;
|
||||
var reader = command.ExecuteReader();
|
||||
action(reader);
|
||||
Open();
|
||||
using (var command = conn.CreateCommand())
|
||||
{
|
||||
command.CommandText = sql;
|
||||
var reader = command.ExecuteReader();
|
||||
action(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (SQLiteException e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("DbHelper ExecuteQuery()发生异常: {0}", e);
|
||||
LogManager.Error("DbHelper ExecuteQuery()", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -160,11 +160,11 @@ namespace DownKyi.Core.Storage.Database.Download
|
||||
{
|
||||
Dictionary<string, object> objects = new Dictionary<string, object>();
|
||||
|
||||
try
|
||||
dbHelper.ExecuteQuery(sql, reader =>
|
||||
{
|
||||
dbHelper.ExecuteQuery(sql, reader =>
|
||||
while (reader.Read())
|
||||
{
|
||||
while (reader.Read())
|
||||
try
|
||||
{
|
||||
// 读取字节数组
|
||||
byte[] array = (byte[])reader["data"];
|
||||
@@ -177,18 +177,17 @@ namespace DownKyi.Core.Storage.Database.Download
|
||||
|
||||
objects.Add((string)reader["id"], obj);
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("Query()发生异常: {0}", e);
|
||||
LogManager.Error($"{tableName}", e);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("Query()发生异常: {0}", e);
|
||||
LogManager.Error($"{tableName}", e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return objects;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 如果表不存在则创建表
|
||||
/// </summary>
|
||||
|
||||
@@ -5,6 +5,7 @@ using System;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Windows.Media.Imaging;
|
||||
using WebPSharp;
|
||||
|
||||
namespace DownKyi.Core.Storage
|
||||
{
|
||||
@@ -44,10 +45,38 @@ namespace DownKyi.Core.Storage
|
||||
{
|
||||
if (cover == null) { return null; }
|
||||
|
||||
Bitmap bitmap = new Bitmap(cover);
|
||||
Image thumbnail = bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);
|
||||
try
|
||||
{
|
||||
Bitmap bitmap = new Bitmap(cover);
|
||||
Image thumbnail = bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);
|
||||
|
||||
return StorageUtils.BitmapToBitmapImage(new Bitmap(thumbnail));
|
||||
return StorageUtils.BitmapToBitmapImage(new Bitmap(thumbnail));
|
||||
}
|
||||
catch (ArgumentException)
|
||||
{
|
||||
try
|
||||
{
|
||||
SimpleDecoder simpleDecoder = new SimpleDecoder(cover);
|
||||
Bitmap bitmap = simpleDecoder.WebPtoBitmap();
|
||||
Image thumbnail = bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);
|
||||
|
||||
return StorageUtils.BitmapToBitmapImage(new Bitmap(thumbnail));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("GetCoverThumbnail()发生异常: {0}", ex);
|
||||
LogManager.Error("StorageCover.GetCoverThumbnail()", ex);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("GetCoverThumbnail()发生异常: {0}", e);
|
||||
LogManager.Error("StorageCover.GetCoverThumbnail()", e);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -90,7 +119,7 @@ namespace DownKyi.Core.Storage
|
||||
};
|
||||
coverDb.Update(newCover);
|
||||
|
||||
coverDb.Close();
|
||||
//coverDb.Close();
|
||||
return $"{StorageManager.GetCover()}/{cover.Md5}";
|
||||
}
|
||||
else
|
||||
@@ -108,12 +137,12 @@ namespace DownKyi.Core.Storage
|
||||
};
|
||||
coverDb.Update(newCover);
|
||||
|
||||
coverDb.Close();
|
||||
//coverDb.Close();
|
||||
return $"{StorageManager.GetCover()}/{md5}";
|
||||
}
|
||||
else
|
||||
{
|
||||
coverDb.Close();
|
||||
//coverDb.Close();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -133,12 +162,12 @@ namespace DownKyi.Core.Storage
|
||||
};
|
||||
coverDb.Insert(newCover);
|
||||
|
||||
coverDb.Close();
|
||||
//coverDb.Close();
|
||||
return $"{StorageManager.GetCover()}/{md5}";
|
||||
}
|
||||
else
|
||||
{
|
||||
coverDb.Close();
|
||||
//coverDb.Close();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ using System;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Windows.Media.Imaging;
|
||||
using WebPSharp;
|
||||
|
||||
namespace DownKyi.Core.Storage
|
||||
{
|
||||
@@ -44,10 +45,38 @@ namespace DownKyi.Core.Storage
|
||||
{
|
||||
if (header == null) { return null; }
|
||||
|
||||
var bitmap = new Bitmap(header);
|
||||
var thumbnail = bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);
|
||||
try
|
||||
{
|
||||
Bitmap bitmap = new Bitmap(header);
|
||||
Image thumbnail = bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);
|
||||
|
||||
return StorageUtils.BitmapToBitmapImage(new Bitmap(thumbnail));
|
||||
return StorageUtils.BitmapToBitmapImage(new Bitmap(thumbnail));
|
||||
}
|
||||
catch (ArgumentException)
|
||||
{
|
||||
try
|
||||
{
|
||||
SimpleDecoder simpleDecoder = new SimpleDecoder(header);
|
||||
Bitmap bitmap = simpleDecoder.WebPtoBitmap();
|
||||
Image thumbnail = bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);
|
||||
|
||||
return StorageUtils.BitmapToBitmapImage(new Bitmap(thumbnail));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("GetHeaderThumbnail()发生异常: {0}", ex);
|
||||
LogManager.Error("StorageHeader.GetHeaderThumbnail()", ex);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Utils.Debugging.Console.PrintLine("GetHeaderThumbnail()发生异常: {0}", e);
|
||||
LogManager.Error("StorageHeader.GetHeaderThumbnail()", e);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -58,7 +87,7 @@ namespace DownKyi.Core.Storage
|
||||
public string GetHeader(long mid, string name, string url)
|
||||
{
|
||||
HeaderDb headerDb = new HeaderDb();
|
||||
var header = headerDb.QueryByMid(mid);
|
||||
Header header = headerDb.QueryByMid(mid);
|
||||
|
||||
if (header != null)
|
||||
{
|
||||
@@ -73,7 +102,7 @@ namespace DownKyi.Core.Storage
|
||||
Md5 = header.Md5
|
||||
};
|
||||
headerDb.Update(newHeader);
|
||||
headerDb.Close();
|
||||
//headerDb.Close();
|
||||
return $"{StorageManager.GetHeader()}/{header.Md5}";
|
||||
}
|
||||
else
|
||||
@@ -89,12 +118,12 @@ namespace DownKyi.Core.Storage
|
||||
Md5 = md5
|
||||
};
|
||||
headerDb.Insert(newHeader);
|
||||
headerDb.Close();
|
||||
//headerDb.Close();
|
||||
return $"{StorageManager.GetHeader()}/{md5}";
|
||||
}
|
||||
else
|
||||
{
|
||||
headerDb.Close();
|
||||
//headerDb.Close();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -112,12 +141,12 @@ namespace DownKyi.Core.Storage
|
||||
Md5 = md5
|
||||
};
|
||||
headerDb.Insert(newHeader);
|
||||
headerDb.Close();
|
||||
//headerDb.Close();
|
||||
return $"{StorageManager.GetHeader()}/{md5}";
|
||||
}
|
||||
else
|
||||
{
|
||||
headerDb.Close();
|
||||
//headerDb.Close();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -199,7 +199,22 @@ namespace DownKyi.Core.Utils
|
||||
destName = Regex.Replace(destName, @"\p{C}+", string.Empty);
|
||||
|
||||
// 移除前导和尾部的空白字符、dot符
|
||||
return destName.Trim().TrimStart('.').TrimEnd('.');
|
||||
int i, j;
|
||||
for (i = 0; i < destName.Length; i++)
|
||||
{
|
||||
if (destName[i] != ' ' && destName[i] != '.')
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (j = destName.Length - 1; j >= 0; j--)
|
||||
{
|
||||
if (destName[j] != ' ' && destName[j] != '.')
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return destName.Substring(i, j - i + 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -20,8 +20,8 @@ namespace DownKyi.Core.Utils
|
||||
|
||||
string machineCodeString = "PC." +
|
||||
machineCode.GetMainBordId() + "." +
|
||||
machineCode.GetCpuInfo() + "." +
|
||||
machineCode.GetDiskID();// + "." +
|
||||
machineCode.GetCpuInfo();// + "." +
|
||||
//machineCode.GetDiskID();// + "." +
|
||||
//machineCode.GetMoAddress();
|
||||
return machineCodeString.Replace(" ", "");
|
||||
}
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
<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>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,14 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Brotli.NET" version="2.1.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="Google.Protobuf" version="3.21.12" targetFramework="net472" />
|
||||
<package id="Google.Protobuf.Tools" version="3.21.12" targetFramework="net472" />
|
||||
<package id="Newtonsoft.Json" version="13.0.2" 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.Memory" version="4.5.5" targetFramework="net472" />
|
||||
<package id="System.Numerics.Vectors" version="4.5.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" />
|
||||
<package id="WebPSharp" version="0.5.1" targetFramework="net472" />
|
||||
</packages>
|
||||
@@ -13,17 +13,37 @@ EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Debug|x64.Build.0 = Debug|x64
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Debug|x86.Build.0 = Debug|x86
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Release|x64.ActiveCfg = Release|x64
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Release|x64.Build.0 = Release|x64
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Release|x86.ActiveCfg = Release|x86
|
||||
{97075FCD-6E8F-4FF9-B73A-994197F3765A}.Release|x86.Build.0 = Release|x86
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Debug|x64.Build.0 = Debug|x64
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Debug|x86.Build.0 = Debug|x86
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Release|x64.ActiveCfg = Release|x64
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Release|x64.Build.0 = Release|x64
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Release|x86.ActiveCfg = Release|x86
|
||||
{4FDE0364-F65B-4812-BFE8-34E886624FBD}.Release|x86.Build.0 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
+28
-2
@@ -4,16 +4,20 @@ using DownKyi.Utils;
|
||||
using DownKyi.ViewModels;
|
||||
using DownKyi.ViewModels.Dialogs;
|
||||
using DownKyi.ViewModels.DownloadManager;
|
||||
using DownKyi.ViewModels.Friends;
|
||||
using DownKyi.ViewModels.Settings;
|
||||
using DownKyi.ViewModels.Toolbox;
|
||||
using DownKyi.ViewModels.UserSpace;
|
||||
using DownKyi.Views;
|
||||
using DownKyi.Views.Dialogs;
|
||||
using DownKyi.Views.DownloadManager;
|
||||
using DownKyi.Views.Friends;
|
||||
using DownKyi.Views.Settings;
|
||||
using DownKyi.Views.Toolbox;
|
||||
using DownKyi.Views.UserSpace;
|
||||
using Prism.DryIoc;
|
||||
using Prism.Ioc;
|
||||
using Prism.Services.Dialogs;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
@@ -121,8 +125,22 @@ namespace DownKyi
|
||||
});
|
||||
|
||||
// 启动下载服务
|
||||
downloadService = new AriaDownloadService(DownloadingList, DownloadedList);
|
||||
downloadService.Start();
|
||||
var download = SettingsManager.GetInstance().GetDownloader();
|
||||
switch (download)
|
||||
{
|
||||
case Downloader.NOT_SET:
|
||||
break;
|
||||
case Downloader.BUILT_IN:
|
||||
downloadService = new BuiltinDownloadService(DownloadingList, DownloadedList, (IDialogService)Container.GetContainer().GetService(typeof(IDialogService)));
|
||||
break;
|
||||
case Downloader.ARIA:
|
||||
downloadService = new AriaDownloadService(DownloadingList, DownloadedList, (IDialogService)Container.GetContainer().GetService(typeof(IDialogService)));
|
||||
break;
|
||||
case Downloader.CUSTOM_ARIA:
|
||||
downloadService = new CustomAriaDownloadService(DownloadingList, DownloadedList, (IDialogService)Container.GetContainer().GetService(typeof(IDialogService)));
|
||||
break;
|
||||
}
|
||||
downloadService?.Start();
|
||||
|
||||
return Container.Resolve<MainWindow>();
|
||||
}
|
||||
@@ -166,6 +184,8 @@ namespace DownKyi
|
||||
containerRegistry.RegisterForNavigation<ViewUserSpace>(ViewUserSpaceViewModel.Tag);
|
||||
containerRegistry.RegisterForNavigation<ViewPublication>(ViewPublicationViewModel.Tag);
|
||||
containerRegistry.RegisterForNavigation<Views.ViewChannel>(ViewModels.ViewChannelViewModel.Tag);
|
||||
containerRegistry.RegisterForNavigation<Views.ViewSeasonsSeries>(ViewModels.ViewSeasonsSeriesViewModel.Tag);
|
||||
containerRegistry.RegisterForNavigation<ViewFriends>(ViewFriendsViewModel.Tag);
|
||||
|
||||
containerRegistry.RegisterForNavigation<ViewMySpace>(ViewMySpaceViewModel.Tag);
|
||||
containerRegistry.RegisterForNavigation<ViewMyFavorites>(ViewMyFavoritesViewModel.Tag);
|
||||
@@ -177,6 +197,10 @@ namespace DownKyi
|
||||
containerRegistry.RegisterForNavigation<ViewDownloading>(ViewDownloadingViewModel.Tag);
|
||||
containerRegistry.RegisterForNavigation<ViewDownloadFinished>(ViewDownloadFinishedViewModel.Tag);
|
||||
|
||||
// Friend
|
||||
containerRegistry.RegisterForNavigation<ViewFollowing>(ViewFollowingViewModel.Tag);
|
||||
containerRegistry.RegisterForNavigation<ViewFollower>(ViewFollowerViewModel.Tag);
|
||||
|
||||
// settings pages
|
||||
containerRegistry.RegisterForNavigation<ViewBasic>(ViewBasicViewModel.Tag);
|
||||
containerRegistry.RegisterForNavigation<ViewNetwork>(ViewNetworkViewModel.Tag);
|
||||
@@ -192,8 +216,10 @@ namespace DownKyi
|
||||
// UserSpace
|
||||
containerRegistry.RegisterForNavigation<ViewArchive>(ViewArchiveViewModel.Tag);
|
||||
containerRegistry.RegisterForNavigation<Views.UserSpace.ViewChannel>(ViewModels.UserSpace.ViewChannelViewModel.Tag);
|
||||
containerRegistry.RegisterForNavigation<Views.UserSpace.ViewSeasonsSeries>(ViewModels.UserSpace.ViewSeasonsSeriesViewModel.Tag);
|
||||
|
||||
// dialogs
|
||||
containerRegistry.RegisterDialog<ViewAlertDialog>(ViewAlertDialogViewModel.Tag);
|
||||
containerRegistry.RegisterDialog<ViewDownloadSetter>(ViewDownloadSetterViewModel.Tag);
|
||||
containerRegistry.RegisterDialog<ViewParsingSelector>(ViewParsingSelectorViewModel.Tag);
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace DownKyi
|
||||
{
|
||||
public class AppConstant
|
||||
{
|
||||
public const string ClipboardId = "32ff00b1-1a09-4b25-9ca7-dcb6914b141c";
|
||||
}
|
||||
}
|
||||
@@ -72,7 +72,7 @@
|
||||
<Setter Property="Background" Value="#FFFFFFFF" />
|
||||
<Setter Property="BorderBrush" Value="#FFD7DDE4" />
|
||||
<Setter Property="BorderThickness" Value="1" />
|
||||
<Setter Property="Width" Value="30" />
|
||||
<Setter Property="MinWidth" Value="30" />
|
||||
<Setter Property="Height" Value="30" />
|
||||
<Setter Property="Cursor" Value="Hand" />
|
||||
<Setter Property="Template">
|
||||
@@ -136,6 +136,7 @@
|
||||
Style="{StaticResource pagerButton}"
|
||||
Visibility="{Binding FirstVisibility}">
|
||||
<TextBlock
|
||||
Padding="10,0"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="14"
|
||||
@@ -174,6 +175,7 @@
|
||||
Style="{StaticResource pagerButton}"
|
||||
Visibility="{Binding PreviousSecondVisibility}">
|
||||
<TextBlock
|
||||
Padding="10,0"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="14"
|
||||
@@ -200,6 +202,7 @@
|
||||
Style="{StaticResource pagerButton}"
|
||||
Visibility="{Binding PreviousFirstVisibility}">
|
||||
<TextBlock
|
||||
Padding="10,0"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="14"
|
||||
@@ -239,6 +242,7 @@
|
||||
Style="{StaticResource pagerButton}"
|
||||
Visibility="{Binding NextFirstVisibility}">
|
||||
<TextBlock
|
||||
Padding="10,0"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="14"
|
||||
@@ -265,6 +269,7 @@
|
||||
Style="{StaticResource pagerButton}"
|
||||
Visibility="{Binding NextSecondVisibility}">
|
||||
<TextBlock
|
||||
Padding="10,0"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="14"
|
||||
@@ -303,6 +308,7 @@
|
||||
Style="{StaticResource pagerButton}"
|
||||
Visibility="{Binding LastVisibility}">
|
||||
<TextBlock
|
||||
Padding="10,0"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="14"
|
||||
|
||||
@@ -60,8 +60,9 @@ namespace DownKyi.CustomControl
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value < Current || value < 1)
|
||||
if (value < Current || value < 0)
|
||||
{
|
||||
Visibility = Visibility.Hidden;
|
||||
//throw new Exception("数值不在允许的范围内。");
|
||||
System.Console.WriteLine(value.ToString());
|
||||
}
|
||||
@@ -69,7 +70,7 @@ namespace DownKyi.CustomControl
|
||||
{
|
||||
count = value;
|
||||
|
||||
if (count == 1) { Visibility = Visibility.Hidden; }
|
||||
if (count <= 1) { Visibility = Visibility.Hidden; }
|
||||
else { Visibility = Visibility.Visible; }
|
||||
|
||||
OnCountChanged(count);
|
||||
|
||||
+80
-12
@@ -56,10 +56,27 @@
|
||||
<PropertyGroup>
|
||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
@@ -79,6 +96,7 @@
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
<Compile Include="AppConstant.cs" />
|
||||
<Compile Include="Converter\CountConverter.cs" />
|
||||
<Compile Include="CustomControl\CustomPager.xaml.cs">
|
||||
<DependentUpon>CustomPager.xaml</DependentUpon>
|
||||
@@ -97,13 +115,22 @@
|
||||
<Compile Include="Models\Downloaded.cs" />
|
||||
<Compile Include="Models\Downloading.cs" />
|
||||
<Compile Include="Models\DownloadStatus.cs" />
|
||||
<Compile Include="Models\OrderFormatDisplay.cs" />
|
||||
<Compile Include="Services\AlertService.cs" />
|
||||
<Compile Include="Services\Download\AddToDownloadService.cs" />
|
||||
<Compile Include="Services\Download\CustomAriaDownloadService.cs" />
|
||||
<Compile Include="Services\Download\BuiltinDownloadService.cs" />
|
||||
<Compile Include="Services\Download\DownloadStorageService.cs" />
|
||||
<Compile Include="Services\SearchService.cs" />
|
||||
<Compile Include="ViewModels\Friends\ViewFollowerViewModel.cs" />
|
||||
<Compile Include="ViewModels\Friends\ViewFollowingViewModel.cs" />
|
||||
<Compile Include="Utils\WindowAdaptation.cs" />
|
||||
<Compile Include="ViewModels\Dialogs\ViewAlertDialogViewModel.cs" />
|
||||
<Compile Include="ViewModels\PageViewModels\BangumiFollowMedia.cs" />
|
||||
<Compile Include="ViewModels\PageViewModels\Favorites.cs" />
|
||||
<Compile Include="ViewModels\PageViewModels\FavoritesMedia.cs" />
|
||||
<Compile Include="ViewModels\PageViewModels\ChannelMedia.cs" />
|
||||
<Compile Include="ViewModels\PageViewModels\FriendInfo.cs" />
|
||||
<Compile Include="ViewModels\PageViewModels\HistoryMedia.cs" />
|
||||
<Compile Include="ViewModels\PageViewModels\PublicationMedia.cs" />
|
||||
<Compile Include="ViewModels\PageViewModels\SpaceItem.cs" />
|
||||
@@ -142,15 +169,19 @@
|
||||
<Compile Include="ViewModels\DownloadManager\ViewDownloadingViewModel.cs" />
|
||||
<Compile Include="ViewModels\Toolbox\ViewBiliHelperViewModel.cs" />
|
||||
<Compile Include="ViewModels\Toolbox\ViewDelogoViewModel.cs" />
|
||||
<Compile Include="ViewModels\UserSpace\SeasonsSeries.cs" />
|
||||
<Compile Include="ViewModels\UserSpace\Channel.cs" />
|
||||
<Compile Include="ViewModels\UserSpace\PublicationZone.cs" />
|
||||
<Compile Include="ViewModels\UserSpace\ViewSeasonsSeriesViewModel.cs" />
|
||||
<Compile Include="ViewModels\UserSpace\ViewChannelViewModel.cs" />
|
||||
<Compile Include="ViewModels\UserSpace\ViewArchiveViewModel.cs" />
|
||||
<Compile Include="ViewModels\UserSpace\TabLeftBanner.cs" />
|
||||
<Compile Include="ViewModels\UserSpace\TabRightBanner.cs" />
|
||||
<Compile Include="ViewModels\ViewSeasonsSeriesViewModel.cs" />
|
||||
<Compile Include="ViewModels\ViewChannelViewModel.cs" />
|
||||
<Compile Include="ViewModels\ViewDownloadManagerViewModel.cs" />
|
||||
<Compile Include="ViewModels\Toolbox\ViewExtractMediaViewModel.cs" />
|
||||
<Compile Include="ViewModels\ViewFriendsViewModel.cs" />
|
||||
<Compile Include="ViewModels\ViewIndexViewModel.cs" />
|
||||
<Compile Include="ViewModels\ViewLoginViewModel.cs" />
|
||||
<Compile Include="ViewModels\Settings\ViewNetworkViewModel.cs" />
|
||||
@@ -167,6 +198,9 @@
|
||||
<Compile Include="ViewModels\ViewUserSpaceViewModel.cs" />
|
||||
<Compile Include="ViewModels\ViewVideoDetailViewModel.cs" />
|
||||
<Compile Include="ViewModels\Settings\ViewVideoViewModel.cs" />
|
||||
<Compile Include="Views\Dialogs\ViewAlertDialog.xaml.cs">
|
||||
<DependentUpon>ViewAlertDialog.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\Dialogs\ViewDownloadSetter.xaml.cs">
|
||||
<DependentUpon>ViewDownloadSetter.xaml</DependentUpon>
|
||||
</Compile>
|
||||
@@ -179,6 +213,12 @@
|
||||
<Compile Include="Views\DownloadManager\ViewDownloading.xaml.cs">
|
||||
<DependentUpon>ViewDownloading.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\Friends\ViewFollower.xaml.cs">
|
||||
<DependentUpon>ViewFollower.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\Friends\ViewFollowing.xaml.cs">
|
||||
<DependentUpon>ViewFollowing.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\Settings\ViewAbout.xaml.cs">
|
||||
<DependentUpon>ViewAbout.xaml</DependentUpon>
|
||||
</Compile>
|
||||
@@ -209,15 +249,24 @@
|
||||
<Compile Include="Views\UserSpace\ViewArchive.xaml.cs">
|
||||
<DependentUpon>ViewArchive.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\UserSpace\ViewSeasonsSeries.xaml.cs">
|
||||
<DependentUpon>ViewSeasonsSeries.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\UserSpace\ViewChannel.xaml.cs">
|
||||
<DependentUpon>ViewChannel.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ViewSeasonsSeries.xaml.cs">
|
||||
<DependentUpon>ViewSeasonsSeries.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ViewChannel.xaml.cs">
|
||||
<DependentUpon>ViewChannel.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ViewDownloadManager.xaml.cs">
|
||||
<DependentUpon>ViewDownloadManager.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ViewFriends.xaml.cs">
|
||||
<DependentUpon>ViewFriends.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ViewIndex.xaml.cs">
|
||||
<DependentUpon>ViewIndex.xaml</DependentUpon>
|
||||
</Compile>
|
||||
@@ -325,6 +374,10 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\Dialogs\ViewAlertDialog.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\Dialogs\ViewDownloadSetter.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
@@ -341,6 +394,14 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\Friends\ViewFollower.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\Friends\ViewFollowing.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\MainWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
@@ -397,10 +458,18 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\UserSpace\ViewSeasonsSeries.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Views\UserSpace\ViewChannel.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ViewSeasonsSeries.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Views\ViewChannel.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
@@ -409,6 +478,10 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ViewFriends.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ViewIndex.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
@@ -488,6 +561,9 @@
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json">
|
||||
<Version>13.0.2</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Prism.DryIoc" Version="8.1.97" />
|
||||
<PackageReference Include="System.Data.SQLite.Core">
|
||||
<Version>1.0.112.2</Version>
|
||||
@@ -500,6 +576,10 @@
|
||||
<Resource Include="Resources\default_header.jpg" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Brotli.Core\Brotli.Core.csproj">
|
||||
<Project>{3107CD63-E257-455E-AE81-1FD3582B067A}</Project>
|
||||
<Name>Brotli.Core</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\DownKyi.Core\DownKyi.Core.csproj">
|
||||
<Project>{4fde0364-f65b-4812-bfe8-34e886624fbd}</Project>
|
||||
<Name>DownKyi.Core</Name>
|
||||
@@ -530,18 +610,6 @@
|
||||
<Resource Include="Resources\no-data.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="aria2c.exe">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="aria2_COPYING.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="ffmpeg.exe">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="FFmpeg_LICENSE.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Resource Include="Resources\checked.png" />
|
||||
<Resource Include="Resources\nodata02.png" />
|
||||
<Resource Include="Resources\backgound\9-绿荫秘境.png" />
|
||||
|
||||
@@ -1,165 +0,0 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
||||
@@ -1,4 +1,6 @@
|
||||
namespace DownKyi.Images
|
||||
using DownKyi.ViewModels.UserSpace;
|
||||
|
||||
namespace DownKyi.Images
|
||||
{
|
||||
public class NormalIcon
|
||||
{
|
||||
@@ -267,6 +269,46 @@
|
||||
Fill = "#FF000000"
|
||||
};
|
||||
|
||||
Channel1 = new VectorImage
|
||||
{
|
||||
Height = 24,
|
||||
Width = 24,
|
||||
Data = @"M116.57 0 q-30.86 0 -57.71 16 q-26.85 16 -42.85 42.85 q-16 26.85 -16 57.71 l0 468.57 q0 30.86 16 57.72
|
||||
q16 26.86 42.85 42.86 q26.85 16 57.71 16 l643.43 0 q32 0 58.86 -16 q26.86 -16 42.86 -42.86
|
||||
q16 -26.86 16 -57.72 l0 -468.57 q0 -30.86 -16 -57.71 q-16 -26.85 -42.86 -42.85 q-26.86 -16 -58.86 -16
|
||||
l-643.43 0 ZM262.86 848 q-40 0 -72.57 -25.71 q-32.58 -25.72 -39.43 -62.29 l697.14 0 q36.57 0 62.29 -25.71
|
||||
q25.71 -25.72 25.71 -62.29 l0 -521.14 q37.71 11.43 62.86 42.28 q25.14 30.86 25.14 69.72 l0 468.57
|
||||
q0 30.86 -16 57.72 q-16 26.86 -42.86 42.86 q-26.86 16 -58.86 16 l-643.43 0 ZM88 174.86
|
||||
q0 -36.57 25.14 -62.29 q25.14 -25.71 61.72 -25.71 l526.85 0 q36.58 0 62.29 25.71 q25.71 25.72 25.71 62.29
|
||||
l0 350.85 q0 36.58 -25.71 62.29 q-25.71 25.71 -62.29 25.71 l-526.85 0 q-36.57 0 -61.72 -25.71
|
||||
q-25.14 -25.71 -25.14 -62.29 l0 -350.85 ZM609.14 374.86 q11.43 -6.86 11.43 -22.29 q0 -15.43 -11.43 -26.86
|
||||
l-214.85 -146.28 q-13.72 -10.29 -28.57 -1.72 q-14.86 8.58 -14.86 26.86 l0 297.14 q0 18.29 14.86 26.86
|
||||
q14.85 8.57 28.57 -2.86 l214.85 -150.85 Z",
|
||||
Fill = "#FF000000"
|
||||
};
|
||||
|
||||
SeasonsSeries = new VectorImage
|
||||
{
|
||||
Height = 24,
|
||||
Width = 24,
|
||||
Data = @"M974.2 382.22 l-401.47 177.37 q-28.88 13.75 -60.5 13.75 q-31.62 0 -60.5 -13.75 l-400.09 -177.37
|
||||
q-20.63 -11 -33 -30.25 q-12.38 -19.25 -13.06 -43.31 q-0.68 -24.06 10.32 -45.38 q11 -21.32 31.62 -35.07
|
||||
l402.85 -210.36 q28.87 -17.87 63.25 -17.87 q34.38 0 63.25 19.25 l398.72 207.61 q22 12.37 33.69 34.37
|
||||
q11.68 22 10.31 46.06 q-1.38 24.06 -13.06 44 q-11.69 19.94 -32.31 30.94 ZM939.83 292.86 l-400.1 -207.62
|
||||
q-11 -8.25 -24.75 -9.62 q-16.5 1.37 -30.25 9.62 l-400.1 207.62 q-2.75 6.87 -2.75 12.37 q0 5.5 4.13 9.62
|
||||
l397.35 175.99 q20.62 9.63 28.18 9.63 q7.56 0 26.81 -8.25 l404.22 -178.74 q1.38 -11 -4.12 -20.62
|
||||
l1.38 0 ZM20.01 512.84 q8.25 -4.12 19.25 -4.12 q11 0 19.25 5.5 q16.5 9.62 39.87 20.62 l413.85 186.99
|
||||
l394.6 -178.74 l60.49 -30.25 q9.63 -4.12 19.94 -4.12 q10.31 0 19.25 5.5 q8.94 5.5 13.75 15.12
|
||||
q4.81 9.63 3.43 19.25 q-1.37 23.37 -21.99 31.62 l-64.62 31.62 l-424.85 193.87 l-422.1 -192.49
|
||||
q-35.74 -12.38 -68.74 -33 q-9.63 -5.5 -15.13 -14.43 q-5.5 -8.94 -6.18 -19.25 q-0.69 -10.32 4.82 -19.25
|
||||
q5.5 -8.94 15.12 -14.44 l0 0 ZM58.51 732.83 q17.87 9.62 41.25 20.62 l412.47 186.99 l394.6 -178.74
|
||||
l60.49 -30.25 q9.63 -5.5 19.94 -4.81 q10.31 0.69 19.25 6.18 q8.94 5.5 13.75 15.12 q4.81 9.63 3.43 19.94
|
||||
q-1.37 10.32 -6.87 18.57 q-5.5 8.25 -15.12 12.37 l-64.62 31.62 l-424.85 192.49 l-422.1 -191.11
|
||||
q-35.74 -13.75 -68.74 -34.37 q-13.75 -6.88 -17.88 -22 q-4.13 -15.13 3.44 -28.87 q7.56 -13.75 22.68 -17.87
|
||||
q15.13 -4.13 28.88 4.13 Z",
|
||||
Fill = "#FF000000"
|
||||
};
|
||||
|
||||
PlatformIpad = new VectorImage
|
||||
{
|
||||
Height = 16,
|
||||
@@ -357,6 +399,8 @@
|
||||
|
||||
public VectorImage VideoUp { get; private set; }
|
||||
public VectorImage Channel { get; private set; }
|
||||
public VectorImage Channel1 { get; private set; }
|
||||
public VectorImage SeasonsSeries { get; private set; }
|
||||
|
||||
public VectorImage PlatformIpad { get; private set; }
|
||||
public VectorImage PlatformMobile { get; private set; }
|
||||
|
||||
@@ -65,6 +65,34 @@
|
||||
l1.8-2.2c0-0.1,0-0.5-0.1-0.8l-3.1-3.6C29.7,17.1,29.5,17,29.2,17z",
|
||||
Fill = "#FF000000"
|
||||
};
|
||||
|
||||
Info = new VectorImage
|
||||
{
|
||||
Height = 20,
|
||||
Width = 20,
|
||||
Data = @"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0
|
||||
18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z",
|
||||
Fill = "#FF00bcf2"
|
||||
};
|
||||
|
||||
Warning = new VectorImage
|
||||
{
|
||||
Height = 20,
|
||||
Width = 20,
|
||||
Data = @"M12 5.99L19.53 19H4.47L12 5.99M2.74 18c-.77 1.33.19 3 1.73 3h15.06c1.54 0 2.5-1.67 1.73-3L13.73
|
||||
4.99c-.77-1.33-2.69-1.33-3.46 0L2.74 18zM11 11v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1zm0 5h2v2h-2z",
|
||||
Fill = "#FFffb900"
|
||||
};
|
||||
|
||||
Error = new VectorImage
|
||||
{
|
||||
Height = 20,
|
||||
Width = 20,
|
||||
Data = @"M12 7c.55 0 1 .45 1 1v4c0 .55-.45 1-1 1s-1-.45-1-1V8c0-.55.45-1 1-1zm-.01-5C6.47 2 2 6.48 2 12s4.47
|
||||
10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8
|
||||
8-3.58 8-8 8zm1-3h-2v-2h2v2z",
|
||||
Fill = "#FFd83b01"
|
||||
};
|
||||
}
|
||||
|
||||
public VectorImage Close { get; private set; }
|
||||
@@ -72,5 +100,9 @@
|
||||
public VectorImage Minimize { get; private set; }
|
||||
public VectorImage Restore { get; private set; }
|
||||
public VectorImage Skin { get; private set; }
|
||||
|
||||
public VectorImage Info { get; private set; }
|
||||
public VectorImage Warning { get; private set; }
|
||||
public VectorImage Error { get; private set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
<system:String x:Key="AllPublicationZones">全部</system:String>
|
||||
<system:String x:Key="Publication">投稿视频</system:String>
|
||||
<system:String x:Key="Channel">频道</system:String>
|
||||
<system:String x:Key="SeasonsSeries">合集和列表</system:String>
|
||||
<system:String x:Key="UserSpaceWait">请稍等,马上就好~</system:String>
|
||||
|
||||
<!-- PublicFavorites -->
|
||||
@@ -96,6 +97,17 @@
|
||||
<system:String x:Key="DownloadAllPublication">下载全部</system:String>
|
||||
<system:String x:Key="PublicationWait">请稍等,马上就好~</system:String>
|
||||
|
||||
<!-- Friend -->
|
||||
<system:String x:Key="Friend">好友</system:String>
|
||||
<system:String x:Key="FriendFollowing">关注</system:String>
|
||||
<system:String x:Key="FriendFollower">粉丝</system:String>
|
||||
|
||||
<system:String x:Key="FollowingWait">请稍等,马上就好~</system:String>
|
||||
<system:String x:Key="FollowerWait">请稍等,马上就好~</system:String>
|
||||
|
||||
<system:String x:Key="AllFollowing">全部关注</system:String>
|
||||
<system:String x:Key="WhisperFollowing">悄悄关注</system:String>
|
||||
|
||||
<!-- VideoDetail -->
|
||||
<system:String x:Key="CopyCover">复制封面图片</system:String>
|
||||
<system:String x:Key="CopyCoverUrl">复制封面URL</system:String>
|
||||
@@ -123,6 +135,8 @@
|
||||
<system:String x:Key="VideoCodec">视频编码</system:String>
|
||||
|
||||
<system:String x:Key="SelectAll">全选</system:String>
|
||||
<system:String x:Key="Search">搜索</system:String>
|
||||
<system:String x:Key="SearchVideoByName">搜索视频名称</system:String>
|
||||
<system:String x:Key="Parse">解析</system:String>
|
||||
<system:String x:Key="ParseVideo">解析视频</system:String>
|
||||
<system:String x:Key="DownloadSelected">下载选中项</system:String>
|
||||
@@ -180,19 +194,30 @@
|
||||
<system:String x:Key="ListenClipboard">监听剪贴板</system:String>
|
||||
<system:String x:Key="VideoAutoParse">视频自动解析</system:String>
|
||||
<system:String x:Key="VideoParseScope">视频解析范围:</system:String>
|
||||
<system:String x:Key="AutoDownloadAll">解析后自动下载已解析视频</system:String>
|
||||
|
||||
<system:String x:Key="Network">网络</system:String>
|
||||
<system:String x:Key="UseSSL">启用https(若下载器提示SSL错误,则关闭此项)</system:String>
|
||||
<system:String x:Key="UserAgent">UserAgent:</system:String>
|
||||
<system:String x:Key="SelectDownloader">选择下载器(重启生效):</system:String>
|
||||
<system:String x:Key="BuiltinDownloader">内建下载器(测试)</system:String>
|
||||
<system:String x:Key="Aria2cDownloader">Aria2下载器</system:String>
|
||||
<system:String x:Key="CustomAria2cDownloader">自定义Aria2下载器</system:String>
|
||||
<system:String x:Key="AriaServerHost">Aria服务器地址:</system:String>
|
||||
<system:String x:Key="AriaServerPort">Aria服务器端口:</system:String>
|
||||
<system:String x:Key="AriaServerToken">Aria服务器Token:</system:String>
|
||||
<system:String x:Key="AriaLogLevel">Aria日志等级:</system:String>
|
||||
<system:String x:Key="AriaMaxConcurrentDownloads">Aria同时下载数:</system:String>
|
||||
<system:String x:Key="AriaSplit">Aria最大线程数:</system:String>
|
||||
<system:String x:Key="AriaDownloadLimit">Aria下载速度限制(KB/s)</system:String>
|
||||
<system:String x:Key="AriaMaxOverallDownloadLimit">全局下载速度限制[0: 无限制]</system:String>
|
||||
<system:String x:Key="AriaMaxDownloadLimit">单任务下载速度限制[0: 无限制]</system:String>
|
||||
<system:String x:Key="IsAriaHttpProxy">使用Http代理</system:String>
|
||||
<system:String x:Key="AriaHttpProxy">代理地址:</system:String>
|
||||
<system:String x:Key="AriaHttpProxyPort">端口:</system:String>
|
||||
<system:String x:Key="AriaFileAllocation">Aria文件预分配:</system:String>
|
||||
<system:String x:Key="IsHttpProxy">使用Http代理</system:String>
|
||||
<system:String x:Key="HttpProxy">代理地址:</system:String>
|
||||
<system:String x:Key="HttpProxyPort">端口:</system:String>
|
||||
<system:String x:Key="MaxCurrentDownloads">同时下载数:</system:String>
|
||||
<system:String x:Key="Split">最大线程数:</system:String>
|
||||
|
||||
<system:String x:Key="Video">视频</system:String>
|
||||
<system:String x:Key="FirstVideoCodecs">优先下载的视频编码:</system:String>
|
||||
@@ -219,6 +244,10 @@
|
||||
<system:String x:Key="DisplayUpMid">UP主ID</system:String>
|
||||
<system:String x:Key="DisplayUpName">UP主昵称</system:String>
|
||||
<system:String x:Key="Reset">恢复默认</system:String>
|
||||
<system:String x:Key="FileNameTimeFormat">时间格式:</system:String>
|
||||
<system:String x:Key="OrderFormat">序号格式:</system:String>
|
||||
<system:String x:Key="OrderFormatNatural">自然数</system:String>
|
||||
<system:String x:Key="OrderFormatLeadingZeros">前导零填充</system:String>
|
||||
|
||||
<system:String x:Key="SettingDanmaku">弹幕</system:String>
|
||||
<system:String x:Key="FilterType">按类型屏蔽</system:String>
|
||||
@@ -288,15 +317,26 @@
|
||||
<system:String x:Key="ExtractVideo">提取视频</system:String>
|
||||
|
||||
<!-- Dialog -->
|
||||
<system:String x:Key="Info">信息</system:String>
|
||||
<system:String x:Key="Warning">警告</system:String>
|
||||
<system:String x:Key="Error">错误</system:String>
|
||||
|
||||
<system:String x:Key="Allow">确定</system:String>
|
||||
<system:String x:Key="Cancel">取消</system:String>
|
||||
|
||||
<system:String x:Key="ConfirmReboot">此项需重启生效,您确定要重新启动吗?</system:String>
|
||||
<system:String x:Key="ConfirmDelete">您确定要删除吗?</system:String>
|
||||
<system:String x:Key="SelectDirectory">请选择文件夹</system:String>
|
||||
|
||||
<system:String x:Key="DirectoryError">路径错误!</system:String>
|
||||
|
||||
<!-- ViewDownloadSetter -->
|
||||
<system:String x:Key="DownloadSetter">下载设置</system:String>
|
||||
<system:String x:Key="Location">位置:</system:String>
|
||||
<system:String x:Key="Browse">浏览</system:String>
|
||||
<system:String x:Key="HardDiskFreeSpace">盘剩余空间:</system:String>
|
||||
<system:String x:Key="DownloadContent">下载内容:</system:String>
|
||||
<system:String x:Key="DownloadContent2">下载内容</system:String>
|
||||
<system:String x:Key="DownloadAll">所有</system:String>
|
||||
<system:String x:Key="DownloadAudio">音频</system:String>
|
||||
<system:String x:Key="DownloadVideo">视频</system:String>
|
||||
@@ -307,6 +347,7 @@
|
||||
<system:String x:Key="IsDefaultDownloadDirectoryTip">选中后下次将不会弹出此窗口</system:String>
|
||||
<system:String x:Key="Download">下载</system:String>
|
||||
<system:String x:Key="WarningNullDirectory">文件夹路径不能为空</system:String>
|
||||
<system:String x:Key="DriveNotFound">该磁盘不存在</system:String>
|
||||
|
||||
<!-- ViewParsingSelector -->
|
||||
<system:String x:Key="ParsingSelector">选择解析项</system:String>
|
||||
|
||||
@@ -56,7 +56,9 @@
|
||||
<system:String x:Key="AudioQuality">音质</system:String>
|
||||
<system:String x:Key="VideoQuality">画质</system:String>
|
||||
<system:String x:Key="VideoCodec">视频编码</system:String>
|
||||
|
||||
|
||||
<system:String x:Key="Search">搜索</system:String>
|
||||
<system:String x:Key="SearchVideoByName">搜索视频名称</system:String>
|
||||
<system:String x:Key="SelectAll">全选</system:String>
|
||||
<system:String x:Key="Parse">解析</system:String>
|
||||
<system:String x:Key="ParseVideo">解析视频</system:String>
|
||||
|
||||
@@ -58,6 +58,8 @@
|
||||
<system:String x:Key="VideoQuality">画质</system:String>
|
||||
<system:String x:Key="VideoCodec">视频编码</system:String>
|
||||
|
||||
<system:String x:Key="Search">搜索</system:String>
|
||||
<system:String x:Key="SearchVideoByName">搜索视频名称</system:String>
|
||||
<system:String x:Key="SelectAll">全选</system:String>
|
||||
<system:String x:Key="Parse">解析</system:String>
|
||||
<system:String x:Key="ParseVideo">解析视频</system:String>
|
||||
|
||||
@@ -58,6 +58,8 @@
|
||||
<system:String x:Key="VideoQuality">画质</system:String>
|
||||
<system:String x:Key="VideoCodec">视频编码</system:String>
|
||||
|
||||
<system:String x:Key="Search">搜索</system:String>
|
||||
<system:String x:Key="SearchVideoByName">搜索视频名称</system:String>
|
||||
<system:String x:Key="SelectAll">全选</system:String>
|
||||
<system:String x:Key="Parse">解析</system:String>
|
||||
<system:String x:Key="ParseVideo">解析视频</system:String>
|
||||
|
||||
@@ -1,15 +1,53 @@
|
||||
namespace DownKyi.Models
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class AppInfo
|
||||
{
|
||||
public string Name { get; } = "哔哩下载姬";
|
||||
public int VersionCode { get; } = 502;
|
||||
public int VersionCode { get; }
|
||||
public string VersionName { get; }
|
||||
|
||||
const int a = 1;
|
||||
const int b = 5;
|
||||
const int c = 8;
|
||||
|
||||
public AppInfo()
|
||||
{
|
||||
VersionCode = a * 10000 + b * 100 + c;
|
||||
|
||||
#if DEBUG
|
||||
public string VersionName { get; } = "1.5.0-alpha3 Debug";
|
||||
VersionName = $"{a}.{b}.{c}-debug";
|
||||
#else
|
||||
public string VersionName { get; } = "1.5.0-alpha3";
|
||||
VersionName = $"{a}.{b}.{c}";
|
||||
#endif
|
||||
}
|
||||
|
||||
public static int VersionNameToCode(string versionName)
|
||||
{
|
||||
int code = 0;
|
||||
|
||||
var isMatch = Regex.IsMatch(versionName, @"^v?([1-9]\d|\d).([1-9]\d|\d).([1-9]\d|\d)$");
|
||||
if (!isMatch)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
string pattern = @"([1-9]\d|\d)";
|
||||
var m = Regex.Matches(versionName, pattern);
|
||||
if (m.Count == 3)
|
||||
{
|
||||
int i = 2;
|
||||
foreach (var item in m)
|
||||
{
|
||||
code += int.Parse(item.ToString()) * (int)Math.Pow(100, i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
using DownKyi.Core.FileName;
|
||||
using Prism.Mvvm;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class DisplayFileNamePart : BindableBase
|
||||
{
|
||||
public FileNamePart Id { get; set; }
|
||||
|
||||
private string title;
|
||||
public string Title
|
||||
{
|
||||
get => title;
|
||||
set => SetProperty(ref title, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,125 +0,0 @@
|
||||
using DownKyi.Core.BiliApi.BiliUtils;
|
||||
using Prism.Mvvm;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class DownloadBaseItem : BindableBase
|
||||
{
|
||||
public DownloadBaseItem()
|
||||
{
|
||||
// 唯一id
|
||||
Uuid = Guid.NewGuid().ToString("N");
|
||||
|
||||
// 初始化需要下载的内容
|
||||
NeedDownloadContent = new Dictionary<string, bool>
|
||||
{
|
||||
{ "downloadAudio", true },
|
||||
{ "downloadVideo", true },
|
||||
{ "downloadDanmaku", true },
|
||||
{ "downloadSubtitle", true },
|
||||
{ "downloadCover", true }
|
||||
};
|
||||
}
|
||||
|
||||
// 此条下载项的id
|
||||
public string Uuid { get; }
|
||||
|
||||
// 需要下载的内容
|
||||
public Dictionary<string, bool> NeedDownloadContent { get; private set; }
|
||||
|
||||
// 视频的id
|
||||
public string Bvid { get; set; }
|
||||
public long Avid { get; set; }
|
||||
public long Cid { get; set; }
|
||||
public long EpisodeId { get; set; }
|
||||
|
||||
// 视频封面的url
|
||||
public string CoverUrl { get; set; }
|
||||
|
||||
// 视频page的封面的url
|
||||
public string PageCoverUrl { get; set; }
|
||||
|
||||
private DrawingImage zoneImage;
|
||||
public DrawingImage ZoneImage
|
||||
{
|
||||
get => zoneImage;
|
||||
set => SetProperty(ref zoneImage, value);
|
||||
}
|
||||
|
||||
// 视频序号
|
||||
private int order;
|
||||
public int Order
|
||||
{
|
||||
get => order;
|
||||
set => SetProperty(ref order, value);
|
||||
}
|
||||
|
||||
// 视频主标题
|
||||
private string mainTitle;
|
||||
public string MainTitle
|
||||
{
|
||||
get => mainTitle;
|
||||
set => SetProperty(ref mainTitle, value);
|
||||
}
|
||||
|
||||
// 视频标题
|
||||
private string name;
|
||||
public string Name
|
||||
{
|
||||
get => name;
|
||||
set => SetProperty(ref name, value);
|
||||
}
|
||||
|
||||
// 时长
|
||||
private string duration;
|
||||
public string Duration
|
||||
{
|
||||
get => duration;
|
||||
set => SetProperty(ref duration, value);
|
||||
}
|
||||
|
||||
// 视频编码
|
||||
// "hev1.2.4.L156.90"
|
||||
// "avc1.640034"
|
||||
//public string VideoCodecId { get; set; }
|
||||
|
||||
// 视频编码名称,AVC、HEVC
|
||||
private string videoCodecName;
|
||||
public string VideoCodecName
|
||||
{
|
||||
get => videoCodecName;
|
||||
set => SetProperty(ref videoCodecName, value);
|
||||
}
|
||||
|
||||
// 视频画质
|
||||
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; }
|
||||
|
||||
// 文件大小
|
||||
private string fileSize;
|
||||
public string FileSize
|
||||
{
|
||||
get => fileSize;
|
||||
set => SetProperty(ref fileSize, value);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class DownloadedItem : DownloadBaseItem
|
||||
{
|
||||
public DownloadedItem() : base()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using DownKyi.Core.BiliApi.VideoStream;
|
||||
using DownKyi.Core.BiliApi.VideoStream;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace DownKyi.Models
|
||||
{
|
||||
// 初始化下载的文件列表
|
||||
DownloadFiles = new Dictionary<string, string>();
|
||||
DownloadedFiles = new List<string>();
|
||||
}
|
||||
|
||||
// Aria相关
|
||||
@@ -19,6 +20,9 @@ namespace DownKyi.Models
|
||||
// 下载的文件
|
||||
public Dictionary<string, string> DownloadFiles { get; set; }
|
||||
|
||||
// 已下载的文件
|
||||
public List<string> DownloadedFiles { get; set; }
|
||||
|
||||
// 视频类别
|
||||
public PlayStreamType PlayStreamType { get; set; }
|
||||
|
||||
|
||||
@@ -1,165 +0,0 @@
|
||||
using DownKyi.Core.BiliApi.VideoStream.Models;
|
||||
using DownKyi.Images;
|
||||
using DownKyi.Utils;
|
||||
using Prism.Commands;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class DownloadingItem : DownloadBaseItem
|
||||
{
|
||||
public DownloadingItem() : base()
|
||||
{
|
||||
// 初始化下载的文件列表
|
||||
DownloadFiles = new List<string>();
|
||||
|
||||
// 暂停继续按钮
|
||||
StartOrPause = ButtonIcon.Instance().Pause;
|
||||
StartOrPause.Fill = DictionaryResource.GetColor("ColorPrimary");
|
||||
|
||||
// 删除按钮
|
||||
Delete = ButtonIcon.Instance().Delete;
|
||||
Delete.Fill = DictionaryResource.GetColor("ColorPrimary");
|
||||
}
|
||||
|
||||
public PlayUrl PlayUrl { get; set; }
|
||||
|
||||
// Aria相关
|
||||
public string Gid { get; set; }
|
||||
|
||||
// 下载的文件
|
||||
public List<string> DownloadFiles { get; private set; }
|
||||
|
||||
// 视频类别
|
||||
public PlayStreamType PlayStreamType { get; set; }
|
||||
|
||||
|
||||
// 正在下载内容(音频、视频、弹幕、字幕、封面)
|
||||
private string downloadContent;
|
||||
public string DownloadContent
|
||||
{
|
||||
get => downloadContent;
|
||||
set => SetProperty(ref downloadContent, value);
|
||||
}
|
||||
|
||||
// 下载状态
|
||||
public DownloadStatus DownloadStatus { get; set; }
|
||||
|
||||
// 下载状态显示
|
||||
private string downloadStatusTitle;
|
||||
public string DownloadStatusTitle
|
||||
{
|
||||
get => downloadStatusTitle;
|
||||
set => SetProperty(ref downloadStatusTitle, value);
|
||||
}
|
||||
|
||||
// 下载进度
|
||||
private float progress;
|
||||
public float Progress
|
||||
{
|
||||
get => progress;
|
||||
set => SetProperty(ref progress, value);
|
||||
}
|
||||
|
||||
// 已下载大小/文件大小
|
||||
private string downloadingFileSize;
|
||||
public string DownloadingFileSize
|
||||
{
|
||||
get => downloadingFileSize;
|
||||
set => SetProperty(ref downloadingFileSize, value);
|
||||
}
|
||||
|
||||
// 下载的最高速度
|
||||
public long MaxSpeed { get; set; }
|
||||
|
||||
// 下载速度
|
||||
private string speedDisplay;
|
||||
public string SpeedDisplay
|
||||
{
|
||||
get => speedDisplay;
|
||||
set => SetProperty(ref speedDisplay, value);
|
||||
}
|
||||
|
||||
|
||||
#region 控制按钮
|
||||
|
||||
private VectorImage startOrPause;
|
||||
public VectorImage StartOrPause
|
||||
{
|
||||
get => startOrPause;
|
||||
set => SetProperty(ref startOrPause, value);
|
||||
}
|
||||
|
||||
private VectorImage delete;
|
||||
public VectorImage Delete
|
||||
{
|
||||
get => delete;
|
||||
set => SetProperty(ref delete, value);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 命令申明
|
||||
|
||||
// 下载列表暂停继续事件
|
||||
private DelegateCommand startOrPauseCommand;
|
||||
public DelegateCommand StartOrPauseCommand => startOrPauseCommand ?? (startOrPauseCommand = new DelegateCommand(ExecuteStartOrPauseCommand));
|
||||
|
||||
/// <summary>
|
||||
/// 下载列表暂停继续事件
|
||||
/// </summary>
|
||||
private void ExecuteStartOrPauseCommand()
|
||||
{
|
||||
switch (DownloadStatus)
|
||||
{
|
||||
case DownloadStatus.NOT_STARTED:
|
||||
case DownloadStatus.WAIT_FOR_DOWNLOAD:
|
||||
DownloadStatus = DownloadStatus.PAUSE_STARTED;
|
||||
StartOrPause = ButtonIcon.Instance().Start;
|
||||
StartOrPause.Fill = DictionaryResource.GetColor("ColorPrimary");
|
||||
break;
|
||||
case DownloadStatus.PAUSE_STARTED:
|
||||
DownloadStatus = DownloadStatus.WAIT_FOR_DOWNLOAD;
|
||||
StartOrPause = ButtonIcon.Instance().Pause;
|
||||
StartOrPause.Fill = DictionaryResource.GetColor("ColorPrimary");
|
||||
break;
|
||||
case DownloadStatus.PAUSE:
|
||||
DownloadStatus = DownloadStatus.DOWNLOADING;
|
||||
StartOrPause = ButtonIcon.Instance().Pause;
|
||||
StartOrPause.Fill = DictionaryResource.GetColor("ColorPrimary");
|
||||
break;
|
||||
case DownloadStatus.DOWNLOADING:
|
||||
DownloadStatus = DownloadStatus.PAUSE;
|
||||
StartOrPause = ButtonIcon.Instance().Start;
|
||||
StartOrPause.Fill = DictionaryResource.GetColor("ColorPrimary");
|
||||
break;
|
||||
case DownloadStatus.DOWNLOAD_SUCCEED:
|
||||
// 下载成功后会从下载列表中删除
|
||||
// 不会出现此分支
|
||||
break;
|
||||
case DownloadStatus.DOWNLOAD_FAILED:
|
||||
DownloadStatus = DownloadStatus.WAIT_FOR_DOWNLOAD;
|
||||
StartOrPause = ButtonIcon.Instance().Pause;
|
||||
StartOrPause.Fill = DictionaryResource.GetColor("ColorPrimary");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 下载列表删除事件
|
||||
private DelegateCommand deleteCommand;
|
||||
public DelegateCommand DeleteCommand => deleteCommand ?? (deleteCommand = new DelegateCommand(ExecuteDeleteCommand));
|
||||
|
||||
/// <summary>
|
||||
/// 下载列表删除事件
|
||||
/// </summary>
|
||||
private void ExecuteDeleteCommand()
|
||||
{
|
||||
App.DownloadingList.Remove(this);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
using Prism.Mvvm;
|
||||
using System.Windows.Media.Imaging;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class Favorites : BindableBase
|
||||
{
|
||||
public string CoverUrl { get; set; }
|
||||
public long UpperMid { get; set; }
|
||||
|
||||
private BitmapImage cover;
|
||||
public BitmapImage Cover
|
||||
{
|
||||
get { return cover; }
|
||||
set { SetProperty(ref cover, value); }
|
||||
}
|
||||
|
||||
private string title;
|
||||
public string Title
|
||||
{
|
||||
get { return title; }
|
||||
set { SetProperty(ref title, value); }
|
||||
}
|
||||
|
||||
private string createTime;
|
||||
public string CreateTime
|
||||
{
|
||||
get { return createTime; }
|
||||
set { SetProperty(ref createTime, value); }
|
||||
}
|
||||
|
||||
private string playNumber;
|
||||
public string PlayNumber
|
||||
{
|
||||
get { return playNumber; }
|
||||
set { SetProperty(ref playNumber, value); }
|
||||
}
|
||||
|
||||
private string likeNumber;
|
||||
public string LikeNumber
|
||||
{
|
||||
get { return likeNumber; }
|
||||
set { SetProperty(ref likeNumber, value); }
|
||||
}
|
||||
|
||||
private string favoriteNumber;
|
||||
public string FavoriteNumber
|
||||
{
|
||||
get { return favoriteNumber; }
|
||||
set { SetProperty(ref favoriteNumber, value); }
|
||||
}
|
||||
|
||||
private string shareNumber;
|
||||
public string ShareNumber
|
||||
{
|
||||
get { return shareNumber; }
|
||||
set { SetProperty(ref shareNumber, value); }
|
||||
}
|
||||
|
||||
private string description;
|
||||
public string Description
|
||||
{
|
||||
get { return description; }
|
||||
set { SetProperty(ref description, value); }
|
||||
}
|
||||
|
||||
private int mediaCount;
|
||||
public int MediaCount
|
||||
{
|
||||
get { return mediaCount; }
|
||||
set { SetProperty(ref mediaCount, value); }
|
||||
}
|
||||
|
||||
private string upName;
|
||||
public string UpName
|
||||
{
|
||||
get { return upName; }
|
||||
set { SetProperty(ref upName, value); }
|
||||
}
|
||||
|
||||
private BitmapImage upHeader;
|
||||
public BitmapImage UpHeader
|
||||
{
|
||||
get { return upHeader; }
|
||||
set { SetProperty(ref upHeader, value); }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,126 +0,0 @@
|
||||
using DownKyi.Core.BiliApi.BiliUtils;
|
||||
using DownKyi.Utils;
|
||||
using DownKyi.ViewModels;
|
||||
using Prism.Commands;
|
||||
using Prism.Events;
|
||||
using Prism.Mvvm;
|
||||
using System.Windows.Media.Imaging;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class FavoritesMedia : BindableBase
|
||||
{
|
||||
protected readonly IEventAggregator eventAggregator;
|
||||
|
||||
public FavoritesMedia(IEventAggregator eventAggregator)
|
||||
{
|
||||
this.eventAggregator = eventAggregator;
|
||||
}
|
||||
|
||||
public long Avid { get; set; }
|
||||
public string Bvid { get; set; }
|
||||
public long UpperMid { get; set; }
|
||||
|
||||
#region 页面属性申明
|
||||
|
||||
private bool isSelected;
|
||||
public bool IsSelected
|
||||
{
|
||||
get { return isSelected; }
|
||||
set { SetProperty(ref isSelected, value); }
|
||||
}
|
||||
|
||||
private int order;
|
||||
public int Order
|
||||
{
|
||||
get { return order; }
|
||||
set { SetProperty(ref order, value); }
|
||||
}
|
||||
|
||||
private BitmapImage cover;
|
||||
public BitmapImage Cover
|
||||
{
|
||||
get { return cover; }
|
||||
set { SetProperty(ref cover, value); }
|
||||
}
|
||||
|
||||
private string title;
|
||||
public string Title
|
||||
{
|
||||
get { return title; }
|
||||
set { SetProperty(ref title, value); }
|
||||
}
|
||||
|
||||
private string playNumber;
|
||||
public string PlayNumber
|
||||
{
|
||||
get { return playNumber; }
|
||||
set { SetProperty(ref playNumber, value); }
|
||||
}
|
||||
|
||||
private string danmakuNumber;
|
||||
public string DanmakuNumber
|
||||
{
|
||||
get { return danmakuNumber; }
|
||||
set { SetProperty(ref danmakuNumber, value); }
|
||||
}
|
||||
|
||||
private string favoriteNumber;
|
||||
public string FavoriteNumber
|
||||
{
|
||||
get { return favoriteNumber; }
|
||||
set { SetProperty(ref favoriteNumber, value); }
|
||||
}
|
||||
|
||||
private string duration;
|
||||
public string Duration
|
||||
{
|
||||
get { return duration; }
|
||||
set { SetProperty(ref duration, value); }
|
||||
}
|
||||
|
||||
private string upName;
|
||||
public string UpName
|
||||
{
|
||||
get { return upName; }
|
||||
set { SetProperty(ref upName, value); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 命令申明
|
||||
|
||||
// 视频标题点击事件
|
||||
private DelegateCommand<object> titleCommand;
|
||||
public DelegateCommand<object> TitleCommand => titleCommand ?? (titleCommand = new DelegateCommand<object>(ExecuteTitleCommand));
|
||||
|
||||
/// <summary>
|
||||
/// 视频标题点击事件
|
||||
/// </summary>
|
||||
/// <param name="parameter"></param>
|
||||
private void ExecuteTitleCommand(object parameter)
|
||||
{
|
||||
if (!(parameter is string tag)) { return; }
|
||||
|
||||
NavigateToView.NavigationView(eventAggregator, ViewVideoDetailViewModel.Tag, tag, $"{ParseEntrance.VideoUrl}{Bvid}");
|
||||
}
|
||||
|
||||
// 视频的UP主点击事件
|
||||
private DelegateCommand<object> videoUpperCommand;
|
||||
public DelegateCommand<object> VideoUpperCommand => videoUpperCommand ?? (videoUpperCommand = new DelegateCommand<object>(ExecuteVideoUpperCommand));
|
||||
|
||||
/// <summary>
|
||||
/// 视频的UP主点击事件
|
||||
/// </summary>
|
||||
/// <param name="parameter"></param>
|
||||
private void ExecuteVideoUpperCommand(object parameter)
|
||||
{
|
||||
if (!(parameter is string tag)) { return; }
|
||||
|
||||
NavigateToView.NavigateToViewUserSpace(eventAggregator, tag, UpperMid);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
using DownKyi.Core.Settings;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class OrderFormatDisplay
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public OrderFormat OrderFormat { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public enum PlayStreamType
|
||||
{
|
||||
VIDEO = 1, // 普通视频
|
||||
BANGUMI, // 番剧、电影、电视剧等
|
||||
CHEESE, // 课程
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class Resolution
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public int Id { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
using DownKyi.Images;
|
||||
using Prism.Mvvm;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class TabHeader : BindableBase
|
||||
{
|
||||
private int id;
|
||||
public int Id
|
||||
{
|
||||
get { return id; }
|
||||
set { SetProperty(ref id, value); }
|
||||
}
|
||||
|
||||
private VectorImage image;
|
||||
public VectorImage Image
|
||||
{
|
||||
get { return image; }
|
||||
set { SetProperty(ref image, value); }
|
||||
}
|
||||
|
||||
private string title;
|
||||
public string Title
|
||||
{
|
||||
get { return title; }
|
||||
set { SetProperty(ref title, value); }
|
||||
}
|
||||
|
||||
private string subTitle;
|
||||
public string SubTitle
|
||||
{
|
||||
get { return subTitle; }
|
||||
set { SetProperty(ref subTitle, value); }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
using Prism.Mvvm;
|
||||
using System;
|
||||
using System.Windows.Media.Imaging;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
[Serializable]
|
||||
public class VideoInfoView : BindableBase
|
||||
{
|
||||
public string CoverUrl { get; set; }
|
||||
public long UpperMid { get; set; }
|
||||
public int TypeId { get; set; }
|
||||
|
||||
private BitmapImage cover;
|
||||
public BitmapImage Cover
|
||||
{
|
||||
get => cover;
|
||||
set => SetProperty(ref cover, value);
|
||||
}
|
||||
|
||||
private string title;
|
||||
public string Title
|
||||
{
|
||||
get => title;
|
||||
set => SetProperty(ref title, value);
|
||||
}
|
||||
|
||||
private string videoZone;
|
||||
public string VideoZone
|
||||
{
|
||||
get => videoZone;
|
||||
set => SetProperty(ref videoZone, value);
|
||||
}
|
||||
|
||||
private string createTime;
|
||||
public string CreateTime
|
||||
{
|
||||
get => createTime;
|
||||
set => SetProperty(ref createTime, value);
|
||||
}
|
||||
|
||||
private string playNumber;
|
||||
public string PlayNumber
|
||||
{
|
||||
get => playNumber;
|
||||
set => SetProperty(ref playNumber, value);
|
||||
}
|
||||
|
||||
private string danmakuNumber;
|
||||
public string DanmakuNumber
|
||||
{
|
||||
get => danmakuNumber;
|
||||
set => SetProperty(ref danmakuNumber, value);
|
||||
}
|
||||
|
||||
private string likeNumber;
|
||||
public string LikeNumber
|
||||
{
|
||||
get => likeNumber;
|
||||
set => SetProperty(ref likeNumber, value);
|
||||
}
|
||||
|
||||
private string coinNumber;
|
||||
public string CoinNumber
|
||||
{
|
||||
get => coinNumber;
|
||||
set => SetProperty(ref coinNumber, value);
|
||||
}
|
||||
|
||||
private string favoriteNumber;
|
||||
public string FavoriteNumber
|
||||
{
|
||||
get => favoriteNumber;
|
||||
set => SetProperty(ref favoriteNumber, value);
|
||||
}
|
||||
|
||||
private string shareNumber;
|
||||
public string ShareNumber
|
||||
{
|
||||
get => shareNumber;
|
||||
set => SetProperty(ref shareNumber, value);
|
||||
}
|
||||
|
||||
private string replyNumber;
|
||||
public string ReplyNumber
|
||||
{
|
||||
get => replyNumber;
|
||||
set => SetProperty(ref replyNumber, value);
|
||||
}
|
||||
|
||||
private string description;
|
||||
public string Description
|
||||
{
|
||||
get => description;
|
||||
set => SetProperty(ref description, value);
|
||||
}
|
||||
|
||||
private string upName;
|
||||
public string UpName
|
||||
{
|
||||
get => upName;
|
||||
set => SetProperty(ref upName, value);
|
||||
}
|
||||
|
||||
private BitmapImage upHeader;
|
||||
public BitmapImage UpHeader
|
||||
{
|
||||
get => upHeader;
|
||||
set => SetProperty(ref upHeader, value);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
using DownKyi.Core.BiliApi.VideoStream.Models;
|
||||
using Prism.Mvvm;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class VideoPage : BindableBase
|
||||
{
|
||||
public PlayUrl PlayUrl { get; set; }
|
||||
|
||||
public long Avid { get; set; }
|
||||
public string Bvid { get; set; }
|
||||
public long Cid { get; set; }
|
||||
public long EpisodeId { get; set; }
|
||||
|
||||
public string FirstFrame { get; set; }
|
||||
|
||||
private bool isSelected;
|
||||
public bool IsSelected
|
||||
{
|
||||
get => isSelected;
|
||||
set => SetProperty(ref isSelected, value);
|
||||
}
|
||||
|
||||
private int order;
|
||||
public int Order
|
||||
{
|
||||
get => order;
|
||||
set => SetProperty(ref order, value);
|
||||
}
|
||||
|
||||
private string name;
|
||||
public string Name
|
||||
{
|
||||
get => name;
|
||||
set => SetProperty(ref name, value);
|
||||
}
|
||||
|
||||
private string duration;
|
||||
public string Duration
|
||||
{
|
||||
get => duration;
|
||||
set => SetProperty(ref duration, value);
|
||||
}
|
||||
|
||||
private List<string> audioQualityFormatList;
|
||||
public List<string> AudioQualityFormatList
|
||||
{
|
||||
get => audioQualityFormatList;
|
||||
set => SetProperty(ref audioQualityFormatList, value);
|
||||
}
|
||||
|
||||
private string audioQualityFormat;
|
||||
public string AudioQualityFormat
|
||||
{
|
||||
get => audioQualityFormat;
|
||||
set => SetProperty(ref audioQualityFormat, value);
|
||||
}
|
||||
|
||||
private List<VideoQuality> videoQualityList;
|
||||
public List<VideoQuality> VideoQualityList
|
||||
{
|
||||
get => videoQualityList;
|
||||
set => SetProperty(ref videoQualityList, value);
|
||||
}
|
||||
|
||||
private VideoQuality videoQuality;
|
||||
public VideoQuality VideoQuality
|
||||
{
|
||||
get => videoQuality;
|
||||
set => SetProperty(ref videoQuality, value);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
using Prism.Mvvm;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class VideoQuality : BindableBase
|
||||
{
|
||||
private int quality;
|
||||
public int Quality
|
||||
{
|
||||
get => quality;
|
||||
set => SetProperty(ref quality, value);
|
||||
}
|
||||
|
||||
private string qualityFormat;
|
||||
public string QualityFormat
|
||||
{
|
||||
get => qualityFormat;
|
||||
set => SetProperty(ref qualityFormat, value);
|
||||
}
|
||||
|
||||
private List<string> videoCodecList;
|
||||
public List<string> VideoCodecList
|
||||
{
|
||||
get => videoCodecList;
|
||||
set => SetProperty(ref videoCodecList, value);
|
||||
}
|
||||
|
||||
private string selectedVideoCodec;
|
||||
public string SelectedVideoCodec
|
||||
{
|
||||
get => selectedVideoCodec;
|
||||
set => SetProperty(ref selectedVideoCodec, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
using Prism.Mvvm;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DownKyi.Models
|
||||
{
|
||||
public class VideoSection : BindableBase
|
||||
{
|
||||
public long Id { get; set; }
|
||||
|
||||
private string title;
|
||||
public string Title
|
||||
{
|
||||
get { return title; }
|
||||
set { SetProperty(ref title, value); }
|
||||
}
|
||||
|
||||
private bool isSelected;
|
||||
public bool IsSelected
|
||||
{
|
||||
get { return isSelected; }
|
||||
set { SetProperty(ref isSelected, value); }
|
||||
}
|
||||
|
||||
private List<VideoPage> videoPages;
|
||||
public List<VideoPage> VideoPages
|
||||
{
|
||||
get { return videoPages; }
|
||||
set { SetProperty(ref videoPages, value); }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ using System.Windows;
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("DownKyi")]
|
||||
[assembly: AssemblyProduct("DownKyi")]
|
||||
[assembly: AssemblyCopyright("Copyright © Downkyi 2020-2021")]
|
||||
[assembly: AssemblyCopyright("Copyright © Downkyi 2020-2023")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
@@ -51,5 +51,5 @@ using System.Windows;
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.5.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.5.0.0")]
|
||||
[assembly: AssemblyVersion("1.5.8.0")]
|
||||
[assembly: AssemblyFileVersion("1.5.8.0")]
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
using DownKyi.Images;
|
||||
using DownKyi.Utils;
|
||||
using DownKyi.ViewModels.Dialogs;
|
||||
using Prism.Services.Dialogs;
|
||||
|
||||
namespace DownKyi.Services
|
||||
{
|
||||
public class AlertService
|
||||
{
|
||||
private readonly IDialogService dialogService;
|
||||
|
||||
public AlertService(IDialogService dialogService)
|
||||
{
|
||||
this.dialogService = dialogService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 显示一个信息弹窗
|
||||
/// </summary>
|
||||
/// <param name="message"></param>
|
||||
/// <param name="buttonNumber"></param>
|
||||
/// <returns></returns>
|
||||
public ButtonResult ShowInfo(string message, int buttonNumber = 2)
|
||||
{
|
||||
VectorImage image = SystemIcon.Instance().Info;
|
||||
string title = DictionaryResource.GetString("Info");
|
||||
return ShowMessage(image, title, message, buttonNumber);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 显示一个警告弹窗
|
||||
/// </summary>
|
||||
/// <param name="message"></param>
|
||||
/// <returns></returns>
|
||||
public ButtonResult ShowWarning(string message)
|
||||
{
|
||||
VectorImage image = SystemIcon.Instance().Warning;
|
||||
string title = DictionaryResource.GetString("Warning");
|
||||
return ShowMessage(image, title, message, 1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 显示一个错误弹窗
|
||||
/// </summary>
|
||||
/// <param name="message"></param>
|
||||
/// <returns></returns>
|
||||
public ButtonResult ShowError(string message)
|
||||
{
|
||||
VectorImage image = SystemIcon.Instance().Error;
|
||||
string title = DictionaryResource.GetString("Error");
|
||||
return ShowMessage(image, title, message, 1);
|
||||
}
|
||||
|
||||
public ButtonResult ShowMessage(VectorImage image, string type, string message, int buttonNumber)
|
||||
{
|
||||
ButtonResult result = ButtonResult.None;
|
||||
if (dialogService == null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
DialogParameters param = new DialogParameters
|
||||
{
|
||||
{ "image", image },
|
||||
{ "title", type },
|
||||
{ "message", message },
|
||||
{ "button_number", buttonNumber }
|
||||
};
|
||||
dialogService.ShowDialog(ViewAlertDialogViewModel.Tag, param, buttonResult =>
|
||||
{
|
||||
result = buttonResult.Result;
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user