| 1 | #!/usr/bin/python
|
|---|
| 2 | # Author: Eli Carter elicarter@retracile.net
|
|---|
| 3 | # License: MIT
|
|---|
| 4 | import argparse
|
|---|
| 5 | import sys
|
|---|
| 6 | import time
|
|---|
| 7 | import os
|
|---|
| 8 | import re
|
|---|
| 9 | import datetime
|
|---|
| 10 |
|
|---|
| 11 | import PyRSS2Gen
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 | def 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 |
|
|---|
| 80 | if __name__ == '__main__':
|
|---|
| 81 | sys.exit(main(sys.argv))
|
|---|