FilesSubmittedBranchesLabelsClientsUsersJobsHelp
Tree viewShow file textShow revision historyShow/hide recent activityInformation
//depot/projects/podgrab/podgrab.py#3

//depot/projects/podgrab/podgrab.py#3 – edit change 95 (xtext) ·revision history

1#!/usr/bin/env python
2"""podgrab - fetch podcast enclosures and drop them on the iPod.
3
4usage: podgrab.py [feeds.opml]
5
6ksimpson, oct 2004. needs Python 2.3.
7"""
8
9import os
10import shutil
11import sys
12import urllib2
13from xml.dom import minidom
14
15IPOD = "/Volumes/IPOD"
16CACHE = os.path.expanduser("~/.podgrab")
17SEEN = os.path.join(CACHE, "seen")
18UA = "podgrab/0.2 (+http://ttul.org/)"
19
20
21def fetch(url):
22 return urllib2.urlopen(urllib2.Request(url, headers={"User-Agent": UA}))
23
24
25def read_opml(path):
26 dom = minidom.parse(path)
27 feeds = []
28 for node in dom.getElementsByTagName("outline"):
29 url = node.getAttribute("xmlUrl")
30 if url:
31 feeds.append((node.getAttribute("text"), url))
32 return feeds
33
34
35def enclosures(feed_url):
36 dom = minidom.parse(fetch(feed_url))
37 for item in dom.getElementsByTagName("item"):
38 for enc in item.getElementsByTagName("enclosure"):
39 yield enc.getAttribute("url")
40
41
42def load_seen():
43 seen = {}
44 if not os.path.exists(SEEN):
45 return seen
46 for line in open(SEEN):
47 seen[line.strip()] = 1
48 return seen
49
50
51def main(argv):
52 opml = len(argv) > 1 and argv[1] or "feeds.opml"
53 if not os.path.isdir(CACHE):
54 os.makedirs(CACHE)
55 seen = load_seen()
56 out = open(SEEN, "a")
57 for title, url in read_opml(opml):
58 print "==>", title
59 try:
60 encs = list(enclosures(url))
61 except Exception, e:
62 print " feed broken:", e
63 continue
64 for enc in encs:
65 if enc in seen:
66 continue
67 fname = os.path.join(CACHE, os.path.basename(enc))
68 print " ", enc
69 f = open(fname, "wb")
70 shutil.copyfileobj(fetch(enc), f)
71 f.close()
72 out.write(enc + "\n")
73 if os.path.isdir(IPOD):
74 # NB: this does not update the iTunesDB. use gtkpod, or
75 # just play it from the notes folder like a caveman.
76 shutil.copy(fname, os.path.join(IPOD, "Podcasts"))
77 out.close()
78
79
80if __name__ == "__main__":
81 main(sys.argv)

P4Web/LINUX26X86/2005.1/82295 · Copyright © 1995-2005 Perforce Software · ttul.org