Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
b3e038a
Fix site browsing parsers and add in-app browser cookie login
claude Oct 12, 2026
1e5fd05
Android: extract native libs so youtubedl-android can initialize
claude Oct 12, 2026
7079597
Android: keep youtubedl-android's libraries from R8 and never crash o…
claude Oct 12, 2026
7535462
Browse: per-site sorting, filters and category/tag indexes
claude Oct 12, 2026
e04f9a8
Browse: link site category browsers from the Browse tab
claude Oct 12, 2026
9c07737
Android: keep plugin Args classes in release builds
claude Oct 12, 2026
191ed63
PornHub categories: open full browse page, fix 404s and junk results
claude Oct 12, 2026
d1ea6f9
Mobile LAN safety, request pacing, PornHub playback via yt-dlp
claude Oct 12, 2026
2e06160
StashDB Identify: show the real error, detect rejected API keys
claude Oct 12, 2026
2d5f290
Stash-box settings: show real save/test errors instead of a generic m…
claude Oct 12, 2026
f476e40
Mobile: library playback without lan_enabled, bottom-sheet context menu
claude Oct 12, 2026
c67fb6e
Android: allow cleartext for release, open files via FileProvider, sa…
claude Oct 12, 2026
1c29081
Tags: full tag indexes, combined-tag browsing, tag autocomplete
claude Oct 12, 2026
2ad16fd
XVIDEOS: full A–Z tag index, letter tabs and index-backed autocomplete
claude Oct 12, 2026
df8e20d
XVIDEOS categories: Categories tab, filtered category pages
claude Oct 12, 2026
bfb23c8
Eporner: search/tag + category include/exclude
claude Oct 12, 2026
5b9479c
Eporner: full tag index (top 500 + A–Z), exact tag pages
claude Oct 12, 2026
1c59fb4
xHamster: full A–Z tag index, real tag pages
claude Oct 12, 2026
abd3aa2
XNXX: full A–Z tag index for the tag browser and autocomplete
claude Oct 12, 2026
2e7514b
Docs: what each site can strictly combine (tags, categories, search)
claude Oct 12, 2026
534bf46
Docs: ThisVid and YouPorn tag/category combining (live-verified)
claude Oct 12, 2026
f830310
ThisVid: narrow a category to one tag (strict), A–Z tag index
claude Oct 12, 2026
48a4177
XVIDEOS: combined tags are a word search, not an intersection
claude Oct 12, 2026
610a997
Docs: XVIDEOS result counts showing combined tags are not intersections
claude Oct 12, 2026
739fb71
PornHub: search category include/exclude filters
claude Oct 12, 2026
0bb2364
PornHub: full live category catalog, trans and gay category pairs
claude Oct 12, 2026
769e079
PornHub: "Language in videos" listings in the category picker
claude Oct 12, 2026
1ae334d
Saved searches: keep sort/filters, reopen correctly, surface errors
claude Oct 12, 2026
f07b995
Mobile UI: in-page tag suggestions and a full site picker
claude Oct 12, 2026
69b7d62
Site picker: real site icons
claude Oct 12, 2026
3268e08
Mobile UI: compact browse results page
claude Oct 13, 2026
38655b1
Mobile UI: categories pages, Library Scenes and Downloads
claude Oct 13, 2026
45868be
Player: working fullscreen on Android, YouPorn via proxy, clickable s…
claude Oct 13, 2026
456be67
Eporner playback: proxy with Eporner's Referer; proxy cookies per site
claude Oct 13, 2026
70415c9
ThisVid / ThotHub playback: session-aware KVS resolver; ThotHub thumb…
claude Oct 13, 2026
fefcb37
Remove the superseded ThotHub extract_stream_url
claude Oct 13, 2026
02a3224
xHamster: fill lazy-loaded result cards from window.initials
claude Oct 13, 2026
8fdc6c8
ThotHub: flag private videos and explain why they don't play
claude Oct 13, 2026
f16f306
Network: retry failed connections over IPv4 / HTTP/1.1; show error ca…
claude Oct 13, 2026
2d7cd43
Dashboard: stop requiring a desktop host on phones
claude Oct 13, 2026
ffe4219
Settings: label the local engine "On-device (this phone)" on phones
claude Oct 13, 2026
19801df
Retire the Standalone engine mode; Desktop settings tab only on desktop
claude Oct 13, 2026
9a412ec
Browse: saved searches fit on phones, clear recent searches, no kbd h…
claude Oct 13, 2026
e47761b
Info dialog: scrape video-page details for tube and KVS sites
claude Oct 13, 2026
a19817d
Live Streams: mobile layout matching browse results
claude Oct 13, 2026
29ae4ad
Tabs remember their last location and scroll position
claude Oct 13, 2026
95f32c8
Rate-limit guard: probe and recover instead of a blind cooldown
claude Oct 13, 2026
5602c4c
Merge upstream main (v0.6.4)
claude Oct 16, 2026
93bd5de
Merge branch 'main' into part-1-engine-browsing-ui
morpheasgr Oct 17, 2026
b45ef0b
Redo the v0.6.5 merge keeping both sides
claude Oct 17, 2026
79e2719
ThotHub: only stop at real KVS verdicts before trying yt-dlp
claude Oct 17, 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
14 changes: 14 additions & 0 deletions docs/cookie-import.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,18 @@

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

## 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`).

## Android: in-app capture (fastest)

On Android you can harvest a session without a browser or extension:
Expand Down Expand Up @@ -114,6 +126,8 @@ capturing a jar.

`thothub.tv` is intentionally absent — it is a parked ad domain now.

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
63 changes: 45 additions & 18 deletions docs/sites.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@

## 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 | Yes for gated videos |
| 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 | Yes for gated videos (`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 |

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

Expand All @@ -27,9 +27,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 +79,33 @@ 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/` |
| 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