mirror of
https://github.com/putyy/res-downloader.git
synced 2026-01-12 06:04:55 +08:00
完善文档、新增一些功能
This commit is contained in:
44
.github/ISSUE_TEMPLATE /bug_report.yml
vendored
Normal file
44
.github/ISSUE_TEMPLATE /bug_report.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
name: Bug Report \ 问题反馈
|
||||||
|
description: Create a report to help us improve \ 帮助改进
|
||||||
|
labels: ["Bug"]
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: input
|
||||||
|
id: title
|
||||||
|
attributes:
|
||||||
|
label: Title \ 标题
|
||||||
|
description: A brief summary of the bug. \ 对于该错误的简要总结。
|
||||||
|
placeholder: Enter the bug title here. \ 在此输入错误标题。
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: reproduce
|
||||||
|
attributes:
|
||||||
|
label: To Reproduce \ 操作流程
|
||||||
|
description: Steps to reproduce the behaviour. \ 重现该行为的步骤。
|
||||||
|
placeholder: |
|
||||||
|
1. Go to '...' \ 1. 进入 '...'
|
||||||
|
2. Click on '....' \ 2. 点击 '....'
|
||||||
|
3. Scroll down to '....' \ 3. 向下滚动到 '....'
|
||||||
|
4. See error \ 4. 查看错误
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: expected-behaviour
|
||||||
|
attributes:
|
||||||
|
label: Expected Behaviour \ 预期结果
|
||||||
|
description: A clear and concise description of what you expected to happen. \ 对您期望发生的事情的清晰简明描述。
|
||||||
|
placeholder: A clear and concise description of what you expected to happen. \ 对您期望发生的事情的清晰简明描述。
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: software-version
|
||||||
|
attributes:
|
||||||
|
label: Software Version \ 软件版本
|
||||||
|
description: Please specify the version of the software you are using. \ 请指定您使用的软件版本。
|
||||||
|
placeholder: Enter the software version here. \ 在此输入软件版本。
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
1
.github/ISSUE_TEMPLATE /config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE /config.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
31
.github/ISSUE_TEMPLATE /feature_request.yml
vendored
Normal file
31
.github/ISSUE_TEMPLATE /feature_request.yml
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
name: Feature Request \ 功能建议
|
||||||
|
description: Suggest an idea for this project \ 为这个项目提出一个新想法
|
||||||
|
labels: ["Enhancement"]
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: input
|
||||||
|
id: title
|
||||||
|
attributes:
|
||||||
|
label: Title \ 标题
|
||||||
|
description: A brief summary of your feature request. \ 对您功能建议的简要总结。
|
||||||
|
placeholder: Enter the feature title here. \ 在此输入功能标题。
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: feature-suggestion
|
||||||
|
attributes:
|
||||||
|
label: Feature Suggestion \ 功能建议
|
||||||
|
description: A clear and concise description of the feature you would like to suggest. \ 对您想要建议的功能的清晰简明描述。
|
||||||
|
placeholder: Describe your feature suggestion here. \ 在此描述您的功能建议。
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: proposed-solution
|
||||||
|
attributes:
|
||||||
|
label: Proposed Solution \ 你的方案
|
||||||
|
description: A clear and concise description of your proposed solution. \ 对您提议的解决方案的清晰简明描述。
|
||||||
|
placeholder: Describe your proposed solution here. \ 在此描述您的提议方案。
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
## Mac
|
## Mac
|
||||||
```bash
|
```bash
|
||||||
wails build -platform "darwin/universal" --dmg-name
|
wails build -platform "darwin/universal"
|
||||||
create-dmg 'build/bin/res-downloader.app' \
|
create-dmg 'build/bin/res-downloader.app' \
|
||||||
--overwrite --dmg-title="res-downloader" \
|
--overwrite --dmg-title="res-downloader" \
|
||||||
--dmg-name "res-downloader_$(jq -r '.info.productVersion' wails.json).dmg" \
|
--dmg-name "res-downloader_$(jq -r '.info.productVersion' wails.json).dmg" \
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
!define INFO_PRODUCTNAME "res-downloader"
|
!define INFO_PRODUCTNAME "res-downloader"
|
||||||
!endif
|
!endif
|
||||||
!ifndef INFO_PRODUCTVERSION
|
!ifndef INFO_PRODUCTVERSION
|
||||||
!define INFO_PRODUCTVERSION "3.0.2"
|
!define INFO_PRODUCTVERSION "3.0.3"
|
||||||
!endif
|
!endif
|
||||||
!ifndef INFO_COPYRIGHT
|
!ifndef INFO_COPYRIGHT
|
||||||
!define INFO_COPYRIGHT "Copyright © 2023"
|
!define INFO_COPYRIGHT "Copyright © 2023"
|
||||||
|
|||||||
11
core/app.go
11
core/app.go
@@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/wailsapp/wails/v2/pkg/runtime"
|
"github.com/wailsapp/wails/v2/pkg/runtime"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
sysRuntime "runtime"
|
sysRuntime "runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -37,12 +38,18 @@ var (
|
|||||||
httpServerOnce *HttpServer
|
httpServerOnce *HttpServer
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetApp(assets embed.FS) *App {
|
func GetApp(assets embed.FS, wjs string) *App {
|
||||||
if appOnce == nil {
|
if appOnce == nil {
|
||||||
|
matches := regexp.MustCompile(`"productVersion":\s*"([\d.]+)"`).FindStringSubmatch(wjs)
|
||||||
|
version := "1.0.1"
|
||||||
|
if len(matches) > 0 {
|
||||||
|
version = matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
appOnce = &App{
|
appOnce = &App{
|
||||||
assets: assets,
|
assets: assets,
|
||||||
AppName: "res-downloader",
|
AppName: "res-downloader",
|
||||||
Version: "3.0.2",
|
Version: version,
|
||||||
Description: "res-downloader是一款集网络资源嗅探 + 高速下载功能于一体的软件,高颜值、高性能和多样化,提供个人用户下载自己上传到各大平台的网络资源功能!",
|
Description: "res-downloader是一款集网络资源嗅探 + 高速下载功能于一体的软件,高颜值、高性能和多样化,提供个人用户下载自己上传到各大平台的网络资源功能!",
|
||||||
Copyright: "Copyright © 2023~" + strconv.Itoa(time.Now().Year()),
|
Copyright: "Copyright © 2023~" + strconv.Itoa(time.Now().Year()),
|
||||||
PublicCrt: []byte(`
|
PublicCrt: []byte(`
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ type Config struct {
|
|||||||
Port string `json:"Port"`
|
Port string `json:"Port"`
|
||||||
Quality int `json:"Quality"`
|
Quality int `json:"Quality"`
|
||||||
SaveDirectory string `json:"SaveDirectory"`
|
SaveDirectory string `json:"SaveDirectory"`
|
||||||
|
FilenameLen int `json:"FilenameLen"`
|
||||||
|
FilenameTime bool `json:"FilenameTime"`
|
||||||
UpstreamProxy string `json:"UpstreamProxy"`
|
UpstreamProxy string `json:"UpstreamProxy"`
|
||||||
OpenProxy bool `json:"OpenProxy"`
|
OpenProxy bool `json:"OpenProxy"`
|
||||||
DownloadProxy bool `json:"DownloadProxy"`
|
DownloadProxy bool `json:"DownloadProxy"`
|
||||||
@@ -33,6 +35,8 @@ func initConfig() *Config {
|
|||||||
"Theme": "lightTheme",
|
"Theme": "lightTheme",
|
||||||
"Quality": 0,
|
"Quality": 0,
|
||||||
"SaveDirectory": "",
|
"SaveDirectory": "",
|
||||||
|
"FilenameLen": 0,
|
||||||
|
"FilenameTime": true,
|
||||||
"UpstreamProxy": "",
|
"UpstreamProxy": "",
|
||||||
"OpenProxy": false,
|
"OpenProxy": false,
|
||||||
"DownloadProxy": false,
|
"DownloadProxy": false,
|
||||||
@@ -64,6 +68,8 @@ func (c *Config) setConfig(config Config) {
|
|||||||
c.Theme = config.Theme
|
c.Theme = config.Theme
|
||||||
c.Quality = config.Quality
|
c.Quality = config.Quality
|
||||||
c.SaveDirectory = config.SaveDirectory
|
c.SaveDirectory = config.SaveDirectory
|
||||||
|
c.FilenameLen = config.FilenameLen
|
||||||
|
c.FilenameTime = config.FilenameTime
|
||||||
c.UpstreamProxy = config.UpstreamProxy
|
c.UpstreamProxy = config.UpstreamProxy
|
||||||
c.UserAgent = config.UserAgent
|
c.UserAgent = config.UserAgent
|
||||||
c.OpenProxy = config.OpenProxy
|
c.OpenProxy = config.OpenProxy
|
||||||
|
|||||||
@@ -113,13 +113,22 @@ func (r *Resource) download(mediaInfo MediaInfo, decodeStr string) {
|
|||||||
fileName := Md5(rawUrl)
|
fileName := Md5(rawUrl)
|
||||||
if mediaInfo.Description != "" {
|
if mediaInfo.Description != "" {
|
||||||
fileName = regexp.MustCompile(`[^\w\p{Han}]`).ReplaceAllString(mediaInfo.Description, "")
|
fileName = regexp.MustCompile(`[^\w\p{Han}]`).ReplaceAllString(mediaInfo.Description, "")
|
||||||
|
fileLen := globalConfig.FilenameLen
|
||||||
|
if fileLen <= 0 {
|
||||||
|
fileLen = 10
|
||||||
|
}
|
||||||
|
|
||||||
runes := []rune(fileName)
|
runes := []rune(fileName)
|
||||||
if len(runes) > 10 {
|
if len(runes) > fileLen {
|
||||||
fileName = string(runes[:10])
|
fileName = string(runes[:fileLen])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mediaInfo.SavePath = filepath.Join(globalConfig.SaveDirectory, fileName+"_"+GetCurrentDateTimeFormatted()+mediaInfo.Suffix)
|
if globalConfig.FilenameTime {
|
||||||
|
mediaInfo.SavePath = filepath.Join(globalConfig.SaveDirectory, fileName+"_"+GetCurrentDateTimeFormatted()+mediaInfo.Suffix)
|
||||||
|
} else {
|
||||||
|
mediaInfo.SavePath = filepath.Join(globalConfig.SaveDirectory, fileName+mediaInfo.Suffix)
|
||||||
|
}
|
||||||
|
|
||||||
if strings.Contains(rawUrl, "qq.com") {
|
if strings.Contains(rawUrl, "qq.com") {
|
||||||
if globalConfig.Quality == 1 &&
|
if globalConfig.Quality == 1 &&
|
||||||
|
|||||||
@@ -4,4 +4,3 @@
|
|||||||
* [功能演示](examples.md)
|
* [功能演示](examples.md)
|
||||||
* [更多说明](more.md)
|
* [更多说明](more.md)
|
||||||
* [常见问题](troubleshooting.md)
|
* [常见问题](troubleshooting.md)
|
||||||
* [贡献指南](contribution.md)
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
1
|
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
- 这里演示打开百度这个网站:https://www.baidu.com/
|
- 这里演示打开百度这个网站:https://www.baidu.com/
|
||||||

|

|
||||||
|
|
||||||
### 小程序、公众号、抖音、小红书等操作方法都差不多!
|
### 小程序、公众号、抖音、小红书、qq音乐、酷狗等应用内资源获取方式都差不多!
|
||||||
|
|
||||||
## 下载资源到本地
|
## 下载资源到本地
|
||||||
- 选择你想下载的视频 点击下载即可
|
- 选择你想下载的视频 点击下载即可
|
||||||
|
|||||||
BIN
docs/images/config.png
Normal file
BIN
docs/images/config.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/images/installation-mac-1.png
Normal file
BIN
docs/images/installation-mac-1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 65 KiB |
BIN
docs/images/more-1.png
Normal file
BIN
docs/images/more-1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 87 KiB |
BIN
docs/images/more-2.png
Normal file
BIN
docs/images/more-2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 87 KiB |
BIN
docs/images/more-3.png
Normal file
BIN
docs/images/more-3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 79 KiB |
BIN
docs/images/more-4.png
Normal file
BIN
docs/images/more-4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 81 KiB |
@@ -2,7 +2,7 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Document</title>
|
<title>res-downloader</title>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||||
<meta name="description" content="Description">
|
<meta name="description" content="Description">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
|
||||||
|
|||||||
@@ -1,7 +1,18 @@
|
|||||||
|
## 下载安装文件
|
||||||
|
- windows下载.exe结尾的,根据自己的系统架构下载合适的安装文件,通常下载带有“x64-installer.exe”结尾的文件
|
||||||
|
- Mac下载.dmg结尾即可
|
||||||
|
- Linux根据系统类型下载对应的执行文件或安装文件
|
||||||
|
|
||||||
## Windows安装过程
|
## Windows安装过程
|
||||||
todo
|
- 双击下载好的exe 正常安装即可,首次打开记得右键管理员运行
|
||||||
|
|
||||||
## Mac安装过程
|
## Mac安装过程
|
||||||
todo
|
- 双击下载好的dmg文件,将res-downloader拖入应用即可,如图:
|
||||||
|

|
||||||
|
|
||||||
## Linux安装过程
|
## Linux安装过程
|
||||||
todo
|
- 执行文件运行方式举例
|
||||||
|
> chmod +x ./res-downloader_3.0.2_linux_x64
|
||||||
|
> sudo ./res-downloader_3.0.2_linux_x64
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
22
docs/more.md
22
docs/more.md
@@ -1 +1,21 @@
|
|||||||
1
|
## 隐藏功能
|
||||||
|
- 导出\导入 数据,1秒内连续点击空白处5次即可开启(单次有效)
|
||||||
|

|
||||||
|
|
||||||
|
## 清空列表、类型筛选
|
||||||
|
- 当资源列表过大时,无法快速找到需要的资源,这时可以先清空列表再去刷新需要的资源页面
|
||||||
|
- 资源列表过多,可以快速根据需要的资源类型进行筛选
|
||||||
|

|
||||||
|
|
||||||
|
## 拦截想要的资源类型、批量下载
|
||||||
|
- 比如只需要视频时就选择视频类型,可以多选
|
||||||
|

|
||||||
|
|
||||||
|
## 复制链接、视频解密
|
||||||
|
- 复制链接可用于第三方软件进行下载,下载完成后对该视频解密,点击“视频解密”选择用其他软件下载完成后的视频文件进行解密
|
||||||
|

|
||||||
|
|
||||||
|
## 设置说明
|
||||||
|
!> 修改完成后记得点保存
|
||||||
|
- 几乎每项配置在软件中都有说明(鼠标悬浮在?处即可查看),此处就不进行多余讲解
|
||||||
|

|
||||||
@@ -1 +1,46 @@
|
|||||||
1
|
## Mac 提示“已损坏,无法打开”, 打开命令行执行如下命令:
|
||||||
|
> sudo xattr -d com.apple.quarantine /Applications/res-downloader.app
|
||||||
|
|
||||||
|
## 打开本软件,无法正常拦截获取
|
||||||
|
> 检查系统证书是否安装
|
||||||
|
> 关闭网络防火墙
|
||||||
|
> 系统代理是否正确设置(代理地址:127.0.0.1 端口:8899)
|
||||||
|
|
||||||
|
## 关闭软件后无法正常上网
|
||||||
|
> 手动关闭系统代理设置
|
||||||
|
|
||||||
|
## 链接不是私密链接
|
||||||
|
> 通常是证书未正确安装,最新版证书下载:软件左下角?点击后有下载地址
|
||||||
|
> 根据自己系统进行安装证书操作(不懂的自行百度),手动安装需安装到受信任的根证书
|
||||||
|
|
||||||
|
- Mac手动安装证书(V3+版本支持),打开终端复制以下命令 粘贴到终端回车 按照提示输入密码,完成后再打开软件:
|
||||||
|
```shell
|
||||||
|
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /Users/$(whoami)/Library/Preferences/res-downloader/cert.crt && touch /Users/$(whoami)/Library/Preferences/res-downloader/install.lock && echo "安装完成"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 拦截不到小程序中的资源
|
||||||
|
清理微信缓存,删除小程序后,重新打开
|
||||||
|
> 设置->存储空间->缓存
|
||||||
|
|
||||||
|
## 只拦截打开的视频号视频
|
||||||
|
关闭全量拦截,打开视频号视频详情,通常分享好友后打开的页面属于详情页
|
||||||
|
|
||||||
|
## 拦截视频号账号视频
|
||||||
|
打开对应作者个人主页,浏览即可
|
||||||
|
|
||||||
|
## 下载慢、大视频下载失败
|
||||||
|
推荐使用如下工具加速下载,视频号可以下载完成后再到对应视频操作项选择 “视频解密” 按钮
|
||||||
|
> [Neat Download Manager](https://www.neatdownloadmanager.com/index.php/en/)、[Motrix](https://motrix.app/download)等软件进行下载
|
||||||
|
|
||||||
|
## 直播流: 预览和录制:
|
||||||
|
> [使用obs进行预览和录制 使用教程自行百度, 点击下载obs]( https://obsproject.com/)
|
||||||
|
|
||||||
|
## m3u8: 预览和下载:
|
||||||
|
> [在线下载](https://m3u8-down.gowas.cn/)、[在线预览](https://m3u8play.com/)
|
||||||
|
|
||||||
|
## 安装证书后还会提示安装
|
||||||
|
使用命令行打开本软件,查看 “lockfile:” 这串字符后面的锁文件路径,然后创建该文件即可
|
||||||
|
例如 mac系统下终端执行如下命令即可创建
|
||||||
|
> touch /Users/你的用户名/Library/Preferences/res-downloader/install.lock
|
||||||
|
|
||||||
|
## 更多问题 请前往github进行[反馈](https://github.com/putyy/res-downloader/issues)
|
||||||
1
frontend/components.d.ts
vendored
1
frontend/components.d.ts
vendored
@@ -8,6 +8,7 @@ export {}
|
|||||||
declare module 'vue' {
|
declare module 'vue' {
|
||||||
export interface GlobalComponents {
|
export interface GlobalComponents {
|
||||||
Footer: typeof import('./src/components/Footer.vue')['default']
|
Footer: typeof import('./src/components/Footer.vue')['default']
|
||||||
|
ImportJson: typeof import('./src/components/ImportJson.vue')['default']
|
||||||
Index: typeof import('./src/components/layout/Index.vue')['default']
|
Index: typeof import('./src/components/layout/Index.vue')['default']
|
||||||
NaiveProvider: typeof import('./src/components/NaiveProvider.vue')['default']
|
NaiveProvider: typeof import('./src/components/NaiveProvider.vue')['default']
|
||||||
NButton: typeof import('naive-ui')['NButton']
|
NButton: typeof import('naive-ui')['NButton']
|
||||||
|
|||||||
36
frontend/src/components/ImportJson.vue
Normal file
36
frontend/src/components/ImportJson.vue
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<template>
|
||||||
|
<NModal
|
||||||
|
:show="showModal"
|
||||||
|
:on-update:show="changeShow"
|
||||||
|
style="--wails-draggable:no-drag"
|
||||||
|
preset="card"
|
||||||
|
class="w-[640px]"
|
||||||
|
title="导入数据"
|
||||||
|
>
|
||||||
|
<NForm
|
||||||
|
size="medium"
|
||||||
|
label-placement="left"
|
||||||
|
label-width="auto"
|
||||||
|
require-mark-placement="right-hanging"
|
||||||
|
style="--wails-draggable:no-drag"
|
||||||
|
>
|
||||||
|
<NFormItem>
|
||||||
|
<NInput type="textarea" v-model:value="content" rows="8" :autosize="false" placeholder="添加多个时,请确保每行只有一个(每个链接回车换行)"></NInput>
|
||||||
|
</NFormItem>
|
||||||
|
<NFormItem>
|
||||||
|
<NButton strong secondary type="success" @click="emits('submit', content)" class="w-20">提交</NButton>
|
||||||
|
</NFormItem>
|
||||||
|
</NForm>
|
||||||
|
</NModal>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import {ref} from "vue"
|
||||||
|
|
||||||
|
const content = ref("")
|
||||||
|
const props = defineProps<{
|
||||||
|
showModal: boolean
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const emits = defineEmits(["update:showModal", "submit"])
|
||||||
|
const changeShow = (value: boolean) => emits("update:showModal", value)
|
||||||
|
</script>
|
||||||
@@ -12,6 +12,9 @@
|
|||||||
<NButton v-if="row.DecodeKey" type="warning" :tertiary="true" size="small" @click="action('decode')">
|
<NButton v-if="row.DecodeKey" type="warning" :tertiary="true" size="small" @click="action('decode')">
|
||||||
视频解密
|
视频解密
|
||||||
</NButton>
|
</NButton>
|
||||||
|
<NButton v-if="isDebug" type="info" :tertiary="true" size="small" @click="action('json')">
|
||||||
|
复制数据
|
||||||
|
</NButton>
|
||||||
<NButton type="error" :tertiary="true" size="small" @click="action('delete')">
|
<NButton type="error" :tertiary="true" size="small" @click="action('delete')">
|
||||||
删除
|
删除
|
||||||
</NButton>
|
</NButton>
|
||||||
@@ -19,6 +22,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import {inject} from "vue"
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
row: any,
|
row: any,
|
||||||
@@ -27,6 +31,8 @@ const props = defineProps<{
|
|||||||
|
|
||||||
const emits = defineEmits(["action"])
|
const emits = defineEmits(["action"])
|
||||||
|
|
||||||
|
const isDebug = inject('isDebug')
|
||||||
|
|
||||||
const action = (type: string) => {
|
const action = (type: string) => {
|
||||||
emits('action', props.row, props.index, type)
|
emits('action', props.row, props.index, type)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ export const useIndexStore = defineStore("index-store", () => {
|
|||||||
Quality: 0,
|
Quality: 0,
|
||||||
SaveDirectory: "",
|
SaveDirectory: "",
|
||||||
UpstreamProxy: "",
|
UpstreamProxy: "",
|
||||||
|
FilenameLen: 0,
|
||||||
|
FilenameTime: false,
|
||||||
OpenProxy: false,
|
OpenProxy: false,
|
||||||
DownloadProxy: false,
|
DownloadProxy: false,
|
||||||
AutoProxy: false,
|
AutoProxy: false,
|
||||||
|
|||||||
2
frontend/src/types/app.d.ts
vendored
2
frontend/src/types/app.d.ts
vendored
@@ -12,6 +12,8 @@ export namespace appType {
|
|||||||
Port: string
|
Port: string
|
||||||
Quality: number
|
Quality: number
|
||||||
SaveDirectory: string
|
SaveDirectory: string
|
||||||
|
FilenameLen: number
|
||||||
|
FilenameTime: boolean
|
||||||
UpstreamProxy: string
|
UpstreamProxy: string
|
||||||
OpenProxy: boolean
|
OpenProxy: boolean
|
||||||
DownloadProxy: boolean
|
DownloadProxy: boolean
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex flex-col px-5 py-5">
|
<div class="flex flex-col px-5 py-5">
|
||||||
<div class="pb-2 z-40">
|
<div class="pb-2 z-40" @click="triggerEvent">
|
||||||
<NSpace>
|
<NSpace>
|
||||||
<NButton v-if="isProxy" secondary type="primary" @click="close" style="--wails-draggable:no-drag">关闭代理</NButton>
|
<NButton v-if="isProxy" secondary type="primary" @click.stop="close" style="--wails-draggable:no-drag">关闭代理</NButton>
|
||||||
<NButton v-else tertiary type="tertiary" @click="open" style="--wails-draggable:no-drag">开启代理</NButton>
|
<NButton v-else tertiary type="tertiary" @click.stop="open" style="--wails-draggable:no-drag">开启代理</NButton>
|
||||||
<NButton tertiary type="info" @click="batchDown" style="--wails-draggable:no-drag">批量下载</NButton>
|
<NButton tertiary type="info" @click.stop="batchDown" style="--wails-draggable:no-drag">批量下载</NButton>
|
||||||
<NButton tertiary type="error" @click="clear" style="--wails-draggable:no-drag">清空列表</NButton>
|
<NButton tertiary type="error" @click.stop="clear" style="--wails-draggable:no-drag">清空列表</NButton>
|
||||||
<NSelect style="min-width: 100px;--wails-draggable:no-drag" placeholder="拦截类型" v-model:value="resourcesType" multiple clearable :max-tag-count="3" :options="options"></NSelect>
|
<NSelect style="min-width: 100px;--wails-draggable:no-drag" placeholder="拦截类型" v-model:value="resourcesType" multiple clearable :max-tag-count="3" :options="options"></NSelect>
|
||||||
|
<NButton v-if="isDebug" tertiary type="info" @click.stop="showImport=true" style="--wails-draggable:no-drag">导入数据</NButton>
|
||||||
</NSpace>
|
</NSpace>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-1">
|
<div class="flex-1">
|
||||||
@@ -25,12 +26,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<Preview v-model:showModal="showPreviewRow" :previewRow="previewRow"/>
|
<Preview v-model:showModal="showPreviewRow" :previewRow="previewRow"/>
|
||||||
<ShowLoading :loadingText="loadingText" :isLoading="loading"/>
|
<ShowLoading :loadingText="loadingText" :isLoading="loading"/>
|
||||||
|
<ImportJson v-model:showModal="showImport" @submit="handleImport"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import {NButton, NImage, NTooltip} from "naive-ui"
|
import {NButton, NImage, NTooltip} from "naive-ui"
|
||||||
import {computed, h, onMounted, ref, watch} from "vue"
|
import {computed, h, onMounted, ref, watch, provide} from "vue"
|
||||||
import type {appType} from "@/types/app"
|
import type {appType} from "@/types/app"
|
||||||
|
|
||||||
import type {DataTableRowKey, ImageRenderToolbarProps} from "naive-ui"
|
import type {DataTableRowKey, ImageRenderToolbarProps} from "naive-ui"
|
||||||
@@ -42,23 +44,19 @@ import {useIndexStore} from "@/stores"
|
|||||||
import appApi from "@/api/app"
|
import appApi from "@/api/app"
|
||||||
import {DwStatus} from "@/const"
|
import {DwStatus} from "@/const"
|
||||||
import ResAction from "@/components/ResAction.vue"
|
import ResAction from "@/components/ResAction.vue"
|
||||||
|
import ImportJson from "@/components/ImportJson.vue"
|
||||||
import {useEventStore} from "@/stores/event"
|
import {useEventStore} from "@/stores/event"
|
||||||
import {BrowserOpenURL, ClipboardSetText} from "../../wailsjs/runtime"
|
import {BrowserOpenURL, ClipboardSetText} from "../../wailsjs/runtime"
|
||||||
|
|
||||||
const eventStore = useEventStore()
|
const eventStore = useEventStore()
|
||||||
|
|
||||||
const isProxy = computed(() => {
|
const isProxy = computed(() => {
|
||||||
return store.isProxy
|
return store.isProxy
|
||||||
})
|
})
|
||||||
|
|
||||||
const data = ref<any[]>([])
|
const data = ref<any[]>([])
|
||||||
|
|
||||||
const store = useIndexStore()
|
const store = useIndexStore()
|
||||||
|
|
||||||
const tableHeight = computed(() => {
|
const tableHeight = computed(() => {
|
||||||
return store.tableHeight - 132
|
return store.tableHeight - 132
|
||||||
})
|
})
|
||||||
|
|
||||||
const resourcesType = ref<string[]>(["all"])
|
const resourcesType = ref<string[]>(["all"])
|
||||||
const options = [
|
const options = [
|
||||||
{
|
{
|
||||||
@@ -216,12 +214,17 @@ const columns = ref<any[]>([
|
|||||||
}
|
}
|
||||||
])
|
])
|
||||||
const downIndex = ref(0)
|
const downIndex = ref(0)
|
||||||
|
|
||||||
const checkedRowKeysValue = ref<DataTableRowKey[]>([])
|
const checkedRowKeysValue = ref<DataTableRowKey[]>([])
|
||||||
const showPreviewRow = ref(false)
|
const showPreviewRow = ref(false)
|
||||||
const previewRow = ref<appType.MediaInfo>()
|
const previewRow = ref<appType.MediaInfo>()
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const loadingText = ref("")
|
const loadingText = ref("")
|
||||||
|
const isDebug = ref(false)
|
||||||
|
const showImport = ref(false)
|
||||||
|
let clickCount = 0
|
||||||
|
let clickTimeout: any = null
|
||||||
|
|
||||||
|
provide('isDebug', isDebug);
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const temp = localStorage.getItem("resources-type")
|
const temp = localStorage.getItem("resources-type")
|
||||||
@@ -297,6 +300,15 @@ const dataAction = (row: appType.MediaInfo, index: number, type: string) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
break
|
break
|
||||||
|
case "json":
|
||||||
|
ClipboardSetText(JSON.stringify(row)).then((is: boolean) => {
|
||||||
|
if (is) {
|
||||||
|
window?.$message?.success("复制成功")
|
||||||
|
} else {
|
||||||
|
window?.$message?.error("复制失败")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
break
|
||||||
case "open":
|
case "open":
|
||||||
BrowserOpenURL(row.Url)
|
BrowserOpenURL(row.Url)
|
||||||
break;
|
break;
|
||||||
@@ -444,4 +456,40 @@ const decodeWxFile = (row: appType.MediaInfo, index: number) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const triggerEvent = ()=>{
|
||||||
|
if(isDebug.value) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
clickCount++
|
||||||
|
if (clickCount === 5) {
|
||||||
|
// 连续点击5次开启debug
|
||||||
|
isDebug.value = true
|
||||||
|
clickCount = 0
|
||||||
|
} else {
|
||||||
|
clearTimeout(clickTimeout);
|
||||||
|
clickTimeout = setTimeout(() => {
|
||||||
|
clickCount = 0
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleImport = (content: string)=>{
|
||||||
|
content.split("\n").forEach((line, index) => {
|
||||||
|
try {
|
||||||
|
let res = JSON.parse(line)
|
||||||
|
console.log("handleImport", res)
|
||||||
|
if (res && res?.Id) {
|
||||||
|
res.Id = res.Id + Math.floor(Math.random() * 100000)
|
||||||
|
res.SavePath = ""
|
||||||
|
res.Status = "ready"
|
||||||
|
data.value.unshift(res)
|
||||||
|
}
|
||||||
|
}catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
localStorage.setItem("resources-data", JSON.stringify(data.value))
|
||||||
|
showImport.value = false
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
class="px-5 py-5"
|
class="px-5 py-5"
|
||||||
>
|
>
|
||||||
<NFormItem label="代理Host" path="Port" size="small">
|
<NFormItem label="代理Host" path="Port" size="small">
|
||||||
<NInput v-model:value="formValue.Host" placeholder="0.0.0.0" style="width:256px"/>
|
<NInput v-model:value="formValue.Host" placeholder="127.0.0.1" style="width:256px"/>
|
||||||
<NTooltip trigger="hover">
|
<NTooltip trigger="hover">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<NIcon size="20" class="pl-1">
|
<NIcon size="20" class="pl-1">
|
||||||
@@ -37,6 +37,25 @@
|
|||||||
<NButton strong secondary type="success" @click="selectDir">选择</NButton>
|
<NButton strong secondary type="success" @click="selectDir">选择</NButton>
|
||||||
</NSpace>
|
</NSpace>
|
||||||
</NFormItem>
|
</NFormItem>
|
||||||
|
<NFormItem label="文件命名" path="FilenameLen" size="small">
|
||||||
|
<NInputNumber v-model:value="formValue.FilenameLen" :min="0" :max="9999" placeholder="0" style="width:256px"/>
|
||||||
|
<NSwitch class="pl-1" v-model:value="formValue.FilenameTime" aria-placeholder="随机数">
|
||||||
|
<template #checked>
|
||||||
|
是
|
||||||
|
</template>
|
||||||
|
<template #unchecked>
|
||||||
|
否
|
||||||
|
</template>
|
||||||
|
</NSwitch>
|
||||||
|
<NTooltip trigger="hover">
|
||||||
|
<template #trigger>
|
||||||
|
<NIcon size="20" class="pl-1">
|
||||||
|
<HelpCircleOutline />
|
||||||
|
</NIcon>
|
||||||
|
</template>
|
||||||
|
<span>输入框控制文件命名的长度(不含时间、0为无效,此选项有描述信息时有效),开关控制文件末尾是否添加时间标识</span>
|
||||||
|
</NTooltip>
|
||||||
|
</NFormItem>
|
||||||
<NFormItem label="主题" path="theme" size="small">
|
<NFormItem label="主题" path="theme" size="small">
|
||||||
<NRadio :checked="formValue.Theme === 'lightTheme'" value="lightTheme" name="theme" @change="handleChange">浅色主题</NRadio>
|
<NRadio :checked="formValue.Theme === 'lightTheme'" value="lightTheme" name="theme" @change="handleChange">浅色主题</NRadio>
|
||||||
<NRadio :checked="formValue.Theme === 'darkTheme'" value="darkTheme" name="theme" @change="handleChange">深色主题</NRadio>
|
<NRadio :checked="formValue.Theme === 'darkTheme'" value="darkTheme" name="theme" @change="handleChange">深色主题</NRadio>
|
||||||
@@ -76,6 +95,7 @@
|
|||||||
</NFormItem>
|
</NFormItem>
|
||||||
<NFormItem label="上游代理" path="UpstreamProxy" size="small">
|
<NFormItem label="上游代理" path="UpstreamProxy" size="small">
|
||||||
<NInput v-model:value="formValue.UpstreamProxy" placeholder="例如: http://127.0.0.1:7890" style="width:256px"/>
|
<NInput v-model:value="formValue.UpstreamProxy" placeholder="例如: http://127.0.0.1:7890" style="width:256px"/>
|
||||||
|
<NSwitch class="pl-1" v-model:value="formValue.OpenProxy" />
|
||||||
<NTooltip trigger="hover">
|
<NTooltip trigger="hover">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<NIcon size="20" class="pl-1">
|
<NIcon size="20" class="pl-1">
|
||||||
@@ -85,9 +105,6 @@
|
|||||||
<span>可结合其他代理工具,用于访问国外网站、以及正常网络无法访问的资源(格式http://username:password@your.proxy.server:port)</span>
|
<span>可结合其他代理工具,用于访问国外网站、以及正常网络无法访问的资源(格式http://username:password@your.proxy.server:port)</span>
|
||||||
</NTooltip>
|
</NTooltip>
|
||||||
</NFormItem>
|
</NFormItem>
|
||||||
<NFormItem label="开启代理" path="OpenProxy" size="small">
|
|
||||||
<NSwitch v-model:value="formValue.OpenProxy" />
|
|
||||||
</NFormItem>
|
|
||||||
<NFormItem label="下载代理" path="DownloadProxy" size="small">
|
<NFormItem label="下载代理" path="DownloadProxy" size="small">
|
||||||
<NSwitch v-model:value="formValue.DownloadProxy" />
|
<NSwitch v-model:value="formValue.DownloadProxy" />
|
||||||
<NTooltip trigger="hover">
|
<NTooltip trigger="hover">
|
||||||
|
|||||||
7
main.go
7
main.go
@@ -23,9 +23,12 @@ var assets embed.FS
|
|||||||
//go:embed build/appicon.png
|
//go:embed build/appicon.png
|
||||||
var icon []byte
|
var icon []byte
|
||||||
|
|
||||||
|
//go:embed wails.json
|
||||||
|
var wailsJson string
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Create an instance of the app structure
|
// Create an instance of the app structure
|
||||||
app := core.GetApp(assets)
|
app := core.GetApp(assets, wailsJson)
|
||||||
isMac := runtime.GOOS == "darwin"
|
isMac := runtime.GOOS == "darwin"
|
||||||
// menu
|
// menu
|
||||||
appMenu := menu.NewMenu()
|
appMenu := menu.NewMenu()
|
||||||
@@ -58,6 +61,8 @@ func main() {
|
|||||||
|_| \___| |___/ \__,_| \___/ \_/\_/ |_| |_| |_| \___/ \__ ,_| \__,_| \___| |_|`
|
|_| \___| |___/ \__,_| \___/ \_/\_/ |_| |_| |_| \___/ \__ ,_| \__,_| \___| |_|`
|
||||||
|
|
||||||
log.Println(logo)
|
log.Println(logo)
|
||||||
|
fmt.Println("version", app.Version)
|
||||||
|
fmt.Println("lockfile:", app.LockFile)
|
||||||
app.Startup(ctx)
|
app.Startup(ctx)
|
||||||
},
|
},
|
||||||
OnShutdown: func(ctx context.Context) {
|
OnShutdown: func(ctx context.Context) {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
"info": {
|
"info": {
|
||||||
"companyName": "res-downloader",
|
"companyName": "res-downloader",
|
||||||
"productName": "res-downloader",
|
"productName": "res-downloader",
|
||||||
"productVersion": "3.0.2",
|
"productVersion": "3.0.3",
|
||||||
"copyright": "Copyright © 2023",
|
"copyright": "Copyright © 2023",
|
||||||
"comments": "This is a high-value, high-performance, and diverse resource downloader called res-downloader."
|
"comments": "This is a high-value, high-performance, and diverse resource downloader called res-downloader."
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user