@@ -14,6 +14,20 @@ import { buildVodPanelMarkup } from './vod.panel.template';
1414 const VOD_SPEED_MENU_ID = 'ecdash-vod-speed-menu' ;
1515 const VOD_PANEL_BODY_ID = 'ecdash-vod-panel-body' ;
1616 const VOD_PANEL_TOGGLE_ID = 'ecdash-vod-panel-toggle' ;
17+ const VOD_TURBO_RATE = 1000 ;
18+
19+ function formatVodSpeedLabel ( rate ) {
20+ const current = E . closestVodSpeedOption ( rate ) ;
21+ return Number . isInteger ( current ) ? `${ current } x` : `${ current . toFixed ( 2 ) } x` ;
22+ }
23+
24+ function updateVodTurboButtonState ( panel , rate ) {
25+ const turboButton = panel ?. querySelector ( '#ecdash-vod-speed-max' ) ;
26+ if ( ! turboButton ) return ;
27+ const isActive = E . closestVodSpeedOption ( rate ) === VOD_TURBO_RATE ;
28+ turboButton . classList . toggle ( 'is-active' , isActive ) ;
29+ turboButton . setAttribute ( 'aria-pressed' , isActive ? 'true' : 'false' ) ;
30+ }
1731
1832 E . updateVodSpeedPanelRate = function updateVodSpeedPanelRate ( rate ) {
1933 const panel = document . getElementById ( VOD_SPEED_PANEL_ID ) ;
@@ -22,8 +36,10 @@ import { buildVodPanelMarkup } from './vod.panel.template';
2236 const current = E . closestVodSpeedOption ( rate ) ;
2337 const label = panel . querySelector ( '#ecdash-vod-speed-current' ) ;
2438 if ( ! label ) return ;
25- label . textContent = `${ current . toFixed ( 2 ) } x` ;
26- label . setAttribute ( 'aria-label' , `현재 배속 ${ current . toFixed ( 2 ) } x` ) ;
39+ const speedLabel = formatVodSpeedLabel ( current ) ;
40+ label . textContent = speedLabel ;
41+ label . setAttribute ( 'aria-label' , `현재 배속 ${ speedLabel } ` ) ;
42+ updateVodTurboButtonState ( panel , current ) ;
2743 } ;
2844
2945 E . updateVodSpeedMenuSelection = function updateVodSpeedMenuSelection ( rate ) {
@@ -37,6 +53,7 @@ import { buildVodPanelMarkup } from './vod.panel.template';
3753 btn . classList . toggle ( 'is-active' , active ) ;
3854 btn . setAttribute ( 'aria-selected' , active ? 'true' : 'false' ) ;
3955 } ) ;
56+ updateVodTurboButtonState ( panel , current ) ;
4057 } ;
4158
4259 E . setVodSpeedMenuOpen = function setVodSpeedMenuOpen ( panel , isOpen ) {
@@ -92,7 +109,7 @@ import { buildVodPanelMarkup } from './vod.panel.template';
92109 btn . dataset . rate = String ( option ) ;
93110 btn . setAttribute ( 'role' , 'option' ) ;
94111 btn . setAttribute ( 'aria-selected' , 'false' ) ;
95- btn . textContent = ` ${ option . toFixed ( 2 ) } x` ;
112+ btn . textContent = formatVodSpeedLabel ( option ) ;
96113 menu . appendChild ( btn ) ;
97114 } ) ;
98115 }
@@ -119,7 +136,10 @@ import { buildVodPanelMarkup } from './vod.panel.template';
119136 } ;
120137
121138 const applyAndPersist = async ( nextRate , persist = true ) => {
122- const { rate } = E . applyVodPlaybackRate ( nextRate ) ;
139+ const { rate } =
140+ typeof E . applyVodPlaybackMode === 'function'
141+ ? E . applyVodPlaybackMode ( nextRate )
142+ : E . applyVodPlaybackRate ( nextRate ) ;
123143 targetRate = E . closestVodSpeedOption ( rate ) ;
124144 E . updateVodSpeedPanelRate ( targetRate ) ;
125145 E . updateVodSpeedMenuSelection ( targetRate ) ;
@@ -153,6 +173,13 @@ import { buildVodPanelMarkup } from './vod.panel.template';
153173 void applyAndPersist ( E . nextVodSpeedOption ( targetRate , 1 ) , true ) ;
154174 } ) ;
155175
176+ panel
177+ . querySelector ( '#ecdash-vod-speed-max' )
178+ ?. addEventListener ( 'click' , ( ) => {
179+ closeMenu ( ) ;
180+ void applyAndPersist ( VOD_TURBO_RATE , true ) ;
181+ } ) ;
182+
156183 panel
157184 . querySelector ( '#ecdash-vod-speed-current' )
158185 ?. addEventListener ( 'click' , ( ) => {
@@ -198,20 +225,6 @@ import { buildVodPanelMarkup } from './vod.panel.template';
198225 }
199226 } ) ;
200227
201- panel
202- . querySelector ( '#ecdash-vod-seek-back' )
203- ?. addEventListener ( 'click' , ( ) => {
204- closeMenu ( ) ;
205- E . seekVodByDelta ( - 5 ) ;
206- } ) ;
207-
208- panel
209- . querySelector ( '#ecdash-vod-seek-forward' )
210- ?. addEventListener ( 'click' , ( ) => {
211- closeMenu ( ) ;
212- E . seekVodByDelta ( 5 ) ;
213- } ) ;
214-
215228 document . addEventListener ( 'click' , ( event ) => {
216229 if ( panel . contains ( event . target ) ) return ;
217230 closeMenu ( ) ;
@@ -257,7 +270,10 @@ import { buildVodPanelMarkup } from './vod.panel.template';
257270 video . dataset . ecdashSpeedBound = '1' ;
258271
259272 const sync = ( ) => {
260- const applied = E . applyVodPlaybackRate ( targetRate ) ;
273+ const applied =
274+ typeof E . applyVodPlaybackMode === 'function'
275+ ? E . applyVodPlaybackMode ( targetRate )
276+ : E . applyVodPlaybackRate ( targetRate ) ;
261277 if ( applied . applied ) {
262278 E . updateVodSpeedPanelRate ( applied . rate ) ;
263279 E . updateVodSpeedMenuSelection ( applied . rate ) ;
@@ -274,7 +290,10 @@ import { buildVodPanelMarkup } from './vod.panel.template';
274290 if ( vodRoot ) {
275291 const speedObserver = new MutationObserver ( ( ) => {
276292 bindVideoListeners ( ) ;
277- const applied = E . applyVodPlaybackRate ( targetRate ) ;
293+ const applied =
294+ typeof E . applyVodPlaybackMode === 'function'
295+ ? E . applyVodPlaybackMode ( targetRate )
296+ : E . applyVodPlaybackRate ( targetRate ) ;
278297 if ( applied . applied ) {
279298 E . updateVodSpeedPanelRate ( applied . rate ) ;
280299 E . updateVodSpeedMenuSelection ( applied . rate ) ;
@@ -290,13 +309,19 @@ import { buildVodPanelMarkup } from './vod.panel.template';
290309 }
291310
292311 bindVideoListeners ( ) ;
293- const first = E . applyVodPlaybackRate ( targetRate ) ;
312+ const first =
313+ typeof E . applyVodPlaybackMode === 'function'
314+ ? E . applyVodPlaybackMode ( targetRate )
315+ : E . applyVodPlaybackRate ( targetRate ) ;
294316 if ( ! first . applied ) {
295317 // 플레이어 초기화 지연 대비: 짧은 시간 동안 재시도
296318 let retries = 0 ;
297319 const timer = setInterval ( ( ) => {
298320 retries += 1 ;
299- const next = E . applyVodPlaybackRate ( targetRate ) ;
321+ const next =
322+ typeof E . applyVodPlaybackMode === 'function'
323+ ? E . applyVodPlaybackMode ( targetRate )
324+ : E . applyVodPlaybackRate ( targetRate ) ;
300325 if ( next . applied || retries >= 12 ) {
301326 clearInterval ( timer ) ;
302327 }
0 commit comments