Make jellyfin script idempotent
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
@@ -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
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user