1212 </ title >
1313
1414 < meta name =description content =''>
15-
15+
1616 < base href ='https://ext-code.com/utils/video/video-player/ '>
1717 < link rel =canonical href ='https://ext-code.com/utils/video/video-player/video-player.html '>
1818
1919 < meta name =viewport content ='width=device-width, initial-scale=1 '>
2020 < link rel =icon href ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAABmFBMVEVHcEwJCQkKCgru7u5GRkgfHx8vLy9ISEgUFBRWV1kXFxdpaWtra2xNTU3h4eEeHh4zMzNLS01DQ0Q6OjoqKir09PQPDw8LCwsNDQ0LCwsREREjIyMxMTFMTE5RUVFlZmpTU1U4ODhzc3Tp6ekPDw8WFhaKi42Cg4USEhKEhYeJiowdHR14eXuMjI5iY2VmZ2kjIyNfYGKGh4mNjpA2NjYkJCR5eXlfX18MDAw0NDQSEhJnaGobGxs3NzhkZWhaW1wrKyxYWFpzdHSTlJWgoKAPDw8gISEWFha0tLSjo6P///8wMDBBQUFgYWQiIiInKChTVFV8fH0lJSVHR0m8vLyrq6xPTk9vcHKCgoQZGRk8PDzr6+sdHh2np6ewsLDU1NRQUVNLS0yMjI7y8vL/AwT6FBRdXl/z8/PPz8/+/v6Gh4mMIySfn5+Wlpjl5eX6+vrg4OB3d3c5Hx57GBj4BAXCDAw0JiaHVFa1trbGxsbLy8vNCgt0Pj++S0tdKCi7GhpwGhvzW1vLZ2heISH9XV2QSEjf399sbGwqFLIEAAAAOHRSTlMAVfgDERMoKMrL4ymxrqsezAfL4+OpmUnc9LPj4stR4eLspp+AYUrdfS7W440iycrMy2qZp9d+rjCB+jUAAAIeSURBVCjPddOHd5pAAAbwaytGE0c0zexKk+69G0BkGDECMg1BxW1Nok3MaJPUrnT/271DbErz+uPx8eB7wLs7AMBxDnJiCJy4/+TpQji8sDgZeRkORSYjIZSLL8YG7Y07jYZVxI2q0NvFi3lhs+FkauIyam/f7DQanTYjaj2hL4nJprBjovxZv4r6e5rWsTSOUqg+vJ0RK4KQcvNZDMRCawin8vyvUjMv8upOc6M4yOdR4HuQhEiypuvJjWqF0s131bw0yPN+4AvSbW2NZUVRype2NZwql0opnMqinBgBvks11uJqlK1z8Nm4Tm83qxLM9aqkoLvjRt00pUxa6QvruXSistnTYAowiVE/wMYpnKKYDGGs5LdkglrNl0U3M6Po3ayDhv4c3JP5MeB7SA4lvUjyCqwf51xcyrXlhJXLoTpI0yZLt2naqqw6yuUsYtXr83BgQVU9/HqoQrVa3TCkYpEacsZtmj++f/n4ATYU7oXquGF0X0GfP4m4ll0eymq4eHEEYHFJ6rZarTdvvzEiS55QGQbVcFq6sDw+UHRd5nke7YisoEnFxhll//3+gSJLnAeryxdg/ciW9/Zk3rbb2deuZbTvyjaqA4WEbScKcPtHoXAX1RlXgvGQM2hJsADhoo9W/nJkFdCCxuaGteydE4YgAhgA14m0a8kDXrgFP2Tf1NJ/zGHoP8CuzcyePWV2Zirq/mTR6TOnTPtR8xulKNDmeeSt2gAAAABJRU5ErkJggg== '>
21-
21+
2222 < script type ='application/ld+json '>
2323 {
2424 "@context" : "https://schema.org" ,
3434 "offers" : { "@type" :"Offer" , "price" :"0" , "priceCurrency" :"GBP" }
3535 }
3636 </ script >
37-
38-
39- < script src ='https://libs.ext-code.com/js/dom/component/component.js '> </ script >
40-
37+
38+
39+ < script src ='https://libs.ext-code.com/js/dom/component/v3.0/ component.js '> </ script >
40+
4141 < script >
4242 console . clear ( ) ;
4343 console . log ( 'video-player' ) ;
4444 console . log ( ) ;
4545 console . json = v => console . log ( JSON . stringify ( v , null , 4 ) ) ;
4646 var df = true , version = 'v1.0'
4747 ;
48-
48+
4949 var ext , $ , datatype , menumod , keydown , debug , hs
5050 ;
51-
51+
5252 var menu ;
5353
5454 var hdr ;
5555 var filemod ;
5656 var log ;
5757
58-
58+
5959 var github = false ;
6060 if ( window . location . toString ( ) . includes ( 'github' ) ) {
6161 github = true ;
7575 var btn = { } ;
7676
7777
78-
79-
80-
78+
79+
80+
8181
8282 async function init ( ) {
83-
83+
8484 menu = menumod ( ) ;
85-
85+
8686 mod . base . add ( { ext, $, datatype, keydown, menu, menumod} ) ;
8787
88-
88+
8989 hdr = mod [ 'video-hdr' ] ;
9090 filemod = mod [ 'file-mod' ] ;
9191 log = mod [ 'log-mod' ] ;
106106
107107 } //init
108108
109-
109+
110110( async ( ) => {
111111
112112 mod . stack . add ;
113113
114114 ( { ext} = await import ( 'https://libs.ext-code.com/js/io/ext-loader/ext-loader.m.js' ) ) ;
115-
115+
116116 var promise = ext . load . libs (
117117 'js/dom/$.js' ,
118118 'js/core/datatype.js' ,
122122 'js/string/hs.js' ,
123123 ) ;
124124 [ $ , datatype , menumod , keydown , debug , hs ] = await promise ;
125-
125+
126126 mod . stack . complete ;
127-
127+
128128} ) ( ) ;
129129
130130
131131
132132 </ script >
133-
134-
135-
136-
133+
134+
135+
136+
137137 < style >
138138
139139 html
140140 {height : 100% }
141141
142142 body
143143 {display : flex; flex-direction : column; height : calc (100% - 30px ); margin : 15px ; font-family : arial;}
144-
145-
144+
145+
146146 [component ]
147147 {display : none}
148148
149- .icon
149+ .icon
150150 {border : 1px solid gray;border-radius : 3px ;box-sizing : border-box;width : 30px ;height : 30px ;cursor : pointer}
151-
151+
152152
153153 # upper
154154 {margin-top : 10px ; display : flex; justify-content : space-between; gap : 10px ; align-items : center;}
212212 {position : absolute;width : 1px ;height : 1px ;margin : -1px ;padding : 0 ;overflow : hidden;clip : rect (0 0 0 0 );border : 0 }
213213
214214 </ style >
215-
215+
216216 </ head >
217-
218-
217+
218+
219219 < body >
220220
221221 < video-hdr component =grp >
222222 < img class =title src ='images/video-player.png ' style ='top:5px;height:60px ' alt ='video player '>
223223 < h1 slot =seo-hdr class =visually-hidden > video player</ h1 >
224224 < time slot =date datetime =2025-11-28 > 28 Nov 2025</ time >
225225 </ video-hdr >
226-
227-
226+
227+
228228 < div id =upper >
229229
230230 < div >
@@ -294,11 +294,11 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
294294 < log-mod component > </ log-mod >
295295
296296 </ body >
297-
298-
297+
298+
299299 < script >
300-
301-
300+
301+
302302
303303 function initdom ( ) { //c
304304
@@ -342,7 +342,7 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
342342 } //initdom
343343
344344 //:
345-
345+
346346
347347 btn . file = function ( ) {
348348
@@ -360,18 +360,18 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
360360 } //onchange
361361
362362 } //file
363-
363+
364364
365365 //:
366-
366+
367367
368368 function setup ( ) {
369369
370370 var s = window . location . toString ( ) ;
371371 var i = s . indexOf ( '?' ) ;
372372 console . log ( s ) ;
373373 if ( i != - 1 ) {
374-
374+
375375 s = s . slice ( i + 1 ) ;
376376 var parts = s . split ( '=' ) ;
377377 var file = parts [ 0 ] ;
@@ -389,45 +389,45 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
389389 //:
390390
391391 function set ( file , blob ) {
392-
392+
393393 var url = window . URL . createObjectURL ( blob ) ;
394394
395395 video . src = url ;
396396 video . currentTime = 0 ;
397397
398398 } //set
399-
400-
399+
400+
401401 //:
402-
403-
402+
403+
404404 function focus ( ) { }
405405
406-
406+
407407 function source ( ) { }
408408
409-
409+
410410 var complete = { } ;
411411
412412 complete . load = function ( file , blob ) {
413-
413+
414414 set ( file , blob ) ;
415415
416416 } //load
417417
418418
419419 complete . save = function ( file ) {
420420 } //save
421-
422-
423-
424-
425-
426-
421+
422+
423+
424+
425+
426+
427427
428428 //:
429429
430- /*
430+ /*
431431 function select(e){
432432
433433 var file = e.target.value;
@@ -460,7 +460,7 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
460460*/
461461
462462
463-
463+
464464 //:
465465
466466 function meta ( ) {
@@ -524,7 +524,7 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
524524
525525 } //time
526526
527-
527+
528528 skip . timestamp = function ( ) {
529529 console . log ( 'skip.timestamp' ) ;
530530 var milli = strtomilli ( timestamp . value , 'ts1' ) ;
@@ -540,14 +540,14 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
540540
541541 } //timestamp
542542
543-
543+
544544 function zero ( ) {
545545
546546 video . currentTime = 0 ;
547547
548548 } //zero
549549
550-
550+
551551 function back ( ) {
552552
553553 var v = parseFloat ( seek . value ) ;
@@ -559,7 +559,7 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
559559
560560 } //back
561561
562-
562+
563563 function forward ( ) {
564564
565565 var v = parseFloat ( seek . value ) ;
@@ -570,7 +570,7 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
570570 video . currentTime = time + v ;
571571
572572 } //forward
573-
573+
574574
575575 function rotate ( ) {
576576
@@ -581,10 +581,10 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
581581 video . style . transform = `rotate(${ v } deg)` ;
582582
583583 } //rotate
584-
584+
585585
586586 //:
587-
587+
588588
589589 function millitostr ( milli , type ) {
590590
@@ -645,7 +645,7 @@ <h1 slot=seo-hdr class=visually-hidden>video player</h1>
645645
646646 } //millitostr
647647
648-
648+
649649 function strtomilli ( str , type ) {
650650
651651 var years = 0 ;
0 commit comments