aboutsummaryrefslogtreecommitdiff
path: root/emacs/.emacs.d/lisp/my/my-ytdl.el
blob: 05716828547dbf9f35b109564946baa5f90075fd (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
66
67
68
69
70
71
72
73
74
75
76
77
78
;;; my-ytdl.el -- ytdl client -*- lexical-binding: t -*-

;; Copyright (C) 2023 Free Software Foundation.

;; Author: Yuchen Pei <id@ypei.org>
;; Package-Requires: ((emacs "28.2"))

;; This file is part of dotfiles.

;; dotfiles is free software: you can redistribute it and/or modify it under
;; the terms of the GNU Affero General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; dotfiles 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 Affero General
;; Public License for more details.

;; You should have received a copy of the GNU Affero General Public
;; License along with dotfiles.  If not, see <https://www.gnu.org/licenses/>.

;;; Commentary:

;; ytdl client. Works with youtube-dl, yt-dlp etc.

;;; Code:


(defvar my-ytdl-program "yt-dlp")

(defvar my-ytdl-video-args
  '("--download-archive" "yt-dlp-archive" "-o"
;;    "%(id)s.%(ext)s" ;; for long names
    "%(playlist|.)s/%(playlist_index|)s%(playlist_index&-|)s%(title)s.%(ext)s"
    ;; https://github.com/yt-dlp/yt-dlp/issues/5630
    "-f" "bv*[height<=?720]+ba/best[height<=?720]"
    "--write-subs" "--sub-langs" "en"
    "--write-description"
    "--write-thumbnail"))

(defvar my-ytdl-video-download-dir "~/Downloads"
  "Directory for ytdl to download videos to.")

(defvar my-ytdl-audio-args
  '("-x" "--download-archive" "yt-dlp-archive" "-o"
   ;; "%(id)s.%(ext)s" ;; for long names
    "%(playlist|.)s/%(playlist_index|)s%(playlist_index&-|)s%(title)s.%(ext)s"
    "--write-description"
    "--write-thumbnail"))

(defvar my-ytdl-audio-download-dir "~/Downloads"
  "Directory for ytdl to download audios to.")

(defun my-ytdl-internal (urls type &optional cut-segments)
  (my-with-default-directory (if (eq type 'video)
                              my-ytdl-video-download-dir
                            my-ytdl-audio-download-dir)
    (apply 'my-start-process-with-torsocks
           (append
            (list nil (format "ytdl-%s" urls) (format "*ytdl-%s*" urls)
                  my-ytdl-program)
            (if (eq type 'video) my-ytdl-video-args my-ytdl-audio-args)
            (split-string urls)))))

;;; fixme: autoload
(defun my-ytdl-video (urls)
  "Download videos with ytdl."
  (interactive "sURL(s): ")
  (my-ytdl-internal urls 'video))

(defun my-ytdl-audio (urls)
  "Download audio with ytdl."
  (interactive "sURL(s): ")
  (my-ytdl-internal urls 'audio))

(provide 'my-ytdl)
;;; my-ytdl.el ends here