chronx code and stuff

4Jan/104

Want XSPF playlists from playlist.com ?

Posted by oxchronxo

Recently I found that I could not use the playlists I had created on playlist.com in my media player. The quick and short of this is that they are not providing a standardized XSPF format in their RSS feed.
All I really had to do was determine how to decrypt their hash which was pretty easy thanks to OneWeirdKid90, rename a few fields, and export a correctly formatted XSPF file. Below is the resultant code. I am using the script to access all the playlists on this site via playlist.com.

function hexToChars($hex) {
	$a = array();
	$b = (substr($hex, 0, 2) == "0x") ? 2 : 0;
	while ($b < strlen($hex)) {
		array_push($a, intval(substr($hex, $b, 2), 16));
		$b += 2;
	}
	return $a;
}
 
function charsToStr($chars) {
	$a = "";
	$b = 0;
	while ($b < count($chars)) {
		$a .= chr($chars[$b]);
		++$b;
	}
	return $a;
}
 
function strToChars($str) {
	$a = array();
	$b = 0;
	while ($b < strlen($str)) {
		array_push($a, ord($str[$b]));
		++$b;
	}
	return $a;
}
 
function calculate($plaintxt, $psw) {
	$sbox = array();
	$mykey = array();
 
	$a = 0;
	$b;
	$c = count($psw);
	$d = 0;
	while ($d <= 255) {
		$mykey[$d] = $psw[$d % $c];
		$sbox[$d] = $d;
		++$d;
	}
	$d = 0;
	while ($d <= 255) {
		$a = ($a + $sbox[$d] + $mykey[$d]) % 256;
		$b = $sbox[$d];
		$sbox[$d] = $sbox[$a];
		$sbox[$a] = $b;
		++$d;
	}
 
	$a = 0;
	$b = 0;
	$c = array();
	$d;
	$e;
	$f;
	$g = 0;
	while ($g < count($plaintxt)) {
		$a = ($a + 1) % 256;
		$b = ($b + $sbox[$a]) % 256;
		$e = $sbox[$a];
 
		$sbox[$a] = $sbox[$b];
 
		$sbox[$b] = $e;
		$h = ($sbox[$a] + $sbox[$b]) % 256;
		$d = $sbox[$h];
		$f = $plaintxt[$g] ^ $d;
		array_push($c, $f);
		++$g;
	}
	return $c;
}
 
function decrypt($src, $key) {
	return charsToStr(calculate(hexToChars($src), strToChars($key)));
}
 
$hashKey = "sdf883jsdf22";
 
$playlist = $_GET["playlist"];
if (!$playlist) {
	exit;
}
$url = "http://pl.playlist.com/pl.php?playlist=".$playlist;
 
$dom = new DOMDocument("1.0", "UTF-8");
$dom->formatOutput = true;
 
$playlist = $dom->createElement("playlist");
$playlist->setAttribute("version", "0");
$playlist->setAttribute("xmlns", "http://xspf.org/ns/0/");
$dom->appendChild($playlist);
 
$metaCacheControl = $dom->createElement("meta");
$metaCacheControl->setAttribute("http-equiv", "Cache-Control");
$metaCacheControl->setAttribute("content", "no-cache");
$playlist->appendChild($metaCacheControl);
 
$metaPragma = $dom->createElement("meta");
$metaPragma->setAttribute("http-equiv", "Pragma");
$metaPragma->setAttribute("content", "no-cache");
$playlist->appendChild($metaPragma);
 
$info = $dom->createElement("info", $url);
$playlist->appendChild($info);
 
$contents = file_get_contents($url, "r");
if (!empty($contents)) {
	$xml = new SimpleXMLElement($contents);
	if (!empty($xml)) {
		$title = $dom->createElement("title", $xml->title);
		$playlist->appendChild($title);
 
		$trackList = $dom->createElement("trackList");
		$playlist->appendChild($trackList);
 
		if ($xml->trackList && (count($xml->trackList) > 0)) {
			foreach ($xml->trackList->track as $item) {
				$track = $dom->createElement("track");
				$trackList->appendChild($track);
 
				$location = $dom->createElement("location");
				$usableLocation = empty($item->location) ? $item->originallocation : decrypt($item->location, $hashKey);
				$location->appendChild($dom->createTextNode($usableLocation));
				$track->appendChild($location);
 
				$title = $dom->createElement("title");
				$title->appendChild($dom->createTextNode($item->tracktitle));
				$track->appendChild($title);
 
				$creator = $dom->createElement("creator");
				$creator->appendChild($dom->createTextNode($item->artist));
				$track->appendChild($creator);
 
				/*
				$duration = $dom->createElement("duration");
				$creator->appendChild($dom->createTextNode($item->duration));
				$track->appendChild($duration);
				*/
 
				/*
				$album = $dom->createElement("album");
				$creator->appendChild($dom->createTextNode($item->album));
				$track->appendChild($album);
				*/
 
				/*
				$image = $dom->createElement("image");
				$creator->appendChild($dom->createTextNode($item->image));
				$track->appendChild($image);
				*/
			}
		}
	}
}
 
header("Content-Type: application/xspf+xml");
 
echo $dom->saveXML();
7Jan/091

TrackFocus

Posted by oxchronxo

An example of the finished product is being used on this site

This is my 5th installment to the Yahoo Media Player.

You can find other extensions here.
TrackResume.
TrackSeek.
TrackShuffle.
TrackLoop.

