Author: dmeyer Date: Mon Sep 24 17:06:48 2007 New Revision: 2838 Log: make it work as standalone module
Added: trunk/feedmanager/TODO Modified: trunk/feedmanager/bin/kaa-feedmanager trunk/feedmanager/setup.py trunk/feedmanager/src/__init__.py trunk/feedmanager/src/core.py trunk/feedmanager/src/manager.py trunk/feedmanager/src/rss.py Added: trunk/feedmanager/TODO ============================================================================== --- (empty file) +++ trunk/feedmanager/TODO Mon Sep 24 17:06:48 2007 @@ -0,0 +1,15 @@ +- Add password code +- Improve RSS feed for better video and audio feed support + https://feedguide.participatoryculture.org/front +- Torrent downloader (needed for some democracy feeds) +- Add parallel download function +- make sure update() is called only once at a time +- add username / password stuff to rpc or config + +External plugins +- Flickr image feed +- Gallery support +- Youtube / Stage6 plugin + +Known Bugs +- Unhanlded InProgress exception after download Modified: trunk/feedmanager/bin/kaa-feedmanager ============================================================================== --- trunk/feedmanager/bin/kaa-feedmanager (original) +++ trunk/feedmanager/bin/kaa-feedmanager Mon Sep 24 17:06:48 2007 @@ -1,12 +1,12 @@ #!/usr/bin/python # -*- coding: iso-8859-1 -*- # ----------------------------------------------------------------------------- -# beacon-feedmanager +# kaa-feedmanager # ----------------------------------------------------------------------------- # $Id$ # # ----------------------------------------------------------------------------- -# kaa.beacon - A virtual filesystem with metadata +# kaa.feedmanager - Manage RSS/Atom Feeds # Copyright (C) 2007 Dirk Meyer # # First Edition: Dirk Meyer <[EMAIL PROTECTED]> @@ -31,23 +31,27 @@ # ----------------------------------------------------------------------------- # python imports +import os import sys +import logging # kaa imports import kaa.notifier import kaa.beacon +import kaa.feedmanager -kaa.beacon.connect() +kaa.feedmanager.set_database(os.path.expanduser('~/.beacon')) +logging.getLogger('feedmanager').setLevel(logging.DEBUG) def help(): - print 'beacon-feedmanager' + print 'kaa-feedmanager' print 'options:' print '-l list all feeds' print '-a options add a feed, see examples below' print '-r id remove feed with the given id' print '-u [ id ] update all feeds or only the feed with the given id' print - print 'The beacon-feedmanager adds feeds like audio and video podcasts' + print 'The kaa-feedmanager adds feeds like audio and video podcasts' print 'to the filesystem. It either downloads the files or just adds' print 'the url into the directory. The later is hidden from the normal' print 'filessytem, only beacon clients such as Freevo can see it.' @@ -64,11 +68,11 @@ print print 'Example:' print 'download all entries and keep old one' - print 'beacon-feedmanager -a http://url /media/mypodcasts' + print 'kaa-feedmanager -a http://url /media/mypodcasts' print 'link to all entries and not keep old one' - print 'beacon-feedmanager -a http://url /media/mypodcasts False 0 False' + print 'kaa-feedmanager -a http://url /media/mypodcasts False 0 False' print 'download up to 4 entries and delete old one' - print 'beacon-feedmanager -a http://url /media/mypodcasts True 4 False' + print 'kaa-feedmanager -a http://url /media/mypodcasts True 4 False' print sys.exit(0) @@ -76,31 +80,31 @@ help() if sys.argv[1] in ('--update', '-u'): - if len(sys.argv) > 2: - def update(feeds, id): - for f in feeds: - if f.get('id') == id: - f.update().connect(sys.exit) - break - else: - print 'feed not found' - sys.exit(0) - kaa.beacon.list_feeds().connect(update, int(sys.argv[2])) - else: - kaa.beacon.update_feeds().connect(sys.exit) - -elif sys.argv[1] in ('--list', '-l'): - def show(feeds): - for f in feeds: - print 'Feed %d' % f['id'] - for key in ('id', 'url', 'directory', 'download', 'num', 'keep'): - print ' %10s = %s' % (key, f[key]) - print - sys.exit(0) - kaa.beacon.list_feeds().connect(show) + @kaa.notifier.yield_execution() + def update(): + n = None + if len(sys.argv) > 2: + n = int(sys.argv[2]) + + for f in kaa.feedmanager.list_feeds(): + if n is None or n == f.get('id'): + yield f.update() + + kaa.beacon.connect() + update().connect(sys.exit) + kaa.notifier.loop() + sys.exit(0) + +if sys.argv[1] in ('--list', '-l'): + for f in kaa.feedmanager.list_feeds(): + print 'Feed %d' % f['id'] + for key in ('id', 'url', 'directory', 'download', 'num', 'keep'): + print ' %10s = %s' % (key, f[key]) + print + sys.exit(0) -elif sys.argv[1] in ('--add', '-a') and len(sys.argv) > 3: +if sys.argv[1] in ('--add', '-a') and len(sys.argv) > 3: url = sys.argv[2] destdir = sys.argv[3] if len(sys.argv) > 4: @@ -115,23 +119,19 @@ keep = True elif sys.argv[6].lower() in ('false', 'no'): keep = False - kaa.beacon.add_feed(url, destdir, download, num, keep).connect(sys.exit) + kaa.feedmanager.add_feed(url, destdir, download, num, keep) else: - kaa.beacon.add_feed(url, destdir).connect(sys.exit) + kaa.feedmanager.add_feed(url, destdir) + sys.exit(0) -elif sys.argv[1] in ('--remove', '-r') and len(sys.argv) > 2: - def remove(feeds, id): - for f in feeds: - if f.get('id') == id: - f.remove().connect(sys.exit) - break - else: - print 'feed not found' - sys.exit(0) - - kaa.beacon.list_feeds().connect(remove, int(sys.argv[2])) +if sys.argv[1] in ('--remove', '-r') and len(sys.argv) > 2: + for f in kaa.feedmanager.list_feeds(): + if f.get('id') == int(sys.argv[2]): + f.remove() + break + else: + print 'feed not found' + sys.exit(0) -else: - help() +help() -kaa.notifier.loop() Modified: trunk/feedmanager/setup.py ============================================================================== --- trunk/feedmanager/setup.py (original) +++ trunk/feedmanager/setup.py Mon Sep 24 17:06:48 2007 @@ -41,6 +41,7 @@ version = '0.1.0', license = 'LGPL', summary = 'RSS/Atom Feedmanager', + scripts = [ 'bin/kaa-feedmanager' ], rpminfo = { 'requires': 'python-kaa-beacon >= 0.1.0', 'build_requires': 'python-kaa-beacon >= 0.1.0' Modified: trunk/feedmanager/src/__init__.py ============================================================================== --- trunk/feedmanager/src/__init__.py (original) +++ trunk/feedmanager/src/__init__.py Mon Sep 24 17:06:48 2007 @@ -5,7 +5,7 @@ # $Id$ # # ----------------------------------------------------------------------------- -# kaa.beacon.server - A virtual filesystem with metadata +# kaa.feedmanager - Manage RSS/Atom Feeds # Copyright (C) 2007 Dirk Meyer # # First Edition: Dirk Meyer <[EMAIL PROTECTED]> @@ -28,22 +28,6 @@ # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ----------------------------------------------------------------------------- -# -# TODO -# -# - Improve RSS feed for better video and audio feed support -# https://feedguide.participatoryculture.org/front -# - Torrent downloader (needed for some democracy feeds) -# - Add parallel download function -# - make sure update() is called only once at a time -# - add username / password stuff to rpc or config -# -# External plugins -# - Flickr image feed -# - Gallery support -# - Youtube / Stage6 plugin -# -# ################################################################## # python imports import os @@ -56,56 +40,48 @@ import core import rss [EMAIL PROTECTED]('feeds.update') -def update(id=None): - """ - Update feed with given id or all if id is None - """ - if id == None: - return manager.update() - for c in manager.list_feeds(): - if id == c.id: - return c.update() - return False - +class Feed(dict): + def remove(self): + """ + Remove feed + """ + for c in manager.list_feeds(): + if self.get('id') == c.id: + manager.remove_feed(c) + return True + return False + + def update(self): + """ + Update feed + """ + for c in manager.list_feeds(): + if self.get('id') == c.id: + return c.update() + return False [EMAIL PROTECTED]('feeds.list') def list_feeds(): """ List all feeds. Returns a list of dicts. """ feeds = [] for c in manager.list_feeds(): - feeds.append(c.get_config()) + feeds.append(Feed(c.get_config())) return feeds [EMAIL PROTECTED]('feeds.add') def add_feed(url, destdir, download=True, num=0, keep=True): """ Add a new feed. """ - return manager.add_feed(url, destdir, download, num, keep).get_config() - - [EMAIL PROTECTED]('feeds.remove') -def remove_feed(id): - """ - Remove feed with given id. - """ - for c in manager.list_feeds(): - if id == c.id: - manager.remove_feed(c) - return True - return False + return Feed(manager.add_feed(url, destdir, download, num, keep).get_config()) def set_database(database): """ Set the database. Called by server at startup. """ - core.Feed._db = database - core.Feed.IMAGEDIR = os.path.join(database.get_directory(), 'images') + core.Feed.IMAGEDIR = os.path.join(database, 'images') if not os.path.isdir(core.Feed.IMAGEDIR): os.makedirs(core.Feed.IMAGEDIR) - manager.init(os.path.join(database.get_directory(), 'feeds.xml')) + manager.init(os.path.join(database, 'feeds.xml')) Modified: trunk/feedmanager/src/core.py ============================================================================== --- trunk/feedmanager/src/core.py (original) +++ trunk/feedmanager/src/core.py Mon Sep 24 17:06:48 2007 @@ -5,7 +5,7 @@ # $Id$ # # ----------------------------------------------------------------------------- -# kaa.beacon.server - A virtual filesystem with metadata +# kaa.feedmanager - Manage RSS/Atom Feeds # Copyright (C) 2007 Dirk Meyer # # First Edition: Dirk Meyer <[EMAIL PROTECTED]> @@ -41,13 +41,14 @@ # kaa imports import kaa.notifier import kaa.notifier.url +import kaa.beacon from kaa.strutils import str_to_unicode, unicode_to_str # get manager module import manager # get logging object -log = logging.getLogger('beacon.feed') +log = logging.getLogger('feedmanager') # ################################################################## # some generic entry/feed stuff @@ -73,7 +74,6 @@ class Feed(object): - _db = None NEXT_ID = 0 IMAGEDIR = None @@ -130,7 +130,7 @@ continue fname = unicode_to_str(node.getAttribute('filename')) or None self._entries.append((node.getAttribute('url'), fname)) - + def _writexml(self, node): """ @@ -152,7 +152,7 @@ e.setAttribute('url', url) if fname: e.setAttribute('filename', str_to_unicode(fname)) - node.appendChild(e) + d.appendChild(e) @kaa.notifier.yield_execution() @@ -182,7 +182,7 @@ log.info('update feed %s', self.url) # get directory information - beacondir = self._db.query(filename=self.dirname) + beacondir = kaa.beacon.get(self.dirname) listing = beacondir.list() if isinstance(listing, kaa.notifier.InProgress): yield listing @@ -207,12 +207,9 @@ # already in beacon list pass elif not self._download: - # add to beacon - while self._db.read_lock.is_locked(): - yield self._db.read_lock.yield_unlock() # use url as name entry['name'] = unicode_to_str(entry.url) - i = self._db.add_object(parent=beacondir, **entry) + i = kaa.beacon.add_item(parent=beacondir, **entry) else: # download filename = os.path.join(self.dirname, entry.basename) @@ -234,7 +231,7 @@ continue if os.path.isfile(filename): - item = self._db.query(filename=filename) + item = kaa.beacon.get(filename) if not item.scanned(): async = item.scan() if isinstance(async, kaa.notifier.InProgress): @@ -276,7 +273,7 @@ return # get directory information - beacondir = self._db.query(filename=self.dirname) + beacondir = kaa.beacon.get(self.dirname) allurls = [ e[0] for e in self._entries ] listing = beacondir.list() if isinstance(listing, kaa.notifier.InProgress): Modified: trunk/feedmanager/src/manager.py ============================================================================== --- trunk/feedmanager/src/manager.py (original) +++ trunk/feedmanager/src/manager.py Mon Sep 24 17:06:48 2007 @@ -5,7 +5,7 @@ # $Id$ # # ----------------------------------------------------------------------------- -# kaa.beacon.server - A virtual filesystem with metadata +# kaa.feedmanager - Manage RSS/Atom Feeds # Copyright (C) 2007 Dirk Meyer # # First Edition: Dirk Meyer <[EMAIL PROTECTED]> @@ -42,7 +42,7 @@ import rss # get logging object -log = logging.getLogger('beacon.feed') +log = logging.getLogger('feedmanager') # cache file CACHE = None @@ -151,22 +151,3 @@ parse_feed(c) except: log.exception('bad cache file: %s' % CACHE) - - -_updating = False - [EMAIL PROTECTED]() -def update(verbose=False): - """ - Update all feeds - """ - global _updating - if _updating: - log.error('update already in progress') - yield False - log.info('start feed update') - _updating = True - for feed in _feeds: - yield feed.update(verbose=verbose) - _updating = False - yield True Modified: trunk/feedmanager/src/rss.py ============================================================================== --- trunk/feedmanager/src/rss.py (original) +++ trunk/feedmanager/src/rss.py Mon Sep 24 17:06:48 2007 @@ -5,7 +5,7 @@ # $Id$ # # ----------------------------------------------------------------------------- -# kaa.beacon.server - A virtual filesystem with metadata +# kaa.feedmanager - Manage RSS/Atom Feeds # Copyright (C) 2007 Dirk Meyer # # First Edition: Dirk Meyer <[EMAIL PROTECTED]> @@ -42,7 +42,7 @@ import core # get logging object -log = logging.getLogger('beacon.feed') +log = logging.getLogger('feedmanager') isotime = '%a, %d %b %Y %H:%M:%S' @kaa.notifier.execute_in_thread() ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Freevo-cvslog mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/freevo-cvslog
