Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
09321e5
Fix site browsing parsers and add in-app browser cookie login
claude Oct 12, 2026
79b759a
Android: extract native libs so youtubedl-android can initialize
claude Oct 12, 2026
dff1e6d
Android: keep youtubedl-android's libraries from R8 and never crash o…
claude Oct 12, 2026
4c31567
Browse: per-site sorting, filters and category/tag indexes
claude Oct 12, 2026
a6a6673
Browse: link site category browsers from the Browse tab
claude Oct 12, 2026
bf0feaa
Android: keep plugin Args classes in release builds
claude Oct 12, 2026
67c4d11
PornHub categories: open full browse page, fix 404s and junk results
claude Oct 12, 2026
6c42e13
Mobile LAN safety, request pacing, PornHub playback via yt-dlp
claude Oct 12, 2026
9288b33
StashDB Identify: show the real error, detect rejected API keys
claude Oct 12, 2026
452d8dd
Stash-box settings: show real save/test errors instead of a generic m…
claude Oct 12, 2026
a52e510
Mobile: library playback without lan_enabled, bottom-sheet context menu
claude Oct 12, 2026
4925aba
Android: allow cleartext for release, open files via FileProvider, sa…
claude Oct 12, 2026
de456b1
Tags: full tag indexes, combined-tag browsing, tag autocomplete
claude Oct 12, 2026
9293e3a
XVIDEOS: full A–Z tag index, letter tabs and index-backed autocomplete
claude Oct 12, 2026
96e42e6
XVIDEOS categories: Categories tab, filtered category pages
claude Oct 12, 2026
871b515
Eporner: search/tag + category include/exclude
claude Oct 12, 2026
801b10c
Eporner: full tag index (top 500 + A–Z), exact tag pages
claude Oct 12, 2026
08b9ffc
xHamster: full A–Z tag index, real tag pages
claude Oct 12, 2026
94a8029
XNXX: full A–Z tag index for the tag browser and autocomplete
claude Oct 12, 2026
3be7f36
Docs: what each site can strictly combine (tags, categories, search)
claude Oct 12, 2026
470d630
Docs: ThisVid and YouPorn tag/category combining (live-verified)
claude Oct 12, 2026
b1fb9d3
ThisVid: narrow a category to one tag (strict), A–Z tag index
claude Oct 12, 2026
813099d
XVIDEOS: combined tags are a word search, not an intersection
claude Oct 12, 2026
7dbce32
Docs: XVIDEOS result counts showing combined tags are not intersections
claude Oct 12, 2026
3707452
PornHub: search category include/exclude filters
claude Oct 12, 2026
717378e
PornHub: full live category catalog, trans and gay category pairs
claude Oct 12, 2026
cbdcdfb
PornHub: "Language in videos" listings in the category picker
claude Oct 12, 2026
e35fa67
Saved searches: keep sort/filters, reopen correctly, surface errors
claude Oct 12, 2026
c5f8eb1
Mobile UI: in-page tag suggestions and a full site picker
claude Oct 12, 2026
a2cbbb4
Site picker: real site icons
claude Oct 12, 2026
ff52453
Mobile UI: compact browse results page
claude Oct 13, 2026
983ef93
Mobile UI: categories pages, Library Scenes and Downloads
claude Oct 13, 2026
5829f74
Player: working fullscreen on Android, YouPorn via proxy, clickable s…
claude Oct 13, 2026
cbb422d
Eporner playback: proxy with Eporner's Referer; proxy cookies per site
claude Oct 13, 2026
7456b66
ThisVid / ThotHub playback: session-aware KVS resolver; ThotHub thumb…
claude Oct 13, 2026
7723bc6
Remove the superseded ThotHub extract_stream_url
claude Oct 13, 2026
2a182d3
xHamster: fill lazy-loaded result cards from window.initials
claude Oct 13, 2026
69de172
ThotHub: flag private videos and explain why they don't play
claude Oct 13, 2026
fefc197
Network: retry failed connections over IPv4 / HTTP/1.1; show error ca…
claude Oct 13, 2026
49170e7
Dashboard: stop requiring a desktop host on phones
claude Oct 13, 2026
44b0b23
Settings: label the local engine "On-device (this phone)" on phones
claude Oct 13, 2026
3a58863
Retire the Standalone engine mode; Desktop settings tab only on desktop
claude Oct 13, 2026
b0e4729
Browse: saved searches fit on phones, clear recent searches, no kbd h…
claude Oct 13, 2026
312cd23
Info dialog: scrape video-page details for tube and KVS sites
claude Oct 13, 2026
a3ade31
Add xPomelo aggregator adapter
claude Oct 13, 2026
2584d94
Android: get past Cloudflare checks via the in-app browser
claude Oct 13, 2026
ccd8f65
Play KVS tubes in-session and add an XXXBP resolver
claude Oct 13, 2026
03da760
xPomelo: list all 46 sources in the Source filter
claude Oct 13, 2026
efc6969
Live Streams: mobile layout matching browse results
claude Oct 13, 2026
fc0b49f
Tabs remember their last location and scroll position
claude Oct 13, 2026
9f5d9a0
CI: sign the Android release APK so it installs
claude Oct 13, 2026
d8a9318
Add a PowerShell APK signing script for Windows builds
claude Oct 13, 2026
4465349
Desktop: get past bot checks with impersonation and a verification wi…
claude Oct 13, 2026
87dad7c
Cookies for any site: per-domain vault entries for xPomelo sources
claude Oct 13, 2026
60a5dc1
Fix playback on many xPomelo sources; native download fallback
claude Oct 13, 2026
e880eb3
xPomelo: hide unsupported sources by default, label the Source menu
claude Oct 13, 2026
00f0740
xPomelo: site icon, hide VipTube by default
claude Oct 13, 2026
a4f70c3
One video file per download; StashDB text search by performer/studio
claude Oct 13, 2026
f37ad24
Fix library file deletion on Android and default to Download/ArcHive
claude Oct 13, 2026
f092257
xPomelo: real duration ranges and duplicate filtering
claude Oct 13, 2026
e8f485c
xPomelo: full tag list for filters and exclude in the tag hub
claude Oct 13, 2026
37645c2
Cut xPomelo request bursts: thumbnail proxy, ranges, infinite scroll
claude Oct 13, 2026
60cd813
StashDB: scored metadata matching when fingerprints miss
claude Oct 13, 2026
98f1d5b
Rate-limit guard: probe and recover instead of a blind cooldown
claude Oct 13, 2026
b242e52
Browse filters: edit as a draft, load on Apply
claude Oct 13, 2026
eb3edd7
xPomelo on Android: fall back to the in-app browser when refused
claude Oct 13, 2026
1bf9149
Cache tag lists until refreshed; pace site requests like a browser
claude Oct 13, 2026
13bd63f
Online library: saved searches and browsed results kept locally
claude Oct 13, 2026
6572c65
Cookies: list xPomelo itself in the cookie vault menu
claude Oct 13, 2026
d52b8bc
Tags for every source; newest-first incremental saved-search updates
claude Oct 13, 2026
3d93140
xPomelo: stop feeding Cloudflare's 1015 rate limit
claude Oct 13, 2026
b504c4a
xPomelo result counts; filters picked before opening a tag
claude Oct 13, 2026
5b0a0f8
xPomelo: end of results instead of an error; explain the count
claude Oct 14, 2026
8da7220
Browse: skip re-listed videos across pages, top up short pages
claude Oct 14, 2026
657cd07
xPomelo: check each page is complete, refetch short ones once
claude Oct 14, 2026
bb836a0
xPomelo: fewer requests per scroll (v57 ran into 1015 sooner)
claude Oct 14, 2026
fde1374
Browse: tell the user when loading more fails
claude Oct 14, 2026
ca53bd1
xPomelo low length ranges filtered in the app; remove Online entries
claude Oct 14, 2026
74f1219
Full fetch for saved searches; xPomelo site-down message
claude Oct 14, 2026
a7198ed
Pornwitch adapter: strict tag search, word suggestions, cursor paging
claude Oct 14, 2026
7584978
Pornwitch: exclude multi-word tags as a phrase
claude Oct 14, 2026
48d888a
xPomelo: length ranges as buckets again; sort passes in full fetch
claude Oct 14, 2026
926814b
Fetch tags: PornHub mobile layout; drop videos the site removed
claude Oct 14, 2026
1368008
Online library: re-fetch tags for a selection or everything shown
claude Oct 14, 2026
1a8c022
Online library: tapping a card in Select mode selects it
claude Oct 14, 2026
ff7783b
Fetch tags: treat PornHub's "video has been disabled" page as removed
claude Oct 14, 2026
f0ddac6
Playing or opening a removed video drops it from the Online library
claude Oct 14, 2026
e9f8d29
Recognize PornHub's removed-video notice in its mobile layout too
claude Oct 14, 2026
e531c91
Don't take a 404 as a removed video while the site itself is down
claude Oct 14, 2026
8124a0b
Bump quinn-proto to 0.11.18 (cargo audit: RUSTSEC-2026-0338..0342)
claude Oct 14, 2026
c16c088
Bump quinn-proto to 0.11.19 (latest patch release)
claude Oct 14, 2026
e9bc131
Fetch tags: ask before removing a batch that is mostly "removed"
claude Oct 14, 2026
c3708f1
Fix PornZog thumbnails from xPomelo (and in the Online library)
claude Oct 14, 2026
07d6aa4
Bookmarks, on-demand Online library recording, tags in the player
claude Oct 14, 2026
5b0ffcd
Load Pornwitch-hosted PornHub thumbnails through the media proxy
claude Oct 14, 2026
207d410
Android: in-app browser for pages, share sheet for links and files
claude Oct 14, 2026
1474d4a
In-app browser: stop click-anywhere redirects; ad blocking opt-in
claude Oct 14, 2026
f23ad1a
In-app browser: EasyList ad-server domains for the ad blocker
claude Oct 14, 2026
3ba399b
Online library: query builder with OR groups, exclusions and ranking
claude Oct 14, 2026
25366b0
Drop a redundant replace in the query term parser (clippy)
claude Oct 14, 2026
dd2e3c9
Query builder: show the query as (a OR b) AND (c) NOT (d)
claude Oct 14, 2026
6103629
Query builder: plural matching, Clear / Save, filtered views
claude Oct 14, 2026
97408bf
Player: show fetched tags in the Online library; un-bookmark removes
claude Oct 14, 2026
8ee606b
Online library: "No tags" filter
claude Oct 14, 2026
35da324
Treat HTTP 410 as a region / VPN block, not a removed video
claude Oct 14, 2026
e70a6f2
Mention VPN location blocks in 403 errors
claude Oct 14, 2026
b3b521a
Resolve Pornwitch /go links to their source; TXXX and beeg tags
claude Oct 14, 2026
ce66526
Merge upstream main (v0.6.4) into claude/app-build-qqufqp
claude Oct 16, 2026
d40c921
Query builder in the offline library
claude Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion docs/cookie-import.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,19 @@

