MusicCabinet - artist radio, genre radio & related artists

Artist radio, genre radio & related artists. A Subsonic server for music nerds.

Moderator: moderators

Re: MusicCabinet - artist radio, genre radio & related artis

Postby vollbr0t » Wed Aug 29, 2012 9:48 pm

just another idea:

i found this on the web: http://lastm3u.powha.net/
wouldnt it be great to have something like this within musiccabinet?

in general, here are a lot of great ideas how to use last.fm:
http://build.last.fm/category/For+the+Web?page=1
vollbr0t
 
Posts: 75
Joined: Wed Jan 19, 2011 6:35 pm

Re: MusicCabinet - artist radio, genre radio & related artis

Postby hakko » Fri Aug 31, 2012 7:19 pm

phantom4 wrote:I'm really liking the 0.7.8 release, but I found a couple of issues. For some reason, I'm getting a NullPointerException when trying to load some playlists. It doesn't happen on every playlist, but there doesn't appear to be anything different about the ones that don't load. They're standard m3u files and worked fine in version 0.5.5 and Subsonic 4.6/4.7b3.


Real life came in between fixing this, sorry. There's now a beta up that's meant to address this, see below.

What's even more exciting is that I started working on an improved search mechanism, and there's now a first version out for anyone who's interested.

It works using substrings - for example, if you search for "yellow sub beatles", most people could guess what I'm thinking of. It seems that the default Subsonic (4.7) doesn't match this, though. MusicCabinet didn't either, until now. In my new version, it happily returns Yellow Submarine. yay!

The first time you put this new version in place, start-up will be slow as it needs to build a smart search index for this. On my 60k songs library, it took 30 sec, so expect something linear to that.

To try it out it, replace your current subsonic.war file (if you're using version 0.7+) with http://dilerium.se/musiccabinet/subsonic-0.7.9b.war and restart. (and wait while it builds the index)

Report experiences (positive/negative) in this thread! I spent maybe 15-20 hours building this (trying out different fuzzy alternatives) so I'm interested in how well it works.
MusicCabinet developer
hakko
 
Posts: 1416
Joined: Tue Apr 17, 2012 7:05 pm
Location: Sweden

Re: MusicCabinet - artist radio, genre radio & related artis

Postby jake- » Fri Aug 31, 2012 8:45 pm

hakko wrote:It works using substrings - for example, if you search for "yellow sub beatles", most people could guess what I'm thinking of. It seems that the default Subsonic (4.7) doesn't match this, though. MusicCabinet didn't either, until now. In my new version, it happily returns Yellow Submarine. yay!


Wow fast searching. Looks very promising.

Some strange results. For ex: "love me" returns "Tainted Love" (Soft Cell) but not "Love Me Do" (Beatles)

Edit: Startup was fast without notable delays for about 150k songs
jake-
 
Posts: 40
Joined: Sat Oct 16, 2010 8:09 pm

Re: MusicCabinet - artist radio, genre radio & related artis

Postby hakko » Fri Aug 31, 2012 9:03 pm

Could it be that there are more than 25 results matching "love me"? I'm still using the original code where only the top 25 hits are returned. Paging in search result may appear later on.

Could you connect to your Postgresql database and issue the command
Code: Select all
select art.artist_name, alb.album_name, mt.track_name from library.track lt inner join music.track mt on lt.track_id = mt.id inner join music.album alb on lt.album_id = alb.id inner join music.artist art on mt.artist_id = art.id where track_name_search like '%LOVE%ME%' order by art.artist_name, mt.track_name;
and verify that your Beatles track is included?

Edit: it would make sense to rank exact matches first, though
MusicCabinet developer
hakko
 
Posts: 1416
Joined: Tue Apr 17, 2012 7:05 pm
Location: Sweden

Re: MusicCabinet - artist radio, genre radio & related artis

Postby jake- » Fri Aug 31, 2012 9:26 pm

hakko wrote:Could it be that there are more than 25 results matching "love me"? I'm still using the original code where only the top 25 hits are returned. Paging in search result may appear later on.

Could you connect to your Postgresql database and issue the command
Code: Select all
select art.artist_name, alb.album_name, mt.track_name from library.track lt inner join music.track mt on lt.track_id = mt.id inner join music.album alb on lt.album_id = alb.id inner join music.artist art on mt.artist_id = art.id where track_name_search like '%LOVE%ME%' order by art.artist_name, mt.track_name;
and verify that your Beatles track is included?

Edit: it would make sense to rank exact matches first, though


Sorry, can't remember the postgres db passwort atm, I'll give it another try tomorrow ;-) But there are 25 results displayed - so it's likely that there are more results.
jake-
 
