Repository navigation
Tags
Tags
Stream not-yet-downloaded videos straight from the source A "Stream from source" button on the video page resolves the source on demand and plays it in place: direct CDN files in the same player as downloads (shortcuts, theater mode, saved position), YouTube embeds in an iframe. The player markup moves into a shared _player.html partial. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep yt-dlp current: bump it, add deno, self-update before each download
yt-dlp 2024.10.7 could no longer find YouTube formats ("Requested format
is not available"). Bump it, and ship deno so yt-dlp can solve YouTube's
player challenges. Since this will keep breaking, yt-dlp now also
upgrades itself right before each download, from its own venv in the
image (handed to PUID by the entrypoint) so the app's deps are untouched.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Only send "Download started" on the first attempt Every auto-retry re-ran download_video and sent another "started" notification, so a video that kept failing produced one per attempt (five with the default retry limit). Skip it when retry_count > 0; the outcome still arrives as "finished" or the final "failed". Manual retries reset retry_count, so they still notify once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add theater mode and Pushover download notifications Theater mode: a toggle on the video page that widens the player and hides surrounding text/sidebar, remembered across videos via localStorage -- a bigger viewing experience without browser fullscreen. Notifications: optional Pushover push notifications when a download starts, finishes, or gives up after exhausting its retries, each linking back to the video via a new "Public URL" setting. A "Send test notification" button on the Settings page tests whatever's currently typed (even unsaved) so credentials can be verified before saving. Notification failures are logged but never affect a download's actual status/retry handling.
Make BASE_PATH self-contained: no reverse-proxy rewrite rule needed Previously the app's routes stayed unprefixed internally and relied on the reverse proxy stripping BASE_PATH before forwarding -- a pattern that turned out to be the odd one out compared to how most subpath-aware self-hosted apps (Sonarr, Radarr, ...) actually work, where the app owns its own prefix via a "URL Base"-style setting and the proxy just forwards requests as-is. Switches to that pattern: routes now register on an APIRouter mounted onto the app via app.include_router(router, prefix=BASE_PATH), so /archivelo/* is handled directly -- no rewrite/strip config required on the proxy. Also fixes the Dockerfile HEALTHCHECK, which was hardcoded to probe "/" and would have failed permanently once BASE_PATH moved that route under a prefix. Verified both configurations against a real container: BASE_PATH unset serves at the root exactly as before; BASE_PATH=/archivelo serves directly at that prefix with zero proxy-side rewriting, and the healthcheck reports healthy in both cases.
Only build/publish images on GitHub Release, not every push to main Switches the workflow trigger from push:main to release:published, and uses docker/metadata-action to derive image tags from the release's semver tag (e.g. v0.1.0 -> :0.1.0, :latest) instead of tagging every commit. Documents the versioning scheme and release process in the README.