improve music release

This commit is contained in:
SrGooglo 2025-01-25 19:46:18 +00:00
parent e0ae3ca064
commit 31fe2c1e71
2 changed files with 61 additions and 19 deletions

View File

@ -12,6 +12,23 @@ const AllowedUpdateFields = [
export default class Release {
static async create(payload) {
if (!payload.title) {
throw new OperationError(400, "Release title is required")
}
if (!payload.list) {
throw new OperationError(400, "Release list is required")
}
// ensure list is an array of strings with tracks ids only
playload.list = playload.list.map((item) => {
if (typeof item !== "string") {
item = item._id
}
return item
})
const release = new MusicRelease({
user_id: payload.user_id,
created_at: Date.now(),
@ -48,13 +65,21 @@ export default class Release {
}
}
// ensure list is an array of strings with tracks ids only
release.list = release.list.map((item) => {
if (typeof item !== "string") {
item = item._id
}
return item
})
release = await MusicRelease.findByIdAndUpdate(id, release)
return release
}
static async fullfillItemData(release) {
return release
}
}

View File

@ -15,6 +15,8 @@ export default async (payload = {}) => {
return await ModifyTrack(payload._id, payload)
}
let metadata = Object()
try {
const sourceStream = await axios({
url: payload.source,
@ -24,25 +26,26 @@ export default async (payload = {}) => {
stream = sourceStream.data
headers = sourceStream.headers
const streamMetadata = await MusicMetadata.parseStream(stream, {
mimeType: headers["content-type"],
})
metadata = {
...metadata,
format: streamMetadata.format.codec,
channels: streamMetadata.format.numberOfChannels,
sampleRate: streamMetadata.format.sampleRate,
bits: streamMetadata.format.bitsPerSample,
lossless: streamMetadata.format.lossless,
duration: streamMetadata.format.duration,
title: streamMetadata.common.title,
artists: streamMetadata.common.artists,
album: streamMetadata.common.album,
}
} catch (error) {
throw new OperationError(500, `Failed to process fetching source: ${error.message}`)
}
const fileMetadata = await MusicMetadata.parseStream(stream, {
mimeType: headers["content-type"],
})
let metadata = {
format: fileMetadata.format.codec,
channels: fileMetadata.format.numberOfChannels,
sampleRate: fileMetadata.format.sampleRate,
bits: fileMetadata.format.bitsPerSample,
lossless: fileMetadata.format.lossless,
duration: fileMetadata.format.duration,
title: fileMetadata.common.title,
artists: fileMetadata.common.artists,
album: fileMetadata.common.album,
// sowy :(
}
if (typeof payload.metadata === "object") {
@ -52,6 +55,16 @@ export default async (payload = {}) => {
}
}
metadata.format = metadata.format.toUpperCase()
if (
metadata.format === "FLAC" ||
metadata.format === "WAV" ||
metadata.format === "ALAC"
) {
metadata.lossless = true
}
const obj = {
title: payload.title,
album: payload.album,
@ -70,6 +83,10 @@ export default async (payload = {}) => {
obj.artists.push(payload.artists)
}
if (typeof payload.artist === "string") {
obj.artists.push(payload.artist)
}
if (obj.artists.length === 0 || !obj.artists) {
obj.artists = metadata.artists
}