« Posts tagged code

My Leeds Hack 2 Project

Thought I would write a blog post about what I built in 24 hours for Leeds Hack 2 last weekend. I kinda got distracted last week and not had the time to write this post.

You can look at all the projects that people finished over on the Leeds Hack Website.

So what did I write

I decided to write something that I had been pondering about for a while. It’s called Spotify Roulette and revolves around the idea of crowd sourcing a new artist or area of music to listen to.

Originally it started off with me posting on Twitter quite a while back asking for something new to listen to, to which @Stanton responded with Hybrid. (I can’t find the original tweet on twitter but it’s here on Spotwitfy) Which are actually quite nice to listen to and I have a nice Spotify playlist to listen to.

I was wondering if there was a way to automate this.

So thru the combination of the Twitter and Spotify Meta Data API’s, means I can post out to Twitter, await a response, parse out the Artist and then pop open Spotify with a random track by that Artist and if the requester wants a playlist can be generated, and thru a limitation in Spotify, drag and dropped into Spotify to listen further to the Artist.

In short

In short its pretty straight forward.
Just a handful of calls to a couple of different API end points to get an Artist ID from the name, then their albums and the tracks on these albums. Chuck in a little GeoIP to hopefully check the tracks are available in the requesters’ region.
Grab the first track, pop open Spotify and grab another 10 tracks to make a playlist.

Finally I used Nerf Guns to help demo! Russian Roulette stylee.

Responses

People on Twitter can either response with text, an artist which we parse out the @user and the hashtag word. Then look that up on Spotify.
Or a response can be either an HTTP open Spotify link or a Spotify protocol link. Either to the artist page, track or album.
if it’s the Artist, I can parse out the artist ID and look for albums and tracks.
Currently not playlist urls, but that’s easy to implement.

Technology

So we used,

  • Twitter API, using @Abraham Twitter oAuth Library
  • Spotify Meta Data API
  • MaxMind GeoIP
  • jQuery and jQuery UI
  • Rick Astley
  • Nerf Guns

Give it a Go

Give it a go and offer me some feedback.
Watch out for Rick Astley tho. He likes to crop up every now and again….

It’s still a little rough round the edges in terms of theme/layout.

