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
|