wait for container station on start, web panel update

This commit is contained in:
crieke
2026-04-15 03:12:19 +02:00
parent a1fc9585d3
commit 1222396af4
9 changed files with 224 additions and 153 deletions

View File

@@ -112,7 +112,7 @@ QPKG_NAME="RoonServer"
PKG_MAIN_REMOVE="{
## Remove Roon Servers docker image
CS_DIR=`$CMD_GETCFG "container-station" Install_Path -f SYS_QPKG_CONFIG_FILE`
CS_DIR=`$CMD_GETCFG "container-station" Install_Path -f "${SYS_QPKG_CONFIG_FILE}"`
$CS_DIR/bin/system-docker image rm 'ghcr.io/roonlabs/roonserver:latest'
}"
@@ -153,7 +153,7 @@ pkg_install(){
## Creating required folders and setting permissions
"${CMD_MKDIR}" -m 777 "${SYS_QPKG_DIR}"/id
CS_DIR=`$CMD_GETCFG "container-station" Install_Path -f SYS_QPKG_CONFIG_FILE`
CS_DIR=`$CMD_GETCFG "container-station" Install_Path -f "${SYS_QPKG_CONFIG_FILE}"`
# Pull Roon Server docker image, so the first qpkg launch will take less time.
$CS_DIR/bin/system-docker pull 'ghcr.io/roonlabs/roonserver:latest'

View File

@@ -3,7 +3,7 @@ QPKG_NAME="RoonServer"
# Name of the display application.
QPKG_DISPLAY_NAME="Roon Server"
# Version of the packaged application.
QPKG_VER="2026-04-14"
QPKG_VER="2026-04-15"
# Author or maintainer of the package
QPKG_AUTHOR="Christopher Rieke"
# License for the packaged application
@@ -12,7 +12,7 @@ QPKG_AUTHOR="Christopher Rieke"
QPKG_SUMMARY="Roon organizes your personal music files, TIDAL streams, and internet radio stations and adds rich data like artist photos, bios, tour dates, lyrics, credits, and more. Using Roon Server with remote apps for Mac, Windows, iOS, and Android you can stream audio around your home to Sonos, AirPlay, Squeezebox, and Roon Ready devices."
# Preferred number in start/stop sequence.
QPKG_RC_NUM="101"
QPKG_RC_NUM="200"
# Init-script used to control the start and stop of the installed application.
QPKG_SERVICE_PROGRAM="RoonServer.sh"

View File

@@ -4,10 +4,10 @@ QPKG_NAME="RoonServer"
QPKG_ROOT=`/sbin/getcfg $QPKG_NAME Install_Path -f ${CONF}`
QCS_NAME="container-station"
QCS_QPKG_DIR=$(/sbin/getcfg $QCS_NAME Install_Path -f $CONF)
DOCKER_CMD=$QCS_QPKG_DIR/bin/system-docker
QCS_QPKG_DIR=$(/sbin/getcfg $QCS_NAME Install_Path -f ${CONF})
DOCKER_CMD="${QCS_QPKG_DIR}/bin/system-docker"
CONTAINER_NAME=roonserver
COMPOSE_YML_DIR=$QPKG_ROOT/docker/compose
COMPOSE_YML_DIR="${QPKG_ROOT}/docker/compose"
ROONSERVER_OPTIONS=(`/sbin/getcfg $QPKG_NAME options -f ${CONF}`)
ROON_CHANNEL="production"
@@ -34,6 +34,9 @@ ROON_DATABASE_DIR_FREE_INODES=`df -PThi "${ROON_DATAROOT}" | awk '{print $5}' |
ROON_FFMPEG_DIR="${ROON_DATAROOT}/bin"
ROON_LOG_FILE="${ROON_DATAROOT}/RoonOnNAS.log.txt"
echo $(basename "$0") >> ${ROON_LOG_FILE}
echo $@ >> ${ROON_LOG_FILE}
ST_COLOR="\033[38;5;34m"
HL_COLOR="\033[38;5;197m"
REG_COLOR="\033[0m"
@@ -44,22 +47,6 @@ do
declare $i=true
done
compose_docker_yml_files () {
COMPOSE_FILES="\
-f ${COMPOSE_YML_DIR}/roonserver.yml \
-f ${COMPOSE_YML_DIR}/platform_specific.yml "
[ -z ${smb_cifs+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/smb_cifs_support.yml"
( [ -z ${usb_audio+x} ] && [ -z ${hdmi_audio+x} ] ) || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio.yml"
[ -z ${usb_audio+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio_usb.yml"
[ -z ${hdmi_audio+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio_hdmi.yml"
}
## Log Function
echolog () {
TIMESTAMP=$(date +%d.%m.%y-%H:%M:%S)
@@ -77,8 +64,18 @@ echolog () {
fi
}
info ()
{
compose_docker_yml_files () {
COMPOSE_FILES="\
-f ${COMPOSE_YML_DIR}/roonserver.yml \
-f ${COMPOSE_YML_DIR}/platform_specific.yml "
[ -z ${smb_cifs+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/smb_cifs_support.yml"
( [ -z ${usb_audio+x} ] && [ -z ${hdmi_audio+x} ] ) || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio.yml"
[ -z ${usb_audio+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio_usb.yml"
[ -z ${hdmi_audio+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio_hdmi.yml"
}
info () {
## Echoing System Info
echolog "ROON_DATABASE_DIR" "${ROON_DATAROOT} - [`[ -d \"${ROON_DATAROOT}\" ] && echo \"available\" || echo \"not available\"`]"
echolog "ROON_DATABASE_DIR_FS" "${ROON_DATABASE_DIR_FS}"
@@ -95,30 +92,42 @@ info ()
echolog "Roon-Channel" "${ROON_CHANNEL}"
}
RoonOnNAS_folderCheck ()
{
RoonOnNAS_folderCheck () {
if [ -d "${ROONONNAS_DIR}" ]; then
[ -d "${ROONONNAS_DIR}/RoonOnNAS" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS"
[ -d "${ROONONNAS_DIR}/RoonOnNAS/bin" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS/bin"
fi
}
start_RoonServer () {
if [ "${ROON_DATAROOT}" != "/RoonOnNAS" ] && [ -d "${ROON_DATAROOT}" ]; then
compose_docker_yml_files
export_vars
## Creating required directories, if they do not exist
[ -d "$ROON_ID_HOST_DIR" ] || mkdir "$ROON_ID_HOST_DIR"
[ -d "$ROON_TMP_DIR" ] || mkdir "$ROON_TMP_DIR"
${DOCKER_CMD} compose ${COMPOSE_FILES} up -d
fi
getCSStatus () {
echo "$(/sbin/getcfg container-station status -f /etc/qpkg_run_status)"
}
checkCS () {
case $(getCSStatus) in
0)
echolog "Container Station down."
exit 1;
;;
1)
echolog "Container Station is starting..."
SECONDS=0
until [[ $(getCSStatus) == "2" ]]; do
if (( SECONDS > 120 )); then
echolog "Giving up..."
exit 1
fi
echolog "($SECONDS) Container Station is not up yet. Waiting..."
sleep 5
done
;;
2)
echolog "Container Station is up."
;;
esac
}
export_vars ()
{
export_vars () {
export ROON_DATAROOT
export QPKG_ROOT
export QNAP_MODEL
@@ -128,55 +137,90 @@ export_vars ()
export ROON_CHANNEL
}
start_daemon ()
{
start_webpanel () {
[ -f ${ROON_DATAROOT}/earlyaccess.txt ] && ROON_CHANNEL="earlyaccess"
info
#Launch the service in the background if RoonServer share exists.
ln -sfn "${QPKG_ROOT}/web" "${WEB_PATH}${WEBUI}"
start_RoonServer
}
}
start_roonserver () {
if [ "${ROON_DATAROOT}" != "/RoonOnNAS" ] && [ -d "${ROON_DATAROOT}" ]; then
compose_docker_yml_files
export_vars
## Creating required directories, if they do not exist
[ -d "$ROON_ID_HOST_DIR" ] || mkdir "$ROON_ID_HOST_DIR"
[ -d "$ROON_TMP_DIR" ] || mkdir "$ROON_TMP_DIR"
echo "Docker Command: $(ls -lha ${DOCKER_CMD})" 2>&1 >> ${ROON_LOG_FILE}
echo "Docker CMD: $(${DOCKER_CMD} --version)" 2>&1 >> ${ROON_LOG_FILE}
echo "COMPOSE_FILES: ${COMPOSE_FILES}" 2>&1 >> ${ROON_LOG_FILE}
echo "CS Run-Status: $(/sbin/getcfg container-station status -f /etc/qpkg_run_status)" >> ${ROON_LOG_FILE}
sleep 60
${DOCKER_CMD} compose ${COMPOSE_FILES} up -d 2>&1 >> ${ROON_LOG_FILE}
${DOCKER_CMD} compose ${COMPOSE_FILES} up -d
fi
}
case "$1" in
start)
ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -d FALSE -f $CONF)
RoonOnNAS_folderCheck
if [ "$ENABLED" != "TRUE" ]; then
echolog "$QPKG_NAME is disabled."
exit 1
fi
CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)
if [ ! "$CONTAINER_ID" ]; then
echo "not running"
start_daemon
else
echolog "${QPKG_NAME} is already running (ID: $CONTAINER_ID)"
fi
RS_ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -d FALSE -f $CONF)
CS_ENABLED=$(/sbin/getcfg "container-station" Enable -u -d FALSE -f $CONF)
if [ "$RS_ENABLED" != "TRUE" ]; then
echolog "$QPKG_NAME is disabled."
exit 1
fi
if [ "$CS_ENABLED" != "TRUE" ]; then
echolog "Container Station is disabled."
exit 1
fi
CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)
if [ ! "$CONTAINER_ID" ]; then
echolog "Starting Roon Server..."
info
checkCS
RoonOnNAS_folderCheck
start_webpanel
start_roonserver
else
echolog "${QPKG_NAME} is already running (ID: $CONTAINER_ID)"
fi
;;
stop)
CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)
if [ ! "$CONTAINER_ID" ]; then
CS_ENABLED=$(/sbin/getcfg "container-station" Enable -u -d FALSE -f $CONF)
# Check if CS has not been stopped before Roon Server
if [ "$CS_ENABLED" == "TRUE" ]; then
# --> CS is still up.
CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)
if [ ! "$CONTAINER_ID" ]; then
# --> No roonserver conatiner running
echolog "${QPKG_NAME} is not running."
else
else
# --> Stopping roonserver conatiner
echolog "Stopping RoonServer..."
compose_docker_yml_files
export_vars
${DOCKER_CMD} compose ${COMPOSE_FILES} down
if [[ $2 != "keepwebalive" ]]; then
rm -rf "${QPKG_ROOT}/web/tmp"/*
rm "${WEB_PATH}${WEBUI}"
fi
[ -d "${WEB_PATH}${WEBUI}" ] && rm "${WEB_PATH}${WEBUI}"
echolog "RoonServer has been stopped."
fi
else
# -> CS is disabled:
# Edge case: CS has been stopped before RoonServer. We can assume RoonServer docker is down. Only the web-panel needs to be removed
[ -d "${WEB_PATH}${WEBUI}" ] && rm "${WEB_PATH}${WEBUI}"
echolog "RoonServer is not running."
fi
;;
restart)
isRestart=true
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1

View File

@@ -90,7 +90,7 @@ $ContributorsManual = array(
<br><br>
<div id="about-github" style="background-color: #d7d7d7; padding: 20px; text-align: center;">
<div id="about-github" style="padding: 20px; text-align: center;">
<div>
<?php echo localize("MODAL_ABOUT_GITHUB"); ?><br>
<div style="text-align: center; font-size: 50px;">

View File

@@ -28,7 +28,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<p class="lead"><?php echo localize("OVERVIEW_TEXT1"); ?><br>
<?php echo localize("OVERVIEW_TEXT2"); ?></p>-->
<div class="row">
<div class="col-sm-6">
<div class="col-sm-8">
<div class="card">
<div class="card-body">
<span class="fa-stack fa-2x">
@@ -39,7 +39,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<p class="card-text">
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_STATUS"); ?>
:</b> <?php if (strlen(isRunning()) > 1 ) {
echo '<span data-bs-toggle="tooltip" title="' . localize("OVERVIEW_ROONSERVER_PANEL_CONTAINER_ID") .': ' . isRunning() . '" style="color: green;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_RUNNING") . '</span>';
echo '<span data-bs-toggle="tooltip" data-bs-title="' . localize("OVERVIEW_ROONSERVER_PANEL_CONTAINER_ID") .': ' . isRunning() . '" style="color: green;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_RUNNING") . '</span>';
} else {
echo '<span style="color: red;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED") . '</span>';
} ?><br>
@@ -49,7 +49,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
:</b> <?php echo $qpkg_conf['RoonServer']['Version']; ?></span>
</p>
<h5><?php echo localize("OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE"); ?></h5>
<span data-bs-toggle="tooltip" title="<?php echo $dblocation; ?>">
<span data-bs-toggle="tooltip" data-bs-title="<?php echo $dblocation; ?>">
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_LOCATION"); ?>: </b><?php echo $dblocation; ?>
</span>
<div class="progress" style="height: 20px;">
@@ -59,19 +59,21 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<?php echo $db_perc . '% ' . localize("OVERVIEW_ROONSERVER_PANEL_SPACE_OF") . ' ' . displayStorage($db_vol_cap) . ' ' . localize("OVERVIEW_ROONSERVER_PANEL_SPACE_USED") . '.'; ?>
</p>
<div class="row">
<span id="log" class="col getModal d-flex justify-content-start">
<span id="log" class="col-2 getModal d-flex justify-content-start">
<a href="#"
class="btn btn-light btn-icon float-left"
class="btn btn-outline-danger"
data-bs-theme="dark"
data-bs-toggle="tooltip"
title="<?php echo localize("MODAL_LOGFILES_ICON_TOOLTIP"); ?>">
data-bs-title="<?php echo localize("MODAL_LOGFILES_ICON_TOOLTIP"); ?>">
<i class="fas fa-ambulance"></i>
</a>
</span>
<span id="setStorage" class="col-6 getModal float-right">
<span id="setStorage" class="col-9 getModal ms-auto float-end">
<a href="#"
class="btn btn-primary"
data-bs-theme="dark"
data-bs-toggle="tooltip"
title="<?php echo localize("OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP"); ?>">
data-bs-title="<?php echo localize("OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP"); ?>">
<?php echo localize("OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION"); ?>
</a>
</span>
@@ -79,23 +81,22 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
</div>
</div>
</div>
<div class="col-sm-6">
<div class="col-sm-4">
<div class="card">
<div class="card-body">
<span class="fa-stack fa-2x">
<i class="fa fa-circle fa-stack-2x" style="color: #222222;"></i>
<i class="fas fa-cog fa-stack-1x" style="color: #ffffff;"></i>
</span>
<h5>Settings</h5>
<div class=" d-grid gap-3 w-50">
<h5><?php echo localize("OVERVIEW_OPTIONS_PANEL_TITLE"); ?></h5>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="smb_cifs" onchange="changeSettings(this)">
<label class="form-check-label justify-content-start" for="flexSwitchCheckChecked">SMB/CIFS mount support</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="usb_audio" onchange="changeSettings(this)">
<label class="form-check-label justify-content-start" for="flexSwitchCheckChecked">USB audio (DAC)</label>
<label class="form-check-label justify-content-start" for="flexSwitchCheckChecked" data-bs-toggle="tooltip" data-bs-title="<?php echo localize("OVERVIEW_OPTIONS_PANEL_USB_AUDIO_TOOLTIP"); ?>">USB audio (DAC)</label>
</div>
<div class="form-check form-switch">
@@ -103,14 +104,15 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<label class="form-check-label justify-content-start text-left" for="flexSwitchCheckChecked">HDMI audio</label>
</div>
</div>
<span id="saveOptions" class="getModal">
<span id="save" class="getModal">
<a href="#"
class="btn btn-primary float-right"
id="saveButton"
class="btn btn-primary float-right disabled"
data-bs-toggle="tooltip"
onclick="saveOptions()"
title="Save Options">
Save
data-bs-title="Save & Restart"
data-bs-theme="dark"
><?php echo localize("OVERVIEW_OPTIONS_PANEL_SAVE_BTN"); ?>
</a>
</span>
</div>
@@ -127,11 +129,6 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
echo "false";
} ?>;
// Enable Tooltips
$(function () {
document.querySelectorAll('[data-bs-toggle="tooltip"]')
});
// Action when button for Modal is clicked
$('.getModal').on('click', function (e) {
@@ -149,20 +146,42 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
$('#modal').modal('show');
return false;
});
function changeSettings(el) {
// add code to guide user to press save next
//console.log(el.id + ": " + el.checked);
function changeSettings() {
var qpkg_options_str = "<?php echo $qpkg_conf_options ?>";
var qpkg_options_arr = qpkg_options_str.split(' ');
var qnap_opt_arr = [];
document.getElementById('smb_cifs').checked && qnap_opt_arr.push("smb_cifs");
document.getElementById('usb_audio').checked && qnap_opt_arr.push("usb_audio");
document.getElementById('hdmi_audio').checked && qnap_opt_arr.push("hdmi_audio");
console.log(qnap_opt_arr.join(' ') == qpkg_options_arr.join(' '));
console.log(qnap_opt_arr.join(' ') == qpkg_options_arr.join(' '));
if ( qnap_opt_arr.join(' ') == qpkg_options_arr.join(' ') ) {
$("#saveButton").addClass("disabled");
} else {
$("#saveButton").removeClass("disabled");
}
}
$( document ).ready(function() {
var qpkg_options_str = "<?php echo $qpkg_conf_options ?>";
var qpkg_options_arr = qpkg_options_str.split(' ');
for (let conf_option of qpkg_options_arr) {
document.getElementById(conf_option).checked = true;
}
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl))
if ( qpkg_options_str.length > 0 ) {
var qpkg_options_arr = qpkg_options_str.split(' ');
for (let conf_option of qpkg_options_arr) {
document.getElementById(conf_option).checked = true;
}
}
});
// Function to download log files
function saveOptions () {
var qnap_options = "";
@@ -170,6 +189,8 @@ function saveOptions () {
qnap_options += document.getElementById('usb_audio').checked ? "usb_audio;" : "" ;
qnap_options += document.getElementById('hdmi_audio').checked ? "hdmi_audio;" : "" ;
$("#saveButton").addClass("disabled");
document.getElementById('smb_cifs').checked
var strUrl = '<?php echo NASHOST;?>/cgi-bin/qpkg/RoonServer/ajax/ajax.php?a=setOptions&o=' + qnap_options;

View File

@@ -57,6 +57,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
imageCssClassField: 'faCssClass',
uiLibrary: 'bootstrap5',
cascadeSelection: false,
cascadeCheck: false,
selectionType: 'single',
icons: {
expand: '<i class="fas fa-angle-right" />',
@@ -121,10 +122,11 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<div class="input-group">
<span class="input-group-btn">
<span class="form form-control"
style="background: #F5F5F5; border-radius: 0.25em 0 0 0.25em !important;"
style="background: var(--bs-dark-bg-subtle); border-radius: 0.25em 0 0 0.25em !important;"
readonly><?php echo localize("MODAL_SETUP_DB_LOCATION"); ?></span>
</span>
<input id="dblocform" type="text" class="form-control" style="background: #ffffff;" value="<?php
<input id="dblocform" type="text" class="form-control" style="background: var(--bs-dark
); color: var(--bs-dark-text-emphasis)" value="<?php
if (isset($dblocation)) {
echo $dblocation;
} else {

View File

@@ -38,13 +38,16 @@
"OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Stopped",
"OVERVIEW_ROONSERVER_PANEL_VERSION": "Version",
"OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION": "QPKG-Version",
"OVERVIEW_ROONSERVER_PANEL_PID": "Process ID",
"OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE": "Database",
"OVERVIEW_ROONSERVER_PANEL_LOCATION": "Location",
"OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "of",
"OVERVIEW_ROONSERVER_PANEL_SPACE_USED": "used",
"OVERVIEW_ROONSERVER_PANEL_CONTAINER_ID": "ID",
"OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION": "Change database location",
"OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP": "Change the location, where Roon Server stores its database.",
"OVERVIEW_OPTIONS_PANEL_USB_AUDIO_TOOLTIP": "Enable this, if you want to connect usb audio devices directly to your QNAP NAS.",
"OVERVIEW_OPTIONS_PANEL_TITLE": "Settings",
"OVERVIEW_OPTIONS_PANEL_SAVE_BTN": "Save & Restart",
"OVERVIEW_AUDIO_PANEL_HEADLINE": "Connected Audio Devices",
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_HEADLINE": "Multimedia Functions disabled",
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_DESCRIPTION1": "To use audio devices on your NAS, you'll need to turn them on in the General section of the QNAP ControlPanel.",

View File

@@ -39,28 +39,17 @@
"OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Angehalten",
"OVERVIEW_ROONSERVER_PANEL_VERSION": "Version",
"OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION": "QPKG-Version",
"OVERVIEW_ROONSERVER_PANEL_PID": "Prozess ID",
"OVERVIEW_ROONSERVER_PANEL_CONTAINER_ID": "ID",
"OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE": "Datenbank",
"OVERVIEW_ROONSERVER_PANEL_LOCATION": "Speicherort",
"OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "von",
"OVERVIEW_ROONSERVER_PANEL_SPACE_USED": "belegt",
"OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION": "Speicherort ändern",
"OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP": "Speicherort ändern, an dem Roon Server seine Datenbank sichert.",
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_HEADLINE": "Multimediafunktionen deaktiviert",
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_DESCRIPTION1": "Zur Verwendung von lokalen Audiogeräten am QNAP, aktiviere Multimediafunktionen in den allgemeinen Einstellungen der QNAP Systemsteuerung.",
"OVERVIEW_OPTIONS_PANEL_USB_AUDIO_TOOLTIP": "Zur Verwendung von lokalen Audiogeräten direkt am QNAP.",
"OVERVIEW_OPTIONS_PANEL_TITLE": "Einstellungen",
"OVERVIEW_OPTIONS_PANEL_SAVE_BTN": "Speichern & Neustarten",
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_DESCRIPTION2": "Um Audiogeräte direkt an deinem QNAP zu verwenden, muss Roon Server neu gestartet werden.",
"OVERVIEW_AUDIO_PANEL_HEADLINE": "Verbundene Audiogeräte",
"OVERVIEW_AUDIO_PANEL_BTN_AUDIO_DEVICES": "Audiogeräte",
"OVERVIEW_AUDIO_PANEL_BTN_AUDIO_DEVICES_TOOLTIP": "Zeigt den Inhalt der Datei '<i>/proc/asound/cards</i>'",
"MODAL_REINSTALL_HEADLINE": "Roon Server erneut installieren?",
"MODAL_REINSTALL_DESCRIPTION_1": "Möchtest du die aktuelle Version von Roon Server installieren?",
"MODAL_REINSTALL_DESCRIPTION_2": "Bei diesem Vorgang werden die Programmdateien, durch die aktuelle Version von der Roon Labs Webseite ersetzt.",
"MODAL_REINSTALL_LOADING": "Laden...",
"MODAL_REINSTALL_ICON_TOOLTIP": "Aktuelle Version des Roon Server erneut von der Roon Labs Webseite laden.",
"MODAL_REINSTALL_DB_UNTOUCHED": "Deine Roon Datanbank bleibt dabei unberührt.",
"MODAL_REINSTALL_ROONSERVER_WILL_STOP": "Roon Server wird für diesen Vorgang kurzzeitig beendet.",
"MODAL_REINSTALL_PROCEED_TEXT": "Ja, mein QNAP soll die aktuelle Roon Server Version laden und installieren",
"MODAL_REINSTALL_DONE": "Roon Server wurde durch die aktuelle Version von der Roon Labs Webseite ersetzt.",
"MODAL_LOGFILES_HEADLINE": "Log-Dateien laden",
"MODAL_LOGFILES_ICON_TOOLTIP": "Sämtliche Log-Dateien als .zip-Datei laden.",
"MODAL_LOGFILES_CHECK_DOWNLOAD_FOLDER": "Bitte schaue in deinen Download-Ordner.",

View File

@@ -4,7 +4,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
?>
<!DOCTYPE html>
<html>
<html data-bs-theme="dark">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
@@ -73,44 +73,56 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
}
?>
<!-- <nav class="navbar navbar-expand-lg navbar-light bg-light"> -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand " href="index.php">
<img src="img/roonIcon.svg" alt="Roon Icon" style="height: 40px;">
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-target="#navbarsExampleDefault"
aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
<nav class="navbar navbar-expand-lg bg-body-tertiary" data-bs-theme="dark">
<div class="container-fluid">
<a class="navbar-brand" href="#">
<img src="img/roonIcon.svg" alt="Roon Icon" style="height: 40px;">
Roon Server</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link active" href="index.php"><?php echo localize("NAV_MENU_ROONSERVER"); ?></a>
</li>
</ul>
';
<ul class="navbar-nav ml-auto">
<li class="nav-item dropdown pull-right dropdown-menu-right">
<a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-bs-toggle="dropdown"
aria-haspopup="true" aria-expanded="false"><?php echo localize("NAV_MENU_MORE"); ?></a>
<div class="dropdown-menu pull-right" aria-labelledby="dropdown01">
<a class="dropdown-item" href="https://roon.app/de/downloads" target="_blank">
<?php echo localize("NAV_MENU_DOWNLOADS"); ?></a>
<a class="dropdown-item" href="https://community.roonlabs.com"
target="_blank"><?php echo localize("NAV_MENU_COMMUNITY"); ?></a>
<a class="dropdown-item" href="https://kb.roonlabs.com/Roon_Server_on_NAS"
target="_blank"><?php echo localize("NAV_MENU_ROON_ON_NAS"); ?></a>
<a class="dropdown-item" href="https://roon.app/de/pricing" target="_blank">
<?php echo localize("NAV_MENU_TRY_ROON"); ?></a>
</div>
</li>
<li class="nav-item">
<a id="about" class="getModal nav-link float-right" href="#"><i class="fas fa-info-circle"></i> <?php echo localize('NAV_MENU_INFO'); ?></a>
</li>
</ul>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto">
<li class="nav-item dropdown pull-right dropdown-menu-right">
<a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-bs-toggle="dropdown"
aria-haspopup="true" aria-expanded="false"><?php echo localize("NAV_MENU_MORE"); ?></a>
<div class="dropdown-menu pull-right" aria-labelledby="dropdown01">
<a class="dropdown-item" href="https://roon.app/de/downloads" target="_blank">
<?php echo localize("NAV_MENU_DOWNLOADS"); ?></a>
<a class="dropdown-item" href="https://community.roonlabs.com"
target="_blank"><?php echo localize("NAV_MENU_COMMUNITY"); ?></a>
<a class="dropdown-item" href="https://kb.roonlabs.com/Roon_Server_on_NAS"
target="_blank"><?php echo localize("NAV_MENU_ROON_ON_NAS"); ?></a>
<a class="dropdown-item" href="https://roon.app/de/pricing" target="_blank">
<?php echo localize("NAV_MENU_TRY_ROON"); ?></a>
</div>
</li>
<li class="nav-item">
<a id="about" class="getModal nav-link float-right" href="#"><i class="fas fa-info-circle"></i> <?php echo localize('NAV_MENU_INFO'); ?></a>
</li>
</ul>
<!--
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item me-auto dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</li>
</ul>-->
</div>
</div>
</nav>
<div id="contentblock">
<?php
$section = "info";