From e4e14be1f051a7e9e388be28611410470b87899b Mon Sep 17 00:00:00 2001 From: Codex Date: Sun, 9 Aug 2026 19:35:51 +0200 Subject: [PATCH] Expose Jellyfin mounts in Docker --- CHANGELOG.md | 5 +++++ Dockerfile | 2 +- README.md | 8 ++++++-- VERSION | 2 +- docker-compose.yaml | 4 +++- docker-entrypoint.sh | 4 ++-- test_app.py | 11 +++++++++++ 7 files changed, 29 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b24891..cb2c12d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 0.52.8 - 2026-08-09 + +- Added default Docker Jellyfin TV and movie mount points at `/jellyfin/tv` and `/jellyfin/movies`. +- Included the Docker Jellyfin mount points in the default remote filesystem browse allowlist. + ## 0.52.7 - 2026-08-09 - Added a Subbed/Dubbed selector to the Search result action window. diff --git a/Dockerfile b/Dockerfile index 1490e70..6ea680a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,7 +31,7 @@ COPY providers /app/providers COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh RUN chmod 0755 /usr/local/bin/docker-entrypoint.sh \ - && mkdir -p /downloads /app/.kaizoku + && mkdir -p /downloads /jellyfin/tv /jellyfin/movies /app/.kaizoku WORKDIR /app diff --git a/README.md b/README.md index 3dbc044..dc51707 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Useful environment variables: - `KAIZOKU_JOB_STDOUT=true` to mirror job logs to container or terminal output. - `KAIZOKU_STATE_ROOT=/path/to/state` to move SQLite state, config, thumbnails, sessions, and staging. - `KAIZOKU_DOWNLOAD_DIR=/downloads` for the default library output path. -- `KAIZOKU_REMOTE_PATH_ROOTS=/downloads,/media/anime` to limit remote filesystem browsing; comma-separated and platform path separators are accepted. +- `KAIZOKU_REMOTE_PATH_ROOTS=/downloads,/jellyfin/tv,/jellyfin/movies` to limit remote filesystem browsing; comma-separated and platform path separators are accepted. - `KAIZOKU_MODE=sub`, `KAIZOKU_QUALITY=best`, and `KAIZOKU_DEBUG=1` for runtime defaults and diagnostics. ## Docker @@ -68,9 +68,13 @@ docker compose up -d --build The compose file builds the local checkout and runs Kaizoku on port `8421` by default. It mounts: - `./downloads` to `/downloads` +- `${JELLYFIN_TV_DIR:-./jellyfin/tv}` to `/jellyfin/tv` +- `${JELLYFIN_MOVIE_DIR:-./jellyfin/movies}` to `/jellyfin/movies` - `./.kaizoku` to `/app/.kaizoku` -The Docker image installs Python, Node.js, npm, `ffmpeg`, `openssl`, and `util-linux` for optional UID/GID switching, then runs `npm install --omit=dev` for the provider bridge. Downloads go through Kaizoku's provider bridge and `provider_downloader.py`. +Use `/jellyfin/tv` for the Jellyfin TV directory and `/jellyfin/movies` for the Jellyfin movie directory inside the Config page. Override `JELLYFIN_TV_DIR` and `JELLYFIN_MOVIE_DIR` to point those container paths at your real host Jellyfin library folders. + +The Docker image installs Python, Node.js, npm, `ffmpeg`, `openssl`, and `util-linux` for optional UID/GID switching, then runs `npm ci --omit=dev` for the provider bridge. Downloads go through Kaizoku's provider bridge and `provider_downloader.py`. Useful Compose overrides: diff --git a/VERSION b/VERSION index 69b61ad..6e3eb02 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.52.7 +0.52.8 diff --git a/docker-compose.yaml b/docker-compose.yaml index 2b760f5..c6618c8 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -17,9 +17,11 @@ services: KAIZOKU_AUTH_USERNAME: ${KAIZOKU_AUTH_USERNAME:-} KAIZOKU_AUTH_PASSWORD: ${KAIZOKU_AUTH_PASSWORD:-} KAIZOKU_JOB_STDOUT: ${KAIZOKU_JOB_STDOUT:-true} - KAIZOKU_REMOTE_PATH_ROOTS: ${KAIZOKU_REMOTE_PATH_ROOTS:-/downloads} + KAIZOKU_REMOTE_PATH_ROOTS: ${KAIZOKU_REMOTE_PATH_ROOTS:-/downloads,/jellyfin/tv,/jellyfin/movies} KAIZOKU_DOWNLOAD_DIR: /downloads KAIZOKU_STATE_ROOT: /app/.kaizoku volumes: - ./downloads:/downloads + - ${JELLYFIN_TV_DIR:-./jellyfin/tv}:/jellyfin/tv + - ${JELLYFIN_MOVIE_DIR:-./jellyfin/movies}:/jellyfin/movies - ./.kaizoku:/app/.kaizoku diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index d2aece8..910a61d 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -34,7 +34,7 @@ run_as_requested_user() { fi mkdir -p /app/.kaizoku/home - chown "$uid:$gid" /downloads /app/.kaizoku /app/.kaizoku/home + chown "$uid:$gid" /downloads /jellyfin/tv /jellyfin/movies /app/.kaizoku /app/.kaizoku/home cd /app exec setpriv \ @@ -44,7 +44,7 @@ run_as_requested_user() { env HOME=/app/.kaizoku/home python3 /app/app.py "$@" } -mkdir -p /downloads /app/.kaizoku +mkdir -p /downloads /jellyfin/tv /jellyfin/movies /app/.kaizoku run_as_requested_user "$@" || true diff --git a/test_app.py b/test_app.py index cfbd96e..0454606 100644 --- a/test_app.py +++ b/test_app.py @@ -4079,6 +4079,17 @@ class TemplateHelperTests(unittest.TestCase): self.assertIn("COPY package.json package-lock.json /app/", dockerfile) self.assertIn("npm ci --omit=dev", dockerfile) + def test_docker_compose_exposes_jellyfin_browse_roots(self): + compose = (ROOT / "docker-compose.yaml").read_text(encoding="utf-8") + entrypoint = (ROOT / "docker-entrypoint.sh").read_text(encoding="utf-8") + dockerfile = (ROOT / "Dockerfile").read_text(encoding="utf-8") + + self.assertIn("KAIZOKU_REMOTE_PATH_ROOTS: ${KAIZOKU_REMOTE_PATH_ROOTS:-/downloads,/jellyfin/tv,/jellyfin/movies}", compose) + self.assertIn("${JELLYFIN_TV_DIR:-./jellyfin/tv}:/jellyfin/tv", compose) + self.assertIn("${JELLYFIN_MOVIE_DIR:-./jellyfin/movies}:/jellyfin/movies", compose) + self.assertIn("mkdir -p /downloads /jellyfin/tv /jellyfin/movies /app/.kaizoku", dockerfile) + self.assertIn("chown \"$uid:$gid\" /downloads /jellyfin/tv /jellyfin/movies", entrypoint) + def test_queue_page_formats_jellyfin_handoff_jobs(self): self.assertIn('job.job_type === "jellyfin_handoff"', APP.QUEUE_HTML) self.assertIn('const progress = `${job.completed || 0}/${job.total || 0} entries`;', APP.QUEUE_HTML)