Skip to content

Commit dc63c3a

Browse files
committed
refactor: extract yt-dlp
1 parent 00352b5 commit dc63c3a

File tree

2 files changed

+30
-22
lines changed

2 files changed

+30
-22
lines changed

lib/youtube.js

+3-22
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,22 @@
11
import spawn from 'nano-spawn'
22
import fs from 'fs'
3+
import { video, subtitles } from './yt-dlp.js'
34

45
export const ytUrlRegExp = /^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.be)\/watch\?v=([^&]+).*/
56

67
const fetchYoutubeHeaders = {
78
'Accept-Language': 'en',
89
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
910
}
10-
const subtitlesYTDLPArgs = `--write-subs --write-auto-subs --sub-format vtt --convert-subs srt -k`
11-
const videoYTDLPArgs = quality => `--concurrent-fragments 5 --newline --progress --progress-delta 1 --merge-output-format webm/mp4 -f bestvideo[height<=${quality}]+bestaudio/best[height<=${quality}] --sponsorblock-remove sponsor`
12-
13-
14-
function getOptionalCookiesPath() {
15-
if (fs.existsSync('/app/cookies.txt')) return '/app/cookies.txt'
16-
if (fs.existsSync('./cookies.txt')) return './cookies.txt'
17-
console.log('cookies not set')
18-
return
19-
}
2011

2112
export async function downloadVideo(id, repo, callback = () => {}) {
2213
return new Promise(async (resolve, reject) => {
2314
if (isUnsupportedUrl(id)) return reject(new Error('unsupported url'))
24-
2515
if (isYouTubeUrl(id)) id = extractIdFromUrl(id)
2616
try {
27-
const cookiesPath = getOptionalCookiesPath()
28-
let cookiesOption = cookiesPath ? `--cookies ${cookiesPath}` : ''
2917
const quality = repo.getVideoQuality()
30-
const commandArgs = `-o ./data/videos/${id}.%(ext)s ${cookiesOption} ${videoYTDLPArgs(quality)} ${subtitlesYTDLPArgs} -- ${id}`.split(/ +/)
31-
console.log('running yt-dlp', commandArgs.join(' '))
3218
let location, format
33-
for await (const line of spawn('yt-dlp', commandArgs)) {
19+
for await (const line of video(id, quality)) {
3420
console.log(line)
3521
callback(line)
3622
if (line.startsWith('[Merger] Merging formats into')) {
@@ -66,13 +52,8 @@ export async function getVideoSubtitles (id, callback = () => {}) {
6652
return new Promise(async (resolve, reject) => {
6753
try {
6854
const transcriptPath = `./data/videos/${id}.en.srt`
69-
const cookies = getOptionalCookiesPath()
70-
let cookiesOption = ''
71-
if (cookies) cookiesOption = `--cookies ./cookies.txt`
7255
if (!fs.existsSync(transcriptPath)) {
73-
const commandArgs = `-o ./data/videos/${id} --skip-download ${cookiesOption} ${subtitlesYTDLPArgs} -- ${id}`.split(/ +/)
74-
console.log('running yt-dlp', commandArgs.join(' '))
75-
for await (const line of spawn('yt-dlp', commandArgs)) {
56+
for await (const line of subtitles(id)) {
7657
console.log(line)
7758
callback(line)
7859
}

lib/yt-dlp.js

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import fs from 'fs'
2+
import spawn from 'nano-spawn'
3+
4+
const subtitlesYTDLPArgs = `--write-subs --write-auto-subs --sub-format vtt --convert-subs srt -k`
5+
const videoYTDLPArgs = quality => `--concurrent-fragments 5 --newline --progress --progress-delta 1 --merge-output-format webm/mp4 -f bestvideo[height<=${quality}]+bestaudio/best[height<=${quality}] --sponsorblock-remove sponsor`
6+
7+
export function video(id, quality) {
8+
const cookiesPath = getOptionalCookiesPath()
9+
let cookiesOption = cookiesPath ? `--cookies ${cookiesPath}` : ''
10+
const commandArgs = `-o ./data/videos/${id}.%(ext)s ${cookiesOption} ${videoYTDLPArgs(quality)} ${subtitlesYTDLPArgs} -- ${id}`.split(/ +/)
11+
console.log('running yt-dlp', commandArgs.join(' '))
12+
return spawn('yt-dlp', commandArgs)
13+
}
14+
export function subtitles(id) {
15+
const cookiesPath = getOptionalCookiesPath()
16+
let cookiesOption = cookiesPath ? `--cookies ${cookiesPath}` : ''
17+
const commandArgs = `-o ./data/videos/${id} --skip-download ${cookiesOption} ${subtitlesYTDLPArgs} -- ${id}`.split(/ +/)
18+
console.log('running yt-dlp', commandArgs.join(' '))
19+
return spawn('yt-dlp', commandArgs)
20+
}
21+
22+
function getOptionalCookiesPath() {
23+
if (fs.existsSync('/app/cookies.txt')) return '/app/cookies.txt'
24+
if (fs.existsSync('./cookies.txt')) return './cookies.txt'
25+
console.log('cookies not set')
26+
return
27+
}

0 commit comments

Comments
 (0)