Winnie | 10.09.2007
Auch wenn Kathrin Bauerfeind diesen nicht näher genannten Podcast nicht mehr moderiert, so ist er trotzdem einer meiner Lieblingspodcasts. Nur nervt es, sich das Video immer auf der Webseite anschauen zu müssen, weil es keinen Podcastfeed gibt. Aber da kann geholfen werden: ich hab mir einen eigenen Feed mit PHP programmiert und kann nun den Podcast bequem in iTunes laden und anschauen.
So geht’s:
Zum einen brauchst du die PHP-Klasse Snoopy. Die kopierst du auf deinen Webspace in den Ordner “class”. Eine weitere Klasse kommt noch hinzu: xml2obj. Markiere den Quelltext, kopiere sie in einen Texteditor, speichere sie unter dem Dateinamen “xml2obj.class.php” und spiele sie ebenfalls in den Ordner “class” auf deinem Webspace.
Das eigentliche Erstellen des Feeds mit Enclosures für die Videodateien findest du hier:
feed.php. Kopiere dir wieder den Quelltext und spiele ihn in ein neues Dokument in deinen Texteditor. Nun mußt du die URLs “BLOG_RSS_URL” (Zeile 7) und “BLOG_VIDEO_URL” (Zeile 8) von der Podcastwebseite heraussuchen und eintragen. Der Internetauftritt des Podcasts bietet einen normalen Feed an – seine Adresse mußt du bei “BLOG_RSS_URL” eintragen. Die “BLOG_VIDEO_URL” ist die URL zu einem Video sein, aber ohnen den Dateinamen des Films. Damit die Videos auch auf den iPod gesynct werden können, solltest du die Adresse zum Quicktime-Video nehmen. Dann mußt du die Datei unter dem Dateinamen “feed.php” speichern und in den Root-Ordner deines Webspaces spielen. Dann nur noch die “feed.php” im iTunes abonnieren (Advanced -> Subscribe to Podcast) und that’s it.
<?
// wandelt ein XML-String in ein Objekt mit entsprechender Verschachtelungs-Tiefe
// Quelle: user-contribution von php.net (leicht modifiziert)
class xml2obj
{
var $path;
function xml2obj($data, $encoding = "ISO-8859-1") {
$data = str_replace(chr(9), "", $data);
$data = str_replace(chr(10), "", $data);
$data = str_replace(chr(13), "", $data);
$this->path = "\$this->result";
$this->path = "\$this";
$this->index = 0;
$xml_parser = xml_parser_create($encoding);
xml_set_object($xml_parser, $this);
xml_set_element_handler($xml_parser, 'startElement', 'endElement');
xml_set_character_data_handler($xml_parser, 'characterData');
xml_parse($xml_parser, $data, true);
xml_parser_free($xml_parser);
$this->path = null;
$this->_rawXML = $data;
}
function startElement($parser, $tag, $attributeList) {
eval("\$vars = get_object_vars(".$this->path.");");
$this->path .= "->".$tag;
if ($vars and array_key_exists($tag, $vars))
{
eval("\$data = ".$this->path.";");
if (is_array($data))
{
$index = sizeof($data);
$this->path .= "[".$index."]";
}
else if (is_object($data))
{
eval($this->path." = array(".$this->path.");");
$this->path .= "[1]";
}
}
eval($this->path." = null;");
foreach($attributeList as $name => $value)
{
eval($this->path."->".$name." = \$value;");
}
}
function endElement($parser, $tag) {
$this->path = substr($this->path, 0, strrpos($this->path, "->"));
}
function characterData($parser, $data) {
eval($this->path." .= '".trim($data)."';");
}
}
?>
<?
header('Content-type: text/xml');
require_once("class/class-snoopy.php");
require_once("class/xml2obj.class.php");
define("BLOG_RSS_URL", "");
define("BLOG_VIDEO_URL", "");
// mit Snoopy das Blog-RSS laden
$snoopy = new Snoopy;
$submit_url = BLOG_RSS_URL;
$snoopy->fetch($submit_url);
// Blog-RSS in Objekt umwandeln
$xmlObj = new xml2obj($snoopy->results, "UTF-8");
// Podcast-Feed erstellen
show_podcastfeed_xml($xmlObj);
// Podcast-Feed erstellen
function show_podcastfeed_xml($uXmlObj)
{
$locDateArray = array();
echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
?>
<rss<?=((isset($uXmlObj->RSS->VERSION))?' version="'.$uXmlObj->RSS->VERSION.'"':'')?>>
<channel>
<title><?=((isset($uXmlObj->RSS->CHANNEL->TITLE))?$uXmlObj->RSS->CHANNEL->TITLE:'')?></title>
<link><?=((isset($uXmlObj->RSS->CHANNEL->LINK))?$uXmlObj->RSS->CHANNEL->LINK:'')?></link>
<description><?=((isset($uXmlObj->RSS->CHANNEL->DESCRIPTION))?$uXmlObj->RSS->CHANNEL->DESCRIPTION:'')?></description>
<language><?=((isset($uXmlObj->RSS->CHANNEL->LANGUAGE))?$uXmlObj->RSS->CHANNEL->LANGUAGE:'')?></language>
<?
if (isset($uXmlObj->RSS->CHANNEL->ITEM))
{
foreach ($uXmlObj->RSS->CHANNEL->ITEM as $podcast)
{
$locText = $podcast->DESCRIPTION;
$locLink = $podcast->LINK;
$locLinkArray = explode("/", $locLink);
// Datum des Postings für das Videodatum ermitteln
$locDate = $locLinkArray[3]."-".$locLinkArray[4]."-".$locLinkArray[5];
?>
<item>
<title><?=$podcast->TITLE?></title>
<description><![CDATA[<?=html_entity_decode($locText, ENT_QUOTES, "UTF-8")?>]]></description>
<link><?=$locLink?></link>
<?
if (!in_array($locDate, $locDateArray)) {
$locDateArray[] = $locDate;
?>
<enclosure url="<?=BLOG_VIDEO_URL.$locDate?>.mov" length="12" type="video/quicktime"/>
<? } ?>
</item>
<?
}
}
?>
</channel>
</rss>
<?
}
?>
Kategorien: Blog | 2 Kommentare »
Kommentare
22.11.2007 um 15:53
Habs ausprobiert… klappt nicht! Schade!!!
hab
define(“BLOG_RSS_URL”, “feed://www.ehrensenf.de/rss.xml”);
define(“BLOG_VIDEO_URL”, “http://ehrensenf.server-7.video.conserve.de/”);
eingetragen… was hab ich falsch gemacht?
Winnie kannst Du helfen?
22.11.2007 um 22:51
Hallo gentschi,
leider hat Ehrensenf vor kurzem seine Homepage umgestellt und dabei auch den Podcast-Feed geändert. Anstatt wie bisher Quicktime-Videos zum Download anzubieten, werden die Videos jetzt zusätzlich noch in eine ZIP-Datei verpackt (z.B. http://ehrensenf.server-3.video.conserve.de/2007-11-22.mov.zip). Somit können die Videos nicht mehr über meine Feed-Lösung direkt ins iTunes geladen werden.
Ich suche selbst noch nach einer schönen und einfachen Lösung den Podcast wieder zu abonnieren. Sobald ich eine gefunden hab, werde ich sie sofort im Blog posten.
Winnie