X-Git-Url: http://christophe.rhodes.io/gitweb/?p=iplayer-el.git;a=blobdiff_plain;f=iplayer.el;h=7e1726bf66cc49e828a91c0a4384f0ae9efd58fa;hp=8e883521d78706c251bf0e9d93785dcc705265a1;hb=5ea38a0355a6cb6579bf88cf26a0c5ae9dd89766;hpb=33f79d5354ce397f2f8d2d6299941c13fdd05fab diff --git a/iplayer.el b/iplayer.el index 8e88352..7e1726b 100644 --- a/iplayer.el +++ b/iplayer.el @@ -25,6 +25,17 @@ ;; convenient interface to BBC iPlayer. ;;; Code: + +(defgroup iplayer nil + "Browse and download BBC TV/radio shows." + :prefix "iplayer-" + :group 'applications) + +(defcustom iplayer-download-directory "~/iPlayer/" + "Directory into which shows will be downloaded." + :group 'iplayer + :type 'directory) + (defvar iplayer-updating-cache-process nil) (defvar iplayer-updating-cache-sentinel-info nil) (defvar iplayer-updating-cache-sentinel-executing nil) @@ -47,34 +58,39 @@ (let ((old-frame (selected-frame)) (old-window (selected-window)) (old-buffer (current-buffer))) - (let ((pre-command-hook - (lambda () - (select-frame iplayer-command-frame) - (select-window iplayer-command-window) - (set-buffer iplayer-command-buffer) - (setq pre-command-hook nil)))) - ;; KLUDGE: execute-kbd-macro executes a normal - ;; command-loop, whose first action is to select the - ;; current frame and window, which is why we contort - ;; things to select the frame/window/buffer we actually - ;; want in pre-command-hook. I'm actually surprised - ;; that it works, but mine is not too much to reason - ;; why; lots of other ways to try to achieve this didn't - ;; in fact work. - (if (version< emacs-version "24") - (execute-kbd-macro keys) - ;; KLUDGE: we store the function name, which is fine, - ;; but some of our functions need to know which - ;; keystrokes were used to invoke them, so we need to - ;; pass those along, so we need to make sure that all - ;; iplayer-functions accept an optional argument, argh - ;; argh argh. - (funcall function keys)) - ;; KLUDGE: and then we restore old state - (select-window old-window) - (select-frame old-frame) - (set-buffer old-buffer)))))) - (message "Done updating iPlayer cache"))) + (cond + ((version< emacs-version "24") + (let ((pre-command-hook + (lambda () + (select-frame iplayer-command-frame) + (select-window iplayer-command-window) + (set-buffer iplayer-command-buffer) + (setq pre-command-hook nil)))) + ;; KLUDGE: execute-kbd-macro executes a normal + ;; command-loop, whose first action is to select the + ;; current frame and window, which is why we contort + ;; things to select the frame/window/buffer we actually + ;; want in pre-command-hook. I'm actually surprised + ;; that it works, but mine is not too much to reason + ;; why; lots of other ways to try to achieve this didn't + ;; in fact work. + (execute-kbd-macro keys) + ;; KLUDGE: and then we restore old state + (select-window old-window) + (select-frame old-frame) + (set-buffer old-buffer))) + (t + ;; KLUDGE: we store the function name, which is fine, + ;; but some of our functions need to know which + ;; keystrokes were used to invoke them, so we need to + ;; pass those along, so we need to make sure that all + ;; iplayer-functions accept an optional argument, argh + ;; argh argh. + (with-selected-frame iplayer-command-frame + (with-current-buffer iplayer-command-buffer + (with-selected-window iplayer-command-window + (funcall function keys))))))))) + (message "Done updating iPlayer cache")))) (defmacro define-iplayer-command (name arglist &rest body) (let (docstring interactive) @@ -158,13 +174,19 @@ Used in the `iplayer-preset' command.") +(defun iplayer-frob-presets (presets) + (cond + ((version< emacs-version "24") + (mapcar (lambda (x) (cons (read-kbd-macro (car x)) (cdr x))) presets)) + (t presets))) + (define-iplayer-command iplayer-preset (&optional keys) "Switch display to a preset channel. The presets are defined in the variable `iplayer-presets'." (interactive) (let ((keys (or (and keys (concat keys)) (this-command-keys))) - (presets (mapcar (lambda (x) (cons (read-kbd-macro (car x)) (cdr x))) iplayer-presets))) + (presets (iplayer-frob-presets iplayer-presets))) (cond ((= (length keys) 1) (let ((channel (cdr (assoc keys presets)))) @@ -181,7 +203,7 @@ The presets are defined in the variable `iplayer-presets'." (interactive) (let ((id (get-text-property (point) 'iplayer-id))) (if id - (let ((default-directory "~/iPlayer/")) + (let ((default-directory iplayer-download-directory)) ;; should probably use a process filter instead to give us a ;; progress bar (message "downloading id %s" id)