Compare commits

..

19 Commits

Author SHA1 Message Date
github-actions[bot] 91b536b375 chore: nightly index update [skip ci] 2026-05-10 06:13:09 +00:00
github-actions[bot] 521543db72 chore: nightly index update [skip ci] 2026-05-09 05:49:57 +00:00
github-actions[bot] 18f83d6698 chore: nightly index update [skip ci] 2026-05-08 05:31:35 +00:00
github-actions[bot] d88898d7dd chore: nightly index update [skip ci] 2026-05-07 06:11:52 +00:00
github-actions[bot] edd4c19985 chore: nightly index update [skip ci] 2026-05-06 05:59:02 +00:00
github-actions[bot] 61a80ee513 chore: nightly index update [skip ci] 2026-05-05 05:44:29 +00:00
github-actions[bot] 5b8d809441 chore: nightly index update [skip ci] 2026-05-04 06:15:48 +00:00
HugeFrog24 884490925c Path uniqueness fix 2026-05-03 16:32:55 +02:00
github-actions[bot] 1360ef781c chore: nightly index update [skip ci] 2026-05-01 06:17:34 +00:00
github-actions[bot] 8db1c640dd chore: nightly index update [skip ci] 2026-04-30 06:00:15 +00:00
github-actions[bot] bf0efef146 chore: nightly index update [skip ci] 2026-04-29 05:55:43 +00:00
github-actions[bot] 75727100df chore: nightly index update [skip ci] 2026-04-28 06:08:26 +00:00
github-actions[bot] e5ddda0181 chore: nightly index update [skip ci] 2026-04-27 05:55:45 +00:00
github-actions[bot] 04c64810dc chore: nightly index update [skip ci] 2026-04-25 12:50:53 +00:00
github-actions[bot] 78c3cf73b1 chore: nightly index update [skip ci] 2026-04-25 05:13:07 +00:00
github-actions[bot] cadecd8900 chore: nightly index update [skip ci] 2026-04-24 05:36:52 +00:00
github-actions[bot] 6ae4eb9e40 chore: nightly index update [skip ci] 2026-04-23 05:31:46 +00:00
github-actions[bot] e2627df1a3 chore: nightly index update [skip ci] 2026-04-22 05:27:39 +00:00
github-actions[bot] b9bea64471 chore: nightly index update [skip ci] 2026-04-21 05:28:56 +00:00
5 changed files with 4 additions and 2823 deletions
-5
View File
@@ -13,11 +13,6 @@ PINKCUFFS_USERNAME=your-email-or-username
PINKCUFFS_PASSWORD=your-password
PINKCUFFS_LOGIN_COOKIE=wordpress_logged_in_<hash>=<value>
# femuniverse.com credentials (separate membership)
FEMUNIVERSE_USERNAME=your-email-or-username
FEMUNIVERSE_PASSWORD=your-password
FEMUNIVERSE_LOGIN_COOKIE=wordpress_logged_in_<hash>=<value>
# PeerTube upload target
PEERTUBE_URL=https://your-peertube-instance.example
PEERTUBE_USER=admin
-2
View File
@@ -38,8 +38,6 @@ jobs:
JAILBIRDZ_PASSWORD: ${{ secrets.JAILBIRDZ_PASSWORD }}
PINKCUFFS_USERNAME: ${{ secrets.PINKCUFFS_USERNAME }}
PINKCUFFS_PASSWORD: ${{ secrets.PINKCUFFS_PASSWORD }}
FEMUNIVERSE_USERNAME: ${{ secrets.FEMUNIVERSE_USERNAME }}
FEMUNIVERSE_PASSWORD: ${{ secrets.FEMUNIVERSE_PASSWORD }}
- name: Commit updated video_map.json
if: always() # save progress even if main.py crashed or timed out
+4 -11
View File
@@ -1,6 +1,6 @@
# 𝒥𝒶𝒾𝓁𝒷𝒾𝓇𝒹𝓏-𝒹𝓁
Jailbirdz.com, Pinkcuffs.com, and Femuniverse.com are Arizona-based subscription video sites publishing arrest and jail roleplay scenarios featuring women. This tool scrapes the member area of any combination of these sites, downloads the videos, and re-hosts them on a self-owned PeerTube instance.
Jailbirdz.com and Pinkcuffs.com are Arizona-based subscription video sites publishing arrest and jail roleplay scenarios featuring women. This tool scrapes the member area of one or both sites, downloads the videos, and re-hosts them on a self-owned PeerTube instance.
> [!NOTE]
> This tool does not bypass authentication, modify the site, or intercept anything it isn't entitled to. A valid, paid membership is required. The scraper authenticates using your own session cookie and accesses only content your account can already view in a browser.
@@ -23,9 +23,9 @@ cp .env.example .env
Set credentials for whichever sites you have a membership on. You don't need both.
**Option A — credentials (recommended):** set `JAILBIRDZ_USERNAME` + `JAILBIRDZ_PASSWORD` (and/or the `PINKCUFFS_*` / `FEMUNIVERSE_*` equivalents) in `.env`. `main.py` logs in automatically on startup.
**Option A — credentials (recommended):** set `JAILBIRDZ_USERNAME` + `JAILBIRDZ_PASSWORD` (and/or the `PINKCUFFS_*` equivalents) in `.env`. `main.py` logs in automatically on startup.
**Option B — manual cookie:** set `JAILBIRDZ_LOGIN_COOKIE` (and/or `PINKCUFFS_LOGIN_COOKIE` / `FEMUNIVERSE_LOGIN_COOKIE`) yourself. Get the value from browser DevTools → Storage → Cookies — copy the full `name=value` of the `wordpress_logged_in_*` cookie.
**Option B — manual cookie:** set `JAILBIRDZ_LOGIN_COOKIE` (and/or `PINKCUFFS_LOGIN_COOKIE`) yourself. Get the value from browser DevTools → Storage → Cookies — copy the full `name=value` of the `wordpress_logged_in_*` cookie.
Sites with no credentials are skipped automatically when running `python main.py`.
@@ -35,8 +35,6 @@ Sites with no credentials are skipped automatically when running `python main.py
- `JAILBIRDZ_LOGIN_COOKIE` — jailbirdz.com session cookie (fallback).
- `PINKCUFFS_USERNAME` / `PINKCUFFS_PASSWORD` — pinkcuffs.com login.
- `PINKCUFFS_LOGIN_COOKIE` — pinkcuffs.com session cookie (fallback).
- `FEMUNIVERSE_USERNAME` / `FEMUNIVERSE_PASSWORD` — femuniverse.com login.
- `FEMUNIVERSE_LOGIN_COOKIE` — femuniverse.com session cookie (fallback).
- `PEERTUBE_URL` — base URL of your PeerTube instance.
- `PEERTUBE_USER` — PeerTube username.
- `PEERTUBE_CHANNEL` — channel to upload to.
@@ -52,7 +50,6 @@ Discovers all post URLs via the WordPress REST API, then visits each page with a
python main.py # scrape all sites you have credentials for
python main.py --site jailbirdz # scrape one site only
python main.py --site pinkcuffs --site jailbirdz # explicit multi-site
python main.py --site femuniverse # femuniverse only
```
Results are written to `video_map.json`. Safe to re-run — already-scraped posts are skipped.
@@ -69,7 +66,7 @@ Options:
--reorganize Rename existing files to match current naming mode
-w, --workers N Concurrent downloads (default: 4)
-n, --dry-run Print what would be downloaded
--site SITE Limit to one site (jailbirdz, pinkcuffs, or femuniverse); repeatable
--site SITE Limit to one site (jailbirdz or pinkcuffs); repeatable
```
Resumes partial downloads. The chosen naming mode is saved to `.naming_mode` inside the output directory and persists across runs. Filenames that would clash are placed into subfolders.
@@ -108,10 +105,6 @@ gh secret set JAILBIRDZ_PASSWORD
# pinkcuffs (if you have a membership)
gh secret set PINKCUFFS_USERNAME
gh secret set PINKCUFFS_PASSWORD
# femuniverse (if you have a membership)
gh secret set FEMUNIVERSE_USERNAME
gh secret set FEMUNIVERSE_PASSWORD
```
**Seed CI with your current progress before the first run:**
-5
View File
@@ -15,9 +15,4 @@ SITES: Final[dict[str, dict[str, str]]] = {
"cookie_domain": "pinkcuffs.com",
"env_prefix": "PINKCUFFS",
},
"femuniverse": {
"base_url": "https://www.femuniverse.com",
"cookie_domain": "femuniverse.com",
"env_prefix": "FEMUNIVERSE",
},
}
-2800
View File
File diff suppressed because one or more lines are too long