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)))
63 (message "%s" (this-command-keys))
66 (let ((channel (cdr (assoc keys presets))))
68 (iplayer-channel (format "^%s$" channel))
69 (error "no preset for key %s" keys)))))))
71 (defun iplayer-channel (channel)
72 (display-iplayer-tree (get-iplayer-tree "--channel" channel)))
74 (defun iplayer-download ()
76 (let ((id (get-text-property (point) 'iplayer-id)))
78 (let ((default-directory "~/iPlayer/"))
79 ;; should probably use a process filter instead to give us a
81 (message "downloading id %s" id)
82 (start-process "get-iplayer" " *get-iplayer*" "get-iplayer" "--get" (format "%s" id)))
83 (message "no id at point"))))
85 (defconst iplayer-mode-map
86 (let ((map (make-sparse-keymap)))
87 (define-key map (kbd "0") 'iplayer)
88 (let ((presets "123456789!\"£$%^&*()"))
89 (dotimes (i (length presets))
90 (define-key map (read-kbd-macro (substring presets i (1+ i)))
92 (define-key map (kbd "RET") 'iplayer-download)
96 (defun iplayer-mode ()
97 "A major mode for the BBC's iPlayer.
100 (use-local-map iplayer-mode-map)
101 (setq major-mode 'iplayer-mode mode-name "iPlayer"))
105 (display-iplayer-tree (get-iplayer-tree)))