Sure, I only notice this when I have to restart my emacs. But once is
annoying enough. The problem was that running M-x iplayer would cause
an error from within execute-extended-command, within the process
sentinel. After trying to debug this and generating a nifty
unbreakable infinite loop, I finally twigged that it was the
frame/window/buffer frobbing that was the problem. Piling hack upon
hack, the answer is that we only want to do the frobbing once before
the first command in the command keys, and once after the execution
has finished. Make it so.
rework commands in light of long cache refresh time
The issue is that of get-iplayer itself managing its cache: if at any
point it decides that the cache is sufficiently stale, it goes off and
refreshes everything, which seems to take a long time -- if I'm
unlucky, breaking my ERC sessions (and in any case making the rest of
the editor session unusable).
Construct a background process and sentinel to manage the cache
updating before calling the real get-iplayer command. The tricky bit
here is to make sure that the sentinel and real body get executed in
the right context. Many things in the world are simpler with lexical
scoping; this would have been one of them, but I am still on emacs 23
and lexical binding is a thing of the future, so instead of making a
bunch of thunks to be called later, we have to save commands (well,
key sequences), but then those key sequences are divorced from the
window and frame that they were originally typed into, so we have to
get that context back. Naive ways of doing that turn out not to work,
because execute-kbd-macro runs its own command loop, which first of
all selects a current frame and window, so if we've navigated away
from the *iplayer* window/buffer we end up adding keystrokes to
e.g. an ERC buffer, which is suboptimal; however, (ab)using the pre
and post command hooks seems to make things work. So do that, and all
is well.
Very raw. Uses get_iplayer (spelled "get-iplayer" on my system); "parses"
the tree output; uses Orgstruct for presentation, and text properties for
user interface. Uncached calls to get-iplayer (the first in any four hours,
unless the user has a cron job) blocks the whole of emacs for a good little
while as get-iplayer spends its time pulling down metadata, and there is
almost no useful feedback when downloading.
On the other hand, it's easier for me than the command-line interface.