Expose Jellyfin mounts in Docker

This commit is contained in:
Codex
2026-08-09 19:35:51 +02:00
parent 0641542c73
commit e4e14be1f0
7 changed files with 29 additions and 7 deletions
+5
View File
@@ -1,5 +1,10 @@
# Changelog # 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 ## 0.52.7 - 2026-08-09
- Added a Subbed/Dubbed selector to the Search result action window. - Added a Subbed/Dubbed selector to the Search result action window.
+1 -1
View File
@@ -31,7 +31,7 @@ COPY providers /app/providers
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod 0755 /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 WORKDIR /app
+6 -2
View File
@@ -56,7 +56,7 @@ Useful environment variables:
- `KAIZOKU_JOB_STDOUT=true` to mirror job logs to container or terminal output. - `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_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_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. - `KAIZOKU_MODE=sub`, `KAIZOKU_QUALITY=best`, and `KAIZOKU_DEBUG=1` for runtime defaults and diagnostics.
## Docker ## 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: The compose file builds the local checkout and runs Kaizoku on port `8421` by default. It mounts:
- `./downloads` to `/downloads` - `./downloads` to `/downloads`
- `${JELLYFIN_TV_DIR:-./jellyfin/tv}` to `/jellyfin/tv`
- `${JELLYFIN_MOVIE_DIR:-./jellyfin/movies}` to `/jellyfin/movies`
- `./.kaizoku` to `/app/.kaizoku` - `./.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: Useful Compose overrides:
+1 -1
View File
@@ -1 +1 @@
0.52.7 0.52.8
+3 -1
View File
@@ -17,9 +17,11 @@ services:
KAIZOKU_AUTH_USERNAME: ${KAIZOKU_AUTH_USERNAME:-} KAIZOKU_AUTH_USERNAME: ${KAIZOKU_AUTH_USERNAME:-}
KAIZOKU_AUTH_PASSWORD: ${KAIZOKU_AUTH_PASSWORD:-} KAIZOKU_AUTH_PASSWORD: ${KAIZOKU_AUTH_PASSWORD:-}
KAIZOKU_JOB_STDOUT: ${KAIZOKU_JOB_STDOUT:-true} 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_DOWNLOAD_DIR: /downloads
KAIZOKU_STATE_ROOT: /app/.kaizoku KAIZOKU_STATE_ROOT: /app/.kaizoku
volumes: volumes:
- ./downloads:/downloads - ./downloads:/downloads
- ${JELLYFIN_TV_DIR:-./jellyfin/tv}:/jellyfin/tv
- ${JELLYFIN_MOVIE_DIR:-./jellyfin/movies}:/jellyfin/movies
- ./.kaizoku:/app/.kaizoku - ./.kaizoku:/app/.kaizoku
+2 -2
View File
@@ -34,7 +34,7 @@ run_as_requested_user() {
fi fi
mkdir -p /app/.kaizoku/home 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 cd /app
exec setpriv \ exec setpriv \
@@ -44,7 +44,7 @@ run_as_requested_user() {
env HOME=/app/.kaizoku/home python3 /app/app.py "$@" 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 run_as_requested_user "$@" || true
+11
View File
@@ -4079,6 +4079,17 @@ class TemplateHelperTests(unittest.TestCase):
self.assertIn("COPY package.json package-lock.json /app/", dockerfile) self.assertIn("COPY package.json package-lock.json /app/", dockerfile)
self.assertIn("npm ci --omit=dev", 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): def test_queue_page_formats_jellyfin_handoff_jobs(self):
self.assertIn('job.job_type === "jellyfin_handoff"', APP.QUEUE_HTML) self.assertIn('job.job_type === "jellyfin_handoff"', APP.QUEUE_HTML)
self.assertIn('const progress = `${job.completed || 0}/${job.total || 0} entries`;', APP.QUEUE_HTML) self.assertIn('const progress = `${job.completed || 0}/${job.total || 0} entries`;', APP.QUEUE_HTML)