mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-09 10:34:17 +00:00
- Introduces a new Music Library system for managing favorites (tracks, playlists, releases), replacing the previous TrackLike model. - Completely revamps the Studio TV profile page, adding live statistics, stream configuration, restream management, and media URL display. - Enhances the media player with a custom seekbar and improved audio playback logic for MPD and non-MPD sources. - Lays foundational groundwork for chat encryption with new models and APIs. - Refactors critical UI components like PlaylistView and PagePanel. - Standardizes monorepo development scripts to use npm. - Updates comty.js submodule and adds various new UI components.
92 lines
2.0 KiB
JavaScript
92 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,
|
|
public: payload.public ?? true,
|
|
}
|
|
|
|
if (Array.isArray(payload.artists)) {
|
|
obj.artist = payload.artists.join(", ")
|
|
}
|
|
|
|
let track = new Track({
|
|
...obj,
|
|
publisher: {
|
|
user_id: payload.user_id,
|
|
},
|
|
created_at: new Date(),
|
|
})
|
|
|
|
await track.save()
|
|
|
|
return track.toObject()
|
|
}
|