@lucaismyname/ginger 0.0.13 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -2
- package/dist/{GingerSplitContexts-4YZ-OJ9V.js → GingerSplitContexts-BzBExb95.js} +22 -21
- package/dist/GingerSplitContexts-BzBExb95.js.map +1 -0
- package/dist/GingerSplitContexts-C7puo0M7.cjs +2 -0
- package/dist/GingerSplitContexts-C7puo0M7.cjs.map +1 -0
- package/dist/analyzer/liveAudioGraph.d.ts +14 -0
- package/dist/analyzer/liveAudioGraph.d.ts.map +1 -0
- package/dist/analyzer/useGingerLiveAnalyzer.d.ts +21 -0
- package/dist/analyzer/useGingerLiveAnalyzer.d.ts.map +1 -0
- package/dist/audio/GingerPlayer.d.ts.map +1 -1
- package/dist/audio/GingerPlayer.test.d.ts +2 -0
- package/dist/audio/GingerPlayer.test.d.ts.map +1 -0
- package/dist/client.cjs +1 -1
- package/dist/client.js +21 -18
- package/dist/context/GingerContext.d.ts +2 -1
- package/dist/context/GingerContext.d.ts.map +1 -1
- package/dist/context/GingerProvider.d.ts.map +1 -1
- package/dist/context/GingerSplitContexts.d.ts +2 -1
- package/dist/context/GingerSplitContexts.d.ts.map +1 -1
- package/dist/core/playbackReducer.d.ts.map +1 -1
- package/dist/core/queue.d.ts.map +1 -1
- package/dist/experimental-gapless/index.cjs +1 -1
- package/dist/experimental-gapless/index.js +1 -1
- package/dist/ginger-BTPRqWHs.js +1621 -0
- package/dist/ginger-BTPRqWHs.js.map +1 -0
- package/dist/ginger-BiI69vrn.cjs +2 -0
- package/dist/ginger-BiI69vrn.cjs.map +1 -0
- package/dist/hooks/hooks.test.d.ts +2 -0
- package/dist/hooks/hooks.test.d.ts.map +1 -0
- package/dist/hooks/useGinger.d.ts +1 -0
- package/dist/hooks/useGinger.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -18
- package/dist/internal/fft.d.ts +7 -0
- package/dist/internal/fft.d.ts.map +1 -0
- package/dist/internal/fft.test.d.ts +2 -0
- package/dist/internal/fft.test.d.ts.map +1 -0
- package/dist/media/useMediaSession.d.ts.map +1 -1
- package/dist/media/useMediaSession.test.d.ts +2 -0
- package/dist/media/useMediaSession.test.d.ts.map +1 -0
- package/dist/testing/helpers.d.ts +21 -0
- package/dist/testing/helpers.d.ts.map +1 -0
- package/dist/testing/index.cjs +19 -19
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.ts +2 -7
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +33 -4
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/renderGinger.d.ts +8 -0
- package/dist/testing/renderGinger.d.ts.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/useSeekDrag-Br1V0Vao.js +290 -0
- package/dist/useSeekDrag-Br1V0Vao.js.map +1 -0
- package/dist/useSeekDrag-aS7uk26h.cjs +2 -0
- package/dist/useSeekDrag-aS7uk26h.cjs.map +1 -0
- package/dist/waveform/analyzeAudioFile.d.ts +31 -0
- package/dist/waveform/analyzeAudioFile.d.ts.map +1 -0
- package/dist/waveform/analyzeAudioFile.test.d.ts +2 -0
- package/dist/waveform/analyzeAudioFile.test.d.ts.map +1 -0
- package/dist/waveform/index.cjs +1 -1
- package/dist/waveform/index.cjs.map +1 -1
- package/dist/waveform/index.d.ts +4 -0
- package/dist/waveform/index.d.ts.map +1 -1
- package/dist/waveform/index.js +207 -23
- package/dist/waveform/index.js.map +1 -1
- package/dist/waveform/useAudioFileAnalysis.d.ts +8 -0
- package/dist/waveform/useAudioFileAnalysis.d.ts.map +1 -0
- package/package.json +4 -1
- package/dist/GingerSplitContexts-4YZ-OJ9V.js.map +0 -1
- package/dist/GingerSplitContexts-Bze1Bqe2.cjs +0 -2
- package/dist/GingerSplitContexts-Bze1Bqe2.cjs.map +0 -1
- package/dist/ginger-DYoHDn8T.cjs +0 -2
- package/dist/ginger-DYoHDn8T.cjs.map +0 -1
- package/dist/ginger-Dntdd6zH.js +0 -1599
- package/dist/ginger-Dntdd6zH.js.map +0 -1
- package/dist/useSeekDrag-DBzoym0-.cjs +0 -2
- package/dist/useSeekDrag-DBzoym0-.cjs.map +0 -1
- package/dist/useSeekDrag-jLsYA-uG.js +0 -174
- package/dist/useSeekDrag-jLsYA-uG.js.map +0 -1
package/README.md
CHANGED
|
@@ -337,7 +337,7 @@ Props:
|
|
|
337
337
|
| `initialPlaylistMeta` | `PlaylistMeta \| null` | `null` | Queue/playlist metadata |
|
|
338
338
|
| `initialShuffle` | `boolean` | `false` | Start shuffled |
|
|
339
339
|
| `initialRepeatMode` | `"off" \| "all" \| "one"` | `"off"` | Initial repeat mode |
|
|
340
|
-
| `initialPlaybackMode` | `"playlist" \| "single"` | `"playlist"` | Playlist wraps/advances vs single-track stop behavior |
|
|
340
|
+
| `initialPlaybackMode` | `"playlist" \| "single"` | `"playlist"` | Playlist wraps/advances vs single-track stop behavior (change after mount with `useGinger().setPlaybackMode`) |
|
|
341
341
|
| `initialPaused` | `boolean` | `true` | Start paused or playing |
|
|
342
342
|
| `initialVolume` | `number` | `1` | Initial volume, clamped `0..1` |
|
|
343
343
|
| `initialMuted` | `boolean` | `false` | Initial muted state |
|
|
@@ -427,6 +427,7 @@ Returned values:
|
|
|
427
427
|
| `insertTrackAt`, `removeTrackAt`, `moveTrack`, `enqueueNext` | Queue mutation actions |
|
|
428
428
|
| `playTrackAt`, `selectTrackAt` | Pick a track by index |
|
|
429
429
|
| `setPlaylistMeta` | Replace playlist metadata |
|
|
430
|
+
| `setPlaybackMode` | `"playlist"` or `"single"` (next/prev/end behavior and repeat-one) |
|
|
430
431
|
| `audioRef` | Ref to the underlying `HTMLAudioElement` |
|
|
431
432
|
| `dispatch` | Raw reducer dispatch for advanced cases |
|
|
432
433
|
|
|
@@ -695,8 +696,85 @@ Example:
|
|
|
695
696
|
|
|
696
697
|
- **Buffered UI** — **`Ginger.Current.BufferRail`** shows load progress; **`Ginger.Current.TimeRail`** supports **`showBuffered`** to stack a buffered layer behind the played segment.
|
|
697
698
|
|
|
699
|
+
- **Audio analyzers** — Live Web Audio data for real-time visuals (**`useGingerLiveAnalyzer`**, main package) and whole-file grids for waveforms or spectrograms (**`useAudioFileAnalysis`** / **`analyzeAudioFile`**, `@lucaismyname/ginger/waveform`). See [Audio analyzers (visualizations)](#audio-analyzers-visualizations).
|
|
700
|
+
|
|
698
701
|
Recipes below cover queue lifecycle and media edge cases.
|
|
699
702
|
|
|
703
|
+
## Audio analyzers (visualizations)
|
|
704
|
+
|
|
705
|
+
Ginger separates **live** analysis (while the native `<audio>` element plays) from **whole-file** analysis (decode once, build static or seek-independent grids).
|
|
706
|
+
|
|
707
|
+
### Live: `useGingerLiveAnalyzer`
|
|
708
|
+
|
|
709
|
+
Import from the main package:
|
|
710
|
+
|
|
711
|
+
```tsx
|
|
712
|
+
import { Ginger, useGingerLiveAnalyzer } from "@lucaismyname/ginger";
|
|
713
|
+
|
|
714
|
+
function Spectrum() {
|
|
715
|
+
const { frequencyData, frequencyBinCount, error, resume, isSuspended } = useGingerLiveAnalyzer({
|
|
716
|
+
fftSize: 2048,
|
|
717
|
+
});
|
|
718
|
+
|
|
719
|
+
if (error) return <p role="alert">{error}</p>;
|
|
720
|
+
if (isSuspended) {
|
|
721
|
+
return (
|
|
722
|
+
<button type="button" onClick={() => void resume()}>
|
|
723
|
+
Enable audio analysis
|
|
724
|
+
</button>
|
|
725
|
+
);
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
return (
|
|
729
|
+
<div>
|
|
730
|
+
{/* e.g. map frequencyData[0..frequencyBinCount) to bar heights */}
|
|
731
|
+
<span>{frequencyBinCount} bins</span>
|
|
732
|
+
</div>
|
|
733
|
+
);
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// Mount <Ginger.Player crossOrigin="anonymous" /> when fileUrl is cross-origin so Web Audio can use the element.
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
Important:
|
|
740
|
+
|
|
741
|
+
- **CORS** — For cross-origin `fileUrl` values, set **`crossOrigin`** on **`Ginger.Player`** (for example `"anonymous"`) so the media element is usable with **`AudioContext`**.
|
|
742
|
+
- **One `MediaElementAudioSourceNode` per `<audio>`** — The library reuses a single Web Audio graph per underlying element. Multiple instances of **`useGingerLiveAnalyzer`** attach extra **`AnalyserNode`**s as taps; only one tap carries audio to **`destination`** so volume stays correct.
|
|
743
|
+
- **Autoplay** — The **`AudioContext`** may start **`suspended`** until a user gesture; call **`resume()`** or start playback after interaction.
|
|
744
|
+
- **Reading buffers** — `frequencyData` and `timeDomainData` are updated each animation frame while enabled; read them during render after **`frequencyBinCount > 0`** (they are backed by mutable buffers that the hook fills in a `requestAnimationFrame` loop).
|
|
745
|
+
|
|
746
|
+
### Whole file: `@lucaismyname/ginger/waveform`
|
|
747
|
+
|
|
748
|
+
Use **`useAudioFileAnalysis`** (React hook) or **`analyzeAudioFile`** / **`analyzeAudioBuffer`** (imperative) for amplitude grids and optional spectrogram rows without playing the track.
|
|
749
|
+
|
|
750
|
+
```tsx
|
|
751
|
+
import { useAudioFileAnalysis } from "@lucaismyname/ginger/waveform";
|
|
752
|
+
|
|
753
|
+
function FileViz({ url }: { url: string }) {
|
|
754
|
+
const { data, isLoading, error } = useAudioFileAnalysis(url, {
|
|
755
|
+
timeSlices: 128,
|
|
756
|
+
samplesPerSlice: 8,
|
|
757
|
+
spectrogram: true,
|
|
758
|
+
fftSize: 1024,
|
|
759
|
+
frequencyBins: 256,
|
|
760
|
+
});
|
|
761
|
+
|
|
762
|
+
if (isLoading) return <p>Loading analysis…</p>;
|
|
763
|
+
if (error) return <p role="alert">{error}</p>;
|
|
764
|
+
if (!data) return null;
|
|
765
|
+
|
|
766
|
+
return (
|
|
767
|
+
<div>
|
|
768
|
+
<p>Duration: {data.duration}s</p>
|
|
769
|
+
{/* data.amplitudeGrid: number[][] */}
|
|
770
|
+
{/* data.spectrogram?: number[][] normalized to [0, 1] */}
|
|
771
|
+
</div>
|
|
772
|
+
);
|
|
773
|
+
}
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
**`useAudioPeaks`** (same subpath) remains a lightweight helper: a single row of decoded amplitude peaks. Prefer **`useAudioFileAnalysis`** when you need a 2D amplitude grid or spectrogram.
|
|
777
|
+
|
|
700
778
|
## Recipes
|
|
701
779
|
|
|
702
780
|
### Updating the queue after mount
|
|
@@ -800,7 +878,7 @@ This allows persisted volume/rate/repeat/index and optional per-track resume pos
|
|
|
800
878
|
- `moveTrack(fromIndex, toIndex)`
|
|
801
879
|
- `enqueueNext(track)`
|
|
802
880
|
|
|
803
|
-
Provider supports `initialPlaybackMode?: "playlist" | "single"` (`"playlist"` default).
|
|
881
|
+
Provider supports `initialPlaybackMode?: "playlist" | "single"` (`"playlist"` default). Use `setPlaybackMode("playlist" | "single")` from `useGinger()` or `useGingerPlayback()` to change mode without a full `init()`.
|
|
804
882
|
|
|
805
883
|
### Reduced motion and blocked-play policy
|
|
806
884
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useContext as n, useMemo as o, createContext as
|
|
2
|
-
const i =
|
|
1
|
+
import { useContext as n, useMemo as o, createContext as s } from "react";
|
|
2
|
+
const i = s(null), u = s(null);
|
|
3
3
|
function c() {
|
|
4
4
|
const e = n(i);
|
|
5
5
|
if (!e) throw new Error("Ginger hooks must be used within <Ginger.Provider>");
|
|
@@ -10,11 +10,11 @@ function _() {
|
|
|
10
10
|
if (!e) throw new Error("Ginger hooks must be used within <Ginger.Provider>");
|
|
11
11
|
return e;
|
|
12
12
|
}
|
|
13
|
-
function
|
|
13
|
+
function B() {
|
|
14
14
|
const e = c(), t = _();
|
|
15
15
|
return o(() => l(e, t), [e, t]);
|
|
16
16
|
}
|
|
17
|
-
function
|
|
17
|
+
function D(e, t) {
|
|
18
18
|
return { ...e, ...t };
|
|
19
19
|
}
|
|
20
20
|
function l(e, t) {
|
|
@@ -27,37 +27,38 @@ function l(e, t) {
|
|
|
27
27
|
prev: f,
|
|
28
28
|
setRepeatMode: x,
|
|
29
29
|
cycleRepeat: y,
|
|
30
|
-
toggleShuffle:
|
|
31
|
-
setQueue:
|
|
32
|
-
insertTrackAt:
|
|
30
|
+
toggleShuffle: b,
|
|
31
|
+
setQueue: G,
|
|
32
|
+
insertTrackAt: h,
|
|
33
33
|
removeTrackAt: P,
|
|
34
34
|
moveTrack: M,
|
|
35
35
|
enqueueNext: v,
|
|
36
36
|
playTrackAt: w,
|
|
37
37
|
selectTrackAt: C,
|
|
38
38
|
setPlaylistMeta: R,
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
setPlaybackMode: T,
|
|
40
|
+
dispatch: A,
|
|
41
|
+
...r
|
|
41
42
|
} = e, {
|
|
42
|
-
seek:
|
|
43
|
-
setVolume:
|
|
44
|
-
setMuted:
|
|
45
|
-
toggleMute:
|
|
46
|
-
setPlaybackRate:
|
|
47
|
-
audioRef:
|
|
48
|
-
notifyEnded:
|
|
49
|
-
dispatch:
|
|
43
|
+
seek: S,
|
|
44
|
+
setVolume: E,
|
|
45
|
+
setMuted: q,
|
|
46
|
+
toggleMute: F,
|
|
47
|
+
setPlaybackRate: V,
|
|
48
|
+
audioRef: N,
|
|
49
|
+
notifyEnded: Q,
|
|
50
|
+
dispatch: j,
|
|
50
51
|
...a
|
|
51
52
|
} = t;
|
|
52
|
-
return { ...
|
|
53
|
+
return { ...r, ...a };
|
|
53
54
|
}
|
|
54
55
|
export {
|
|
55
56
|
i as G,
|
|
56
|
-
|
|
57
|
+
D as a,
|
|
57
58
|
c as b,
|
|
58
|
-
|
|
59
|
+
B as c,
|
|
59
60
|
u as d,
|
|
60
61
|
l as g,
|
|
61
62
|
_ as u
|
|
62
63
|
};
|
|
63
|
-
//# sourceMappingURL=GingerSplitContexts-
|
|
64
|
+
//# sourceMappingURL=GingerSplitContexts-BzBExb95.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GingerSplitContexts-BzBExb95.js","sources":["../src/context/GingerSplitContexts.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, type Dispatch, type MutableRefObject } from \"react\";\nimport type {\n GingerAction,\n GingerInitPayload,\n GingerMediaSlice,\n GingerPlaybackSlice,\n GingerState,\n PlaybackMode,\n PlaylistMeta,\n RepeatMode,\n Track,\n} from \"../types\";\n\nexport type GingerPlaybackActions = {\n init: (payload: GingerInitPayload) => void;\n play: () => void;\n pause: () => void;\n togglePlayPause: () => void;\n next: () => void;\n prev: () => void;\n setRepeatMode: (mode: RepeatMode) => void;\n cycleRepeat: () => void;\n toggleShuffle: () => void;\n setQueue: (tracks: Track[], currentIndex?: number) => void;\n insertTrackAt: (track: Track, index?: number, autoPlay?: boolean) => void;\n removeTrackAt: (index: number) => void;\n moveTrack: (fromIndex: number, toIndex: number) => void;\n enqueueNext: (track: Track) => void;\n playTrackAt: (index: number) => void;\n selectTrackAt: (index: number) => void;\n setPlaylistMeta: (meta: PlaylistMeta | null) => void;\n setPlaybackMode: (mode: PlaybackMode) => void;\n dispatch: Dispatch<GingerAction>;\n};\n\nexport type GingerPlaybackContextValue = GingerPlaybackSlice & GingerPlaybackActions;\n\nexport type GingerMediaActions = {\n seek: (timeSeconds: number) => void;\n setVolume: (volume: number) => void;\n setMuted: (muted: boolean) => void;\n toggleMute: () => void;\n setPlaybackRate: (rate: number) => void;\n audioRef: MutableRefObject<HTMLAudioElement | null>;\n notifyEnded: () => void;\n dispatch: Dispatch<GingerAction>;\n};\n\nexport type GingerMediaContextValue = GingerMediaSlice & GingerMediaActions;\n\nconst GingerPlaybackContext = createContext<GingerPlaybackContextValue | null>(null);\nconst GingerMediaContext = createContext<GingerMediaContextValue | null>(null);\n\nexport function useGingerPlayback(): GingerPlaybackContextValue {\n const ctx = useContext(GingerPlaybackContext);\n if (!ctx) throw new Error(\"Ginger hooks must be used within <Ginger.Provider>\");\n return ctx;\n}\n\nexport function useGingerMedia(): GingerMediaContextValue {\n const ctx = useContext(GingerMediaContext);\n if (!ctx) throw new Error(\"Ginger hooks must be used within <Ginger.Provider>\");\n return ctx;\n}\n\n/** Full merged state; prefer over `useGingerContext().state` so updates follow playback vs media splits. */\nexport function useGingerState(): GingerState {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n return useMemo(() => gingerStateFromContextValues(pb, md), [pb, md]);\n}\n\n/** Merge playback + media slices (for selectors and `useGinger`). */\nexport function gingerStateFromContexts(\n playback: GingerPlaybackSlice,\n media: GingerMediaSlice,\n): GingerState {\n return { ...playback, ...media };\n}\n\n/** Merge full context values into `GingerState` (strips action fields). */\nexport function gingerStateFromContextValues(\n pb: GingerPlaybackContextValue,\n md: GingerMediaContextValue,\n): GingerState {\n const {\n init: _i,\n play: _p,\n pause: _pa,\n togglePlayPause: _t,\n next: _n,\n prev: _pr,\n setRepeatMode: _sr,\n cycleRepeat: _cr,\n toggleShuffle: _ts,\n setQueue: _sq,\n insertTrackAt: _ita,\n removeTrackAt: _rta,\n moveTrack: _mt,\n enqueueNext: _en,\n playTrackAt: _pta,\n selectTrackAt: _sta,\n setPlaylistMeta: _spm,\n setPlaybackMode: _spbm,\n dispatch: _d1,\n ...playbackRest\n } = pb;\n const {\n seek: _sk,\n setVolume: _sv,\n setMuted: _sm,\n toggleMute: _tm,\n setPlaybackRate: _spr,\n audioRef: _ar,\n notifyEnded: _ne,\n dispatch: _d2,\n ...mediaRest\n } = md;\n return { ...playbackRest, ...mediaRest };\n}\n\nexport { GingerPlaybackContext, GingerMediaContext };\n"],"names":["GingerPlaybackContext","createContext","GingerMediaContext","useGingerPlayback","ctx","useContext","useGingerMedia","useGingerState","pb","md","useMemo","gingerStateFromContextValues","gingerStateFromContexts","playback","media","_i","_p","_pa","_t","_n","_pr","_sr","_cr","_ts","_sq","_ita","_rta","_mt","_en","_pta","_sta","_spm","_spbm","_d1","playbackRest","_sk","_sv","_sm","_tm","_spr","_ar","_ne","_d2","mediaRest"],"mappings":";AAkDA,MAAMA,IAAwBC,EAAiD,IAAI,GAC7EC,IAAqBD,EAA8C,IAAI;AAEtE,SAASE,IAAgD;AAC9D,QAAMC,IAAMC,EAAWL,CAAqB;AAC5C,MAAI,CAACI,EAAK,OAAM,IAAI,MAAM,oDAAoD;AAC9E,SAAOA;AACT;AAEO,SAASE,IAA0C;AACxD,QAAMF,IAAMC,EAAWH,CAAkB;AACzC,MAAI,CAACE,EAAK,OAAM,IAAI,MAAM,oDAAoD;AAC9E,SAAOA;AACT;AAGO,SAASG,IAA8B;AAC5C,QAAMC,IAAKL,EAAA,GACLM,IAAKH,EAAA;AACX,SAAOI,EAAQ,MAAMC,EAA6BH,GAAIC,CAAE,GAAG,CAACD,GAAIC,CAAE,CAAC;AACrE;AAGO,SAASG,EACdC,GACAC,GACa;AACb,SAAO,EAAE,GAAGD,GAAU,GAAGC,EAAA;AAC3B;AAGO,SAASH,EACdH,GACAC,GACa;AACb,QAAM;AAAA,IACJ,MAAMM;AAAA,IACN,MAAMC;AAAA,IACN,OAAOC;AAAA,IACP,iBAAiBC;AAAA,IACjB,MAAMC;AAAA,IACN,MAAMC;AAAA,IACN,eAAeC;AAAA,IACf,aAAaC;AAAA,IACb,eAAeC;AAAA,IACf,UAAUC;AAAA,IACV,eAAeC;AAAA,IACf,eAAeC;AAAA,IACf,WAAWC;AAAA,IACX,aAAaC;AAAA,IACb,aAAaC;AAAA,IACb,eAAeC;AAAA,IACf,iBAAiBC;AAAA,IACjB,iBAAiBC;AAAA,IACjB,UAAUC;AAAA,IACV,GAAGC;AAAA,EAAA,IACD1B,GACE;AAAA,IACJ,MAAM2B;AAAA,IACN,WAAWC;AAAA,IACX,UAAUC;AAAA,IACV,YAAYC;AAAA,IACZ,iBAAiBC;AAAA,IACjB,UAAUC;AAAA,IACV,aAAaC;AAAA,IACb,UAAUC;AAAA,IACV,GAAGC;AAAA,EAAA,IACDlC;AACJ,SAAO,EAAE,GAAGyB,GAAc,GAAGS,EAAA;AAC/B;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const n=require("react"),r=n.createContext(null),s=n.createContext(null);function a(){const e=n.useContext(r);if(!e)throw new Error("Ginger hooks must be used within <Ginger.Provider>");return e}function o(){const e=n.useContext(s);if(!e)throw new Error("Ginger hooks must be used within <Ginger.Provider>");return e}function g(){const e=a(),t=o();return n.useMemo(()=>i(e,t),[e,t])}function _(e,t){return{...e,...t}}function i(e,t){const{init:l,play:d,pause:m,togglePlayPause:p,next:k,prev:x,setRepeatMode:G,cycleRepeat:y,toggleShuffle:C,setQueue:b,insertTrackAt:f,removeTrackAt:P,moveTrack:M,enqueueNext:h,playTrackAt:R,selectTrackAt:S,setPlaylistMeta:v,setPlaybackMode:w,dispatch:T,...u}=e,{seek:A,setVolume:F,setMuted:q,toggleMute:E,setPlaybackRate:V,audioRef:N,notifyEnded:Q,dispatch:j,...c}=t;return{...u,...c}}exports.GingerMediaContext=s;exports.GingerPlaybackContext=r;exports.gingerStateFromContextValues=i;exports.gingerStateFromContexts=_;exports.useGingerMedia=o;exports.useGingerPlayback=a;exports.useGingerState=g;
|
|
2
|
+
//# sourceMappingURL=GingerSplitContexts-C7puo0M7.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GingerSplitContexts-C7puo0M7.cjs","sources":["../src/context/GingerSplitContexts.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, type Dispatch, type MutableRefObject } from \"react\";\nimport type {\n GingerAction,\n GingerInitPayload,\n GingerMediaSlice,\n GingerPlaybackSlice,\n GingerState,\n PlaybackMode,\n PlaylistMeta,\n RepeatMode,\n Track,\n} from \"../types\";\n\nexport type GingerPlaybackActions = {\n init: (payload: GingerInitPayload) => void;\n play: () => void;\n pause: () => void;\n togglePlayPause: () => void;\n next: () => void;\n prev: () => void;\n setRepeatMode: (mode: RepeatMode) => void;\n cycleRepeat: () => void;\n toggleShuffle: () => void;\n setQueue: (tracks: Track[], currentIndex?: number) => void;\n insertTrackAt: (track: Track, index?: number, autoPlay?: boolean) => void;\n removeTrackAt: (index: number) => void;\n moveTrack: (fromIndex: number, toIndex: number) => void;\n enqueueNext: (track: Track) => void;\n playTrackAt: (index: number) => void;\n selectTrackAt: (index: number) => void;\n setPlaylistMeta: (meta: PlaylistMeta | null) => void;\n setPlaybackMode: (mode: PlaybackMode) => void;\n dispatch: Dispatch<GingerAction>;\n};\n\nexport type GingerPlaybackContextValue = GingerPlaybackSlice & GingerPlaybackActions;\n\nexport type GingerMediaActions = {\n seek: (timeSeconds: number) => void;\n setVolume: (volume: number) => void;\n setMuted: (muted: boolean) => void;\n toggleMute: () => void;\n setPlaybackRate: (rate: number) => void;\n audioRef: MutableRefObject<HTMLAudioElement | null>;\n notifyEnded: () => void;\n dispatch: Dispatch<GingerAction>;\n};\n\nexport type GingerMediaContextValue = GingerMediaSlice & GingerMediaActions;\n\nconst GingerPlaybackContext = createContext<GingerPlaybackContextValue | null>(null);\nconst GingerMediaContext = createContext<GingerMediaContextValue | null>(null);\n\nexport function useGingerPlayback(): GingerPlaybackContextValue {\n const ctx = useContext(GingerPlaybackContext);\n if (!ctx) throw new Error(\"Ginger hooks must be used within <Ginger.Provider>\");\n return ctx;\n}\n\nexport function useGingerMedia(): GingerMediaContextValue {\n const ctx = useContext(GingerMediaContext);\n if (!ctx) throw new Error(\"Ginger hooks must be used within <Ginger.Provider>\");\n return ctx;\n}\n\n/** Full merged state; prefer over `useGingerContext().state` so updates follow playback vs media splits. */\nexport function useGingerState(): GingerState {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n return useMemo(() => gingerStateFromContextValues(pb, md), [pb, md]);\n}\n\n/** Merge playback + media slices (for selectors and `useGinger`). */\nexport function gingerStateFromContexts(\n playback: GingerPlaybackSlice,\n media: GingerMediaSlice,\n): GingerState {\n return { ...playback, ...media };\n}\n\n/** Merge full context values into `GingerState` (strips action fields). */\nexport function gingerStateFromContextValues(\n pb: GingerPlaybackContextValue,\n md: GingerMediaContextValue,\n): GingerState {\n const {\n init: _i,\n play: _p,\n pause: _pa,\n togglePlayPause: _t,\n next: _n,\n prev: _pr,\n setRepeatMode: _sr,\n cycleRepeat: _cr,\n toggleShuffle: _ts,\n setQueue: _sq,\n insertTrackAt: _ita,\n removeTrackAt: _rta,\n moveTrack: _mt,\n enqueueNext: _en,\n playTrackAt: _pta,\n selectTrackAt: _sta,\n setPlaylistMeta: _spm,\n setPlaybackMode: _spbm,\n dispatch: _d1,\n ...playbackRest\n } = pb;\n const {\n seek: _sk,\n setVolume: _sv,\n setMuted: _sm,\n toggleMute: _tm,\n setPlaybackRate: _spr,\n audioRef: _ar,\n notifyEnded: _ne,\n dispatch: _d2,\n ...mediaRest\n } = md;\n return { ...playbackRest, ...mediaRest };\n}\n\nexport { GingerPlaybackContext, GingerMediaContext };\n"],"names":["GingerPlaybackContext","createContext","GingerMediaContext","useGingerPlayback","ctx","useContext","useGingerMedia","useGingerState","pb","md","useMemo","gingerStateFromContextValues","gingerStateFromContexts","playback","media","_i","_p","_pa","_t","_n","_pr","_sr","_cr","_ts","_sq","_ita","_rta","_mt","_en","_pta","_sta","_spm","_spbm","_d1","playbackRest","_sk","_sv","_sm","_tm","_spr","_ar","_ne","_d2","mediaRest"],"mappings":"sCAkDMA,EAAwBC,EAAAA,cAAiD,IAAI,EAC7EC,EAAqBD,EAAAA,cAA8C,IAAI,EAEtE,SAASE,GAAgD,CAC9D,MAAMC,EAAMC,EAAAA,WAAWL,CAAqB,EAC5C,GAAI,CAACI,EAAK,MAAM,IAAI,MAAM,oDAAoD,EAC9E,OAAOA,CACT,CAEO,SAASE,GAA0C,CACxD,MAAMF,EAAMC,EAAAA,WAAWH,CAAkB,EACzC,GAAI,CAACE,EAAK,MAAM,IAAI,MAAM,oDAAoD,EAC9E,OAAOA,CACT,CAGO,SAASG,GAA8B,CAC5C,MAAMC,EAAKL,EAAA,EACLM,EAAKH,EAAA,EACX,OAAOI,EAAAA,QAAQ,IAAMC,EAA6BH,EAAIC,CAAE,EAAG,CAACD,EAAIC,CAAE,CAAC,CACrE,CAGO,SAASG,EACdC,EACAC,EACa,CACb,MAAO,CAAE,GAAGD,EAAU,GAAGC,CAAA,CAC3B,CAGO,SAASH,EACdH,EACAC,EACa,CACb,KAAM,CACJ,KAAMM,EACN,KAAMC,EACN,MAAOC,EACP,gBAAiBC,EACjB,KAAMC,EACN,KAAMC,EACN,cAAeC,EACf,YAAaC,EACb,cAAeC,EACf,SAAUC,EACV,cAAeC,EACf,cAAeC,EACf,UAAWC,EACX,YAAaC,EACb,YAAaC,EACb,cAAeC,EACf,gBAAiBC,EACjB,gBAAiBC,EACjB,SAAUC,EACV,GAAGC,CAAA,EACD1B,EACE,CACJ,KAAM2B,EACN,UAAWC,EACX,SAAUC,EACV,WAAYC,EACZ,gBAAiBC,EACjB,SAAUC,EACV,YAAaC,EACb,SAAUC,EACV,GAAGC,CAAA,EACDlC,EACJ,MAAO,CAAE,GAAGyB,EAAc,GAAGS,CAAA,CAC/B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** One MediaElementAudioSourceNode per HTMLAudioElement; multiple AnalyserNodes may tap the source. */
|
|
2
|
+
export type LiveAnalyserOptions = {
|
|
3
|
+
fftSize: number;
|
|
4
|
+
smoothingTimeConstant: number;
|
|
5
|
+
minDecibels: number;
|
|
6
|
+
maxDecibels: number;
|
|
7
|
+
};
|
|
8
|
+
export declare function attachLiveAnalyser(element: HTMLAudioElement, options: LiveAnalyserOptions): {
|
|
9
|
+
id: number;
|
|
10
|
+
context: AudioContext;
|
|
11
|
+
analyser: AnalyserNode;
|
|
12
|
+
};
|
|
13
|
+
export declare function detachLiveAnalyser(element: HTMLAudioElement, id: number): void;
|
|
14
|
+
//# sourceMappingURL=liveAudioGraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liveAudioGraph.d.ts","sourceRoot":"","sources":["../../src/analyzer/liveAudioGraph.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAsBF,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,mBAAmB,GAC3B;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,CAgC/D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CA6B9E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type UseGingerLiveAnalyzerOptions = {
|
|
2
|
+
/** When false, the analyser is detached and no frames are read. Default true. */
|
|
3
|
+
enabled?: boolean;
|
|
4
|
+
fftSize?: number;
|
|
5
|
+
smoothingTimeConstant?: number;
|
|
6
|
+
minDecibels?: number;
|
|
7
|
+
maxDecibels?: number;
|
|
8
|
+
};
|
|
9
|
+
export type UseGingerLiveAnalyzerResult = {
|
|
10
|
+
/** Byte frequency data (0–255); length equals `frequencyBinCount`. Updated each animation frame while enabled. */
|
|
11
|
+
frequencyData: Uint8Array;
|
|
12
|
+
/** Byte time-domain data (0–255); length equals `fftSize`. */
|
|
13
|
+
timeDomainData: Uint8Array;
|
|
14
|
+
frequencyBinCount: number;
|
|
15
|
+
sampleRate: number;
|
|
16
|
+
isSuspended: boolean;
|
|
17
|
+
error: string | null;
|
|
18
|
+
resume: () => Promise<void>;
|
|
19
|
+
};
|
|
20
|
+
export declare function useGingerLiveAnalyzer(options?: UseGingerLiveAnalyzerOptions): UseGingerLiveAnalyzerResult;
|
|
21
|
+
//# sourceMappingURL=useGingerLiveAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGingerLiveAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/useGingerLiveAnalyzer.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,4BAA4B,GAAG;IACzC,iFAAiF;IACjF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,kHAAkH;IAClH,aAAa,EAAE,UAAU,CAAC;IAC1B,8DAA8D;IAC9D,cAAc,EAAE,UAAU,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAKF,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,2BAA2B,CAkK7G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerPlayer.d.ts","sourceRoot":"","sources":["../../src/audio/GingerPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGlG,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3D,WAAW,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC,CAAC;IACnE,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAQF,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,EACL,OAAoB,EACpB,WAAW,EACX,oBAA4B,GAC7B,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"GingerPlayer.d.ts","sourceRoot":"","sources":["../../src/audio/GingerPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGlG,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3D,WAAW,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC,CAAC;IACnE,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAQF,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,EACL,OAAoB,EACpB,WAAW,EACX,oBAA4B,GAC7B,EAAE,iBAAiB,2CA6HnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GingerPlayer.test.d.ts","sourceRoot":"","sources":["../../src/audio/GingerPlayer.test.tsx"],"names":[],"mappings":""}
|
package/dist/client.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./ginger-BiI69vrn.cjs"),e=require("./useSeekDrag-aS7uk26h.cjs"),a=require("./GingerSplitContexts-C7puo0M7.cjs");exports.Ginger=r.Ginger;exports.clampPlaybackRate=r.clampPlaybackRate;exports.clampVolume=r.clampVolume;exports.defaultGingerLocale=r.defaultGingerLocale;exports.derivePlaybackUiState=r.derivePlaybackUiState;exports.useGingerLocale=r.useGingerLocale;exports.usePlayPauseBinding=r.usePlayPauseBinding;exports.useSeekBarBinding=r.useSeekBarBinding;exports.useVolumeSlider=r.useVolumeSlider;exports.attachLiveAnalyser=e.attachLiveAnalyser;exports.detachLiveAnalyser=e.detachLiveAnalyser;exports.parseLrc=e.parseLrc;exports.useGinger=e.useGinger;exports.useGingerChapters=e.useGingerChapters;exports.useGingerDebugLog=e.useGingerDebugLog;exports.useGingerKeyboardShortcuts=e.useGingerKeyboardShortcuts;exports.useGingerLiveAnalyzer=e.useGingerLiveAnalyzer;exports.useGingerLyricsSync=e.useGingerLyricsSync;exports.useGingerSleepTimer=e.useGingerSleepTimer;exports.useSeekDrag=e.useSeekDrag;exports.gingerStateFromContextValues=a.gingerStateFromContextValues;exports.gingerStateFromContexts=a.gingerStateFromContexts;exports.useGingerMedia=a.useGingerMedia;exports.useGingerPlayback=a.useGingerPlayback;exports.useGingerState=a.useGingerState;
|
|
2
2
|
//# sourceMappingURL=client.cjs.map
|
package/dist/client.js
CHANGED
|
@@ -1,28 +1,31 @@
|
|
|
1
|
-
import { G as s, c as r, a as i, d as
|
|
2
|
-
import {
|
|
3
|
-
import { g as
|
|
1
|
+
import { G as s, c as r, a as i, d as g, b as n, u, e as t, f as l, g as o } from "./ginger-BTPRqWHs.js";
|
|
2
|
+
import { a as G, d, p as m, u as y, b as S, c as p, e as b, f as L, g as f, h, i as k } from "./useSeekDrag-Br1V0Vao.js";
|
|
3
|
+
import { g as P, a as v, u as A, b as B, c as C } from "./GingerSplitContexts-BzBExb95.js";
|
|
4
4
|
export {
|
|
5
5
|
s as Ginger,
|
|
6
|
+
G as attachLiveAnalyser,
|
|
6
7
|
r as clampPlaybackRate,
|
|
7
8
|
i as clampVolume,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
m as
|
|
9
|
+
g as defaultGingerLocale,
|
|
10
|
+
n as derivePlaybackUiState,
|
|
11
|
+
d as detachLiveAnalyser,
|
|
12
|
+
P as gingerStateFromContextValues,
|
|
13
|
+
v as gingerStateFromContexts,
|
|
14
|
+
m as parseLrc,
|
|
15
|
+
y as useGinger,
|
|
14
16
|
S as useGingerChapters,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
p as useGingerDebugLog,
|
|
18
|
+
b as useGingerKeyboardShortcuts,
|
|
19
|
+
L as useGingerLiveAnalyzer,
|
|
20
|
+
u as useGingerLocale,
|
|
21
|
+
f as useGingerLyricsSync,
|
|
22
|
+
A as useGingerMedia,
|
|
20
23
|
B as useGingerPlayback,
|
|
21
|
-
|
|
24
|
+
h as useGingerSleepTimer,
|
|
22
25
|
C as useGingerState,
|
|
23
26
|
t as usePlayPauseBinding,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
l as useSeekBarBinding,
|
|
28
|
+
k as useSeekDrag,
|
|
29
|
+
o as useVolumeSlider
|
|
27
30
|
};
|
|
28
31
|
//# sourceMappingURL=client.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Dispatch, MutableRefObject } from 'react';
|
|
2
|
-
import { GingerAction, GingerInitPayload, GingerState, PlaylistMeta, RepeatMode, Track } from '../types';
|
|
2
|
+
import { GingerAction, GingerInitPayload, GingerState, PlaybackMode, PlaylistMeta, RepeatMode, Track } from '../types';
|
|
3
3
|
export type GingerContextValue = {
|
|
4
4
|
state: GingerState;
|
|
5
5
|
dispatch: Dispatch<GingerAction>;
|
|
@@ -28,6 +28,7 @@ export type GingerContextValue = {
|
|
|
28
28
|
playTrackAt: (index: number) => void;
|
|
29
29
|
selectTrackAt: (index: number) => void;
|
|
30
30
|
setPlaylistMeta: (meta: PlaylistMeta | null) => void;
|
|
31
|
+
setPlaybackMode: (mode: PlaybackMode) => void;
|
|
31
32
|
};
|
|
32
33
|
declare const GingerContext: import('react').Context<GingerContextValue | null>;
|
|
33
34
|
export declare function useGingerContext(): GingerContextValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerContext.d.ts","sourceRoot":"","sources":["../../src/context/GingerContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACxF,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"GingerContext.d.ts","sourceRoot":"","sources":["../../src/context/GingerContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACxF,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,KAAK,EACN,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjC,QAAQ,EAAE,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACpD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,4EAA4E;IAC5E,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1E,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF,QAAA,MAAM,aAAa,oDAAiD,CAAC;AAErE,wBAAgB,gBAAgB,IAAI,kBAAkB,CAIrD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerProvider.d.ts","sourceRoot":"","sources":["../../src/context/GingerProvider.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"GingerProvider.d.ts","sourceRoot":"","sources":["../../src/context/GingerProvider.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAEV,mBAAmB,EAKpB,MAAM,UAAU,CAAC;AAmBlB,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,aAAkB,EAClB,YAAgB,EAChB,mBAA0B,EAC1B,cAAsB,EACtB,iBAAyB,EACzB,mBAAgC,EAChC,aAAoB,EACpB,aAAiB,EACjB,YAAoB,EACpB,mBAAuB,EACvB,eAAe,EACf,MAAM,EACN,YAAoB,EACpB,UAAU,EACV,aAAa,EACb,WAAW,EACX,cAAsB,EACtB,mBAA2B,EAC3B,QAAgB,EAChB,SAAS,EACT,KAAK,EACL,aAAa,EACb,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,GACR,EAAE,mBAAmB,2CA+frB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Dispatch, MutableRefObject } from 'react';
|
|
2
|
-
import { GingerAction, GingerInitPayload, GingerMediaSlice, GingerPlaybackSlice, GingerState, PlaylistMeta, RepeatMode, Track } from '../types';
|
|
2
|
+
import { GingerAction, GingerInitPayload, GingerMediaSlice, GingerPlaybackSlice, GingerState, PlaybackMode, PlaylistMeta, RepeatMode, Track } from '../types';
|
|
3
3
|
export type GingerPlaybackActions = {
|
|
4
4
|
init: (payload: GingerInitPayload) => void;
|
|
5
5
|
play: () => void;
|
|
@@ -18,6 +18,7 @@ export type GingerPlaybackActions = {
|
|
|
18
18
|
playTrackAt: (index: number) => void;
|
|
19
19
|
selectTrackAt: (index: number) => void;
|
|
20
20
|
setPlaylistMeta: (meta: PlaylistMeta | null) => void;
|
|
21
|
+
setPlaybackMode: (mode: PlaybackMode) => void;
|
|
21
22
|
dispatch: Dispatch<GingerAction>;
|
|
22
23
|
};
|
|
23
24
|
export type GingerPlaybackContextValue = GingerPlaybackSlice & GingerPlaybackActions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerSplitContexts.d.ts","sourceRoot":"","sources":["../../src/context/GingerSplitContexts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACjG,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,KAAK,EACN,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1E,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,mBAAmB,GAAG,qBAAqB,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACpD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAE5E,QAAA,MAAM,qBAAqB,4DAAyD,CAAC;AACrF,QAAA,MAAM,kBAAkB,yDAAsD,CAAC;AAE/E,wBAAgB,iBAAiB,IAAI,0BAA0B,CAI9D;AAED,wBAAgB,cAAc,IAAI,uBAAuB,CAIxD;AAED,4GAA4G;AAC5G,wBAAgB,cAAc,IAAI,WAAW,CAI5C;AAED,qEAAqE;AACrE,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,gBAAgB,GACtB,WAAW,CAEb;AAED,2EAA2E;AAC3E,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,0BAA0B,EAC9B,EAAE,EAAE,uBAAuB,GAC1B,WAAW,
|
|
1
|
+
{"version":3,"file":"GingerSplitContexts.d.ts","sourceRoot":"","sources":["../../src/context/GingerSplitContexts.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playbackReducer.d.ts","sourceRoot":"","sources":["../../src/core/playbackReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAY7E,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAkBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,WAAW,CA0Bd;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"playbackReducer.d.ts","sourceRoot":"","sources":["../../src/core/playbackReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAY7E,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAkBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,WAAW,CA0Bd;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAwOnF"}
|
package/dist/core/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,CAU/E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGrE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,CAU/E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGrE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAyBlG;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CAKpF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAKrE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAetF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,CAEzF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react"),t=require("../GingerSplitContexts-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react"),t=require("../GingerSplitContexts-C7puo0M7.cjs");function a(){const{tracks:e}=t.useGingerPlayback();return s.useMemo(()=>({supported:!1,reason:"Gapless playback requires dedicated Web Audio graph orchestration.",preloadedTrackIds:e.map(r=>r.id??r.fileUrl)}),[e])}exports.useExperimentalGapless=a;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|