from Foundation import * import StringIO import re imageRE = re.compile(".*(?Phttp://[^.]*\.flickr.com/[^.]*\.jpg).*", re.M) userDefaults = NSUserDefaults.standardUserDefaults() def matchImage(aLine): x = aLine.split('\n') for aLine in x: m = imageRE.match(aLine) if m: return m.group('url') return None import feedparser _feedManager = None def feedManager(): global _feedManager if not _feedManager: _feedManager = FeedManager.new() return _feedManager NODATA = 0 DOWNLOADING_RSS = 1 DOWNLOAD_COMPLETE = 2 class FeedManager(NSObject): def init(self): self = super(FeedManager, self).init() if self is None: return None self.delegate = None self.setState_(NODATA) self.activeDownloads = [] return self def setDelegate_(self, aDelegate): self.delegate = aDelegate def downloadFeed_(self, aFeed): downloadingURL = NSURL.URLWithString_(aFeed) self.activeDownloads.append(downloadingURL) downloadingURL.loadResourceDataNotifyingClient_usingCache_(self, True) def URLResourceDidFinishLoading_(self, sender): contents = sender.resourceDataUsingCache_(True) if self.delegate: self.delegate.feedManager_addParsedFeedData_(self, self.parseFeed_(contents)) self.activeDownloads.remove(sender) if len(self.activeDownloads) == 0: self.setState_(DOWNLOAD_COMPLETE) def performDownload(self): for aDownload in self.activeDownloads: aDownload.URLHandleUsingCache_(True).cancelLoadInBackground() self.setState_(DOWNLOADING_RSS) feeds = userDefaults.objectForKey_(u'FlickrFeeds Feeds') for aFeed in feeds: self.downloadFeed_(aFeed['url']) def setState_(self, aState): self.state = aState if self.delegate: self.delegate.feedManager_stateChanged_(self, self.state) def parseEntry_(self, rawEntry): entry = {} entry['title'] = rawEntry.title entry['link'] = rawEntry.link entry['description'] = rawEntry.description entry['imgURL'] = matchImage(rawEntry.description) return entry def parseFeed_(self, data): parsedFeed = feedparser.parse(StringIO.StringIO(data.bytes())) p = {} p['title'] = parsedFeed.feed.title p['link'] = parsedFeed.feed.link p['description'] = parsedFeed.feed.description entries = [] for e in parsedFeed['entries']: entries.append(self.parseEntry_(e)) p['images'] = entries return p