1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# coomer_dl
Download every file of a Coomer creator, of a single post, or a single file,
from the command line.
- Follows the creator's post pagination (50 posts per API page).
- Saves files as `<post id>_<original name>`, so a post's files stay together.
- Resumes partial files and skips finished ones when run again against the
same folder, so re-running a creator only fetches what is new.
- Works with any Coomer mirror domain, since API and file URLs are built from
the URL you pass.
## Requirements
Python 3.12+ with `requests`.
## Usage
```
coomer_dl [-h] [-o DIR] url
```
| Option | Meaning |
|--------------------|------------------------------------------------------|
| `url` | Creator URL (`https://<domain>/<service>/user/<id>`), post URL (`.../post/<id>`) or file URL (`https://<domain>/data/...`) |
| `-o, --output DIR` | Base download folder (default: `/data/coomer`) |
| `-h, --help` | Show help and exit |
The default folder is set by `DEFAULT_OUTPUT` near the top of the script.
Examples:
```
coomer_dl https://coomer.st/onlyfans/user/NAME
coomer_dl https://coomer.st/onlyfans/user/NAME/post/123456
coomer_dl -o ~/Downloads 'https://coomer.st/data/ab/cd/HASH.mp4?f=name.mp4'
```
Quote file URLs so the shell leaves `?` and `&` alone.
### Where files go
- Creator or post: `OUTPUT/<creator name>/<post id>_<file name>`.
- File URL: `OUTPUT/<file name>`, taken from the `?f=` parameter when present.
## How it works
1. `GET /api/v1/<service>/user/<id>/posts?o=N` pages through the posts, or
`GET /api/v1/<service>/user/<id>/post/<post id>` fetches one.
2. Each post has a `file` and `attachments`, each with a storage `path`.
3. `GET /data<path>` redirects to a file node (`nN.<domain>`) serving the file.
API calls send `Accept: text/css`, without it DDoS-Guard answers 403. When the
script reports nothing found, check these steps against the live site first.
## License
Copyright (C) 2026 Danilo M. <danix@danix.xyz>
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License version 2 as published by the Free
Software Foundation. See [LICENSE](LICENSE) for the full text.
## Development Approach
This project is developed using AI-assisted tools. Code is generated with the help of AI based on human-provided specifications, design decisions, and iterative feedback.
All contributions are reviewed, tested, and curated by the maintainer before being included in the codebase. AI is used as a productivity and exploration tool, while human oversight remains central to all decisions.
The goal is to combine the flexibility of AI-assisted development with standard open-source practices such as transparency, review, and accountability.
|