1 (defun get-iplayer-tree (&rest args)
3 (apply #'call-process "get-iplayer" nil t nil "--nocopyright" "--type" "radio,tv" "--tree" "--terse" args)
4 (goto-char (point-min))
5 (let (result program episodes)
6 (while (< (point) (point-max))
9 (when (and program episodes)
10 (push (cons program (reverse episodes)) result))
11 (setf program (buffer-substring (point) (progn (end-of-line) (point))))
12 (when (string-match "^\\(tv\\|radio\\), " program)
13 (setq program (substring program (match-end 0))))
15 (unless (= (point) (point-max))
17 ((looking-at "^ \\([0-9]+\\):\\s-\\(.*\\)$")
19 (cons (buffer-substring (match-beginning 1) (match-end 1))
20 (buffer-substring (match-beginning 2) (match-end 2)))))
21 (when (string-match "^\\(tv\\|radio\\), " (cdr episode))
22 (rplacd episode (substring (cdr episode) (match-end 0))))
23 (push episode episodes))
28 (defun display-iplayer-tree (tree)
29 (with-current-buffer (get-buffer-create "*iplayer*")
30 (delete-region (point-min) (point-max))
34 (let ((program (car entry))
35 (episodes (cdr entry)))
36 (insert (propertize (format "* %s\n" program) 'face 'outline-1))
37 (dolist (episode episodes)
38 (insert (propertize (format "** %s\n" (cdr episode))
39 'face 'outline-2 'iplayer-id (car episode))))))
41 (goto-char (point-min)))
42 (switch-to-buffer (get-buffer-create "*iplayer*")))
44 (defvar iplayer-presets
51 ("\"" . "BBC Radio 2")
54 ("%" . "BBC Radio 5 live")
57 ("*" . "BBC Radio 4 Extra")))
59 (defun iplayer-preset (&optional prefix)
61 (let ((keys (this-command-keys))
62 (presets (mapcar (lambda (x) (cons (read-kbd-macro (car x)) (cdr x))) iplayer-presets)))
65 (let ((channel (cdr (assoc keys presets))))
68 (setq mode-line-process (format "[%s]" channel))
69 (iplayer-channel (format "^%s$" channel)))
70 (error "no preset for key %s" keys)))))))
72 (defun iplayer-channel (channel)
73 (display-iplayer-tree (get-iplayer-tree "--channel" channel)))
75 (defun iplayer-download ()
77 (let ((id (get-text-property (point) 'iplayer-id)))
79 (let ((default-directory "~/iPlayer/"))
80 ;; should probably use a process filter instead to give us a
82 (message "downloading id %s" id)
83 (start-process "get-iplayer" " *get-iplayer*" "get-iplayer" "--get" (format "%s" id)))
84 (message "no id at point"))))
86 (defconst iplayer-mode-map
87 (let ((map (make-sparse-keymap)))
88 (define-key map (kbd "0") 'iplayer)
89 (let ((presets "123456789!\"£$%^&*()"))
90 (dotimes (i (length presets))
91 (define-key map (read-kbd-macro (substring presets i (1+ i)))
93 (define-key map (kbd "RET") 'iplayer-download)
97 (defun iplayer-mode ()
98 "A major mode for the BBC's iPlayer.
101 (use-local-map iplayer-mode-map)
102 (setq major-mode 'iplayer-mode mode-name "iPlayer"))
106 (setq mode-line-process nil)
107 (display-iplayer-tree (get-iplayer-tree)))