Blog: Adhoc RSS Feeds: adhoc-rss-feed

File adhoc-rss-feed, 2.8 KB (added by retracile, 6 years ago)

adhoc-rss-feed

Line 
1#!/usr/bin/python
2# Author: Eli Carter elicarter@retracile.net
3# License: MIT
4import argparse
5import sys
6import time
7import os
8import re
9import datetime
10
11import PyRSS2Gen
12
13
14def main(argv):
15    """Create an ad-hoc RSS2 XML feed from a set of audio files
16    """
17    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,
18                                     description=main.__doc__)
19    parser.add_argument('--feed-title',
20                        help="RSS feed title")
21    parser.add_argument('--url', required=True,
22                        help="base URL for this rss2.xml")
23    parser.add_argument('--base-url', required=True,
24                        help="base URL for listed files, including trailing '/'")
25    parser.add_argument('--filename-regex', default="(?P<filename>.*)",
26                        help="Python regex to parse filenames")
27    parser.add_argument('--title-pattern', default="%(filename)s",
28                        help="Pattern to convert parsed filename to a title")
29    parser.add_argument('--output', default="-",
30                        help="output file, '-' for stdout")
31    parser.add_argument('files', nargs='+',
32                        help="mp3 files from which to build an RSS2 feed")
33    args = parser.parse_args(argv[1:])
34
35    filename_parser = re.compile(args.filename_regex)
36
37    # Generate an entry for each file
38    rss_items = []
39    for filename in args.files:
40        match = filename_parser.search(filename)
41        if not match:
42            sys.stderr.write("Failed to match %r with pattern %r\n" %
43                             (filename, args.filename_regex))
44            return 1
45        parsed = match.groupdict()
46        title = args.title_pattern % parsed
47        file_time = time.localtime(os.stat(filename).st_mtime)
48        url = args.base_url + filename
49        item = PyRSS2Gen.RSSItem(
50            title=title,
51            description=title,
52            guid=PyRSS2Gen.Guid(os.path.basename(filename)),
53            enclosure=PyRSS2Gen.Enclosure(url=url,
54                                          length=os.stat(filename).st_size,
55                                          type='audio/mpeg'),
56            pubDate=datetime.datetime(file_time.tm_year, file_time.tm_mon,
57                                      file_time.tm_mday, 0, 0),
58        )
59        rss_items.append(item)
60
61    # Create the feed containing all the entries
62    rss = PyRSS2Gen.RSS2(
63        title=args.feed_title,
64        link=args.url,
65        description=args.feed_title,
66        lastBuildDate=datetime.datetime.now(),
67        items=rss_items,
68    )
69
70    # Write it out
71    if args.output == '-':
72        output = sys.stdout
73    else:
74        output = open(args.output, 'w')
75    rss.write_xml(output)
76
77    return 0
78
79
80if __name__ == '__main__':
81    sys.exit(main(sys.argv))