;; -*- lexical-binding: t; -*- (require 'servall-client) (require 'servall-results) (defvar servall-ytdl-invidious-host "https://yewtu.be") (defvar servall-ytdl-player-command "mpv") ;; ytdl results (define-derived-mode servall-ytdl-results-mode servall-results-mode "servall-ytdl-results" "Mode for showing and selecting ytdl results" (setq-local servall-ytdl-results-query nil)) (defun servall-ytdl-search (query) (interactive "sYtdl Query: ") (with-current-buffer (get-buffer-create servall-results-buffer) (servall-ytdl-results-mode) (setq servall-ytdl-results-query query servall-results-update-function 'servall-ytdl-results-update servall-results-re-search-function 'servall-ytdl-search servall-results-open-function 'servall-ytdl-results-open) (servall-results-update (lambda () (switch-to-buffer-other-window servall-results-buffer))))) (defun servall-ytdl-results-update (cb) (servall-api-ytdl-search servall-ytdl-results-query (lambda (results) (with-current-buffer (get-buffer-create servall-results-buffer) (let* ((inhibit-read-only t)) (erase-buffer) (mapc (lambda (result) (insert (propertize (concat "* " (alist-get 'title result) " [" (seconds-to-string (alist-get 'duration result)) "]\n") 'id (alist-get 'id result))) (insert (alist-get 'description result) "\n\n")) results) (goto-char (point-min)))) (funcall cb)))) (defun servall-ytdl-copy-id () (interactive) (let ((id (get-text-property (point) 'id))) (kill-new id) (message "Copied %s" id))) (define-key servall-ytdl-results-mode-map "w" 'servall-ytdl-copy-id) (defun servall-ytdl-results-open (arg) (interactive "P") (let* ((id (get-text-property (point) 'id)) (url (format "%s/watch?v=%s" servall-ytdl-invidious-host id))) (cond ((equal arg '(4)) (start-process-with-torsocks nil "servall-ytdl-player" "*servall-ytdl-player*" servall-ytdl-player-command url)) ((equal arg '(16)) (start-process "servall-ytdl-player" "*servall-ytdl-player*" servall-ytdl-player-command url)) (t (emms-play-url url))))) (provide 'servall-ytdl)