Winnie | 13.07.2008
Das alte Studio steht nicht mehr, Kathrin Bauerfeind ist schon lange zur Old-Media-Konkurrenz gewechselt. Und mein alter Feed läuft nach dem Relaunch der Website auch nicht mehr – die Dateien gibt es jetzt nur noch gezippt.
Deswegen gibt es hier ein Update, das zumindest den Mac-Usern etwas weiterhilft. Zumindest unter Leopard. Alle anderen können das Skript mit mehr oder weniger Aufwand ans eigene System anpassen.
Mehr »
Das alte Studio steht nicht mehr, Kathrin Bauerfeind ist schon lange zur Old-Media-Konkurrenz gewechselt. Und mein alter Feed läuft nach dem Relaunch der Website auch nicht mehr - die Dateien gibt es jetzt nur noch gezippt.
Deswegen gibt es hier ein Update, das zumindest den Mac-Usern etwas weiterhilft. Zumindest unter Leopard. Alle anderen können das Skript mit mehr oder weniger Aufwand ans eigene System anpassen.
Lokalen Webserver mit PHP aktivieren
Terminal öffnen
sudo pico /etc/apache2/httpd.conf um die Config-Datei des lokalen Webservers zu bearbeiten. Dafür wird noch ein Admin-Passwort abgefragt.
mit Ctrl + W nach 'php' suchen
das Kommentarzeichen ’#' am Anfang der Zeile entfernen
mit Ctrl + X, und dann mit Y und dann Enter speichern
in den Systemeinstellungen unter 'Sharing' den Punkt 'Web-Sharing' aktivieren
die lokale Adresse (z.B. http://192.168.1.1/~username/) merken
Das Podcastskript (feed.php herunterladen und in ~/Sites/podcastfeed/feed.php speichern. Der Ordner braucht Schreibrechte für den Webserver-User. In den ersten paar Zeilen müssen noch die richtigen Servernamen und so für deine Lieblings-Internet-Fernsehsendung eingetragen werden.
Zusätzliche Klassen installieren
SimplePie laden und unter ~/Sites/podcastfeed/class/simplepie.class.php speichern
rss_writer.class.php laden und unter ~/Sites/podcastfeed/class/rss_writer.class.php speichern - die Klasse basiert auf der FeedCreator.class.php von Kai Blankenhorn
In dem podcastfeed-Ordner müssen außerdem noch zwei Unterordner cache und files, jeweils mit vollen Schreib- und Leserechten angelegt werden.
Podcast in iTunes abonnieren
Unter 'Erweitert | Podcast abonnieren' die Feed-Adresse vom eigenen Rechner eintragen, z.B. http://192.168.1.1/~username/podcastfeed/feed.php
iTunes wird jetzt beim ersten Aufruf noch keine Folgen finden, sie werden aber im Hintergrund heruntergeladen und auf dem eigenen Rechner ausgepackt.
Beim nächsten Update von iTunes werden die ersten Folgen erscheinen, die schon heruntergeladen sind.
Das Skript behält immer die letzten 10 Folgen auf dem System.
Obacht: Das Aktivieren des lokalen Webservers ist evtl. nicht jedermanns Sache, andererseits - wer bis hierher durchgehalten hat, weiß hoffentlich, was er tut.
Wenns nicht läuft - Das Apache-Log könnt ihr mit der Konsole in /var/log/apache2/ einsehen.
Ich bin Winnie. Das war mein Podcastskript. Tschüß.
out();
header("Content-type: $contentType");
echo $xml;
}
function header()
{
$out = '' . "\n";
$out .= '' . "\n";
return $out;
}
function footer()
{
return '';
}
}
class RSSItem
{
var $title;
var $link;
var $description;
var $pubDate;
var $guid;
var $tags;
var $attachment;
var $length;
var $mimetype;
function RSSItem()
{
$this->tags = array();
}
function setPubDate($when)
{
if(strtotime($when) == false)
$this->pubDate = date("D, d M Y H:i:s ", $when) . "GMT";
else
$this->pubDate = date("D, d M Y H:i:s ", strtotime($when)) . "GMT";
}
function getPubDate()
{
if(empty($this->pubDate))
return date("D, d M Y H:i:s ") . "GMT";
else
return $this->pubDate;
}
function addTag($tag, $value)
{
$this->tags[$tag] = $value;
}
function out()
{
$out .= "\n";
$out .= "" . $this->title . "\n";
$out .= "" . $this->link . "\n";
$out .= "" . $this->description . "\n";
$out .= "" . $this->getPubDate() . "\n";
if($this->attachment != "")
$out .= "";
if(empty($this->guid)) $this->guid = $this->link;
$out .= "" . $this->guid . "\n";
foreach($this->tags as $key => $val) $out .= "$val";
$out .= "\n";
return $out;
}
function enclosure($url, $mimetype, $length)
{
$this->attachment = $url;
$this->mimetype = $mimetype;
$this->length = $length;
}
}
?>
encoding = ($uFeed->get_encoding()?$uFeed->get_encoding():'UTF-8');
$rss->title = $uFeed->get_title();
$rss->link = $uFeed->get_permalink();
$rss->description = $uFeed->get_description();
$rss->language = $uFeed->get_language();
if ($uFeed->data) {
$items = $uFeed->get_items();
foreach($items as $thisItem) {
$rssItem = new RSSItem();
$locEnclosureLink = getEnclosureLink($thisItem->get_categories());
// Datei aus Feed in System vorhanden, dann in Feed aufnehmen
if (in_array($locEnclosureLink.VIDEO_EXTENSION, $locFiles))
{
$rssItem->title = $thisItem->get_title();
$rssItem->link = $thisItem->get_link();
$rssItem->setPubDate($thisItem->get_date());
$rssItem->description = "";
if (!is_null($locEnclosureLink)) {
$rssItem->enclosure(WEB_PATH.$uFolder.$locEnclosureLink.VIDEO_EXTENSION, BLOG_VIDEO_TYPE, 12);
}
$rss->addItem($rssItem);
}
}
}
echo $rss->serve();
}
// liefert den Original-RSS-Feed mit Enclosures
function showRssFromOrginalFeed(&$uFeed)
{
header('Content-type: text/xml');
$rss = new RSS();
$rss->encoding = ($uFeed->get_encoding()?$uFeed->get_encoding():'UTF-8');
$rss->title = $uFeed->get_title();
$rss->link = $uFeed->get_permalink();
$rss->description = $uFeed->get_description();
$rss->language = $uFeed->get_language();
if ($uFeed->data) {
$items = $uFeed->get_items();
foreach($items as $thisItem) {
$rssItem = new RSSItem();
$rssItem->title = $thisItem->get_title();
$rssItem->link = $thisItem->get_link();
$rssItem->setPubDate($thisItem->get_date());
$rssItem->description = "";
if (!is_null($locEnclosureLink = getEnclosureLink($thisItem->get_categories()))) {
$rssItem->enclosure(BLOG_VIDEO_URL.$locEnclosureLink.BLOG_VIDEO_DOWNLOAD_EXTENSION, BLOG_VIDEO_TYPE, 12);
}
$rss->addItem($rssItem);
}
}
echo $rss->serve();
}
// liefert den Enclosure-Link zurück
function getEnclosureLink(&$uEnclosure) {
$locEnclosureLink = null;
$locEnclosure = $uEnclosure;
if (isset($locEnclosure[0])) {
if (is_array($locEnclosure)) {
for ($i=0; $i < count($locEnclosure); $i++) {
//echo $i;
$locItem = $locEnclosure[$i];
if (is_object($locItem)) {
if (isset($locItem->term)) {
if (strpos($locItem->term, date("Y")) !== false) {
$locEnclosureLink = $locItem->term;
}
}
}
}
}
}
return $locEnclosureLink;
}
// läd die Dateien aus dem Feed, die noch nicht im System liegen
// bzw. wenn Datei nicht im Feed aber im System dann löschen
function getFilesFromFeed(&$uFeed) {
$locFilesInSystem = getFileListFromSystem(VIDEO_URL, true, VIDEO_EXTENSION);
$locFilesInFeed = getFileListFromFeed($uFeed, BLOG_VIDEO_DOWNLOAD_EXTENSION, true);
// welche Dateien sind im System aber nicht im Feed
$locDiffSystemToFeed = array_diff($locFilesInSystem, $locFilesInFeed);
// welche Dateien sind im Feed aber nicht im System
$locDiffFeedToSystem = array_diff($locFilesInFeed, $locFilesInSystem);
// Datei, die nicht im Feed sind vom System löschen
foreach ($locDiffSystemToFeed as $item) {
@unlink(VIDEO_URL.$item.VIDEO_EXTENSION);
}
$locExec = "#!/bin/bash\n";
// Datei, die nicht im System sind aus Feed holen
foreach ($locDiffFeedToSystem as $item) {
$submit_url = BLOG_VIDEO_URL.$item.BLOG_VIDEO_DOWNLOAD_EXTENSION;
$save_path = VIDEO_URL.$item.BLOG_VIDEO_DOWNLOAD_EXTENSION;
$locExec .= "/usr/bin/curl ".$submit_url." -o ".$save_path." -L\n"; // Datei laden
$locExec .= "/usr/bin/unzip ".$save_path." *".VIDEO_EXTENSION." -d ".VIDEO_URL."\n"; // Datei entzippen
$locExec .= "rm ".$save_path."\n\n"; // Zip löschen
}
// in eine Datei schreiben und Datei als Script ausführen
if (count($locDiffFeedToSystem) > 0) {
$handle = fopen (ABSOLUTE_PATH."loadFeedFiles.sh", "w");
fputs($handle, $locExec);
fclose($handle);
@chmod (ABSOLUTE_PATH."loadFeedFiles.sh", 0777);
// Script ausführen
exec("./loadFeedFiles.sh > /dev/null &");
}
}
// gibt alle Dateien aus dem Feed als Array zurück
function getFileListFromFeed(&$uFeed, $uExtension="", $uBasename=false) {
$files = array();
if ($uFeed->data) {
$items = $uFeed->get_items();
foreach($items as $thisItem) {
if (!is_null($locEnclosureLink = getEnclosureLink($thisItem->get_categories()))) {
$files[] = $locEnclosureLink.(($uBasename)?"":$uExtension);
}
}
}
return $files;
}
// gibt alle Dateien aus dem Ordner als Array zurück
function getFileListFromSystem($uFolder, $uBasename=false, $uExtension="") {
$files = array();
if($dir = opendir($uFolder))
{
while($file = readdir($dir))
{
if (!is_dir($file) && $file != "." && $file != ".." && $file != ".DS_Store" & $file != "__MACOSX")
{
$files[] = (($uBasename)?basename($file, $uExtension):$file);
}
}
closedir($dir);
}
return $files;
}
?>
Kategorien: Blog | 4 Kommentare