From 9aae22930f578ec6d4405d39cde2a0d27681c140 Mon Sep 17 00:00:00 2001 From: okxlin Date: Mon, 11 Sep 2023 00:32:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0ChineseSubFinder?= =?UTF-8?q?=E5=88=B0=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/chinesesubfinder/0.53.3/.env.sample | 6 + apps/chinesesubfinder/0.53.3/data.yml | 39 ++++++ .../0.53.3/docker-compose.yml | 33 ++++++ apps/chinesesubfinder/README.md | 112 ++++++++++++++++++ apps/chinesesubfinder/data.yml | 20 ++++ apps/chinesesubfinder/latest/.env.sample | 6 + apps/chinesesubfinder/latest/data.yml | 39 ++++++ .../latest/docker-compose.yml | 33 ++++++ apps/chinesesubfinder/logo.png | Bin 0 -> 4666 bytes docs/app-list.png | Bin 1541215 -> 1530750 bytes 10 files changed, 288 insertions(+) create mode 100644 apps/chinesesubfinder/0.53.3/.env.sample create mode 100644 apps/chinesesubfinder/0.53.3/data.yml create mode 100644 apps/chinesesubfinder/0.53.3/docker-compose.yml create mode 100644 apps/chinesesubfinder/README.md create mode 100644 apps/chinesesubfinder/data.yml create mode 100644 apps/chinesesubfinder/latest/.env.sample create mode 100644 apps/chinesesubfinder/latest/data.yml create mode 100644 apps/chinesesubfinder/latest/docker-compose.yml create mode 100644 apps/chinesesubfinder/logo.png diff --git a/apps/chinesesubfinder/0.53.3/.env.sample b/apps/chinesesubfinder/0.53.3/.env.sample new file mode 100644 index 00000000..cf94ed60 --- /dev/null +++ b/apps/chinesesubfinder/0.53.3/.env.sample @@ -0,0 +1,6 @@ +CONTAINER_NAME="chinesesubfinder" +PANEL_APP_PORT_HTTP="40158" +PANEL_APP_PORT_IMAGE="40159" +DATA_PATH="./data" +MEDIA_PATH="./data/media" +MEDIA_PATH2="./data/media2" diff --git a/apps/chinesesubfinder/0.53.3/data.yml b/apps/chinesesubfinder/0.53.3/data.yml new file mode 100644 index 00000000..0339448e --- /dev/null +++ b/apps/chinesesubfinder/0.53.3/data.yml @@ -0,0 +1,39 @@ +additionalProperties: + formFields: + - default: 40158 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: 40159 + edit: true + envKey: PANEL_APP_PORT_IMAGE + labelEn: WebUI video list with the port used to read pictures (127.0.0.1:port) + labelZh: webui 视频列表读取图片用的端口 (127.0.0.1:port) + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + - default: ./data/media + edit: true + envKey: MEDIA_PATH + labelEn: Media folder path + labelZh: 媒体文件夹路径 + required: true + type: text + - default: ./data/media2 + edit: true + envKey: MEDIA_PATH2 + labelEn: Media folder path + labelZh: 媒体文件夹路径 + required: true + type: text diff --git a/apps/chinesesubfinder/0.53.3/docker-compose.yml b/apps/chinesesubfinder/0.53.3/docker-compose.yml new file mode 100644 index 00000000..9d9936e3 --- /dev/null +++ b/apps/chinesesubfinder/0.53.3/docker-compose.yml @@ -0,0 +1,33 @@ +version: '3' +services: + chinesesubfinder: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:19035" + - "127.0.0.1:${PANEL_APP_PORT_IMAGE}:19037" + volumes: + - ${DATA_PATH}/config:/config + - ${MEDIA_PATH}:/media + - ${MEDIA_PATH2}:/media2 + - ${DATA_PATH}/browser:/root/.cache/rod/browser + environment: + - PUID=1026 + - PGID=100 + - PERMS=true + - TZ=Asia/Shanghai + - UMASK=022 + logging: + driver: "json-file" + options: + max-size: "5m" + hostname: chinesesubfinder + image: allanpk716/chinesesubfinder:v0.53.3 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/chinesesubfinder/README.md b/apps/chinesesubfinder/README.md new file mode 100644 index 00000000..b8c5c47e --- /dev/null +++ b/apps/chinesesubfinder/README.md @@ -0,0 +1,112 @@ +# ChineseSubFinder + +本项目的初衷仅仅是想自动化搞定**限定条件**下 **中文** 字幕,在**第三方**的网站或者接口的下载。 + +> CSF 使用交流目前只有一个 telegram 小组,https://t.me/chinesesubfinder 。 +> +> 个人建议是以使用和讨论为主,bug 的反馈最好去 issue 按模板反馈和提出问题,也好有一个地方追溯。 + +## 前言 + +移除全功能版本,以后都是轻量级(Lite),tag 继续保留,实则都有是一个。不再直接支持某些字幕网站的下载(人多了,对方服务器扛不住),请使用第三方的字幕下载服务,subtitle best,具体请进入程序后去设置界面,会有引导。 + +最新的版本可以查看 [Docker Hub](https://hub.docker.com/repository/docker/allanpk716/chinesesubfinder) ,如果不在 telegram 群内,没有特殊的需求请不要选择 **Beta** 版本使用。 + +## 前置要求 + +如果想顺利的用起来,还是对电影、连续剧的目录有一定的要求的。见文档: + +- [电影的推荐目录结构](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/%E7%94%B5%E5%BD%B1%E5%92%8C%E8%BF%9E%E7%BB%AD%E5%89%A7%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E7%A4%BA%E4%BE%8B.md) +- [连续剧目录结构要求](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/%E8%BF%9E%E7%BB%AD%E5%89%A7%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E8%A6%81%E6%B1%82.md) + +## How to use + +### 如何部署 + +- [Docker 部署教程](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/master/docker/readme.md) +- [如何在 Windows 上使用](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/v0.20教程/01.如何在Windows上使用.md) +- [Docker ChineseSubFinder--中文字幕自动下载 | sleele 的博客 - 第三方教程](https://sleele.com/2021/06/25/docker-chinesesubfinder-中文字幕自动下载/) + +### 如何使用 + +* [使用教程](https://github.com/ChineseSubFinder/ChineseSubFinder/tree/docs/DesignFile/使用教程) +* [传参启动(v0.41.x 之后才支持)](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/传参启动/传参启动.md) + +### API 文档文档 + +- [对外的 http api](https://github.com/ChineseSubFinder/ChineseSubFinder/tree/docs/DesignFile/ApiKey%E8%AE%BE%E8%AE%A1),以及[示例](https://github.com/ChineseSubFinder/ChineseSubFinder/issues/336) + +### 高阶设置 + +- [字幕时间轴校正 V2](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/%E5%AD%97%E5%B9%95%E6%97%B6%E9%97%B4%E8%BD%B4%E6%A0%A1%E6%AD%A3V2.md),有待更新 v0.20.x 对应的设置 + +建议了解的文档: + +- [关于字幕名称命名格式说明](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/%E5%85%B3%E4%BA%8E%E5%AD%97%E5%B9%95%E5%90%8D%E7%A7%B0%E5%91%BD%E5%90%8D%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E.md) + +如果文档没有及时更新,或者描述含糊、歧义的,欢迎提 [ISSUES](https://github.com/ChineseSubFinder/ChineseSubFinder/issues)。 + +## 问题列表 + +如果遇到问题了,可以先看看这里总结的问题,如果未能解决,依然可以继续提问。[问题列表](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/%E9%97%AE%E9%A2%98%E5%88%97%E8%A1%A8.md) + +## 其他文档 + +- [削刮器的推荐设置](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/%E5%89%8A%E5%88%AE%E5%99%A8%E7%9A%84%E6%8E%A8%E8%8D%90%E8%AE%BE%E7%BD%AE.md) +- [如何判断视频是否需要下载、更新字幕的](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E8%A7%86%E9%A2%91%E6%98%AF%E5%90%A6%E9%9C%80%E8%A6%81%E4%B8%8B%E8%BD%BD%E3%80%81%E6%9B%B4%E6%96%B0%E5%AD%97%E5%B9%95%E7%9A%84.md) +- [设计](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/%E8%AE%BE%E8%AE%A1.md) +- [字幕时间轴校正功能实现解析(有待补全)](https://github.com/ChineseSubFinder/ChineseSubFinder/blob/docs/DesignFile/字幕时间轴校正功能实现解析/字幕时间轴校正功能实现解析.md) + +## 如何编译此项目 + +* 首选需要编译 Web 部分,见 frontend/README.md + +* 然后才能编译可执行程序部分 + +> 如果是 Windows,那么可以从这里下载 [MinGW-w64 - for 32 and 64 bit Windows - Browse /Toolchains targetting Win64 at SourceForge.net](https://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win64/) +> +> - [x86_64-posix-seh](https://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win64/Personal Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z) +> +> 后面的 CGO 编译需要: +> +> 1、新建变量: PATH,变量值为:xx\mingw64\bin +> +> 2、新建变量:LIB,变量值为:xx\mingw64\lib +> +> 3、新建变量:INCLUDE,变量值为:xx\mingw64\include +> +> 使用 gcc -v 验证是否生效 + +go mod tidy ,然后需要设置 CGO=1 ,找到 cmd\chinesesubfinder\main.go 这个入口文件就好了。 :joy: + +编译代码如下: + +> cd ./cmd/chinesesubfinder \ +> && go build -ldflags="-s -w" -o /app/chinesesubfinder + +跨平台是没有问题的,作者现在就是 Windows 开发的。因为手头没得 Mac OS ,也懒得整虚拟机去试,应该也是可以直接玩起来的。 + +## 版本 + +请务必使用最新版本,这里忘记(懒得)写更新记录的话,可以去 [Releases](https://github.com/ChineseSubFinder/ChineseSubFinder/releases) 查看最新到什么版本了。 + +> 因为业余时间不多,都是断断续续做的,基本我只能记得最近两个版本的功能··· + +- v0.42.x 新增,支持手动上传字幕,以及在 Web 界面即可预览字幕效果,重写“库”的刷新逻辑。 -- 2022年10月31日 +- ··· +- 完成初版,仅仅支持电影的字幕下载 -- 2021 年 6 月 13 日 + +## 感谢 + +- [iMyon (Myon) ](https://github.com/iMyon) 帮搞定 Web 前端部分 +- [devome](https://github.com/devome) 帮解决 Linux 和 Docker 编译、部署相关问题 +- [宅宅还是度度](https://weibo.com/u/2884534224) 设计 Logo + +感谢下面项目的帮助 + +- [Andyfoo/GoSubTitleSearcher: 字幕搜索查询(go 语言版)](https://github.com/Andyfoo/GoSubTitleSearcher) +- [go-rod/rod: A Devtools driver for web automation and scraping](https://github.com/go-rod/rod) +- [ausaki/subfinder: 字幕查找器](https://github.com/ausaki/subfinder) +- [golandscape/sat: 高性能简繁体转换](https://github.com/golandscape/sat) +- [smacke/ffsubsync: Automagically synchronize subtitles with video](https://github.com/smacke/ffsubsync) +- [shimberger/gohls: A server that exposes a directory for video streaming via web interface](https://github.com/shimberger/gohls) diff --git a/apps/chinesesubfinder/data.yml b/apps/chinesesubfinder/data.yml new file mode 100644 index 00000000..4c899318 --- /dev/null +++ b/apps/chinesesubfinder/data.yml @@ -0,0 +1,20 @@ +name: ChineseSubFinder +tags: + - 工具 +title: 自动化中文字幕下载 +type: 工具 +description: 自动化中文字幕下载 +additionalProperties: + key: chinesesubfinder + name: ChineseSubFinder + tags: + - Tool + shortDescZh: 自动化中文字幕下载 + shortDescEn: Automatic Chinese subtitle download + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://github.com/ChineseSubFinder/ChineseSubFinder + github: https://github.com/ChineseSubFinder/ChineseSubFinder + document: https://github.com/ChineseSubFinder/ChineseSubFinder diff --git a/apps/chinesesubfinder/latest/.env.sample b/apps/chinesesubfinder/latest/.env.sample new file mode 100644 index 00000000..cf94ed60 --- /dev/null +++ b/apps/chinesesubfinder/latest/.env.sample @@ -0,0 +1,6 @@ +CONTAINER_NAME="chinesesubfinder" +PANEL_APP_PORT_HTTP="40158" +PANEL_APP_PORT_IMAGE="40159" +DATA_PATH="./data" +MEDIA_PATH="./data/media" +MEDIA_PATH2="./data/media2" diff --git a/apps/chinesesubfinder/latest/data.yml b/apps/chinesesubfinder/latest/data.yml new file mode 100644 index 00000000..0339448e --- /dev/null +++ b/apps/chinesesubfinder/latest/data.yml @@ -0,0 +1,39 @@ +additionalProperties: + formFields: + - default: 40158 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: 40159 + edit: true + envKey: PANEL_APP_PORT_IMAGE + labelEn: WebUI video list with the port used to read pictures (127.0.0.1:port) + labelZh: webui 视频列表读取图片用的端口 (127.0.0.1:port) + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + - default: ./data/media + edit: true + envKey: MEDIA_PATH + labelEn: Media folder path + labelZh: 媒体文件夹路径 + required: true + type: text + - default: ./data/media2 + edit: true + envKey: MEDIA_PATH2 + labelEn: Media folder path + labelZh: 媒体文件夹路径 + required: true + type: text diff --git a/apps/chinesesubfinder/latest/docker-compose.yml b/apps/chinesesubfinder/latest/docker-compose.yml new file mode 100644 index 00000000..531f81e5 --- /dev/null +++ b/apps/chinesesubfinder/latest/docker-compose.yml @@ -0,0 +1,33 @@ +version: '3' +services: + chinesesubfinder: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:19035" + - "127.0.0.1:${PANEL_APP_PORT_IMAGE}:19037" + volumes: + - ${DATA_PATH}/config:/config + - ${MEDIA_PATH}:/media + - ${MEDIA_PATH2}:/media2 + - ${DATA_PATH}/browser:/root/.cache/rod/browser + environment: + - PUID=1026 + - PGID=100 + - PERMS=true + - TZ=Asia/Shanghai + - UMASK=022 + logging: + driver: "json-file" + options: + max-size: "5m" + hostname: chinesesubfinder + image: allanpk716/chinesesubfinder:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/chinesesubfinder/logo.png b/apps/chinesesubfinder/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c2bcc9618634dabcd33ccb1446401eb3a79bab61 GIT binary patch literal 4666 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