## 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
### 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).