diff --git a/js/components/MilkdropWindow/Milkdrop.js b/js/components/MilkdropWindow/Milkdrop.js index 3f99b1bb..feb6546d 100644 --- a/js/components/MilkdropWindow/Milkdrop.js +++ b/js/components/MilkdropWindow/Milkdrop.js @@ -32,7 +32,13 @@ class Milkdrop extends React.Component { this.visualizer.connectAudio(this.props.analyser); this.presetCycle = true; if (this.props.initialPreset) { - this.visualizer.loadPreset(this.props.initialPreset, 0); + const presetIndices = this.props.presets.addPresets( + this.props.initialPreset + ); + this.selectPreset( + await this.props.presets.selectIndex(presetIndices[0]), + 0 + ); } else { this.selectPreset(this.props.presets.getCurrent(), 0); } diff --git a/js/components/MilkdropWindow/index.js b/js/components/MilkdropWindow/index.js index 534be4de..d6cbee6f 100644 --- a/js/components/MilkdropWindow/index.js +++ b/js/components/MilkdropWindow/index.js @@ -150,11 +150,20 @@ class PresetsLoader extends React.Component { } } +function presetNameFromURL(url) { + const urlParts = url.split("/"); + const lastPart = urlParts[urlParts.length - 1]; + const presetName = lastPart.substring(0, lastPart.length - 5); // remove .milk or .json + return decodeURIComponent(presetName); +} + async function loadInitialPreset() { let presetUrl = null; + let milkdropPresetUrl = null; if ("URLSearchParams" in window) { const params = new URLSearchParams(location.search); presetUrl = params.get("butterchurnPresetUrl"); + milkdropPresetUrl = params.get("milkdropPresetUrl"); } if (presetUrl) { @@ -164,12 +173,27 @@ async function loadInitialPreset() { throw new Error(response.statusText); } const responseBody = await response.json(); - return responseBody; + const presetName = presetNameFromURL(presetUrl); + return { [presetName]: responseBody }; } catch (e) { console.error(e); alert(`Failed to load MilkDrop preset from ${presetUrl}`); return null; } + } else if (milkdropPresetUrl) { + try { + const response = await fetch(milkdropPresetUrl); + if (!response.ok) { + throw new Error(response.statusText); + } + const fileBlob = await response.blob(); + const presetName = presetNameFromURL(milkdropPresetUrl); + return { [presetName]: { file: fileBlob } }; + } catch (e) { + console.error(e); + alert(`Failed to load MilkDrop preset from ${milkdropPresetUrl}`); + return null; + } } return null;