update metadata
slightly nicer iplayer-progress management
add CBBC/CBeebies presets
update copyright dates
implement process sentinel for iplayer downloads process state, in principle, goes connecting -> downloading -> transcoding -> finished | v | '-----------> failed <--------' thoughat the moment there's a wrong edge from downloading to finished if the get-iplayer process is terminated at an unfortunate time.
rudimentary progress display needs a lot of polishing: * could do with a sentinel to indicate done / aborted on process exit * progress bars would be nice * clearing old downloads * RET on each line should do something useful (e.g. jump to file in dired?) * we could display the title not the iplayer id but it might be basically functional
don't startup by default in "show all" mode my emacs takes a good couple of seconds merely to execute navigation commands through the buffer with all the content, and isearch chews up a *lot* of CPU. It'd be nice to find out why and fix it, but in the meantime start up in "BBC One" mode (by default; there's a customize variable). Also include emacs-style next/previous and refresh key bindings.
Derive from special-mode - Ensures buffer is read-only, and responds to "q" - Buffer is made temporarily writable while inserting programme tree
Allow user configuration of download directory
fix preset-handling code on emacs24 only observable symptom was that £ for Radio 3 didn't work
make sure to select window/buffer/frame in emacs24 (much easier than using the emacs23 method)
avoid using cl primitives use nth where possible, multiple cars where not
support other versions of get-iplayer use --modes=best to avoid errors from not having a particular kind of stream available. (I'm not at all clear where the errors come from: I have never needed this before, but some users do).
support emacs 24 Well this is horrible. Now that execute-extended-command is in Lisp, using completing read, (this-command-keys-vector) ends up returing [13] for a function executed using M-x iplayer RET (rather than the more useful whole extended command key sequence). This means that storing the key sequence for the last command and trying to execute it later mostly has the effect of adding linebreaks. (The old code works if the command was invoked through a key sequence rather than through extended command; I think this suggests that execute-extended-command should be modified to update the various key variables/functions specially, like it already has been for this-command, but that is not helpful right now). So, as well, store the function name and funcall that. Oh, but wait, some of the functions dispatch on the key sequence used to invoke them (presets). So we need to pass the key sequence we were invoked with back. That means we need to have a common signature for iplayer-functions. This is all so horrible. But at least now it works with emacs24. *sigh*.
Autoload the iplayer interactive function
Add headers/footers for package.el compatibility
slightly-confusing iplayer-{previous,next} commands Bind them to ?k and ?j in iplayer-mode.
cosmetic change Use this-command-keys-vector rather than this-command-keys -- marginally easier to debug with.
fix iplayer commands invoked using M-x 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.