phonotunes.php: phonostar-Player Aufnahmen in iTunes als Podcast verfügbar machen

Ich bin ein großer Fan des phonostar-Player. Mit diesem Programm kann man sehr bequem Radiosendungen aufnehmen. Da ich einen iPod nutze, musste ich die Aufnahmen bisher umständlich in eine Playliste im iTunes importieren. Dadurch habe ich aber keine Übersicht über schon gespielte Folgen und kann längere Hörspiele nicht mal eben in der Mitte unterbrechen und später an der Stelle fortsetzen. Wie schön läuft das dagegen bei einem Original Audio Podcast – z.B. dem des ARD Radio-Tatort. Automatisch lädt die neueste Folge und wird synchronisiert, bereits angehörte Folgen werden automatisch entfernt.

Ich habe daher ein wenig geschraubt und ein PHP-Script geschrieben mit dem ich meine phonostar-Player-Aufnahmen meinem iTunes in Form eines lokalen Audio-Podcasts unterschiebe. Ein Beitrag von digitaltoast hat mich da sehr schnell auf die richtige Spur gesetzt.

Voraussetzung: ein lokaler Webserver mit PHP Unterstützung. Ich habe dafür den IIS auf meinem Windows 7 konfiguriert.

Installation (IIS): Ich habe in meinem Webserver-Verzeichnis den Ordner phonotunes erstellt, die phonotunes.php dorthin kopiert und über den IIS Manager dort ein virtuelles Verzeichnis „Aufnahmen“ eingehängt, dass auf den Aufnahmenordner des phonostar-Player zeigt. Danach zeigt „http://localhost/phonotunes/Aufnahmen“ auf „D:\\Temp\\radiostreams\\phonostar\\Aufnahmen“.

Und schon kann man im iTunes den Link http://localhost/phonotunes/phonotunes.php hinzufügen und mit seinem iPod synchronisieren.

Verbesserungsvorschläge willkommen!

[sourcecode language=“php“]
<?php
/**
* phonotunes – generate iTunes compatible audio podcasts based on phonostar-Player recordings
*
* Copyright 2010 Tobias Harmes
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @author Tobias Harmes, tobias@harmes.de
* @link https://harmes.de
* @version 2010-05-16
* @license Apache License, Version 2.0
*/

//change this to your needs
define (‚RECORDINGS‘, ‚D:\\Temp\\radiostreams\\phonostar\\Aufnahmen‘);
define(‚URLBASE‘,’http://localhost/phonotunes/Aufnahmen‘);

/**
* traverse sub-dirs and build up xml object
*
* @param $start directory to start at
* @param $xml_generator XML document object <by ref>
* @param $win32 determines slash, defaults to true
*/
function directoryList($start,&$xml_generator,$win32=true){
if($win32){
$slash="\\";
}else{
$slash="/";
}
$basename = pathinfo($start);
$basename = $basename[‚basename‘];
$ls=array();
$dir = dir($start);
while($item = $dir->read()){
if(is_dir($start.$slash.$item)&& $item!="." && $item!=".."){
$ls[$basename][]=directoryList($start.$slash.$item,&$xml_generator,$win32);
}else{
if($item!="."&&$item!=".."){
$ls[$basename][]=$item;
$itempath = $start.$slash.$item;
//remove default path
$itemurl = str_replace(RECORDINGS, "", $itempath);
//encode all funny characters and spaces
$itemurl = rawurlencode($itemurl);
//restore the slashes
$itemurl = str_replace(rawurlencode($slash),"/",$itemurl);
$itemurl = URLBASE.$itemurl;

$itempathinfo = pathinfo($itempath);
$recording = $xml_generator->addChild(‚item‘);
$title = str_replace("_"," ",$itempathinfo[‚filename‘]);
//remove the leading date if any
if (preg_match(‚/^\d{4}-\d{2}-\d{2}.*/‘,$title))
{
$title = substr($title, strlen("yyyy-mm-dd")+1);
}
$recording->addChild(‚title‘, $title);
$recording->addChild(‚pubDate‘, date(DATE_RFC822, filemtime($itempath)));
//if this is a regular recording use the folder name
$description = substr($start, strlen(RECORDINGS)+1);
$description = str_replace("_"," -",$description);
$recording->addChild(‚description‘, $description);
$recording->addChild(‚link‘, $itemurl);
$enclosure = $recording->addChild(‚enclosure‘);
$enclosure->addAttribute(‚url‘, $itemurl);
$enclosure->addAttribute(‚length‘, filesize($itempath));
$enclosure->addAttribute(‚type‘, ‚audio/mpeg‘);
}
}
}
return $ls;
}//directoryList

$xml_string ='<?xml version="1.0" encoding="UTF-8"?>‘."\r\n"."<channel>"."\r\n"."</channel>";
$xml_generator = new SimpleXMLElement($xml_string);
$xml_generator->addChild(‚title‘, ‚phonotunes radio podcast‘);
$xml_generator->addChild(‚category‘, ‚Audio Podcasts‘);

$dirlist = directoryList(RECORDINGS,$xml_generator, true);

header("Content-Type: text/xml");
$xml_result = $xml_generator->asXML();
$xml_LeftHandSide = ‚<?xml version="1.0" encoding="UTF-8"?>‘."\r\n".'<rss xmlns:itunes="http://www.itunes.com/DTDs/podcast-1.0.dtd" version="2.0">‘;
$xml_RightHandSide = substr($xml_result, 39);
echo $xml_LeftHandSide . $xml_RightHandSide . "</rss>";
?>
[/sourcecode]