commit a7f65f2f4e8d739e02fc9c7778f41e1f8343a31e
parent 46f8f4ef3cbc46e5a20d02342f065ad3d892fd2d
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Fri, 25 Sep 2026 12:38:52 -0400
docs: keep-videos in the ops section — scan first, download the notDownloaded ids, re-run
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
1 file changed, 12 insertions(+), 0 deletions(-)
diff --git a/RUNNING_IN_DOCKER.md b/RUNNING_IN_DOCKER.md
@@ -249,6 +249,7 @@ pnpm ops channel-config --json '{"slug":"the-quartering","patch":{"downloadFil
pnpm ops channel-priority --json '{"slugs":["the-quartering"],"operation":"download","tier":"paused"}'
pnpm ops lane --json '{"lane":"download","held":true}'
pnpm ops refresh-report --json '{"all":true}'
+pnpm ops keep-videos --json '{"slug":"paramount-tactical","match":"TheQuartering","dryRun":true}'
pnpm ops get channel the-quartering
pnpm ops list # every action name
```
@@ -266,6 +267,17 @@ Three things to know before you script against it:
a `downloadFilter` object. That is what routes them through the form's own
validators, so a bad regex is refused here with the sentence the form shows.
`""` clears a field, exactly as clearing the input does.
+- **`keep-videos` sets the do-not-clean marker** — the video page's "Do not
+ clean" toggle, over every video of one channel whose title or description
+ matches `match`. `match` is matched exactly as a `downloadFilterInclude` is (a
+ case-insensitive regex over title + description, the same compile), and
+ `fields: ["title"]` or `["description"]` narrows it to one half; `dryRun: true`
+ reports without writing. The marker lives in the video's `data/<id>/`, so it
+ is two steps on a fresh channel: run `metadata-scan` first (an id with no text
+ cannot match — the reply counts those as `unscanned`), then `keep-videos`.
+ Matches that were never downloaded come back in `notDownloaded` rather than
+ getting a directory; pass them to `download-missing` and run `keep-videos`
+ again to mark them.
The read side needs no new routes for jobs: `/api/jobs/active`,
`/api/jobs/<id>/log`, `/api/scheduler/status` and `/api/auto-queue/status`