Bliss album art manager package for Synology NAS

bliss-UI

 

Bliss is a Java application written by Dan Gravell which can manage file names, tags and album art for your music collection and which can also enforce their consistency. It is designed to be left running once installed so that albums you add later will have these same policies applied to them automatically. It supports a wide range of music formats, and effortlessly deals with very large collections – apparently even ones containing quite obscure recordings. My own collection didn’t really put this to the test, since it doesn’t contain bootlegs, live sets or rarities plus I had also already obtained cover art for it (from back when CoverFlow first graced the screen of my iPhone 2G).

I could see from referrals to this blog that people were asking Dan for a Synology package which he didn’t have the time to investigate, and so I thought that it would make an interesting little project, especially since a NAS is the ideal device to run Bliss on. Although there was already a Howto post on the Synology forums, that guide only really covered getting the basic functionality of Bliss up and running – it was missing the best bits: the filesystem watching and audio fingerprinting features. These depend on natively compiled binaries, which Bliss doesn’t include for ARM or PowerPC CPUs. Getting these working provided precisely the sort of challenge I like. Not only were they difficult to compile, but getting them integrated into the various OSGi ‘bundles’ that make up Bliss was quite involved too.

Bliss uses an open source library called Chromaprint, itself part of the wider Acoustid project. The aim is to scan an audio file, to produce a fingerprint of the sound, and then to compare this against an open online database such as MusicBrainz.org to identify music regardless of compression codec used. Its author Lukáš Lalinský explains how it works.

 

Synology Package Installation

  • In Synology DSM’s Package Center, click Settings and add my package repository:
    Add Package Repository
  • The repository will push its certificate automatically to the NAS, which is used to validate package integrity. Set the Trust Level to Synology Inc. and trusted publishers:
    Trust Level
  • Since Bliss is a Java application, you will need to install one of my Java SE Embedded packages first (Java 7 or 8) if you have not already done so. Read the instructions on that page carefully too.
  • Now browse the Community section in Package Center to install Bliss:
    Community-packages
    The repository only displays packages which are compatible with your specific model of NAS. If you don’t see Bliss in the list, then either your NAS model or your DSM version are not supported at this time. DSM 5.0 is the minimum supported version for this package, though you will need DSM 6.0 or later for audio fingerprinting support.
  • When the Bliss package is running you can manage it using the icon in the main DSM application menu using the button in the top left corner:
    bliss-webui
 

Package scripts

For information, here are the package scripts so you can see what it’s going to do. You can get more information about how packages work by reading the Synology 3rd Party Developer Guide.

installer.sh

#!/bin/sh

#--------BLISS installer script
#--------package maintained at pcloadletter.co.uk


DOWNLOAD_URL="`wget -qO- http://www.blisshq.com/app/latest-linux-version`"
DOWNLOAD_FILE="`echo ${DOWNLOAD_URL} | sed -r "s%^.*/(.*)%\1%"`"
SYNO_CPU_ARCH="`uname -m`"
[ "${SYNO_CPU_ARCH}" == "x86_64" ] && [ ${SYNOPKG_DSM_VERSION_MAJOR} -ge 6 ] && SYNO_CPU_ARCH="x64"
[ "${SYNO_CPU_ARCH}" == "x86_64" ] && SYNO_CPU_ARCH="i686"
[ "${SYNOPKG_DSM_ARCH}" == "armada375" ] && SYNO_CPU_ARCH="armv7l"
[ "${SYNOPKG_DSM_ARCH}" == "armada38x" ] && SYNO_CPU_ARCH="armhfneon"
[ "${SYNOPKG_DSM_ARCH}" == "comcerto2k" ] && SYNO_CPU_ARCH="armhfneon"
[ "${SYNOPKG_DSM_ARCH}" == "alpine" ] && SYNO_CPU_ARCH="armhfneon"
[ "${SYNOPKG_DSM_ARCH}" == "alpine4k" ] && SYNO_CPU_ARCH="armhfneon"
[ "${SYNOPKG_DSM_ARCH}" == "monaco" ] && SYNO_CPU_ARCH="armhfneon"
[ ${SYNOPKG_DSM_VERSION_MAJOR} -ge 6 ] && NATIVE_BINS_URL="http://packages.pcloadletter.co.uk/downloads/bliss-native-${SYNO_CPU_ARCH}.tar.xz"
NATIVE_BINS_FILE="`echo ${NATIVE_BINS_URL} | sed -r "s%^.*/(.*)%\1%"`"
#'ua' prefix means wget user-agent will be customized
INSTALL_FILES="ua${DOWNLOAD_URL} ${NATIVE_BINS_URL}"
PID_FILE="${SYNOPKG_PKGDEST}/bliss.pid"
TEMP_FOLDER="`find / -maxdepth 2 -path '/volume?/@tmp' | head -n 1`"
APP_TEMP="${TEMP_FOLDER}/${SYNOPKG_PKGNAME}"
source /etc/profile


pre_checks ()
{
  if [ -z ${JAVA_HOME} ]; then
    echo "Java is not installed or not properly configured. JAVA_HOME is not defined. " >> $SYNOPKG_TEMP_LOGFILE
    echo "Download and install the Java Synology package from http://wp.me/pVshC-z5" >> $SYNOPKG_TEMP_LOGFILE
    exit 1
  fi

  if [ ! -f ${JAVA_HOME}/bin/java ]; then
    echo "Java is not installed or not properly configured. The Java binary could not be located. " >> $SYNOPKG_TEMP_LOGFILE
    echo "Download and install the Java Synology package from http://wp.me/pVshC-z5" >> $SYNOPKG_TEMP_LOGFILE
    exit 1
  fi

  JAVA_VER=`java -version 2>&1 | sed -r "/^.* version/!d;s/^.* version \"[0-9]\.([0-9]).*$/\1/"`
  if [ ${JAVA_VER} -lt 7 ]; then
    echo "This version of Bliss requires Java 7 or newer. Please update your Java package. " >> $SYNOPKG_TEMP_LOGFILE
    exit 1
  fi

  if [ ${SYNOPKG_DSM_VERSION_MAJOR} -lt 6 ]; then
    echo "Please note that native binary support for song identification via audio fingerprinting requires DSM 6.0" >> $SYNOPKG_TEMP_LOGFILE
  fi
}


preinst ()
{
  pre_checks
  cd ${TEMP_FOLDER}
  for WGET_URL in ${INSTALL_FILES}
  do
    WGET_FILENAME="`echo ${WGET_URL} | sed -r "s%^.*/(.*)%\1%"`"
    [ -f ${TEMP_FOLDER}/${WGET_FILENAME} ] && rm ${TEMP_FOLDER}/${WGET_FILENAME}
    #this will allow blisshq.com to track the number of downloads from Synology users
    WGET_URL=`echo ${WGET_URL} | sed -e "s/^ua/--user-agent=Synology --referer=http:\/\/pcloadletter.co.uk\/2012\/09\/17\/bliss-package-for-synology /"`
    wget ${WGET_URL}
    if [[ $? != 0 ]]; then
      if [ -d ${PUBLIC_FOLDER} ] && [ -f ${PUBLIC_FOLDER}/${WGET_FILENAME} ]; then
        cp ${PUBLIC_FOLDER}/${WGET_FILENAME} ${TEMP_FOLDER}
      else     
        echo "There was a problem downloading ${WGET_FILENAME} from the official download link, " >> $SYNOPKG_TEMP_LOGFILE
        echo "which was \"${WGET_URL}\" " >> $SYNOPKG_TEMP_LOGFILE
        echo "Alternatively, you may download this file manually and place it in the 'public' shared folder. " >> $SYNOPKG_TEMP_LOGFILE
        exit 1
      fi
    fi
  done
 
  exit 0
}


