#!/usr/bin/env python

import email.utils
import mimetypes
import os
import re
import sys


ITEM_NUMBER = 20
SKIP_RE = ".*\.(html|xml|thumbnail\.jpg|filelist\.txt)$"


def update_folder_rss(base_url, folder_name):
    filenames = {}
    skip_re = re.compile(SKIP_RE)

    base_folder_name = os.path.basename(folder_name)
    if base_folder_name != "." and base_folder_name.startswith("."):
        return

    for dirname, dirs, files in os.walk(folder_name):
        for _dir in dirs:
            update_folder_rss(base_url + "/" + _dir, os.path.join(folder_name, _dir))
        for _file in files:
            filename = os.path.join(dirname, _file)
            if not skip_re.match(filename):
                filenames[filename[2:]] = os.stat(filename).st_ctime

    recent = [fn for fn, time in sorted(filenames.items(), key=lambda x: x[1], reverse=True)][:ITEM_NUMBER]
    if not recent:
        return

    output = ""
    output += "<?xml version='1.0'?>"
    output += "<rss version='2.0' xmlns:atom='http://www.w3.org/2005/Atom' xmlns:itunes='http://www.itunes.com/dtds/podcast-1.0.dtd'>"
    output += "<channel>"
    output += "<link>%s</link>" % base_url
    output += "<lastBuildDate>%s</lastBuildDate>" % email.utils.formatdate(os.stat(recent[0]).st_ctime)

    for filename in recent:
        st = os.stat(filename)
        output += "<item>"
        output += "<title>%s</title>" % filename
        output += "<pubDate>%s</pubDate>" % email.utils.formatdate(st.st_ctime)
        output += "<link>%s</link>" % (base_url + filename)
        output += "<enclosure url='%s' type='%s' length='%u'/>" % (base_url + filename, mimetypes.guess_type(filename)[0], st.st_size)
        output += "</item>"

    output += "</channel>"
    output += "</rss>"

    _file = os.path.join(folder_name, "rss.xml")
    print "Writing %s" % _file
    file(_file, "w").write(output)


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print >>sys.stderr, "Usage: %s base_url" % sys.argv[0]
        exit(1)

    update_folder_rss(sys.argv[1].rstrip("/") + "/", ".")
