diff --git a/js/components/MilkdropWindow/Milkdrop.js b/js/components/MilkdropWindow/Milkdrop.js index 782d5389..b0352eb4 100644 --- a/js/components/MilkdropWindow/Milkdrop.js +++ b/js/components/MilkdropWindow/Milkdrop.js @@ -31,7 +31,11 @@ export default class Milkdrop extends React.Component { ); this.visualizer.connectAudio(this.props.analyser); this.presetCycle = true; - this.selectPreset(this.props.presets.getCurrent(), 0); + if (this.props.initialPreset) { + this.visualizer.loadPreset(this.props.initialPreset, 0); + } else { + this.selectPreset(this.props.presets.getCurrent(), 0); + } // Kick off the animation loop const loop = () => { diff --git a/js/components/MilkdropWindow/index.js b/js/components/MilkdropWindow/index.js index 3694eea1..6bf38a1f 100644 --- a/js/components/MilkdropWindow/index.js +++ b/js/components/MilkdropWindow/index.js @@ -21,6 +21,7 @@ class PresetsLoader extends React.Component { super(); this.state = { presets: null, + initialPreset: null, butterchurn: null, isFullscreen: false, desktop: false @@ -35,14 +36,14 @@ class PresetsLoader extends React.Component { } async componentDidMount() { - const { - butterchurn, - presetKeys, - minimalPresets - } = await loadInitialDependencies(); + const [ + { butterchurn, presetKeys, minimalPresets }, + initialPreset + ] = await Promise.all([loadInitialDependencies(), loadInitialPreset()]); this.setState({ butterchurn, + initialPreset, presets: new Presets({ keys: presetKeys, initialPresets: minimalPresets, @@ -81,7 +82,7 @@ class PresetsLoader extends React.Component { } _renderMilkdrop(size) { - const { butterchurn, presets } = this.state; + const { butterchurn, presets, initialPreset } = this.state; const loaded = butterchurn != null && presets != null; const { width, height } = this.state.isFullscreen ? { width: screen.width, height: screen.height } @@ -98,6 +99,7 @@ class PresetsLoader extends React.Component { height={height} isFullscreen={this.state.isFullscreen} presets={presets} + initialPreset={initialPreset} butterchurn={butterchurn} /> )} @@ -151,6 +153,31 @@ class PresetsLoader extends React.Component { } } +async function loadInitialPreset() { + let presetUrl = null; + if ("URLSearchParams" in window) { + const params = new URLSearchParams(location.search); + presetUrl = params.get("butterchurnPresetUrl"); + } + + if (presetUrl) { + try { + const response = await fetch(presetUrl); + if (!response.ok) { + throw new Error(response.statusText); + } + const responseBody = await response.json(); + return responseBody; + } catch (e) { + console.error(e); + alert(`Failed to load MilkDrop preset from ${presetUrl}`); + return null; + } + } + + return null; +} + async function loadInitialDependencies() { return new Promise((resolve, reject) => { require.ensure(