aboutsummaryrefslogtreecommitdiff
path: root/emacs/.emacs.d/lisp/my/my-ytdl.el
blob: 9118493e8d98c6a264a8e76e72beb1fc6c02ddff (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
;;; 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"
    ;; Get rid of silly full-width chars and emojis
    ;; https://old.reddit.com/r/youtubedl/comments/yz9ozo/how_do_i_get_ytdlp_downloads_without_forbidden/
    "--replace-in-metadata" "title"
    "[\U0000002A\U0000005C\U0000002F\U0000003A\U00000022\U0000003F\U0000007C\U00010000-\U0010FFFF]" "_"
    ;; truncate filename length, but it will not work with the
    ;; following file name format, as it will replace the leading ./
    ;; with /
    ;; "--trim-filenames" "200"
    "-o"
    "%(playlist|.)s/%(playlist_index|)s%(playlist_index&-|)s%(title)s.%(ext)s"    ;; https://github.com/yt-dlp/yt-dlp/issues/5630
    ;;    "%(id)s.%(ext)s" ;; alternative for long names
    "-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"
    ;; Get rid of silly full-width chars and emojis
    ;; https://old.reddit.com/r/youtubedl/comments/yz9ozo/how_do_i_get_ytdlp_downloads_without_forbidden/
    "--replace-in-metadata" "title"
    "[\U0000002A\U0000005C\U0000002F\U0000003A\U00000022\U0000003F\U0000007C\U00010000-\U0010FFFF]" "_"
    "-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 no-tor)
  (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 no-tor (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))

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

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

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