;;; orgmedia.el - extension for video/audio indexing within org-mode buffer (require 'org) (org-add-link-type "media" 'org-media-open) (add-hook 'org-store-link-functions 'org-media-store-link) (defun org-media-store-link () ;; for new gneve use both start and end [x.y] (also vslot) (when (memq major-mode '(gneve-mode)) "Store a link to video/audio file from a gneve buffer/line" (setq inhibit-field-text-motion t) (setq vslot (number-at-point));; read vslot - number before : (re-search-forward ":") (setq timestamp (buffer-substring (point) (line-end-position))) (goto-char (point-min)) (next-line (+ vslot 1)) ;; match between inverted commas (re-search-forward "\\\"" nil t) (setq ptt (point)) (re-search-forward "\\\"" nil t) (setq filename (buffer-substring ptt (- (point) 1))) (let* ((link (format "media:%s#%s" filename timestamp)) (description (format "Media link for %s:%s" filename timestamp))) (org-store-link-props :type "media" :link link :description description)))) (defun org-media-open (path) "Visit the media on PATH." (if (not (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" path)) (error "Error in media link")) (setq file (match-string 1 path) timestamp (match-string 3 path)) (org-media-follow-link file timestamp)) (defun org-media-follow-link (file timestamp) ;; inigo file in=50 out=100 (let ((start (car (split-string timestamp " "))) (end (cadr (split-string timestamp " ")))) (start-process "my-process" "bood" "/usr/local/bin/inigo" (expand-file-name file) (format "in=%s" start) (format "out=%s" end)))) (provide 'org-media)