wait for container station on start, web panel update
This commit is contained in:
@@ -112,7 +112,7 @@ QPKG_NAME="RoonServer"
|
|||||||
PKG_MAIN_REMOVE="{
|
PKG_MAIN_REMOVE="{
|
||||||
|
|
||||||
## Remove Roon Servers docker image
|
## 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'
|
$CS_DIR/bin/system-docker image rm 'ghcr.io/roonlabs/roonserver:latest'
|
||||||
|
|
||||||
}"
|
}"
|
||||||
@@ -153,7 +153,7 @@ pkg_install(){
|
|||||||
## Creating required folders and setting permissions
|
## Creating required folders and setting permissions
|
||||||
"${CMD_MKDIR}" -m 777 "${SYS_QPKG_DIR}"/id
|
"${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.
|
# 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'
|
$CS_DIR/bin/system-docker pull 'ghcr.io/roonlabs/roonserver:latest'
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ QPKG_NAME="RoonServer"
|
|||||||
# Name of the display application.
|
# Name of the display application.
|
||||||
QPKG_DISPLAY_NAME="Roon Server"
|
QPKG_DISPLAY_NAME="Roon Server"
|
||||||
# Version of the packaged application.
|
# Version of the packaged application.
|
||||||
QPKG_VER="2026-04-14"
|
QPKG_VER="2026-04-15"
|
||||||
# Author or maintainer of the package
|
# Author or maintainer of the package
|
||||||
QPKG_AUTHOR="Christopher Rieke"
|
QPKG_AUTHOR="Christopher Rieke"
|
||||||
# License for the packaged application
|
# 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."
|
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.
|
# 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.
|
# Init-script used to control the start and stop of the installed application.
|
||||||
QPKG_SERVICE_PROGRAM="RoonServer.sh"
|
QPKG_SERVICE_PROGRAM="RoonServer.sh"
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ QPKG_NAME="RoonServer"
|
|||||||
QPKG_ROOT=`/sbin/getcfg $QPKG_NAME Install_Path -f ${CONF}`
|
QPKG_ROOT=`/sbin/getcfg $QPKG_NAME Install_Path -f ${CONF}`
|
||||||
|
|
||||||
QCS_NAME="container-station"
|
QCS_NAME="container-station"
|
||||||
QCS_QPKG_DIR=$(/sbin/getcfg $QCS_NAME Install_Path -f $CONF)
|
QCS_QPKG_DIR=$(/sbin/getcfg $QCS_NAME Install_Path -f ${CONF})
|
||||||
DOCKER_CMD=$QCS_QPKG_DIR/bin/system-docker
|
DOCKER_CMD="${QCS_QPKG_DIR}/bin/system-docker"
|
||||||
CONTAINER_NAME=roonserver
|
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}`)
|
ROONSERVER_OPTIONS=(`/sbin/getcfg $QPKG_NAME options -f ${CONF}`)
|
||||||
ROON_CHANNEL="production"
|
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_FFMPEG_DIR="${ROON_DATAROOT}/bin"
|
||||||
ROON_LOG_FILE="${ROON_DATAROOT}/RoonOnNAS.log.txt"
|
ROON_LOG_FILE="${ROON_DATAROOT}/RoonOnNAS.log.txt"
|
||||||
|
|
||||||
|
echo $(basename "$0") >> ${ROON_LOG_FILE}
|
||||||
|
echo $@ >> ${ROON_LOG_FILE}
|
||||||
|
|
||||||
ST_COLOR="\033[38;5;34m"
|
ST_COLOR="\033[38;5;34m"
|
||||||
HL_COLOR="\033[38;5;197m"
|
HL_COLOR="\033[38;5;197m"
|
||||||
REG_COLOR="\033[0m"
|
REG_COLOR="\033[0m"
|
||||||
@@ -44,22 +47,6 @@ do
|
|||||||
declare $i=true
|
declare $i=true
|
||||||
done
|
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
|
## Log Function
|
||||||
echolog () {
|
echolog () {
|
||||||
TIMESTAMP=$(date +%d.%m.%y-%H:%M:%S)
|
TIMESTAMP=$(date +%d.%m.%y-%H:%M:%S)
|
||||||
@@ -77,8 +64,18 @@ echolog () {
|
|||||||
fi
|
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
|
## Echoing System Info
|
||||||
echolog "ROON_DATABASE_DIR" "${ROON_DATAROOT} - [`[ -d \"${ROON_DATAROOT}\" ] && echo \"available\" || echo \"not available\"`]"
|
echolog "ROON_DATABASE_DIR" "${ROON_DATAROOT} - [`[ -d \"${ROON_DATAROOT}\" ] && echo \"available\" || echo \"not available\"`]"
|
||||||
echolog "ROON_DATABASE_DIR_FS" "${ROON_DATABASE_DIR_FS}"
|
echolog "ROON_DATABASE_DIR_FS" "${ROON_DATABASE_DIR_FS}"
|
||||||
@@ -95,30 +92,42 @@ info ()
|
|||||||
echolog "Roon-Channel" "${ROON_CHANNEL}"
|
echolog "Roon-Channel" "${ROON_CHANNEL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
RoonOnNAS_folderCheck ()
|
RoonOnNAS_folderCheck () {
|
||||||
{
|
|
||||||
if [ -d "${ROONONNAS_DIR}" ]; then
|
if [ -d "${ROONONNAS_DIR}" ]; then
|
||||||
[ -d "${ROONONNAS_DIR}/RoonOnNAS" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS"
|
[ -d "${ROONONNAS_DIR}/RoonOnNAS" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS"
|
||||||
[ -d "${ROONONNAS_DIR}/RoonOnNAS/bin" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS/bin"
|
[ -d "${ROONONNAS_DIR}/RoonOnNAS/bin" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS/bin"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
start_RoonServer () {
|
getCSStatus () {
|
||||||
if [ "${ROON_DATAROOT}" != "/RoonOnNAS" ] && [ -d "${ROON_DATAROOT}" ]; then
|
echo "$(/sbin/getcfg container-station status -f /etc/qpkg_run_status)"
|
||||||
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
|
|
||||||
|
|
||||||
}
|
}
|
||||||
export_vars ()
|
|
||||||
{
|
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 ROON_DATAROOT
|
export ROON_DATAROOT
|
||||||
export QPKG_ROOT
|
export QPKG_ROOT
|
||||||
export QNAP_MODEL
|
export QNAP_MODEL
|
||||||
@@ -128,55 +137,90 @@ export_vars ()
|
|||||||
export ROON_CHANNEL
|
export ROON_CHANNEL
|
||||||
}
|
}
|
||||||
|
|
||||||
start_daemon ()
|
start_webpanel () {
|
||||||
{
|
|
||||||
[ -f ${ROON_DATAROOT}/earlyaccess.txt ] && ROON_CHANNEL="earlyaccess"
|
[ -f ${ROON_DATAROOT}/earlyaccess.txt ] && ROON_CHANNEL="earlyaccess"
|
||||||
info
|
|
||||||
#Launch the service in the background if RoonServer share exists.
|
#Launch the service in the background if RoonServer share exists.
|
||||||
ln -sfn "${QPKG_ROOT}/web" "${WEB_PATH}${WEBUI}"
|
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
|
case "$1" in
|
||||||
start)
|
start)
|
||||||
ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -d FALSE -f $CONF)
|
RS_ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -d FALSE -f $CONF)
|
||||||
RoonOnNAS_folderCheck
|
CS_ENABLED=$(/sbin/getcfg "container-station" Enable -u -d FALSE -f $CONF)
|
||||||
if [ "$ENABLED" != "TRUE" ]; then
|
|
||||||
echolog "$QPKG_NAME is disabled."
|
if [ "$RS_ENABLED" != "TRUE" ]; then
|
||||||
exit 1
|
echolog "$QPKG_NAME is disabled."
|
||||||
fi
|
exit 1
|
||||||
CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)
|
fi
|
||||||
if [ ! "$CONTAINER_ID" ]; then
|
if [ "$CS_ENABLED" != "TRUE" ]; then
|
||||||
echo "not running"
|
echolog "Container Station is disabled."
|
||||||
start_daemon
|
exit 1
|
||||||
else
|
fi
|
||||||
echolog "${QPKG_NAME} is already running (ID: $CONTAINER_ID)"
|
|
||||||
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)
|
stop)
|
||||||
CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)
|
CS_ENABLED=$(/sbin/getcfg "container-station" Enable -u -d FALSE -f $CONF)
|
||||||
if [ ! "$CONTAINER_ID" ]; then
|
|
||||||
|
# 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."
|
echolog "${QPKG_NAME} is not running."
|
||||||
else
|
else
|
||||||
|
# --> Stopping roonserver conatiner
|
||||||
echolog "Stopping RoonServer..."
|
echolog "Stopping RoonServer..."
|
||||||
compose_docker_yml_files
|
compose_docker_yml_files
|
||||||
export_vars
|
export_vars
|
||||||
${DOCKER_CMD} compose ${COMPOSE_FILES} down
|
${DOCKER_CMD} compose ${COMPOSE_FILES} down
|
||||||
if [[ $2 != "keepwebalive" ]]; then
|
[ -d "${WEB_PATH}${WEBUI}" ] && rm "${WEB_PATH}${WEBUI}"
|
||||||
rm -rf "${QPKG_ROOT}/web/tmp"/*
|
|
||||||
rm "${WEB_PATH}${WEBUI}"
|
|
||||||
fi
|
|
||||||
echolog "RoonServer has been stopped."
|
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
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
restart)
|
restart)
|
||||||
isRestart=true
|
|
||||||
$0 stop
|
$0 stop
|
||||||
$0 start
|
$0 start
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
echo "Usage: $0 {start|stop|restart}"
|
echo "Usage: $0 {start|stop|restart}"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ $ContributorsManual = array(
|
|||||||
<br><br>
|
<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>
|
<div>
|
||||||
<?php echo localize("MODAL_ABOUT_GITHUB"); ?><br>
|
<?php echo localize("MODAL_ABOUT_GITHUB"); ?><br>
|
||||||
<div style="text-align: center; font-size: 50px;">
|
<div style="text-align: center; font-size: 50px;">
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
|||||||
<p class="lead"><?php echo localize("OVERVIEW_TEXT1"); ?><br>
|
<p class="lead"><?php echo localize("OVERVIEW_TEXT1"); ?><br>
|
||||||
<?php echo localize("OVERVIEW_TEXT2"); ?></p>-->
|
<?php echo localize("OVERVIEW_TEXT2"); ?></p>-->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-8">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<span class="fa-stack fa-2x">
|
<span class="fa-stack fa-2x">
|
||||||
@@ -39,7 +39,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
|||||||
<p class="card-text">
|
<p class="card-text">
|
||||||
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_STATUS"); ?>
|
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_STATUS"); ?>
|
||||||
:</b> <?php if (strlen(isRunning()) > 1 ) {
|
:</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 {
|
} else {
|
||||||
echo '<span style="color: red;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED") . '</span>';
|
echo '<span style="color: red;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED") . '</span>';
|
||||||
} ?><br>
|
} ?><br>
|
||||||
@@ -49,7 +49,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
|||||||
:</b> <?php echo $qpkg_conf['RoonServer']['Version']; ?></span>
|
:</b> <?php echo $qpkg_conf['RoonServer']['Version']; ?></span>
|
||||||
</p>
|
</p>
|
||||||
<h5><?php echo localize("OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE"); ?></h5>
|
<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; ?>
|
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_LOCATION"); ?>: </b><?php echo $dblocation; ?>
|
||||||
</span>
|
</span>
|
||||||
<div class="progress" style="height: 20px;">
|
<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") . '.'; ?>
|
<?php echo $db_perc . '% ' . localize("OVERVIEW_ROONSERVER_PANEL_SPACE_OF") . ' ' . displayStorage($db_vol_cap) . ' ' . localize("OVERVIEW_ROONSERVER_PANEL_SPACE_USED") . '.'; ?>
|
||||||
</p>
|
</p>
|
||||||
<div class="row">
|
<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="#"
|
<a href="#"
|
||||||
class="btn btn-light btn-icon float-left"
|
class="btn btn-outline-danger"
|
||||||
|
data-bs-theme="dark"
|
||||||
data-bs-toggle="tooltip"
|
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>
|
<i class="fas fa-ambulance"></i>
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<span id="setStorage" class="col-6 getModal float-right">
|
<span id="setStorage" class="col-9 getModal ms-auto float-end">
|
||||||
<a href="#"
|
<a href="#"
|
||||||
class="btn btn-primary"
|
class="btn btn-primary"
|
||||||
|
data-bs-theme="dark"
|
||||||
data-bs-toggle="tooltip"
|
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"); ?>
|
<?php echo localize("OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION"); ?>
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
@@ -79,15 +81,14 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-4">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<span class="fa-stack fa-2x">
|
<span class="fa-stack fa-2x">
|
||||||
<i class="fa fa-circle fa-stack-2x" style="color: #222222;"></i>
|
<i class="fa fa-circle fa-stack-2x" style="color: #222222;"></i>
|
||||||
<i class="fas fa-cog fa-stack-1x" style="color: #ffffff;"></i>
|
<i class="fas fa-cog fa-stack-1x" style="color: #ffffff;"></i>
|
||||||
</span>
|
</span>
|
||||||
<h5>Settings</h5>
|
<h5><?php echo localize("OVERVIEW_OPTIONS_PANEL_TITLE"); ?></h5>
|
||||||
<div class=" d-grid gap-3 w-50">
|
|
||||||
|
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input class="form-check-input" type="checkbox" role="switch" id="smb_cifs" onchange="changeSettings(this)">
|
<input class="form-check-input" type="checkbox" role="switch" id="smb_cifs" onchange="changeSettings(this)">
|
||||||
@@ -95,7 +96,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input class="form-check-input" type="checkbox" role="switch" id="usb_audio" onchange="changeSettings(this)">
|
<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>
|
||||||
|
|
||||||
<div class="form-check form-switch">
|
<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>
|
<label class="form-check-label justify-content-start text-left" for="flexSwitchCheckChecked">HDMI audio</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
<span id="save" class="getModal">
|
||||||
<span id="saveOptions" class="getModal">
|
|
||||||
<a href="#"
|
<a href="#"
|
||||||
class="btn btn-primary float-right"
|
id="saveButton"
|
||||||
|
class="btn btn-primary float-right disabled"
|
||||||
data-bs-toggle="tooltip"
|
data-bs-toggle="tooltip"
|
||||||
onclick="saveOptions()"
|
onclick="saveOptions()"
|
||||||
title="Save Options">
|
data-bs-title="Save & Restart"
|
||||||
Save
|
data-bs-theme="dark"
|
||||||
|
><?php echo localize("OVERVIEW_OPTIONS_PANEL_SAVE_BTN"); ?>
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -127,11 +129,6 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
|||||||
echo "false";
|
echo "false";
|
||||||
} ?>;
|
} ?>;
|
||||||
|
|
||||||
// Enable Tooltips
|
|
||||||
$(function () {
|
|
||||||
document.querySelectorAll('[data-bs-toggle="tooltip"]')
|
|
||||||
});
|
|
||||||
|
|
||||||
// Action when button for Modal is clicked
|
// Action when button for Modal is clicked
|
||||||
$('.getModal').on('click', function (e) {
|
$('.getModal').on('click', function (e) {
|
||||||
|
|
||||||
@@ -149,20 +146,42 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
|||||||
$('#modal').modal('show');
|
$('#modal').modal('show');
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
function changeSettings(el) {
|
function changeSettings() {
|
||||||
// add code to guide user to press save next
|
var qpkg_options_str = "<?php echo $qpkg_conf_options ?>";
|
||||||
//console.log(el.id + ": " + el.checked);
|
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() {
|
$( document ).ready(function() {
|
||||||
var qpkg_options_str = "<?php echo $qpkg_conf_options ?>";
|
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) {
|
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
|
||||||
document.getElementById(conf_option).checked = true;
|
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 to download log files
|
||||||
function saveOptions () {
|
function saveOptions () {
|
||||||
var qnap_options = "";
|
var qnap_options = "";
|
||||||
@@ -170,6 +189,8 @@ function saveOptions () {
|
|||||||
qnap_options += document.getElementById('usb_audio').checked ? "usb_audio;" : "" ;
|
qnap_options += document.getElementById('usb_audio').checked ? "usb_audio;" : "" ;
|
||||||
qnap_options += document.getElementById('hdmi_audio').checked ? "hdmi_audio;" : "" ;
|
qnap_options += document.getElementById('hdmi_audio').checked ? "hdmi_audio;" : "" ;
|
||||||
|
|
||||||
|
$("#saveButton").addClass("disabled");
|
||||||
|
|
||||||
document.getElementById('smb_cifs').checked
|
document.getElementById('smb_cifs').checked
|
||||||
var strUrl = '<?php echo NASHOST;?>/cgi-bin/qpkg/RoonServer/ajax/ajax.php?a=setOptions&o=' + qnap_options;
|
var strUrl = '<?php echo NASHOST;?>/cgi-bin/qpkg/RoonServer/ajax/ajax.php?a=setOptions&o=' + qnap_options;
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
|||||||
imageCssClassField: 'faCssClass',
|
imageCssClassField: 'faCssClass',
|
||||||
uiLibrary: 'bootstrap5',
|
uiLibrary: 'bootstrap5',
|
||||||
cascadeSelection: false,
|
cascadeSelection: false,
|
||||||
|
cascadeCheck: false,
|
||||||
selectionType: 'single',
|
selectionType: 'single',
|
||||||
icons: {
|
icons: {
|
||||||
expand: '<i class="fas fa-angle-right" />',
|
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">
|
<div class="input-group">
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
<span class="form form-control"
|
<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>
|
readonly><?php echo localize("MODAL_SETUP_DB_LOCATION"); ?></span>
|
||||||
</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)) {
|
if (isset($dblocation)) {
|
||||||
echo $dblocation;
|
echo $dblocation;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -38,13 +38,16 @@
|
|||||||
"OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Stopped",
|
"OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Stopped",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_VERSION": "Version",
|
"OVERVIEW_ROONSERVER_PANEL_VERSION": "Version",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION": "QPKG-Version",
|
"OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION": "QPKG-Version",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_PID": "Process ID",
|
|
||||||
"OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE": "Database",
|
"OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE": "Database",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_LOCATION": "Location",
|
"OVERVIEW_ROONSERVER_PANEL_LOCATION": "Location",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "of",
|
"OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "of",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_SPACE_USED": "used",
|
"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": "Change database location",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP": "Change the location, where Roon Server stores its database.",
|
"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_HEADLINE": "Connected Audio Devices",
|
||||||
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_HEADLINE": "Multimedia Functions disabled",
|
"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.",
|
"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.",
|
||||||
|
|||||||
@@ -39,28 +39,17 @@
|
|||||||
"OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Angehalten",
|
"OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Angehalten",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_VERSION": "Version",
|
"OVERVIEW_ROONSERVER_PANEL_VERSION": "Version",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION": "QPKG-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_SUBHEAD_DATABASE": "Datenbank",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_LOCATION": "Speicherort",
|
"OVERVIEW_ROONSERVER_PANEL_LOCATION": "Speicherort",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "von",
|
"OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "von",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_SPACE_USED": "belegt",
|
"OVERVIEW_ROONSERVER_PANEL_SPACE_USED": "belegt",
|
||||||
"OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION": "Speicherort ändern",
|
"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_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP": "Speicherort ändern, an dem Roon Server seine Datenbank sichert.",
|
||||||
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_HEADLINE": "Multimediafunktionen deaktiviert",
|
"OVERVIEW_OPTIONS_PANEL_USB_AUDIO_TOOLTIP": "Zur Verwendung von lokalen Audiogeräten direkt am QNAP.",
|
||||||
"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_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_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_HEADLINE": "Log-Dateien laden",
|
||||||
"MODAL_LOGFILES_ICON_TOOLTIP": "Sämtliche Log-Dateien als .zip-Datei laden.",
|
"MODAL_LOGFILES_ICON_TOOLTIP": "Sämtliche Log-Dateien als .zip-Datei laden.",
|
||||||
"MODAL_LOGFILES_CHECK_DOWNLOAD_FOLDER": "Bitte schaue in deinen Download-Ordner.",
|
"MODAL_LOGFILES_CHECK_DOWNLOAD_FOLDER": "Bitte schaue in deinen Download-Ordner.",
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html data-bs-theme="dark">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<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>
|
|
||||||
</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">
|
<nav class="navbar navbar-expand-lg bg-body-tertiary" data-bs-theme="dark">
|
||||||
<li class="nav-item dropdown pull-right dropdown-menu-right">
|
<div class="container-fluid">
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-bs-toggle="dropdown"
|
<a class="navbar-brand" href="#">
|
||||||
aria-haspopup="true" aria-expanded="false"><?php echo localize("NAV_MENU_MORE"); ?></a>
|
<img src="img/roonIcon.svg" alt="Roon Icon" style="height: 40px;">
|
||||||
<div class="dropdown-menu pull-right" aria-labelledby="dropdown01">
|
Roon Server</a>
|
||||||
<a class="dropdown-item" href="https://roon.app/de/downloads" target="_blank">
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
<?php echo localize("NAV_MENU_DOWNLOADS"); ?></a>
|
<span class="navbar-toggler-icon"></span>
|
||||||
<a class="dropdown-item" href="https://community.roonlabs.com"
|
</button>
|
||||||
target="_blank"><?php echo localize("NAV_MENU_COMMUNITY"); ?></a>
|
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||||
<a class="dropdown-item" href="https://kb.roonlabs.com/Roon_Server_on_NAS"
|
<ul class="navbar-nav me-auto">
|
||||||
target="_blank"><?php echo localize("NAV_MENU_ROON_ON_NAS"); ?></a>
|
<li class="nav-item dropdown pull-right dropdown-menu-right">
|
||||||
<a class="dropdown-item" href="https://roon.app/de/pricing" target="_blank">
|
<a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-bs-toggle="dropdown"
|
||||||
<?php echo localize("NAV_MENU_TRY_ROON"); ?></a>
|
aria-haspopup="true" aria-expanded="false"><?php echo localize("NAV_MENU_MORE"); ?></a>
|
||||||
</div>
|
<div class="dropdown-menu pull-right" aria-labelledby="dropdown01">
|
||||||
</li>
|
<a class="dropdown-item" href="https://roon.app/de/downloads" target="_blank">
|
||||||
<li class="nav-item">
|
<?php echo localize("NAV_MENU_DOWNLOADS"); ?></a>
|
||||||
<a id="about" class="getModal nav-link float-right" href="#"><i class="fas fa-info-circle"></i> <?php echo localize('NAV_MENU_INFO'); ?></a>
|
<a class="dropdown-item" href="https://community.roonlabs.com"
|
||||||
</li>
|
target="_blank"><?php echo localize("NAV_MENU_COMMUNITY"); ?></a>
|
||||||
</ul>
|
<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>
|
||||||
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
<div id="contentblock">
|
<div id="contentblock">
|
||||||
<?php
|
<?php
|
||||||
$section = "info";
|
$section = "info";
|
||||||
|
|||||||
Reference in New Issue
Block a user