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.
99 lines
1.8 KiB
JavaScript
99 lines
1.8 KiB
JavaScript
import { Track } from "@db_models"
|
|
import Library from "@classes/library"
|
|
|
|
async function fullfillData(list, { user_id = null }) {
|
|
if (!Array.isArray(list)) {
|
|
list = [list]
|
|
}
|
|
|
|
const trackIds = list.map((track) => {
|
|
return track._id
|
|
})
|
|
|
|
// if user_id is provided, fetch likes
|
|
if (user_id) {
|
|
const tracksLikes = await Library.isFavorite(
|
|
user_id,
|
|
trackIds,
|
|
"tracks",
|
|
)
|
|
|
|
list = list.map(async (track) => {
|
|
const trackLike = tracksLikes.find((trackLike) => {
|
|
return trackLike.item_id.toString() === track._id.toString()
|
|
})
|
|
|
|
if (trackLike) {
|
|
track.liked_at = trackLike.created_at
|
|
track.liked = trackLike.liked
|
|
}
|
|
|
|
return track
|
|
})
|
|
|
|
list = await Promise.all(list)
|
|
}
|
|
|
|
// process some metadata
|
|
list = list.map(async (track) => {
|
|
if (track.metadata) {
|
|
if (track.metadata.bitrate && track.metadata.bitrate > 9000) {
|
|
track.metadata.lossless = true
|
|
}
|
|
}
|
|
|
|
return track
|
|
})
|
|
|
|
list = await Promise.all(list)
|
|
|
|
return list
|
|
}
|
|
|
|
export default async (track_id, { user_id = null, onlyList = false } = {}) => {
|
|
if (!track_id) {
|
|
throw new OperationError(400, "Missing track_id")
|
|
}
|
|
|
|
const isMultiple = Array.isArray(track_id) || track_id.includes(",")
|
|
|
|
if (isMultiple) {
|
|
const track_ids = Array.isArray(track_id)
|
|
? track_id
|
|
: track_id.split(",")
|
|
|
|
let tracks = await Track.find({
|
|
_id: { $in: track_ids },
|
|
}).lean()
|
|
|
|
tracks = await fullfillData(tracks, {
|
|
user_id,
|
|
})
|
|
|
|
if (onlyList) {
|
|
return tracks
|
|
}
|
|
|
|
return {
|
|
total_count: await Track.countDocuments({
|
|
_id: { $in: track_ids },
|
|
}),
|
|
list: tracks,
|
|
}
|
|
}
|
|
|
|
let track = await Track.findOne({
|
|
_id: track_id,
|
|
}).lean()
|
|
|
|
if (!track) {
|
|
throw new OperationError(404, "Track not found")
|
|
}
|
|
|
|
track = await fullfillData(track, {
|
|
user_id,
|
|
})
|
|
|
|
return track[0]
|
|
}
|