X-Git-Url: http://christophe.rhodes.io/gitweb/?p=iplayer-el.git;a=blobdiff_plain;f=iplayer.el;h=1b02d16b6beed2e6a17f63a95977b1c55a7a9ac7;hp=cd59ac226eb70917a7ed7f899425d3db22d1dcfa;hb=fdc7d7e30e72d78e91285f0a1b0cfe3d2032daf8;hpb=dcc1b1dc85819eb7391d570f25d0a160e4197802 diff --git a/iplayer.el b/iplayer.el index cd59ac2..1b02d16 100644 --- a/iplayer.el +++ b/iplayer.el @@ -1,3 +1,30 @@ +;;; iplayer.el --- Browse and download BBC TV/radio shows + +;; Copyright (C) 2012-2013 Christophe Rhodes + +;; Author: Christophe Rhodes +;; Version: 0.1 +;; Keywords: multimedia + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Requires and uses the 'get-iplayer' script to provide a +;; convenient interface to BBC iPlayer. + +;;; Code: (defvar iplayer-updating-cache-process nil) (defvar iplayer-updating-cache-sentinel-info nil) (defvar iplayer-updating-cache-sentinel-executing nil) @@ -12,7 +39,8 @@ (let ((iplayer-command-frame (car info)) (iplayer-command-window (cadr info)) (iplayer-command-buffer (caddr info)) - (keys (car (cdddr info)))) + (keys (car (cdddr info))) + (function (cadr (cdddr info)))) (when (and (frame-live-p iplayer-command-frame) (window-live-p iplayer-command-window) (buffer-live-p iplayer-command-buffer)) @@ -33,7 +61,15 @@ ;; 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) + (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) @@ -58,7 +94,7 @@ (message "Updating iPlayer cache")) (if iplayer-updating-cache-sentinel-executing (progn ,@body) - (push (list (selected-frame) (selected-window) (current-buffer) (this-command-keys)) + (push (list (selected-frame) (selected-window) (current-buffer) (this-command-keys-vector) ',name) iplayer-updating-cache-sentinel-info))))) (defun get-iplayer-tree (&rest args) @@ -122,12 +158,12 @@ Used in the `iplayer-preset' command.") -(define-iplayer-command iplayer-preset (&optional prefix) +(define-iplayer-command iplayer-preset (&optional keys) "Switch display to a preset channel. The presets are defined in the variable `iplayer-presets'." - (interactive "p") - (let ((keys (this-command-keys)) + (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))) (cond ((= (length keys) 1) @@ -152,6 +188,29 @@ The presets are defined in the variable `iplayer-presets'." (start-process "get-iplayer" " *get-iplayer*" "get-iplayer" "--get" (format "%s" id))) (message "no id at point")))) +(defun iplayer-previous () + (interactive) + (save-match-data + (outline-previous-heading) + (while (and (= (funcall outline-level) 1) (not (bobp))) + (outline-previous-heading))) + (hide-other) + (unless (bobp) + (save-excursion + (outline-up-heading 1 t) + (show-children)))) + +(defun iplayer-next () + (interactive) + (save-match-data + (outline-next-heading) + (while (and (= (funcall outline-level) 1) (not (eobp))) + (outline-next-heading))) + (hide-other) + (save-excursion + (outline-up-heading 1 t) + (show-children))) + (defconst iplayer-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "0") 'iplayer) @@ -160,6 +219,8 @@ The presets are defined in the variable `iplayer-presets'." (define-key map (read-kbd-macro (substring presets i (1+ i))) 'iplayer-preset))) (define-key map (kbd "RET") 'iplayer-download) + (define-key map (kbd "j") 'iplayer-next) + (define-key map (kbd "k") 'iplayer-previous) map )) @@ -170,10 +231,14 @@ The presets are defined in the variable `iplayer-presets'." (use-local-map iplayer-mode-map) (setq major-mode 'iplayer-mode mode-name "iPlayer")) -(define-iplayer-command iplayer () +(define-iplayer-command iplayer (&optional keys) "Start the emacs iPlayer interface." (interactive) (setq mode-line-process nil) (display-iplayer-tree (get-iplayer-tree))) +;;;###autoload +(autoload 'iplayer "iplayer" "Start the emacs iPlayer interface." t) + (provide 'iplayer) +;;; iplayer.el ends here