├── README.md ├── Makefile ├── yt.rb ├── flags.json ├── generate.rb └── flags.yaml /README.md: -------------------------------------------------------------------------------- 1 | # yt-dl-config 2 | 3 | Generate configuration files for [youtube-dl](https://github.com/ytdl-org/youtube-dl). 4 | 5 | This will generate configuration files for 6 | - best, 1080p, 720p, 480p, 360 video download, playlist and channel 7 | - flac, mp3 audio download 8 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | build: 2 | ruby generate.rb 3 | 4 | install: build 5 | mkdir -p ~/.config/youtube-dl ~/.yt-dl 6 | cp config/* ~/.yt-dl/ 7 | cp config/yt.default.conf ~/.config/youtube-dl/config 8 | cp yt.rb ~/.yt-dl/ 9 | 10 | clean: 11 | rm -rf config/ 12 | rm flags.json 13 | 14 | all: clean build 15 | -------------------------------------------------------------------------------- /yt.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | # frozen_string_literal: true 3 | 4 | def audio 5 | %w[mp3 flac] 6 | end 7 | 8 | def playlist 9 | %w[playlist channel tw] 10 | end 11 | 12 | def video_q 13 | %w[best 1080 720 480 360].each do |e| 14 | return true if ARGV.include? e 15 | end 16 | 17 | false 18 | end 19 | 20 | url = ARGV.pop 21 | command = ARGV + ['default'] 22 | 23 | is_audio = (ARGV & audio).any? 24 | is_playlist = ARGV.include? 'playlist' 25 | is_channel = ARGV.include? 'channel' 26 | 27 | command << if is_audio 28 | 'audio' 29 | else 30 | 'video' 31 | end 32 | 33 | command << 'output' if !is_playlist && !is_channel 34 | 35 | command << '720' if !is_audio && !video_q 36 | 37 | if ARGV.include? 'debug' 38 | puts command.flatten 39 | exit 40 | else 41 | p command.sort! 42 | system("youtube-dl --config-location ~/.yt-dl/yt.#{command.sort.join('.')}.conf #{url}") 43 | end 44 | -------------------------------------------------------------------------------- /flags.json: -------------------------------------------------------------------------------- 1 | {"flags":{"--add-metadata":["default"],"--audio-format {AUDIOFORMAT}":["mp3","flac"],"--audio-quality 0":["audio"],"--cache-dir ~/.cache/youtube-dl":["default"],"--continue":["default"],"--convert-subs lrc":["audio"],"--convert-subs srt":["video"],"--download-archive ~/.yt-dl/yt.{ARCHIVE}.archive.txt":["video","audio","tw"],"--embed-subs":["video"],"--embed-thumbnail":["mp3"],"--external-downloader aria2c":["disable"],"--external-downloader-args '-c -j 3 -x 3 -s 3 -k 1M'":["disable"],"--format 'bestaudio'":["flac","mp3"],"--format 'bestvideo+bestaudio/best'":["best"],"--format 'bestvideo[height<=1080]+bestaudio/best[height<=1080]'":["1080"],"--format 'bestvideo[height<=360]+bestaudio/best[height<=360]'":["360"],"--format 'bestvideo[height<=480]+bestaudio/best[height<=480]'":["480"],"--format 'bestvideo[height<=720]+bestaudio/best[height<=720]'":["720","tw"],"--hls-prefer-ffmpeg":["default"],"--ignore-errors":["default"],"--merge-output-format mkv":["video"],"--netrc":["default"],"--no-warnings":["default"],"--output \"/media/drive/b/YouTube/%(uploader)s (%(uploader_id)s)/%(playlist_title)s/%(playlist_title)s_%(playlist_index)s_%(upload_date)s_%(title)s_[%(id)s].%(ext)s\"":["playlist","reverse","channel"],"--output \"/media/drive/b/YouTube/%(uploader)s (%(uploader_id)s)/%(playlist_title)s_%(playlist_index)s_%(upload_date)s_%(title)s_[%(id)s].%(ext)s\"":["output"],"--playlist-reverse":["reverse"],"--prefer-ffmpeg":["default"],"--quiet":["disable"],"--restrict-filenames":["default"],"--sleep-interval 1":["default"],"--sub-lang en":["video"],"--verbose":["default"],"--write-annotations":["video"],"--write-auto-sub":["video"],"--write-description":["default"],"--write-info-json":["default"],"--write-sub":["video"],"--write-thumbnail":["default"],"--yes-playlist":["playlist"],"--youtube-skip-dash-manifest":["default"],"-o \"/media/drive/b/Twitter/%(uploader)s (%(uploader_id)s)/%(upload_date)s_%(timestamp)s_[%(id)s].%(ext)s\"":["tw"]},"quality":["best","1080","720","480","360","mp3","flac","tw"]} 2 | -------------------------------------------------------------------------------- /generate.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | # frozen_string_literal: true 3 | 4 | require 'json' 5 | 6 | system('yaml2json flags.yaml flags.json') 7 | 8 | data = JSON.parse(File.read('flags.json')) 9 | 10 | config = {} 11 | 12 | data['flags'].each_pair do |key, val| 13 | val.each do |gtype| 14 | gtype = data[gtype] if gtype == 'quality' 15 | [gtype].flatten.each do |type| 16 | config[type] = [] unless config.key?(type) 17 | config[type] << key.gsub('{AUDIOFORMAT}', type) 18 | .gsub('{ARCHIVE}', type) 19 | end 20 | end 21 | end 22 | 23 | Dir.mkdir('config') unless Dir.exist?('config') 24 | config.each_pair do |key, val| 25 | content = val.join("\n") 26 | out = File.open("config/yt.#{key}.conf", 'w') 27 | out.puts content 28 | out.close 29 | end 30 | 31 | list = { 32 | 'audio' => %w[mp3 flac], 33 | 'video' => %w[best 1080 720 480 360] 34 | } 35 | # 36 | # %w[audio video].each do |fmt| 37 | # list[fmt].each do |quality| 38 | # files = ['default', fmt, quality].sort 39 | # out = File.open("config/yt.#{files.join('.')}.conf", 'w') 40 | # files.each do |file| 41 | # out.puts File.read("config/yt.#{file}.conf") 42 | # end 43 | # out.close 44 | # 45 | # list['playlist'].each do |type| 46 | # files = ['default', fmt, type, quality].sort 47 | # out = File.open("config/yt.#{files.join('.')}.conf", 'w') 48 | # files.each do |file| 49 | # out.puts File.read("config/yt.#{file}.conf") 50 | # end 51 | # out.close 52 | # end 53 | # end 54 | # end 55 | 56 | [ 57 | %w[default video output vformats], 58 | %w[default video playlist vformats], 59 | %w[default video reverse vformats], 60 | %w[default video channel vformats], 61 | %w[default audio output vformats], 62 | %w[default audio playlist vformats], 63 | %w[default audio reverse vformats], 64 | %w[default audio channel vformats] 65 | ].each do |config_list| 66 | filename = [] 67 | content = [] 68 | config_list.each do |file| 69 | filename << file if file != 'vformats' 70 | content << File.read("config/yt.#{file}.conf") if file != 'vformats' 71 | end 72 | 73 | list[config_list[1]].each do |f| 74 | out = File.open("config/yt.#{[filename, [f]].flatten.sort.join('.')}.conf", 'w') 75 | out.puts content, File.read("config/yt.#{f}.conf") 76 | out.close 77 | end 78 | end 79 | -------------------------------------------------------------------------------- /flags.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | flags: 3 | "--add-metadata": 4 | - default 5 | "--audio-format {AUDIOFORMAT}": 6 | - mp3 7 | - flac 8 | "--audio-quality 0": 9 | - audio 10 | "--cache-dir ~/.cache/youtube-dl": 11 | - default 12 | "--continue": 13 | - default 14 | "--convert-subs lrc": 15 | - audio 16 | "--convert-subs srt": 17 | - video 18 | "--download-archive ~/.yt-dl/yt.{ARCHIVE}.archive.txt": 19 | - video 20 | - audio 21 | "--embed-subs": 22 | - video 23 | "--embed-thumbnail": 24 | - mp3 25 | "--external-downloader aria2c": 26 | - default 27 | "--external-downloader-args '-c -j 3 -x 3 -s 3 -k 1M'": 28 | - default 29 | "--hls-prefer-ffmpeg": 30 | - default 31 | "--netrc": 32 | - default 33 | "--no-warnings": 34 | - default 35 | "--playlist-reverse": 36 | - reverse 37 | "--prefer-ffmpeg": 38 | - default 39 | "--quiet": 40 | - default 41 | "--restrict-filenames": 42 | - default 43 | "--sleep-interval 3": 44 | - default 45 | "--sub-lang en": 46 | - video 47 | "--verbose": 48 | - default 49 | "--write-annotations": 50 | - video 51 | "--write-auto-sub": 52 | - video 53 | "--write-description": 54 | - default 55 | "--write-info-json": 56 | - default 57 | "--write-sub": 58 | - video 59 | "--write-thumbnail": 60 | - default 61 | "--yes-playlist": 62 | - playlist 63 | "--merge-output-format mp4": 64 | - video 65 | "--youtube-skip-dash-manifest": 66 | - default 67 | "--output \"/media/drive/b/YouTube/%(uploader)s (%(uploader_id)s)/%(playlist_title)s_%(playlist_index)s_%(upload_date)s_%(title)s_[%(id)s].%(ext)s\"": 68 | - output 69 | "--output \"/media/drive/b/YouTube/%(uploader)s (%(uploader_id)s)/%(playlist_title)s/%(playlist_title)s_%(playlist_index)s_%(upload_date)s_%(title)s_[%(id)s].%(ext)s\"": 70 | - playlist 71 | - reverse 72 | - channel 73 | "--format 'bestvideo+bestaudio/best'": 74 | - best 75 | "--format 'bestvideo[height<=1080]+bestaudio/best[height<=1080]'": 76 | - "1080" 77 | "--format 'bestvideo[height<=720]+bestaudio/best[height<=720]'": 78 | - "720" 79 | "--format 'bestvideo[height<=480]+bestaudio/best[height<=480]'": 80 | - "480" 81 | "--format 'bestvideo[height<=360]+bestaudio/best[height<=360]'": 82 | - "360" 83 | "--format 'bestaudio'": 84 | - flac 85 | - mp3 86 | 87 | quality: 88 | - best 89 | - "1080" 90 | - "720" 91 | - "480" 92 | - "360" 93 | - mp3 94 | - flac 95 | --------------------------------------------------------------------------------