postinst ()
{
  #run the installer
  cd ${TEMP_FOLDER}
  echo "INSTALL_PATH=${SYNOPKG_PKGDEST}" > ${TEMP_FOLDER}/bliss-synology.properties
  java -jar ${TEMP_FOLDER}/${DOWNLOAD_FILE} -options ${TEMP_FOLDER}/bliss-synology.properties > /dev/null && rm ${TEMP_FOLDER}/${DOWNLOAD_FILE}
  rm ${TEMP_FOLDER}/bliss-synology.properties
  sed -i "s%^#!/bin/bash%#!/bin/sh%" ${SYNOPKG_PKGDEST}/bin/bliss.sh
  
  #stow jar files containing Synology versions of native code
  if [ -f ${TEMP_FOLDER}/${NATIVE_BINS_FILE} ]; then
    mkdir ${SYNOPKG_PKGDEST}/syno-native
    cd ${SYNOPKG_PKGDEST}/syno-native
    tar xJf ${TEMP_FOLDER}/${NATIVE_BINS_FILE}
  fi
  #record the CPU architecture
  echo "${SYNO_CPU_ARCH}" > syno_cpu_arch.txt

  #make changes to Bliss launcher script so that pid file is created for Java process
  sed -r -i "s%^(exec .*)$%\1 > ${SYNOPKG_PKGDEST}/bliss.out 2>\&1 \&%" ${SYNOPKG_PKGDEST}/bin/bliss.sh
  echo "echo \$! > ${PID_FILE}" >> ${SYNOPKG_PKGDEST}/bin/bliss.sh

  #set some additional system properties (temp folder, prefs sync interval)
  EXTRA_OPTS="-Djava.io.tmpdir=${TEMP_FOLDER} -Djava.util.prefs.syncInterval=86400 -Djava.net.preferIPv4Stack=true"
  sed -r -i "s%-splash:bliss-splash.png%${EXTRA_OPTS}%" ${SYNOPKG_PKGDEST}/bin/bliss.sh
  sed -r -i "s%-XX:HeapDumpPath=/tmp%-XX:HeapDumpPath=${TEMP_FOLDER}%" ${SYNOPKG_PKGDEST}/bin/bliss.sh

  #create log file to allow package start errors to be captured
  [ -e ${SYNOPKG_PKGDEST}/bliss.out ] || touch ${SYNOPKG_PKGDEST}/bliss.out

  #add firewall config
  /usr/syno/bin/servicetool --install-configure-file --package /var/packages/${SYNOPKG_PKGNAME}/scripts/${SYNOPKG_PKGNAME}.sc > /dev/null

  exit 0
}


preuninst ()
{
  `dirname $0`/stop-start-status stop

  exit 0
}


postuninst ()
{
  #clean up temp
  [ -d ${TEMP_FOLDER}/Bliss ] && rm -rf ${TEMP_FOLDER}/Bliss

  #remove firewall config
  if [ "${SYNOPKG_PKG_STATUS}" == "UNINSTALL" ]; then
    /usr/syno/bin/servicetool --remove-configure-file --package ${SYNOPKG_PKGNAME}.sc > /dev/null
  fi

  exit 0
}


preupgrade ()
{
  `dirname $0`/stop-start-status stop
  pre_checks
  
  exit 0
}


postupgrade ()
{
  exit 0
}
 

start-stop-status.sh

#!/bin/sh

#--------BLISS start-stop-status script
#--------package maintained at pcloadletter.co.uk


PKG_FOLDER="`dirname $0 | cut -f1-4 -d'/'`"
ENGINE_SCRIPT="${PKG_FOLDER}/target/bin/bliss.sh"
DNAME="`dirname $0 | cut -f4 -d'/'`"
PID_FILE="${PKG_FOLDER}/target/bliss.pid"
DLOG="${PKG_FOLDER}/target/bliss.out"
SYNO_CPU_ARCH="`cat ${PKG_FOLDER}/target/syno-native/syno_cpu_arch.txt`"
source /etc/profile
source /root/.profile


