├── .github
└── workflows
│ ├── Auto Build Docker Image.yml
│ ├── Manual Build Docker Image.yml
│ └── Update ReleaseTag.yml
├── Dockerfile
├── README.md
├── ReleaseTag
└── root
├── etc
├── cont-init.d
│ ├── 10-config
│ └── 30-config
└── services.d
│ └── subfinder
│ └── run
└── subfinder
└── subfinder.json
/.github/workflows/Auto Build Docker Image.yml:
--------------------------------------------------------------------------------
1 | name: Auto Build Docker Image.yml
2 |
3 | on:
4 | workflow_dispatch:
5 | schedule:
6 | - cron: '30 21 * * 5'
7 |
8 | jobs:
9 | buildx:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - name: Checkout
13 | uses: actions/checkout@v2
14 |
15 | # Docker Image 构建环境
16 | - name: Set up QEMU
17 | uses: docker/setup-qemu-action@v1
18 |
19 | - name: Set up Docker Buildx
20 | uses: docker/setup-buildx-action@v1
21 |
22 | - name: Login to DockerHub
23 | uses: docker/login-action@v1
24 | with:
25 | username: ${{ secrets.DOCKER_USERNAME }}
26 | password: ${{ secrets.DOCKER_PASSWORD }}
27 |
28 | # 获得仓库中的ReleaseTag
29 | - name: Set Version
30 | id: set-version
31 | run: |
32 | echo "::set-output name=version::$(cat ReleaseTag | head -n1)"
33 | echo "ReleaseTag=$(cat ReleaseTag | head -n1)"
34 |
35 | # 缓存release tag,用作与下一次执行任务时获取到到release tag做对比
36 | - name: Cache tag
37 | id: cache-tag
38 | uses: actions/cache@v2
39 | with:
40 | path: ./tag/
41 | key: ${{ runner.os }}-tag-v${{ steps.set-version.outputs.version }}
42 |
43 | # 获取将latest release tag,未命中缓存则更新ReleaseTag
44 | - name: Get latest release tag
45 | id: get-release-tag
46 | if: steps.cache-tag.outputs.cache-hit != 'true'
47 | run: |
48 | mkdir -p ./tag
49 | echo ${{ steps.set-version.outputs.version }} > ./tag/tag-${{ steps.set-version.outputs.version }}
50 | echo "::set-output name=status::success"
51 |
52 | # 构建docker images 分为tag版和latest版
53 | - name: Build dockerfile tag x86_64
54 | if: steps.get-release-tag.outputs.status == 'success'
55 | uses: docker/build-push-action@v2
56 | with:
57 | file: ./Dockerfile
58 | platforms: linux/amd64
59 | push: true
60 | tags: |
61 | superng6/subfinder:${{ steps.set-version.outputs.version }}
62 | superng6/subfinder:latest
63 |
--------------------------------------------------------------------------------
/.github/workflows/Manual Build Docker Image.yml:
--------------------------------------------------------------------------------
1 | name: Manual Build Docker Image
2 |
3 | on:
4 | push:
5 | paths:
6 | - "ReleaseTag"
7 | workflow_dispatch:
8 |
9 | jobs:
10 | buildx:
11 | runs-on: ubuntu-latest
12 | steps:
13 | - name: Checkout
14 | uses: actions/checkout@v2
15 |
16 | # Docker Image 构建环境
17 | - name: Set up QEMU
18 | uses: docker/setup-qemu-action@v1
19 |
20 | - name: Set up Docker Buildx
21 | uses: docker/setup-buildx-action@v1
22 |
23 | - name: Login to DockerHub
24 | uses: docker/login-action@v1
25 | with:
26 | username: ${{ secrets.DOCKER_USERNAME }}
27 | password: ${{ secrets.DOCKER_PASSWORD }}
28 |
29 | # 获得仓库中的ReleaseTag
30 | - name: Set Version
31 | id: set-version
32 | run: |
33 | echo "::set-output name=version::$(cat ReleaseTag | head -n1)"
34 | echo "ReleaseTag=$(cat ReleaseTag | head -n1)"
35 | echo "::set-output name=status::success"
36 |
37 | # 构建docker images 分为tag版和latest版
38 | - name: Build dockerfile tag x86_64
39 | if: steps.set-version.outputs.status == 'success'
40 | uses: docker/build-push-action@v2
41 | with:
42 | file: ./Dockerfile
43 | platforms: linux/amd64
44 | push: true
45 | tags: |
46 | superng6/subfinder:${{ steps.set-version.outputs.version }}
47 | superng6/subfinder:latest
48 |
--------------------------------------------------------------------------------
/.github/workflows/Update ReleaseTag.yml:
--------------------------------------------------------------------------------
1 | name: Update ReleaseTag
2 |
3 | on:
4 | workflow_dispatch:
5 | schedule:
6 | - cron: '0 21 * * 5'
7 |
8 | jobs:
9 | update:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - name: Checkout codebase
13 | uses: actions/checkout@v2
14 |
15 | # 获取latest release tag,cut切割无关内容。和仓库中LocalReleaseTag对比,之后输出tag给之后的步骤
16 | - name: Set Version
17 | id: set-version
18 | run: |
19 | TAG=$(wget --no-check-certificate -qO- https://api.github.com/repos/ausaki/subfinder/tags | grep 'name' | cut -d\" -f4 | head -1 | cut -c 2- )
20 |
21 | OnlineReleaseTag=${TAG}
22 | LocalReleaseTag=$(cat ReleaseTag | head -n1)
23 |
24 | echo "LocalReleaseTag=$(cat ReleaseTag | head -n1)"
25 | echo "OnlineReleaseTag=${TAG}"
26 |
27 | if [ "${LocalReleaseTag}" != "${OnlineReleaseTag}" ]
28 | then
29 | echo "::set-output name=version::${TAG}"
30 | echo "::set-output name=status::success"
31 | fi
32 |
33 | # 将latest release tag写入到./ReleaseTag
34 | - name: Update ReleaseTag
35 | if: steps.set-version.outputs.status == 'success'
36 | run: |
37 | echo ${{ steps.set-version.outputs.version }} > ./ReleaseTag
38 |
39 | # push到GitHub的项目当中
40 | - name: Push
41 | if: steps.set-version.outputs.status == 'success'
42 | run: |
43 | git config --local user.email "action@github.com"
44 | git config --local user.name "GitHub Action"
45 | git commit -am "Update ReleaseTag ${{ steps.set-version.outputs.version }}"
46 | git push -v --progress
47 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM lsiobase/alpine:3.12 as builder
2 | # set label
3 | LABEL maintainer="NG6"
4 | ARG S6_VER=2.1.0.2
5 | WORKDIR /downloads
6 | # download s6-overlay
7 | RUN if [ "$(uname -m)" = "x86_64" ];then s6_arch=amd64;elif [ "$(uname -m)" = "aarch64" ];then s6_arch=aarch64;elif [ "$(uname -m)" = "armv7l" ];then s6_arch=arm; fi \
8 | && wget --no-check-certificate https://github.com/just-containers/s6-overlay/releases/download/v${S6_VER}/s6-overlay-${s6_arch}.tar.gz \
9 | && mkdir ./s6-overlay \
10 | && tar -xvzf s6-overlay-${s6_arch}.tar.gz -C ./s6-overlay
11 |
12 | FROM python:3.6-slim-buster
13 | # set label
14 | LABEL maintainer="NG6"
15 | ENV TZ=Asia/Shanghai TASK=1d PUID=1026 PGID=100
16 | # copy files
17 | COPY root/ /
18 | COPY --from=builder /downloads/s6-overlay/ /
19 | # install subfinder
20 | RUN apt -y update && apt -y install unrar-free \
21 | && pip install subfinder \
22 | && useradd -u 1000 -U -d /config -s /bin/false abc \
23 | && usermod -G users abc \
24 | && echo "**** cleanup ****" \
25 | && apt-get clean \
26 | && apt-get autoremove \
27 | && rm -rf \
28 | /tmp/* \
29 | /var/lib/apt/lists/* \
30 | /var/tmp/*
31 |
32 | # volumes
33 | VOLUME /config /media
34 |
35 | ENTRYPOINT [ "/init" ]
36 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |    
2 |
3 | # Docker SubFinder 自动刮削字幕器
4 |
5 | ### 自动刮削媒体文件字幕,打开容器后开始遍历媒体文件,遍历结束后休眠,之后每天遍历一次
6 |
7 | Docker Hub:https://hub.docker.com/r/superng6/subfinder
8 |
9 | GitHub:https://www.github.com/SuperNG6/docker-subfinder
10 |
11 | 博客:https://sleele.com/2020/04/09/subfinder
12 |
13 |
14 | 本镜像根据:ausaki的 https://github.com/ausaki/subfinder 字幕查找器制作,自动同步更新最新版本
15 | 具体的参数请参照subfinder的readme进行修改
16 |
17 | 1、配置文件`subfinder.json`位于`/config/subfinder.json`,请根据的你情况自行修改
18 | 2、env里设置`TASK`时间即可
19 | `s 为秒,m 为 分钟,h 为小时,d 为日数`,默认`1d`执行一次任务,例`TASK=1d`
20 |
21 |
22 | ```
23 | {
24 | "languages": ["zh", "en", "zh_chs"],
25 | "exts": ["ass", "srt"],
26 | "method": ["shooter", "zimuzu", "zimuku"],
27 | "video_exts": [".mp4", ".mkv", ".iso"],
28 | "exclude": ["excluded_path/", "*abc.mp4"],
29 | "api_urls": {
30 | // 设置字幕库的搜索 API
31 | "zimuku": "http://www.zimuku.la/search",
32 | // 设置字幕组的搜索 API
33 | "zimuzu": "http://www.zmz2019.com/search",
34 | // 设置字幕组获取字幕下载链接的 API, 注意不包含域名
35 | "zimuzu_api_subtitle_download": "/api/v1/static/subtitle/detail",
36 | // 设置 SubHD 的搜索 API
37 | "subhd": "https://subhd.tv/search",
38 | // 设置 SubHD 获取字幕下载链接的 API, 注意不包含域名
39 | "subhd_api_subtitle_download": "/ajax/down_ajax",
40 | // 设置 SubHD 获取字幕预览的 API, 注意不包含域名
41 | "subhd_api_subtitle_preview": "/ajax/file_ajax"
42 | }
43 | }
44 | ```
45 |
46 |
47 |
48 | ## 使用说明
49 |
50 |
51 | 常用参数说明
52 |
53 | 常用参数说明(详细的参数信息请查看 `subfinder -h`):
54 |
55 | | 参数 | 含义 | 必需 |
56 | | ----------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
57 | | `-l, --languages` | 指定字幕语言,可同时指定多个。每个字幕查找器支持的语言不相同。具体支持的语言请看下文。 | 否,subfinder 默认会下载字幕查找器找到的所有字幕。 |
58 | | `-e, --exts` | 指定字幕文件格式,可同时指定多个。每个字幕查找器支持的文件格式不相同。具体支持的文件格式请看下文。 | 否,subfinder 默认会下载字幕查找器找到的所有字幕。 |
59 | | `-m,--method` | 指定字幕查找器,可同时指定多个。 | 否,subfinder 默认使用 shooter 查找字幕。 |
60 | | `-k, --keyword` | 手动搜索关键字. 当 SubFinder 使用本身的关键字无法搜索到字幕时, 可以通过这个参数手动指定关键字. | 否 |
61 | | `--video_exts` | 视频文件的后缀名(包括.,例如. mp4) | 否 |
62 | | `--ignore` | 忽略本地已有的字幕强行查找字幕. 注意: 这可能会覆盖本地已有的字幕. 默认 False。 | 否 |
63 | | `--exclude` | 排除文件或目录,支持类似于 shell 的文件匹配模式。详情见下文 | 否 |
64 | | `--api_urls` | 指定字幕搜索器的 API URL。详情见下文 | 否 |
65 | | `-c, --conf` | 配置文件 | 否,SubFinder 默认从~/.subfinder.json 读取。 |
66 | | `-s,--silence` | 静默运行,不输出日志 | 否 |
67 | | `--debug` | 调试模式,输出调试日志 | 否 |
68 | | `-h,--help` | 显示帮助信息 | 否 |
69 |
70 | - `--exclude`, 支持的匹配模式类似于 shell,`*` 匹配任意长度的字符串,`?` 匹配一个字符,`[CHARS]` 匹配 CHARS 中的任一字符。例如:
71 |
72 | - 排除包含 `abc` 的目录:`--exclude '*abc*/'`。注意添加单引号,防止 shell 对其进行扩展。
73 |
74 | - 排除包含 `abc` 的文件:`--exclude '*abc*'`。注意和上个例子的区别,匹配目录时结尾有 `/` 目录分隔符,匹配文件则没有。
75 |
76 |
77 | - `--api_urls`
78 |
79 | [字幕库](http://www.zimuku.la) 的链接不太稳定,有时候会更换域名,因此提供 `--api_urls` 选项自定义 API URL,以防域名或链接变动。
80 |
81 | `--api_urls` 只接收 JSON 格式的字符串。
82 |
83 | 获取正确的 API URL 的方法:
84 |
85 | - 字幕库的 API 一般形如 http://www.zimuku.la/search, 这个 URL 就是网页端 “搜索” 功能的 URL。
86 |
87 | - 字幕组的 API 一般形如 http://www.zmz2019.com/search, 这个 URL 同样是网页端 “搜索” 功能的 URL。
88 |
89 | - SubHD 的 API 一般形如 https://subhd.tv/search.
90 |
91 | - 射手网的 API 比较稳定,一般不会变动。
92 |
93 | **如果发现字幕网站的 API URL 发生改变, 欢迎提交 issue.**
94 |
95 | 配置示例:
96 |
97 | ```
98 | {
99 | // 设置字幕库的搜索 API
100 | "zimuku": "http://www.zimuku.la/search",
101 | // 设置字幕组的搜索 API
102 | "zimuzu": "http://www.zmz2019.com/search",
103 | // 设置字幕组获取字幕下载链接的 API, 注意不包含域名
104 | "zimuzu_api_subtitle_download": "/api/v1/static/subtitle/detail",
105 | // 设置 SubHD 的搜索 API
106 | "subhd": "https://subhd.tv/search",
107 | // 设置 SubHD 获取字幕下载链接的 API, 注意不包含域名
108 | "subhd_api_subtitle_download": "/ajax/down_ajax",
109 | // 设置 SubHD 获取字幕预览的 API, 注意不包含域名
110 | "subhd_api_subtitle_preview": "/ajax/file_ajax"
111 | }
112 | ```
113 |
114 | 支持的语言和文件格式:
115 |
116 | | 字幕查找器 | 语言 | 文件格式 |
117 | | ---------- | ----------------------------------- | -------------- |
118 | | shooter | ['zh', 'en'] | ['ass', 'srt'] |
119 | | zimuku | ['zh_chs', 'zh_cht', 'en', 'zh_en'] | ['ass', 'srt'] |
120 | | zimuzu | ['zh_chs', 'zh_cht', 'en', 'zh_en'] | ['ass', 'srt'] |
121 | | subhd | ['zh_chs', 'zh_cht', 'en', 'zh_en'] | ['ass', 'srt'] |
122 |
123 | 语言代码:
124 |
125 | | 代码 | 含义 |
126 | | ------ | ------------------ |
127 | | zh | 中文,简体或者繁体 |
128 | | en | 英文 |
129 | | zh_chs | 简体中文 |
130 | | zh_cht | 繁体中文 |
131 | | zh_en | 双语 |
132 |
133 | ### 配置文件
134 |
135 | 配置文件是 JSON 格式的,支持命令行中的所有选项。命令行中指定的选项优先级高于配置文件的。
136 |
137 | 配置文件中的 key 一一对应于命令行选项,例如 `-m,--method` 对应的 key 为 `method`。
138 |
139 | 示例:
140 |
141 | ```json
142 | {
143 | "languages": ["zh", "en", "zh_chs"],
144 | "exts": ["ass", "srt"],
145 | "method": ["shooter", "zimuzu", "zimuku"],
146 | "video_exts": [".mp4", ".mkv", ".iso"],
147 | "exclude": ["excluded_path/", "*abc.mp4"],
148 | "api_urls": {
149 | // 设置字幕库的搜索 API
150 | "zimuku": "http://www.zimuku.la/search",
151 | // 设置字幕组的搜索 API
152 | "zimuzu": "http://www.zmz2019.com/search",
153 | // 设置字幕组获取字幕下载链接的 API, 注意不包含域名
154 | "zimuzu_api_subtitle_download": "/api/v1/static/subtitle/detail",
155 | // 设置 SubHD 的搜索 API
156 | "subhd": "https://subhd.tv/search",
157 | // 设置 SubHD 获取字幕下载链接的 API, 注意不包含域名
158 | "subhd_api_subtitle_download": "/ajax/down_ajax",
159 | // 设置 SubHD 获取字幕预览的 API, 注意不包含域名
160 | "subhd_api_subtitle_preview": "/ajax/file_ajax"
161 | }
162 | }
163 | ```
164 |
165 |
166 |
167 |
168 | # 本镜像的一些特点
169 | - 做了usermapping,使用你自己的账户权限来运行,这点对于群辉来说尤其重要
170 | - 支持选择执行检查完全部文件后是否后退出容器(默下载完成全部字幕后自动退出容器)
171 |
172 |
173 | # Architecture
174 | 只有x86-64版,arm64版编译失败
175 | | Architecture | Tag |
176 | | ------------ | -------------- |
177 | | x86-64 | latest |
178 |
179 |
180 | # Changelogs
181 | ## 2020/11/28
182 | 1、更新workflow,实现自动更新subfinder release版本
183 | 2、更换base image python:3.6-slim-buster,大幅降低镜像体积
184 |
185 | ## 2020/09/16
186 |
187 | 1、更新subfinder v2.0.1
188 |
189 | ## 2020/07/15
190 |
191 | 1、更新subfinder v1.1.4
192 |
193 | - 将参数 `--repeat` 修改为 `--ignore`.
194 |
195 | - 添加新参数 `-k, --keyword`.
196 |
197 | - 支持 SubHD. SubHD 在下载字幕时经常弹出验证码, 无法通过正常的API获取到字幕的下载链接, 目前的做法是通过 SubHD 的字幕预览功能获取字幕.
198 |
199 | - 修复一些 bug.
200 |
201 | - 注意: 配置文件中的一些配置项修改了名字, 具体查看官方配置文档.
202 |
203 | ## 2020/04/19
204 |
205 | 1、上一个版本有问题,回退 commit@b735680240cf0b2f2734f9d0e9af49a77b81620e
206 |
207 | ## 2020/04/16
208 |
209 | 1、取消定时执行任务,使用inotifywait文件监控 @fanyinghao
210 | 2、启动容器时全局遍历一次媒体文件
211 | 3、增加启动容器时是否遍历媒体文件选项`BS=true`默认开启
212 |
213 | ## 2020/04/14
214 |
215 | 1、根据广大人民群众的意见,修改默认参数为一天执行一次`1d`
216 |
217 | ## 2020/04/11
218 |
219 | 1、去掉cron,改用sleep,降低使用难度,防止cron失效。现在设置更简单,env里设置`TASK`时间即可
220 | 2、 `s 为秒,m 为 分钟,h 为小时,d 为日数`,默认2小时执行一次任务,例`TASK=2h`
221 |
222 |
223 | ## 2020/04/10
224 |
225 | 1、update subfinder 1.1.2
226 | 2、根据作者的意见,删除指定语言参数,默认全部语言
227 | 3、修复zimuzu解析问题
228 | 4、增加了手动选择执行间隔选项,`/config/subfinder-cron`,cron表达式
229 |
230 | ## 2020/04/09
231 |
232 | 1、update subfinder 1.1.1
233 | 2、更改执行计划为,打开容器后开始遍历媒体文件,遍历结束后休眠,之后每隔一小时遍历一次
234 | 3、更改媒体挂载卷为``/media``
235 |
236 | ## 2020/03/05
237 |
238 | 1、first commit
239 |
240 |
241 | # Document
242 |
243 | ## 挂载路径
244 | ``/config`` ``/media``
245 | 单个影视目录
246 | 
247 | 分类挂载影视目录
248 | 
249 | 权限设置
250 | 
251 |
252 | ## 关于群晖
253 |
254 |
255 | 群晖DSM权限设置
256 |
257 | 群晖用户请使用你当前的用户SSH进系统,输入 ``id 你的用户id`` 获取到你的UID和GID并输入进去
258 |
259 | 
260 | 
261 | 
262 |
263 | ### 权限管理设置
264 | 对你的``docker配置文件夹的根目录``进行如图操作,``你的下载文件夹的根目录``进行相似操作,去掉``管理``这个权限,只给``写入``,``读取``权限
265 | 
266 |
267 |
268 |
269 | ## Linux
270 |
271 | 输入 ``id 你的用户id`` 获取到你的UID和GID,替换命令中的PUID、PGID
272 |
273 | __执行命令__
274 | ````
275 | docker create \
276 | --name=subfinder \
277 | -e PUID=1026 \
278 | -e PGID=100 \
279 | -e TZ=Asia/Shanghai \
280 | -e TASK=2h \
281 | -v /path/to/appdata/config:/config \
282 | -v /path/to/libraries:/media \
283 | superng6/subfinder
284 | ````
285 | docker-compose
286 | ````
287 | version: "3"
288 | services:
289 | aria2:
290 | image: superng6/subfinder
291 | container_name: subfinder
292 | environment:
293 | - PUID=1026
294 | - PGID=100
295 | - TZ=Asia/Shanghai
296 | - TASK=2h
297 | volumes:
298 | - /path/to/appdata/config:/config
299 | - /path/to/libraries:/media
300 | ````
301 |
302 | # Preview
303 | 
304 | 
305 | 
306 |
--------------------------------------------------------------------------------
/ReleaseTag:
--------------------------------------------------------------------------------
1 | 2.2.1
2 |
--------------------------------------------------------------------------------
/root/etc/cont-init.d/10-config:
--------------------------------------------------------------------------------
1 | #!/usr/bin/with-contenv bash
2 |
3 | #设置时区
4 | ln -sf /usr/share/zoneinfo/$TZ /etc/localtime
5 | echo $TZ > /etc/timezone
6 |
7 | #修改用户UID GID
8 | groupmod -o -g "$PGID" abc
9 | usermod -o -u "$PUID" abc
10 |
--------------------------------------------------------------------------------
/root/etc/cont-init.d/30-config:
--------------------------------------------------------------------------------
1 | #!/usr/bin/with-contenv bash
2 |
3 | # 检查config配置文件,并创建
4 | if [ ! -e "/config/subfinder.json" ] ; then
5 | cp /subfinder/subfinder.json /config/subfinder.json
6 | fi
7 |
8 | # permissions
9 | chown -R abc:abc \
10 | /config \
11 | /media
12 |
--------------------------------------------------------------------------------
/root/etc/services.d/subfinder/run:
--------------------------------------------------------------------------------
1 | #!/usr/bin/with-contenv bash
2 |
3 | # 启动定时任务,默认一小时执行一次
4 | # 启动subfinder查找字幕
5 | s6-setuidgid abc \
6 | subfinder /media \
7 | -c /config/subfinder.json
8 | echo ==============本轮搜索已结束,下次遍历为${TASK}后==============
9 | sleep $TASK
10 |
--------------------------------------------------------------------------------
/root/subfinder/subfinder.json:
--------------------------------------------------------------------------------
1 | {
2 | "exts": ["ass", "srt"],
3 | "method": ["shooter", "zimuzu", "zimuku","subhd"],
4 | "video_exts": [".mp4", ".mkv", ".iso"],
5 | "api_urls": {
6 | "zimuku": "http://www.zimuku.la/search",
7 | "zimuzu": "http://www.rrys2020.com/search",
8 | "zimuzu_api_subtitle_download": "/api/v1/static/subtitle/detail",
9 | "subhd": "https://subhd.tv/search",
10 | "subhd_api_subtitle_download": "/ajax/down_ajax",
11 | "subhd_api_subtitle_preview": "/ajax/file_ajax"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------