mirror of
https://github.com/Cp0204/quark-auto-save.git
synced 2026-01-16 17:30:43 +08:00
Compare commits
4 Commits
e274f8d2d0
...
32e4984438
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
32e4984438 | ||
|
|
edbc4c50c9 | ||
|
|
119bd3a516 | ||
|
|
1fad4d7137 |
33
README.md
33
README.md
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
对于一些持续更新的资源,隔段时间去转存十分麻烦。
|
对于一些持续更新的资源,隔段时间去转存十分麻烦。
|
||||||
|
|
||||||
定期执行本脚本自动转存、文件名整理,配合 OpenList, SmartStrm, Emby 可达到自动追更的效果。🥳
|
定期执行本脚本自动转存、文件名整理,配合 [SmartStrm](https://github.com/Cp0204/SmartStrm) / [OpenList](https://github.com/OpenListTeam/OpenList) , Emby 可达到自动追更的效果。🥳
|
||||||
|
|
||||||
|
|
||||||
[![wiki][wiki-image]][wiki-url] [![github releases][gitHub-releases-image]][github-url] [![docker pulls][docker-pulls-image]][docker-url] [![docker image size][docker-image-size-image]][docker-url]
|
[![wiki][wiki-image]][wiki-url] [![github releases][gitHub-releases-image]][github-url] [![docker pulls][docker-pulls-image]][docker-url] [![docker image size][docker-image-size-image]][docker-url]
|
||||||
@ -29,7 +29,7 @@
|
|||||||
> ⛔️⛔️⛔️ 注意!资源不会每时每刻更新,**严禁设定过高的定时运行频率!** 以免账号风控和给夸克服务器造成不必要的压力。雪山崩塌,每一片雪花都有责任!
|
> ⛔️⛔️⛔️ 注意!资源不会每时每刻更新,**严禁设定过高的定时运行频率!** 以免账号风控和给夸克服务器造成不必要的压力。雪山崩塌,每一片雪花都有责任!
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> 开发者≠客服,开源免费≠帮你解决使用问题;本项目Wiki和已经相对完善,遇到问题请先翻阅 Issues 和 Wiki ,请勿盲目发问。
|
> 开发者≠客服,开源免费≠帮你解决使用问题;本项目 Wiki 已经相对完善,遇到问题请先翻阅 Issues 和 Wiki ,请勿盲目发问。
|
||||||
|
|
||||||
## 功能
|
## 功能
|
||||||
|
|
||||||
@ -107,10 +107,11 @@ services:
|
|||||||
|
|
||||||
管理地址:http://yourhost:5005
|
管理地址:http://yourhost:5005
|
||||||
|
|
||||||
| 环境变量 | 默认 | 备注 |
|
| 环境变量 | 默认 | 备注 |
|
||||||
| ---------------- | ---------- | -------- |
|
| ---------------- | ---------- | ---------------------------------------- |
|
||||||
| `WEBUI_USERNAME` | `admin` | 管理账号 |
|
| `WEBUI_USERNAME` | `admin` | 管理账号 |
|
||||||
| `WEBUI_PASSWORD` | `admin123` | 管理密码 |
|
| `WEBUI_PASSWORD` | `admin123` | 管理密码 |
|
||||||
|
| `PORT` | `5005` | 管理后台端口 |
|
||||||
| `PLUGIN_FLAGS` | | 插件标志,如 `-emby,-aria2` 禁用某些插件 |
|
| `PLUGIN_FLAGS` | | 插件标志,如 `-emby,-aria2` 禁用某些插件 |
|
||||||
|
|
||||||
#### 一键更新
|
#### 一键更新
|
||||||
@ -128,23 +129,17 @@ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtow
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 青龙部署
|
|
||||||
|
|
||||||
程序也支持以青龙定时任务的方式运行,但该方式无法使用 WebUI 管理任务,需手动修改配置文件。
|
|
||||||
|
|
||||||
青龙部署说明已转移到 Wiki :[青龙部署教程](https://github.com/Cp0204/quark-auto-save/wiki/部署教程#青龙部署)
|
|
||||||
|
|
||||||
## 使用说明
|
## 使用说明
|
||||||
|
|
||||||
### 正则处理示例
|
### 正则处理示例
|
||||||
|
|
||||||
| pattern | replace | 效果 |
|
| pattern | replace | 效果 |
|
||||||
| -------------------------------------- | ------------ | ---------------------------------------------------------------------- |
|
| -------------------------------------- | ----------------------- | ---------------------------------------------------------------------- |
|
||||||
| `.*` | | 无脑转存所有文件,不整理 |
|
| `.*` | | 无脑转存所有文件,不整理 |
|
||||||
| `\.mp4$` | | 转存所有 `.mp4` 后缀的文件 |
|
| `\.mp4$` | | 转存所有 `.mp4` 后缀的文件 |
|
||||||
| `^【电影TT】花好月圆(\d+)\.(mp4\|mkv)` | `\1.\2` | 【电影TT】花好月圆01.mp4 → 01.mp4<br>【电影TT】花好月圆02.mkv → 02.mkv |
|
| `^【电影TT】花好月圆(\d+)\.(mp4\|mkv)` | `\1.\2` | 【电影TT】花好月圆01.mp4 → 01.mp4<br>【电影TT】花好月圆02.mkv → 02.mkv |
|
||||||
| `^(\d+)\.mp4` | `S02E\1.mp4` | 01.mp4 → S02E01.mp4<br>02.mp4 → S02E02.mp4 |
|
| `^(\d+)\.mp4` | `S02E\1.mp4` | 01.mp4 → S02E01.mp4<br>02.mp4 → S02E02.mp4 |
|
||||||
| `$TV` | | [魔法匹配](#魔法匹配)剧集文件 |
|
| `$TV` | | [魔法匹配](#魔法匹配)剧集文件 |
|
||||||
| `^(\d+)\.mp4` | `{TASKNAME}.S02E\1.mp4` | 01.mp4 → 任务名.S02E01.mp4 |
|
| `^(\d+)\.mp4` | `{TASKNAME}.S02E\1.mp4` | 01.mp4 → 任务名.S02E01.mp4 |
|
||||||
|
|
||||||
更多正则使用说明:[正则处理教程](https://github.com/Cp0204/quark-auto-save/wiki/正则处理教程)
|
更多正则使用说明:[正则处理教程](https://github.com/Cp0204/quark-auto-save/wiki/正则处理教程)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
from datetime import datetime, timedelta
|
|
||||||
import re
|
import re
|
||||||
import requests
|
import requests
|
||||||
|
from sdk.common import iso_to_cst
|
||||||
|
|
||||||
|
|
||||||
class CloudSaver:
|
class CloudSaver:
|
||||||
@ -128,8 +128,7 @@ class CloudSaver:
|
|||||||
# 统一发布时间格式
|
# 统一发布时间格式
|
||||||
pubdate = item.get("pubDate", "")
|
pubdate = item.get("pubDate", "")
|
||||||
if pubdate:
|
if pubdate:
|
||||||
utc_tm = datetime.fromisoformat(pubdate)
|
pubdate = iso_to_cst(pubdate)
|
||||||
pubdate = (utc_tm + timedelta(hours=8)).strftime("%Y-%m-%d %H:%M:%S")
|
|
||||||
# 链接去重
|
# 链接去重
|
||||||
if link.get("link") not in link_array:
|
if link.get("link") not in link_array:
|
||||||
link_array.append(link.get("link"))
|
link_array.append(link.get("link"))
|
||||||
@ -140,8 +139,7 @@ class CloudSaver:
|
|||||||
"content": content,
|
"content": content,
|
||||||
"datetime": pubdate,
|
"datetime": pubdate,
|
||||||
"tags": item.get("tags", []),
|
"tags": item.get("tags", []),
|
||||||
"channel": item.get("channel", ""),
|
"channel": item.get("channelId", ""),
|
||||||
"channel_id": item.get("channelId", ""),
|
|
||||||
"source": "CloudSaver"
|
"source": "CloudSaver"
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
15
app/sdk/common.py
Normal file
15
app/sdk/common.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
from datetime import datetime, timezone, timedelta
|
||||||
|
|
||||||
|
|
||||||
|
def iso_to_cst(iso_time_str: str) -> str:
|
||||||
|
"""将 ISO 格式的时间字符串转换为 CST(China Standard Time) 时间并格式化为 %Y-%m-%d %H:%M:%S 格式
|
||||||
|
|
||||||
|
Args:
|
||||||
|
iso_time_str (str): ISO 格式时间字符串
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: CST(China Standard Time) 时间字符串
|
||||||
|
"""
|
||||||
|
dt = datetime.fromisoformat(iso_time_str)
|
||||||
|
dt_cst = dt.astimezone(timezone(timedelta(hours=8)))
|
||||||
|
return dt_cst.strftime("%Y-%m-%d %H:%M:%S") if dt_cst.year >= 1970 else ""
|
||||||
@ -1,8 +1,9 @@
|
|||||||
import re
|
import re
|
||||||
from datetime import datetime, timedelta
|
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
|
from sdk.common import iso_to_cst
|
||||||
|
|
||||||
|
|
||||||
class PanSou:
|
class PanSou:
|
||||||
"""
|
"""
|
||||||
@ -55,13 +56,12 @@ class PanSou:
|
|||||||
)
|
)
|
||||||
format_results = []
|
format_results = []
|
||||||
link_array = []
|
link_array = []
|
||||||
for channel in search_results:
|
for item in search_results:
|
||||||
url = channel.get("url", "")
|
url = item.get("url", "")
|
||||||
note = channel.get("note", "")
|
note = item.get("note", "")
|
||||||
tm = channel.get("datetime", "")
|
tm = item.get("datetime", "")
|
||||||
if tm:
|
if tm:
|
||||||
utc_tm = datetime.strptime(tm, "%Y-%m-%dT%H:%M:%SZ")
|
tm = iso_to_cst(tm)
|
||||||
tm = (utc_tm + timedelta(hours=8)).strftime("%Y-%m-%d %H:%M:%S")
|
|
||||||
|
|
||||||
match = re.search(pattern, note)
|
match = re.search(pattern, note)
|
||||||
if match:
|
if match:
|
||||||
@ -74,10 +74,11 @@ class PanSou:
|
|||||||
if url != "" and url not in link_array:
|
if url != "" and url not in link_array:
|
||||||
link_array.append(url)
|
link_array.append(url)
|
||||||
format_results.append({
|
format_results.append({
|
||||||
|
"shareurl": url,
|
||||||
"taskname": title,
|
"taskname": title,
|
||||||
"content": content,
|
"content": content,
|
||||||
"shareurl": url,
|
|
||||||
"datetime": tm,
|
"datetime": tm,
|
||||||
|
"channel": item.get("source", ""),
|
||||||
"source": "PanSou"
|
"source": "PanSou"
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -303,6 +303,7 @@
|
|||||||
<a :href="suggestion.shareurl" target="_blank" @click.stop>{{ suggestion.shareurl }}</a>
|
<a :href="suggestion.shareurl" target="_blank" @click.stop>{{ suggestion.shareurl }}</a>
|
||||||
</small>
|
</small>
|
||||||
<span class="badge bg-transparent border border-success text-success">{{ suggestion.source || "网络公开" }}</span>
|
<span class="badge bg-transparent border border-success text-success">{{ suggestion.source || "网络公开" }}</span>
|
||||||
|
<span class="badge bg-transparent border border-info text-info">{{ suggestion.channel }}</span>
|
||||||
<span v-if="suggestion.datetime" class="badge bg-transparent border border-dark text-dark">{{ suggestion.datetime }}</span>
|
<span v-if="suggestion.datetime" class="badge bg-transparent border border-dark text-dark">{{ suggestion.datetime }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -7,7 +7,6 @@ class Smartstrm:
|
|||||||
"strmtask": "", # SmartStrm 任务名,支持多个如 `tv,movie`
|
"strmtask": "", # SmartStrm 任务名,支持多个如 `tv,movie`
|
||||||
"xlist_path_fix": "", # 路径映射, SmartStrm 任务使用 quark 驱动时无须填写;使用 openlist 驱动时需填写 `/storage_mount_path:/quark_root_dir` ,例如把夸克根目录挂载在 OpenList 的 /quark 下,则填写 `/quark:/` ;以及 SmartStrm 会使 OpenList 强制刷新目录,无需再用 alist 插件刷新。
|
"xlist_path_fix": "", # 路径映射, SmartStrm 任务使用 quark 驱动时无须填写;使用 openlist 驱动时需填写 `/storage_mount_path:/quark_root_dir` ,例如把夸克根目录挂载在 OpenList 的 /quark 下,则填写 `/quark:/` ;以及 SmartStrm 会使 OpenList 强制刷新目录,无需再用 alist 插件刷新。
|
||||||
}
|
}
|
||||||
default_task_config = {}
|
|
||||||
is_active = False
|
is_active = False
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
@ -47,16 +46,12 @@ class Smartstrm:
|
|||||||
json=payload,
|
json=payload,
|
||||||
timeout=5,
|
timeout=5,
|
||||||
)
|
)
|
||||||
# 检查响应状态
|
response = response.json()
|
||||||
if response.status_code == 200:
|
if response.get("success"):
|
||||||
response = response.json()
|
print(
|
||||||
if response.get("success"):
|
f"SmartStrm 触发任务: [{response['task']['name']}] {response['task']['storage_path']} 成功✅"
|
||||||
print(
|
)
|
||||||
f"SmartStrm 触发任务: [{response['task']['name']}] {response['task']['storage_path']} 成功✅"
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
print(f"SmartStrm 触发任务: {response['message']}")
|
|
||||||
else:
|
else:
|
||||||
print(f"SmartStrm 触发任务: {response.status_code}")
|
print(f"SmartStrm 触发任务: {response['message']}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"SmartStrm 触发任务:出错 {e}")
|
print(f"SmartStrm 触发任务:出错 {str(e)}")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user