Installing MusicCabinet on Top of SubSonic
A while back I posted about installing subsonic. While I was using the application, I noticed that the search feature is very limited and I wanted to expand it. So I ran across MusicCabinet, from their webpage:
Subsonic is a streaming music server, providing instant access to your personal music library. It is written by Sindre Mehus and released under the GPL.
MusicCabinet is an add-on for Subsonic. It uses the free musical knowledge gathered at Last.fm, to seamlessly:
It’s an add-on for subsonic and among other features it expands the searching functionality.
I couldn’t find any good instructions on how to install the add-on. The only link I found was this forum. The instructions were for an Ubuntu install and I was running Fedora. So I decided to write up instructions on how to install the plugin in Fedora on top of the subsonic RPM. Checking out the RPM, here are the files the original subsonic package contained:
$ rpm -ql subsonic-4.7-3105.i386
/etc/init.d/subsonic
/etc/sysconfig/subsonic
/usr/share/subsonic/subsonic-booter-jar-with-dependencies.jar
/usr/share/subsonic/subsonic.sh
/usr/share/subsonic/subsonic.war
/var/subsonic/transcode/ffmpeg
/var/subsonic/transcode/lame
Not that much stuff. The database for subsonic is under /var/subsonic:
$ ls /var/subsonic/
db jetty subsonic.log subsonic_sh.log transcode
db.backup lucene2 subsonic.properties thumbs
You have also need to java version 7 installed. I already had that installed:
$ java -version
java version "1.7.0_09-icedtea"
OpenJDK Runtime Environment (fedora-2.3.4.fc17-i386)
OpenJDK Client VM (build 23.2-b09, mixed mode)
I covered the install of java in the initial post here, check it out if necessary. Now let’s get started on the MusicCabinet install.
1. Install and Setup PostgreSQL
Here is how the install looks like with YUM:
$ sudo yum install postgresql postgresql-server
Resolving Dependencies
--> Running transaction check
---> Package postgresql.i686 0:9.1.7-1.fc17 will be installed
...
...
Installed:
postgresql.i686 0:9.1.7-1.fc17 postgresql-server-9.1.7-1.fc17.i686.rpm
Dependency Installed:
postgresql-libs.i686 0:9.1.7-1.fc17
Complete!
That went well, now let’s initialize the database:
$ sudo postgresql-setup initdb
Initializing database ... OK
Next let’s enable the postgresql service and start it:
$ sudo systemctl enable postgresql.service
ln -s '/usr/lib/systemd/system/postgresql.service' '/etc/systemd/system/multi-user.target.wants/postgresql.service'
$ sudo systemctl start postgresql.service
Confirming that the service is running:
$ sudo systemctl status postgresql.service
postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled)
Active: active (running) since Wed, 30 Jan 2013 17:13:05 -0800; 49s ago
Process: 32310 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS)
Process: 32305 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 32315 (postgres)
CGroup: name=systemd:/system/postgresql.service
├ 32315 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432
├ 32316 postgres: logger process
├ 32318 postgres: writer process
├ 32319 postgres: wal writer process
├ 32320 postgres: autovacuum launcher process
└ 32321 postgres: stats collector process
That all looks good. It looks like the install also creates a postgres user:
$ getent passwd postgres
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
Then using the postgres user, reset the password for itself:
$ sudo -u postgres psql postgres
psql (9.1.7)
Type "help" for help.
postgres=# \password postgres
Enter new password:
Enter it again:
postgres-# \q
Lastly, allow logins with local password authentication to the psql instance. Edit the following file: /var/lib/pgsql/data/pg_hba.conf and change these lines:
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 ident
to look like this:
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
After the change, restart the postgresql service:
$ sudo systemctl restart postgresql.service
Then you should be able to login with the password you set from any user:
$ psql -U postgres
Password for user postgres:
psql (9.1.7)
Type "help" for help.
postgres=# \q
Even when you try to connect to the localhost IP:
$ psql -U postgres -h localhost
Password for user postgres:
psql (9.1.7)
Type "help" for help.
postgres=# \q
That will be it for the postgresql setup.
2. Backup the Subsonic Database and Install Files
The files are stored under /var/subsonic, so let’s tar that up. First let’s stop the subsonic service:
$ sudo systemctl stop subsonic.service
Now let’s check the status:
$ sudo systemctl status subsonic.service
subsonic.service - LSB: Subsonic daemon
Loaded: loaded (/etc/rc.d/init.d/subsonic)
Active: inactive (dead) since Wed, 30 Jan 2013 17:28:15 -0800; 5s ago
Process: 32425 ExecStop=/etc/rc.d/init.d/subsonic stop (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/subsonic.service
Jan 23 21:06:47 moxz.dnsd.me subsonic[707]: Starting subsonic ...
Jan 23 21:06:48 moxz.dnsd.me subsonic[707]: Started Subsonic [PID 795, /var...]
Jan 30 17:28:15 moxz.dnsd.me subsonic[32425]: Stopping subsonic ...[ OK ]
That looks good. Now let’s back up the data:
$ sudo tar cpvjf subsonic_backup.tar.bz2 /var/subsonic/
/var/subsonic/thumbs/200/315cff71c50a61d933b3d30c392b0343.jpeg
...
...
Since the application files go under /usr/share/subsonic, let’s backup those up as well:
$ sudo tar cpvjf subsonic_usr_backup.tar.bz2 /usr/share/subsonic
/usr/share/subsonic/
/usr/share/subsonic/subsonic.sh
/usr/share/subsonic/subsonic-booter-jar-with-dependencies.jar
/usr/share/subsonic/subsonic.war
Here are the two resulting files:
$ ls -lh subsonic*
-rw-r--r-- 1 root root 61M Jan 30 17:33 subsonic_backup.tar.bz2
-rw-r--r-- 1 root root 29M Jan 30 17:35 subsonic_usr_backup.tar.bz2
That looks good.
3. Download and Extract MusicCabinet
This is pretty easy, let’s create a temporary directory and download the install file there:
$ mkdir files
$ cd files/
$ wget http://dilerium.se/musiccabinet/subsonic-installer-standalone.zip
--2013-01-30 17:39:24-- http://dilerium.se/musiccabinet/subsonic-installer-standalone.zip
Resolving dilerium.se (dilerium.se)... 193.202.110.54
Connecting to dilerium.se (dilerium.se)|193.202.110.54|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 29481485 (28M)
Saving to: 'subsonic-installer-standalone.zip'
100%[=====================================>] 29,481,485 482K/s in 76s
2013-01-30 17:40:41 (380 KB/s) - 'subsonic-installer-standalone.zip' saved [29481485/29481485]
Now let’s extract the contents:
$ unzip subsonic-installer-standalone.zip
Archive: subsonic-installer-standalone.zip
creating: subsonic-installer-standalone/
inflating: subsonic-installer-standalone/subsonic-main.war
inflating: subsonic-installer-standalone/subsonic-booter.jar
inflating: subsonic-installer-standalone/Getting Started.html
inflating: subsonic-installer-standalone/LICENSE.TXT
inflating: subsonic-installer-standalone/README.TXT
inflating: subsonic-installer-standalone/subsonic.bat
inflating: subsonic-installer-standalone/subsonic.sh
Now to the final steps:
4. Copy the Installation Files to the SubSonic Install
We just need to copy over two files. Here are the permissions before copying the files over:
$ ls -l /usr/share/subsonic/
total 30724
-rw-r--r-- 1 root root 10801885 Sep 11 13:06 subsonic-booter-jar-with-dependencies.jar
-rwxr-xr-x 1 root root 5030 Sep 11 13:06 subsonic.sh
-rw-r--r-- 1 root root 20603945 Sep 11 13:06 subsonic.war
Now to copy over the file:
$ cd subsonic-installer-standalone
$ sudo cp subsonic-main.war /usr/share/subsonic/subsonic.war
$ sudo cp subsonic-booter.jar /usr/share/subsonic/subsonic-booter-jar-with-dependencies.jar
Here is how the files look after the copy:
$ ls -l /usr/share/subsonic/
total 30016
-rw-r--r-- 1 root root 7550525 Jan 30 17:52 subsonic-booter-jar-with-dependencies.jar
-rwxr-xr-x 1 root root 5030 Sep 11 13:06 subsonic.sh
-rw-r--r-- 1 root root 23130290 Jan 30 17:48 subsonic.war
The permissions looks good. Now let’s start the subsonic service:
$ sudo systemctl start subsonic.service
Now let’s make sure it stated up fine:
$ sudo systemctl status subsonic.service
subsonic.service - LSB: Subsonic daemon
Loaded: loaded (/etc/rc.d/init.d/subsonic)
Active: active (exited) since Wed, 30 Jan 2013 17:53:46 -0800; 5s ago
Process: 32425 ExecStop=/etc/rc.d/init.d/subsonic stop (code=exited, status=0/SUCCESS)
Process: 32606 ExecStart=/etc/rc.d/init.d/subsonic start (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/subsonic.service
Jan 30 17:53:45 moxz.dnsd.me subsonic[32606]: Starting subsonic ...
Jan 30 17:53:46 moxz.dnsd.me subsonic[32606]: Started Subsonic [PID 32632, ...]
That looks good.
5. Configure MusicCabinet via the Browser
Visit the subsonic web page and the interface will look different:
Then go to “Settings” -> “MusicCabinet” and specify the postgres user password:
After you type in the postgres password it will ask you to “Upgrade Database”:
After it’s done updating the database, it will ask you to update your search index:
While the scan is going you can check the progress of the scan:
While it’s indexing, you can also enable lastfm ‘scrobbling’ by going to “Settings” -> “Personal”, if you scroll down a little bit you will an option to “Configure lastfm scrobbling”, like so:
After the indexing is done, the settings page for MusicCabinet will look like this:
Now if you search for something there will be an option to do an “Advanced Search”, here is how it looks like:
You now can also view your library by Tags, I still prefer the File-based browsing but this just adds more functionality. Also, every time you play a song it updates your lastfm library as well. I am sure there are a lot more updates, but those are the ones that stood out to me.