Posts: 40
Joined: Sat Oct 16, 2010 8:09 pm

Re: MusicCabinet - artist radio, genre radio & related artis

Postby hakko » Fri Aug 31, 2012 9:31 pm

: ) you could also just add the word beatles to your search ("beatles love me"), that'll narrow the number of returned tracks.
MusicCabinet developer
hakko
 
Posts: 1416
Joined: Tue Apr 17, 2012 7:05 pm
Location: Sweden

Re: MusicCabinet - artist radio, genre radio & related artis

Postby jake- » Fri Aug 31, 2012 9:35 pm

hakko wrote::) you could also just add the word beatles to your search ("beatles love me"), that'll narrow the number of returned tracks.


Of course that works just fine. And "love me do" will do the job too.

I was surprised why a result without one of the search words was ranked over the result I was looking for. But for sorting you would have to weight the results in some way and thats not worth the hassle.
jake-
 
Posts: 40
Joined: Sat Oct 16, 2010 8:09 pm

Re: MusicCabinet - artist radio, genre radio & related artis

Postby hakko » Fri Aug 31, 2012 9:41 pm

I'd guess that the Soft Cell song was on an album containing the substring "me"? like "memorabilia: .."? Every track in your library which contains all the substrings you searched for are matched. Right now, tracks are returned sorted by artist name + album name + track name. But I was just thinking that it would be easy to rank exact hits (if you search for "love me do", for example) before other tracks. There are built-in similarity functions in Postgresql that could be used for ranking too, but they make the search slower when there are many matches (1000+).
MusicCabinet developer
hakko
 
Posts: 1416
Joined: Tue Apr 17, 2012 7:05 pm
Location: Sweden

Re: MusicCabinet - artist radio, genre radio & related artis

Postby Ultraviolet » Tue Sep 04, 2012 9:19 pm

I'm definitely having issues with the search as well. Searching for "Gotye" in the UI yields "No matches found". My postgres sucks, but
Code: Select all
SELECT artist.artist_name FROM music.artist WHERE artist.artist_name = 'GOTYE';

does show that Gotye is in the db. I'm running into this periodically with songs, albums and artists. Sometimes it seems the issue is that the result I'm after is just returned too far down to be displayed, other times I just get "No matches found" when it is in the db.
Ultraviolet
 
Posts: 62
Joined: Wed Jul 21, 2010 2:29 pm

Re: MusicCabinet - artist radio, genre radio & related artis

Postby hakko » Tue Sep 04, 2012 9:29 pm

Does this happen with version 0.7.9b posted above? http://dilerium.se/musiccabinet/subsonic-0.7.9b.war

