From 8d15a0069d6e26073229a91ab847fbae5ae71a91 Mon Sep 17 00:00:00 2001 From: Johannes Nydahl Date: Tue, 18 Aug 2026 18:00:09 +0200 Subject: [PATCH] fix: radarr4k and sonarr4k --- radarr4k.sh | 128 +++++++++++++++++++++++++++++++++------------------- sonarr4k.sh | 85 +++++++++++++++++++++------------- 2 files changed, 134 insertions(+), 79 deletions(-) diff --git a/radarr4k.sh b/radarr4k.sh index ca2216e..b078855 100755 --- a/radarr4k.sh +++ b/radarr4k.sh @@ -1,84 +1,103 @@ #!/bin/bash user=$(whoami) -mkdir -p "/home/$user/.logs/" -touch "/home/$user/.logs/radarr4k.log" -log="/home/$user/.logs/radarr4k.log" +mkdir -p "$HOME/.logs/" +touch "$HOME/.logs/radarr4k.log" +log="$HOME/.logs/radarr4k.log" function port() { LOW_BOUND=$1 UPPER_BOUND=$2 - comm -23 <(seq "${LOW_BOUND}" "${UPPER_BOUND}" | sort) <(ss -Htan | awk '{print $4}' | cut -d':' -f2 | sort -u) | shuf | head -n 1 + comm -23 <(seq ${LOW_BOUND} ${UPPER_BOUND} | sort) <(ss -Htan | awk '{print $4}' | cut -d':' -f2 | sort -u) | shuf | head -n 1 } -function _install() { - if [[ ! -f "/home/$user/.install/.radarr.lock" ]]; then - echo "Radarr is not installed. Exiting..." - exit 1 - fi - mkdir -p "/home/$user/.config/systemd/user/" - mkdir -p "/home/$user/.config/Radarr4k/" - echo "Installing the service" - cat > "/home/$user/.config/systemd/user/radarr4k.service" << SERV +function _systemd() { + cat > $HOME/.config/systemd/user/radarr4k.service << SERVICE [Unit] -Description=Radarr4k +Description=Radarr 4K instance After=syslog.target network.target [Service] Type=simple Environment="TMPDIR=%h/.tmp" -ExecStart=%h/Radarr/Radarr -nobrowser -data=%h/.config/Radarr4k -TimeoutStopSec=20 -KillMode=process -Restart=on-failure +ExecStart=%h/Radarr4k/Radarr -nobrowser -data=%h/.config/Radarr4k WorkingDirectory=%h +Restart=on-failure [Install] WantedBy=default.target -SERV - port=$(port 12000 14000) -echo "Installing Configuration" - cat > "/home/$user/.config/Radarr4k/config.xml" << EOF +SERVICE + +} + +function _download() { + echo "Downloading Radarr 4K binaries" + wget "https://radarr.servarr.com/v1/update/master/updatefile?os=linux&runtime=netcore&arch=x64" -q --show-progress -O $HOME/radarr4k.tar.gz + + echo "Extracting Radarr 4K binaries" + mkdir -p $HOME/Radarr4k + tar -C $HOME/Radarr4k -xzf $HOME/radarr4k.tar.gz --strip=1 >> "$log" 2>&1 + rm $HOME/radarr4k.tar.gz + + # This is needed in order for Radarr to work on older systems + # https://wiki.servarr.com/radarr/faq#radarr-wont-start-on-debian-11-or-older-systems-due-to-sqlite-version + rm $HOME/Radarr4k/libe_sqlite3.so + ln -s /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 $HOME/Radarr4k/libe_sqlite3.so +} + +function _install() { + _download + + port=$(port 8000 11000) + _systemd + + mkdir -p "$HOME/.config/systemd/user/" + mkdir -p "$HOME/.config/Radarr4k/" + + echo "Installing the service" + api_key=$(openssl rand -hex 16) + cat > $HOME/.config/Radarr4k/config.xml << EOF + + info + False ${port} + 9898 * - 8787 - False - Info - develop - False - BuiltIn - False - None + BuiltIn + main + False + + ${api_key} EOF -echo "Starting the userland service." systemctl enable --user --now -q radarr4k - sleep 45 - apikey=$(grep -oPm1 "(?<=)[^<]+" /home/"$user"/.config/Radarr4k/config.xml) - if ! timeout 45 bash -c -- "while ! curl -fL \"http://127.0.0.1:${port}/api/v3/system/status?apiKey=${apikey}\" >> \"$log\" 2>&1; do sleep 5; done"; then - echo "Radarr API did not respond as expected. Please make sure Radarr is on v3 and running." + mkdir -p "$HOME/.install/" + touch "$HOME/.install/.radarr4k.lock" + + echo "Attempting to contact Radarr 4K API" + if ! timeout 45 bash -c -- "while ! curl -fL \"http://127.0.0.1:${port}/api/v3/system/status?apiKey=${api_key}\" >> \"$log\" 2>&1; do sleep 5; done"; then + echo "Radarr 4K API did not respond as expected. Installation failed." exit 1 fi - read -rep "Please set a password for your radarr4k user ${user}> " -i "" password + + read -rep "Please set a password for your Radarr 4K user '${user}': " -i "" password echo "Applying authentication" - payload=$(curl -sL "http://127.0.0.1:${port}/api/v3/config/host?apikey=${apikey}" | jq ".authenticationMethod = \"forms\" | .username = \"${user}\" | .password = \"${password}\"") - curl -s "http://127.0.0.1:${port}/api/v3/config/host?apikey=${apikey}" -X PUT -H 'Accept: application/json, text/javascript, */*; q=0.01' --compressed -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' --data-raw "${payload}" >> "$log" + payload=$(curl -sL "http://127.0.0.1:${port}/api/v3/config/host?apikey=${api_key}" | jq ".authenticationMethod = \"forms\" | .username = \"${user}\" | .password = \"${password}\" | .passwordConfirmation = \"${password}\"") + curl -s -v "http://127.0.0.1:${port}/api/v3/config/host?apikey=${api_key}" -X PUT --header 'Content-Type: application/json' --data-raw "${payload}" >> "$log" 2>&1 sleep 15 - echo "Restarting Radarr4k" systemctl restart --user radarr4k echo "Now up and running at http://$(hostname -f):${port}" - mkdir -p "/home/${user}/.install/" - touch "/home/${user}/.install/.radarr4k.lock" } function _remove { systemctl stop --user radarr4k - systemctl disable --user radarr4k - rm -rf "/home/$user/.config/Radarr4k" - rm "/home/$user/.config/systemd/user/radarr4k.service" - rm "/home/${user}/.install/.radarr4k.lock" + systemctl disable --user radarr4k >> "$log" 2>&1 + rm -rf $HOME/.config/Radarr4k >> "$log" 2>&1 + rm $HOME/.config/systemd/user/radarr4k.service >> "$log" 2>&1 + rm "$HOME/.install/.radarr4k.lock" >> "$log" 2>&1 + rm -rf $HOME/Radarr4k >> "$log" 2>&1 } echo 'This is unsupported software. You will not get help with this, please answer `yes` if you understand and wish to proceed' @@ -98,24 +117,39 @@ echo "" echo "What do you like to do?" echo "install = Install Radarr 4K" echo "uninstall = Completely removes Radarr 4K" +echo "upgrade = Upgrade Radarr 4K to latest version" echo "exit = Exits Installer" while true; do read -r -p "Enter it here: " choice case $choice in "install") - if [[ -f "/home/$user/.install/.radarr4k.lock" ]]; then + if [[ -f "$HOME/.install/.radarr4k.lock" ]]; then echo "Radarr 4K is already installed." else _install fi break ;; + "upgrade") + if [[ -f "$HOME/.install/.radarr4k.lock" ]]; then + systemctl --user stop radarr4k + _systemd + _download + systemctl --user daemon-reload + systemctl --user start radarr4k + echo "Radarr 4K has been upgraded to the latest version" + else + echo "Radarr 4K is not installed" + fi + break + ;; "uninstall") - if [[ ! -f "/home/$user/.install/.radarr4k.lock" ]]; then + if [[ ! -f "$HOME/.install/.radarr4k.lock" ]]; then echo "Radarr 4K is not installed." break else _remove + echo "Radarr 4K has been uninstalled." fi break ;; diff --git a/sonarr4k.sh b/sonarr4k.sh index 1bea8c6..93b3042 100755 --- a/sonarr4k.sh +++ b/sonarr4k.sh @@ -1,8 +1,8 @@ #!/bin/bash user=$(whoami) -mkdir -p "/home/$user/.logs/" -touch "/home/$user/.logs/sonarr4k.log" -log="/home/$user/.logs/sonarr4k.log" +mkdir -p "$HOME/.logs/" +touch "$HOME/.logs/sonarr4k.log" +log="$HOME/.logs/sonarr4k.log" function port() { LOW_BOUND=$1 @@ -11,15 +11,15 @@ function port() { } function _systemd() { - cat > /home/${USER}/.config/systemd/user/sonarr4k.service << SERVICE + cat > $HOME/.config/systemd/user/sonarr4k.service << SERVICE [Unit] -Description=Sonarr4k +Description=Sonarr 4K instance After=syslog.target network.target [Service] Type=simple Environment="TMPDIR=%h/.tmp" -ExecStart=%h/Sonarr/Sonarr -nobrowser -data=%h/.config/Sonarr4k +ExecStart=%h/Sonarr4k/Sonarr -nobrowser -data=%h/.config/Sonarr4k WorkingDirectory=%h Restart=on-failure @@ -28,17 +28,30 @@ WantedBy=default.target SERVICE } + +function _download() { + echo "Downloading Sonarr 4K binaries" + wget "https://services.sonarr.tv/v1/download/main/latest?version=4&os=linux&arch=x64" -q --show-progress -O $HOME/sonarr4k.tar.gz + + echo "Extracting Sonarr 4K binaries" + mkdir -p $HOME/Sonarr4k + tar -C $HOME/Sonarr4k -xzf $HOME/sonarr4k.tar.gz --strip=1 >> "$log" 2>&1 + rm $HOME/sonarr4k.tar.gz +} + function _install() { - if [[ ! -f "/home/$user/.install/.sonarr.lock" ]]; then - echo "Sonarr is not installed. Exiting..." - exit 1 - fi - mkdir -p /home/$user/.config/systemd/user/ - mkdir -p /home/$user/.config/Sonarr4k/ + _download + port=$(port 8000 11000) _systemd + + mkdir -p "$HOME/.config/systemd/user/" + mkdir -p "$HOME/.config/Sonarr4k/" - cat > /home/$user/.config/Sonarr4k/config.xml << EOF + echo "Installing the service" + api_key=$(openssl rand -hex 16) + cat > $HOME/.config/Sonarr4k/config.xml << EOF + info False @@ -51,31 +64,35 @@ function _install() { main False + ${api_key} EOF systemctl enable --user --now -q sonarr4k - sleep 45 - apikey=$(grep -oPm1 "(?<=)[^<]+" /home/"$user"/.config/Sonarr4k/config.xml) - if ! timeout 45 bash -c -- "while ! curl -fL \"http://127.0.0.1:${port}/api/v3/system/status?apiKey=${apikey}\" >> \"$log\" 2>&1; do sleep 5; done"; then - echo "Sonarr API did not respond as expected. Please make sure Sonarr is on v3 and running." + mkdir -p "$HOME/.install/" + touch "$HOME/.install/.sonarr4k.lock" + + echo "Attempting to contact Sonarr 4K API" + if ! timeout 45 bash -c -- "while ! curl -fL \"http://127.0.0.1:${port}/api/v3/system/status?apiKey=${api_key}\" >> \"$log\" 2>&1; do sleep 5; done"; then + echo "Sonarr 4K API did not respond as expected. Installation failed." exit 1 fi - read -rep "Please set a password for your sonarr4k user ${user}> " -i "" password - payload=$(curl -sL "http://127.0.0.1:${port}/api/v3/config/host?apikey=${apikey}" | jq ".authenticationMethod = \"forms\" | .username = \"${user}\" | .password = \"${password}\"") - curl -s "http://127.0.0.1:${port}/api/v3/config/host?apikey=${apikey}" -X PUT -H 'Accept: application/json, text/javascript, */*; q=0.01' --compressed -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' --data-raw "${payload}" >> "$log" + + read -rep "Please set a password for your Sonarr 4K user '${user}': " -i "" password + echo "Applying authentication" + payload=$(curl -sL "http://127.0.0.1:${port}/api/v3/config/host?apikey=${api_key}" | jq ".authenticationMethod = \"forms\" | .username = \"${user}\" | .password = \"${password}\" | .passwordConfirmation = \"${password}\"") + curl -s -v "http://127.0.0.1:${port}/api/v3/config/host?apikey=${api_key}" -X PUT --header 'Content-Type: application/json' --data-raw "${payload}" >> "$log" 2>&1 sleep 15 systemctl restart --user sonarr4k echo "Now up and running at http://$(hostname -f):${port}" - mkdir -p "/home/${user}/.install/" - touch "/home/${user}/.install/.sonarr4k.lock" } function _remove { systemctl stop --user sonarr4k - systemctl disable --user sonarr4k - rm -rf /home/$user/.config/Sonarr4k - rm /home/$user/.config/systemd/user/sonarr4k.service - rm "/home/${user}/.install/.sonarr4k.lock" + systemctl disable --user sonarr4k >> "$log" 2>&1 + rm -rf $HOME/.config/Sonarr4k >> "$log" 2>&1 + rm $HOME/.config/systemd/user/sonarr4k.service >> "$log" 2>&1 + rm "$HOME/.install/.sonarr4k.lock" >> "$log" 2>&1 + rm -rf $HOME/Sonarr4k >> "$log" 2>&1 } echo 'This is unsupported software. You will not get help with this, please answer `yes` if you understand and wish to proceed' @@ -95,12 +112,13 @@ echo "" echo "What do you like to do?" echo "install = Install Sonarr 4K" echo "uninstall = Completely removes Sonarr 4K" +echo "upgrade = Upgrade Sonarr 4K to latest version" echo "exit = Exits Installer" while true; do read -r -p "Enter it here: " choice case $choice in "install") - if [[ -f "/home/$user/.install/.sonarr4k.lock" ]]; then + if [[ -f "$HOME/.install/.sonarr4k.lock" ]]; then echo "Sonarr 4K is already installed." else _install @@ -108,22 +126,25 @@ while true; do break ;; "upgrade") - if [[ -f "/home/$user/.install/.sonarr4k.lock" ]]; then - echo "Upgrading Sonarr 4K systemd" + if [[ -f "$HOME/.install/.sonarr4k.lock" ]]; then + systemctl --user stop sonarr4k _systemd + _download systemctl --user daemon-reload - systemctl --user try-restart sonarr4k + systemctl --user start sonarr4k + echo "Sonarr 4K has been upgraded to the latest version" else echo "Sonarr 4K is not installed" - break fi + break ;; "uninstall") - if [[ ! -f "/home/$user/.install/.sonarr4k.lock" ]]; then + if [[ ! -f "$HOME/.install/.sonarr4k.lock" ]]; then echo "Sonarr 4K is not installed." break else _remove + echo "Sonarr 4K has been uninstalled." fi break ;;