Hi Paul Thank you very much for sharing this, I will benefit a lot and the interactivity from within Emacs seems extremely useful. My recent searches for how to play an Org link to an audio file didn't find any result and I was about to work out something with mpg123. I planned to define a new link type for this but your solution with "file:" looks to me more like it should be and is also backwards compatible with links already made with "file:".
And even better if "file:" could also cover my requirement to have an optional link search part that lets the player start and stop at a specified time. Let me define the format like this: - start to play in file at 00:03:21, stop at 00:06:54: [[file:some_podcast.mp3::00:03:21-00:06:54]] - start to play in file at 00:03:21, play until end of file: [[file:some_podcast.mp3::00:03:21]] - play the whole file: [[file:some_podcast.mp3]] I would like to explicitly not allow [[file:some_podcast.mp3::03:21]] as a shorter option with MM:SS because I would like to see XX:XX being reserved for HH:MM without exception in Org. There was a recent discussion covering this in the context of time calculation: http://thread.gmane.org/gmane.emacs.orgmode/39487/focus=39840 Michael On Thu, Jun 9, 2011 at 23:55, Paul Sexton <psex...@xnet.co.nz> wrote: > I have spent a few hours figuring this out so I thought I would post it for > the benefit of others. > > I am learning a language, and wanted to include hyperlinks to audio files > within my org document, and be able to play each file by clicking on the > link. > > I eventually discovered the variable 'org-file-apps' which allows you to > associate particular applications with particular file types. > > I am using Bongo (https://github.com/dbrock/bongo) as the media player. > EMMS is another actively developed media player, but setup looked too > complicated at first glance. > > I am using MPlayer as the actual media player. This supports almost all > audio and video file formats. Most importantly, it works on Windows as well > as on Linux (VLC has a Windows port but it doesn't work with Bongo as the > 'fake-tty' interface is not implemented on Windows.) > > My current setup means that clicking on a link such as [[file:song.mp3]] > adds it to the active Bongo playlist (in another buffer) and immediately > starts playing it. Playback can be paused, fast-forwarded etc using > Bongo. > > When Bongo plays a file it puts some icons in the modeline that > resemble the 'play', 'stop' etc symbols, and can be used to control > playback using the mouse. I found these worked erratically outside > the actual Bongo playlist buffer, so I have instead bound some > org-mode keys (ctrl + numpad keys) to the relevant functions. > This is optional of course. > > I have only tested this with mp3 files, but it ought to work with > video as well. > > > My setup follows: > ------------------- > > ;;; Part 1. Bongo setup > > (add-to-list 'load-path "/path/to/bongo")) > (autoload 'bongo "bongo" > "Start Bongo by switching to a Bongo buffer." t) > > (setq bongo-mplayer-program-name > (case system-type > ((windows-nt cygwin) "c:\\Program Files\\MPlayer for > Windows\\MPlayer.exe") > (t "mplayer"))) > > (setq bongo-enabled-backends '(mplayer)) > > ;;; Part 2. Org setup > > (defvar av-file-regex > (concat "\\." (regexp-opt > (append bongo-audio-file-name-extensions > bongo-video-file-name-extensions)) "$")) > > (add-to-list 'org-file-apps > (cons av-file-regex '(org-play-media-file file))) > > (defun org-play-media-file (filename) > (with-bongo-buffer > (bongo-insert-file filename) > (backward-char) > (bongo-play))) > > ;;; Part 3. Keybindings to allow control of playback within Org buffer > ;;; (optional) > > ;; Numpad Ctrl-0: pause/resume > (define-key org-mode-map (kbd "<C-kp-0>") 'bongo-pause/resume) > (define-key org-mode-map (kbd "<C-kp-insert>") 'bongo-pause/resume) > ;; Numpad Ctrl-.: stop current track, or restart from beginning if stopped > (define-key org-mode-map (kbd "<C-kp-decimal>") 'bongo-start/stop) > (define-key org-mode-map (kbd "<C-kp-delete>") 'bongo-start/stop) > ;; Numpad Ctrl-PgUp, Ctrl-PgDn: raise/lower volume > (define-key org-mode-map (kbd "<C-kp-prior>") 'bongo-volume-raise) > (define-key org-mode-map (kbd "<C-kp-next>") 'bongo-volume-lower) > (define-key org-mode-map (kbd "<C-kp-9>") 'bongo-volume-raise) > (define-key org-mode-map (kbd "<C-kp-3>") 'bongo-volume-lower) > ;; Numpad Ctrl-left, Ctrl-right: skip back/forward 10 seconds > (define-key org-mode-map (kbd "<C-kp-left>") 'bongo-seek-backward-10) > (define-key org-mode-map (kbd "<C-kp-right>") 'bongo-seek-forward-10) > (define-key org-mode-map (kbd "<C-kp-4>") 'bongo-seek-backward-10) > (define-key org-mode-map (kbd "<C-kp-6>") 'bongo-seek-forward-10)