90 lines
2.0 KiB
JavaScript

import { Track } from "@db_models"
import requiredFields from "@shared-utils/requiredFields"
import * as FFMPEGLib from "@shared-classes/FFMPEGLib"
import ModifyTrack from "./modify"
export default async (payload = {}) => {
if (typeof payload.title !== "string") {
payload.title = undefined
}
if (typeof payload.album !== "string") {
payload.album = undefined
}
if (typeof payload.artist !== "string") {
payload.artist = undefined
}
if (typeof payload.cover !== "string") {
payload.cover = undefined
}
if (typeof payload.source !== "string") {
payload.source = undefined
}
if (typeof payload.user_id !== "string") {
payload.user_id = undefined
}
requiredFields(["title", "source", "user_id"], payload)
if (typeof payload._id === "string") {
return await ModifyTrack(payload._id, payload)
}
const probe = await FFMPEGLib.Utils.probe(payload.source)
let metadata = {
format: probe.streams[0].codec_name,
channels: probe.streams[0].channels,
bitrate: probe.streams[0].bit_rate ?? probe.format.bit_rate,
sampleRate: probe.streams[0].sample_rate,
bits:
probe.streams[0].bits_per_sample ??
probe.streams[0].bits_per_raw_sample,
duration: probe.format.duration,
tags: probe.format.tags ?? {},
}
if (metadata.format) {
metadata.format = metadata.format.toUpperCase()
}
if (
metadata.format === "FLAC" ||
metadata.format === "WAV" ||
metadata.format === "ALAC"
) {
metadata.lossless = true
}
const obj = {
title: payload.title ?? metadata.tags["Title"],
album: payload.album ?? metadata.tags["Album"],
artist: payload.artist ?? metadata.tags["Artist"],
cover:
payload.cover ??
"https://storage.ragestudio.net/comty-static-assets/default_song.png",
source: payload.source,
metadata: metadata,
}
if (Array.isArray(payload.artists)) {
obj.artist = payload.artists.join(", ")
}
let track = new Track({
...obj,
publisher: {
user_id: payload.user_id,
},
})
await track.save()
return track.toObject()
}