#!/usr/bin/python """ Displays flickr Photo feeds as a screensaver via a Quartz Composition """ import objc from ScreenSaver import * import Quartz from Foundation import NSLog, NSUserDefaultsDidChangeNotification import FeedManager import FlickrFeedsConfigurator registrationDefaults = { "FlickrFeeds Feeds" : [{'title': "bbum's flickr feed", 'url' : u'http://www.flickr.com/services/feeds/photos_public.gne?id=49503114554@N01&format=rss_200'}], "FlickrFeeds ShowFPS" : False, "FlickrFeeds Duration" : 20, } userDefaults = NSUserDefaults.standardUserDefaults() userDefaults.addSuiteNamed_(u"net.bbum.FlickrFeeds") userDefaults.registerDefaults_(registrationDefaults) defaultCenter = NSNotificationCenter.defaultCenter() class FlickrFeedsView (ScreenSaverView): def initWithFrame_isPreview_(self, aFrame, previewFlag): self = super(FlickrFeedsView, self).initWithFrame_isPreview_(aFrame, previewFlag) if self is None: return None self.initQCView_(aFrame) self.feedManager = FeedManager.feedManager() self.feedManager.setDelegate_(self) self.configurator = None return self def initQCView_(self, aFrame): aFrame.origin.x = 0 aFrame.origin.y = 0 self.qcView = objc.lookUpClass("QCView").alloc().initWithFrame_(aFrame) bundle = NSBundle.bundleWithIdentifier_('net.bbum.FlickrFeeds') qcDoc = bundle.pathForResource_ofType_('FlickrFeed', 'qtz') loaded = self.qcView.loadCompositionFromFile_(qcDoc) if not loaded: NSLog("Failed to load QC document: %s" % loaded) self.configureFromDefaults() self.addSubview_(self.qcView) def startAnimation(self): defaultCenter.addObserver_selector_name_object_(self, "defaultsChanged:", NSUserDefaultsDidChangeNotification, userDefaults) self.qcView.startRendering() self.displayData = [] self.feedManager.performDownload() def stopAnimation(self): defaultCenter.removeObserver_(self) self.qcView.stopRendering() def defaultsChanged_(self, aNotification): self.qcView.stopRendering() self.configureFromDefaults() self.displayData = None self.qcView.setValue_forInputKey_(None, "Feed_Data") self.feedManager.performDownload() # this really shouldn't happen while tracking the timer self.qcView.startRendering() def configureFromDefaults(self): self.qcView.setValue_forInputKey_(userDefaults.integerForKey_(u"FlickrFeeds Duration"), u"Duration") self.qcView.setValue_forInputKey_(userDefaults.boolForKey_(u"FlickrFeeds ShowFPS"), u"Show_FPS") def feedManager_stateChanged_(self, feedManager, newState): if newState == FeedManager.DOWNLOADING_RSS: self.qcView.setValue_forInputKey_(True, "Downloading") elif newState == FeedManager.NODATA: self.qcView.setValue_forInputKey_(False, "Downloading") elif newState == FeedManager.DOWNLOAD_COMPLETE: self.qcView.setValue_forInputKey_(False, "Downloading") self.qcView.setValue_forInputKey_(self.displayData, "Feed_Data") def feedManager_addParsedFeedData_(self, feedManager, parsedData): self.displayData.append(parsedData) def hasConfigureSheet(self): return True def configureSheet(self): if not self.configurator: self.configurator = FlickrFeedsConfigurator.configurator() return self.configurator.sheetWindow()