l-min-components 1.7.1321 → 1.7.1323
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/package.json
CHANGED
|
@@ -9,7 +9,8 @@ const useAudioPlayer = ({ src, streamSrc }) => {
|
|
|
9
9
|
const [error, setError] = useState(null);
|
|
10
10
|
const [progress, setProgress] = useState({});
|
|
11
11
|
|
|
12
|
-
const
|
|
12
|
+
const url = useMemo(() => src || streamSrc, [src, streamSrc]);
|
|
13
|
+
const audio = useMemo(() => new Audio(), [url]);
|
|
13
14
|
|
|
14
15
|
const { accessToken, generalData } = useContext(OutletContext);
|
|
15
16
|
|
|
@@ -34,15 +35,58 @@ const useAudioPlayer = ({ src, streamSrc }) => {
|
|
|
34
35
|
}
|
|
35
36
|
}, [isReady, audio]);
|
|
36
37
|
|
|
37
|
-
const url = useMemo(() => src || streamSrc, [src, streamSrc]);
|
|
38
|
-
|
|
39
38
|
useEffect(() => {
|
|
40
39
|
let hls;
|
|
41
40
|
|
|
41
|
+
const handleEnded = () => setIsPlaying(false);
|
|
42
|
+
const handlePause = () => setIsPlaying(false);
|
|
43
|
+
const handlePlay = () => setIsPlaying(true);
|
|
44
|
+
|
|
45
|
+
const handleProgress = () => {
|
|
46
|
+
if (audio) {
|
|
47
|
+
const currentTime = audio.currentTime;
|
|
48
|
+
const duration = audio.duration;
|
|
49
|
+
setProgress({ currentTime, duration });
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const attachAudioEvents = () => {
|
|
54
|
+
audio.addEventListener("ended", handleEnded);
|
|
55
|
+
audio.addEventListener("pause", handlePause);
|
|
56
|
+
audio.addEventListener("playing", handlePlay);
|
|
57
|
+
audio.addEventListener("timeupdate", handleProgress);
|
|
58
|
+
audio.addEventListener("loadedmetadata", handleProgress);
|
|
59
|
+
audio.addEventListener("waiting", () => setIsBuffering(true));
|
|
60
|
+
audio.addEventListener("canplay", () => setIsBuffering(false));
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const cleanupAudioEvents = () => {
|
|
64
|
+
audio.removeEventListener("ended", handleEnded);
|
|
65
|
+
audio.removeEventListener("pause", handlePause);
|
|
66
|
+
audio.removeEventListener("playing", handlePlay);
|
|
67
|
+
audio.removeEventListener("timeupdate", handleProgress);
|
|
68
|
+
audio.removeEventListener("loadedmetadata", handleProgress);
|
|
69
|
+
audio.removeEventListener("waiting", () => setIsBuffering(true));
|
|
70
|
+
audio.removeEventListener("canplay", () => setIsBuffering(false));
|
|
71
|
+
};
|
|
72
|
+
|
|
42
73
|
if (audio && accountId) {
|
|
43
|
-
if (
|
|
74
|
+
if (src) {
|
|
75
|
+
// Load src directly — faster, non-stream
|
|
76
|
+
audio.src = src;
|
|
77
|
+
const handleMetadata = () => {
|
|
78
|
+
setIsReady(true);
|
|
79
|
+
handleProgress();
|
|
80
|
+
audio.removeEventListener("loadedmetadata", handleMetadata);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
audio.addEventListener("loadedmetadata", handleMetadata);
|
|
84
|
+
attachAudioEvents();
|
|
85
|
+
audio.load();
|
|
86
|
+
} else if (Hls.isSupported() && streamSrc) {
|
|
87
|
+
// HLS streaming setup
|
|
44
88
|
hls = new Hls({
|
|
45
|
-
xhrSetup:
|
|
89
|
+
xhrSetup: (xhr, url) => {
|
|
46
90
|
const modifiedURL = `${url}?_account=${accountId}`;
|
|
47
91
|
xhr.open("GET", modifiedURL, true);
|
|
48
92
|
xhr.setRequestHeader("Authorization", `Bearer ${accessToken}`);
|
|
@@ -50,21 +94,25 @@ const useAudioPlayer = ({ src, streamSrc }) => {
|
|
|
50
94
|
lowLatencyMode: true,
|
|
51
95
|
});
|
|
52
96
|
|
|
53
|
-
hls.
|
|
54
|
-
hls?.attachMedia(audio);
|
|
97
|
+
hls.attachMedia(audio);
|
|
55
98
|
|
|
56
|
-
hls.on(Hls
|
|
99
|
+
hls.on(Hls.Events.MEDIA_ATTACHED, () => {
|
|
100
|
+
hls.loadSource(url);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
hls.on(Hls.Events.LEVEL_LOADED, () => {
|
|
57
104
|
setIsReady(true);
|
|
58
105
|
setError(null);
|
|
59
106
|
});
|
|
60
|
-
hls.on(Hls?.Events?.BUFFER_STALLED, () => {
|
|
61
|
-
setIsBuffering(true);
|
|
62
|
-
});
|
|
63
107
|
|
|
64
|
-
hls.on(Hls
|
|
65
|
-
|
|
108
|
+
hls.on(Hls.Events.MANIFEST_PARSED, () => {
|
|
109
|
+
setIsReady(true);
|
|
110
|
+
setError(null);
|
|
66
111
|
});
|
|
67
112
|
|
|
113
|
+
hls.on(Hls.Events.BUFFER_STALLED, () => setIsBuffering(true));
|
|
114
|
+
hls.on(Hls.Events.BUFFER_APPENDED, () => setIsBuffering(false));
|
|
115
|
+
|
|
68
116
|
hls.on(Hls.Events.ERROR, (event, data) => {
|
|
69
117
|
console.warn("HLS error", data);
|
|
70
118
|
if (data.fatal) {
|
|
@@ -79,47 +127,29 @@ const useAudioPlayer = ({ src, streamSrc }) => {
|
|
|
79
127
|
}
|
|
80
128
|
}
|
|
81
129
|
});
|
|
82
|
-
|
|
130
|
+
|
|
131
|
+
attachAudioEvents();
|
|
132
|
+
} else if (
|
|
133
|
+
streamSrc &&
|
|
134
|
+
audio.canPlayType("application/vnd.apple.mpegurl")
|
|
135
|
+
) {
|
|
136
|
+
// Safari native HLS
|
|
83
137
|
audio.src = url;
|
|
84
138
|
audio.addEventListener("loadedmetadata", () => {
|
|
85
139
|
setIsReady(true);
|
|
86
140
|
});
|
|
87
|
-
|
|
88
|
-
if (audio && src) {
|
|
89
|
-
audio.src = src;
|
|
90
|
-
audio.load();
|
|
91
|
-
setIsReady(true);
|
|
92
|
-
}
|
|
141
|
+
attachAudioEvents();
|
|
93
142
|
}
|
|
94
|
-
const handleEnded = () => setIsPlaying(false);
|
|
95
|
-
const handlePause = () => setIsPlaying(false);
|
|
96
|
-
const handlePlay = () => setIsPlaying(true);
|
|
97
|
-
|
|
98
|
-
const handleProgress = () => {
|
|
99
|
-
if (audio) {
|
|
100
|
-
const currentTime = audio.currentTime;
|
|
101
|
-
const duration = audio.duration;
|
|
102
|
-
|
|
103
|
-
setProgress({ currentTime, duration });
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
audio.addEventListener("ended", handleEnded);
|
|
108
|
-
audio.addEventListener("pause", handlePause);
|
|
109
|
-
audio.addEventListener("playing", handlePlay);
|
|
110
|
-
audio.addEventListener("timeupdate", handleProgress);
|
|
111
|
-
audio.addEventListener("loadedmetadata", handleProgress);
|
|
112
|
-
audio.addEventListener("waiting", () => setIsBuffering(true));
|
|
113
|
-
audio.addEventListener("canplay", () => setIsBuffering(false));
|
|
114
143
|
}
|
|
144
|
+
|
|
115
145
|
return () => {
|
|
116
146
|
if (hls) {
|
|
117
147
|
hls.destroy();
|
|
118
148
|
}
|
|
119
|
-
|
|
149
|
+
cleanupAudioEvents();
|
|
120
150
|
setIsReady(false);
|
|
121
151
|
};
|
|
122
|
-
}, [url, accessToken, accountId, audio]);
|
|
152
|
+
}, [url, accessToken, accountId, audio, src, streamSrc]);
|
|
123
153
|
|
|
124
154
|
return {
|
|
125
155
|
stop,
|