@zuude-ui/video 0.1.35 → 0.1.92
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 +223 -0
- package/dist/chunk-OYLOY3EO.js +2 -0
- package/dist/chunk-OYLOY3EO.js.map +1 -0
- package/dist/hooks/index.cjs +2 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +84 -0
- package/dist/hooks/index.d.ts +84 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +1 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +58 -91
- package/dist/index.d.ts +58 -91
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/types-DejCaLAg.d.cts +9 -0
- package/dist/types-DejCaLAg.d.ts +9 -0
- package/dist/types-ixK0_H1i.d.cts +9 -0
- package/dist/types-ixK0_H1i.d.ts +9 -0
- package/dist/utils/index.cjs +2 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +51 -0
- package/dist/utils/index.d.ts +51 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +16 -11
- package/dist/chunk-WLYC6MHJ.js +0 -2
- package/dist/chunk-WLYC6MHJ.js.map +0 -1
- package/dist/new/index.cjs +0 -2
- package/dist/new/index.cjs.map +0 -1
- package/dist/new/index.d.cts +0 -36
- package/dist/new/index.d.ts +0 -36
- package/dist/new/index.js +0 -2
- package/dist/new/index.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# @zuude-ui/video
|
|
2
|
+
|
|
3
|
+
A comprehensive video player library with advanced time formatting utilities.
|
|
4
|
+
|
|
5
|
+
## Video Time Formatting Utilities
|
|
6
|
+
|
|
7
|
+
Similar to `date-fns` but specifically designed for video durations and time formatting.
|
|
8
|
+
|
|
9
|
+
### Basic Usage
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { formatTime, humanizeTime, parseTime } from "@zuude-ui/video/utils";
|
|
13
|
+
|
|
14
|
+
// Basic formatting
|
|
15
|
+
formatTime(125.5); // "2:05"
|
|
16
|
+
formatTime(125.5, "h:mm:ss"); // "0:02:05"
|
|
17
|
+
formatTime(125.5, "ss"); // "125s"
|
|
18
|
+
|
|
19
|
+
// Human readable
|
|
20
|
+
humanizeTime(125.5); // "2 minutes 5 seconds"
|
|
21
|
+
humanizeTime(125.5, { compact: true }); // "2 minutes"
|
|
22
|
+
|
|
23
|
+
// Parse time strings
|
|
24
|
+
parseTime("2:30"); // 150
|
|
25
|
+
parseTime("1:23:45"); // 5025
|
|
26
|
+
parseTime("90s"); // 90
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Available Functions
|
|
30
|
+
|
|
31
|
+
#### `formatTime(time, options)`
|
|
32
|
+
|
|
33
|
+
Format time in seconds to various formats.
|
|
34
|
+
|
|
35
|
+
**Parameters:**
|
|
36
|
+
|
|
37
|
+
- `time` (number): Time in seconds
|
|
38
|
+
- `options` (TimeFormatOptions | TimeFormat): Format options
|
|
39
|
+
|
|
40
|
+
**Formats:**
|
|
41
|
+
|
|
42
|
+
- `"mm:ss"` (default): "2:05"
|
|
43
|
+
- `"h:mm:ss"`: "0:02:05"
|
|
44
|
+
- `"ss"`: "125s"
|
|
45
|
+
- `"human"`: "2 minutes 5 seconds"
|
|
46
|
+
- `"compact"`: "2:05"
|
|
47
|
+
- `"detailed"`: "00:02:05.000"
|
|
48
|
+
|
|
49
|
+
**Options:**
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
interface TimeFormatOptions {
|
|
53
|
+
format?: TimeFormat;
|
|
54
|
+
showHours?: boolean;
|
|
55
|
+
showLeadingZeros?: boolean;
|
|
56
|
+
showMilliseconds?: boolean;
|
|
57
|
+
humanize?: boolean;
|
|
58
|
+
compact?: boolean;
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
#### `humanizeTime(time, options)`
|
|
63
|
+
|
|
64
|
+
Convert time to human-readable format.
|
|
65
|
+
|
|
66
|
+
```tsx
|
|
67
|
+
humanizeTime(125.5); // "2 minutes 5 seconds"
|
|
68
|
+
humanizeTime(125.5, { compact: true }); // "2 minutes"
|
|
69
|
+
humanizeTime(3600); // "1 hour"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### `compactTime(time)`
|
|
73
|
+
|
|
74
|
+
Compact time format.
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
compactTime(125.5); // "2:05"
|
|
78
|
+
compactTime(3600); // "1:00:00"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
#### `detailedTime(time, options)`
|
|
82
|
+
|
|
83
|
+
Detailed time format with optional milliseconds.
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
detailedTime(125.5); // "00:02:05"
|
|
87
|
+
detailedTime(125.5, { showMilliseconds: true }); // "00:02:05.000"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
#### `parseTime(timeString)`
|
|
91
|
+
|
|
92
|
+
Parse time string to seconds.
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
parseTime("2:30"); // 150
|
|
96
|
+
parseTime("1:23:45"); // 5025
|
|
97
|
+
parseTime("90s"); // 90
|
|
98
|
+
parseTime("1.5m"); // 90
|
|
99
|
+
parseTime("0.5h"); // 1800
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### `timeRemaining(current, total, format)`
|
|
103
|
+
|
|
104
|
+
Calculate remaining time.
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
timeRemaining(125.5, 3600); // "57:54"
|
|
108
|
+
timeRemaining(125.5, 3600, "human"); // "57 minutes 54 seconds"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
#### `formatTimeWithPercentage(current, total, format)`
|
|
112
|
+
|
|
113
|
+
Format time with percentage.
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
formatTimeWithPercentage(125.5, 3600); // "2:05 (3%)"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
#### `getTimeSegments(duration, segments)`
|
|
120
|
+
|
|
121
|
+
Get time segments for timeline.
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
getTimeSegments(3600, 5); // [0, 720, 1440, 2160, 2880, 3600]
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
#### `formatTimeForAccessibility(time)`
|
|
128
|
+
|
|
129
|
+
Format time for screen readers.
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
formatTimeForAccessibility(125.5); // "2 minutes, 5 seconds"
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Advanced Examples
|
|
136
|
+
|
|
137
|
+
#### Custom Timeline Component
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
import { formatTime, getTimeSegments } from "@zuude-ui/video/utils";
|
|
141
|
+
|
|
142
|
+
const Timeline = ({ currentTime, duration }) => {
|
|
143
|
+
const segments = getTimeSegments(duration, 10);
|
|
144
|
+
|
|
145
|
+
return (
|
|
146
|
+
<div className="timeline">
|
|
147
|
+
{segments.map((time, i) => (
|
|
148
|
+
<div key={i} className="segment">
|
|
149
|
+
{formatTime(time, "mm:ss")}
|
|
150
|
+
</div>
|
|
151
|
+
))}
|
|
152
|
+
</div>
|
|
153
|
+
);
|
|
154
|
+
};
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
#### Video Progress Display
|
|
158
|
+
|
|
159
|
+
```tsx
|
|
160
|
+
import {
|
|
161
|
+
formatTime,
|
|
162
|
+
timeRemaining,
|
|
163
|
+
formatTimeWithPercentage,
|
|
164
|
+
} from "@zuude-ui/video/utils";
|
|
165
|
+
|
|
166
|
+
const VideoProgress = ({ currentTime, duration }) => {
|
|
167
|
+
return (
|
|
168
|
+
<div className="video-progress">
|
|
169
|
+
<span>{formatTime(currentTime)}</span>
|
|
170
|
+
<span>{timeRemaining(currentTime, duration)}</span>
|
|
171
|
+
<span>{formatTimeWithPercentage(currentTime, duration)}</span>
|
|
172
|
+
</div>
|
|
173
|
+
);
|
|
174
|
+
};
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
#### Accessibility-Friendly Time Display
|
|
178
|
+
|
|
179
|
+
```tsx
|
|
180
|
+
import { formatTimeForAccessibility } from "@zuude-ui/video/utils";
|
|
181
|
+
|
|
182
|
+
const AccessibleTimeDisplay = ({ time }) => {
|
|
183
|
+
return (
|
|
184
|
+
<span aria-label={formatTimeForAccessibility(time)}>
|
|
185
|
+
{formatTime(time)}
|
|
186
|
+
</span>
|
|
187
|
+
);
|
|
188
|
+
};
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Comparison with Other Libraries
|
|
192
|
+
|
|
193
|
+
| Feature | @zuude-ui/video | date-fns | humanize-duration |
|
|
194
|
+
| ------------------ | --------------- | -------- | ----------------- |
|
|
195
|
+
| Video-specific | ✅ | ❌ | ❌ |
|
|
196
|
+
| Multiple formats | ✅ | ✅ | ❌ |
|
|
197
|
+
| Time parsing | ✅ | ❌ | ❌ |
|
|
198
|
+
| Accessibility | ✅ | ❌ | ❌ |
|
|
199
|
+
| Percentage display | ✅ | ❌ | ❌ |
|
|
200
|
+
| Time segments | ✅ | ❌ | ❌ |
|
|
201
|
+
| Bundle size | Small | Large | Medium |
|
|
202
|
+
|
|
203
|
+
### Installation
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
npm install @zuude-ui/video
|
|
207
|
+
# or
|
|
208
|
+
yarn add @zuude-ui/video
|
|
209
|
+
# or
|
|
210
|
+
pnpm add @zuude-ui/video
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### TypeScript Support
|
|
214
|
+
|
|
215
|
+
Full TypeScript support with comprehensive type definitions:
|
|
216
|
+
|
|
217
|
+
```tsx
|
|
218
|
+
import type { TimeFormat, TimeFormatOptions } from "@zuude-ui/video/utils";
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Video Player Components
|
|
222
|
+
|
|
223
|
+
The library also includes a complete video player with hooks and components. See the main documentation for video player usage.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import $ from"react";var X=(r,u,t)=>{$.useEffect(()=>{if(!(r!=null&&r.current)||!u)return;(async()=>{var n;try{await((n=r.current)==null?void 0:n.play())}catch(s){if(s instanceof Error&&s.name==="NotAllowedError"){if(t==null||t("NotAllowedError"),console.error("NotAllowedError"),r!=null&&r.current){r.current.muted=!0;try{await r.current.play()}catch(a){console.error(a)}}}else console.error(s)}})()},[u,r==null?void 0:r.current])};import z from"react";var i=(r,u,t=!0)=>{z.useEffect(()=>{if(!(r!=null&&r.current)||!t)return;let c=new IntersectionObserver(n=>{n.forEach(s=>{var a;r!=null&&r.current&&(s.isIntersecting?r.current.play().catch(e=>{r.current&&(r.current.pause(),r.current.muted=!0,r.current.play(),console.error(e))}):(a=r.current)==null||a.pause())})},{threshold:u!=null?u:.5});return c.observe(r==null?void 0:r.current),()=>{c.disconnect()}},[r==null?void 0:r.current])};import j from"react";var v=r=>{let[u,t]=j.useState(!1);j.useEffect(()=>{let n=()=>{t==null||t(!!document.fullscreenElement),c()};return document.addEventListener("fullscreenchange",n),()=>document.removeEventListener("fullscreenchange",n)},[u]);let c=()=>{console.log("toggleFullscreen");let n=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),s=r==null?void 0:r.current;if(s&&n){if(s.webkitEnterFullscreen){s.webkitEnterFullscreen();return}else if(s.requestFullscreen){s.requestFullscreen();return}}let a=s==null?void 0:s.closest("[data-zuude-video-wrapper]");a&&(u?(document.exitFullscreen(),s&&(s.style.objectFit="cover")):(a.requestFullscreen(),s&&(s.style.objectFit="contain")))};return{isFullscreen:u!=null?u:!1,toggleFullscreen:c}};import V from"react";var tr=r=>{let[u,t]=V.useState(!1),[c,n]=V.useState(null);return V.useEffect(()=>{if(!(r!=null&&r.current))return;t(!0);let s=()=>{var l,p;n((p=(l=r.current)==null?void 0:l.duration)!=null?p:null),t(!1)},a=()=>{t(!1)},e=r.current;if(e.duration&&!isNaN(e.duration))n(e.duration),t(!1);else return e.addEventListener("loadedmetadata",s),e.addEventListener("error",a),e.addEventListener("loadeddata",s),()=>{e.removeEventListener("loadedmetadata",s),e.removeEventListener("error",a),e.removeEventListener("loadeddata",s)}},[r]),{duration:c,isLoading:u}};import{useEffect as G}from"react";var er=(r,u,t=!0)=>{let c=n=>{n.key===r&&(n.preventDefault(),u(n))};G(()=>{if(t)return document.addEventListener("keydown",c),()=>{document.removeEventListener("keydown",c)}},[r,u,t])};import b from"react";var ar=r=>{let[u,t]=b.useState(!1),c=b.useCallback(()=>{r!=null&&r.current&&(r.current.muted=!r.current.muted)},[r==null?void 0:r.current]),n=b.useCallback(()=>{r!=null&&r.current&&(r.current.muted=!0)},[r==null?void 0:r.current]),s=b.useCallback(()=>{r!=null&&r.current&&(r.current.muted=!1)},[r==null?void 0:r.current]);return b.useEffect(()=>{if(!(r!=null&&r.current))return;t(r.current.muted);let a=()=>{r.current&&t(r.current.muted)};return r.current.addEventListener("volumechange",a),()=>{var e;(e=r.current)==null||e.removeEventListener("volumechange",a)}},[r==null?void 0:r.current]),{toggleMute:c,isMuted:u,mute:n,unmute:s}};var mr=r=>({togglePictureInPicture:async()=>{let n=r==null?void 0:r.current;if(n)try{document.pictureInPictureElement?await document.exitPictureInPicture():await n.requestPictureInPicture()}catch(s){if(/^((?!chrome|android).)*safari/i.test(navigator.userAgent))n.webkitEnterFullscreen?n.webkitEnterFullscreen():n.requestFullscreen&&n.requestFullscreen();else{let e=n.closest("[data-zuude-video-wrapper]");e&&(document.fullscreenElement?await document.exitFullscreen():await e.requestFullscreen())}}},requestPictureInPicture:async()=>{let n=r==null?void 0:r.current;n&&await n.requestPictureInPicture()},exitPictureInPicture:async()=>{r!=null&&r.current&&await document.exitPictureInPicture()}});import h from"react";var yr=r=>{let[u,t]=h.useState(!1),c=h.useCallback(()=>{r!=null&&r.current&&(r.current.paused?r.current.play():r.current.pause())},[r==null?void 0:r.current]),n=h.useCallback(()=>{r!=null&&r.current&&r.current.play()},[r==null?void 0:r.current]),s=h.useCallback(()=>{r!=null&&r.current&&r.current.pause()},[r==null?void 0:r.current]);return h.useEffect(()=>{if(!(r!=null&&r.current))return;let a=()=>{t(!0)},e=()=>{t(!1)};if(t(!(r!=null&&r.current.paused)),r!=null&&r.current)return r.current.addEventListener("play",a),r.current.addEventListener("pause",e),()=>{var l,p;(l=r.current)==null||l.removeEventListener("play",a),(p=r.current)==null||p.removeEventListener("pause",e)}},[r==null?void 0:r.current]),{togglePlay:c,isPlaying:u,play:n,pause:s}};import N from"react";var br=(r,u=10)=>{let t=N.useCallback(()=>{r!=null&&r.current&&(r.current.currentTime+=u)},[r==null?void 0:r.current]),c=N.useCallback(()=>{r!=null&&r.current&&(r.current.currentTime-=u)},[r==null?void 0:r.current]);return{seekForward:t,seekBackward:c}};import x from"react";var Lr=r=>{let[u,t]=x.useState(1),c=n=>{t(n)};return x.useEffect(()=>{r!=null&&r.current&&t(r.current.playbackRate)},[r==null?void 0:r.current]),x.useEffect(()=>{r!=null&&r.current&&(r.current.playbackRate=u)},[u,r==null?void 0:r.current]),{speed:u,onChangeSpeed:c}};import _ from"react";var Pr=(r,u)=>{_.useEffect(()=>{if(!(r!=null&&r.current)||!u)return;let t=r==null?void 0:r.current;t&&u&&(t.currentTime=u)},[u,r==null?void 0:r.current])};import w from"react";var Sr=(r,u=10)=>{let[t,c]=w.useState(!1),[n,s]=w.useState(0);return w.useEffect(()=>{if(r!=null&&r.current&&t){let e=setInterval(()=>{var l;s(((l=r.current)==null?void 0:l.currentTime)||0)},u);return()=>clearInterval(e)}},[r==null?void 0:r.current,t]),w.useEffect(()=>{if(r!=null&&r.current)return r.current.addEventListener("play",()=>c(!0)),r.current.addEventListener("pause",()=>c(!1)),()=>{var e,l;(e=r.current)==null||e.removeEventListener("play",()=>c(!0)),(l=r.current)==null||l.removeEventListener("pause",()=>c(!1))}},[r==null?void 0:r.current]),{currentTime:n,onTimeUpdate:e=>{r!=null&&r.current&&(s(e),r.current.currentTime=e)}}};import{useEffect as P,useState as k}from"react";var Dr=r=>{let[u,t]=k(!1),[c,n]=k(!1),[s,a]=k(!1);return P(()=>{let e=r.current;if(e)return e.addEventListener("play",()=>t(!0)),e.addEventListener("pause",()=>t(!1)),()=>{e.removeEventListener("play",()=>t(!0)),e.removeEventListener("pause",()=>t(!1))}},[r]),P(()=>{if(!(r!=null&&r.current))return;n(r.current.muted);let e=()=>{r.current&&n(r.current.muted)};return r.current.addEventListener("volumechange",e),()=>{var l;(l=r.current)==null||l.removeEventListener("volumechange",e)}},[r]),P(()=>{if(!(r!=null&&r.current))return;let e=()=>{a(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",e),()=>document.removeEventListener("fullscreenchange",e)},[r]),{isPlaying:u,isMuted:c,isFullscreen:s}};import I from"react";var Ur=(r,u=100)=>{let[t,c]=I.useState(u),n=s=>{c(s)};return I.useEffect(()=>{r!=null&&r.current&&c(r.current.volume*100)},[r==null?void 0:r.current]),I.useEffect(()=>{r!=null&&r.current&&(r.current.volume=t/100)},[t,r==null?void 0:r.current]),{volume:t,onChangeVolume:n}};import L from"react";var Ar=(r,u)=>{let[t,c]=L.useState(!1),[n,s]=L.useState(0);return L.useEffect(()=>{if(r!=null&&r.current&&t){let a=setInterval(()=>{var e;(e=r.current)!=null&&e.buffered.length&&s(r.current.buffered.end(r.current.buffered.length-1))},10);return()=>clearInterval(a)}},[r==null?void 0:r.current,t]),L.useEffect(()=>{if(r!=null&&r.current)return r.current.addEventListener("play",()=>c(!0)),r.current.addEventListener("pause",()=>c(!1)),()=>{var a,e;(a=r.current)==null||a.removeEventListener("play",()=>c(!0)),(e=r.current)==null||e.removeEventListener("pause",()=>c(!1))}},[]),{buffered:n,bufferedPercentage:n/(u||0)*100||0}};import{useEffect as J,useState as S,useCallback as A}from"react";var Hr=r=>{let[u,t]=S(!1),[c,n]=S(0),[s,a]=S(null),e=A(async p=>{var m;if(!(r!=null&&r.current)){a("Video element not found");return}let y=r.current,E=y.src||y.currentSrc;if(!E){a("No video source found");return}try{t(!0),a(null),n(0);let o=await fetch(E);if(!o.ok)throw new Error(`Failed to fetch video: ${o.statusText}`);let F=o.headers.get("content-length"),C=F?parseInt(F,10):0,T=(m=o.body)==null?void 0:m.getReader();if(!T)throw new Error("Failed to create download stream");let D=[],q=0;for(;;){let{done:H,value:U}=await T.read();if(H)break;if(D.push(U),q+=U.length,C>0){let K=q/C*100;n(Math.round(K))}}let O=new Blob(D,{type:o.headers.get("content-type")||"video/mp4"}),M=URL.createObjectURL(O),g=document.createElement("a");g.href=M;let B=p||`video-${Date.now()}.mp4`;g.download=B,document.body.appendChild(g),g.click(),document.body.removeChild(g),URL.revokeObjectURL(M),n(100),t(!1)}catch(o){a(o instanceof Error?o.message:"Download failed"),t(!1),n(0)}},[r]),l=A(p=>{if(!(r!=null&&r.current)){a("Video element not found");return}let y=r.current,E=y.src||y.currentSrc;if(!E){a("No video source found");return}try{t(!0),a(null),n(0);let m=document.createElement("a");m.href=E,m.download=p||`video-${Date.now()}.mp4`,m.target="_blank",document.body.appendChild(m),m.click(),document.body.removeChild(m),t(!1),n(100)}catch(m){a(m instanceof Error?m.message:"Download failed"),t(!1),n(0)}},[r]);return J(()=>()=>{t(!1),n(0),a(null)},[]),{downloadVideo:e,downloadDirect:l,isDownloading:u,downloadProgress:c,error:s,resetError:()=>a(null)}};import Q from"react";var zr=(r,u)=>{Q.useEffect(()=>{if(!(r!=null&&r.current)||!u)return;let t=r.current;if(t){let c=()=>{(t.currentTime>=u[1]||t.currentTime<=u[0])&&(t.currentTime=u[0])};return t.addEventListener("timeupdate",c),()=>{t.removeEventListener("timeupdate",c)}}},[u,r==null?void 0:r.current])};export{X as a,er as b,br as c,yr as d,ar as e,v as f,mr as g,i as h,tr as i,Lr as j,Pr as k,Sr as l,Dr as m,Ur as n,Ar as o,Hr as p,zr as q};
|
|
2
|
+
//# sourceMappingURL=chunk-OYLOY3EO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-autoplay-by-force.tsx","../src/hooks/use-autoplay-on-visible.tsx","../src/hooks/use-fullscreen.tsx","../src/hooks/use-get-duration.tsx","../src/hooks/use-hot-keys.tsx","../src/hooks/use-mute-unmute.tsx","../src/hooks/use-picture-in-picture.tsx","../src/hooks/use-play-pause.tsx","../src/hooks/use-seek.tsx","../src/hooks/use-speed.tsx","../src/hooks/use-start-at.tsx","../src/hooks/use-current-time.tsx","../src/hooks/use-video-state.tsx","../src/hooks/use-volume.tsx","../src/hooks/use-buffer.tsx","../src/hooks/use-download.tsx","../src/hooks/use-range.tsx"],"sourcesContent":["import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useAutoplayByForce = (\n videoRef: VideoRef,\n enabled: boolean,\n setError?: (error: string | null) => void\n) => {\n React.useEffect(() => {\n if (!videoRef?.current || !enabled) return;\n\n const playVideo = async () => {\n try {\n await videoRef.current?.play();\n } catch (error) {\n // If autoplay fails, try muting and playing again\n if (error instanceof Error && error.name === \"NotAllowedError\") {\n setError?.(\"NotAllowedError\");\n console.error(\"NotAllowedError\");\n if (videoRef?.current) {\n videoRef.current.muted = true;\n try {\n await videoRef.current.play();\n } catch (retryError) {\n console.error(retryError);\n }\n }\n } else {\n console.error(error);\n }\n }\n };\n\n playVideo();\n }, [enabled, videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useAutoplayOnVisible = (\n videoRef: VideoRef,\n threshold: number | undefined,\n enabled = true\n) => {\n React.useEffect(() => {\n if (!videoRef?.current || !enabled) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!videoRef?.current) return;\n\n if (entry.isIntersecting) {\n videoRef.current.play().catch((error) => {\n if (!videoRef.current) return;\n\n videoRef.current.pause();\n videoRef.current.muted = true;\n videoRef.current.play();\n console.error(error);\n });\n } else {\n videoRef.current?.pause();\n }\n });\n },\n { threshold: threshold ?? 0.5 }\n );\n\n observer.observe(videoRef?.current);\n\n return () => {\n observer.disconnect();\n };\n }, [videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nconst useFullscreen = (videoRef: VideoRef) => {\n const [isFullscreen, setIsFullscreen] = React.useState(false);\n\n React.useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen?.(!!document.fullscreenElement);\n toggleFullscreen();\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\n }, [isFullscreen]);\n\n const toggleFullscreen = () => {\n console.log(\"toggleFullscreen\");\n const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n const video = videoRef?.current;\n\n if (video && isSafari) {\n if ((video as any).webkitEnterFullscreen) {\n (video as any).webkitEnterFullscreen();\n return;\n } else if (video.requestFullscreen) {\n video.requestFullscreen();\n return;\n }\n }\n\n const videoContainer = video?.closest(\n \"[data-zuude-video-wrapper]\"\n ) as HTMLElement;\n\n if (videoContainer) {\n if (!isFullscreen) {\n videoContainer.requestFullscreen();\n if (video) {\n video.style.objectFit = \"contain\";\n }\n } else {\n document.exitFullscreen();\n if (video) {\n video.style.objectFit = \"cover\";\n }\n }\n }\n };\n\n return { isFullscreen: isFullscreen ?? false, toggleFullscreen };\n};\n\nexport { useFullscreen };\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useGetDuration = (videoRef: VideoRef) => {\n const [isLoading, setIsLoading] = React.useState(false);\n const [duration, setDuration] = React.useState<number | null>(null);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n setIsLoading(true);\n\n const getDuration = () => {\n setDuration(videoRef.current?.duration ?? null);\n setIsLoading(false);\n };\n\n const handleError = () => {\n setIsLoading(false);\n };\n\n const video = videoRef.current;\n\n // Check if duration is already available\n if (video.duration && !isNaN(video.duration)) {\n setDuration(video.duration);\n setIsLoading(false);\n } else {\n // Add event listeners\n video.addEventListener(\"loadedmetadata\", getDuration);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", getDuration);\n\n return () => {\n video.removeEventListener(\"loadedmetadata\", getDuration);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", getDuration);\n };\n }\n }, [videoRef]);\n\n return { duration, isLoading };\n};\n","import { useEffect } from \"react\";\n\nexport const useHotKeys = (\n key: string,\n func: (event: KeyboardEvent) => void,\n enabled = true\n) => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === key) {\n event.preventDefault();\n func(event);\n }\n };\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [key, func, enabled]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useMuteUnmute = (videoRef: VideoRef) => {\n const [isMuted, setIsMuted] = React.useState(false);\n\n const toggleMute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = !videoRef.current.muted;\n }\n }, [videoRef?.current]);\n\n const mute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = true;\n }\n }, [videoRef?.current]);\n\n const unmute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = false;\n }\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n // Set the initial state\n setIsMuted(videoRef.current.muted);\n\n const handleVolumeChange = () => {\n if (videoRef.current) {\n setIsMuted(videoRef.current.muted);\n }\n };\n\n videoRef.current.addEventListener(\"volumechange\", handleVolumeChange);\n\n return () => {\n videoRef.current?.removeEventListener(\"volumechange\", handleVolumeChange);\n };\n }, [videoRef?.current]);\n\n return { toggleMute, isMuted, mute, unmute };\n};\n","import type { VideoRef } from \"../types\";\n\nexport const usePictureInPicture = (videoRef: VideoRef) => {\n const togglePictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n\n try {\n if (document.pictureInPictureElement) {\n await document.exitPictureInPicture();\n } else {\n await video.requestPictureInPicture();\n }\n } catch (error) {\n // Fallback for browsers that don't support PiP\n const isSafari = /^((?!chrome|android).)*safari/i.test(\n navigator.userAgent\n );\n\n if (isSafari) {\n if ((video as any).webkitEnterFullscreen) {\n (video as any).webkitEnterFullscreen();\n } else if (video.requestFullscreen) {\n video.requestFullscreen();\n }\n } else {\n const videoContainer = video.closest(\n \"[data-zuude-video-wrapper]\"\n ) as HTMLElement;\n if (videoContainer) {\n if (!document.fullscreenElement) {\n await videoContainer.requestFullscreen();\n } else {\n await document.exitFullscreen();\n }\n }\n }\n }\n };\n\n const requestPictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n await video.requestPictureInPicture();\n };\n\n const exitPictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n await document.exitPictureInPicture();\n };\n\n return {\n togglePictureInPicture,\n requestPictureInPicture,\n exitPictureInPicture,\n };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const usePlayPause = (videoRef: VideoRef) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n\n const togglePlay = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.paused\n ? videoRef.current.play()\n : videoRef.current.pause();\n }\n }, [videoRef?.current]);\n\n const play = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.play();\n }\n }, [videoRef?.current]);\n\n const pause = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.pause();\n }\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n const handlePlay = () => {\n setIsPlaying(true);\n };\n const handlePause = () => {\n setIsPlaying(false);\n };\n\n setIsPlaying(!videoRef?.current.paused);\n\n if (videoRef?.current) {\n videoRef.current.addEventListener(\"play\", handlePlay);\n videoRef.current.addEventListener(\"pause\", handlePause);\n\n return () => {\n videoRef.current?.removeEventListener(\"play\", handlePlay);\n videoRef.current?.removeEventListener(\"pause\", handlePause);\n };\n }\n }, [videoRef?.current]);\n\n return { togglePlay, isPlaying, play, pause };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useSeek = (videoRef: VideoRef, value = 10) => {\n const seekForward = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.currentTime += value;\n }\n }, [videoRef?.current]);\n\n const seekBackward = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.currentTime -= value;\n }\n }, [videoRef?.current]);\n\n return { seekForward, seekBackward };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useSpeed = (videoRef: VideoRef) => {\n const [speed, setSpeed] = React.useState(1);\n\n const onChangeSpeed = (speed: number) => {\n setSpeed(speed);\n };\n\n // Get the speed from the video element\n React.useEffect(() => {\n if (!videoRef?.current) return;\n setSpeed(videoRef.current.playbackRate);\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.playbackRate = speed;\n }, [speed, videoRef?.current]);\n\n return { speed, onChangeSpeed };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useStartAt = (videoRef: VideoRef, startAt: number) => {\n React.useEffect(() => {\n if (!videoRef?.current || !startAt) return;\n\n const video = videoRef?.current;\n if (video && startAt) {\n video.currentTime = startAt;\n }\n }, [startAt, videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types.js\";\n\nexport const useCurrentTime = (videoRef: VideoRef, interval = 10) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [currentTime, setCurrentTime] = React.useState(0);\n\n React.useEffect(() => {\n if (videoRef?.current && isPlaying) {\n const intervalId = setInterval(() => {\n setCurrentTime(videoRef.current?.currentTime || 0);\n }, interval);\n\n return () => clearInterval(intervalId);\n }\n }, [videoRef?.current, isPlaying]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.addEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current.addEventListener(\"pause\", () => setIsPlaying(false));\n\n return () => {\n videoRef.current?.removeEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current?.removeEventListener(\"pause\", () => setIsPlaying(false));\n };\n }, [videoRef?.current]);\n\n const onTimeUpdate = (time: number) => {\n if (videoRef?.current) {\n setCurrentTime(time);\n videoRef.current.currentTime = time;\n }\n };\n\n return {\n currentTime,\n onTimeUpdate,\n };\n};\n","import { RefObject, useEffect, useState } from \"react\";\n\nconst useVideoState = (videoRef: RefObject<HTMLVideoElement | null>) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [isMuted, setIsMuted] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n useEffect(() => {\n const video = videoRef.current;\n\n if (video) {\n video.addEventListener(\"play\", () => setIsPlaying(true));\n video.addEventListener(\"pause\", () => setIsPlaying(false));\n\n return () => {\n video.removeEventListener(\"play\", () => setIsPlaying(true));\n video.removeEventListener(\"pause\", () => setIsPlaying(false));\n };\n }\n }, [videoRef]);\n\n useEffect(() => {\n if (!videoRef?.current) return;\n\n // Set the initial state\n setIsMuted(videoRef.current.muted);\n\n const handleVolumeChange = () => {\n if (videoRef.current) {\n setIsMuted(videoRef.current.muted);\n }\n };\n\n videoRef.current.addEventListener(\"volumechange\", handleVolumeChange);\n\n return () => {\n videoRef.current?.removeEventListener(\"volumechange\", handleVolumeChange);\n };\n }, [videoRef]);\n\n useEffect(() => {\n if (!videoRef?.current) return;\n\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\n }, [videoRef]);\n\n return { isPlaying, isMuted, isFullscreen };\n};\n\nexport { useVideoState };\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useVolume = (videoRef: VideoRef, initialVolume = 100) => {\n const [volume, setVolume] = React.useState(initialVolume);\n\n const onChangeVolume = (volume: number) => {\n setVolume(volume);\n };\n\n // Get the volume from the video element\n React.useEffect(() => {\n if (!videoRef?.current) return;\n setVolume(videoRef.current.volume * 100);\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.volume = volume / 100;\n }, [volume, videoRef?.current]);\n\n return { volume, onChangeVolume };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types.js\";\n\nexport const useBuffer = (videoRef: VideoRef, duration?: number) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [buffered, setBuffered] = React.useState(0);\n\n React.useEffect(() => {\n if (videoRef?.current && isPlaying) {\n const intervalId = setInterval(() => {\n if (videoRef.current?.buffered.length) {\n setBuffered(\n videoRef.current.buffered.end(videoRef.current.buffered.length - 1)\n );\n }\n }, 10);\n\n return () => clearInterval(intervalId);\n }\n }, [videoRef?.current, isPlaying]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.addEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current.addEventListener(\"pause\", () => setIsPlaying(false));\n\n return () => {\n videoRef.current?.removeEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current?.removeEventListener(\"pause\", () => setIsPlaying(false));\n };\n }, []);\n\n return {\n buffered,\n bufferedPercentage: (buffered / (duration || 0)) * 100 || 0,\n };\n};\n","import { useEffect, useState, useCallback } from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useDownload = (videoRef: VideoRef) => {\n const [isDownloading, setIsDownloading] = useState(false);\n const [downloadProgress, setDownloadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n const downloadVideo = useCallback(\n async (filename?: string) => {\n if (!videoRef?.current) {\n setError(\"Video element not found\");\n return;\n }\n\n const video = videoRef.current;\n const videoSrc = video.src || video.currentSrc;\n\n if (!videoSrc) {\n setError(\"No video source found\");\n return;\n }\n\n try {\n setIsDownloading(true);\n setError(null);\n setDownloadProgress(0);\n\n // Fetch the video file\n const response = await fetch(videoSrc);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch video: ${response.statusText}`);\n }\n\n // Get the content length for progress tracking\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? parseInt(contentLength, 10) : 0;\n\n // Create a readable stream to track progress\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"Failed to create download stream\");\n }\n\n const chunks: Uint8Array[] = [];\n let receivedLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n chunks.push(value);\n receivedLength += value.length;\n\n if (total > 0) {\n const progress = (receivedLength / total) * 100;\n setDownloadProgress(Math.round(progress));\n }\n }\n\n // Combine chunks into a single blob\n const blob = new Blob(chunks, {\n type: response.headers.get(\"content-type\") || \"video/mp4\",\n });\n\n // Create download link\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n\n // Generate filename if not provided\n const defaultFilename = filename || `video-${Date.now()}.mp4`;\n link.download = defaultFilename;\n\n // Trigger download\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Clean up\n URL.revokeObjectURL(url);\n\n setDownloadProgress(100);\n setIsDownloading(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Download failed\");\n setIsDownloading(false);\n setDownloadProgress(0);\n }\n },\n [videoRef]\n );\n\n // Alternative simple download method for direct video URLs\n const downloadDirect = useCallback(\n (filename?: string) => {\n if (!videoRef?.current) {\n setError(\"Video element not found\");\n return;\n }\n\n const video = videoRef.current;\n const videoSrc = video.src || video.currentSrc;\n\n if (!videoSrc) {\n setError(\"No video source found\");\n return;\n }\n\n try {\n setIsDownloading(true);\n setError(null);\n setDownloadProgress(0);\n\n const link = document.createElement(\"a\");\n link.href = videoSrc;\n link.download = filename || `video-${Date.now()}.mp4`;\n link.target = \"_blank\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n setIsDownloading(false);\n setDownloadProgress(100);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Download failed\");\n setIsDownloading(false);\n setDownloadProgress(0);\n }\n },\n [videoRef]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n setIsDownloading(false);\n setDownloadProgress(0);\n setError(null);\n };\n }, []);\n\n return {\n downloadVideo,\n downloadDirect,\n isDownloading,\n downloadProgress,\n error,\n resetError: () => setError(null),\n };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useRange = (videoRef: VideoRef, range: [number, number]) => {\n React.useEffect(() => {\n if (!videoRef?.current || !range) return;\n\n const video = videoRef.current;\n\n if (video) {\n const handleTimeUpdate = () => {\n if (video.currentTime >= range[1]) {\n video.currentTime = range[0];\n } else if (video.currentTime <= range[0]) {\n video.currentTime = range[0];\n }\n };\n\n video.addEventListener(\"timeupdate\", handleTimeUpdate);\n\n return () => {\n video.removeEventListener(\"timeupdate\", handleTimeUpdate);\n };\n }\n }, [range, videoRef?.current]);\n};\n"],"mappings":"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","names":["React","useAutoplayByForce","videoRef","enabled","setError","_a","error","retryError","React","useAutoplayOnVisible","videoRef","threshold","enabled","observer","entries","entry","_a","error","React","useFullscreen","videoRef","isFullscreen","setIsFullscreen","handleFullscreenChange","toggleFullscreen","isSafari","video","videoContainer","React","useGetDuration","videoRef","isLoading","setIsLoading","duration","setDuration","getDuration","_a","_b","handleError","video","useEffect","useHotKeys","key","func","enabled","handleKeyDown","event","React","useMuteUnmute","videoRef","isMuted","setIsMuted","toggleMute","mute","unmute","handleVolumeChange","_a","usePictureInPicture","videoRef","video","error","videoContainer","React","usePlayPause","videoRef","isPlaying","setIsPlaying","togglePlay","play","pause","handlePlay","handlePause","_a","_b","React","useSeek","videoRef","value","seekForward","seekBackward","React","useSpeed","videoRef","speed","setSpeed","onChangeSpeed","React","useStartAt","videoRef","startAt","video","React","useCurrentTime","videoRef","interval","isPlaying","setIsPlaying","currentTime","setCurrentTime","intervalId","_a","_b","time","useEffect","useState","useVideoState","videoRef","isPlaying","setIsPlaying","isMuted","setIsMuted","isFullscreen","setIsFullscreen","video","handleVolumeChange","_a","handleFullscreenChange","React","useVolume","videoRef","initialVolume","volume","setVolume","onChangeVolume","React","useBuffer","videoRef","duration","isPlaying","setIsPlaying","buffered","setBuffered","intervalId","_a","_b","useEffect","useState","useCallback","useDownload","videoRef","isDownloading","setIsDownloading","downloadProgress","setDownloadProgress","error","setError","downloadVideo","filename","_a","video","videoSrc","response","contentLength","total","reader","chunks","receivedLength","done","value","progress","blob","url","link","defaultFilename","err","downloadDirect","React","useRange","videoRef","range","video","handleTimeUpdate"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var W=Object.create;var k=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var Z=Object.getPrototypeOf,i=Object.prototype.hasOwnProperty;var f=(r,n)=>{for(var t in n)k(r,t,{get:n[t],enumerable:!0})},O=(r,n,t,c)=>{if(n&&typeof n=="object"||typeof n=="function")for(let u of Y(n))!i.call(r,u)&&u!==t&&k(r,u,{get:()=>n[u],enumerable:!(c=X(n,u))||c.enumerable});return r};var m=(r,n,t)=>(t=r!=null?W(Z(r)):{},O(n||!r||!r.__esModule?k(t,"default",{value:r,enumerable:!0}):t,r)),d=r=>O(k({},"__esModule",{value:!0}),r);var br={};f(br,{useAutoplayByForce:()=>v,useAutoplayOnVisible:()=>R,useBuffer:()=>yr,useCurrentTime:()=>mr,useDownload:()=>Er,useFullscreen:()=>rr,useGetDuration:()=>tr,useHotKeys:()=>nr,useMuteUnmute:()=>ur,usePictureInPicture:()=>er,usePlayPause:()=>cr,useRange:()=>gr,useSeek:()=>sr,useSpeed:()=>ar,useStartAt:()=>lr,useVideoState:()=>pr,useVolume:()=>or});module.exports=d(br);var B=m(require("react"),1),v=(r,n,t)=>{B.default.useEffect(()=>{if(!(r!=null&&r.current)||!n)return;(async()=>{var u;try{await((u=r.current)==null?void 0:u.play())}catch(s){if(s instanceof Error&&s.name==="NotAllowedError"){if(t==null||t("NotAllowedError"),console.error("NotAllowedError"),r!=null&&r.current){r.current.muted=!0;try{await r.current.play()}catch(a){console.error(a)}}}else console.error(s)}})()},[n,r==null?void 0:r.current])};var H=m(require("react"),1),R=(r,n,t=!0)=>{H.default.useEffect(()=>{if(!(r!=null&&r.current)||!t)return;let c=new IntersectionObserver(u=>{u.forEach(s=>{var a;r!=null&&r.current&&(s.isIntersecting?r.current.play().catch(e=>{r.current&&(r.current.pause(),r.current.muted=!0,r.current.play(),console.error(e))}):(a=r.current)==null||a.pause())})},{threshold:n!=null?n:.5});return c.observe(r==null?void 0:r.current),()=>{c.disconnect()}},[r==null?void 0:r.current])};var C=m(require("react"),1),rr=r=>{let[n,t]=C.default.useState(!1);C.default.useEffect(()=>{let u=()=>{t==null||t(!!document.fullscreenElement),c()};return document.addEventListener("fullscreenchange",u),()=>document.removeEventListener("fullscreenchange",u)},[n]);let c=()=>{console.log("toggleFullscreen");let u=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),s=r==null?void 0:r.current;if(s&&u){if(s.webkitEnterFullscreen){s.webkitEnterFullscreen();return}else if(s.requestFullscreen){s.requestFullscreen();return}}let a=s==null?void 0:s.closest("[data-zuude-video-wrapper]");a&&(n?(document.exitFullscreen(),s&&(s.style.objectFit="cover")):(a.requestFullscreen(),s&&(s.style.objectFit="contain")))};return{isFullscreen:n!=null?n:!1,toggleFullscreen:c}};var I=m(require("react"),1),tr=r=>{let[n,t]=I.default.useState(!1),[c,u]=I.default.useState(null);return I.default.useEffect(()=>{if(!(r!=null&&r.current))return;t(!0);let s=()=>{var l,o;u((o=(l=r.current)==null?void 0:l.duration)!=null?o:null),t(!1)},a=()=>{t(!1)},e=r.current;if(e.duration&&!isNaN(e.duration))u(e.duration),t(!1);else return e.addEventListener("loadedmetadata",s),e.addEventListener("error",a),e.addEventListener("loadeddata",s),()=>{e.removeEventListener("loadedmetadata",s),e.removeEventListener("error",a),e.removeEventListener("loadeddata",s)}},[r]),{duration:c,isLoading:n}};var K=require("react"),nr=(r,n,t=!0)=>{let c=u=>{u.key===r&&(u.preventDefault(),n(u))};(0,K.useEffect)(()=>{if(t)return document.addEventListener("keydown",c),()=>{document.removeEventListener("keydown",c)}},[r,n,t])};var b=m(require("react"),1),ur=r=>{let[n,t]=b.default.useState(!1),c=b.default.useCallback(()=>{r!=null&&r.current&&(r.current.muted=!r.current.muted)},[r==null?void 0:r.current]),u=b.default.useCallback(()=>{r!=null&&r.current&&(r.current.muted=!0)},[r==null?void 0:r.current]),s=b.default.useCallback(()=>{r!=null&&r.current&&(r.current.muted=!1)},[r==null?void 0:r.current]);return b.default.useEffect(()=>{if(!(r!=null&&r.current))return;t(r.current.muted);let a=()=>{r.current&&t(r.current.muted)};return r.current.addEventListener("volumechange",a),()=>{var e;(e=r.current)==null||e.removeEventListener("volumechange",a)}},[r==null?void 0:r.current]),{toggleMute:c,isMuted:n,mute:u,unmute:s}};var er=r=>({togglePictureInPicture:async()=>{let u=r==null?void 0:r.current;if(u)try{document.pictureInPictureElement?await document.exitPictureInPicture():await u.requestPictureInPicture()}catch(s){if(/^((?!chrome|android).)*safari/i.test(navigator.userAgent))u.webkitEnterFullscreen?u.webkitEnterFullscreen():u.requestFullscreen&&u.requestFullscreen();else{let e=u.closest("[data-zuude-video-wrapper]");e&&(document.fullscreenElement?await document.exitFullscreen():await e.requestFullscreen())}}},requestPictureInPicture:async()=>{let u=r==null?void 0:r.current;u&&await u.requestPictureInPicture()},exitPictureInPicture:async()=>{r!=null&&r.current&&await document.exitPictureInPicture()}});var h=m(require("react"),1),cr=r=>{let[n,t]=h.default.useState(!1),c=h.default.useCallback(()=>{r!=null&&r.current&&(r.current.paused?r.current.play():r.current.pause())},[r==null?void 0:r.current]),u=h.default.useCallback(()=>{r!=null&&r.current&&r.current.play()},[r==null?void 0:r.current]),s=h.default.useCallback(()=>{r!=null&&r.current&&r.current.pause()},[r==null?void 0:r.current]);return h.default.useEffect(()=>{if(!(r!=null&&r.current))return;let a=()=>{t(!0)},e=()=>{t(!1)};if(t(!(r!=null&&r.current.paused)),r!=null&&r.current)return r.current.addEventListener("play",a),r.current.addEventListener("pause",e),()=>{var l,o;(l=r.current)==null||l.removeEventListener("play",a),(o=r.current)==null||o.removeEventListener("pause",e)}},[r==null?void 0:r.current]),{togglePlay:c,isPlaying:n,play:u,pause:s}};var T=m(require("react"),1),sr=(r,n=10)=>{let t=T.default.useCallback(()=>{r!=null&&r.current&&(r.current.currentTime+=n)},[r==null?void 0:r.current]),c=T.default.useCallback(()=>{r!=null&&r.current&&(r.current.currentTime-=n)},[r==null?void 0:r.current]);return{seekForward:t,seekBackward:c}};var S=m(require("react"),1),ar=r=>{let[n,t]=S.default.useState(1),c=u=>{t(u)};return S.default.useEffect(()=>{r!=null&&r.current&&t(r.current.playbackRate)},[r==null?void 0:r.current]),S.default.useEffect(()=>{r!=null&&r.current&&(r.current.playbackRate=n)},[n,r==null?void 0:r.current]),{speed:n,onChangeSpeed:c}};var $=m(require("react"),1),lr=(r,n)=>{$.default.useEffect(()=>{if(!(r!=null&&r.current)||!n)return;let t=r==null?void 0:r.current;t&&n&&(t.currentTime=n)},[n,r==null?void 0:r.current])};var x=m(require("react"),1),mr=(r,n=10)=>{let[t,c]=x.default.useState(!1),[u,s]=x.default.useState(0);return x.default.useEffect(()=>{if(r!=null&&r.current&&t){let e=setInterval(()=>{var l;s(((l=r.current)==null?void 0:l.currentTime)||0)},n);return()=>clearInterval(e)}},[r==null?void 0:r.current,t]),x.default.useEffect(()=>{if(r!=null&&r.current)return r.current.addEventListener("play",()=>c(!0)),r.current.addEventListener("pause",()=>c(!1)),()=>{var e,l;(e=r.current)==null||e.removeEventListener("play",()=>c(!0)),(l=r.current)==null||l.removeEventListener("pause",()=>c(!1))}},[r==null?void 0:r.current]),{currentTime:u,onTimeUpdate:e=>{r!=null&&r.current&&(s(e),r.current.currentTime=e)}}};var g=require("react"),pr=r=>{let[n,t]=(0,g.useState)(!1),[c,u]=(0,g.useState)(!1),[s,a]=(0,g.useState)(!1);return(0,g.useEffect)(()=>{let e=r.current;if(e)return e.addEventListener("play",()=>t(!0)),e.addEventListener("pause",()=>t(!1)),()=>{e.removeEventListener("play",()=>t(!0)),e.removeEventListener("pause",()=>t(!1))}},[r]),(0,g.useEffect)(()=>{if(!(r!=null&&r.current))return;u(r.current.muted);let e=()=>{r.current&&u(r.current.muted)};return r.current.addEventListener("volumechange",e),()=>{var l;(l=r.current)==null||l.removeEventListener("volumechange",e)}},[r]),(0,g.useEffect)(()=>{if(!(r!=null&&r.current))return;let e=()=>{a(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",e),()=>document.removeEventListener("fullscreenchange",e)},[r]),{isPlaying:n,isMuted:c,isFullscreen:s}};var F=m(require("react"),1),or=(r,n=100)=>{let[t,c]=F.default.useState(n),u=s=>{c(s)};return F.default.useEffect(()=>{r!=null&&r.current&&c(r.current.volume*100)},[r==null?void 0:r.current]),F.default.useEffect(()=>{r!=null&&r.current&&(r.current.volume=t/100)},[t,r==null?void 0:r.current]),{volume:t,onChangeVolume:u}};var P=m(require("react"),1),yr=(r,n)=>{let[t,c]=P.default.useState(!1),[u,s]=P.default.useState(0);return P.default.useEffect(()=>{if(r!=null&&r.current&&t){let a=setInterval(()=>{var e;(e=r.current)!=null&&e.buffered.length&&s(r.current.buffered.end(r.current.buffered.length-1))},10);return()=>clearInterval(a)}},[r==null?void 0:r.current,t]),P.default.useEffect(()=>{if(r!=null&&r.current)return r.current.addEventListener("play",()=>c(!0)),r.current.addEventListener("pause",()=>c(!1)),()=>{var a,e;(a=r.current)==null||a.removeEventListener("play",()=>c(!0)),(e=r.current)==null||e.removeEventListener("pause",()=>c(!1))}},[]),{buffered:u,bufferedPercentage:u/(n||0)*100||0}};var y=require("react"),Er=r=>{let[n,t]=(0,y.useState)(!1),[c,u]=(0,y.useState)(0),[s,a]=(0,y.useState)(null),e=(0,y.useCallback)(async o=>{var p;if(!(r!=null&&r.current)){a("Video element not found");return}let w=r.current,L=w.src||w.currentSrc;if(!L){a("No video source found");return}try{t(!0),a(null),u(0);let E=await fetch(L);if(!E.ok)throw new Error(`Failed to fetch video: ${E.statusText}`);let D=E.headers.get("content-length"),q=D?parseInt(D,10):0,M=(p=E.body)==null?void 0:p.getReader();if(!M)throw new Error("Failed to create download stream");let U=[],j=0;for(;;){let{done:J,value:A}=await M.read();if(J)break;if(U.push(A),j+=A.length,q>0){let Q=j/q*100;u(Math.round(Q))}}let G=new Blob(U,{type:E.headers.get("content-type")||"video/mp4"}),N=URL.createObjectURL(G),V=document.createElement("a");V.href=N;let _=o||`video-${Date.now()}.mp4`;V.download=_,document.body.appendChild(V),V.click(),document.body.removeChild(V),URL.revokeObjectURL(N),u(100),t(!1)}catch(E){a(E instanceof Error?E.message:"Download failed"),t(!1),u(0)}},[r]),l=(0,y.useCallback)(o=>{if(!(r!=null&&r.current)){a("Video element not found");return}let w=r.current,L=w.src||w.currentSrc;if(!L){a("No video source found");return}try{t(!0),a(null),u(0);let p=document.createElement("a");p.href=L,p.download=o||`video-${Date.now()}.mp4`,p.target="_blank",document.body.appendChild(p),p.click(),document.body.removeChild(p),t(!1),u(100)}catch(p){a(p instanceof Error?p.message:"Download failed"),t(!1),u(0)}},[r]);return(0,y.useEffect)(()=>()=>{t(!1),u(0),a(null)},[]),{downloadVideo:e,downloadDirect:l,isDownloading:n,downloadProgress:c,error:s,resetError:()=>a(null)}};var z=m(require("react"),1),gr=(r,n)=>{z.default.useEffect(()=>{if(!(r!=null&&r.current)||!n)return;let t=r.current;if(t){let c=()=>{(t.currentTime>=n[1]||t.currentTime<=n[0])&&(t.currentTime=n[0])};return t.addEventListener("timeupdate",c),()=>{t.removeEventListener("timeupdate",c)}}},[n,r==null?void 0:r.current])};0&&(module.exports={useAutoplayByForce,useAutoplayOnVisible,useBuffer,useCurrentTime,useDownload,useFullscreen,useGetDuration,useHotKeys,useMuteUnmute,usePictureInPicture,usePlayPause,useRange,useSeek,useSpeed,useStartAt,useVideoState,useVolume});
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/use-autoplay-by-force.tsx","../../src/hooks/use-autoplay-on-visible.tsx","../../src/hooks/use-fullscreen.tsx","../../src/hooks/use-get-duration.tsx","../../src/hooks/use-hot-keys.tsx","../../src/hooks/use-mute-unmute.tsx","../../src/hooks/use-picture-in-picture.tsx","../../src/hooks/use-play-pause.tsx","../../src/hooks/use-seek.tsx","../../src/hooks/use-speed.tsx","../../src/hooks/use-start-at.tsx","../../src/hooks/use-current-time.tsx","../../src/hooks/use-video-state.tsx","../../src/hooks/use-volume.tsx","../../src/hooks/use-buffer.tsx","../../src/hooks/use-download.tsx","../../src/hooks/use-range.tsx"],"sourcesContent":["export * from \"./use-autoplay-by-force\";\nexport * from \"./use-autoplay-on-visible\";\nexport * from \"./use-fullscreen\";\nexport * from \"./use-get-duration\";\nexport * from \"./use-hot-keys\";\nexport * from \"./use-mute-unmute\";\nexport * from \"./use-picture-in-picture\";\nexport * from \"./use-play-pause\";\nexport * from \"./use-seek\";\nexport * from \"./use-speed\";\nexport * from \"./use-start-at\";\nexport * from \"./use-current-time\";\nexport * from \"./use-video-state\";\nexport * from \"./use-volume\";\nexport * from \"./use-buffer\";\nexport * from \"./use-download\";\nexport * from \"./use-range\";\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useAutoplayByForce = (\n videoRef: VideoRef,\n enabled: boolean,\n setError?: (error: string | null) => void\n) => {\n React.useEffect(() => {\n if (!videoRef?.current || !enabled) return;\n\n const playVideo = async () => {\n try {\n await videoRef.current?.play();\n } catch (error) {\n // If autoplay fails, try muting and playing again\n if (error instanceof Error && error.name === \"NotAllowedError\") {\n setError?.(\"NotAllowedError\");\n console.error(\"NotAllowedError\");\n if (videoRef?.current) {\n videoRef.current.muted = true;\n try {\n await videoRef.current.play();\n } catch (retryError) {\n console.error(retryError);\n }\n }\n } else {\n console.error(error);\n }\n }\n };\n\n playVideo();\n }, [enabled, videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useAutoplayOnVisible = (\n videoRef: VideoRef,\n threshold: number | undefined,\n enabled = true\n) => {\n React.useEffect(() => {\n if (!videoRef?.current || !enabled) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!videoRef?.current) return;\n\n if (entry.isIntersecting) {\n videoRef.current.play().catch((error) => {\n if (!videoRef.current) return;\n\n videoRef.current.pause();\n videoRef.current.muted = true;\n videoRef.current.play();\n console.error(error);\n });\n } else {\n videoRef.current?.pause();\n }\n });\n },\n { threshold: threshold ?? 0.5 }\n );\n\n observer.observe(videoRef?.current);\n\n return () => {\n observer.disconnect();\n };\n }, [videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nconst useFullscreen = (videoRef: VideoRef) => {\n const [isFullscreen, setIsFullscreen] = React.useState(false);\n\n React.useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen?.(!!document.fullscreenElement);\n toggleFullscreen();\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\n }, [isFullscreen]);\n\n const toggleFullscreen = () => {\n console.log(\"toggleFullscreen\");\n const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n const video = videoRef?.current;\n\n if (video && isSafari) {\n if ((video as any).webkitEnterFullscreen) {\n (video as any).webkitEnterFullscreen();\n return;\n } else if (video.requestFullscreen) {\n video.requestFullscreen();\n return;\n }\n }\n\n const videoContainer = video?.closest(\n \"[data-zuude-video-wrapper]\"\n ) as HTMLElement;\n\n if (videoContainer) {\n if (!isFullscreen) {\n videoContainer.requestFullscreen();\n if (video) {\n video.style.objectFit = \"contain\";\n }\n } else {\n document.exitFullscreen();\n if (video) {\n video.style.objectFit = \"cover\";\n }\n }\n }\n };\n\n return { isFullscreen: isFullscreen ?? false, toggleFullscreen };\n};\n\nexport { useFullscreen };\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useGetDuration = (videoRef: VideoRef) => {\n const [isLoading, setIsLoading] = React.useState(false);\n const [duration, setDuration] = React.useState<number | null>(null);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n setIsLoading(true);\n\n const getDuration = () => {\n setDuration(videoRef.current?.duration ?? null);\n setIsLoading(false);\n };\n\n const handleError = () => {\n setIsLoading(false);\n };\n\n const video = videoRef.current;\n\n // Check if duration is already available\n if (video.duration && !isNaN(video.duration)) {\n setDuration(video.duration);\n setIsLoading(false);\n } else {\n // Add event listeners\n video.addEventListener(\"loadedmetadata\", getDuration);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", getDuration);\n\n return () => {\n video.removeEventListener(\"loadedmetadata\", getDuration);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", getDuration);\n };\n }\n }, [videoRef]);\n\n return { duration, isLoading };\n};\n","import { useEffect } from \"react\";\n\nexport const useHotKeys = (\n key: string,\n func: (event: KeyboardEvent) => void,\n enabled = true\n) => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === key) {\n event.preventDefault();\n func(event);\n }\n };\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [key, func, enabled]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useMuteUnmute = (videoRef: VideoRef) => {\n const [isMuted, setIsMuted] = React.useState(false);\n\n const toggleMute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = !videoRef.current.muted;\n }\n }, [videoRef?.current]);\n\n const mute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = true;\n }\n }, [videoRef?.current]);\n\n const unmute = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.muted = false;\n }\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n // Set the initial state\n setIsMuted(videoRef.current.muted);\n\n const handleVolumeChange = () => {\n if (videoRef.current) {\n setIsMuted(videoRef.current.muted);\n }\n };\n\n videoRef.current.addEventListener(\"volumechange\", handleVolumeChange);\n\n return () => {\n videoRef.current?.removeEventListener(\"volumechange\", handleVolumeChange);\n };\n }, [videoRef?.current]);\n\n return { toggleMute, isMuted, mute, unmute };\n};\n","import type { VideoRef } from \"../types\";\n\nexport const usePictureInPicture = (videoRef: VideoRef) => {\n const togglePictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n\n try {\n if (document.pictureInPictureElement) {\n await document.exitPictureInPicture();\n } else {\n await video.requestPictureInPicture();\n }\n } catch (error) {\n // Fallback for browsers that don't support PiP\n const isSafari = /^((?!chrome|android).)*safari/i.test(\n navigator.userAgent\n );\n\n if (isSafari) {\n if ((video as any).webkitEnterFullscreen) {\n (video as any).webkitEnterFullscreen();\n } else if (video.requestFullscreen) {\n video.requestFullscreen();\n }\n } else {\n const videoContainer = video.closest(\n \"[data-zuude-video-wrapper]\"\n ) as HTMLElement;\n if (videoContainer) {\n if (!document.fullscreenElement) {\n await videoContainer.requestFullscreen();\n } else {\n await document.exitFullscreen();\n }\n }\n }\n }\n };\n\n const requestPictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n await video.requestPictureInPicture();\n };\n\n const exitPictureInPicture = async () => {\n const video = videoRef?.current;\n if (!video) return;\n await document.exitPictureInPicture();\n };\n\n return {\n togglePictureInPicture,\n requestPictureInPicture,\n exitPictureInPicture,\n };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const usePlayPause = (videoRef: VideoRef) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n\n const togglePlay = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.paused\n ? videoRef.current.play()\n : videoRef.current.pause();\n }\n }, [videoRef?.current]);\n\n const play = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.play();\n }\n }, [videoRef?.current]);\n\n const pause = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.pause();\n }\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n const handlePlay = () => {\n setIsPlaying(true);\n };\n const handlePause = () => {\n setIsPlaying(false);\n };\n\n setIsPlaying(!videoRef?.current.paused);\n\n if (videoRef?.current) {\n videoRef.current.addEventListener(\"play\", handlePlay);\n videoRef.current.addEventListener(\"pause\", handlePause);\n\n return () => {\n videoRef.current?.removeEventListener(\"play\", handlePlay);\n videoRef.current?.removeEventListener(\"pause\", handlePause);\n };\n }\n }, [videoRef?.current]);\n\n return { togglePlay, isPlaying, play, pause };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useSeek = (videoRef: VideoRef, value = 10) => {\n const seekForward = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.currentTime += value;\n }\n }, [videoRef?.current]);\n\n const seekBackward = React.useCallback(() => {\n if (videoRef?.current) {\n videoRef.current.currentTime -= value;\n }\n }, [videoRef?.current]);\n\n return { seekForward, seekBackward };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useSpeed = (videoRef: VideoRef) => {\n const [speed, setSpeed] = React.useState(1);\n\n const onChangeSpeed = (speed: number) => {\n setSpeed(speed);\n };\n\n // Get the speed from the video element\n React.useEffect(() => {\n if (!videoRef?.current) return;\n setSpeed(videoRef.current.playbackRate);\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.playbackRate = speed;\n }, [speed, videoRef?.current]);\n\n return { speed, onChangeSpeed };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useStartAt = (videoRef: VideoRef, startAt: number) => {\n React.useEffect(() => {\n if (!videoRef?.current || !startAt) return;\n\n const video = videoRef?.current;\n if (video && startAt) {\n video.currentTime = startAt;\n }\n }, [startAt, videoRef?.current]);\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types.js\";\n\nexport const useCurrentTime = (videoRef: VideoRef, interval = 10) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [currentTime, setCurrentTime] = React.useState(0);\n\n React.useEffect(() => {\n if (videoRef?.current && isPlaying) {\n const intervalId = setInterval(() => {\n setCurrentTime(videoRef.current?.currentTime || 0);\n }, interval);\n\n return () => clearInterval(intervalId);\n }\n }, [videoRef?.current, isPlaying]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.addEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current.addEventListener(\"pause\", () => setIsPlaying(false));\n\n return () => {\n videoRef.current?.removeEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current?.removeEventListener(\"pause\", () => setIsPlaying(false));\n };\n }, [videoRef?.current]);\n\n const onTimeUpdate = (time: number) => {\n if (videoRef?.current) {\n setCurrentTime(time);\n videoRef.current.currentTime = time;\n }\n };\n\n return {\n currentTime,\n onTimeUpdate,\n };\n};\n","import { RefObject, useEffect, useState } from \"react\";\n\nconst useVideoState = (videoRef: RefObject<HTMLVideoElement | null>) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [isMuted, setIsMuted] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n useEffect(() => {\n const video = videoRef.current;\n\n if (video) {\n video.addEventListener(\"play\", () => setIsPlaying(true));\n video.addEventListener(\"pause\", () => setIsPlaying(false));\n\n return () => {\n video.removeEventListener(\"play\", () => setIsPlaying(true));\n video.removeEventListener(\"pause\", () => setIsPlaying(false));\n };\n }\n }, [videoRef]);\n\n useEffect(() => {\n if (!videoRef?.current) return;\n\n // Set the initial state\n setIsMuted(videoRef.current.muted);\n\n const handleVolumeChange = () => {\n if (videoRef.current) {\n setIsMuted(videoRef.current.muted);\n }\n };\n\n videoRef.current.addEventListener(\"volumechange\", handleVolumeChange);\n\n return () => {\n videoRef.current?.removeEventListener(\"volumechange\", handleVolumeChange);\n };\n }, [videoRef]);\n\n useEffect(() => {\n if (!videoRef?.current) return;\n\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\n }, [videoRef]);\n\n return { isPlaying, isMuted, isFullscreen };\n};\n\nexport { useVideoState };\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useVolume = (videoRef: VideoRef, initialVolume = 100) => {\n const [volume, setVolume] = React.useState(initialVolume);\n\n const onChangeVolume = (volume: number) => {\n setVolume(volume);\n };\n\n // Get the volume from the video element\n React.useEffect(() => {\n if (!videoRef?.current) return;\n setVolume(videoRef.current.volume * 100);\n }, [videoRef?.current]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.volume = volume / 100;\n }, [volume, videoRef?.current]);\n\n return { volume, onChangeVolume };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types.js\";\n\nexport const useBuffer = (videoRef: VideoRef, duration?: number) => {\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [buffered, setBuffered] = React.useState(0);\n\n React.useEffect(() => {\n if (videoRef?.current && isPlaying) {\n const intervalId = setInterval(() => {\n if (videoRef.current?.buffered.length) {\n setBuffered(\n videoRef.current.buffered.end(videoRef.current.buffered.length - 1)\n );\n }\n }, 10);\n\n return () => clearInterval(intervalId);\n }\n }, [videoRef?.current, isPlaying]);\n\n React.useEffect(() => {\n if (!videoRef?.current) return;\n\n videoRef.current.addEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current.addEventListener(\"pause\", () => setIsPlaying(false));\n\n return () => {\n videoRef.current?.removeEventListener(\"play\", () => setIsPlaying(true));\n videoRef.current?.removeEventListener(\"pause\", () => setIsPlaying(false));\n };\n }, []);\n\n return {\n buffered,\n bufferedPercentage: (buffered / (duration || 0)) * 100 || 0,\n };\n};\n","import { useEffect, useState, useCallback } from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useDownload = (videoRef: VideoRef) => {\n const [isDownloading, setIsDownloading] = useState(false);\n const [downloadProgress, setDownloadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n const downloadVideo = useCallback(\n async (filename?: string) => {\n if (!videoRef?.current) {\n setError(\"Video element not found\");\n return;\n }\n\n const video = videoRef.current;\n const videoSrc = video.src || video.currentSrc;\n\n if (!videoSrc) {\n setError(\"No video source found\");\n return;\n }\n\n try {\n setIsDownloading(true);\n setError(null);\n setDownloadProgress(0);\n\n // Fetch the video file\n const response = await fetch(videoSrc);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch video: ${response.statusText}`);\n }\n\n // Get the content length for progress tracking\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? parseInt(contentLength, 10) : 0;\n\n // Create a readable stream to track progress\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"Failed to create download stream\");\n }\n\n const chunks: Uint8Array[] = [];\n let receivedLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n chunks.push(value);\n receivedLength += value.length;\n\n if (total > 0) {\n const progress = (receivedLength / total) * 100;\n setDownloadProgress(Math.round(progress));\n }\n }\n\n // Combine chunks into a single blob\n const blob = new Blob(chunks, {\n type: response.headers.get(\"content-type\") || \"video/mp4\",\n });\n\n // Create download link\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n\n // Generate filename if not provided\n const defaultFilename = filename || `video-${Date.now()}.mp4`;\n link.download = defaultFilename;\n\n // Trigger download\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Clean up\n URL.revokeObjectURL(url);\n\n setDownloadProgress(100);\n setIsDownloading(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Download failed\");\n setIsDownloading(false);\n setDownloadProgress(0);\n }\n },\n [videoRef]\n );\n\n // Alternative simple download method for direct video URLs\n const downloadDirect = useCallback(\n (filename?: string) => {\n if (!videoRef?.current) {\n setError(\"Video element not found\");\n return;\n }\n\n const video = videoRef.current;\n const videoSrc = video.src || video.currentSrc;\n\n if (!videoSrc) {\n setError(\"No video source found\");\n return;\n }\n\n try {\n setIsDownloading(true);\n setError(null);\n setDownloadProgress(0);\n\n const link = document.createElement(\"a\");\n link.href = videoSrc;\n link.download = filename || `video-${Date.now()}.mp4`;\n link.target = \"_blank\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n setIsDownloading(false);\n setDownloadProgress(100);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Download failed\");\n setIsDownloading(false);\n setDownloadProgress(0);\n }\n },\n [videoRef]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n setIsDownloading(false);\n setDownloadProgress(0);\n setError(null);\n };\n }, []);\n\n return {\n downloadVideo,\n downloadDirect,\n isDownloading,\n downloadProgress,\n error,\n resetError: () => setError(null),\n };\n};\n","import React from \"react\";\nimport type { VideoRef } from \"../types\";\n\nexport const useRange = (videoRef: VideoRef, range: [number, number]) => {\n React.useEffect(() => {\n if (!videoRef?.current || !range) return;\n\n const video = videoRef.current;\n\n if (video) {\n const handleTimeUpdate = () => {\n if (video.currentTime >= range[1]) {\n video.currentTime = range[0];\n } else if (video.currentTime <= range[0]) {\n video.currentTime = range[0];\n }\n };\n\n video.addEventListener(\"timeupdate\", handleTimeUpdate);\n\n return () => {\n video.removeEventListener(\"timeupdate\", handleTimeUpdate);\n };\n }\n }, [range, videoRef?.current]);\n};\n"],"mappings":"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","names":["hooks_exports","__export","useAutoplayByForce","useAutoplayOnVisible","useBuffer","useCurrentTime","useDownload","useFullscreen","useGetDuration","useHotKeys","useMuteUnmute","usePictureInPicture","usePlayPause","useRange","useSeek","useSpeed","useStartAt","useVideoState","useVolume","__toCommonJS","import_react","useAutoplayByForce","videoRef","enabled","setError","React","_a","error","retryError","import_react","useAutoplayOnVisible","videoRef","threshold","enabled","React","observer","entries","entry","_a","error","import_react","useFullscreen","videoRef","isFullscreen","setIsFullscreen","React","handleFullscreenChange","toggleFullscreen","isSafari","video","videoContainer","import_react","useGetDuration","videoRef","isLoading","setIsLoading","React","duration","setDuration","getDuration","_a","_b","handleError","video","import_react","useHotKeys","key","func","enabled","handleKeyDown","event","import_react","useMuteUnmute","videoRef","isMuted","setIsMuted","React","toggleMute","mute","unmute","handleVolumeChange","_a","usePictureInPicture","videoRef","video","error","videoContainer","import_react","usePlayPause","videoRef","isPlaying","setIsPlaying","React","togglePlay","play","pause","handlePlay","handlePause","_a","_b","import_react","useSeek","videoRef","value","seekForward","React","seekBackward","import_react","useSpeed","videoRef","speed","setSpeed","React","onChangeSpeed","import_react","useStartAt","videoRef","startAt","React","video","import_react","useCurrentTime","videoRef","interval","isPlaying","setIsPlaying","React","currentTime","setCurrentTime","intervalId","_a","_b","time","import_react","useVideoState","videoRef","isPlaying","setIsPlaying","isMuted","setIsMuted","isFullscreen","setIsFullscreen","video","handleVolumeChange","_a","handleFullscreenChange","import_react","useVolume","videoRef","initialVolume","volume","setVolume","React","onChangeVolume","import_react","useBuffer","videoRef","duration","isPlaying","setIsPlaying","React","buffered","setBuffered","intervalId","_a","_b","import_react","useDownload","videoRef","isDownloading","setIsDownloading","downloadProgress","setDownloadProgress","error","setError","downloadVideo","filename","_a","video","videoSrc","response","contentLength","total","reader","chunks","receivedLength","done","value","progress","blob","url","link","defaultFilename","err","downloadDirect","import_react","useRange","videoRef","range","React","video","handleTimeUpdate"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { V as VideoRef } from '../types-DejCaLAg.cjs';
|
|
2
|
+
import { RefObject } from 'react';
|
|
3
|
+
|
|
4
|
+
declare const useAutoplayByForce: (videoRef: VideoRef, enabled: boolean, setError?: (error: string | null) => void) => void;
|
|
5
|
+
|
|
6
|
+
declare const useAutoplayOnVisible: (videoRef: VideoRef, threshold: number | undefined, enabled?: boolean) => void;
|
|
7
|
+
|
|
8
|
+
declare const useFullscreen: (videoRef: VideoRef) => {
|
|
9
|
+
isFullscreen: boolean;
|
|
10
|
+
toggleFullscreen: () => void;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
declare const useGetDuration: (videoRef: VideoRef) => {
|
|
14
|
+
duration: number | null;
|
|
15
|
+
isLoading: boolean;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
declare const useHotKeys: (key: string, func: (event: KeyboardEvent) => void, enabled?: boolean) => void;
|
|
19
|
+
|
|
20
|
+
declare const useMuteUnmute: (videoRef: VideoRef) => {
|
|
21
|
+
toggleMute: () => void;
|
|
22
|
+
isMuted: boolean;
|
|
23
|
+
mute: () => void;
|
|
24
|
+
unmute: () => void;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
declare const usePictureInPicture: (videoRef: VideoRef) => {
|
|
28
|
+
togglePictureInPicture: () => Promise<void>;
|
|
29
|
+
requestPictureInPicture: () => Promise<void>;
|
|
30
|
+
exitPictureInPicture: () => Promise<void>;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
declare const usePlayPause: (videoRef: VideoRef) => {
|
|
34
|
+
togglePlay: () => void;
|
|
35
|
+
isPlaying: boolean;
|
|
36
|
+
play: () => void;
|
|
37
|
+
pause: () => void;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
declare const useSeek: (videoRef: VideoRef, value?: number) => {
|
|
41
|
+
seekForward: () => void;
|
|
42
|
+
seekBackward: () => void;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
declare const useSpeed: (videoRef: VideoRef) => {
|
|
46
|
+
speed: number;
|
|
47
|
+
onChangeSpeed: (speed: number) => void;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
declare const useStartAt: (videoRef: VideoRef, startAt: number) => void;
|
|
51
|
+
|
|
52
|
+
declare const useCurrentTime: (videoRef: VideoRef, interval?: number) => {
|
|
53
|
+
currentTime: number;
|
|
54
|
+
onTimeUpdate: (time: number) => void;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
declare const useVideoState: (videoRef: RefObject<HTMLVideoElement | null>) => {
|
|
58
|
+
isPlaying: boolean;
|
|
59
|
+
isMuted: boolean;
|
|
60
|
+
isFullscreen: boolean;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
declare const useVolume: (videoRef: VideoRef, initialVolume?: number) => {
|
|
64
|
+
volume: number;
|
|
65
|
+
onChangeVolume: (volume: number) => void;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
declare const useBuffer: (videoRef: VideoRef, duration?: number) => {
|
|
69
|
+
buffered: number;
|
|
70
|
+
bufferedPercentage: number;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
declare const useDownload: (videoRef: VideoRef) => {
|
|
74
|
+
downloadVideo: (filename?: string) => Promise<void>;
|
|
75
|
+
downloadDirect: (filename?: string) => void;
|
|
76
|
+
isDownloading: boolean;
|
|
77
|
+
downloadProgress: number;
|
|
78
|
+
error: string | null;
|
|
79
|
+
resetError: () => void;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
declare const useRange: (videoRef: VideoRef, range: [number, number]) => void;
|
|
83
|
+
|
|
84
|
+
export { useAutoplayByForce, useAutoplayOnVisible, useBuffer, useCurrentTime, useDownload, useFullscreen, useGetDuration, useHotKeys, useMuteUnmute, usePictureInPicture, usePlayPause, useRange, useSeek, useSpeed, useStartAt, useVideoState, useVolume };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { V as VideoRef } from '../types-DejCaLAg.js';
|
|
2
|
+
import { RefObject } from 'react';
|
|
3
|
+
|
|
4
|
+
declare const useAutoplayByForce: (videoRef: VideoRef, enabled: boolean, setError?: (error: string | null) => void) => void;
|
|
5
|
+
|
|
6
|
+
declare const useAutoplayOnVisible: (videoRef: VideoRef, threshold: number | undefined, enabled?: boolean) => void;
|
|
7
|
+
|
|
8
|
+
declare const useFullscreen: (videoRef: VideoRef) => {
|
|
9
|
+
isFullscreen: boolean;
|
|
10
|
+
toggleFullscreen: () => void;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
declare const useGetDuration: (videoRef: VideoRef) => {
|
|
14
|
+
duration: number | null;
|
|
15
|
+
isLoading: boolean;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
declare const useHotKeys: (key: string, func: (event: KeyboardEvent) => void, enabled?: boolean) => void;
|
|
19
|
+
|
|
20
|
+
declare const useMuteUnmute: (videoRef: VideoRef) => {
|
|
21
|
+
toggleMute: () => void;
|
|
22
|
+
isMuted: boolean;
|
|
23
|
+
mute: () => void;
|
|
24
|
+
unmute: () => void;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
declare const usePictureInPicture: (videoRef: VideoRef) => {
|
|
28
|
+
togglePictureInPicture: () => Promise<void>;
|
|
29
|
+
requestPictureInPicture: () => Promise<void>;
|
|
30
|
+
exitPictureInPicture: () => Promise<void>;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
declare const usePlayPause: (videoRef: VideoRef) => {
|
|
34
|
+
togglePlay: () => void;
|
|
35
|
+
isPlaying: boolean;
|
|
36
|
+
play: () => void;
|
|
37
|
+
pause: () => void;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
declare const useSeek: (videoRef: VideoRef, value?: number) => {
|
|
41
|
+
seekForward: () => void;
|
|
42
|
+
seekBackward: () => void;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
declare const useSpeed: (videoRef: VideoRef) => {
|
|
46
|
+
speed: number;
|
|
47
|
+
onChangeSpeed: (speed: number) => void;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
declare const useStartAt: (videoRef: VideoRef, startAt: number) => void;
|
|
51
|
+
|
|
52
|
+
declare const useCurrentTime: (videoRef: VideoRef, interval?: number) => {
|
|
53
|
+
currentTime: number;
|
|
54
|
+
onTimeUpdate: (time: number) => void;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
declare const useVideoState: (videoRef: RefObject<HTMLVideoElement | null>) => {
|
|
58
|
+
isPlaying: boolean;
|
|
59
|
+
isMuted: boolean;
|
|
60
|
+
isFullscreen: boolean;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
declare const useVolume: (videoRef: VideoRef, initialVolume?: number) => {
|
|
64
|
+
volume: number;
|
|
65
|
+
onChangeVolume: (volume: number) => void;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
declare const useBuffer: (videoRef: VideoRef, duration?: number) => {
|
|
69
|
+
buffered: number;
|
|
70
|
+
bufferedPercentage: number;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
declare const useDownload: (videoRef: VideoRef) => {
|
|
74
|
+
downloadVideo: (filename?: string) => Promise<void>;
|
|
75
|
+
downloadDirect: (filename?: string) => void;
|
|
76
|
+
isDownloading: boolean;
|
|
77
|
+
downloadProgress: number;
|
|
78
|
+
error: string | null;
|
|
79
|
+
resetError: () => void;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
declare const useRange: (videoRef: VideoRef, range: [number, number]) => void;
|
|
83
|
+
|
|
84
|
+
export { useAutoplayByForce, useAutoplayOnVisible, useBuffer, useCurrentTime, useDownload, useFullscreen, useGetDuration, useHotKeys, useMuteUnmute, usePictureInPicture, usePlayPause, useRange, useSeek, useSpeed, useStartAt, useVideoState, useVolume };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q}from"../chunk-OYLOY3EO.js";export{a as useAutoplayByForce,h as useAutoplayOnVisible,o as useBuffer,l as useCurrentTime,p as useDownload,f as useFullscreen,i as useGetDuration,b as useHotKeys,e as useMuteUnmute,g as usePictureInPicture,d as usePlayPause,q as useRange,c as useSeek,j as useSpeed,k as useStartAt,m as useVideoState,n as useVolume};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|