ol-emms.el 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. ;; Adds org-links for EMMS
  2. ;; Based on
  3. ;; https://orgmode.org/manual/Adding-Hyperlink-Types.html#Adding-Hyperlink-Types
  4. ;;
  5. ;; - (untested);;
  6. ;; (with-eval-afeter-load "org"
  7. ;; (add-to-list
  8. ;; 'load-path
  9. ;; "/your/path/to/this/file.el")
  10. ;; (require 'ol-emms))
  11. ;;
  12. ;; - To load it with use-package:
  13. ;; (use-package ol-emms
  14. ;; :after (ol)
  15. ;; :load-path "~/.emacs.d/plugins/"
  16. ;; :config
  17. ;; (add-hook 'org-mode-hook
  18. ;; #'(lambda ()
  19. ;; "Add `org-emms-open' to `org-add-link-type'"
  20. ;; (org-add-link-type "emms" 'org-emms-open))))
  21. (require 'ol)
  22. (require 'emms)
  23. (defun org-emms-store-link ()
  24. "Store a link to a sound file."
  25. (when (eq major-mode 'emms-playlist-mode)
  26. ;; This is EMMS mode, we do make this link.
  27. (let* ((file (org-emms-get-file-name))
  28. (link (concat "emms:" file))
  29. (desc (emms-info-track-description (emms-playlist-track-at)))
  30. )
  31. (org-link-store-props
  32. :type "emms"
  33. :link link
  34. :decription desc))))
  35. (defun org-emms-get-file-name ()
  36. "Get the file name from the current playlist line."
  37. (let ((fname (emms-track-simple-description (emms-playlist-track-at))))
  38. (if (file-exists-p fname)
  39. fname
  40. nil)))
  41. (defun org-emms-export (link description format)
  42. "Export an EMMS link from Org files."
  43. (let ((desc (or link description)))
  44. (pcase format
  45. (`html (format "<a href=\"%s\">%s</a>" path desc))
  46. (`latex (format "\\href{%s}{%s}" path desc))
  47. (`texinfo (format "@uref{%s,%s}" path desc))
  48. (`ascii (format "%s (%s)" desc path))
  49. (_ path))))
  50. (defun org-emms-open (link)
  51. "The EMMS command to be used to play a sound file."
  52. (if (file-exists-p link)
  53. ;; If the file is a playlist (based on extension), use
  54. ;; it as such. Otherwise, play the file
  55. (let ((fname (expand-file-name link))
  56. (buf nil))
  57. ;; Add file to playlist
  58. (if ;; Check if the extension of the file is in the
  59. ;; list of playlist extensions
  60. (member
  61. ;; Get the extension as a symbol
  62. ;; https://emacsredux.com/blog/2014/12/05
  63. ;; /converting-between-symbols-and-strings/
  64. (intern (file-name-extension link))
  65. emms-source-playlist-formats)
  66. ;; Add playlist
  67. (emms-play-playlist fname)
  68. ;; Add regular file
  69. (emms-play-file fname)))))
  70. (defun org-emms-complete-link (&optional arg)
  71. "Use the existing file name completion for file.
  72. Links to get the file name and append it. (Based on
  73. `org-pdfview')."
  74. (replace-regexp-in-string "^file:" "emms:" (org-link-complete-file arg)))
  75. (org-link-set-parameters "emms"
  76. :follow #'org-emms-open
  77. :export #'org-emms-export
  78. :complete #'org-emms-complete-link
  79. :store #'org-emms-store-link)
  80. (provide 'ol-emms)
  81. ;;; ol-emms.el ends here