diff --git a/jam-ui/src/store/features/mediaSlice.js b/jam-ui/src/store/features/mediaSlice.js index 901406b39..15b110e39 100644 --- a/jam-ui/src/store/features/mediaSlice.js +++ b/jam-ui/src/store/features/mediaSlice.js @@ -59,15 +59,38 @@ export const downloadJamTrack = createAsyncThunk( progress: 0 })); - // Get package ID (simplified - use first available package) - // Real implementation would use pickMyPackage() logic from legacy - const mixdowns = await jamClient.JamTrackGetMixdowns(jamTrack.id); - const packageId = mixdowns && mixdowns.length > 0 ? mixdowns[0].packageId : null; + // Get client sample rate for package selection (pickMyPackage logic) + const sampleRate = await jamClient.GetSampleRate(); - if (!packageId) { - throw new Error('No mixdown package available'); + // Get mixdowns and find compatible package + const mixdowns = await jamClient.JamTrackGetMixdowns(jamTrack.id); + + if (!mixdowns || mixdowns.length === 0) { + throw new Error('No mixdowns available for this JamTrack'); } + // Find the first mixdown (use selected mixdownId if provided, else use first) + const mixdown = mixdownId + ? mixdowns.find(m => m.id === mixdownId) || mixdowns[0] + : mixdowns[0]; + + if (!mixdown || !mixdown.packages || mixdown.packages.length === 0) { + throw new Error('Mixdown has no packages available'); + } + + // pickMyPackage logic: find compatible package (ogg, jkz, matching sample rate) + const compatiblePackage = mixdown.packages.find(pkg => + pkg.file_type === 'ogg' && + pkg.encrypt_type === 'jkz' && + pkg.sample_rate === sampleRate + ); + + if (!compatiblePackage) { + throw new Error(`No compatible package found for sample rate ${sampleRate}kHz`); + } + + const packageId = compatiblePackage.id; + // Set up global callbacks for native client window.jamTrackDownloadProgress = (percent) => { dispatch(setDownloadState({ progress: percent }));