11// eslint-disable-next-line @typescript-eslint/ban-ts-comment
22// @ts -nocheck - Typing will be fixed in the future
33
4- export function mediaControl ( ) {
4+ /**
5+ *
6+ * @param {boolean } pause
7+ */
8+ export function mediaControl ( pause ) {
59 // Initialize state if not exists
610 if ( ! window . _mediaControlState ) {
11+ console . log ( 'Creating control state' ) ;
712 window . _mediaControlState = {
813 observer : null ,
914 userInitiated : false ,
@@ -16,132 +21,128 @@ export function mediaControl() {
1621
1722 // Block playback handler
1823 const blockPlayback = function ( event ) {
24+ console . log ( 'Blocking playback handler' ) ;
1925 event . preventDefault ( ) ;
2026 event . stopPropagation ( ) ;
2127 return false ;
2228 } ;
2329
24- // The actual media control function
25- function mediaControl ( pause ) {
26- state . isPaused = pause ;
27-
28- if ( pause ) {
29- // Capture play events at the earliest possible moment
30- document . addEventListener ( 'play' , blockPlayback , true ) ;
31- document . addEventListener ( 'playing' , blockPlayback , true ) ;
32-
33- // Block HTML5 video/audio playback methods
34- HTMLMediaElement . prototype . play = function ( ) {
35- this . pause ( ) ;
36- return Promise . reject ( new Error ( 'Playback blocked' ) ) ;
37- } ;
38-
39- // Override load to ensure media starts paused
40- HTMLMediaElement . prototype . load = function ( ) {
41- this . autoplay = false ;
42- this . pause ( ) ;
43- return state . originalLoad . apply ( this , arguments ) ;
44- } ;
45-
46- // Listen for user interactions that may lead to playback
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 ;
58-
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- ) ;
81-
82- // Initial pause of all media
83- document . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
84- media . pause ( ) ;
85- media . muted = true ;
86- media . autoplay = false ;
87- } ) ;
30+ console . log ( 'Running media control with pause: ' , pause ) ;
31+ state . isPaused = pause ;
32+
33+ if ( pause ) {
34+ // Capture play events at the earliest possible moment
35+ document . addEventListener ( 'play' , blockPlayback , true ) ;
36+ document . addEventListener ( 'playing' , blockPlayback , true ) ;
37+
38+ // Block HTML5 video/audio playback methods
39+ HTMLMediaElement . prototype . play = function ( ) {
40+ this . pause ( ) ;
41+ return Promise . reject ( new Error ( 'Playback blocked' ) ) ;
42+ } ;
43+
44+ // Override load to ensure media starts paused
45+ HTMLMediaElement . prototype . load = function ( ) {
46+ this . autoplay = false ;
47+ this . pause ( ) ;
48+ return state . originalLoad . apply ( this , arguments ) ;
49+ } ;
50+
51+ // Listen for user interactions that may lead to playback
52+ document . addEventListener (
53+ 'touchstart' ,
54+ ( ) => {
55+ state . userInitiated = true ;
56+
57+ // Remove the early blocking listeners
58+ document . removeEventListener ( 'play' , blockPlayback , true ) ;
59+ document . removeEventListener ( 'playing' , blockPlayback , true ) ;
60+
61+ // Reset HTMLMediaElement.prototype.play
62+ HTMLMediaElement . prototype . play = state . originalPlay ;
8863
89- // Monitor DOM for newly added media elements
90- if ( state . observer ) {
91- state . observer . disconnect ( ) ;
92- }
64+ // Unmute all media elements when user interacts
65+ document . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
66+ media . muted = false ;
67+ } ) ;
68+
69+ // Reset after a short delay
70+ setTimeout ( ( ) => {
71+ state . userInitiated = false ;
72+
73+ // Re-add blocking if still in paused state
74+ if ( state . isPaused ) {
75+ document . addEventListener ( 'play' , blockPlayback , true ) ;
76+ document . addEventListener ( 'playing' , blockPlayback , true ) ;
77+ HTMLMediaElement . prototype . play = function ( ) {
78+ this . pause ( ) ;
79+ return Promise . reject ( new Error ( 'Playback blocked' ) ) ;
80+ } ;
81+ }
82+ } , 500 ) ;
83+ } ,
84+ true ,
85+ ) ;
86+
87+ // Initial pause of all media
88+ document . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
89+ media . pause ( ) ;
90+ media . muted = true ;
91+ media . autoplay = false ;
92+ } ) ;
93+
94+ // Monitor DOM for newly added media elements
95+ if ( state . observer ) {
96+ state . observer . disconnect ( ) ;
97+ }
9398
94- state . observer = new MutationObserver ( ( mutations ) => {
95- mutations . forEach ( ( mutation ) => {
96- // Check for added nodes
97- mutation . addedNodes . forEach ( ( node ) => {
98- if ( node . tagName === 'VIDEO' || node . tagName === 'AUDIO' ) {
99+ state . observer = new MutationObserver ( ( mutations ) => {
100+ mutations . forEach ( ( mutation ) => {
101+ // Check for added nodes
102+ mutation . addedNodes . forEach ( ( node ) => {
103+ if ( node . tagName === 'VIDEO' || node . tagName === 'AUDIO' ) {
104+ if ( ! state . userInitiated ) {
105+ node . pause ( ) ;
106+ node . muted = true ;
107+ node . autoplay = false ;
108+ }
109+ } else if ( node . querySelectorAll ) {
110+ node . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
99111 if ( ! state . userInitiated ) {
100- node . pause ( ) ;
101- node . muted = true ;
102- node . autoplay = false ;
112+ media . pause ( ) ;
113+ media . muted = true ;
114+ media . autoplay = false ;
103115 }
104- } else if ( node . querySelectorAll ) {
105- node . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
106- if ( ! state . userInitiated ) {
107- media . pause ( ) ;
108- media . muted = true ;
109- media . autoplay = false ;
110- }
111- } ) ;
112- }
113- } ) ;
116+ } ) ;
117+ }
114118 } ) ;
115119 } ) ;
116-
117- state . observer . observe ( document . documentElement || document . body , {
118- childList : true ,
119- subtree : true ,
120- attributes : true ,
121- attributeFilter : [ 'autoplay' , 'src' , 'playing' ] ,
122- } ) ;
123- } else {
124- // Restore original methods
125- HTMLMediaElement . prototype . play = state . originalPlay ;
126- HTMLMediaElement . prototype . load = state . originalLoad ;
127-
128- // Remove listeners
129- document . removeEventListener ( 'play' , blockPlayback , true ) ;
130- document . removeEventListener ( 'playing' , blockPlayback , true ) ;
131-
132- // Clean up observer
133- if ( state . observer ) {
134- state . observer . disconnect ( ) ;
135- state . observer = null ;
136- }
137-
138- // Unmute all media
139- document . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
140- media . muted = false ;
141- } ) ;
120+ } ) ;
121+
122+ state . observer . observe ( document . documentElement || document . body , {
123+ childList : true ,
124+ subtree : true ,
125+ attributes : true ,
126+ attributeFilter : [ 'autoplay' , 'src' , 'playing' ] ,
127+ } ) ;
128+ } else {
129+ // Restore original methods
130+ HTMLMediaElement . prototype . play = state . originalPlay ;
131+ HTMLMediaElement . prototype . load = state . originalLoad ;
132+
133+ // Remove listeners
134+ document . removeEventListener ( 'play' , blockPlayback , true ) ;
135+ document . removeEventListener ( 'playing' , blockPlayback , true ) ;
136+
137+ // Clean up observer
138+ if ( state . observer ) {
139+ state . observer . disconnect ( ) ;
140+ state . observer = null ;
142141 }
143- }
144142
145- // Export function
146- window . mediaControl = mediaControl ;
143+ // Unmute all media
144+ document . querySelectorAll ( 'audio, video' ) . forEach ( ( media ) => {
145+ media . muted = false ;
146+ } ) ;
147+ }
147148}
0 commit comments