ArcHive stores cookies encrypted per site for browse and yt-dlp downloads.

## Recommended: Cookie-Editor extension
## Recommended: Log in with browser (desktop + Android)

1. In **Settings → Cookies**, select the site (or open a cookie-required site in Browse).
2. Press **Log in with browser**. ArcHive opens the site in its own browser:
- **Desktop:** a separate window. Log in, then press **Save cookies** in ArcHive (or just close the window).
- **Android:** a full-screen browser with **Cancel** / **Save cookies** buttons at the top. The system back button navigates back inside the page.
3. The captured cookies, including HttpOnly session cookies that page scripts cannot read, are converted to Netscape format and stored in the vault (on the LAN host when the app is in Remote LAN mode).

Android does not let one app read another app's cookies (for example Chrome's), so the login has to happen inside ArcHive. Google sign-in may refuse embedded browsers; for YouTube, import cookies with Cookie-Editor instead.

Implementation: `src-tauri/src/cookie_login.rs` (desktop window + Android bridge) and `src-tauri/android-overlays/CookieBrowserPlugin.kt` (installed by `scripts/patch-android-ytdlp.ps1` / `.sh`).

## Cookie-Editor extension

1. Install [Cookie-Editor](https://chromewebstore.google.com/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm) (Chrome, Edge, Brave) or the Firefox equivalent.
2. Log in on the target site (PornHub, xHamster, etc.).
Expand Down Expand Up @@ -31,6 +43,8 @@ Export or build a Netscape cookie file and paste into the Netscape textarea →
| xvideos | xvideos.com |
| thisvid | thisvid.com |

Lines exported as `#HttpOnly_<domain>` are treated as cookies, not comments.

## Security

- Cookies are encrypted at rest (AES-256-GCM).
Expand Down
29 changes: 15 additions & 14 deletions docs/mobile-android.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,20 +177,21 @@ Video playback uses `GET /api/scenes/{id}/media` and `GET /api/files/stream` wit

## Troubleshooting

| Issue | Fix |
| -------------------------------------- | ---------------------------------------------------------------------------------------- |
| `FrameInsert open fail` in logcat | Usually MIUI noise — see [troubleshooting-android.md](troubleshooting-android.md) |
| `om.archhive.app` in logs | Truncated `com.archhive.app` — verify with `android:regen` if UI is broken |
| -------------------------------------- | ---------------------------------------------------------------------------------------- |
| `yt-dlp-aarch64-linux-android` missing | Sidecars are desktop-only; run `bun run android:regen` |
| `Unresolved reference: TauriActivity` | Stale `gen/android` after identifier change; run `bun run android:regen` |
| App runs but `invoke` is undefined | Set Engine → **Remote LAN**; ensure desktop LAN is on. Rebuild after capability changes. |
| Read-only filesystem on Android | Mobile uses app data dir for DB; downloads go via Remote LAN desktop host |
| `ERR_CLEARTEXT_NOT_PERMITTED` | Run `scripts/patch-android-lan.ps1` and rebuild |
| Connection refused | Firewall: allow TCP **8787** on PC (API). `:1420` is dev UI only. |
| Used `:1420` in Remote LAN | Remote LAN API is port **8787**, not the Vite dev port 1420 |
| 401 Unauthorized | Verify API token matches desktop LAN token |
| Empty browse results | Ensure desktop app is running and cookies are configured |
| Issue | Fix |
| ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `FrameInsert open fail` in logcat | Usually MIUI noise — see [troubleshooting-android.md](troubleshooting-android.md) |
| `om.archhive.app` in logs | Truncated `com.archhive.app` — verify with `android:regen` if UI is broken |
| -------------------------------------- | ---------------------------------------------------------------------------------------- |
| `yt-dlp-aarch64-linux-android` missing | Sidecars are desktop-only; run `bun run android:regen` |
| `Unresolved reference: TauriActivity` | Stale `gen/android` after identifier change; run `bun run android:regen` |
| App runs but `invoke` is undefined | Set Engine → **Remote LAN**; ensure desktop LAN is on. Rebuild after capability changes. |
| Read-only filesystem on Android | Mobile uses app data dir for DB; downloads go via Remote LAN desktop host |
| `ERR_CLEARTEXT_NOT_PERMITTED` | Run `scripts/patch-android-lan.ps1` and rebuild |
| Connection refused | Firewall: allow TCP **8787** on PC (API). `:1420` is dev UI only. |
| Used `:1420` in Remote LAN | Remote LAN API is port **8787**, not the Vite dev port 1420 |
| 401 Unauthorized | Verify API token matches desktop LAN token |
| Empty browse results | Ensure desktop app is running and cookies are configured |
| `YoutubeDL/FFmpeg not initialized`, no versions in Settings | APK was packaged with compressed native libs (`extractNativeLibs=false`). `patch-android-ytdlp` sets `jniLibs.useLegacyPackaging = true`; run `bun run android:patches` and rebuild |

## Scripts

Expand Down
134 changes: 116 additions & 18 deletions docs/sites.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,90 @@

## Tier A — yt-dlp (browse + download)

| Site ID | Display Name | Browse kinds | Cookies |
| --------- | ------------ | -------------------------------------------- | --------------------------- |
| youtube | YouTube | channel, search, video | Optional |
| tiktok | TikTok | channel, search, video | No |
| twitter | Twitter / X | channel, video | Recommended |
| instagram | Instagram | channel, video | Yes |
| thisvid | ThisVid | tag, search, video | Yes |
| thothub | ThotHub | tag, model, search, video | Optional (`thethothub.com`) |
| pornhub | PornHub | category, tag, search, channel, model, video | Yes |
| youporn | YouPorn | category, model, search, video | Optional |
| xnxx | XNXX | search, tag, channel, video | Optional |
| xhamster | xHamster | tag, search, channel, video | Yes |
| xvideos | XVIDEOS | tag, search, channel, video | Yes |
| reddit | Reddit | channel, search, video | OAuth for subreddits |
| eporner | Eporner | search, tag, category, video | No |
| Site ID | Display Name | Browse kinds | Cookies |
| --------- | ------------ | -------------------------------------------- | -------------------------------------------------------------- |
| youtube | YouTube | channel, search, video | Optional |
| tiktok | TikTok | channel, search, video | No |
| twitter | Twitter / X | channel, video | Recommended |
| instagram | Instagram | channel, video | Yes |
| thisvid | ThisVid | tag, search, video | Yes |
| thothub | ThotHub | tag, model, search, video | Optional (`thethothub.com`) |
| pornhub | PornHub | category, tag, search, channel, model, video | Yes |
| youporn | YouPorn | category, model, search, video | Optional |
| xnxx | XNXX | search, tag, channel, video | Optional |
| xhamster | xHamster | tag, search, channel, video | Yes |
| xvideos | XVIDEOS | tag, search, channel, video | Yes |
| reddit | Reddit | channel, search, video | Login cookies (Reddit hides listings from logged-out visitors) |
| eporner | Eporner | search, tag, category, video | No |

## Aggregators

| Site ID | Display Name | Browse kinds | Cookies |
| --------- | ------------ | ----------------------- | ------- |
| xpomelo | xPomelo | search, category, model | No |
| pornwitch | Pornwitch | category, search | No |

xPomelo hosts nothing: each result links to its source tube (PornHub,
XVIDEOS, xHamster, XNXX, Eporner, SpankBang, …). Items keep the source URL
and, where ArcHive has an adapter, the source site's id, so playback,
downloads and the Info dialog run through that site's own pipeline; other
sources go through plain yt-dlp. Category listings take any number of
required and excluded categories (`/category/a%2Cb%2C-c`). Results from
paysites (Brazzers, FapHouse, Clips4Sale, …) and unsupported sources (Beeg,
SxyPrn, VipTube) are hidden unless the Source filter is set.
Cloudflare blocks HTTP/1.1 clients on this site; the main HTTP/2 client passes.

Pornwitch also hosts nothing. Its search matches titles plus the source
site's tags, and every word is required (synonyms and plurals count), so a
tag combination `a,b,-c` runs as the query `a b -c`; a Search keeps the
site's own syntax (`"exact phrase"`, `-word`). PornHub, XVIDEOS, xHamster and
Eporner results get their source URL (and adapter) straight from the card;
TXXX, beeg and paysite results keep Pornwitch's `/go?id=` link, which is
followed (one request) only when played or downloaded. Pages after the first
continue from the previous page's last-card cursor. Word suggestions come
from `/suggest` (`GET /api/sites/{id}/suggest?q=`), debounced and cached;
requests to pornwitch.com are spaced 2.5–4.5 s apart.

### Bot checks (Cloudflare)

#### Desktop

When yt-dlp is refused by a bot check, ArcHive retries it with browser
impersonation (`--impersonate`, `sites/clearance.rs`). This needs the
standalone yt-dlp builds that bundle curl_cffi (`yt-dlp.exe`, `yt-dlp_macos`,
`yt-dlp_linux`); `setup-binaries` downloads those. If the site still refuses,
a small verification window opens on the page and closes by itself once the
check passes. Its cookies (`cf_clearance`, session) are saved encrypted per
site and reused, together with the same User-Agent, by yt-dlp and by the KVS
resolver.

#### Android

Some sources (SpankBang, KVS tubes such as CrazyPorn, Love4Porn, 4KPorn)
answer the embedded engines with a Cloudflare challenge. When playback or a
download fails that way on Android, ArcHive opens the page in its in-app
browser, where the check passes by itself or after one tap. It then reads
the video URL from the rendered page (`sites/challenge.rs`) and follows
session-bound KVS `get_file` links inside the same browser session. Sites
with dedicated adapters (PornHub, XVIDEOS, …) are excluded.

### xPomelo sources: tested 2026-10-13

From a datacenter connection. Cloudflare-protected sites then show an
interactive check that can't be passed from there; on a home connection the
bot-check fallbacks below are expected to get through. That part is
unverified.

| Result | Sources |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Play + download | XVIDEOS, xHamster, XNXX, Eporner, YouPorn, RedTube, PornZog, XGroovy, PornOne, Hoes, HDtube¹, SexVid¹, XXXBP², TXXX, EroThots, PornHat, YouJizz, Analdin, AnySex, Xozilla, Nuvid, Clips4Sale (trailers) |
| Cloudflare check (bot-check fallback) | SpankBang, CrazyPorn, Love4Porn, 4KPorn, FapCat, TNAFlix, DrTuber, Noodlemagazine (intermittent) |
| Native resolver, CDN unreliable | HQPorner (`mydaddy.cc` player; files often 404 or rate-limited) |
| Not supported | Beeg (API no longer returns streams; yt-dlp broken too), SxyPrn (yt-dlp marks it unsupported), VipTube (empty player config) |
| Stale listings | Some xPomelo results point at removed videos (HTTP 404/410, Tube8 `video-inactive`) |

¹ yt-dlp can't extract these; playback and downloads use the KVS resolver.
² No yt-dlp extractor; `api.xxxbp.tv/hls`.

## Tier B — Live Cam Sites (scraping + webview bridge)

Expand All @@ -27,9 +96,9 @@

## Tier C — gallery-dl

| Site ID | Display Name | Notes |
| ------- | ------------ | ---------------------------- |
| redgifs | RedGifs | Uses gallery-dl for download |
| Site ID | Display Name | Notes |
| ------- | ------------ | -------------------------------------------------------------------- |
| redgifs | RedGifs | Browse via the RedGifs v2 API (temporary token); direct MP4 download |

## Cookie Requirements

Expand Down Expand Up @@ -79,6 +148,35 @@ desktop host.
the StashDB id, merges aliases (deduped, capped), and sets the portrait
only when none is stored.

## Sorting, filters and categories

What each site can strictly combine (tags, categories, search + category,
exclusions) is documented in [tag-combining.md](tag-combining.md).

Adapters advertise what they support via `SiteAdapter::browse_options()`
(returned in `SiteInfo.browse_options`); the browse page shows matching
Sort / Date / Length / Quality selects and passes the chosen ids as
`BrowseQuery.filters`. Unknown ids are dropped before they reach a URL.
Every page also has on-device filters (words, `-exclude`, length) over
loaded results. Category / tag indexes come from `list_categories()`
(`list_site_categories` command, `GET /api/sites/{id}/categories`).

| Site | Sort | Date / Length / Quality | Categories |
| ---------- | --------------------------------------- | -------------------------------------- | --------------------- |
| PornHub | newest, views, rating, longest, hottest | period, duration, HD | JSON-embedded catalog |
| XVIDEOS | relevance, date, rating, views, length | period, duration, HD/1080p | `/tags` (top 400) |
| XNXX | views, random | period, duration, HD/Full HD | `/tags` (top 400) |
| xHamster | search: 5 sorts; category: newest/best | duration, 720p/1080p/4K | `/categories` |
| YouPorn | relevance, date, views, rating, length | — | `/categories/` |
| Eporner | 7 API `order` values | — | `/cats/` |
| xPomelo | relevance, date, views, length | period, duration, HD/4K, source | `data-tags` JSON (6k) |
| Pornwitch | hottest, newest, oldest, longest, short | period, minutes range, 720p–4K, source | `/categories` (180) |
| ThotHub | KVS `sort_by` (5) | — | — |
| ThisVid | KVS `sort_by` (5) | — | `/categories/` |
| Reddit | hot, new, top, rising | period (top) | — |
| RedGifs | trending, latest, top | — | — |
| Chaturbate | — | — | top hashtags API |

## SCrawler Parity Roadmap

Future adapters: Threads, Pinterest, OnlyFans (cookie + DRM limitations), Bluesky, LPSG.
Expand Down
Loading
Loading