-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathusePlayer.js
115 lines (101 loc) · 2.93 KB
/
usePlayer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { reactive, toRefs } from 'vue'
export function usePlayer(playerRef, props) {
const player = reactive({
playing: false,
duration: 0,
percentagePlayed: 0,
videoMuted: props.muted,
time: 0
})
const events = [
"play",
"pause",
"ended",
"loadeddata",
"waiting",
"playing",
"timeupdate",
"canplay",
"canplaythrough",
"statechanged",
];
const play = () => {
playerRef.value.play()
player.playing = true
}
const pause = () => {
playerRef.value.pause()
player.playing = false
}
const togglePlay = () => {
if (player.playing) {
pause()
} else {
play()
}
}
const toggleMute = () => {
if (player.videoMuted) {
setMuted(false)
} else {
setMuted(true)
}
}
const setMuted = (state) => {
playerRef.value.muted = state
player.videoMuted = state
}
const seekToPercentage = (percentage) => {
playerRef.value.currentTime = (percentage / 100) * player.duration;
}
const convertTimeToDuration = (seconds) => {
return [Math.floor((seconds / 60) % 60), Math.floor(seconds % 60)]
.map(num => num.toString().padStart(2, "0"))
.join(":");
}
const openFullScreen = () => {
if (playerRef.value.requestFullscreen) {
playerRef.value.requestFullscreen();
} else if (playerRef.value.webkitRequestFullscreen) {
playerRef.value.webkitRequestFullscreen();
} else if (playerRef.value.msRequestFullscreen) {
playerRef.value.msRequestFullscreen();
}
}
const togglePictureInPicture = () => {
if (document.pictureInPictureElement) {
document.exitPictureInPicture();
} else if (document.pictureInPictureEnabled) {
playerRef.value.requestPictureInPicture();
}
}
const bindEvents = (events, emit) => {
events.forEach((customEvent) => {
playerRef.value.addEventListener(customEvent, (event) => {
switch (customEvent) {
case "canplay":
player.duration = playerRef.value.duration
break;
case "timeupdate":
player.percentagePlayed = (playerRef.value.currentTime / playerRef.value.duration) * 100;
player.time = playerRef.value.currentTime;
break;
}
emit(customEvent, { event })
}, true)
});
}
return {
...toRefs(player),
events,
play,
pause,
togglePlay,
toggleMute,
seekToPercentage,
convertTimeToDuration,
openFullScreen,
togglePictureInPicture,
bindEvents,
}
}