Documentation site: mdBook user + contributor guide (2.2)

An mdBook under docs/ rendering eight pages: introduction,
installation, first-run/config, downloading, an anti-bot guide that
captures the hard-won cookies/curl_cffi/POT/player-client knowledge,
troubleshooting (the nine error classes + non-download issues),
architecture (the two-front-ends/one-engine design, settings flow,
layout invariant, persistence), and packaging.

- .forgejo/workflows/docs.yml builds the book and publishes docs/book/
  to the `pages` branch for Codeberg Pages on docs/ changes.
- docs/book/ is gitignored (rendered output).
- README: fix the stale backup.directory comment — every platform nests
  under the one library root, not a channels/ sibling split.
- Add CLAUDE.md (repo guidance for Claude Code).

Builds clean with mdbook 0.5; intra-doc anchor links verified.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Luna 2026-06-07 02:56:14 -07:00
parent 7906d7d07f
commit e06c2ef826
14 changed files with 833 additions and 1 deletions

113
docs/src/troubleshooting.md Normal file
View file

@ -0,0 +1,113 @@
# Troubleshooting
yt-offline classifies failed downloads into one of nine classes and shows
a one-line suggested fix next to the failed job. This page expands on the
most common ones, plus a few non-download issues.
## "Video unavailable. YouTube is requiring a captcha challenge"
**Class:** rate-limited. **Not** a removed video — it's the bot-detection
wall. In order of effectiveness:
1. **Use fresh, logged-in cookies.** Anonymous cookies are the usual
culprit — see [Anti-bot → cookies](./anti-bot.md#1-be-logged-in-cookies).
Settings → Cookies warns when your jar is anonymous or expired.
2. **Switch to bundled (nightly) yt-dlp** if you're on system stable.
3. **Enable the POT token provider.**
4. **Try a player-client override** of `tv,mweb` for that channel.
5. If it's a one-off, just wait — yt-offline auto-retries transient
rate-limits after a cooldown.
## Impersonate targets show "(unavailable)"
`yt-dlp --list-impersonate-targets` lists every target as `(unavailable)`
even though `curl_cffi` is installed.
**Cause:** a yt-dlp ⇄ curl_cffi version gate. Stable yt-dlp caps the
curl_cffi version it accepts; a newer curl_cffi makes it disable *all*
impersonate targets.
**Fix:** use the **bundled** yt-dlp (it installs nightly via `--pre`,
which accepts current curl_cffi), or pin curl_cffi to a compatible
version in your own environment.
## POT provider produces no tokens
You enabled the POT provider and installed it, but downloads still fail
as if no token was generated. yt-dlp logs a *"plugin and HTTP server
major versions are mismatched"* warning.
**Cause:** the yt-dlp plugin came from PyPI (Brainicism's package, which
versions independently) instead of the jim60105 Rust server's release.
**Fix:** re-run the POT **Install/Update** button — yt-offline installs
the version-matched plugin zip from the same release as the server
binary. Don't `pip install bgutil-ytdlp-pot-provider` yourself.
## The youtubetab authentication warning
```
ERROR: [youtube:tab] @Channel: Playlists that require authentication may
not extract correctly without a successful webpage download...
```
Despite the `ERROR:` prefix this is a soft warning, usually a symptom of
the bot-detection issues above (YouTube served an incomplete page). It
does **not** change which videos are found.
**Fix:** for **public** channels, enable **Skip auth check** in that
channel's options (adds `--extractor-args youtubetab:skip=authcheck`) to
silence it. Leave it **off** for members-only/private channels you
archive with cookies — there the warning is a real "your cookies may not
be working" signal.
## "Sign in to confirm you're not a bot"
Same family as the captcha wall. Fix with fresh logged-in cookies + POT;
see [Anti-bot](./anti-bot.md).
## Downloads stall forever
A job sits running with no progress. yt-offline's **hang watchdog**
auto-kills any job silent for 5 minutes and re-queues it, so this should
self-heal. If it recurs on a specific URL, it's usually a server-side
issue with that source; check the job log in the Downloads panel.
## Disk fills up / downloads fail with ENOSPC
yt-offline runs a **disk-full preflight** and refuses to start a download
when the target filesystem has less than ~500 MB free, surfacing it as a
clear "disk full" failure rather than a half-written file. Free space and
retry.
## A whole platform folder shows up as one "channel"
If you see `bandcamp`, `tiktok`, or `channels` listed as a single channel
in the sidebar, your library directory predates the current layout. All
platforms must **nest under** the one `backup.directory`
(`<dir>/channels/`, `<dir>/tiktok/`, …). Move stray creator folders into
their platform's subdir; see [First run → library layout](./first-run.md#the-library-layout).
## The desktop window crashes on maximize
Older builds crashed with a Glutin `EGL_BAD_ALLOC` on NVIDIA + Wayland
when maximized. Current builds use the **wgpu (Vulkan)** renderer, which
handles the resize cleanly. Make sure you have a working Vulkan driver
(`vulkan-icd-loader` + your GPU's Vulkan package), which any desktop with
working graphics already has.
## The web UI looks like an old version after an upgrade
The SPA is served `Cache-Control: no-store`, so a hard reload
(Ctrl+Shift+R) always picks up the new binary's UI. If you upgraded the
binary, also **restart the running `--web` process** — the HTML is baked
into the binary at compile time, so the old process keeps serving the old
UI until restarted.
## Where to look next
- **The job log** — every download/transcode job keeps its full yt-dlp /
ffmpeg output in the Downloads panel (expand the job).
- **`yt-offline.crash.log`** — next to your `yt-offline.db`. A panic in
any thread (UI, web worker, download) is appended here with a
timestamp, so it survives a GUI launched without a terminal.