remove mpv dep, convert aac to flac
This commit is contained in:
parent
80d73027a6
commit
524c413579
4 changed files with 97 additions and 10 deletions
|
@ -1,4 +1,8 @@
|
|||
import { FlacStreamTagger } from "flac-stream-tagger";
|
||||
import Ffmpeg from "fluent-ffmpeg";
|
||||
import ffmpegPath from "ffmpeg-static";
|
||||
|
||||
Ffmpeg.setFfmpegPath(ffmpegPath || "");
|
||||
|
||||
export default class {
|
||||
authHeaders: { [key: string]: string }
|
||||
|
@ -7,10 +11,28 @@ export default class {
|
|||
this.authHeaders = authHeaders
|
||||
}
|
||||
|
||||
async convertAacToFlac(buffer: ArrayBuffer) {
|
||||
const fileId = Bun.nanoseconds().toString(36);
|
||||
|
||||
Bun.write(`tmp/${fileId}.aac`, Buffer.from(buffer))
|
||||
|
||||
Ffmpeg(`tmp/${fileId}.aac`)
|
||||
.format('flac')
|
||||
.run();
|
||||
|
||||
await Bun.file(`tmp/${fileId}.aac`).delete();
|
||||
const flac = Bun.file(`tmp/${fileId}.flac`)
|
||||
const audioBuffer = await flac.arrayBuffer();
|
||||
await flac.delete()
|
||||
|
||||
return audioBuffer;
|
||||
}
|
||||
|
||||
async fetchTrack(id: number) {
|
||||
const audio = await fetch(`https://api.tidal.com/v1/tracks/${id}/playbackinfopostpaywall/v4?audioquality=HI_RES_LOSSLESS&playbackmode=STREAM&assetpresentation=FULL`, {
|
||||
headers: this.authHeaders
|
||||
})
|
||||
|
||||
return await audio.json() as {
|
||||
trackId: number,
|
||||
audioPresentation: string,
|
||||
|
@ -41,7 +63,7 @@ export default class {
|
|||
if (manifestMimeType === "application/dash+xml") {
|
||||
await Bun.write(`tmp/${id}.mpd`, Buffer.from(manifest, "base64").toString("utf-8"))
|
||||
|
||||
await Bun.$`mpv --ao=null --stream-record=tmp/${id}.flac --speed=100 tmp/${id}.mpd`.quiet()
|
||||
await Bun.$`${ffmpegPath} -protocol_whitelist https,file,tls,tcp -i tmp/${id}.mpd -c:a copy tmp/${id}.flac`.quiet()
|
||||
|
||||
await Bun.file(`tmp/${id}.mpd`).delete();
|
||||
|
||||
|
@ -51,7 +73,7 @@ export default class {
|
|||
|
||||
await flac.delete()
|
||||
|
||||
return audioBuffer;
|
||||
return { buffer: audioBuffer, mimeType: "audio/flac" }
|
||||
} else if (manifestMimeType === "application/vnd.tidal.bts") {
|
||||
const data = JSON.parse(Buffer.from(manifest, "base64").toString("utf-8")) as {
|
||||
"mimeType": string,
|
||||
|
@ -62,13 +84,19 @@ export default class {
|
|||
|
||||
const flac = await fetch(data.urls[0])
|
||||
|
||||
return await flac.arrayBuffer();
|
||||
return { buffer: await flac.arrayBuffer(), mimeType: data.mimeType }
|
||||
}
|
||||
|
||||
return new ArrayBuffer(0);
|
||||
return { buffer: new ArrayBuffer(0), mimeType: "" } // TODO: Handle other mime types
|
||||
}
|
||||
|
||||
async tagFlac(id: number, audioBuffer: ArrayBuffer) {
|
||||
async tagFlac(id: number, audioBuffer: { buffer: ArrayBuffer, mimeType: string }) {
|
||||
const fileId = Bun.nanoseconds().toString(36);
|
||||
|
||||
if (audioBuffer.mimeType === "audio/mp4") {
|
||||
audioBuffer.buffer = await this.convertAacToFlac(audioBuffer.buffer) as ArrayBuffer;
|
||||
}
|
||||
|
||||
const trackReq = await fetch(`https://api.tidal.com/v1/tracks/${id}/?countryCode=US`, {
|
||||
headers: this.authHeaders
|
||||
})
|
||||
|
@ -113,7 +141,7 @@ export default class {
|
|||
],
|
||||
}
|
||||
|
||||
return FlacStreamTagger.fromBuffer(Buffer.from(audioBuffer), {
|
||||
return FlacStreamTagger.fromBuffer(Buffer.from(audioBuffer.buffer), {
|
||||
tagMap: {
|
||||
title: track.title,
|
||||
trackNumber: track.trackNumber.toString(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue