;;; jao-embark-targets.el --- embark actions -*- lexical-binding: t; -*- ;; Copyright (C) 2021 jao ;; Author: jao ;; Keywords: convenience ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; Embark targets and actions ;;; Code: (require 'embark) (declare-function w3m-anchor "w3m") (declare-function org-link-any-re "ol") (declare-function org-open-link-from-string "ol") (declare-function org-in-regexp "org-macs") (defun jao-embark-targets--org-link () (when (derived-mode-p 'org-mode) (when (org-in-regexp org-link-any-re) (let ((lnk (match-string-no-properties 2))) (if (string-match-p "http://.+" lnk) (cons 'url lnk) (cons 'org-link (match-string-no-properties 0))))))) (embark-define-keymap jao-embark-targets-org-link-map "Actions for org links" ((kbd "RET") org-open-link-from-string)) (add-to-list 'embark-target-finders #'jao-embark-targets--org-link) (add-to-list 'embark-keymap-alist '(org-link . jao-embark-targets-org-link-map)) (defvar jao-embark-targets-video-url-rx (format "^https?://\\(?:www\\.\\)?%s/.+" (regexp-opt '("youtu.be" "youtube.com" "blip.tv" "vimeo.com" "infoq.com") t)) "A regular expression matching URLs that point to video streams") (defun jao-embark-targets--w3m-anchor () (when (not (region-active-p)) (when-let ((url (or (w3m-anchor) w3m-current-url))) (cons 'url url)))) (defun jao-embark-targets--refine-url (url) (if (string-match-p jao-embark-targets-video-url-rx url) (cons 'video-url url) (cons 'url url))) (defun jao-embark-targets--play-video (player url) (interactive "sURL: ") (let ((cmd (format "%s %s" player (shell-quote-argument url)))) (start-process-shell-command player nil cmd))) (defun jao-embark-targets-mpv (&optional url) "Play video stream with mpv" (interactive "sURL: ") (jao-embark-targets--play-video "mpv" url)) (defun jao-embark-targets-vlc (&optional url) "Play video stream with vlc" (interactive "sURL: ") (jao-embark-targets--play-video "vlc" url)) (embark-define-keymap jao-embark-targets-video-url-map "Actions on URLs pointing to remote video streams." :parent embark-url-map ("v" jao-embark-targets-vlc) ("m" jao-embark-targets-mpv)) (define-key embark-url-map (kbd "f") #'browse-url-firefox) (add-to-list 'embark-target-finders #'jao-embark-targets--w3m-anchor) (add-to-list 'embark-transformer-alist '(url . jao-embark-targets--refine-url)) (add-to-list 'embark-keymap-alist '(video-url . jao-embark-targets-video-url-map)) (provide 'jao-embark-targets) ;;; jao-embark-targets.el ends here