summaryrefslogtreecommitdiff
path: root/lisp/servall-ytdl.el
blob: e2fd131a05597202d91824b8127f38e69b0d3637 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
;; -*- 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)