start_daemon ()
{
  #update the package version number in case of an in-app update
  BLISS_BUNDLE_DIR="`grep -r --include='*.info' com.elsten.bliss.bundle ${PKG_FOLDER}/target/felix-cache/ | cut -f1 -d':'`"
  BLISS_BUNDLE_DIR="`dirname ${BLISS_BUNDLE_DIR}`"
  BLISS_VERSION=`grep "version" ${PKG_FOLDER}/INFO | sed -r "s/^.*([0-9]{8}).*$/\1/"`
  if [ -d ${BLISS_BUNDLE_DIR} ]; then
    find ${BLISS_BUNDLE_DIR} -name *.jar > /tmp/bliss-v-check.txt
    while IFS="" read -r FILE_TO_PARSE; do
      if [ -e ${FILE_TO_PARSE} ]; then
        #no unzip command in DSM 6.0
        if [ -e /usr/bin/7z ]; then
          DETECTED_VERSION=`7z e -so ${FILE_TO_PARSE} META-INF/MANIFEST.MF 2> /dev/null | grep Bundle-Version | cut -f4 -d'.' |  cut -c1-8`
        else
          DETECTED_VERSION=`unzip -p ${FILE_TO_PARSE} META-INF/MANIFEST.MF | grep Bundle-Version | cut -f4 -d'.' |  cut -c1-8`
        fi
      fi
      if [ ${DETECTED_VERSION} -gt ${BLISS_VERSION} ]; then
        BLISS_VERSION=${DETECTED_VERSION}
      fi
    done < /tmp/bliss-v-check.txt
  fi
  rm /tmp/bliss-v-check.txt
  sed -r -i "s/^version=\"[0-9]{8}/version=\"${BLISS_VERSION}/" /var/packages/Bliss/INFO
  
  #update the CPU-specific repository customizations (in case of an in-app update)
  #catch both armv5te and armv7l
  if [ "${SYNO_CPU_ARCH}" != "${SYNO_CPU_ARCH/arm/}" ]; then
    sed -i "s/policy\.tag\.auto\.linux\.x86/policy\.tag\.auto\.linux\.ARM_le/g" ${PKG_FOLDER}/target/bliss-bundle/repository.xml
  fi
  if [ "${SYNO_CPU_ARCH}" == "ppc" ]; then
    sed -i "s/policy\.tag\.auto\.linux\.x86/policy\.tag\.auto\.linux\.PowerPC/g" ${PKG_FOLDER}/target/bliss-bundle/repository.xml
  fi
 
  #overwrite native lib bundles with syno versions (in case of an in-app update)
  if [ -e ${PKG_FOLDER}/target/syno-native/ ]; then
    cp ${PKG_FOLDER}/target/syno-native/* ${PKG_FOLDER}/target/bliss-bundle
  fi

  cd ${PKG_FOLDER}
  ${ENGINE_SCRIPT} > /dev/null 2>> ${DLOG}
  if [ -z ${SYNOPKG_PKGDEST} ]; then
    #script was manually invoked, need this to show status change in Package Center
    [ -e ${PKG_FOLDER}/enabled ] || touch ${PKG_FOLDER}/enabled
  fi
}

    
stop_daemon ()
{
  echo "Stopping ${DNAME}" >> ${DLOG}
  kill `cat ${PID_FILE}`
  wait_for_status 1 20 || kill -9 `cat ${PID_FILE}`
  rm -f ${PID_FILE}
  if [ -z ${SYNOPKG_PKGDEST} ]; then
    #script was manually invoked, need this to show status change in Package Center
    [ -e ${PKG_FOLDER}/enabled ] && rm ${PKG_FOLDER}/enabled
  fi
}


daemon_status ()
{
  if [ -f ${PID_FILE} ] && kill -0 `cat ${PID_FILE}` > /dev/null 2>&1; then
    return
  fi
  rm -f ${PID_FILE}
  return 1
}


wait_for_status ()
{
  counter=$2
  while [ ${counter} -gt 0 ]; do
    daemon_status
    [ $? -eq $1 ] && return
    let counter=counter-1
    sleep 1
  done
  return 1
}


case $1 in
  start)
    if daemon_status; then
      echo ${DNAME} is already running with PID `cat ${PID_FILE}`
      exit 0
    else
      echo Starting ${DNAME} ...
      start_daemon
      exit $?
    fi
  ;;

  stop)
    if daemon_status; then
      echo Stopping ${DNAME} ...
      stop_daemon
      exit $?
    else
      echo ${DNAME} is not running
      exit 0
    fi
  ;;

  restart)
    stop_daemon
    start_daemon
    exit $?
  ;;

  status)
    if daemon_status; then
      echo ${DNAME} is running with PID `cat ${PID_FILE}`
      exit 0
    else
      echo ${DNAME} is not running
      exit 1
    fi
  ;;

  log)
    echo "${DLOG}"
    exit 0
  ;;

  *)
    echo "Usage: $0 {start|stop|status|restart}" >&2
    exit 1
  ;;

esac
 

Changelog:

  • 20160606-0011 Substantial overhaul for DSM 6.0, incorporating many enhancements developed for other packages, updated to Bliss version 20160606, DSM 6.0 newer is now required for audio track fingerprinting (fpcalc is compiled to depend on ffmpeg 2.7.1), added support for several newer Synology products, improved accuracy of temp folder detection, in-app updating should also be fixed
  • 20150522-0010 Substantial re-write (hence the long delay):
    Updated to Bliss version 20150522
    DSM 5.0 newer is now required (fpcalc is compiled to depend on FFmpeg 2.0.2)
    Now that Intel systems running DSM 5.0+ use a newer glibc, replacement Intel binaries are no longer needed
    Added support for Mindspeed Comcerto 2000 CPU in DS414j
    Added support for Intel Atom C2538 (avoton) CPU in various models
    Added support for ppc853x CPU in older PowerPC models
    Added support for Marvell Armada 375 CPU in DS215j
    Added support for Intel Evansport CPU in DS214Play and DS415Play
    Switched to using root account – no more adding account permissions, package upgrades will no longer break this
    DSM Firewall application definition added
    Tested with DSM Task Scheduler to allow package to start/stop at certain times of day, saving RAM when not needed
    Daemon init script now uses a proper PID file instead of the unreliable method of using grep on the output of ps
    Daemon init script can be run from the command line
    Switched to .tar.xz compression for native binaries to reduce web hosting storage footprint
    Improved accuracy of temp folder detection
    Package is now signed with repository private key
    User Agent customization while downloading Bliss package from blisshq.com to allow download stats gathering
  • 20130213-0009 Updated to Bliss 20130213, and will correctly report version in Package Center after an in-app update
  • 20130131-0008 Updated to Bliss 20130131
  • 20121112-0007 Fixes for DSM 4.2
  • 20121112-006 Updated to Bliss 20121112
  • 20121019-005 Updated to Bliss 20121019
  • 20121002-004 Updated to Bliss 20121002
  • 20120830-003 Added support for Freescale QorIQ PowerPC CPUs used in some Synology x13 series products, PowerPC processors in previous Synology generations with older glibc versions are not supported
  • 20120830-002 Hopefully fixed Java prefs polling issue that prevented NAS hibernation
  • 20120830-001 initial public release

 

Build Notes

Chromaprint uses some complex maths functions that FFmpeg can provide (specifically Fourier Transform), and FFmpeg’s shared libraries are already included with Synology DSM. Building Chromaprint linked to those existing libraries results in a minuscule 78KB build of fpcalc, rather than the statically compiled ones for various OS and CPU architectures included with Bliss, which weigh in at several megabytes each. I think I’m finally ‘getting’ what open source is all about, which is nice since that was my objective in experimenting with my NAS. To prevent fpcalc building and linking to its dynamic library libchromaprint.so and to get it to detect FFmpeg properly I had to carefully inspect the Makefiles to find the correct build syntax:
FFMPEG_DIR=${TOOLCHAIN} cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=ON -DBUILD_SHARED_LIBS=NO .
FFMPEG_DIR is the base folder from which CMake will look for lib/libavcodec.so and include/libavcodec/avfft.h.

For watching the filesystem Bliss uses JNotify to hook into the Linux kernel’s inotify subsystem. Getting this compiled was tricky. It seems no one has reported successfully compiling it for an ARM CPU, and JNotify’s author Omry Yadan wasn’t aware of anyone doing this either. The problem is that compilation halts with these errors:

In file included from ../net_contentobjects_jnotify_linux_JNotify_linux.c:43:
../inotify-syscalls.h:35:1: error: "__NR_inotify_init" redefined
In file included from /opt/include/sys/syscall.h:25,
                 from ../inotify-syscalls.h:4,
                 from ../net_contentobjects_jnotify_linux_JNotify_linux.c:43:
/opt/include/asm/unistd.h:344:1: error: this is the location of the previous definition
In file included from ../net_contentobjects_jnotify_linux_JNotify_linux.c:43:
../inotify-syscalls.h:36:1: error: "__NR_inotify_add_watch" redefined
In file included from /opt/include/sys/syscall.h:25,
                 from ../inotify-syscalls.h:4,
                 from ../net_contentobjects_jnotify_linux_JNotify_linux.c:43:
/opt/include/asm/unistd.h:345:1: error: this is the location of the previous definition
In file included from ../net_contentobjects_jnotify_linux_JNotify_linux.c:43:
../inotify-syscalls.h:37:1: error: "__NR_inotify_rm_watch" redefined
In file included from /opt/include/sys/syscall.h:25,
                 from ../inotify-syscalls.h:4,
                 from ../net_contentobjects_jnotify_linux_JNotify_linux.c:43:
/opt/include/asm/unistd.h:346:1: error: this is the location of the previous definition

By searching in a very generic way for a solution I found this post on stackoverflow.com which helped me to patch the header inotify-syscalls.h to get around the problem. Since there was no JDK for ARM embedded systems at build time I included the headers from OpenJDK6 which I took from a Ubuntu VM.

Compiling for Intel also required a fix. I was getting the same error as featured in this post on the JNotify user forum on SourceForge.net:
expected specifier-qualifier-list before ‘pid_t’

Despite some people’s apparent success simply rearranging the order of the includes in net_contentobjects_jnotify_linux_JNotify_linux.c this didn’t help me. I’m not sure quite how I stumbled upon it, but I found the solution staring at me on this page:
The size_t, ssize_t, uid_t, gid_t, off_t and pid_t types are defined as described in sys/types.h

I inserted an additional include in for sys/types.h and it compiled ok. It’s worth pointing out that, although all Intel Synology units are x86-64 architecture, the Oracle JRE for Embedded is x86 (32 bit), so I used the i686 toolchain. Synology DSM’s FFmpeg shared libraries are also 32 bit so my build of fpcalc needed to comply with this. Bliss nonetheless expects the binary to be called fpcalc_linux64 since Bliss is detecting the underlying Linux CPU architecture.

Once I had got past the obstacle of compiling the native code, I needed to liaise back and forth with Dan to understand how Bliss was dealing with its libraries and how I could replace the built-in versions. Originally this was quite a kludge but Dan has since abstracted out the native binaries into their own OSGI bundle fragments which makes things a lot easier, and allows Bliss to survive in-app updates until those native components are superseded. The Synology package provides the following architecture-specific jar files (with corresponding edits to their manifest) which contain the fpcalc binary from Chromaprint. Thank you to Dan for all the quick answers!

  • net.contentobjects.jnotify.linux.ARM_le-0.94.0.jar
  • net.contentobjects.jnotify.linux.PowerPC-0.94.0.jar
  • com.elsten.bliss.policy.tag.auto.linux.x86-1.0.1.jar
  • com.elsten.bliss.policy.tag.auto.linux.amd64-1.0.1.jar
  • com.elsten.bliss.policy.tag.auto.linux.ARM_le-1.0.1.jar (various versions)
  • com.elsten.bliss.policy.tag.auto.linux.PowerPC-1.0.1.jar
Here are my fixes to JNotify to get the native library part compiled, since they may help someone else:

 

Patch for native compile of JNotify 0.94 on ARM Synology

diff -crB jnotify-vanilla/inotify-syscalls.h jnotify-arm/inotify-syscalls.h
*** jnotify-vanilla/inotify-syscalls.h	2005-11-30 15:07:56.000000000 +0000
--- jnotify-arm/inotify-syscalls.h	2012-09-14 02:43:44.032130098 +0100
***************
*** 32,40 ****
  # define __NR_inotify_add_watch	152
  # define __NR_inotify_rm_watch	156
  #elif defined (__arm__)
! # define __NR_inotify_init	316
! # define __NR_inotify_add_watch	317
! # define __NR_inotify_rm_watch	318
  #elif defined (__SH4__)
  # define __NR_inotify_init	290
  # define __NR_inotify_add_watch	291
--- 32,46 ----
  # define __NR_inotify_add_watch	152
  # define __NR_inotify_rm_watch	156
  #elif defined (__arm__)
! # ifndef __NR_inotify_init
! #  define __NR_inotify_init     316
! # endif
! # ifndef __NR_inotify_add_watch
! #  define __NR_inotify_add_watch 317
! # endif
! # ifndef __NR_inotify_rm_watch
! #  define __NR_inotify_rm_watch 318
! # endif
  #elif defined (__SH4__)
  # define __NR_inotify_init	290
  # define __NR_inotify_add_watch	291
diff -crB jnotify-vanilla/Release/subdir.mk jnotify-arm/Release/subdir.mk
*** jnotify-vanilla/Release/subdir.mk	2011-02-28 18:07:20.000000000 +0000
--- jnotify-arm/Release/subdir.mk	2012-09-14 02:29:00.000000000 +0100
***************
*** 17,23 ****
  %.o: ../%.c
  	@echo 'Building file: $<'
  	@echo 'Invoking: GCC C Compiler'
! 	gcc -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -O3 -Wall -Werror -c -fmessage-length=0 -fPIC -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
  	@echo 'Finished building: $<'
  	@echo ' '
  
--- 17,23 ----
  %.o: ../%.c
  	@echo 'Building file: $<'
  	@echo 'Invoking: GCC C Compiler'
! 	gcc -I/volume1/public/temp/jdk_include/ -I/volume1/public/temp/jdk_include/linux -O3 -Wall -Werror -c -fmessage-length=0 -fPIC -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
  	@echo 'Finished building: $<'
  	@echo ' '
 

Patch for cross compile of JNotify 0.94 for other Synology CPU architectures, using Ubuntu Desktop 12

diff -crB jnotify-vanilla/net_contentobjects_jnotify_linux_JNotify_linux.c jnotify-i686/net_contentobjects_jnotify_linux_JNotify_linux.c
*** jnotify-vanilla/net_contentobjects_jnotify_linux_JNotify_linux.c	2011-02-28 18:07:20.000000000 +0000
--- jnotify-xcomp/net_contentobjects_jnotify_linux_JNotify_linux.c	2012-09-14 00:41:53.455010206 +0100
***************
*** 36,41 ****
--- 36,42 ----
  #include <sys/time.h>
  #include <sys/select.h>
  #include <sys/ioctl.h>
+ #include <sys/types.h>
  #include <errno.h>
  #include <stdio.h>
  #include <unistd.h>
diff -crB jnotify-vanilla/Release/makefile jnotify-i686/Release/makefile
*** jnotify-vanilla/Release/makefile	2011-02-28 18:07:20.000000000 +0000
--- jnotify-xcomp/Release/makefile	2012-09-14 00:37:56.475007855 +0100
***************
*** 28,34 ****
  libjnotify.so: $(OBJS) $(USER_OBJS)
  	@echo 'Building target: $@'
  	@echo 'Invoking: GCC C Linker'
! 	gcc -shared -o"libjnotify.so" $(OBJS) $(USER_OBJS) $(LIBS)
  	@echo 'Finished building target: $@'
  	@echo ' '
  
--- 28,34 ----
  libjnotify.so: $(OBJS) $(USER_OBJS)
  	@echo 'Building target: $@'
  	@echo 'Invoking: GCC C Linker'
! 	$(CC) -shared -o"libjnotify.so" $(OBJS) $(USER_OBJS) $(LIBS)
  	@echo 'Finished building target: $@'
  	@echo ' '
  
diff -crB jnotify-vanilla/Release/subdir.mk jnotify-i686/Release/subdir.mk
*** jnotify-vanilla/Release/subdir.mk	2011-02-28 18:07:20.000000000 +0000
--- jnotify-xcomp/Release/subdir.mk	2012-09-14 00:37:33.835007731 +0100
***************
*** 17,23 ****
  %.o: ../%.c
  	@echo 'Building file: $<'
  	@echo 'Invoking: GCC C Compiler'
! 	gcc -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -O3 -Wall -Werror -c -fmessage-length=0 -fPIC -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
  	@echo 'Finished building: $<'
  	@echo ' '
  
--- 17,23 ----
  %.o: ../%.c
  	@echo 'Building file: $<'
  	@echo 'Invoking: GCC C Compiler'
! 	$(CC) -I$(TOOLCHAIN)/include -O3 -Wall -Werror -c -fmessage-length=0 -fPIC -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
  	@echo 'Finished building: $<'
  	@echo ' '
 
 

433 thoughts on “Bliss album art manager package for Synology NAS

  1. Harald

    Hi patters can u give me a hint with that bliss package on synology, since it runs as root
    i have the problem with the automatic renaming after that all files changed to owner root and the audio station package can no longer find the files :( when i change the owner manuallly with ssh it works again, may u have a solution for that ?? thanks ia. Harald

    Reply
    1. chuckstar

      hi. all instructions followed and seemingly running but when i open the bliss url i just get a failed to connect page. any thoughts pls?

      Reply
  2. ziemowit

    Files that get moved through Bliss will not be detected by Sinology’s media indexing service. Is there a way to fix this, e.g. run /usr/syno/bin/synoindex -a /volume1/music/artist/album/filename.avi after bliss fixes a file path?

    Reply
    1. gravelld

      There’s no way of doing this in bliss unfortunately. Best I can suggest right now is hooking into inotify yourself but this can be difficult – there will be a lot of file changes!

      Reply
    2. Thesalan

      You can have instant indexation for changes from third apps with inotify and media-indexer. I use this hook since a while and it works great!

      Source (in french!) : http://blogmotion.fr/systeme/indexer-media-11535

      Quick translation :
      – Add new custom repository : http://synology.francis-besset.com
      – Install in order : inotify-tools and Media Indexer
      – Media Indexer ask which folders you want to watch : set your media directories (ex: /volume1/music/) separated by a colon (:)
      – It’s done!

      Reply
  3. Harald

    same problem here i think its because bliss is running as root, when i change ownership of the files to a user its indexed from syno again. Anyone knows a solution?

    Reply
  4. SW

    I tried a while ago to get this working on my 213j and failed… Looking through the comments I’m not even sure if anyone has managed to get it going.
    Any chance of a complete idiot’s step-by-step guide for getting it going on a 213j, including exactly which Java version, etc?
    (I’ve just updated to DSM 5.2-5644 Update 3)

    Reply
    1. João Galante

      I’m in the same boat as you. DSM6 and java 7 running. I even manage to install Bliss, but cannot access it by the user interface: xxx.xxx.xxx.xxx:3220. Even inside my network i get a connection refused error.

      Reply
      1. patters Post author

        Quite a number of these comments pre-date the recent package update so the issues described will be fixed in the current release version 0011. The comments had been in the blog moderation queue which had got backlogged. I had prioritised working on the packages, hence the delay.

  5. ziemowit

    Has anyone figured out how to remove the leftover empty folders? Usually it doesn’t bother me much as I access the music through DS Audio, but when I want to copy something to an external drive it annoys me

    Reply
    1. gravelld

      Do you mean after renaming music files/folders? I have seen this with Synology because of extra hidden files the Synology sometimes places in the folders. Can you send a debug archive to see if there are more we need to cover? “Help” then “Download debug archive”.

      For now, you can normally use a third party empty folder remover from your desktop/laptop. Which OS are you on?

      Also please vote for http://ideas.blisshq.com/forums/21939-bliss/suggestions/3821233-removing-folders-after-files-move

      Reply
      1. ziemowit

        That’s what I mean. I am on OSX mainly, any recommendation which software to use?

        Will send debug archive later.

  6. Paul

    Hi patters. Dan asked me to post this error I’m experiencing.

    Its related to a previous post (https://pcloadletter.co.uk/2012/09/17/bliss-package-for-synology/comment-page-2/#comment-130038)

    The problem I’m facing is BLISS installs to the root partition which, over time, uses all the space and causes my NAS volumes to crash.

    Based on the comments in #130038, I have done the following;

    – Uninstalled Bliss & Java via DSM Package centre
    – Deleted all remaining Bliss files & folders using WinSCP and Putty
    – Installed Java Manager via DSM Package centre and updated to Java version 7
    – Reinstalled Bliss (via DSM Package centre – version 20150522-0010), but it still goes to my root partition.

    Here are the details for my Synology setup;
    – Java Manager insists on installing version jdk-7u51-linuz-i586 – it does not accept any other version, even the latest version 8.
    – DSM 5.2-5644 (Update5)
    – Synology Model – 1812+

    Hope you can advise

    Reply
  7. Rick

    Is there anything being done to fix auto-updates?
    I’ve tried synocommunity Java (7 and 8) and the synology package, all run Bliss fine but update never works, no error message – the page says it’s successful.
    The newly downloaded bliss update always goes in root (“/”), as do a number of other bliss files. Surely it’s not just two of us with this issue?

    Reply
    1. Dan Gravell

      I don’t think it is just the two of you, no… I’ve had a good few reports of this.

      The solutions suggested above where to use the Java 7 available under Synology Java Manager, then re-install bliss. Is that what you tried?

      Reply
  8. Rick

    Yes, but the update still doesn’t work (and bliss files are still put into “/”).
    I upgraded to DSM 6.0 today and it completely killed by bliss config. When bliss starts up now it back to unregistered and all my settings are lost. I tried updating again in hopes this new “config” would allow an update but it still doesn’t work.

    Reply
      1. gravelld

        Laurie, are you saying it works under Docker on DSM 5? Would be good if that were the case. How’s the resource usage?

      2. Laurie

        Hi Dan,

        Got your message after I started upgrading to DSM 6. I nuked everything and I have just begun again. Before I nuked it, it appeared to be working OK but I now can’t give you the resources it was using as I did not take any notice. I am in the process of copying all the music back to my NAS. With DSM 6 there are a few more options for the Container which were missing from the previous version but were shown on the QNAP install. Memory allocation being the main one.

        A quick play has it starting OK on DSM 6, but I will not get a real good look at it until I have finished copying all my files over and the system settles down. It did appear to solve my issue of the root directory becoming full, when using platters package. I can set where the files are written to using Docker. Not that I am for one second saying there are issues with this package (platters). The size of my music collection is the issue. A smaller collection will work 100% with this package and may well be far more efficient and easier to install run etc.

        The image created on my Synology NAS using the QNAP tutorial is 407MB. Bigger than the one I created using Alpine Linux but mine had problems that I could see and not resolve. I can not see the problems that I saw using this one. Sure a smaller distro would be good but the main thing is that it works properly.

        Will report back again when all my data is back in place. A few days away I think.

      3. Rick

        I was debating trying it. I also noticed two other docker builds in the repo. May give one of these a try.

      4. Laurie

        Hi Rick,

        Try the one on the QNAP site. The one based on Alpine linux by Strop was my attempt and it has some issues.

      5. gravelld

        Laurie – while smaller install size is a good thing, I’m less concerned with that and more concerned with the runtime performance.

        If you are having trouble with the size of the collection that’s a problem with bliss, not the add-in that patters has made.

        Or should I be more concerned with the install size? Is the size allocated for Docker containers restricted?

      6. Laurie

        Dan,

        The issue with the package is that it is writing files to the /root/.bliss directory that it creates rather than to the /volume1/@appstore/bliss directory (memory of correct path might be bad here). The larger your music collection the more space it takes up. As this part of the partition is very small, as you know, it fills up. The disk station then stops working until the files are deleted. That path variable needs to be fixed somehow.

        Runtime performance, if you give me some parameters, I will try and do some experimenting for you. On DSM 6 you can set processor priority to Low/Medium/High as well as set memory usage. Size concerns for me are mainly on memory usage though I have the ability to expand my onboard memory whilst other models will not. My concerns about a larger container meaning more memory usage is a misunderstanding of how docker works – I think.

        I would not worry about install sizes at this time. I have to be honest my biggest problem at the moment appears to be permissions and coming to grips with that. I am playing with a number of docker images tonight trying to come to grips with it. The Bliss image I generated from the QNAP instructions is not the biggest – by a long way.

        All the best

  9. Rick

    I switched over to the “QNAP” docker (Synology DSM 6.0), I couldn’t take the package from here eating my root directory anymore (and the fact it needed root to begin with).

    Running a little fat – 2GB RAM. I didn’t set limits on my container resources, I’m guessing it taps out at 2GB due to 32-bit Java? I don’t really care since I have plenty to spare.

    Reply
    1. Laurie

      Dan,

      Sorry for the delay in getting back on this. It seems to be working fine on DSM6 as Rick has stated. Not too memory hungry either I thought. Through circumstances I have had to go back to DSM5.2 and still running it in Docker. Showing only using 220MB of memory and about 1-5% CPU usage. On the data side I have not got all my music back up there yet but it is running about 1GB on disk – this would never fit on the Synology previously, so the first time that I have been confident that I can do my whole collection with Bliss.

      Reply
    2. gravelld

      Interesting, I’m not sure why it would be using 2GB. bliss is configured to only use 128MB of internal application memory (total memory use probably more like 180MB once you add Java overhead). Are you definitely looking at what is being used, or what Docker has allocated as headroom (I don’t know enough about Docker yet to even say if that is possible).

      Reply
  10. Rick

    After the initial scan my docker container is down to 430MB RAM. I’ll be keeping it running this way, seems cleaner than the syn package.

    Reply
  11. stefwilliams

    Hi,
    I just installed the package on my DS213j using Java SE 8 and all seemed well at first – I had the paths all showing as Bliss said they should in the logs…
    I can’t start Bliss though. When I try to run it in the package manager, it seems to start and then say it’s failed… The log now says:

    /var/packages/Bliss/scripts/start-stop-status.sh: line 64: /var/packages/Bliss/target/bin/bliss.sh: Permission denied

    How do I go about giving permission (and who to)?

    Sorry I don’t Linux very good :)

    Reply
  12. Rick

    An update…
    The docker version has been working great for the last week. Today it updated to the latest bliss release without any problems.

    Reply
      1. Rick

        Just bliss from within the docker, the bliss files are saved outside the container on a NAS share.

  13. SW

    I’ve been trying to get this running on my 213j (DSM 6.0-7321 update 3) for a while and was stumped at first by permissions…
    After poking around the web trying to get some other packages running with DSM 6 and following the troubleshooting steps for them, I created a Bliss user BEFORE installing Bliss. After this, I was still getting permissions errors which were fixed by chowning /vars/packages/Bliss to Bliss owner

    Then I didn’t get any log errors but just ‘Package failed to start’ …
    This was fixed by chowning /volume1/@appstore/Bliss to the Bliss user and group. (I initially tried giving it 777 rights but that failed).
    I then rejoiced when Bliss said it had started!

    Go to my_url:3220 and I’m told it refuses to answer….
    Silly me, open up firewall, and…. Boooo! Still no joy…
    I’ve tried testing it with Java SE Embedded 7 instead of 8 but still nothing.

    After trying uninstalling Bliss and reinstalling with different Java versions, the ‘Bliss’ user was deleted, and although I didn’t recreate it, Bliss still runs (but still doesn’t open on port 3220)

    Can you suggest anything else I could try now?

    Reply
    1. SW

      update to the above, when I run it over my local network, it still doesn’t start, but rather than refused connection, I get:

      Something unexpected happened while serving the page at /

      Does that give some clues?

      Reply
      1. gravelld

        It’s a little hard to say without further debugging and logs – are there any more logs in DSM?

        bliss does also keep some “working” files – these will be stored in a temporary folder somewhere. These probably also need the permissions set on them…

        Might you have been affected by the bug that means the working files are stored in the root folder – “.bliss”?

      2. SW

        I have tried with both SE Embedded 7 and 8 and I get no reply on port 3220 with either, although I haven’t tried them both on the local network (which at least gives me an error of sorts). Can try that later.

        Are there any other SE versions I can try? Those are the only two that are listed via the pcloadletter package archive…

        @tmp is already 777, so may try setting up the Bliss user again and reinstalling everything and chowning to Bliss (as that did inexplicably fix a few things last time)

      3. gravelld

        Maybe there are different errors for the different Java versions… try with the other one, and send me a new debug archive.

      4. SW

        ok, started again from scratch. I had JSE7 installed when I sent that last log.

        This time, uninstalled Bliss, uninstalled Java.
        Add user Bliss to group sc-media.

        Reinstalled Java 8, using ejdk-8u91-linux-arm-sflt.tar.gz as suggested by the installer.
        Reinstall Bliss.
        Start = Fail.
        Log says:
        /var/packages/Bliss/scripts/start-stop-status.sh: line 64: /var/packages/Bliss/target/bin/bliss.sh: Permission denied

        do
        chown -R Bliss:sc-media
        on
        /var/packages/Bliss
        /volume1/@appstore/Bliss

        up until this point, I stil get the error above in the logs.

        Then chown
        /usr/syno/etc/packages/Bliss

        and I get ‘Failed to run the package service’.

        Figure I’ll chown ALL the things:

        > find . -iname ‘bliss’ -type d
        gives me 12 directories dotted about the place.
        I chown them all, and it still fails to start the package service.

        Figure I’ll try JSE7 again now that I’ve chowned everything there is to chown.
        Uninstall 8, reinstall 7. (without reinstalling Bliss) but still no go…

        So now I don’t even have any error logs to show, and I’m properly stumped as to what to try next, unless I do need to reinstall Bliss after a reinstall of JSE?

        Unlike the last time, when the package was failing to start, I’m still getting the log error above when it fails:
        /var/packages/Bliss/scripts/start-stop-status.sh: line 64: /var/packages/Bliss/target/bin/bliss.sh: Permission denied

        but I don’t know what else I can give permissions to!

        Looking through bliss.sh there’s just a reference to ${INSTALL_HOME}/felix-cache
        but I can’t find that anywhere – could that be the problem?

        Anyway, pardon the length of this post – it’s also for my reference should I ever get this working :)

      5. gravelld

        felix-cache is a cache of the code used to run bliss. It is created when bliss is first started, so if bliss isn’t starting, it won’t be created. But obviously the correct permissions are required on the ${INSTALL_HOME} directory.

        What I’m not sure about is your method of creating a bliss user before the install is causing problems. Do you know if another bliss user is added anyway? I think this is possible – it’s the uid which has to be unique. If you have changed all the permissions for another bliss user then that might break things. Also, normally it’s “bliss”, not “Bliss”… but maybe the add-in also has a capitalised user name.

      6. SW

        The reason I created Bliss instead of bliss is
        a) that worked, to a degree, last time and
        b) the pages that have hinted that this process might make a difference (mostly looking at getting the headphones app working) all have the app name as the user name, and the Bliss app is capitalized.

        There is no other bliss user created (at least there isn’t one around now) but maybe it’ll be worth trying again with a lower-case username. Then might just go through and check that all the variables are being filled in right… But that’ll be for another day.

        Only question I have from last night’s attempts is: does it make any difference if I installed the new version of JSE without first uninstalling Bliss?

      7. gravelld

        I don’t know the answer to whether you can easily swap JREs unfortunately…

        My thoughts are why not just let the add-in deal with the username?

      8. SW

        well, that’s just the thing… If I don’t create a user before install, then no user is created at all…
        It does delete the user I’ve created on uninstall, but no new one is created on reinstall… I just tried again, uninstalling JRE first, then reinstalling everything, and there is no Bliss/bliss user….

        I think it might be a change since DSM 6 (most of the talk I’ve seen of creating a user for apps relate to post DSM 6)

      9. SW

        Hmm, well, now that I’m searching for it, I can’t find anything that says exactly what I say above… It seems usernames ARE still created on other apps, but some permissions need to be changed… I guess I must have got the wrong end of the stick somewhere along the line…

        BUT, a bliss user is definitely NOT being created on my NAS when I install Bliss, so something’s definitely amiss… Perhaps it’s just a problem on the 213j…

      10. gravelld

        You know what – I’m not even sure myself now, it might be that it runs as root… that rings a bell actually. I’m not being much help, sorry. Hopefully patters sees this and can advise?

        If it does run as root that should mean that permissions aren’t an issue, at least!

      11. SW

        …and yet permission errors are what I’m getting in the logs when it fails to start…
        any clues from patters would be most welcome :)

  14. Andy Fitter

    This page seems a little dead… Is there any work being done to:

    – Fix the problems with Bliss writing into the root directory? Only just noticed this happening and caught it in time before it killed my Synology
    – Fix the problems with Bliss not updating itself correctly? It thinks it has, but then it is still stuck at the old version.

    I realise I could use Docker, but that’s yet another thing to look after as I don’t need it for anything else.

    Thanks in advance

    Andy.

    Reply
    1. gravelld

      Hi Andy, I think both problems are related – the update doesn’t work because of the root issue.

      This isn’t dead, it’s uppermost in my thoughts; that’s all I can say at the moment…

      Reply
      1. Andy Fitter

        Thanks Dan. I bought an unlimited Bliss license a while ago and having it running properly on my Synology would be ‘the icing on the cake’. I’ve just started re-ripping my entire CD collection again as ALAC (Previously ripped piecemeal over the years with varying encodings and bitrates) and it would be so useful!

        Andy.

      2. Quint

        same here… I’m keeping a close eye on this thread to see when there is a package for my new Synology 216play

    2. Paul

      Agree with Andy on this one. I would like to utilise my full license too, and have tried several times to get round the issue of Bliss writing to the root directly…all with no success.

      Paul

      Reply
      1. gravelld

        Definitely trying to get something to you… I realise it’s a poor substitute for what you actually want to do, but you can use the same licence on a computer connected to the NAS.

      2. Laurie

        Paul,

        You could always try running bliss in the Docker environment in the short term till the root issue is fixed.

  15. Hans Dampf

    Hi, I have a DS211, installed Java 8 SE sucessfully and Bliss afterwards without any errors. However I cannot access the bliss url http://:3220. Looking at the bliss protokoll it says:

    ERROR: Resolver: Install error – com.elsten.bliss.policy.tag.auto.linux.ARM_le
    java.io.IOException: Error accessing file:/var/packages/Bliss/target/bliss-bundle/com.elsten.bliss.policy.tag.auto.linux.ARM_le-1.0.1.jar
    at org.apache.felix.bundlerepository.impl.FileUtil.openURL(FileUtil.java:217)
    at org.apache.felix.bundlerepository.impl.FileUtil.openURL(FileUtil.java:199)
    at org.apache.felix.bundlerepository.impl.ResolverImpl.deploy(ResolverImpl.java:615)
    at com.elsten.bliss.bootstrapbundle.Activator$RepositoryAdminTracker.installFromDirectory(Activator.java:219)
    at com.elsten.bliss.bootstrapbundle.Activator$RepositoryAdminTracker.addingService(Activator.java:63)
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:932)
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:864)
    at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
    at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229)
    at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:894)
    at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:943)
    at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:794)
    at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:544)
    at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4445)
    at org.apache.felix.framework.Felix.registerService(Felix.java:3431)
    at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
    at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320)
    at org.apache.felix.bundlerepository.impl.Activator.start(Activator.java:71)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2154)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2072)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1299)
    at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:304)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.io.FileNotFoundException: /var/packages/Bliss/target/bliss-bundle/com.elsten.bliss.policy.tag.auto.linux.ARM_le-1.0.1.jar (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.

    What can I do? Or what did I do wrong?

    Thanks for your help.

    Reply
  16. Stephan

    Hello, can anyone help me? I don’t get Bliss to run on my DS211. I installed Java SE Embedded 8. Afterwards Bliss. It says that it is running but I cannot access it’s link: http://:3220. Looking at the log it says:

    ERROR: Resolver: Install error – com.elsten.bliss.policy.tag.auto.linux.ARM_le
    java.io.IOException: Error accessing file:/var/packages/Bliss/target/bliss-bundle/com.elsten.bliss.policy.tag.auto.linux.ARM_le-1.0.1.jar
    at org.apache.felix.bundlerepository.impl.FileUtil.openURL(FileUtil.java:217)
    at org.apache.felix.bundlerepository.impl.FileUtil.openURL(FileUtil.java:199)
    at org.apache.felix.bundlerepository.impl.ResolverImpl.deploy(ResolverImpl.java:615)
    at com.elsten.bliss.bootstrapbundle.Activator$RepositoryAdminTracker.installFromDirectory(Activator.java:219)
    at com.elsten.bliss.bootstrapbundle.Activator$RepositoryAdminTracker.addingService(Activator.java:63)
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:932)
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:864)
    at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
    at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229)
    at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:894)
    at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:943)
    at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:794)
    at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:544)
    at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4445)
    at org.apache.felix.framework.Felix.registerService(Felix.java:3431)
    at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
    at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320)
    at org.apache.felix.bundlerepository.impl.Activator.start(Activator.java:71)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2154)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2072)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1299)
    at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:304)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.io.FileNotFoundException: /var/packages/Bliss/target/bliss-bundle/com.elsten.bliss.policy.tag.auto.linux.ARM_le-1.0.1.jar (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.

    What can I do or what did i wrong?

    Cheers.

    Reply
    1. gravelld

      I think this is the second time I’ve heard of this error – is your device supported? Maybe it isn’t pulling down the file if your device isn’t on a list of supported models…

      Reply
      1. Stephan

        Hi Dan, thank you for your answer. What list of supported devices are you talking about and where can I find it? I thought that anything that shows up in my Synology package center can be installed. And that was the case for Java SE 7/8 an Bliss package.

      2. gravelld

        It’s more of a semi educated guess than anything else. I noticed the CPU for DS211 (Marvell Kirkwood) is not mentioned in the post above…

      3. Stephan

        Okay… and this means I won’t get Bliss to work on my DS211 no matter what I do???

      4. gravelld

        I’m really sorry to be obtuse but I don’t know; I’m just speculating as to why that file isn’t being downloaded (it looks like the fingerprinter that patters compiled to run on ARM).

  17. Rick

    My docker broke when I tried to update to the latest bliss version.
    For anyone using docker, FYI, I modified the DockerFile to use the latest Ubuntu (not trusty) as well as Java 8 and everything is running fine.

    Reply
    1. Bert Beukema

      I tried using docker but haven’t been able to get it running properly, is there a step-by-step guide anywhere? I think it’s a security issue because the docker is running but it can’t be accessed in any way. Strange.

      Reply
  18. Yuri

    I have similar error as Stephan on June 12.

    Error accessing file:/var/packages/Bliss/target/bliss-bundle/com.elsten.bliss.policy.tag.auto.linux.PowerPC-1.0.1.jar

    I have similar file but different version:
    com.elsten.bliss.policy.tag.auto.linux.PowerPC-1.0.0.jar

    Anyway to make it work?
    Thanks

    > uname -a
    Linux xxx 2.6.32.12 #7393 SMP Thu Jun 2 19:48:24 CST 2016 ppc GNU/Linux synology_qoriq_413

    > java -version
    java version “1.8.0_06”

    Reply
    1. Yuri

      Well, I just copied and renamed the file to match the version required. It didn’t work first, but after multiple trials of reboots and bliss restarts at some point it starts working by some magic.

      Reply
  19. Andy

    Hi. I have a Synology DS213air and followed the above instructions. Now have Java SE Embedded 8 installed and running. Installed Bliss onto the NAS from within the Package Center. It says it’s running, but everytime I click the app, I get a page with title “Problem loading page” and the text: “Unable to connect. Firefox can’t establish a connection to the server at 192.168.1.87:3220.” Any idea how I can get to the web interface or where I could be going wrong? Thanks

    Reply
  20. Frank van Hoof

    Has an Error preventing it from booting on ARM.
    It is looking for tag.auto.linux.ARM-1.0.1.jar, which doesnt exist (the file is 1.0.0)

    Reply
  21. frankvhoof

    (TEMPORARY) FIX FOR NO BOOTING BLISS:

    Tried downloading it on my Synology DS412.
    “booted” in DSM, but UI wouldnt show up. Log showed a FileNotFound, which lead me to a misnamed/misversioned file. It is looking for tag.linux.ARM.1.0.1.jar, but the file is actually 1.0.0.

    Renaming the file didn’t help either unfortunately, since it gave me a 404-page.

    Error 404 – Not Found.

    No context on this server matched or handled this request.
    Contexts known to this server are:
    / —> o.e.j.w.WebAppContext{/,file:/root/.bliss/jetty-ui/webapp/},file:/var/packages/Bliss/target/bin/../felix-cache/bundle48/version0.0/bundle.jar

    Clicking that link hovewer, suddenly got me into a booted Bliss :D

    I don’t really think this is intended though, so I thought I’d mention it.

    Reply
    1. gravelld

      Thanks! The “WebAppContext” message is normally just a temporary message shown when bliss is starting. If you refreshed the page a few seconds later, that might also work.

      Thanks for finding this!

      Reply
  22. Bert Beukema

    It worked fine for roughly 5 months and now suddenly stopped working on my Synology. When I want to start the app, it just stops. If I want to check the logs in the app window, the entire UI freezes. Sometimes the log window will open but it’s extremely slow, as if an enormous amount of data is available.

    Reply
    1. gravelld

      Can you get access to the Synology file system to send the bliss logs? They should be /volume1/@tmp I think – “bliss.log”.

      Reply
  23. patters Post author

    Hi all, I’ve finally overhauled a new version to support DSM 6.0 and all the Synology devices that have come along since the last release. It still runs as root for now, though I suspect I’ll need to change that to overcome the media indexing issues with Synology Audio Station that arise when Bliss makes fixes to the music collection as root.

    Reply
    1. gravelld

      Hi patters. The only obvious thing would be seeing fpcalc appearing on the process list periodically… It normally runs for a few seconds, so you should see it.

      Reply
  24. João Galante

    Hello!
    Already talked about this a little by mail with Dan, and he asked me to also post here.
    I have a DS213j running DSM 6. I begun all this after a clean install. Apart from bliss and “patters” Java, i only have default app/programs installed.

    Time line:
    Installed patters Java 7 and Bliss.
    Didn’t started. After several attempts, i did launched and i was able to access the 3220 page. After click at config icon it crashed. Went to the :3221/debug and got the log.
    After that i talked to Dan by mail.
    Unsitalled Bliss and Java 7.
    Installed Java 8 and Bliss.
    This time, it don’t started.
    I got the Access denied error that several other users reported above.

    What should i do? I can send some log file, if needed.

    Thanks a lot!

    Reply
    1. gravelld

      I took a look at the line number for the logs you sent me:

      start-stop-status.sh: line 57: /var/packages/Bliss/target/bin/bliss.sh: Permission denied

      I ssh’d into my machine and displayed the permissions:

      $ ls -l /var/packages/Bliss/target/bin/bliss.sh
      -rwxr-xr-x 1 root root 1618 Aug 24 09:55 /var/packages/Bliss/target/bin/bliss.sh

      That means it’s actually executable by anyone (although other problems may occur later).

      I suspect you don’t even have the file…

      Are you able to ssh in and run the command above:

      ls -l /var/packages/Bliss/target/bin/bliss.sh

      https://www.synology.com/en-global/knowledgebase/DSM/help/DSM/AdminCenter/system_terminal

      Reply
      1. João Galante

        This is the return for that command:
        -rw-r–r– 1 root root 1618 Aug 24 09:48 /var/packages/Bliss/target/bin/bliss.sh

        Thanks a lot!

      2. João Galante

        Ok, just set permissions to 777. Now i got the following error:
        error: Unable to access the jarfile /var/packages/targert/bin/../bin/felix.jar

      3. gravelld

        What are the permissions for /var/packages/target/bin/felix.jar ?

        (Note you made a typo “targert” in your post, I assume this wasn’t what was being outputted).

      4. João Galante

        Yes, I was a typo. And the referred directory doesn’t exist, so no permissions there. Hehehe

      5. João Galante

        I have, under the /var/packages/ only the aplications folders, such as the stations apps, HiperBackup, Bliss, Java8, etc… But no target folder there.
        What my next step? :P

      6. gravelld

        When bliss.sh runs it looks for the current directory of the bliss.sh script, converts that to the parent folder, and then adds “/bin/felix.jar” to the end to locate the felix.jar file.

        So that should go from /var/packages/Bliss/target/bin/bliss.sh to the parent at /var/packages/Bliss/target/ and then find felix at /var/packages/Bliss/target/bin/felix.jar

        However, your path appears to be missing “Bliss”. This might suggest bliss.sh is in /var/packages/target/bin/bliss.sh rather than /var/packages/Bliss/target/bin/bliss.sh

        It seems your install is rather messed up. I hesitate to suggest this but could you just uninstall, make sure everything is removed from the drive and re-install?

      7. João Galante

        Can you please elaborate a little more what do you mean by “make sure everything is removed from the drive”? I already uninstall it several time during this process, so i think that only doing it by the package manager won’t get me anywhere different.

        Thanks a lot for your support and patience.

      8. João Galante

        After uninstalling, my packages folder got like these:

        login as: evilinheaven
        evilinheaven@192.168.31.50‘s password:
        evilinheaven@Gondor:~$ cd ..
        evilinheaven@Gondor:/var/services/homes$ cd ..
        evilinheaven@Gondor:/var/services$ cd ..
        evilinheaven@Gondor:/var$ ls
        cache db empty lock packages services state target
        crash dynlib lib log run spool synobackup tmp
        evilinheaven@Gondor:/var$ cd packages
        evilinheaven@Gondor:/var/packages$ ls
        AudioStation DownloadStation java8 PhotoStation VideoStation
        CloudStation HyperBackup MediaServer PHP5.6

        Should i erase anything else manually?
        Should i uninstall patters Java 8 also?

        Thanks!

      9. gravelld

        No, leave that. Install bliss now and report what appears. I would expect just a “Bliss” folder. Then try running again.

      10. João Galante

        Ok. Installed it again. Now i’m back to the error: start-stop-status.sh: line 57: /var/packages/Bliss/target/bin/bliss.sh: Permission denied

        No good, Bliss still not starts.
        Did the chmod to 755 on bliss.sh and noting new.

        Nothing new on the registry.

        What my next step?
        Kind of idle here at work right now… Hehehe

      11. João Galante

        Tried to run the bliss.sh to see what’s happening.
        Below what i got:

        evilinheaven@Gondor:/var/packages/Bliss/target/bin$ sh bliss.sh
        bliss.sh: line 1: /volume1/@appstore/Bliss/bliss.pid: Permission denied

        evilinheaven@Gondor:/var/packages/Bliss/target/bin$ cd /volume1/@appstore/Bliss/
        evilinheaven@Gondor:/volume1/@appstore/Bliss$ ls
        bin bliss.out bundle datatables.licence NOTICE syno-native
        bliss-bundle bliss.pid conf launch4j.licence scala.licence ui

        evilinheaven@Gondor:/volume1/@appstore/Bliss$ ls -l bliss.pid
        ls: cannot access bliss.pid: No such file or directory

        evilinheaven@Gondor:/volume1/@appstore/Bliss$ sudo chmod 755 bliss.pid
        chmod: cannot access ‘bliss.pid’: No such file or directory

      12. gravelld

        You can’t directly execute bliss.sh unless you’re running as the correct user – root I think at the moment.

        Here are my permissions for bliss.sh:

        -rwxr-xr-x 1 root root   1618 Sep  5 09:47 bliss.sh
        

        The path to bliss.sh is as so:

        /var/packages/Bliss/target/bin
        

        felix.jar is in the same folder as bliss.sh:

        -rw-r--r-- 1 root root 538830 Aug 30 16:36 felix.jar
        

        When bliss runs it does so as root:

        $ ps -ef | grep java
        root     19319     1 78 09:59 ?        00:00:14 /var/packages/java8/target/ejdk1.8.0_101/linux_armv6_vfp_hflt/jre/bin/java -Xmx128M -Djava.io.tmpdir=/volume1/@tmp -Djava.util.prefs.syncInterval=86400 -Djava.net.preferIPv4Stack=true -XX:HeapDumpPath=/tmp -XX:+HeapDumpOnOutOfMemoryError -XX:+CMSClassUnloadingEnabled -Djava.awt.headless=true -Djava.util.logging.config.file=/var/packages/Bliss/target/bin/../conf/logging.properties -Djava.library.path=/var/packages/Bliss/target/bin/../lib -Dbliss.periodicHeapDumpThreshold=0.9 -Dorg.osgi.framework.storage=/var/packages/Bliss/target/bin/../felix-cache -Dfelix.auto.deploy.dir=/var/packages/Bliss/target/bin/../bundle -Dbliss.bootstrapbundle.initialbundledir=/var/packages/Bliss/target/bin/../bliss-bundle -Dbliss.launcher=/var/packages/Bliss/target/bin/bliss.sh -Drun.mode=production -jar /var/packages/Bliss/target/bin/../bin/felix.jar
        

        See what the differences are to your system…

    1. gravelld

      If you install the latest it should install the latest version of bliss. Is that not what you are seeing?

      Reply
  25. Andy Fitter

    Running the latest Synology package and the update function within Bliss doesn’t appear to work – It is on version 20160606, and when I check for updates it says its already on the latest version?

    Reply
    1. Brudertac

      I suggest making a Docker Container for Diskstations who support Docker.
      Have made this a few days earlier because i just wanted to try it and it works perfect.

      Reply
    2. gravelld

      Hi Andy. Where are you getting the version from – if it’s in the Synology UI you have to review it after starting bliss (it defaults to the version when the add-in was last changed).

      For the in-app update it’s a bug that bliss has to be restarted to see the new version…

      Reply
  26. Andy Fitter

    Weird. Restarted Bliss from Synology UI a number of times previously, but this time it seems it worked – Selected update from within the Bliss Web UI and the newer version was detected. There was something in the Logs about update server not being found.

    Reply
  27. Matt

    Having just been hit by the .bliss directory making my NAS unbootable twice ( the first time i had thought it was something else and reinstalled my entire system . The second I dug deeper and removed the .bliss from root , no regrets as its been a great learning experience) I was wondering if there are any thoughts on fixing this outside the docker route

    I’ve tested using both the Patters and Synology supplied JAVA and the .bliss folder is still tehre

    Reply
    1. gravelld

      Whaaaaaat? Really? I thought we fixed this a month or two ago.

      Ok, I can see what is going on I think. I’ll email patters.

      Reply
      1. Matt

        HI , is the fix something we can do (i.e a config file edit etc) or does it need to be a package change

    1. gravelld

      I think you should be able to do it yourself if you were happy editing some files. Or at least for testing purposes.

      The bliss start script is at /volume1/@appstore/Bliss/bin/bliss.sh . If you edit it and place the following line at the start:

      VMARGS=-Dbliss_working_directory=/volume1/@tmp/bliss

      That would save the database inside .bliss inside /volume1/@tmp/bliss

      So the file would look like:

      #!/bin/sh
      #
      # Shell script to run bliss

      VMARGS=-Dbliss_working_directory=/volume1/@tmp/bliss

      INSTALL_HOME=`dirname “$0″`/..
      […]

      I’m not sure if @tmp is trashed between restarts, if so you might want a different place, maybe in the bliss appstore folder at /volume1/@appstore/Bliss.

      Maybe there’s a way of changing the environment variable for VMARGS to avoid changing bliss.sh?

      Reply
      1. Matt

        HI ,

        So I’ve used the /volume1/@appstore/Bliss folder as this in package directory setup seems to be the standard for data stores across other apps. Its up and running and the .bliss folder is in the right place. Will set it running and see what happens :)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s