Make jellyfin script idempotent

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2025-07-15 11:01:34 +01:00
parent 72ea51e1d9
commit 31e7d625cf
3 changed files with 50 additions and 36 deletions

View File

@@ -1,24 +1,33 @@
# shellcheck shell=sh # shellcheck shell=sh
curl -sf "$JELLYFIN_HOST/Startup/Configuration" \ until response="$(curl -sf "$JELLYFIN_HOST/System/Info/Public")"; do
echo "Waiting for Jellyfin to be ready..."
sleep 1
done
setup="$(echo "$response" | jq -r '.StartupWizardCompleted')"
if [ "$setup" = "false" ]; then
curl -sf "$JELLYFIN_HOST/Startup/Configuration" \
-X POST \ -X POST \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
--data-raw '{"UICulture":"en-US","MetadataCountryCode":"US","PreferredMetadataLanguage":"en"}' --data-raw '{"UICulture":"en-US","MetadataCountryCode":"US","PreferredMetadataLanguage":"en"}'
curl -sf "$JELLYFIN_HOST/Startup/User" curl -sf "$JELLYFIN_HOST/Startup/User"
curl -sf "$JELLYFIN_HOST/Startup/User" \ curl -sf "$JELLYFIN_HOST/Startup/User" \
-X POST \ -X POST \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
--data-raw '{"Name":"'"$JELLYFIN_ADMIN_USERNAME"'","Password":"'"$JELLYFIN_ADMIN_PASSWORD"'"}' --data-raw '{"Name":"'"$JELLYFIN_ADMIN_USERNAME"'","Password":"'"$JELLYFIN_ADMIN_PASSWORD"'"}'
curl -sf "$JELLYFIN_HOST/Startup/RemoteAccess" \ curl -sf "$JELLYFIN_HOST/Startup/RemoteAccess" \
-X POST \ -X POST \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
--data-raw '{"EnableRemoteAccess":true,"EnableAutomaticPortMapping":false}' --data-raw '{"EnableRemoteAccess":true,"EnableAutomaticPortMapping":false}'
curl -sf "$JELLYFIN_HOST/Startup/Complete" \ curl -sf "$JELLYFIN_HOST/Startup/Complete" \
-X POST -X POST
fi
token="$(curl -sf "$JELLYFIN_HOST/Users/AuthenticateByName" \ token="$(curl -sf "$JELLYFIN_HOST/Users/AuthenticateByName" \
-X POST \ -X POST \
@@ -74,17 +83,6 @@ curl -sf "$JELLYFIN_HOST/Plugins/b8715ed1-6c47-4528-9ad3-f72deb539cd4/Configurat
-H 'Authorization: MediaBrowser Token="'"$token"'"' \ -H 'Authorization: MediaBrowser Token="'"$token"'"' \
--data-binary @- --data-binary @-
for filepath in /etc/jellyfin/libraries/*/*.json; do
collectionType=$(jq -rn --arg s "$(basename "$(dirname "$filepath")")" '$s|@uri')
name=$(jq -rn --arg s "$(basename "$filepath" .json)" '$s|@uri')
curl -sf "$JELLYFIN_HOST/Library/VirtualFolders?collectionType=$collectionType&name=$name" \
-X POST \
-H "Content-Type: application/json" \
-H 'Authorization: MediaBrowser Token="'"$token"'"' \
--data-binary @"$filepath"
done
curl -sf "$JELLYFIN_HOST/Plugins/505ce9d1-d916-42fa-86ca-673ef241d7df/Configuration" \ curl -sf "$JELLYFIN_HOST/Plugins/505ce9d1-d916-42fa-86ca-673ef241d7df/Configuration" \
-X POST \ -X POST \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
@@ -180,3 +178,23 @@ curl -sf "$JELLYFIN_HOST/System/Configuration/branding" \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
-H "Authorization: MediaBrowser Token=$token" \ -H "Authorization: MediaBrowser Token=$token" \
--data-binary @- --data-binary @-
existing_libraries="$(curl -sf "$JELLYFIN_HOST/Library/VirtualFolders" \
-H 'Authorization: MediaBrowser Token="'"$token"'"')"
for filepath in /etc/jellyfin/libraries/*/*.json; do
collectionType=$(jq -rn --arg s "$(basename "$(dirname "$filepath")")" '$s|@uri')
name=$(jq -rn --arg s "$(basename "$filepath" .json)" '$s|@uri')
if echo "$existing_libraries" | jq -e --arg name "$name" 'any(.[]; .Name | @uri == $name)'; then
echo "Skipping existing virtual folder: $name"
continue
fi
echo "Creating virtual folder: $name"
curl -sf "$JELLYFIN_HOST/Library/VirtualFolders?collectionType=$collectionType&name=$name" \
-X POST \
-H "Content-Type: application/json" \
-H 'Authorization: MediaBrowser Token="'"$token"'"' \
--data-binary @"$filepath"
done

View File

@@ -17,15 +17,12 @@ start() {
start "$@" start "$@"
# shellcheck disable=SC2034
JELLYFIN_HOST="http://localhost:8096" JELLYFIN_HOST="http://localhost:8096"
# shellcheck disable=SC2034
JELLYFIN_ADMIN_USERNAME="${JELLYFIN_ADMIN_USERNAME:-admin}" JELLYFIN_ADMIN_USERNAME="${JELLYFIN_ADMIN_USERNAME:-admin}"
until setup="$(curl -sf --retry 10 --retry-connrefused "$JELLYFIN_HOST/System/Info/Public" | jq -r '.StartupWizardCompleted' 2>/dev/null)"; do if [ -f /etc/jellyfin/setup.sh ]; then
echo "Waiting for Jellyfin to be ready..."
sleep 1
done
if [ "$setup" = "false" ] && [ -f /etc/jellyfin/setup.sh ]; then
# shellcheck disable=SC1091 # shellcheck disable=SC1091
. /etc/jellyfin/setup.sh . /etc/jellyfin/setup.sh

View File

@@ -2,17 +2,16 @@
# AUTO-UPDATE: nix-update --flake jellyfin-plugin-intro-skipper # AUTO-UPDATE: nix-update --flake jellyfin-plugin-intro-skipper
pkgs.stdenv.mkDerivation rec { pkgs.stdenv.mkDerivation rec {
pname = "intro-skipper"; pname = "intro-skipper";
version = "10.11/v1.10.11.2"; version = "10.10/v1.10.10.20";
src = src =
let let
parts = pkgs.lib.strings.splitString "/" version; parts = pkgs.lib.strings.splitString "/" version;
major = builtins.elemAt parts 0;
full = builtins.elemAt parts 1; full = builtins.elemAt parts 1;
in in
pkgs.fetchzip { pkgs.fetchzip {
url = "https://github.com/intro-skipper/intro-skipper/releases/download/${major}/${full}/intro-skipper-${full}.zip"; url = "https://github.com/intro-skipper/intro-skipper/releases/download/${version}/intro-skipper-${full}.zip";
sha256 = "sha256-3orE9jw2LoejeNYltIju1jtxjkHYd/CydDxAxKYcp5U="; sha256 = "sha256-RlrZkE8108Uj5V90+jw2o5fXb+K+9/hoDcEaSkKLDGg=";
stripRoot = false; stripRoot = false;
}; };