This forces the currently playing track to be highlighted and scrolled to in the playlist

Step 1) grab these files and drop them on your host

Both of these files need to be included after the Yahoo Media Player. The file ‘ef.ymp.utilities.js’ is needed for manipulating cookies, setting styles, and using MD5 hashes to store UIDs for the tracks.

<script src="http://github.com/oxchronxo/YMP/raw/master/ef.ymp.utilities.js" type="text/javascript"></script>
<script src="http://github.com/oxchronxo/YMP/raw/master/ef.ymp.trackFocus.js" type="text/javascript"></script>

2009-01-07
Scrolling is now animated.

6Jan/093

TrackLoop

Posted by oxchronxo

An example of the finished product is being used on this site

This is my 4th installment to the Yahoo Media Player.

You can find other extensions here.
TrackResume.
TrackSeek.
TrackShuffle.
TrackFocus.

This allows the playlist to repeat after the last song.

Step 1) grab these files and drop them on your host

Both of these files need to be included after the Yahoo Media Player. The file ‘ef.ymp.utilities.js’ is needed for manipulating cookies, setting styles, and using MD5 hashes to store UIDs for the tracks.

<script src="http://github.com/oxchronxo/YMP/raw/master/ef.ymp.utilities.js" type="text/javascript"></script>
<script src="http://github.com/oxchronxo/YMP/raw/master/ef.ymp.trackLoop.js" type="text/javascript"></script>

You will also need the following image if you are hosting the files. Otherwise the image is included from the cloud.

6Jan/091

TrackShuffle

Posted by oxchronxo

An example of the finished product is being used on this site

This is my 3rd installment to the Yahoo Media Player.

You can find other extensions here.
TrackResume.
TrackSeek.
TrackLoop.
TrackFocus.

This provides random shuffling of songs in your playlist. It could allow a song to play again after 20 other different songs have played.

Step 1) grab these files and drop them on your host

Both of these files need to be included after the Yahoo Media Player. The file ‘ef.ymp.utilities.js’ is needed for manipulating cookies, setting styles, and using MD5 hashes to store UIDs for the tracks.

<script src="http://github.com/oxchronxo/YMP/raw/master/ef.ymp.utilities.js" type="text/javascript"></script>
<script src="http://github.com/oxchronxo/YMP/raw/master/ef.ymp.trackShuffle.js" type="text/javascript"></script>

You will also need the following image if you are hosting locally. Otherwise the image is included from the cloud.

17Dec/0831

TrackSeek

Posted by oxchronxo

An example of the finished product is being used on this site

This is my 2nd installment to the Yahoo Media Player.

You can find other extensions here.
TrackResume.
TrackShuffle.
TrackLoop.
TrackFocus.

After posting to a few forums I realized people were also looking for a way to control the seek position in the player. So here it is.

Step 1) grab these files and drop them on your host

Both of these files need to be included after the Yahoo Media Player. The file ‘ef.ymp.utilities.js’ is needed for manipulating cookies, setting styles, and using MD5 hashes to store UIDs for the tracks.

<script src="http://github.com/oxchronxo/YMP/raw/master/ef.ymp.utilities.js" type="text/javascript"</script>
<script src="http://github.com/oxchronxo/YMP/raw/master/ef.ymp.trackSeek.js" type="text/javascript"></script>

2009-01-06
Moved the slider into the main meta panel. Thanks to Stephen Garcia for a little insight into the future state.
Also changed the default color of the slider to a muted grey which matches the playlist and added a highlight color which matches the other greens.

15Dec/082

TrackResume

Posted by oxchronxo

An example of the finished product is being used on this site

This is my 1st installment to the Yahoo Media Player.

You can find other extensions here.
TrackSeek.
TrackShuffle.
TrackLoop.
TrackFocus.

I use a media player on my site for listening to my music wherever I am. For the longest time I was using the flash based version from Lacy Morrow. At some point I wanted to have more than one playlist and so the search began for an alternative that had basically the same features. It needed the following criteria to be met in order for me to use it.

  • small UI footprint
  • xspf playlist support
  • autostart
  • autoresume

My search turned up only disappointment. Then someone at work suggested I give Yahoo's MediaPlayer a try. They suggested EasyListener, but as I searched for this I found a gem; (Y)ahoo (M)edia (P)layer. YMP had everything I wanted excpet that it did not support resuming tracks from page to page. This was a crucial feature I had become dependent on over the years from using Lacy's jukebox.

I read the threads and found that the team was working on this feature, but had no ETA on a good solution. And then... came... trackResume.

This is a little script I wrote that provides track seek recording and resuming. There is obviously a gap in the music when a page reloads, but this is as close as you're going to get without having something running in the browser itself or a frame.

OK, so let's get to it.

Step 1) grab these files and drop them on your host

Both of these files need to be included after the Yahoo Media Player. The file ‘ef.ymp.utilities.js’ is needed for manipulating cookies, setting styles, and using MD5 hashes to store UIDs for the tracks.

<script src="http://github.com/oxchronxo/YMP/raw/master/ef.ymp.utilities.js" type="text/javascript"></script>
<script src="http://github.com/oxchronxo/YMP/raw/master/ef.ymp.trackResume.js" type="text/javascript"></script>

2008-12-21
Corrected problem where pressing pause then play would cause the song to start from the beginning.

2009-01-06
Volume now remains at the last point you adjusted it when resuming tracks.

Hit List Electronic Edgy Emo Chill