## Moogle - A curses based google reader client Moogle is a curses client for google reader, influenced by the best MUA ever, [Mutt][]. Like mutt moogle has keybindings for everything, and supports limit expressions to restrict what you're shown. Moogle was written to [scratch an itch][] - there were console rss readers\[[1][], [2][]\] and GUI rss readers which can sync to google reader\[[3][]\] and [Google Reader][] proper but no console reader which could sync to google reader: enter moogle. Moogle's not for everyone, as [Zed said][] (though he was talking about [newsbeuter][]): > Now, I’m sure tons of people will scoff at the idea of not having graphics in > their feed. They’ve gotta have that curvy candy coated interface with the > flash video about Steampunk Buttplugs posted by BoingBoing blaring right in > their fucking face or else they don’t feel alive. They don’t feel young. > Dammit, they want to augment that Nerd ADD with a feed reader that goes to > eleven! If that sounds like you, maybe you won't like moogle. [scratch an itch]: http://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar [Mutt]: http://www.mutt.org [Zed said]: http://www.zedshaw.com/essays/i_want_the_mutt_of_feed_readers.html [Google Reader]: http://google.com/reader [1]: http://kiza.kcore.de/software/snownews/ [2]: http://www.newsbeuter.org/ [newsbeuter]: http://www.newsbeuter.org/ [3]: http://liferea.sourceforge.net/ ### Screenshot Moogle Screenshot ### Features Why should you use moogle? * Google Reader synchronisation * Curses interface * Powerful limit expressions * Offline cache support * Configurable keybindings * Built in python command line * Mutt-like tagging of items ### Getting Started Using setting up moogle is simple: there are no configuration options, and only one required configuration file, `~/.moogle/cred` which should contain your google reader credentials in the form: username@google.com,password Moogle is a work in progress - to get going try `python frontend.py` in the moogle directory, simple help is available by pressing "?". ### Commands The default set of commands is: : Select the next unread item. *: Toggle 'star' state of the selected item. :: Execute python command in the context of this program. DANGEROUS ?: Show help. J: Scroll the current item down. K: Scroll the current item up. N: Select the next message. O: Toggle the online state. P: Select the previous message. R: Mark all tagged items as read. T: Toggle the 'tagged' state for all items matching expr. d: Print a debug summary of the selected item. j: Scroll the current item down. k: Scroll the current item up. l: Limit the display of items according to an expression. n: Select the next message. o: Open the currently selected item p: Select the previous message. q: Quit. s: Save the current items for offline reading. t: Toggle 'tagged' state of an item. x: Force an update. Most commands are simple, and do exactly what you'd expect. Keybindings can be created and modified at run time by using `Config.bind(key, function)`. ### The Limit Command Limit accepts a python expression and uses it to [filter][] the feed items shown. To only show items from the BBC try `Limit: "BBC" in item.feed` or to show only items labelled "comics" `Limit: "comics" in item.labels`. A full list of item attributes can be seen in the [source][], or in the debug output (bound to "d" by default). [filter]: http://docs.python.org/library/functions.html#filter [source]: http://joe.milbourn.org.uk/git?p=moogle;a=blob_plain;f=moogle.py;hb=HEAD Any python expression returning a boolean can be used as a limit expression, but probably you'll want to limit based on some property of the each item. Common attributes for an item are: * `item.feed`: The feed source * `item.body`: The body of the item, formatted as markdown * `item.author`: The author of the item * `item.title`: The item title * `item.labels`: A list of this item's labels * `item.link`: The link to the full version of this item * `item.date`: A [datetime][] object representing the time this item was written * `item.entry`: A [feedparser][] object representing this object [datetime]: http://docs.python.org/library/datetime.html [feedparser]: http://www.feedparser.org/ ### Config Save/Restore Moogle now supports the saving and restoring of configuration to and from the file `~/.moogle/config` in [YaML][]. Moogle will load an existing config file during initialisation, to create a config file run `Config.save(filename="~/.moogle/config")`, and to run a new config run `Config.restore(filename="~/.moogle/config")`. The default configuration looks like: browser: x-www-browser headers: - labels - author - date - feed - title history_file: /home/joe/.moogle/history index_length: 5 keybindings: '*': star ':': command : scroll_down : next_unread_message : scroll_up '?': help J: scroll_down K: scroll_up N: next_message O: online P: previous_message R: read_tagged T: tag_set d: debug_dump_item j: scroll_down k: scroll_up l: limit n: next_message o: open_item p: previous_message q: quit s: save t: tag x: update The keys ``, ``, and `` are mapped to `curses.KEY_UP`, `curses.KEY_DOWN`, and `curses.KEY_SPACE` respectively. [YaML]: http://www.yaml.org ### Download No packages yet - grab a [tarball](http://joe.milbourn.org.uk/git?p=moogle;a=snapshot;h=HEAD;sf=tgz) or clone your own from [git](http://joe.milbourn.org.uk/git/projects/moogle).