From aed093522475d5071e2244d5a56e9ce5cff0d6cc Mon Sep 17 00:00:00 2001 From: Gerard Vermeulen Date: Sat, 15 Jun 2024 19:09:53 +0200 Subject: [PATCH] Rework the "Extending org-mode to handle YouTube links" section --- README.org | 73 +++++++++++++++++++++++------------------------------- 1 file changed, 31 insertions(+), 42 deletions(-) diff --git a/README.org b/README.org index d1f5b3d..dc69c40 100644 --- a/README.org +++ b/README.org @@ -2956,61 +2956,50 @@ See `org-link-parameters' for details about PATH, DESC and FORMAT." :END: Listing [[lst:define-org-yt-link-type][define org-yt-link type]] implements code to open the link to the -following YouTube video [[yt:eaZUZCzaIgw][Extending org-mode to handle YouTube links]] and the -following [[https://raw.githubusercontent.com/bitspook/spookmax.d/master/readme.org][Emacs setup]]. +following YouTube video [[yt:eaZUZCzaIgw][Extending org-mode to handle YouTube links]] using the +following [[https://raw.githubusercontent.com/bitspook/spookmax.d/master/readme.org][Emacs setup]]. Note: Listing [[lst:define-org-yt-link-type][define org-yt-link type]] does only +implement normal links, but no embedded frames. Opening [[yt:eaZUZCzaIgw][Extending org-mode to handle YouTube links]] may fail due to a bug in the interface between =mpv= and =yt-dlp=. Listing [[lst:set-emms-options][set EMMS options]] indicates how to work around this bug at the cost of making the user interface less clean. However, the link [[yt:48JlgiBpw_I][Absolute Beginner's Guide to Emacs]] works always. -The following posts provide programming information: -1. [[https://developers.google.com/youtube/v3/docs][YouTube API reference]]. -2. [[https://developers.google.com/youtube/iframe_api_reference][YouTube Player API reference for iframe embeds]]. - #+caption[Define an =org-link= type for =YouTube=]: #+caption: Define an =org-link= type for =YouTube=. #+name: lst:define-org-yt-link-type #+begin_src emacs-lisp -n :results silent -;; https://bitspook.in/blog/extending-org-mode-to-handle-youtube-paths/ -(declare-function emms-add-url "emms-source-file" (url)) -(declare-function emms-playlist-last "emms" ()) -(declare-function emms-playlist-mode-play-current-track "emms-playlist-mode" ()) -(declare-function with-current-emms-playlist "emms" (&rest body)) +(when (ensure-package-installation 'emms) + ;; https://bitspook.in/blog/extending-org-mode-to-handle-youtube-paths/ + (defun org-yt-emms-open (path) + "Open an \"YouTube\" PATH link with `emms' using \"mpv\"." + (let ((link (format "https://www.youtube.com/watch?v=%s" path))) + (require 'emms nil 'noerror) + (emms-add-url link) + (with-current-emms-playlist + (save-excursion + (emms-playlist-last) + (emms-playlist-mode-play-current-track))))) -(defun org-yt-emms-open (path) - "Open an \"YouTube\" PATH link with `emms' using \"mpv\"." - (let ((url (format "https://www.youtube.com/watch?v=%s" path))) - (require 'emms nil 'noerror) - (emms-add-url url) - (with-current-emms-playlist - (save-excursion - (emms-playlist-last) - (emms-playlist-mode-play-current-track))))) + (defun org-yt-url-browse-open (path) + "Open an \"YouTube\" PATH link with `url-browse'." + (let ((link (format "https://www.youtube.com/watch?v=%s" path))) + (browse-url link))) -(defun org-yt-url-browse-open (path) - "Open an \"YouTube\" PATH link with `url-browse'." - (let ((url (format "https://www.youtube.com/watch?v=%s" path))) - (browse-url url))) + (defun org-yt-export (path desc backend _) + "Export an \"YouTube\" PATH link according to DESC and BACKEND." + (pcase backend + (`ascii + (format "[%s] " desc path)) + (`html + (format "%s" path desc)) + (`latex + (format "\\href{https://www.youtube.com/watch?v=%s}{%s}" path desc)) + (_ path))) -(defun org-yt-export (path desc backend _) - "Export an \"YouTube\" PATH link according to DESC and BACKEND." - (pcase backend - (`ascii - (format "[%s] " desc path)) - (`html - (format "" path desc)) - (`latex - (format "\\href{https://www.youtube.com/watch?v=%s}{%s}" path desc)) - (_ path))) - -(with-eval-after-load 'ol - (org-link-set-parameters - "yt" :follow #'org-yt-emms-open :export #'org-yt-export)) + (with-eval-after-load 'ol + (org-link-set-parameters + "yt" :follow #'org-yt-emms-open :export #'org-yt-export))) #+end_src *** [[https://tecosaur.github.io/emacs-config/#translate-capital-keywords][Translate capital keywords (old) to lower case (new)]]