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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "l-min-components",
3
- "version": "1.7.1321",
3
+ "version": "1.7.1323",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "src/assets",
@@ -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 audio = useMemo(() => new Audio(), []);
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 (Hls?.isSupported() && streamSrc && !src) {
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: function (xhr, url) {
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.loadSource(url);
54
- hls?.attachMedia(audio);
97
+ hls.attachMedia(audio);
55
98
 
56
- hls.on(Hls?.Events?.MANIFEST_PARSED, () => {
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?.Events?.BUFFER_APPENDED, () => {
65
- setIsBuffering(false);
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
- } else if (!src && audio.canPlayType("application/vnd.apple.mpegurl")) {
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
- } else {
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,