Expose Jellyfin mounts in Docker
This commit is contained in:
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user