diff options
author | Yuchen Pei <hi@ypei.me> | 2022-03-07 09:44:36 +1100 |
---|---|---|
committer | Yuchen Pei <hi@ypei.me> | 2022-03-14 20:27:54 +1100 |
commit | c532f2d1203eb4eefc71baa403bf51d176dd43ce (patch) | |
tree | 25595fcef6cb0301a0272b825b305bef9b82664c | |
parent | 73abffcfe566a7ec41e3fb7dbfc5d313fb0bc913 (diff) |
Adding emms-info-ytdl, for urls understood by youtube-dl / yt-dlp.
-rw-r--r-- | emms-info-ytdl.el | 91 | ||||
-rw-r--r-- | emms-setup.el | 1 |
2 files changed, 92 insertions, 0 deletions
diff --git a/emms-info-ytdl.el b/emms-info-ytdl.el new file mode 100644 index 0000000..b1936c8 --- /dev/null +++ b/emms-info-ytdl.el @@ -0,0 +1,91 @@ +;;; emms-info-ytdl.el --- info-method for EMMS using ytdl -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 Free Software Foundation, Inc. + +;; Author: Yuchen Pei (ycp@gnu.org) +;; Keywords: multimedia + +;; EMMS 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. + +;; EMMS 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 EMMS; see the file COPYING.. If not, see +;; <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; (add-to-list emms-info-functions 'emms-info-ytdl) + +;; To use this you would need to have `emms-info-ytdl-command` +;; (typically youtube-dl or yt-dlp) installed on your system. + + +;;; Code: + +(require 'emms-info) +(require 'json) + + +(defgroup emms-info-ytdl nil + "Options for EMMS." + :group 'emms-info) + +(defvar emms-info-ytdl-field-map + '((info-title . title) + (info-artist . artist) + (info-playing-time . duration)) + "Mapping for ytdl output.") + +(defvar emms-info-ytdl-regexp + "^https?://" + "Regexp to use ytdl to get info.") + +(defvar emms-info-ytdl-exclude-regexp + "\\(\\.\\w+$\\|/playlist\\|/channel\\)" + "Regexp not to use ytdl to get info.") + +(defvar emms-info-ytdl-command + "youtube-dl" + "Command to run for emms-info-ytdl.") + +(defun emms-info-ytdl (track) + "Set TRACK info using ytdl." + (when (and (eq (emms-track-type track) 'url) + (string-match emms-info-ytdl-regexp (emms-track-name track)) + (not + (string-match emms-info-ytdl-exclude-regexp + (emms-track-name track)))) + (with-temp-buffer + (when (zerop + (let ((coding-system-for-read 'utf-8)) + (call-process emms-info-ytdl-command nil '(t nil) nil + "-j" (emms-track-name track)))) + (goto-char (point-min)) + (condition-case nil + (let ((json-fields (json-read))) + (mapc + (lambda (field-map) + (let ((emms-field (car field-map)) + (ytdl-field (cdr field-map))) + (let ((track-field (assoc ytdl-field json-fields))) + (when track-field + (emms-track-set + track + emms-field + (if (eq emms-field 'info-playing-time) + (truncate (cdr track-field)) + (cdr track-field))))))) + emms-info-ytdl-field-map)) + (error (message "error while reading track info"))) + track)))) + +(provide 'emms-info-ytdl) + +;;; emms-info-ytdl.el ends here diff --git a/emms-setup.el b/emms-setup.el index 5fd3267..3194ecc 100644 --- a/emms-setup.el +++ b/emms-setup.el @@ -86,6 +86,7 @@ the stable features which come with the Emms distribution." (require 'emms-info-tinytag) (require 'emms-info-exiftool) (require 'emms-info-native) + (require 'emms-info-ytdl) (require 'emms-cache) (require 'emms-mode-line) (require 'emms-mark) |