aboutsummaryrefslogtreecommitdiffstats
path: root/AGENTS.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-06 13:01:56 +0200
committerDanilo M. <danix@danix.xyz>2026-10-06 13:01:56 +0200
commit6f366eb8504cfaa84d08b2f24ed8e83179d0e0f6 (patch)
tree4e9676ddf26973444076fea6b8fd6fc470d213e3 /AGENTS.md
downloadcoomer_dl-6f366eb8504cfaa84d08b2f24ed8e83179d0e0f6.tar.gz
coomer_dl-6f366eb8504cfaa84d08b2f24ed8e83179d0e0f6.zip
Initial commit: coomer_dl creator/post/file downloader
Downloads every file of a Coomer creator, a single post, or a single file URL via the site's JSON API. Resumes partial files and reuses the creator folder so re-runs only fetch new posts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'AGENTS.md')
-rw-r--r--AGENTS.md59
1 files changed, 59 insertions, 0 deletions
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..4c44b8d
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,59 @@
+# AGENTS.md
+
+Guidance for AI coding agents working in this repository.
+
+## What this is
+
+`coomer_dl`: single-file Python script that downloads Coomer creators, single
+posts and single files. Runtime dependency: `requests` only. Keep it a single
+file and do not add dependencies. Sibling project: `../bunkr_dl`, same
+structure and `download_file`.
+
+## Download chain
+
+The site sits behind DDoS-Guard. When the script finds nothing, re-inspect the
+API with `curl --compressed -H 'Accept: text/css'` before changing code.
+
+1. `GET /api/v1/<service>/user/<id>/posts?o=N` returns a JSON list of up to 50
+ posts. Pagination stops on a short or empty page.
+2. `GET /api/v1/<service>/user/<id>/post/<post id>` returns
+ `{"post": {...}, ...}`.
+3. `GET /api/v1/<service>/user/<id>/profile` gives the creator `name`, used as
+ the folder name.
+4. Each post has `file` (may be `{}`) and `attachments`, each `{name, path}`.
+ The main file often repeats as an attachment, `post_files` dedupes by path.
+5. `GET /data<path>` 302-redirects to `nN.<domain>/data<path>`.
+
+All API calls need `Accept: text/css`, otherwise 403.
+
+## Conventions
+
+- New options go in the `argparse` setup in `main()` and in the README usage
+ table.
+- `download_file` resumes with a per-request `Range` header. Never mutate the
+ global `headers` dict. 206 appends, 200 overwrites, 416 means already complete.
+- Creator folders are reused across runs (not suffixed like bunkr_dl) so a
+ re-run resumes and only fetches new posts.
+- Use placeholder URLs (`https://coomer.st/onlyfans/user/NAME`) in docs,
+ comments and commit messages, never real creator names or post ids.
+
+## Testing
+
+No test suite. Verify the API side without downloading by stubbing
+`download_file`:
+
+ python - <<'PY'
+ import importlib.util, importlib.machinery
+ l = importlib.machinery.SourceFileLoader('c', 'coomer_dl')
+ c = importlib.util.module_from_spec(importlib.util.spec_from_loader('c', l)); l.exec_module(c)
+ got = []; c.download_file = lambda *a: got.append(a)
+ c.process_creator('https://coomer.st', 'onlyfans', 'NAME', '/tmp/x')
+ print(len(got), got[0])
+ PY
+
+The "Found N posts" total should match `post_count` from the profile endpoint.
+For a full run use `-o` pointing at a temp dir.
+
+## Repo facts
+
+- License: GPLv2 only (`LICENSE`, header in `coomer_dl`).