5 hours ago
I ran into the same problem, but I gave the code to Chat-GPT to rewrite.
Code:
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
JELLYFIN_SERVER="http://server_ip"
API_KEY="YOUR-API-Key"
trap 'printf "Script interrupted.\n" >&2; exit 1' INT TERM
fetch_libraries() {
local response
if ! response=$(curl -s -H "X-Emby-Token: $API_KEY" "$JELLYFIN_SERVER/Library/VirtualFolders"); then
printf "Failed to retrieve libraries from Jellyfin server.\n" >&2
return 1
fi
if [[ -z "${response//[[:space:]]/}" ]]; then
printf "Empty response received from Jellyfin server.\n" >&2
return 1
fi
printf "%s" "$response"
}
extract_names() {
local data="$1"
local names
if ! names=$(printf "%s" "$data" | grep -o '"Name":"[^"]*"' | sed 's/"Name":"\(.*\)"/\1/'); then
printf "Failed to extract names from JSON response.\n" >&2
return 1
fi
if [[ -z "${names//[[:space:]]/}" ]]; then
printf "No library names found in JSON response.\n" >&2
return 1
fi
printf "%s" "$names"
}
extract_ids() {
local data="$1"
local ids
if ! ids=$(printf "%s" "$data" | grep -o '"ItemId":"[^"]*"' | sed 's/"ItemId":"\(.*\)"/\1/'); then
printf "Failed to extract IDs from JSON response.\n" >&2
return 1
fi
if [[ -z "${ids//[[:space:]]/}" ]]; then
printf "No library IDs found in JSON response.\n" >&2
return 1
fi
printf "%s" "$ids"
}
print_libraries() {
local names="$1"
local ids="$2"
paste <(printf "%s\n" "$names") <(printf "%s\n" "$ids") | while IFS=$'\t' read -r name id; do
printf "Name: %s | ID: %s\n" "$name" "$id"
done
}
scan_library() {
local library_id="$1"
if [[ -z "${library_id//[[:space:]]/}" ]]; then
printf "Library ID not provided. Exiting.\n" >&2
return 1
fi
printf "Starting scan of library %s ...\n" "$library_id"
if ! curl -s -X POST \
"$JELLYFIN_SERVER/Items/$library_id/Refresh?Recursive=true&ImageRefreshMode=Default&MetadataRefreshMode=Default&ReplaceAllImages=false&RegenerateTrickplay=false&ReplaceAllMetadata=false" \
-H "Content-Type: application/json" \
-H "X-Emby-Token: $API_KEY" >/dev/null; then
printf "Failed to start scan for library %s.\n" "$library_id" >&2
return 1
fi
printf "Scan started (check the Jellyfin dashboard for status).\n"
}
main() {
printf "Retrieving available libraries...\n"
local libraries names ids library_id
libraries=$(fetch_libraries) || return 1
names=$(extract_names "$libraries") || return 1
ids=$(extract_ids "$libraries") || return 1
print_libraries "$names" "$ids"
printf "\n"
read -r -p "Enter the ID of the library to scan: " library_id
scan_library "$library_id" || return 1
}
main "$@"
Code:
Retrieving available libraries...
Name: TV | ID: 4514ec850e5ad0c47b58444e17b6346c
Name: Movies | ID: f137a2dd21bbc1b99aa5c0f6bf02a805
Enter the ID of the library to scan: e2c00f297a5f80af390f52f72e782147
Starting scan of library e2c00f297a5f80af390f52f72e782147 ...
Scan started (check the Jellyfin dashboard for status).