<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Matt Goldspink DJ Mixes</title>
	<atom:link href="http://www.mattgoldspink.co.uk/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mattgoldspink.co.uk</link>
	<description>My (infrequent) musical escapades</description>
	<lastBuildDate>Fri, 03 Sep 2010 21:25:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>A bit more progress on the itunes themed UI</title>
		<link>http://www.mattgoldspink.co.uk/2010/08/04/a-bit-more-progress-on-the-itunes-themed-ui/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=a-bit-more-progress-on-the-itunes-themed-ui</link>
		<comments>http://www.mattgoldspink.co.uk/2010/08/04/a-bit-more-progress-on-the-itunes-themed-ui/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 00:09:15 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.mattgoldspink.co.uk/?p=3769</guid>
		<description><![CDATA[Got the grid loading using WebWorkers to improve performance and interactivity (note the loading status in the bottom left of the grid). Also add playlists to nav tree on the left and began to style the grid a lot more like itunes.]]></description>
			<content:encoded><![CDATA[<p>Got the grid loading using WebWorkers to improve performance and interactivity (note the loading status in the bottom left of the grid). Also add playlists to nav tree on the left and began to style the grid a lot more like itunes.<br />
<a href="http://www.flickr.com/photos/mattgoldspink/4858724442/" title="A bit more progress by matt.goldspink, on Flickr"><img src="http://farm5.static.flickr.com/4121/4858724442_e21b1ff1eb_b.jpg" width="1024" height="617" alt="A bit more progress" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mattgoldspink.co.uk/2010/08/04/a-bit-more-progress-on-the-itunes-themed-ui/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>New Subsonic Web UI!</title>
		<link>http://www.mattgoldspink.co.uk/2010/07/18/new-subsonic-web-ui/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=new-subsonic-web-ui</link>
		<comments>http://www.mattgoldspink.co.uk/2010/07/18/new-subsonic-web-ui/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 03:21:04 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[extjs]]></category>
		<category><![CDATA[Subsonic]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.mattgoldspink.co.uk/?p=1253</guid>
		<description><![CDATA[So a quick post about a new Subsonic web UI I&#8217;ve been working on based on Itunes. Here&#8217;s a sneak peak at it:]]></description>
			<content:encoded><![CDATA[<p>So a quick post about a new Subsonic web UI I&#8217;ve been working on based on Itunes. Here&#8217;s a sneak peak at it:<br />
<img src="http://farm5.static.flickr.com/4081/4803791582_34581ff009_b.jpg" alt="home" width="500" height="313" border="0" /><br /><img src="http://farm5.static.flickr.com/4122/4803160459_72ccb7f919.jpg" alt="gridview" width="500" height="313" border="0" /><br /><img src="http://farm5.static.flickr.com/4137/4803791010_3879ee7275.jpg" alt="folderview" width="500" height="313" border="0" /><br /><img src="http://farm5.static.flickr.com/4135/4803159975_c10dc86c8b.jpg" alt="coverflow" width="500" height="313" border="0" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mattgoldspink.co.uk/2010/07/18/new-subsonic-web-ui/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Can&#8217;t boot into Windows XP after installing Ubuntu 10.4 (Lucid Lynx)</title>
		<link>http://www.mattgoldspink.co.uk/2010/06/26/cant-boot-into-windows-xp-after-installing-ubuntu-10-4-lucid-lynx/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cant-boot-into-windows-xp-after-installing-ubuntu-10-4-lucid-lynx</link>
		<comments>http://www.mattgoldspink.co.uk/2010/06/26/cant-boot-into-windows-xp-after-installing-ubuntu-10-4-lucid-lynx/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 17:24:50 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.mattgoldspink.co.uk/?p=1248</guid>
		<description><![CDATA[I upgraded to Lucid a few months ago but have not been able to use my windows partition since. Everytime I select it from Grub2 it just goes to a grub style prompt and I can&#8217;t do much. I finally found a solution here: http://sourceforge.net/apps/mediawiki/bootinfoscript/index.php?title=Boot_Problems:Boot_Sector which worked beautifully first time and I&#8217;m now back into [...]]]></description>
			<content:encoded><![CDATA[<p>I upgraded to Lucid a few months ago but have not been able to use my windows partition since. Everytime I select it from Grub2 it just goes to a grub style prompt and I can&#8217;t do much. I finally found a solution here: <a href="http://sourceforge.net/apps/mediawiki/bootinfoscript/index.php?title=Boot_Problems:Boot_Sector">http://sourceforge.net/apps/mediawiki/bootinfoscript/index.php?title=Boot_Problems:Boot_Sector</a> which worked beautifully first time and I&#8217;m now back into XP!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mattgoldspink.co.uk/2010/06/26/cant-boot-into-windows-xp-after-installing-ubuntu-10-4-lucid-lynx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSON, JSR-303, Spring MVC and Ext.js</title>
		<link>http://www.mattgoldspink.co.uk/2010/06/24/json-jsr-303-spring-mvc-and-ext-js/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=json-jsr-303-spring-mvc-and-ext-js</link>
		<comments>http://www.mattgoldspink.co.uk/2010/06/24/json-jsr-303-spring-mvc-and-ext-js/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 23:46:40 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[Ext]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[springframework]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.mattgoldspink.co.uk/?p=1219</guid>
		<description><![CDATA[So I thought I&#8217;d post this in case others hit it. If you want to Spring MVC and POST JSON from an Ext JsonWriter to the server and have it populate your bean model and also get validated by JSR-303 validator then you&#8217;ll need to do a little work because it doesn&#8217;t work out of [...]]]></description>
			<content:encoded><![CDATA[<p>So I thought I&#8217;d post this in case others hit it. If you want to Spring MVC and POST JSON from an Ext JsonWriter to the server and have it populate your bean model and also get validated by JSR-303 validator then you&#8217;ll need to do a little work because it doesn&#8217;t work out of the box.</p>
<p>In the end I had to do some ugly classpath overriding to get it to work in the way I expected by writing my own modified version of Spring&#8217;s HandlerMethodInvoker. If you hit similar issues I suggest following this JIRA: <a href="http://jira.springframework.org/browse/SPR-7114">http://jira.springframework.org/browse/SPR-7114</a> and feel free to use the attached code on the JIRA. It&#8217;s been working great for me now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mattgoldspink.co.uk/2010/06/24/json-jsr-303-spring-mvc-and-ext-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Re-visiting Spring, Ivy and Maven &#8211; copy and paste configs</title>
		<link>http://www.mattgoldspink.co.uk/2010/06/19/re-visiting-spring-ivy-and-maven-copy-and-paste-configs/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=re-visiting-spring-ivy-and-maven-copy-and-paste-configs</link>
		<comments>http://www.mattgoldspink.co.uk/2010/06/19/re-visiting-spring-ivy-and-maven-copy-and-paste-configs/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 19:16:53 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Ivy]]></category>
		<category><![CDATA[Ivy Settings]]></category>
		<category><![CDATA[IvyDE]]></category>
		<category><![CDATA[Jodatime]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[maven2]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[springframework]]></category>
		<category><![CDATA[Springsource]]></category>

		<guid isPermaLink="false">http://www.mattgoldspink.co.uk/?p=1237</guid>
		<description><![CDATA[So its been a while since I did any Java development at home and having done enough at work I figured I would get a basic ivy setup with all the regular dependencies that I use for 90% of the projects I do at the firm and am likely to do at home so I [...]]]></description>
			<content:encoded><![CDATA[<p>So its been a while since I did any Java development at home and having done enough at work I figured I would get a basic ivy setup with all the regular dependencies that I use for 90% of the projects I do at the firm and am likely to do at home so I can just copy and paste in the future. So feel free to&#8230; copy and paste!</p>
<p>I&#8217;m using Eclipse 3.5 with the <a href="http://ant.apache.org/ivy/ivyde/">IvyDE plugin</a>. With those installed I created a new Java Project and then set about creating my ivy.xml. My projects pretty much all have the same basic dependencies</p>
<ul>
<li>Spring (3.0.3.RELEASE since that&#8217;s the latest)</li>
<li>Hibernate (3.5.3.Final)</li>
<li>Hibernate-search (Makes indexing my model nice and easy)</li>
<li>Jodatime (Awesome for date manipulation)</li>
<li>Jodatime-hibernate</li>
<li>H2 database (I always start of with a mock in-memory at start of dev and then use some JPA magic to dump out a schema to DB2 or Sybase, or whatever else DB is in use)</li>
<li>SLF4J (My logging api of choice)</li>
<li>Jackson (For any restful services I might write)</li>
</ul>
<p>Here&#8217;s my ivy.xml</p>
<pre class="brush: xml">
&lt; ?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt; ?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;http://ivyrep.jayasoft.org/ivy-doc.xsl&quot;?&gt;
&lt;ivy -module xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:noNamespaceSchemaLocation=&quot;http://incubator.apache.org/ivy/schemas/ivy.xsd&quot; version=&quot;1.3&quot;&gt;

	&lt;info organisation=&quot;mattgoldspink&quot; module=&quot;gtdtd&quot; revision=&quot;1.0.0&quot; status=&quot;integration&quot;&gt;
		&lt;license name=&quot;Apache 2.0&quot; url=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot;/&gt;
	&lt;/info&gt;

	&lt;configurations&gt;
		&lt;conf name=&quot;compile&quot; visibility=&quot;public&quot; description=&quot;Maven compile dependencies&quot;/&gt;
		&lt;conf name=&quot;runtime&quot; visibility=&quot;public&quot; extends=&quot;compile&quot; description=&quot;Runtime dependencies&quot;/&gt;
		&lt;conf name=&quot;test&quot; visibility=&quot;private&quot; description=&quot;Test dependencies&quot;/&gt;
	&lt;/configurations&gt;

	&lt;dependencies&gt;
		&lt;dependency org=&quot;org.springframework&quot; name=&quot;org.springframework.spring-library&quot; rev=&quot;3.0.3.RELEASE&quot; conf=&quot;runtime-&gt;runtime&quot; /&gt;
		&lt;/dependency&gt;&lt;dependency org=&quot;org.hibernate&quot; name=&quot;hibernate-core&quot; rev=&quot;3.5.3-Final&quot; conf=&quot;runtime-&gt;*&quot; /&gt;
		&lt;/dependency&gt;&lt;dependency org=&quot;com.h2database&quot; name=&quot;h2&quot; rev=&quot;1.2.137&quot; conf=&quot;runtime-&gt;*&quot; /&gt;
		&lt;/dependency&gt;&lt;dependency org=&quot;org.hibernate&quot; name=&quot;hibernate-validator&quot; rev=&quot;4.0.2.GA&quot; conf=&quot;runtime-&gt;*&quot; &gt;
			&lt;exclude org=&quot;org.slf4j&quot; name=&quot;slf4j-log4j12&quot; /&gt;
		&lt;/dependency&gt;
		&lt;dependency org=&quot;org.hibernate&quot; name=&quot;hibernate-entitymanager&quot; rev=&quot;3.5.3-Final&quot; conf=&quot;runtime-&gt;*&quot; /&gt;
		&lt;/dependency&gt;&lt;dependency org=&quot;org.hibernate&quot; name=&quot;hibernate-search&quot; rev=&quot;3.2.0.Final&quot; conf=&quot;runtime-&gt;*&quot;&gt;
			&lt;exclude org=&quot;javax.jms&quot; name=&quot;jms&quot; /&gt;
		&lt;/dependency&gt;
		&lt;dependency org=&quot;joda-time&quot; name=&quot;joda-time&quot; rev=&quot;1.6&quot; conf=&quot;runtime-&gt;*&quot; /&gt;
		&lt;/dependency&gt;&lt;dependency org=&quot;org.hibernate.javax.persistence&quot; name=&quot;hibernate-jpa-2.0-api&quot; rev=&quot;1.0.0.Final&quot; conf=&quot;runtime-&gt;*&quot; /&gt;
		&lt;/dependency&gt;&lt;dependency org=&quot;joda-time&quot; name=&quot;joda-time-hibernate&quot; rev=&quot;1.2&quot; conf=&quot;runtime-&gt;*&quot;&gt;
			&lt;exclude org=&quot;org.hibernate&quot; name=&quot;hibernate&quot; /&gt;
		&lt;/dependency&gt;
		&lt;dependency org=&quot;org.slf4j&quot; name=&quot;slf4j-api&quot; rev=&quot;1.5.6&quot; conf=&quot;runtime&quot; force=&quot;true&quot;/&gt;
		&lt;dependency org=&quot;org.slf4j&quot; name=&quot;slf4j-log4j12&quot; rev=&quot;1.5.6&quot; conf=&quot;runtime&quot; force=&quot;true&quot;/&gt;
		&lt;dependency org=&quot;org.codehaus.jackson&quot; name=&quot;jackson-core-lgpl&quot; rev=&quot;1.5.3&quot; conf=&quot;runtime&quot; /&gt;
		&lt;dependency org=&quot;org.codehaus.jackson&quot; name=&quot;jackson-mapper-lgpl&quot; rev=&quot;1.5.3&quot; conf=&quot;runtime-&gt;*&quot; /&gt;
	&lt;/dependency&gt;&lt;/dependencies&gt;

&lt;/ivy&gt;
</pre>
<p>I&#8217;m going to get my spring dependencies from Springsource&#8217;s ivy/maven repository, but everything else will come from a mix of JBoss and Maven2 repo&#8217;s. Here&#8217;s the ivy-settings.xml
</p>
<pre class="brush: xml">
&lt; ?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;
&lt;ivysettings&gt;

	&lt;caches artifactPattern=&quot;[organisation]/[module]/[revision]/[artifact].[ext]&quot; /&gt;
	&lt;settings defaultResolver=&quot;ibiblio.jboss.java-net.springsource&quot; checkUpToDate=&quot;true&quot; /&gt;

	&lt;resolvers&gt;
		&lt;chain name=&quot;ibiblio.jboss.java-net.springsource&quot;&gt;
			&lt;ibiblio name=&quot;ibiblio&quot; m2compatible=&quot;true&quot; /&gt;
			&lt;ibiblio name=&quot;jboss&quot; m2compatible=&quot;true&quot;
				root=&quot;https://repository.jboss.org/nexus/content/groups/public-jboss&quot; /&gt;
			&lt;ibiblio name=&quot;java.net&quot; m2compatible=&quot;true&quot;
				root=&quot;https://repository.jboss.org/nexus/content/repositories/java.net-m2/&quot; /&gt;
			&lt;ibiblio name=&quot;java.net&quot; m2compatible=&quot;true&quot;
				root=&quot;http://repository.codehaus.org/&quot; /&gt;
			&lt;url name=&quot;com.springsource.repository.libraries.release&quot;&gt;
				&lt;ivy pattern=&quot;http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]&quot; /&gt;
				&lt;artifact pattern=&quot;http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]&quot; /&gt;
			&lt;/url&gt;

			&lt;url name=&quot;com.springsource.repository.libraries.external&quot;&gt;
				&lt;ivy pattern=&quot;http://repository.springsource.com/ivy/libraries/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]&quot; /&gt;
				&lt;artifact pattern=&quot;http://repository.springsource.com/ivy/libraries/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]&quot; /&gt;
			&lt;/url&gt;
			&lt;url name=&quot;com.springsource.repository.bundles.release&quot;&gt;
				&lt;ivy pattern=&quot;http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]&quot; /&gt;
				&lt;artifact pattern=&quot;http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]&quot; /&gt;
			&lt;/url&gt;

			&lt;url name=&quot;com.springsource.repository.bundles.external&quot;&gt;
				&lt;ivy pattern=&quot;http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]&quot; /&gt;
				&lt;artifact pattern=&quot;http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]&quot; /&gt;
			&lt;/url&gt;
		&lt;/chain&gt;

	&lt;/resolvers&gt;
&lt;/ivysettings&gt;
</pre>
<p>After plugging the above into Eclipse and setting up my IvyDE classpath container to use the new ivy-settings.xml file there was one more thing to do which was to tell IvyDE what type the source jars were. Go to &#8220;Window&#8221; -> &#8220;Preferences&#8221;, find &#8220;Ivy&#8221; -> &#8220;Classpath&#8221; in the tree and on that page under the option for &#8220;Source types&#8221; enter &#8220;source,src,srcs&#8221;. Save and you should get source code attachment to the jars too. Note that you can tell your Eclipse project to use the ivy-settings within it by going right clicking on your Ivy classpath container and under &#8220;Ivy Settings Path&#8221; enter <code>project:///ivy-settings.xml</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mattgoldspink.co.uk/2010/06/19/re-visiting-spring-ivy-and-maven-copy-and-paste-configs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sencha touch, YQL and BBC essential mix</title>
		<link>http://www.mattgoldspink.co.uk/2010/06/19/sencha-touch-yql-and-bbc-essential-mix/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=sencha-touch-yql-and-bbc-essential-mix</link>
		<comments>http://www.mattgoldspink.co.uk/2010/06/19/sencha-touch-yql-and-bbc-essential-mix/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 15:48:38 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://www.mattgoldspink.co.uk/?p=1234</guid>
		<description><![CDATA[So following on from earlier post this week about writing an Ext app which uses YQL to show the BBC radio1 essential mix tracklisting I decided to re-implement the same thing but using the new sencha touch library. Here it is: BBC Essential Mix Trackisting for Android, Ipad and Iphone I&#8217;ll post later this week [...]]]></description>
			<content:encoded><![CDATA[<p>So following on from earlier post this week about writing an Ext app which uses YQL to show the BBC radio1 essential mix tracklisting I decided to re-implement the same thing but using the new sencha touch library. </p>
<p>Here it is: <a href="http://www.mattgoldspink.co.uk/touch.html">BBC Essential Mix Trackisting for Android, Ipad and Iphone</a></p>
<p>I&#8217;ll post later this week details about how it works. For now take a look at the source code and enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mattgoldspink.co.uk/2010/06/19/sencha-touch-yql-and-bbc-essential-mix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Playing with Ext.js, YQL and BBC radio1 Essential Mix</title>
		<link>http://www.mattgoldspink.co.uk/2010/06/16/playing-with-ext-js-yql-and-bbc-radio1-essential-mix/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=playing-with-ext-js-yql-and-bbc-radio1-essential-mix</link>
		<comments>http://www.mattgoldspink.co.uk/2010/06/16/playing-with-ext-js-yql-and-bbc-radio1-essential-mix/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 01:01:14 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[bbc]]></category>
		<category><![CDATA[Christian Heilmann]]></category>
		<category><![CDATA[Ext]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[JSON-P]]></category>
		<category><![CDATA[ScriptTagProxy]]></category>
		<category><![CDATA[TreeLoader]]></category>
		<category><![CDATA[YQL]]></category>

		<guid isPermaLink="false">http://www.mattgoldspink.co.uk/?p=1210</guid>
		<description><![CDATA[I&#8217;m a big fan of the radio1 essential mix and list to almost every week. I&#8217;m also getting more and more stuck into Ext.js at work. I also saw a great talk by Christian Heilmann of Yahoo at Full Frontal last and he demo&#8217;ed YQL. So I thought I&#8217;d give it a go and make [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a big fan of the radio1 essential mix and list to almost every week. I&#8217;m also getting more and more stuck into Ext.js at work. I also saw a great talk by Christian Heilmann of Yahoo at Full Frontal last and he demo&#8217;ed YQL. So I thought I&#8217;d give it a go and make a quick Ext app which uses YQL and pulls in the data of the tracklists for the Radio 1 Essential Mixes&#8230;<br />
And here it is: <a href="http://www.mattgoldspink.co.uk/bbcradiolastfm.html">http://www.mattgoldspink.co.uk/bbcradiolastfm.html</a><br />
To give a brief summary of how I did it</p>
<ol>
<li><strong>Getting the tracklisting from the BBC</strong><br />This basically involved me picking out a rough top level element from an essential mix page of tracks (firebug is lord). This resulted in the below YQL query:
<pre class="brush: sql">
select * from html where url=&quot;http&quot;+&quot;://ww&quot;+&quot;w.bbc.co.uk/programmes/b00sdb2z&quot; and xpath=&#039;//div[@class=&quot;title&quot; or @class=&quot;title with-image&quot;]&#039;
</pre>
</li>
<li><strong>Now getting this into a simple Ext.js ListView</strong><br />It was obvious to me I needed a Ext.data.ScriptTagProxy to achieve this in order to get the JSON-P cross domain call. Unfortunately the hard bit is getting the JSON from the YQL call into the right format for my JsonStore in Ext. Thankfully Ext has all the necessary hooks to do this it looks something like:
<pre class="brush: javascript">
var dataStore = new Ext.data.JsonStore(
	{
		proxy : new Ext.data.ScriptTagProxy(
			{
				url : &#039;http&#039;+&#039;://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22http%3A%2F%2Fw&#039;+&#039;ww.bbc.co.uk%2Fprogrammes%2Fb00sdb2z%22%20and%0A%20%20%20%20%20%20xpath%3D\&#039;%2F%2Fdiv%5B%40class%3D%22title%22%20or%20%40class%3D%22title%20with-image%22%5D\&#039;&amp;format=json&#039;,
				callbackParam: &#039;callback&#039;,
				restful: true
			}
		),
		root: &#039;query.results.div&#039;,
		fields: [{
                    name : &#039;artist&#039;,
                    convert : Ext.ux.mattgoldspink.bbcessentialmix.getArtistFromJson
                },{
                    name : &#039;track&#039;,
                    convert : Ext.ux.mattgoldspink.bbcessentialmix.getTitleFromJson
                }],
		allowBlank: false
	}
);
</pre>
<p>Where the convert functions were:</p>
<pre class="brush: javascript">
function js_traverse(o, keyName) {
	var type = typeof o;
	if (o.class &amp;&amp; o.class === keyName)
	{
		return o.content;
	}
	if (type == &quot;object&quot;) {
		for (var key in o) {
			var output = js_traverse(o[key], keyName);
			if (output) {
				return output;
			}
		 }
	} else {
		return undefined;
	}
};

Ext.ux.mattgoldspink.bbcessentialmix.getArtistFromJson = function(v, rec) {
	var artist = js_traverse(rec, &#039;artist&#039;);
	if (artist) {
			return artist;
	} else {
		return &#039;Unknown&#039;;
	}
};

Ext.ux.mattgoldspink.bbcessentialmix.getTitleFromJson = function(v, rec) {
	var artist = js_traverse(rec, &#039;track&#039;);
	if (artist) {
			return artist;
	} else {
		return &#039;Unknown&#039;;
	}
};
</pre>
<p>The interesting part here is that the BBC very helpfully markup all their tags so all I had to do was traverse the messy JSON tree until I found a class which marked either the title or artist and then return it (or &#8216;Unknown&#8217; if it was there).<br />Next we plug this into our Ext.ListView:</p>
<pre class="brush: javascript">
var listView = new Ext.list.ListView({
	id: &#039;listview&#039;,
	store: dataStore,
	multiSelect: true,
	emptyText: &#039;No tracks found&#039;,
	columnSort: false,
	loadingText: &#039;Updating tracklist&#039;,
	tpl: new Ext.XTemplate(
	&#039;&lt;tpl for=&quot;rows&quot;&gt;&#039;,
		&#039;&lt;/tpl&gt;&amp;lt;tpl exec=&quot;values.row = xindex;&quot;&gt;&#039;,
			&#039;&lt;dl&gt;&#039;,
				&#039;&lt;tpl for=&quot;parent.columns&quot;&gt;&#039;,
				&#039;&lt;dt style=&quot;width:{[values.width*100]}%;text-align:{align};&quot;&gt;&#039;,
				&#039;&lt;em unselectable=&quot;on&quot;&lt;tpl if=&quot;cls&quot;&gt;&#039;,
                                &#039; class=&quot;{cls}&lt;/em&gt;&lt;/dt&gt;&lt;/tpl&gt;&quot;&gt;&#039;,
					&#039;{[values.tpl.apply(parent)]}&#039;,
				&#039;&lt;div class=&quot;x-clear&quot;&gt;&lt;/div&gt;&#039;,
			&#039;&lt;/dl&gt;&#039;,
		&#039;&#039;
	),
	columns: [
	{
		header: &#039;Track #&#039;,
		width: 0.04,
		align: &#039;left&#039;,
		dataIndex: &#039;row&#039;
	},{
		header: &#039;Artist&#039;,
		width: 0.48,
		align: &#039;left&#039;,
		dataIndex: &#039;artist&#039;
	},{
		header: &#039;Track&#039;,
		width: 0.48,
		align: &#039;left&#039;,
		dataIndex: &#039;track&#039;
	}]
});
</pre>
<p>This code is a bit more complicated than I expected because by default Ext.ListView does not with the Ext.grid.RowNumberer, so after a bit of google-fu I discovered a post showing how to achieve this using the tpl property.</li>
<li><strong>Getting all the possible Essential Mixes</strong><br />I decided I&#8217;d add a TreePanel so you can pick other essential mixes and view their tracks too. To do this I needed to jump back to firebug and YQL to get the available tracklists. In short my YQL query ended up being
<pre class="brush: sql">select * from html where url=&quot;http://www.bbc.co.uk/programmes/b006wkfp/episodes/2009&quot; and xpath=&#039;//a[@class=&quot;url&quot;]&#039;</pre>
</li>
<li><strong>Getting the TreePanel to pull in the data from YQL</strong><br /> Again this is something I thought was going to be tough, but after looking at a few blog posts and examples I realised it was possible. My final TreeLoader implementation looks like:
<pre class="brush: javascript">
Ext.ux.mattgoldspink.bbcessentialmix.TreeLoader = function(){
	Ext.ux.mattgoldspink.bbcessentialmix.TreeLoader.superclass.constructor.call(this);
	this.proxy = new Ext.data.ScriptTagProxy({
		url : this.dataUrl,
		callbackParam: &#039;callback&#039;,
		restful: true
	});
};
Ext.extend(Ext.ux.mattgoldspink.bbcessentialmix.TreeLoader, Ext.tree.TreeLoader, {
	dataUrl: &#039;http:&#039;+&#039;//query.yahooapis.com/v1/public/yql?&#039;
+&#039;q=select%20*%20from%20html%20where%20url%3D&#039;
+&#039;%22http%3A%2F%2Fwww.bbc.co.uk%2Fprogrammes&#039;
+&#039;%2Fb006wkfp%2Fepisodes%2F2010%22%20and%0A&#039;
+&#039;%20%20%20%20%20%20xpath%3D\&#039;%2F%2Fa%5B&#039;
+&#039;%40class%3D%22url%22%5D\&#039;&amp;format=json&#039;,
	requestData : function(node, cb){
		this.proxy.setApi(
                     Ext.data.Api.actions.read,
                     &#039;http&#039;+&#039;://query.yahooapis.com/v1/public/yql?&#039;
+&#039;q=select%20*%20from%20html%20where%20url&#039;
+&#039;%3D%22http%3A%2F%2Fww&#039;
+&#039;w.bbc.co.uk%2Fprogrammes%2F&#039;
+&#039;b006wkfp%2Fepisodes%2F&#039; + node.attributes.nodeid
+ &#039;%22%20and%0A%20%20%20%20%20&#039;
+&#039;%20xpath%3D\&#039;%2F%2Fa%5B%40class&#039;
+&#039;%3D%22url%22%5D\&#039;&amp;format=json&#039;);
		this.proxy.request(&#039;read&#039;, null, {}, {
			readRecords : function(o){
				return o.query.results.a;
			}
		}, this.addNodes, this, {node:node, cb:cb});
	},
	addNodes : function(o, arg){
		var node = arg.node;
		for(var i = 0, len = o.length; i &lt; len; i++){
			var foo = {};
			foo.text = o[i].span.content,
			foo.url =  o[i].href.replace(&quot;/programmes/&quot;, &#039;&#039;);
			foo.leaf = true;
			var n = this.createNode(foo);
			if(n){
				node.appendChild(n);
			}
		}
		arg.cb(this, node);
	}
});
</pre>
<p>The key bits here are that before I request data for a node I change the YQL query to pick up the data for the year node that was clicked. Then once the results come back I pull out the results node from the JSON and in my addNodes function I set up leaf node.</li>
<li><strong>The onclick callback to reload the ListView with new tracklists</strong><br />When someone clicks one of these new tracklist nodes in the TreePanel we want to update the ListView. This was done by adding a listener to the TreePanel:
<pre class="brush: javascript">
listeners: {
	click: function(n) {
		Ext.getCmp(&#039;listview&#039;).getStore().proxy.setApi(
                     Ext.data.Api.actions.read,
&#039;http://query.yahooapis.com/v1/public/yql?&#039;
+&#039;q=select%20*%20from%20html%20where&#039;
+&#039;%20url%3D%22http%3A%2F%2Fww&#039;
+&#039;w.bbc.co.uk%2Fprogrammes%2F&#039; + n.attributes.url
+&#039;%22%20and%0A%20%20%20%20%20%20&#039;
+&#039;xpath%3D\&#039;%2F%2Fdiv%5B%40class%3D&#039;
+&#039;%22title%22%20or%20%40class%3D&#039;
+&#039;%22title%20with-image%22%5D\&#039;&amp;format=json&#039;);
		Ext.getCmp(&#039;listview&#039;).getStore().load();
	}
}
</pre>
<p>We simply change the read action url in the ListView store&#8217;s proxy, then we reload the store! As simple as that.</li>
</ol>
<p>To wrap it up I put it all in an Ext.Viewport. Feel free to view the source of the page and enjoy!<br />
<a href="http://www.mattgoldspink.co.uk/bbcradiolastfm.html">http://www.mattgoldspink.co.uk/bbcradiolastfm.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mattgoldspink.co.uk/2010/06/16/playing-with-ext-js-yql-and-bbc-radio1-essential-mix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tomcat6 issues upgrading to Ubuntu 10.4 Lucid Lynx</title>
		<link>http://www.mattgoldspink.co.uk/2010/05/03/tomcat6-issues-upgrading-to-ubuntu-10-4-lucid-lynx/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tomcat6-issues-upgrading-to-ubuntu-10-4-lucid-lynx</link>
		<comments>http://www.mattgoldspink.co.uk/2010/05/03/tomcat6-issues-upgrading-to-ubuntu-10-4-lucid-lynx/#comments</comments>
		<pubDate>Mon, 03 May 2010 20:07:21 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Subsonic]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://www.mattgoldspink.co.uk/?p=1178</guid>
		<description><![CDATA[I thought I&#8217;d post this in case anyone else hits similar issues upgrading to Ubuntu 10.4. So after following all the steps I decided to keep my existing tomcat6 script under /etc/init.d/tomcat6 because I&#8217;d customised it for launching Subsonic Music Server. However after restarting my machine after upgrading I noticed subsonic was not running. So [...]]]></description>
			<content:encoded><![CDATA[<p>I thought I&#8217;d post this in case anyone else hits similar issues upgrading to Ubuntu 10.4. So after following all the steps I decided to keep my existing tomcat6 script under /etc/init.d/tomcat6 because I&#8217;d customised it for launching <a href="http://www.subsonic.org/">Subsonic Music Server</a>. However after restarting my machine after upgrading I noticed subsonic was not running. So I dug a bit deeper and found that I was missing the jsvc package. Running:</p>
<p>sudo apt-get install jsvc</p>
<p>got me sorted and Subsonic is back alive!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mattgoldspink.co.uk/2010/05/03/tomcat6-issues-upgrading-to-ubuntu-10-4-lucid-lynx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Broken Home DJ Set</title>
		<link>http://www.mattgoldspink.co.uk/2010/01/25/broken-home-dj-set/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=broken-home-dj-set</link>
		<comments>http://www.mattgoldspink.co.uk/2010/01/25/broken-home-dj-set/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 01:03:22 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Mix]]></category>

		<guid isPermaLink="false">http://www.mattgoldspink.co.uk/?p=1103</guid>
		<description><![CDATA[This is a mix which I did in a club back in Macclesfield in 2001 for a club night called Broken Home. The recording is me preparing in my bedroom a day or two beforehand so excuse the bad scratching and FX. Broken Home Set (demo) 2001  by  mattgoldspink]]></description>
			<content:encoded><![CDATA[<p>This is a mix which I did in a club back in Macclesfield in 2001 for a club night called Broken Home. The recording is me preparing in my bedroom a day or two beforehand so excuse the bad scratching and FX.</p>
<p><object height="81" width="100%"><param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fsoundcloud.com%2Fmattgoldspink%2Fbroken-home-set-demo-2001&#038;"></param><param name="allowscriptaccess" value="always"></param> <embed allowscriptaccess="always" height="81" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fsoundcloud.com%2Fmattgoldspink%2Fbroken-home-set-demo-2001&#038;" type="application/x-shockwave-flash" width="100%"></embed></object>  <span><a href="http://soundcloud.com/mattgoldspink/broken-home-set-demo-2001">Broken Home Set (demo) 2001</a>  by  <a href="http://soundcloud.com/mattgoldspink">mattgoldspink</a></span> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mattgoldspink.co.uk/2010/01/25/broken-home-dj-set/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>All Vinyl Mix &#8211; KISS (2004 REMIX) by PRINCE is now in stock</title>
		<link>http://www.mattgoldspink.co.uk/2009/10/25/all-vinyl-mix-kiss-2004-remix-by-prince-is-now-in-stock/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=all-vinyl-mix-kiss-2004-remix-by-prince-is-now-in-stock</link>
		<comments>http://www.mattgoldspink.co.uk/2009/10/25/all-vinyl-mix-kiss-2004-remix-by-prince-is-now-in-stock/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 11:54:15 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Mix]]></category>
		<category><![CDATA[agent sumo]]></category>
		<category><![CDATA[cut and paste]]></category>
		<category><![CDATA[dub pistols]]></category>
		<category><![CDATA[Freeland]]></category>
		<category><![CDATA[layo and bushwacka]]></category>
		<category><![CDATA[plump djs]]></category>
		<category><![CDATA[propellerheads]]></category>
		<category><![CDATA[scanty sandwich]]></category>
		<category><![CDATA[Soul Of Man]]></category>
		<category><![CDATA[Supercharger]]></category>

		<guid isPermaLink="false">http://www.mattgoldspink.co.uk/?p=1047</guid>
		<description><![CDATA[I finally tracked down a copy of the Soul Of Man Remix of Prince&#8217;s Kiss a few weeks back after first hearing it on the Cut &#038; Paste essential mix on Radio 1 back in 2000 (I didn&#8217;t realise it was a full 9 years ago!!). It took 5 years to figure out it was [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mattgoldspink.co.uk/downloads/KISS%20(2004%20REMIX)%20by%20PRINCE%20is%20now%20in%20stock"><img src="http://www.mattgoldspink.co.uk/blog/wp-content/uploads/2009/10/Prince-Kiss-409478-300x300.jpg" alt="Prince - Kiss" title="Prince - Kiss" width="300" height="300" class="alignright size-medium wp-image-1051" /></a>I finally tracked down a copy of the Soul Of Man Remix of Prince&#8217;s Kiss a few weeks back after first hearing it on the Cut &#038; Paste essential mix on Radio 1 back in 2000 (I didn&#8217;t realise it was a full 9 years ago!!). It took 5 years to figure out it was a remix by Soul of Man (the tracklist for the essential mix lists it simply as &#8220;Kiss&#8221; &#8211; <a href="http://www.mixesdb.com/db/index.php/2000-06-11_-_Cut_And_Paste_-_Essential_Mix">http://www.mixesdb.com/db/index.php/2000-06-11_-_Cut_And_Paste_-_Essential_Mix</a>). Then after trawling few forums years ago I narrowed it down to being this record on HTFR: </p>
<p><a href="http://www.htfr.com/more-info/?catno=MR227279">http://www.htfr.com/more-info/?catno=MR227279</a></p>
<p>Unfortunately it was not in stock and was noted as being DELETED. Given the track was a white label I expected it to never re-surface but since htfr have the option to add something to your wishlist I do so anyway. 4 and half years later an email pops into my inbox saying</p>
<p><strong>KISS (2004 REMIX) by PRINCE is now in stock</strong></p>
<p>Buy buy buy!!!! So I did and i got it! </p>
<p>Anyway, since I can only get it on vinyl I figured I should have a play on the wheels of steel and made a quick mix and upload it as usual. So here is a mix with the Kiss track about 1/2 way through. Enjoy!</p>
<p>Download link: <a href="http://www.mattgoldspink.co.uk/downloads/KISS%20(2004%20REMIX)%20by%20PRINCE%20is%20now%20in%20stock">KISS (2004 REMIX) by PRINCE is now in stock.mp3</a> (mp3, 38Mb, 40min)</p>
<p>Tracklist:</p>
<ol>
<li>Hypocrites (Naked Funk Remix) &#8211; Junior Delgado</li>
<li>To The Beat (The Light Mix) &#8211; PFN</li>
<li>My House Is Your House &#8211; Phil Keiron</li>
<li>Disciples of the watch &#8211; The Insiders</li>
<li>Let The Good Times Rol &#8211; Layo And Bushwacka!</li>
<li>Under Control &#8211; Freeland</li>
<li>Widemouth (Dub Pistols Muthafuckin&#8217; mix) &#8211; Supercharger</li>
<li><strong>KISS (2004 REMIX) &#8211; PRINCE</strong> (Remix is actually by Soul Of Man)</li>
<li>Scram &#8211; Plump DJs</li>
<li>Lethal Cut &#8211; Propellerheads</li>
<li>Because of You &#8211; Scanty Sandwich</li>
<li>Mayhem &#8211; Agent Sumo</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.mattgoldspink.co.uk/2009/10/25/all-vinyl-mix-kiss-2004-remix-by-prince-is-now-in-stock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
