1- ( function ( ) {
1+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2+ // @ts -nocheck - Typing will be fixed in the future
3+
4+ export function mediaControl ( ) {
25 // Initialize state if not exists
36 if ( ! window . _mediaControlState ) {
47 window . _mediaControlState = {
58 observer : null ,
69 userInitiated : false ,
710 originalPlay : HTMLMediaElement . prototype . play ,
811 originalLoad : HTMLMediaElement . prototype . load ,
9- isPaused : false
12+ isPaused : false ,
1013 } ;
1114 }
1215 const state = window . _mediaControlState ;
1316
1417 // Block playback handler
15- const blockPlayback = function ( event ) {
18+ const blockPlayback = function ( event ) {
1619 event . preventDefault ( ) ;
1720 event . stopPropagation ( ) ;
1821 return false ;
2124 // The actual media control function
2225 function mediaControl ( pause ) {
2326 state . isPaused = pause ;
24-
27+
2528 if ( pause ) {
2629 // Capture play events at the earliest possible moment
2730 document . addEventListener ( 'play' , blockPlayback , true ) ;
2831 document . addEventListener ( 'playing' , blockPlayback , true ) ;
29-
32+
3033 // Block HTML5 video/audio playback methods
31- HTMLMediaElement . prototype . play = function ( ) {
34+ HTMLMediaElement . prototype . play = function ( ) {
3235 this . pause ( ) ;
3336 return Promise . reject ( new Error ( 'Playback blocked' ) ) ;
3437 } ;
35-
38+
3639 // Override load to ensure media starts paused
37- HTMLMediaElement . prototype . load = function ( ) {
40+ HTMLMediaElement . prototype . load = function ( ) {
3841 this . autoplay = false ;
3942 this . pause ( ) ;
4043 return state . originalLoad . apply ( this , arguments ) ;
4144 } ;
4245
4346 // Listen for user interactions that may lead to playback
44- document . addEventListener ( 'touchstart' , ( ) => {
45- state . userInitiated = true ;
46-
47- // Remove the early blocking listeners
48- document . removeEventListener ( 'play' , blockPlayback , true ) ;
49- document . removeEventListener ( 'playing' , blockPlayback , true ) ;
50-
51- // Reset HTMLMediaElement.prototype.play
52- HTMLMediaElement . prototype . play = state . originalPlay ;
53-
54- // Unmute all media elements when user interacts
55- document . querySelectorAll ( 'audio, video' ) . forEach ( media => {
56- media . muted = false ;
57- } ) ;
47+ document . addEventListener (
48+ 'touchstart' ,
49+ ( ) => {
50+ state . userInitiated = true ;
51+
52+ // Remove the early blocking listeners
53+ document . removeEventListener ( 'play' , blockPlayback , true ) ;
54+ document . removeEventListener ( 'playing' , blockPlayback , true ) ;
55+
56+ // Reset HTMLMediaElement.prototype.play
57+ HTMLMediaElement . prototype . play = state . originalPlay ;
5858
59- // Reset after a short delay
60- setTimeout ( ( ) => {
61- state . userInitiated = false ;
62-
63- // Re-add blocking if still in paused state
64- if ( state . isPaused ) {
65- document . addEventListener ( 'play' , blockPlayback , true ) ;
66- document . addEventListener ( 'playing' , blockPlayback , true ) ;
67- HTMLMediaElement . prototype . play = function ( ) {
68- this . pause ( ) ;
69- return Promise . reject ( new Error ( 'Playback blocked' ) ) ;
70- } ;
71- }
72- } , 500 ) ;
73- } , true ) ;
59+ // Unmute all media elements when user interacts
60+ document . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
61+ media . muted = false ;
62+ } ) ;
63+
64+ // Reset after a short delay
65+ setTimeout ( ( ) => {
66+ state . userInitiated = false ;
67+
68+ // Re-add blocking if still in paused state
69+ if ( state . isPaused ) {
70+ document . addEventListener ( 'play' , blockPlayback , true ) ;
71+ document . addEventListener ( 'playing' , blockPlayback , true ) ;
72+ HTMLMediaElement . prototype . play = function ( ) {
73+ this . pause ( ) ;
74+ return Promise . reject ( new Error ( 'Playback blocked' ) ) ;
75+ } ;
76+ }
77+ } , 500 ) ;
78+ } ,
79+ true ,
80+ ) ;
7481
7582 // Initial pause of all media
76- document . querySelectorAll ( 'audio, video' ) . forEach ( media => {
83+ document . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
7784 media . pause ( ) ;
7885 media . muted = true ;
7986 media . autoplay = false ;
8390 if ( state . observer ) {
8491 state . observer . disconnect ( ) ;
8592 }
86-
87- state . observer = new MutationObserver ( mutations => {
88- mutations . forEach ( mutation => {
93+
94+ state . observer = new MutationObserver ( ( mutations ) => {
95+ mutations . forEach ( ( mutation ) => {
8996 // Check for added nodes
90- mutation . addedNodes . forEach ( node => {
97+ mutation . addedNodes . forEach ( ( node ) => {
9198 if ( node . tagName === 'VIDEO' || node . tagName === 'AUDIO' ) {
9299 if ( ! state . userInitiated ) {
93100 node . pause ( ) ;
94101 node . muted = true ;
95102 node . autoplay = false ;
96103 }
97104 } else if ( node . querySelectorAll ) {
98- node . querySelectorAll ( 'audio, video' ) . forEach ( media => {
105+ node . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
99106 if ( ! state . userInitiated ) {
100107 media . pause ( ) ;
101108 media . muted = true ;
107114 } ) ;
108115 } ) ;
109116
110- state . observer . observe ( document . documentElement || document . body , {
111- childList : true ,
117+ state . observer . observe ( document . documentElement || document . body , {
118+ childList : true ,
112119 subtree : true ,
113120 attributes : true ,
114- attributeFilter : [ 'autoplay' , 'src' , 'playing' ]
121+ attributeFilter : [ 'autoplay' , 'src' , 'playing' ] ,
115122 } ) ;
116123 } else {
117124 // Restore original methods
118125 HTMLMediaElement . prototype . play = state . originalPlay ;
119126 HTMLMediaElement . prototype . load = state . originalLoad ;
120-
127+
121128 // Remove listeners
122129 document . removeEventListener ( 'play' , blockPlayback , true ) ;
123130 document . removeEventListener ( 'playing' , blockPlayback , true ) ;
124-
131+
125132 // Clean up observer
126133 if ( state . observer ) {
127134 state . observer . disconnect ( ) ;
128135 state . observer = null ;
129136 }
130137
131138 // Unmute all media
132- document . querySelectorAll ( 'audio, video' ) . forEach ( media => {
139+ document . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
133140 media . muted = false ;
134141 } ) ;
135142 }
136143 }
137144
138145 // Export function
139146 window . mediaControl = mediaControl ;
140- } ) ( ) ;
147+ }
0 commit comments