feat: add support for multi-disc albums
This commit is contained in:
@@ -34,6 +34,10 @@ export async function POST(request: Request) {
|
||||
// Sort tracks
|
||||
tracks.sort((a, b) => {
|
||||
if ('error' in a || 'error' in b) return 0;
|
||||
const discA = a.common?.disk?.no ?? 1;
|
||||
const discB = b.common?.disk?.no ?? 1;
|
||||
if (discA !== discB) return discA - discB;
|
||||
|
||||
const trackA = a.common?.track?.no ?? 0;
|
||||
const trackB = b.common?.track?.no ?? 0;
|
||||
if (trackA && trackB) return trackA - trackB;
|
||||
@@ -58,13 +62,24 @@ export async function POST(request: Request) {
|
||||
if (!sr || sr < 48000 || !bd || bd < 24) isHiRes = false;
|
||||
});
|
||||
|
||||
const discNumbers = new Set(
|
||||
tracks.map(t => ('error' in t ? 1 : (t.common?.disk?.no || 1)))
|
||||
);
|
||||
const isMultiDisc = discNumbers.size > 1 || Array.from(discNumbers).some(d => d > 1);
|
||||
|
||||
if (sampleRates.size > 1 || bitDepths.size > 1) {
|
||||
mixed = true;
|
||||
qualityDetails = `\n\nNOTE: Mixed formats. Sample Rates: ${Array.from(sampleRates).join(', ')} Hz. Bit Depths: ${Array.from(bitDepths).join(', ')} bit.`;
|
||||
|
||||
const mixedDetails = tracks.map(t => {
|
||||
if ('error' in t) return `${t.filename}: Error`;
|
||||
return `Track ${t.common?.track?.no || '?'}: ${t.format?.bitsPerSample}bit / ${t.format?.sampleRate}Hz`;
|
||||
const discNo = t.common?.disk?.no || 1;
|
||||
const trackNo = t.common?.track?.no;
|
||||
let trackStr = trackNo !== undefined && trackNo !== null ? String(trackNo).padStart(2, '0') : '?';
|
||||
if (isMultiDisc) {
|
||||
trackStr = `${discNo}-${trackStr}`;
|
||||
}
|
||||
return `Track ${trackStr}: ${t.format?.bitsPerSample}bit / ${t.format?.sampleRate}Hz`;
|
||||
}).join('\n');
|
||||
|
||||
qualityDetails += '\n' + mixedDetails;
|
||||
@@ -155,10 +170,32 @@ export async function POST(request: Request) {
|
||||
}
|
||||
|
||||
// Tracklist
|
||||
const tracklist = tracks.map(t => {
|
||||
if ('error' in t) return `${t.filename} (Error)`;
|
||||
return `${t.common?.track?.no || '00'}. ${t.common?.title || t.filename}`;
|
||||
}).join('\n');
|
||||
|
||||
let currentDisc: number | null = null;
|
||||
const tracklistLines: string[] = [];
|
||||
|
||||
tracks.forEach(t => {
|
||||
if ('error' in t) {
|
||||
tracklistLines.push(`${t.filename} (Error)`);
|
||||
return;
|
||||
}
|
||||
|
||||
const discNo = t.common?.disk?.no || 1;
|
||||
const trackNo = t.common?.track?.no
|
||||
? String(t.common.track.no).padStart(2, '0')
|
||||
: '00';
|
||||
|
||||
if (isMultiDisc && discNo !== currentDisc) {
|
||||
if (currentDisc !== null) tracklistLines.push('');
|
||||
tracklistLines.push(`[b]Disc ${discNo}[/b]`);
|
||||
currentDisc = discNo;
|
||||
}
|
||||
|
||||
const trackLabel = isMultiDisc ? `${discNo}-${trackNo}` : trackNo;
|
||||
tracklistLines.push(`${trackLabel}. ${t.common?.title || t.filename}`);
|
||||
});
|
||||
|
||||
const tracklist = tracklistLines.join('\n');
|
||||
|
||||
// Description
|
||||
let description = "Sourced from TIDAL";
|
||||
|
||||
Reference in New Issue
Block a user