-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
play.ts
56 lines (46 loc) · 1.42 KB
/
play.ts
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
import ytdl, { downloadOptions } from 'ytdl-core'
import rangeParser from 'range-parser'
const { getInfo, chooseFormat, downloadFromInfo } = ytdl
export default defineEventHandler(async event => {
const query = <{ link: string }>getQuery(event)
const info = await getInfo(query.link)
const selectedFormat = chooseFormat(info.formats, {
quality: 'highestaudio',
})
const headers = getHeaders(event)
const options: downloadOptions = {
filter: 'audioonly',
format: selectedFormat,
}
const baseStream = downloadFromInfo(info, options)
if (headers.range) {
const readableLength = selectedFormat.contentLength
const range = rangeParser(parseInt(readableLength, 10), headers.range)
if (range === -1) {
return baseStream
}
if (!(Array.isArray(range) && range.length)) {
return baseStream
}
const start = range[0].start
const end = range[0].end
setResponseHeader(event, 'Accept-Ranges', 'bytes')
setResponseHeader(event, 'Content-Type', 'audio/mp3')
setResponseStatus(event, 206)
setResponseHeader(
event,
'Content-Range',
`bytes ${start}-${end}/${readableLength}`
)
setResponseHeader(event, 'Content-Length', end - start + 1)
// setResponseHeader(event, "Connection", "keep-alive");
return downloadFromInfo(info, {
...options,
range: {
start: start,
end: end,
},
})
}
return baseStream
})