btrtracks/src/common/download.js

97 lines
2.2 KiB
JavaScript
Raw Normal View History

2018-10-06 12:30:02 +00:00
import {spawn} from 'child_process'
2019-01-25 15:00:35 +00:00
import ffmpeg from 'fluent-ffmpeg'
2018-10-06 12:30:02 +00:00
import path from 'path'
import asn from './async'
function parseTitle (data) {
let tt = data.title
// Remove []'s from the beginning
tt = tt.replace(/^\[\w+\]\s?/i, '')
// Remove "Official Video/Audio" tag
tt = tt.replace(/\s?(?:[\(\)\[\]])?Official\s?[\w]+(?:[\(\)\[\]])?/i, '')
// Remove "Audio" tag
tt = tt.replace(/\s?(?:[\(\)\[\]])Audio?(?:[\(\)\[\]])/i, '')
// Remove "lyrics" tag
tt = tt.replace(/\s?(?:[\(\)\[\]])?lyrics?\s?(?:[\w]+)?(?:[\(\)\[\]])?\s?/i, '')
// Artist / Title split
let at = tt.split(' - ', 2)
let artist
let title
if (at.length > 1) {
artist = at[0]
title = tt.substring(artist.length + 3)
} else {
artist = data.artist
title = tt
}
data.title = title
data.artist = artist
return data
}
function getVideoInfo (arg) {
2019-11-04 20:51:10 +00:00
let yt = spawn('youtube-dl', ['--no-playlist', '-j', '-f', 'bestaudio/best', arg])
2018-10-06 12:30:02 +00:00
let output = ''
yt.stdout.on('data', function (chunk) {
output += chunk.toString('utf8')
})
return new Promise((resolve, reject) => {
yt.on('close', function () {
2019-11-14 17:08:48 +00:00
let ftdata = output.trim().split('\n')
2019-11-04 20:51:10 +00:00
if (ftdata.length > 1) {
let composite = []
for (let i in ftdata) {
let dat
try {
dat = JSON.parse(ftdata[i])
} catch (e) {
console.error(e)
continue
}
delete dat.formats
composite.push(dat)
}
return resolve(composite)
}
2018-10-06 12:30:02 +00:00
let data = JSON.parse(output)
delete data.formats
resolve(data)
})
})
}
function fetchVideo (data) {
return new Promise((resolve, reject) => {
2019-01-25 15:00:35 +00:00
let tempName = path.join(process.cwd(), `/tmp.yt.${data.id}.mp3`)
2019-01-26 22:35:09 +00:00
ffmpeg(data.url || data.file)
2019-01-25 15:00:35 +00:00
.audioCodec('libmp3lame')
.format('mp3')
.on('error', reject)
.on('end', function () {
2018-10-06 12:30:02 +00:00
resolve({
title: data.title,
artist: data.uploader,
url: data.webpage_url,
art: data.thumbnail,
source: tempName
})
})
2019-01-25 15:00:35 +00:00
.output(tempName)
.run()
2018-10-06 12:30:02 +00:00
})
}
2020-01-12 13:29:31 +00:00
export default { parseTitle, getVideoInfo, fetchVideo }