#!/usr/bin/python
# Author: Eli Carter elicarter@retracile.net
# License: MIT
import argparse
import sys
import time
import os
import re
import datetime

import PyRSS2Gen


def main(argv):
    """Create an ad-hoc RSS2 XML feed from a set of audio files
    """
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,
                                     description=main.__doc__)
    parser.add_argument('--feed-title',
                        help="RSS feed title")
    parser.add_argument('--url', required=True,
                        help="base URL for this rss2.xml")
    parser.add_argument('--base-url', required=True,
                        help="base URL for listed files, including trailing '/'")
    parser.add_argument('--filename-regex', default="(?P<filename>.*)",
                        help="Python regex to parse filenames")
    parser.add_argument('--title-pattern', default="%(filename)s",
                        help="Pattern to convert parsed filename to a title")
    parser.add_argument('--output', default="-",
                        help="output file, '-' for stdout")
    parser.add_argument('files', nargs='+',
                        help="mp3 files from which to build an RSS2 feed")
    args = parser.parse_args(argv[1:])

    filename_parser = re.compile(args.filename_regex)

    # Generate an entry for each file
    rss_items = []
    for filename in args.files:
        match = filename_parser.search(filename)
        if not match:
            sys.stderr.write("Failed to match %r with pattern %r\n" %
                             (filename, args.filename_regex))
            return 1
        parsed = match.groupdict()
        title = args.title_pattern % parsed
        file_time = time.localtime(os.stat(filename).st_mtime)
        url = args.base_url + filename
        item = PyRSS2Gen.RSSItem(
            title=title,
            description=title,
            guid=PyRSS2Gen.Guid(os.path.basename(filename)),
            enclosure=PyRSS2Gen.Enclosure(url=url,
                                          length=os.stat(filename).st_size,
                                          type='audio/mpeg'),
            pubDate=datetime.datetime(file_time.tm_year, file_time.tm_mon,
                                      file_time.tm_mday, 0, 0),
        )
        rss_items.append(item)

    # Create the feed containing all the entries
    rss = PyRSS2Gen.RSS2(
        title=args.feed_title,
        link=args.url,
        description=args.feed_title,
        lastBuildDate=datetime.datetime.now(),
        items=rss_items,
    )

    # Write it out
    if args.output == '-':
        output = sys.stdout
    else:
        output = open(args.output, 'w')
    rss.write_xml(output)

    return 0


if __name__ == '__main__':
    sys.exit(main(sys.argv))