It works with substrings rather than words, so "Gotye" should definitely be matched (that's such an unusual combination)

while if you search for "love" or something very general, it might definitely not make the top 25.
MusicCabinet developer
hakko
 
Posts: 1416
Joined: Tue Apr 17, 2012 7:05 pm
Location: Sweden

Re: MusicCabinet - artist radio, genre radio & related artis

Postby Ultraviolet » Tue Sep 04, 2012 10:44 pm

My bad. I was on vacation for a few days and missed the new release. Just popped the new war in and the Gotye search works great. Thanks!
Ultraviolet
 
Posts: 62
Joined: Wed Jul 21, 2010 2:29 pm

Re: MusicCabinet - artist radio, genre radio & related artis

Postby Pcace » Wed Sep 05, 2012 7:36 pm

Hey, i just installed 4.7 beta and copied the newest musiccabinet into it.
now (after finding out i need java 7) it starts up, but nothing happens exept htop sais:


25323 postgres 20 0 57216 39224 29996 R 91.0 1.9 44:50.73 postgres: postgres musiccabinet 127.0.0.1(58090) SELECT


is this right that i cannot access adress:4040 while this process is running?! How long is that going to take? (The Library is about 120.000songs large.


Ideas?

Thanks,

Pcace
Pcace
 
Posts: 117
Joined: Tue Nov 29, 2011 2:44 pm

Re: MusicCabinet - artist radio, genre radio & related artis

Postby hakko » Wed Sep 05, 2012 7:40 pm

Did you just replace subsonic.war? That won't work as you need a subsonic-booter-with-dependencies that's compiled with java 7 too.

Check the stand-alone version available at http://dilerium.se/musiccabinet/#installation
MusicCabinet developer
hakko
 
Posts: 1416
Joined: Tue Apr 17, 2012 7:05 pm
Location: Sweden

Re: MusicCabinet - artist radio, genre radio & related artis

Postby Pcace » Wed Sep 05, 2012 7:44 pm

Ah ok, when i follow the howto, will i loose the usersettings? - eg. passwords etc?


Pcace
Pcace
 
Posts: 117
Joined: Tue Nov 29, 2011 2:44 pm

Re: MusicCabinet - artist radio, genre radio & related artis

Postby Pcace » Wed Sep 05, 2012 7:50 pm

and another question: do i have to simply extract the standalone zip to /usr/share/subsonic?

because when i do this, the log sais:

root@t64:/usr/share/subsonic# cat /var/subsonic/subsonic.log
[2012-09-05 21:49:59,560] DEBUG DaoHelper - DAO Helper constructor.
[2012-09-05 21:49:59,577] DEBUG DaoHelper - Data source URL: jdbc:hsqldb:file:/var/subsonic/db/subsonic
[2012-09-05 21:49:59,577] INFO DaoHelper - Checking database schema.
[2012-09-05 21:49:59,905] INFO Schema25 - Database table 'version' not found. Creating it.
[2012-09-05 21:49:59,926] ERROR DaoHelper - Failed to initialize database.
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: The database is already in use by another process: org.hsqldb.persist.NIOLockFile@2d6451a6[file =/var/subsonic/db/subsonic.lck, exists=true, locked=false, valid=false, fl =null]: java.lang.Exception: checkHeartbeat(): lock file [/var/subsonic/db/subsonic.lck] is presumably locked by another process.
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:382)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:428)
at net.sourceforge.subsonic.dao.schema.Schema25.execute(Schema25.java:36)
at net.sourceforge.subsonic.dao.DaoHelper.checkDatabase(DaoHelper.java:134)
at net.sourceforge.subsonic.dao.DaoHelper.<init>(DaoHelper.java:89)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:76)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:990)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:943)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1360)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1360)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:644)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:446)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:530)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:135)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117)
at org.mortbay.jetty.Server.doStart(Server.java:217)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
at net.sourceforge.subsonic.booter.deployer.SubsonicDeployer.deployWebApp(SubsonicDeployer.java:131)
at net.sourceforge.subsonic.booter.deployer.SubsonicDeployer.<init>(SubsonicDeployer.java:65)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:839)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at net.sourceforge.subsonic.booter.Main.<init>(Main.java:24)
at net.sourceforge.subsonic.booter.Main.main(Main.java:63)
Caused by: java.sql.SQLException: The database is already in use by another process: org.hsqldb.persist.NIOLockFile@2d6451a6[file =/var/subsonic/db/subsonic.lck, exists=true, locked=false, valid=false, fl =null]: java.lang.Exception: checkHeartbeat(): lock file [/var/subsonic/db/subsonic.lck] is presumably locked by another process.
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.<init>(Unknown Source)
at org.hsqldb.jdbcDriver.getConnection(Unknown Source)
at org.hsqldb.jdbcDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:190)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:173)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:164)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
... 81 more

[2012-09-05 21:50:00,264] INFO VersionService - Resolved local Subsonic version to: 0.7

root@t64:/usr/share/subsonic# java -version
java version "1.7.0_03"
OpenJDK Runtime Environment (IcedTea7 2.1.1) (7~u3-2.1.1-3)
OpenJDK Client VM (build 22.0-b10, mixed mode, sharing)
root@t64:/usr/share/subsonic#


and the Browser sais:

HTTP ERROR: 503

SERVICE_UNAVAILABLE
RequestURI=/index.view

Powered by jetty://



Ideas?
Thanks,

Pcace
Pcace
 
Posts: 117
Joined: Tue Nov 29, 2011 2:44 pm

PreviousNext

Return to MusicCabinet

Who is online

Users browsing this forum: No registered users and 1 guest