Spotify Roulette (http://spotifyroulette.com/)

Future

Hopefully if people like it and use it I can expand further.

Perhaps use Facebook to share playlists, or another way to crowd source a new artist. And if Spotify release a HTTP API for generating and saving playlists then incorporate that too.

Travels of a Commercial WordPress Plugin Developer 1

My job at the moment is updating and coding YourMembers, which is a commercial plugin for WordPress.

Recently I’ve been working on a method to Auto Upgrade the plugin, since commercial plugins cannot go on Extend, and there is no commercial equivalent. Extend being the WordPress plugin repository.

Commercial plugins get no nice little “Plugin needs updating Circle” on the plugins tab, or a nice little message on the plugins page, let alone access to the auto updater!

Which leaves us (commercial plugin devs) to write our own version checkers and hook in accordingly.

So now I have a nice little PHP class which will detect whether it can fwrite/rename and if not if it can FTP instead, much the same as the WordPress updater does.

Now this is all well and good, but I needed a method to download and unzip the new plugin file. Grabbing the file is easy, either file_get_contents (heaven forbid), or curl (yay for curl), and write the file (being a zip) to the web servers temporary directory and process from there.

Now the problem here is how to unzip. A Brief look at how WordPress does it seems to show it has three different methods of unzipping. So dump that.

Didn’t feel the need to use PHP’s ZipArchive class, since I don’t need to edit the zip, just extract its contents.

Off to php.net I go and I find some nice handy functions, and quite surprised to find that the zip_read function can handily recurs into directories within the zip file to return their paths/names. Mildly annoying at the time as I had gone and written a recur loop to go inside directories…. and got thrown a error, nice headdesk moment!

So basically the Zip functions, the basic ones of PHP, are actually quite nice, handy and useful!

Heres my code snippet:

<?php
class someclass() {
	private function unpack() {
		$from = $this->tmp_write;
		$to = $this->tmp_out;
		@mkdir($to);
		
		$zip = zip_open($from);
		if (is_resource($zip)) {
			$this->readzip($zip);
			zip_close($zip);
		} else {
			// failed to open
			$this->error = 1;
		}
	}
	
	private function readzip($zip) {
		$from = $this->tmp_write;
		$to = $this->tmp_out;
		
		echo '</pre><textarea style="width: 100%; height: 100px;">';
		
		while (FALSE !== ($file = zip_read($zip))) {
			$name = zip_entry_name($file);
			echo $name . "\n";
			if (!strpos($name, '.')) {
				// is dir
				@mkdir($to . '/' . $name);
			} else {
				// it recurs into directorys on its own!
				$item = zip_entry_open($zip, $file);
				$size = zip_entry_filesize($file);
				
				$read = zip_entry_read($file, $size);
				$fp = fopen($to . '/' . $name, 'w');
				fwrite($fp, $read);
				fclose($fp);
			}
		}
		
		echo '</textarea><pre>';
	}
}
?>

I just installed this code snippet plugin, which I might need to change its background colours…..

Any suggestions for code snippet plugins greatly appreciated!

Summer

So that middle part of Summer has been a bit sucky. So we shall skip all that, don’t really want to go into it….

Now things are better!

I lost my mac for a week and a half, hard drive failed, followed by back for two hours, followed by hard drive fail.
In the end Clockwork (Leeds Apple Care), replaced the drive and the drive’s cable, and shes all good now!

I’m off to Moor Fest next week, I’m doing the lighting for the Green Room, with Chamsys and whatever fixtures I get given, learnt some useful things from their Chamsys Guide for that matter, (and I fixed up the tab box on the home page for them!) Nice bit of jQuery!

Made a shoutbox for Halo3Wheelmen its hosted on 360gaming.net so had to do a lot of fudging and built a mini phpBB api to get user/ban data out of the forum, its all built in jQuery and PHP, jQuery makes ajax stuff, and append/prepend so much easier than pure javascript.


Job wise I am still waiting to hear back from Firebox.com, but it looks like I shall be staying in Leeds for another year at least, being a Venue Tech, which should, with the new boss, hopefully lead to more external work, but I shall still be working as a freelance web developer. Tho there have been some interesting local jobs come up on the GeekUp jobs Board. (I need to start going to GeekUp again….)

In that vein I currently have a bit of work on building a Asset/Event Manager for LUU Events, details on that to follow, but as a project it keeps me out of trouble, since Google fell thru.

Hopefully I should be getting back into modding phpBB which is even easier now since they now use GitHub to host their repository, so I’m gonna have to get to grips with forks, and loading parent data into the child repo…. (If that makes sense).

So essentially things are busy, not perfect but good. Could be better could be worse…

Hopefully at some point I will get around to doing a Carlyon CMS release candidate, tho I am thinking I need to rip out my CSS boilerplate and thus the relevant core html template files, we shall see.

In other news, I now have completely new graphics for 360gaming [dot] net, I was approached and offered the services of O Sheep Dip, and now I have graphics! Woot!
360gaming.net now has a HogBall league tracker on top of the 1v1 challenger system, tho no one has tested it yet, and I only have the one team, people don’t seem interested…

Tho there is a BTBhub on the way, it was suggested to me that building a BTB league is the way to go, and now I have the core Bungie Code checker, and with the advent of Reach, its data API (POTATO!) and of course, its massive ForgeWorld, the future is bright for Halo and 360gaming.net, now all I need is to find more games with similar developer offerings, and getting myself access to the true Xbox API……

So that summarizes the later part of summer… O and Katie is now home.

Also checkout my tumbleblog

Catch you after Moor Fest, (which will be my first ever festival, I’ve never been to one, and now the first one I am going to is also going to be my first external lighting job….)

Off to watch Sherlock on BBC1

And Happy Birthday to Kayleigh (The GirlFriend) 🙂

Long Time Since I blogged

Again, its been a while. Things have been pretty busy.

Currently I just fixed the LSRfm.com Podcasts, they were downloading a minute or two of audio the PHP was dying, FAST CGI php5 was being ghey.

So after a quick chat with Dreamhost over live chat, my script now rather than munch the file, just passes it off to a http location, less of a memory muncher too.

SRAchart is its usual self, tho we did get a full house of Charts last week, (well near enough), Ellie Goulding and Owl City are dominating, and Glee Started Charting too.

(Yes I am a Glee Fan)

Handed in the Motion Graphics Brief.

So Uni Wise I just need to sit down and code code code, both for Project 2 (ala 360gaming.net enhancements), and start planning and researching what I need for project 2.

And start writing an essay for Futures and Strategies, fun times.

I’ve not had any spare time to play Halo, tho the Reach Beta has been announced! Hurrah!

Now I must get back to coding stuff for LSRfm.com fixed the Jukebox, now to do the music db, tho I do have a nice IRC bot sat in the new LSRfm.com Chatbox

Also <3 jQuery....

Curl, MusicBrainz and PHP

As part of the New Years Resolutions I didn’t make.

I’m updating my blog with some Code Snippets!

Been fiddling about with my PHP powered Jukebox that plays out on LSRfm.com (Leeds Student Radio) Overnight, and there is a need for a bulk track adder.

So, I’ve been tidying up the MusicBrainz Data Fetcher, as well as fiddling with PHP and getting ID3 tags from Files. But thats a different blog post.

Essentially there is a (new-ish non updated recently) PHP Library for the interaction with MusicBrainz, (A music database), recently found that (this morning its rubbish), but of no good.

So went back to my curl method.

Tidyied it up and got it down to a few less lines.

Essentially for a given track, the PHP extracts the ID3 tags, and then passes it to this function: (its needs making into a function btw :-P)

$curl = new curl();

$data = array(
	'title'		=> 'Showdown',
	'artist'	=> 'Pendulum',
	'release'	=> 'In Silico',
	'duration'	=> 327784,
//	'tracknumber'	=> 0,
//	'count'		=> 10,
//	'releasetype'	=> '',

	'limit'		=> 25,
	'limit'		=> 1,
);
$target = 'http://musicbrainz.org/ws/1/track/?type=xml';
foreach ($data as $ref => $dat) {
	$target .= '&' . $ref . '=' . urlencode($dat);
}

                                $curl->target($target);
                                $curl->runit();
                                $mb = $curl->bodyarray['metadata'];

if (isset($mb['track-list'])) {
	$mb = $mb['track-list'];

	if (isset($mb['track']['0'])) {
		$mb = $mb['track'];
		$artist_id = $mb['0']['artist_attr']['id'];
		$song_id = $mb['0_attr']['id'];
	} else {
		$artist_id = $mb['track']['artist_attr']['id'];
		$song_id = $mb['track_attr']['id'];
	}
} else {
	// no data
}

echo "\n" . $artist_id . ' ' . $song_id;

Where new curl() just calls my Curl Class.

I’m sure you have your own ways of doing curl, but mine just sets the target with $curl->target and curlexec() with $curl->runit.

The result is in $curl->body, or exploded nicely as an array in $curl->bodyarray. I’ll post about my curl later! As well as some other Carlyon_CMS stuff.

So thats a quick rough and ready way to get a artist and song ID from MusicBraiz.

Its worth noting that since my limit is st to 1.

The first option of if (isset($mb[‘track’][‘0’]) is entirely redundant, as that only triggers when mb returns more than 1 result.

(I only just added limit before writing this post, which is where I decided to write this post)

The MusicBrainz Docs for its XML service is at: http://musicbrainz.org/doc/XML_Web_Service If your Interested!