oreilly.comSafari Books Online.Conferences.


Indie Podcasting with Open Source
Pages: 1, 2

Putting the Files Up

What makes an audio file a podcast? There isn't anything special about the actual file data. It's still an MP3 (or whatever format). What makes it special and what enables people to subscribe to your podcasts is the RSS (Really Simple Syndication, some would say) 2.00 feed. RSS 2.00 added the enclosure tag that makes the whole thing doable.

There are several easy ways to get your podcasts on the web. If you're already a blogger through one of the organized blogging sites, then most likely there's a section where you can simply upload your podcast files and your site will do the rest. Another easy alternative is to use something such as, which is free and allows you to upload all kinds of video and audio files.

If you're rolling your own, there are a few things to know. (None of it is exactly headache material.)

The first task (assuming you already have web space) is to create a directory for the podcasts. At Mstation, it's podcast_files. You can then use the dircaster PHP script:

// DirCaster v0.4: Automatic iPodder RSS feed maker Written by Ryan King
// id3 class from frummel No license or warrantee
// expressed, implied, enclosed, etc.

// Drop this script in a directory and it will generate an RSS feed suitable for
// iPodder, etc based off the MP3 files in that directory. To 'cast a new
// file, simply upload it to the directory containing this script.

// Feed information is based on id3 tags, requires PHP4 or better. 
// Note: Avoid spaces in your MP3 filenames to avoid ugly filenames coming out
// of iPodder

// Instructions
// 1. Place this file on a server with supports PHP4 or greater.
// 2. Place MP3 files to feed in the same directory, add new files at will
// 3. Point iPodder to the URL of this file.
// ex.
// 4. Set the following varibles to match your setup if you wish

// Maximum number of mp3s to offer in a feed
$maxFeed = 10;

//Title of feed/site    Used by iPodder for download subdirectory name
$titleTAG="Your page title";

//iPodder 1.0 seems to ignore everything below
//URL of site feed applies too
$linkTAG="http://your url";
//Feed language en-us = english USA
//Copyright for feed
//Your email address
//Name of feed generator
// Time to live

// You should not need to edit anything below this point.
// Main Code
header('Content-type: text/xml', true);
$rootMP3URL = "http://" . $_SERVER[HTTP_HOST] . $_SERVER[REQUEST_URI];
$rootMP3URL =  substr($rootMP3URL, 0, strrpos ($rootMP3URL, "/")); // Trim off script name itself

print "<?xml version=\"1.0\"?>\n";
print "<rss version=\"2.0\">\n";
print"    <channel>\n";
print"        <title>$titleTAG</title>\n";
print"        <link>$linkTAG</link>\n";
print"        <description>$descriptionTAG</description>\n";
print"        <lastBuildDate>" . date("r") ."</lastBuildDate>\n";
print"        <language>$languageTAG</language>\n";
print"        <copyright>$copyrightTAG</copyright>\n";
print"        <generator>$generatorTAG</generator>\n";
print"        <webMaster>$webMasterTAG</webMaster>\n";
print"        <ttl>$ttlTAG</ttl>\n\n";

$dirArray = getDir(".");    // Get a list of the current directory
while (list($filename, $filedate) = each($dirArray)AND $maxFeed > 0) {
    $mp3file = new CMP3File;
    $mp3file->getid3 ($filename);
    print "<item>\n";
    echo ("<title>$mp3file->title</title>\n");
    echo ("<link>$rootMP3URL/". htmlentities(str_replace(" ", "%20", $filename)) ."</link>\n");
    echo ("<description>$mp3file->title - $mp3file->album - $mp3file->artist</description>\n");
    echo ("<pubDate>".date("r",$filedate)."</pubDate>\n");
    echo ("<enclosure url=\"".htmlentities($rootMP3URL)."/". htmlentities(str_replace(" ", "%20", $filename)) ."\" length=\"");
    echo filesize($filename);
    echo ("\" type=\"audio/mpeg\"/>\n");    // Training slash for XML
    print "</item>\n\n";

print "</channel>\n</rss>\n";

// Functions and Classes
function stripJunk ($text) {
// Strip non-text characters
    for ($c=0; $c<strlen($text); $c++) {
        if (ord($text[$c]) >= 32 AND ord($text[$c]) <= 122)
    return $outText;

class CMP3File {
    var $title;
    var $artist;
    var $album;
    var $year;
    var $comment;
    var $genre;
    function getid3 ($file)
    { // read the ID3 or ID3v2 tag from an MP3 file
        if (file_exists($file))
        { //after verifying the file exists,
            $id_start = filesize($file) - 128;
            $fp = fopen($file, "r");
            fseek($fp, $id_start);
            $tag = fread($fp,3);
            if ($tag == "TAG")
                $this->title    = stripJunk(trim(fread($fp, 30)));
                $this->artist    = stripJunk(trim(fread($fp, 30)));
                $this->album    = stripJunk(trim(fread($fp, 30)));
                $this->year        = stripJunk(trim(fread($fp, 4)));
                $this->comment    = stripJunk(trim(fread($fp, 30)));
                $this->genre    = stripJunk(trim(fread($fp, 1)));
                return true;
            { // No ID3 tag
                return false;
        } else //the file doesn't exist
            return false;

function getDir($mp3Dir) {    
// Returns directory as array[file]=date in newest to oldest order
    $dirArray = array();
    $diskdir = "./$mp3Dir/";
    if (is_dir($diskdir)) {
        $dh = opendir($diskdir);
        while (($file = readdir($dh)) != false ) {
            if (filetype($diskdir . $file) == "file" && $file[0]  != ".") {
                if (strrchr(strtolower($file), ".") == ".mp3") {
                    $ftime = filemtime($mp3Dir."/".$file); 
                    $dirArray[$file] = $ftime;
    $dirArray = array_reverse($dirArray);
    return $dirArray;


If you put this in the files directory and head for http://my_url/podcast_files/dircaster.php, you will find a genuine RSS 2.00 feed that people can subscribe to.

The resulting tags that are sent to a browser might look like the following:

<rss version="2.0">

<title>Mstation mmm podcasts</title>
<description>Mstation Podcasts</description>
<lastBuildDate>Mon, 10 Apr 2006 12:01:12 +0100</lastBuildDate>


<description> -  -</description>
<pubDate>Mon, 20 Mar 2006 11:43:52 +0000</pubDate>
<enclosure url="" length="12715291" type="audio/mpeg"/>

At Mstation, we also have a separate Blosxom page where we discuss what the Mstation podcasts are about and how you can subscribe. We've used the Blosxom plugins enclosures, interpolate_fancy, and headlines to produce the layout and enable you to use the Mstation RSS 2.0 Podcast subscription feed with very little work on our part.

Blosxom handles the new m4v format for the TV iPod, while dircaster (at this stage, anyway) does not.

Once you have a subscription URL, you can also register it with iTunes or another feed syndicator such as Wikipedia list of podcast syndicators. On iTunes, you must create an account, but you don't actually have to buy anything to register your feed.

Good luck, and may your mind flow free!

John Littler is chief gopher for

Return to the Linux DevCenter.

Linux Online Certification

Linux/Unix System Administration Certificate Series
Linux/Unix System Administration Certificate Series — This course series targets both beginning and intermediate Linux/Unix users who want to acquire advanced system administration skills, and to back those skills up with a Certificate from the University of Illinois Office of Continuing Education.

Enroll today!

Linux Resources
  • Linux Online
  • The Linux FAQ
  • Linux Kernel Archives
  • Kernel Traffic

  • Sponsored by: