| name | quark-auto-save |
| description | Manage quark-auto-save tasks via CLI. (QAS, 夸克自动转存, 夸克转存, 夸克订阅, 管理任务, 运行任务, 修复失效链接, pan.quark.cn) |
| metadata | {"openclaw":{"emoji":"💾","homepage":"https://github.com/Cp0204/quark-auto-save","requires":{"env":["QAS_BASE_URL","QAS_TOKEN"],"anyBins":["curl","python3"]},"primaryEnv":"QAS_TOKEN"}} |
quark-auto-save
Manage quark-auto-save tasks via CLI.
QAS, 夸克自动转存, 夸克转存, 夸克订阅, 管理任务, 运行任务, 修复失效链接
When user send message like https://pan.quark.cn/s/***, get detail, add a QAS task.
⚠️ Prerequisites
Env:
Set in the skill's env config (e.g., openclaw.json → skills.entries.quark-auto-save.env.QAS_BASE_URL). Restart gateway after editing.
First Configuration: Analyze User Habits
After the user sets the token, the following analysis must be performed and recorded in TOOLS.md:
-
Get Current Configuration:
python3 {baseDir}/scripts/qas_client.py get-config
-
Analyze Saving Habits:
- Extract
savepath directory patterns from existing tasks (e.g., /video/tv/, /video/anime/, /video/movie/)
- For
pattern + replace: deduce the final renamed filename format by applying the regex to a sample source file (e.g., 01.mp4 → Black Mirror.S01E01.mp4). Record the result pattern, not the raw regex.
- Note which
magic_regex key the user prefers (e.g. $TV_MAGIC)
-
Record to TOOLS.md:
The following is just an example, not specific values, everything is analyzed based on user configuration.
### quark-auto-save habits
#### TV Series
- Directory: `/video/tv/{name}`
- naming preferences: `$TV_MAGIC `(e.g., {TASKNAME}.{SXX}E{E}.{EXT})
#### Anime
- Directory: `/video/anime/{name}`
- naming preferences: `Rick and Morty.S01E01.mp4`
#### Movie
- Directory: `/video/movie/{name} {year}`
- naming preferences: `{TASKNAME}.mp4`
-
...
Python Client
Use {baseDir}/scripts/qas_client.py for all operations:
python3 {baseDir}/scripts/qas_client.py get-config
python3 {baseDir}/scripts/qas_client.py search "query" [-d]
python3 {baseDir}/scripts/qas_client.py get-share "<shareurl>" [-a]
python3 {baseDir}/scripts/qas_client.py check-path "/path"
python3 {baseDir}/scripts/qas_client.py delete-file "/path/to/file"
python3 {baseDir}/scripts/qas_client.py rename-file "/path/to/file" "new_name"
python3 {baseDir}/scripts/qas_client.py add-task '{"taskname": "Name", ...}'
python3 {baseDir}/scripts/qas_client.py run-task [taskname|json]
python3 {baseDir}/scripts/qas_client.py update-task "TaskName" '{"savepath": "/new"}'
python3 {baseDir}/scripts/qas_client.py delete-task "TaskName"
python3 {baseDir}/scripts/qas_client.py update-config '{"key": "value"}'
Task Schema
{
"taskname": "MediaName",
"shareurl": "https://pan.quark.cn/s/xxx#/list/share/fid",
"savepath": "/video/tv/MediaName",
"pattern": "$TV_MAGIC",
"replace": "",
"update_subdir": "",
"ignore_extension": false,
"runweek": [1,2,3,4,5,6,7]
}
Required Fields: taskname, shareurl, savepath
Optional Fields: pattern, replace, update_subdir, ignore_extension, runweek, addition
add-task auto-detects zip/rar/7z files and enables auto_unarchive plugin automatically. No manual addition config needed for this.
Configuration Rules
shareurl Format
https://pan.quark.cn/s/{abc123}
https://pan.quark.cn/s/{abc123}#/list/share/{fid}
Subdirectory Priority
- Video files (mp4, mkv, avi)
- Resolution: 4K > 1080P > 720P
Archive files (zip, rar, 7z) are also supported — auto-unarchive is enabled automatically by add-task run-task.
Get subdir info:
python3 {baseDir}/scripts/qas_client.py get-share "<shareurl>"
Add task example:
python3 {baseDir}/scripts/qas_client.py add-task '{"taskname": "Black Mirror", "shareurl": "https://pan.quark.cn/s/xxx", "savepath": "/video/tv/Black Mirror", "pattern": "$TV_MAGIC"}'
pattern & replace
WIKI:
| Pattern | Replace | Result |
|---|
.* | | Save all files |
\.(mp4|mkv)$ | | Save video files only |
^(\d+)\.mp4 | S02E\1.mp4 | 01.mp4 → S02E01.mp4 |
$TV_MAGIC | | Use custom magic regex |
replace Magic Variables
| Variable | Description |
|---|
{TASKNAME} | Task name |
{II} | Index number (01, 02...) |
{EXT} | File extension |
{SXX} | Season (S01, S02...) |
{E} | Episode number |
{DATE} | Date (YYYYMMDD) |
Workflows
Add New Task
- Search:
python3 {baseDir}/scripts/qas_client.py search "MediaName" -d
- Verify & Get Details:
python3 {baseDir}/scripts/qas_client.py get-share "<shareurl>"
- Check if
shareurl is valid (not banned)
- Check file list for video files and select the subdir
- Analyze
pattern & replace: Ensure the final renamed filename matches the naming preferences in TOOLS.md.
- Source already matches →
"pattern": ".*", replace: "" (save as-is)
- Needs renaming → design
pattern to capture groups, replace with magic variables. E.g., source 01.mp4, TOOLS.md says Black Mirror.S01E01.mp4 → "pattern": "^(\\d+)\\.mp4$", "replace": "{TASKNAME}.S01E\\1.{EXT}"
- Execute:
- One-time (completed series, taskname contains
X集全, 全X集, 完结, 全集, single movie) → run-task
- Subscription (ongoing series that gets new episodes) →
add-task
python3 {baseDir}/scripts/qas_client.py run-task '{"taskname": "MediaName", "shareurl": "...", "savepath": "...", "pattern": "...", "replace": "..."}'
python3 {baseDir}/scripts/qas_client.py add-task '{"taskname": "MediaName", "shareurl": "...", "savepath": "...", "pattern": "...", "replace": "..."}'
savepath and (pattern+replace) MUST follow the user's existing habits recorded in TOOLS.md
- After add-task: trigger
run-task "TaskName" immediately to execute the first save.
Check Invalid Tasks
- Get tasks:
python3 {baseDir}/scripts/qas_client.py get-config
- Identify invalid tasks: tasks with
shareurl_ban key in tasklist
- Check existing files:
python3 {baseDir}/scripts/qas_client.py check-path "<task_savepath>" — record the naming format and the latest episode number (e.g., E24) of already-saved files
- Find replacement:
python3 {baseDir}/scripts/qas_client.py search "<taskname>" -d to get candidate shareurls
- Verify & select shareurl:
python3 {baseDir}/scripts/qas_client.py get-share "<candidate_shareurl>" -a — check file list
- Step 1 — Pick by video format: prefer the shareurl whose file extension matches the existing files (e.g., existing
.mkv → pick .mkv source, existing .mp4 → pick .mp4 source)
- Step 2 — Prefer newer episodes: among candidates with matching format, pick the one whose episode range extends beyond the latest episode (e.g., existing up to E24 → pick shareurl containing E25+)
- Step 3 — Ensure naming consistency: analyze the source filenames against the existing file naming format. Update
pattern/replace so the final renamed result matches the existing naming. If source already matches, keep pattern/replace unchanged.
- Update task:
python3 {baseDir}/scripts/qas_client.py update-task "TaskName" '{"shareurl": "<verified_url>", "shareurl_ban": "", "pattern": "...", "replace": "..."}' — include pattern/replace if they were adjusted
- Trigger run:
python3 {baseDir}/scripts/qas_client.py run-task "TaskName" — execute immediately after fixing the link.
Delete Task
python3 {baseDir}/scripts/qas_client.py delete-task "TaskName"
Update Task
python3 {baseDir}/scripts/qas_client.py update-task "TaskName" '{"savepath": "/new/path"}'
python3 {baseDir}/scripts/qas_client.py update-task "TaskName" '{"pattern": "$TV_MAGIC", "runweek": [1,3,5]}'
Update Config
python3 {baseDir}/scripts/qas_client.py update-config '{"crontab": "0 9 * * *"}'
Run Tasks
python3 {baseDir}/scripts/qas_client.py run-task
python3 {baseDir}/scripts/qas_client.py run-task "TaskName"
python3 {baseDir}/scripts/qas_client.py run-task '{"taskname": "Test", ...}'
Output Format
All commands output text. First word indicates status:
- OK — success, no data
- OK {json} — success with data (JSON on same line)
- ERROR: message — failure
- run-task:
OK on first line, followed by log lines