From mboxrd@z Thu Jan 1 00:00:00 1970 From: stardiviner Subject: Add a new link type for video files Date: Fri, 03 Jan 2020 17:07:16 +0800 Message-ID: <87y2uohprv.fsf@gmail.com> Reply-To: numbchild@gmail.com Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:36996) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1inJ0Z-0005rH-FA for emacs-orgmode@gnu.org; Fri, 03 Jan 2020 04:12:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1inJ0Y-0000gG-1i for emacs-orgmode@gnu.org; Fri, 03 Jan 2020 04:12:39 -0500 Received: from [183.246.141.113] (port=10540 helo=dark.localdomain) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1inJ0X-0000EZ-AX for emacs-orgmode@gnu.org; Fri, 03 Jan 2020 04:12:37 -0500 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: Org Mode I write a patch to add new link type: #+begin_example [[video:/path/to/file.mp4::00:13:20]] #+end_example This will open video file in specific timestamp. And it is possible to add more options in link. Like video player arguments. I want to ask should I add this patch to Org Mode built-in? Here is my patch source code: #+begin_src emacs-lisp :file "ol-video.el" ;;; [[video:/path/to/file.mp4::00:13:20]] (defcustom org-video-link-open-command "mplayer" "Specify the program for openning video: link." :type 'string) (defvar org-video-link-extension-list '("avi" "rmvb" "ogg" "mp4" "mkv")) (defun org-video-link-open (uri) "Open video file `URI' with video player." (let* ((list (split-string uri "::")) (path (car list)) (start-timstamp (cadr list))) (make-process :command (list org-video-link-open-command "-ss" start-timstamp (expand-file-name (org-link-unescape path))) :name "org-video-link"))) (defun org-video-complete-link (&optional arg) "Create a video link using completion." (let ((file (read-file-name "Video: " nil nil nil nil #'(lambda (file) (seq-contains-p org-video-link-extension-list (file-name-extension file))))) (pwd (file-name-as-directory (expand-file-name "."))) (pwd1 (file-name-as-directory (abbreviate-file-name (expand-file-name "."))))) (cond ((equal arg '(16)) (concat "video:" (abbreviate-file-name (expand-file-name file)))) ((string-match (concat "^" (regexp-quote pwd1) "\\(.+\\)") file) (concat "video:" (match-string 1 file))) ((string-match (concat "^" (regexp-quote pwd) "\\(.+\\)") (expand-file-name file)) (concat "video:" (match-string 1 (expand-file-name file)))) (t (concat "video:" file))))) (org-link-set-parameters "video" :follow #'org-video-link-open :complete #'org-video-complete-link) #+end_src -- [ stardiviner ] I try to make every word tell the meaning what I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3