SrGooglo 582790ba88 Add playlist class with CRUD methods and update lyrics handling
- Implement Playlist class with create, modify, delete, appendItem, and removeItem
- Refactor lyrics endpoints to use video_starts_at instead of sync_audio_at
- Improve LRC parsing and timing logic for synced lyrics
- Fix track and release data ordering and assignment
- Remove unused imports and minor code cleanup
2025-06-16 20:52:15 +00:00

104 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]
}
// if user_id is provided, fetch likes
if (user_id) {
const trackIds = list.map((track) => {
return track._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)
} else {
list = list.map((track) => {
delete track.source
delete track.publisher
return track
})
}
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(",")
let totalItems = 1
let data = null
if (isMultiple) {
const track_ids = Array.isArray(track_id)
? track_id
: track_id.split(",")
data = await Track.find({
_id: { $in: track_ids },
}).lean()
// order tracks by ids
data = data.sort((a, b) => {
return (
track_ids.indexOf(a._id.toString()) -
track_ids.indexOf(b._id.toString())
)
})
totalItems = await Track.countDocuments({
_id: { $in: track_ids },
})
} else {
data = await Track.findOne({
_id: track_id,
}).lean()
if (!data) {
throw new OperationError(404, "Track not found")
}
}
data = await fullfillData(data, {
user_id,
})
if (isMultiple) {
if (onlyList) {
return data
}
return {
total_count: totalItems,
list: data,
}
}
return data[0]
}