@omnimedia/omnitool 1.1.0-8 → 1.1.0-80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) hide show
  1. package/README.md +293 -76
  2. package/package.json +19 -17
  3. package/s/context.ts +0 -7
  4. package/s/demo/demo.bundle.ts +104 -43
  5. package/s/demo/demo.css +244 -14
  6. package/s/demo/routines/export-test.ts +16 -0
  7. package/s/demo/routines/filmstrip-test.ts +22 -18
  8. package/s/demo/routines/load-video.ts +2 -3
  9. package/s/demo/routines/playback-test.ts +61 -0
  10. package/s/demo/routines/timeline-setup.ts +50 -0
  11. package/s/demo/routines/transcode-test.ts +19 -5
  12. package/s/demo/routines/transitions-test.ts +2 -2
  13. package/s/demo/routines/waveform-test.ts +35 -8
  14. package/s/driver/driver-worker.ts +9 -0
  15. package/s/driver/driver.test.ts +1 -1
  16. package/s/driver/driver.ts +43 -42
  17. package/s/driver/fns/schematic.ts +26 -6
  18. package/s/driver/fns/work.ts +65 -189
  19. package/s/driver/parts/compositor.ts +316 -0
  20. package/s/driver/parts/machina.ts +19 -20
  21. package/s/driver/utils/find-pixi-filter.ts +24 -0
  22. package/s/index.html.ts +103 -25
  23. package/s/index.ts +1 -0
  24. package/s/tests.bundle.ts +11 -0
  25. package/s/tests.html.ts +28 -0
  26. package/s/timeline/index.ts +8 -2
  27. package/s/timeline/parts/animations.ts +56 -0
  28. package/s/timeline/parts/filmstrip.ts +43 -16
  29. package/s/timeline/parts/filters.ts +453 -0
  30. package/s/timeline/parts/item.ts +70 -7
  31. package/s/timeline/parts/media.ts +12 -2
  32. package/s/timeline/parts/resource-pool.ts +8 -5
  33. package/s/timeline/parts/resource.ts +3 -0
  34. package/s/timeline/parts/waveform/parts/collect.ts +72 -0
  35. package/s/timeline/parts/waveform/parts/render.ts +45 -0
  36. package/s/timeline/parts/waveform/parts/types.ts +24 -0
  37. package/s/timeline/parts/waveform/waveform.ts +161 -0
  38. package/s/timeline/renderers/export/parts/audio-gain.ts +17 -0
  39. package/s/timeline/renderers/export/parts/audio-mix.ts +133 -0
  40. package/s/timeline/renderers/export/parts/cursor.ts +129 -0
  41. package/s/timeline/renderers/export/parts/produce-audio.ts +64 -0
  42. package/s/timeline/renderers/export/parts/produce-video.ts +49 -0
  43. package/s/timeline/renderers/export/parts/resamplers.ts +48 -0
  44. package/s/timeline/renderers/export/produce.ts +28 -0
  45. package/s/timeline/renderers/parts/handy.ts +377 -0
  46. package/s/timeline/renderers/parts/samplers/audio/parts/find.ts +19 -0
  47. package/s/timeline/renderers/parts/samplers/audio/parts/init.ts +60 -0
  48. package/s/timeline/renderers/parts/samplers/audio/parts/sink.ts +38 -0
  49. package/s/timeline/renderers/parts/samplers/audio/parts/types.ts +16 -0
  50. package/s/timeline/renderers/parts/samplers/audio/sampler.ts +35 -0
  51. package/s/timeline/renderers/parts/samplers/visual/parts/defaults.ts +16 -0
  52. package/s/timeline/renderers/parts/samplers/visual/parts/sample.ts +69 -0
  53. package/s/timeline/renderers/parts/samplers/visual/parts/sequence.ts +111 -0
  54. package/s/timeline/renderers/parts/samplers/visual/parts/sink.ts +38 -0
  55. package/s/timeline/renderers/parts/samplers/visual/parts/transition.ts +28 -0
  56. package/s/timeline/renderers/parts/samplers/visual/parts/types.ts +10 -0
  57. package/s/timeline/renderers/parts/samplers/visual/sampler.ts +28 -0
  58. package/s/timeline/renderers/parts/schedulers.ts +96 -0
  59. package/s/timeline/renderers/player/parts/playback.ts +159 -0
  60. package/s/timeline/renderers/player/player.ts +77 -0
  61. package/s/timeline/renderers/renderers.test.ts +385 -0
  62. package/s/timeline/sugar/helpers.ts +190 -0
  63. package/s/timeline/sugar/o.ts +271 -59
  64. package/s/timeline/sugar/omni.test.ts +210 -0
  65. package/s/timeline/sugar/omni.ts +35 -12
  66. package/s/timeline/types.ts +28 -3
  67. package/s/timeline/utils/anim.ts +71 -0
  68. package/s/timeline/utils/checksum.ts +3 -1
  69. package/s/timeline/utils/datafile.ts +15 -4
  70. package/s/timeline/utils/dummy-data.ts +3 -3
  71. package/s/timeline/utils/matrix.ts +21 -0
  72. package/s/timeline/utils/terps.ts +81 -0
  73. package/s/units/fps.ts +8 -0
  74. package/s/units/ms.ts +8 -0
  75. package/s/units/seconds.ts +8 -0
  76. package/x/WebGLRenderer-4CHIZDHY.js +2 -0
  77. package/x/WebGLRenderer-4CHIZDHY.js.map +7 -0
  78. package/x/WebGPURenderer-O6WXU2QR.js +2 -0
  79. package/x/WebGPURenderer-O6WXU2QR.js.map +7 -0
  80. package/x/browserAll-WNIOTNNP.js +2 -0
  81. package/x/browserAll-WNIOTNNP.js.map +7 -0
  82. package/x/chunk-23FOBGX6.js +2 -0
  83. package/x/chunk-23FOBGX6.js.map +7 -0
  84. package/x/chunk-73XOWA4F.js +393 -0
  85. package/x/chunk-73XOWA4F.js.map +7 -0
  86. package/x/chunk-IAWJKNX5.js +42 -0
  87. package/x/chunk-IAWJKNX5.js.map +7 -0
  88. package/x/chunk-KCMVLWBS.js +157 -0
  89. package/x/chunk-KCMVLWBS.js.map +7 -0
  90. package/x/chunk-MR32SQ27.js +2 -0
  91. package/x/chunk-MR32SQ27.js.map +7 -0
  92. package/x/chunk-VCUJJYRJ.js +327 -0
  93. package/x/chunk-VCUJJYRJ.js.map +7 -0
  94. package/x/chunk-XNIZ4L5W.js +269 -0
  95. package/x/chunk-XNIZ4L5W.js.map +7 -0
  96. package/x/chunk-ZLGNQFUI.js +15 -0
  97. package/x/chunk-ZLGNQFUI.js.map +7 -0
  98. package/x/context.d.ts +1 -4
  99. package/x/context.js +1 -5
  100. package/x/context.js.map +1 -1
  101. package/x/demo/WebGLRenderer-RSJAHIG2.js +2 -0
  102. package/x/demo/WebGLRenderer-RSJAHIG2.js.map +7 -0
  103. package/x/demo/WebGPURenderer-MGFAJCYY.js +2 -0
  104. package/x/demo/WebGPURenderer-MGFAJCYY.js.map +7 -0
  105. package/x/demo/browserAll-PTRBXBRP.js +2 -0
  106. package/x/demo/browserAll-PTRBXBRP.js.map +7 -0
  107. package/x/demo/chunk-CUYOGHWU.js +42 -0
  108. package/x/demo/chunk-CUYOGHWU.js.map +7 -0
  109. package/x/demo/chunk-DGTDNJ7W.js +2 -0
  110. package/x/demo/chunk-DGTDNJ7W.js.map +7 -0
  111. package/x/demo/chunk-FZ5BYF63.js +15 -0
  112. package/x/demo/chunk-FZ5BYF63.js.map +7 -0
  113. package/x/demo/chunk-KWN4NNES.js +269 -0
  114. package/x/demo/chunk-KWN4NNES.js.map +7 -0
  115. package/x/demo/chunk-OJ3FPXW7.js +157 -0
  116. package/x/demo/chunk-OJ3FPXW7.js.map +7 -0
  117. package/x/demo/chunk-PSLUOGTZ.js +393 -0
  118. package/x/demo/chunk-PSLUOGTZ.js.map +7 -0
  119. package/x/demo/chunk-VLCVEIFU.js +327 -0
  120. package/x/demo/chunk-VLCVEIFU.js.map +7 -0
  121. package/x/demo/chunk-ZWCPT5FR.js +2 -0
  122. package/x/demo/chunk-ZWCPT5FR.js.map +7 -0
  123. package/x/demo/demo.bundle.js +94 -40
  124. package/x/demo/demo.bundle.js.map +1 -1
  125. package/x/demo/demo.bundle.min.js +7340 -90
  126. package/x/demo/demo.bundle.min.js.map +4 -4
  127. package/x/demo/demo.css +244 -14
  128. package/x/demo/routines/export-test.d.ts +2 -0
  129. package/x/demo/routines/export-test.js +10 -0
  130. package/x/demo/routines/export-test.js.map +1 -0
  131. package/x/demo/routines/filmstrip-test.d.ts +1 -1
  132. package/x/demo/routines/filmstrip-test.js +20 -17
  133. package/x/demo/routines/filmstrip-test.js.map +1 -1
  134. package/x/demo/routines/load-video.d.ts +1 -1
  135. package/x/demo/routines/load-video.js +1 -2
  136. package/x/demo/routines/load-video.js.map +1 -1
  137. package/x/demo/routines/playback-test.d.ts +2 -0
  138. package/x/demo/routines/playback-test.js +51 -0
  139. package/x/demo/routines/playback-test.js.map +1 -0
  140. package/x/demo/routines/timeline-setup.d.ts +6 -0
  141. package/x/demo/routines/timeline-setup.js +32 -0
  142. package/x/demo/routines/timeline-setup.js.map +1 -0
  143. package/x/demo/routines/transcode-test.js +15 -5
  144. package/x/demo/routines/transcode-test.js.map +1 -1
  145. package/x/demo/routines/transitions-test.js +2 -2
  146. package/x/demo/routines/transitions-test.js.map +1 -1
  147. package/x/demo/routines/waveform-test.d.ts +2 -1
  148. package/x/demo/routines/waveform-test.js +29 -8
  149. package/x/demo/routines/waveform-test.js.map +1 -1
  150. package/x/demo/webworkerAll-JENRT6BT.js +2 -0
  151. package/x/demo/webworkerAll-JENRT6BT.js.map +7 -0
  152. package/x/driver/driver-worker.d.ts +1 -0
  153. package/x/driver/driver-worker.js +6 -0
  154. package/x/driver/driver-worker.js.map +1 -0
  155. package/x/driver/driver.d.ts +25 -8
  156. package/x/driver/driver.js +43 -39
  157. package/x/driver/driver.js.map +1 -1
  158. package/x/driver/driver.test.js +1 -1
  159. package/x/driver/driver.test.js.map +1 -1
  160. package/x/driver/driver.worker.bundle.min.js +117 -3506
  161. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  162. package/x/driver/fns/host.d.ts +3 -2
  163. package/x/driver/fns/schematic.d.ts +25 -4
  164. package/x/driver/fns/work.d.ts +4 -4
  165. package/x/driver/fns/work.js +55 -155
  166. package/x/driver/fns/work.js.map +1 -1
  167. package/x/driver/parts/compositor.d.ts +39 -0
  168. package/x/driver/parts/compositor.js +261 -0
  169. package/x/driver/parts/compositor.js.map +1 -0
  170. package/x/driver/parts/machina.d.ts +0 -20
  171. package/x/driver/parts/machina.js +6 -10
  172. package/x/driver/parts/machina.js.map +1 -1
  173. package/x/driver/utils/find-pixi-filter.d.ts +5 -0
  174. package/x/driver/utils/find-pixi-filter.js +13 -0
  175. package/x/driver/utils/find-pixi-filter.js.map +1 -0
  176. package/x/features/speech/transcribe/parts/prep-audio.d.ts +1 -1
  177. package/x/features/speech/transcribe/worker.bundle.min.js +899 -899
  178. package/x/features/speech/transcribe/worker.bundle.min.js.map +4 -4
  179. package/x/index.d.ts +1 -0
  180. package/x/index.html +347 -38
  181. package/x/index.html.js +103 -24
  182. package/x/index.html.js.map +1 -1
  183. package/x/index.js +1 -0
  184. package/x/index.js.map +1 -1
  185. package/x/tests.bundle.js +8 -0
  186. package/x/tests.bundle.js.map +1 -0
  187. package/x/tests.bundle.min.js +7374 -0
  188. package/x/tests.bundle.min.js.map +7 -0
  189. package/x/tests.html +316 -0
  190. package/x/tests.html.d.ts +2 -0
  191. package/x/tests.html.js +22 -0
  192. package/x/tests.html.js.map +1 -0
  193. package/x/timeline/index.d.ts +7 -1
  194. package/x/timeline/index.js +7 -1
  195. package/x/timeline/index.js.map +1 -1
  196. package/x/timeline/parts/animations.d.ts +105 -0
  197. package/x/timeline/parts/animations.js +28 -0
  198. package/x/timeline/parts/animations.js.map +1 -0
  199. package/x/timeline/parts/filmstrip.d.ts +4 -3
  200. package/x/timeline/parts/filmstrip.js +29 -10
  201. package/x/timeline/parts/filmstrip.js.map +1 -1
  202. package/x/timeline/parts/filters.d.ts +108 -0
  203. package/x/timeline/parts/filters.js +340 -0
  204. package/x/timeline/parts/filters.js.map +1 -0
  205. package/x/timeline/parts/item.d.ts +56 -4
  206. package/x/timeline/parts/item.js +5 -1
  207. package/x/timeline/parts/item.js.map +1 -1
  208. package/x/timeline/parts/media.d.ts +2 -0
  209. package/x/timeline/parts/media.js +11 -2
  210. package/x/timeline/parts/media.js.map +1 -1
  211. package/x/timeline/parts/resource-pool.d.ts +3 -0
  212. package/x/timeline/parts/resource-pool.js +7 -4
  213. package/x/timeline/parts/resource-pool.js.map +1 -1
  214. package/x/timeline/parts/resource.d.ts +3 -0
  215. package/x/timeline/parts/waveform/parts/collect.d.ts +11 -0
  216. package/x/timeline/parts/waveform/parts/collect.js +56 -0
  217. package/x/timeline/parts/waveform/parts/collect.js.map +1 -0
  218. package/x/timeline/parts/waveform/parts/render.d.ts +5 -0
  219. package/x/timeline/parts/waveform/parts/render.js +29 -0
  220. package/x/timeline/parts/waveform/parts/render.js.map +1 -0
  221. package/x/timeline/parts/waveform/parts/types.d.ts +21 -0
  222. package/x/timeline/parts/waveform/parts/types.js.map +1 -0
  223. package/x/timeline/parts/waveform/waveform.d.ts +19 -0
  224. package/x/timeline/parts/waveform/waveform.js +133 -0
  225. package/x/timeline/parts/waveform/waveform.js.map +1 -0
  226. package/x/timeline/renderers/export/parts/audio-gain.d.ts +1 -0
  227. package/x/timeline/renderers/export/parts/audio-gain.js +13 -0
  228. package/x/timeline/renderers/export/parts/audio-gain.js.map +1 -0
  229. package/x/timeline/renderers/export/parts/audio-mix.d.ts +21 -0
  230. package/x/timeline/renderers/export/parts/audio-mix.js +89 -0
  231. package/x/timeline/renderers/export/parts/audio-mix.js.map +1 -0
  232. package/x/timeline/renderers/export/parts/cursor.d.ts +18 -0
  233. package/x/timeline/renderers/export/parts/cursor.js +99 -0
  234. package/x/timeline/renderers/export/parts/cursor.js.map +1 -0
  235. package/x/timeline/renderers/export/parts/produce-audio.d.ts +6 -0
  236. package/x/timeline/renderers/export/parts/produce-audio.js +41 -0
  237. package/x/timeline/renderers/export/parts/produce-audio.js.map +1 -0
  238. package/x/timeline/renderers/export/parts/produce-video.d.ts +10 -0
  239. package/x/timeline/renderers/export/parts/produce-video.js +26 -0
  240. package/x/timeline/renderers/export/parts/produce-video.js.map +1 -0
  241. package/x/timeline/renderers/export/parts/resamplers.d.ts +12 -0
  242. package/x/timeline/renderers/export/parts/resamplers.js +29 -0
  243. package/x/timeline/renderers/export/parts/resamplers.js.map +1 -0
  244. package/x/timeline/renderers/export/produce.d.ts +13 -0
  245. package/x/timeline/renderers/export/produce.js +15 -0
  246. package/x/timeline/renderers/export/produce.js.map +1 -0
  247. package/x/timeline/renderers/parts/handy.d.ts +36 -0
  248. package/x/timeline/renderers/parts/handy.js +221 -0
  249. package/x/timeline/renderers/parts/handy.js.map +1 -0
  250. package/x/timeline/renderers/parts/samplers/audio/parts/find.d.ts +6 -0
  251. package/x/timeline/renderers/parts/samplers/audio/parts/find.js +15 -0
  252. package/x/timeline/renderers/parts/samplers/audio/parts/find.js.map +1 -0
  253. package/x/timeline/renderers/parts/samplers/audio/parts/init.d.ts +5 -0
  254. package/x/timeline/renderers/parts/samplers/audio/parts/init.js +40 -0
  255. package/x/timeline/renderers/parts/samplers/audio/parts/init.js.map +1 -0
  256. package/x/timeline/renderers/parts/samplers/audio/parts/sink.d.ts +8 -0
  257. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js +24 -0
  258. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js.map +1 -0
  259. package/x/timeline/renderers/parts/samplers/audio/parts/types.d.ts +14 -0
  260. package/x/timeline/renderers/parts/samplers/audio/parts/types.js +2 -0
  261. package/x/timeline/renderers/parts/samplers/audio/parts/types.js.map +1 -0
  262. package/x/timeline/renderers/parts/samplers/audio/sampler.d.ts +11 -0
  263. package/x/timeline/renderers/parts/samplers/audio/sampler.js +22 -0
  264. package/x/timeline/renderers/parts/samplers/audio/sampler.js.map +1 -0
  265. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.d.ts +5 -0
  266. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js +10 -0
  267. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js.map +1 -0
  268. package/x/timeline/renderers/parts/samplers/visual/parts/sample.d.ts +6 -0
  269. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js +48 -0
  270. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js.map +1 -0
  271. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.d.ts +6 -0
  272. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js +75 -0
  273. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js.map +1 -0
  274. package/x/timeline/renderers/parts/samplers/visual/parts/sink.d.ts +8 -0
  275. package/x/timeline/renderers/parts/samplers/visual/parts/sink.js +24 -0
  276. package/x/timeline/renderers/parts/samplers/visual/parts/sink.js.map +1 -0
  277. package/x/timeline/renderers/parts/samplers/visual/parts/transition.d.ts +3 -0
  278. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js +18 -0
  279. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js.map +1 -0
  280. package/x/timeline/renderers/parts/samplers/visual/parts/types.d.ts +8 -0
  281. package/x/timeline/renderers/parts/samplers/visual/parts/types.js +2 -0
  282. package/x/timeline/renderers/parts/samplers/visual/parts/types.js.map +1 -0
  283. package/x/timeline/renderers/parts/samplers/visual/sampler.d.ts +7 -0
  284. package/x/timeline/renderers/parts/samplers/visual/sampler.js +17 -0
  285. package/x/timeline/renderers/parts/samplers/visual/sampler.js.map +1 -0
  286. package/x/timeline/renderers/parts/schedulers.d.ts +17 -0
  287. package/x/timeline/renderers/parts/schedulers.js +64 -0
  288. package/x/timeline/renderers/parts/schedulers.js.map +1 -0
  289. package/x/timeline/renderers/player/parts/playback.d.ts +36 -0
  290. package/x/timeline/renderers/player/parts/playback.js +113 -0
  291. package/x/timeline/renderers/player/parts/playback.js.map +1 -0
  292. package/x/timeline/renderers/player/player.d.ts +25 -0
  293. package/x/timeline/renderers/player/player.js +56 -0
  294. package/x/timeline/renderers/player/player.js.map +1 -0
  295. package/x/timeline/renderers/renderers.test.d.ts +32 -0
  296. package/x/timeline/renderers/renderers.test.js +305 -0
  297. package/x/timeline/renderers/renderers.test.js.map +1 -0
  298. package/x/timeline/sugar/helpers.d.ts +56 -0
  299. package/x/timeline/sugar/helpers.js +104 -0
  300. package/x/timeline/sugar/helpers.js.map +1 -0
  301. package/x/timeline/sugar/o.d.ts +48 -14
  302. package/x/timeline/sugar/o.js +213 -54
  303. package/x/timeline/sugar/o.js.map +1 -1
  304. package/x/timeline/sugar/omni.d.ts +11 -6
  305. package/x/timeline/sugar/omni.js +28 -8
  306. package/x/timeline/sugar/omni.js.map +1 -1
  307. package/x/timeline/sugar/omni.test.d.ts +27 -0
  308. package/x/timeline/sugar/omni.test.js +128 -0
  309. package/x/timeline/sugar/omni.test.js.map +1 -0
  310. package/x/timeline/types.d.ts +12 -2
  311. package/x/timeline/utils/anim.d.ts +5 -0
  312. package/x/timeline/utils/anim.js +44 -0
  313. package/x/timeline/utils/anim.js.map +1 -0
  314. package/x/timeline/utils/checksum.d.ts +3 -2
  315. package/x/timeline/utils/checksum.js.map +1 -1
  316. package/x/timeline/utils/datafile.d.ts +5 -3
  317. package/x/timeline/utils/datafile.js +18 -5
  318. package/x/timeline/utils/datafile.js.map +1 -1
  319. package/x/timeline/utils/dummy-data.d.ts +1 -2
  320. package/x/timeline/utils/dummy-data.js +4 -2
  321. package/x/timeline/utils/dummy-data.js.map +1 -1
  322. package/x/timeline/utils/matrix.d.ts +9 -0
  323. package/x/timeline/utils/matrix.js +10 -0
  324. package/x/timeline/utils/matrix.js.map +1 -1
  325. package/x/timeline/utils/terps.d.ts +11 -0
  326. package/x/timeline/utils/terps.js +57 -0
  327. package/x/timeline/utils/terps.js.map +1 -0
  328. package/x/units/fps.d.ts +6 -0
  329. package/x/units/fps.js +2 -0
  330. package/x/units/fps.js.map +1 -0
  331. package/x/units/ms.d.ts +6 -0
  332. package/x/units/ms.js +2 -0
  333. package/x/units/ms.js.map +1 -0
  334. package/x/units/seconds.d.ts +6 -0
  335. package/x/units/seconds.js +2 -0
  336. package/x/units/seconds.js.map +1 -0
  337. package/x/webworkerAll-RLCTMSDD.js +2 -0
  338. package/x/webworkerAll-RLCTMSDD.js.map +7 -0
  339. package/s/tests.test.ts +0 -8
  340. package/s/timeline/parts/compositor/export.ts +0 -77
  341. package/s/timeline/parts/compositor/parts/html-tree.ts +0 -37
  342. package/s/timeline/parts/compositor/parts/schedulers.ts +0 -85
  343. package/s/timeline/parts/compositor/parts/tree-builder.ts +0 -184
  344. package/s/timeline/parts/compositor/parts/webcodecs-tree.ts +0 -30
  345. package/s/timeline/parts/compositor/playback.ts +0 -81
  346. package/s/timeline/parts/compositor/samplers/html.ts +0 -115
  347. package/s/timeline/parts/compositor/samplers/webcodecs.ts +0 -60
  348. package/s/timeline/parts/waveform.ts +0 -62
  349. package/s/timeline/sugar/builders.ts +0 -102
  350. package/s/timeline/sugar/omni-test.ts +0 -38
  351. package/s/timeline/timeline.ts +0 -22
  352. package/s/timeline/utils/audio-stream.ts +0 -15
  353. package/s/timeline/utils/video-cursor.ts +0 -40
  354. package/s/tools/common/loader.ts +0 -26
  355. package/s/tools/common/transformer-pipeline.ts +0 -26
  356. package/s/tools/speech-recognition/common/model.ts +0 -26
  357. package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
  358. package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
  359. package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
  360. package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
  361. package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
  362. package/s/tools/speech-recognition/whisper/tool.ts +0 -70
  363. package/x/tests.test.js +0 -6
  364. package/x/tests.test.js.map +0 -1
  365. package/x/timeline/parts/compositor/export.d.ts +0 -9
  366. package/x/timeline/parts/compositor/export.js +0 -64
  367. package/x/timeline/parts/compositor/export.js.map +0 -1
  368. package/x/timeline/parts/compositor/parts/html-tree.d.ts +0 -3
  369. package/x/timeline/parts/compositor/parts/html-tree.js +0 -40
  370. package/x/timeline/parts/compositor/parts/html-tree.js.map +0 -1
  371. package/x/timeline/parts/compositor/parts/schedulers.d.ts +0 -15
  372. package/x/timeline/parts/compositor/parts/schedulers.js +0 -64
  373. package/x/timeline/parts/compositor/parts/schedulers.js.map +0 -1
  374. package/x/timeline/parts/compositor/parts/tree-builder.d.ts +0 -37
  375. package/x/timeline/parts/compositor/parts/tree-builder.js +0 -147
  376. package/x/timeline/parts/compositor/parts/tree-builder.js.map +0 -1
  377. package/x/timeline/parts/compositor/parts/webcodecs-tree.d.ts +0 -3
  378. package/x/timeline/parts/compositor/parts/webcodecs-tree.js +0 -28
  379. package/x/timeline/parts/compositor/parts/webcodecs-tree.js.map +0 -1
  380. package/x/timeline/parts/compositor/playback.d.ts +0 -19
  381. package/x/timeline/parts/compositor/playback.js +0 -71
  382. package/x/timeline/parts/compositor/playback.js.map +0 -1
  383. package/x/timeline/parts/compositor/samplers/html.d.ts +0 -3
  384. package/x/timeline/parts/compositor/samplers/html.js +0 -106
  385. package/x/timeline/parts/compositor/samplers/html.js.map +0 -1
  386. package/x/timeline/parts/compositor/samplers/webcodecs.d.ts +0 -2
  387. package/x/timeline/parts/compositor/samplers/webcodecs.js +0 -55
  388. package/x/timeline/parts/compositor/samplers/webcodecs.js.map +0 -1
  389. package/x/timeline/parts/waveform.d.ts +0 -8
  390. package/x/timeline/parts/waveform.js +0 -51
  391. package/x/timeline/parts/waveform.js.map +0 -1
  392. package/x/timeline/sugar/builders.d.ts +0 -96
  393. package/x/timeline/sugar/builders.js +0 -108
  394. package/x/timeline/sugar/builders.js.map +0 -1
  395. package/x/timeline/sugar/omni-test.d.ts +0 -1
  396. package/x/timeline/sugar/omni-test.js +0 -22
  397. package/x/timeline/sugar/omni-test.js.map +0 -1
  398. package/x/timeline/timeline.d.ts +0 -9
  399. package/x/timeline/timeline.js +0 -22
  400. package/x/timeline/timeline.js.map +0 -1
  401. package/x/timeline/utils/audio-stream.d.ts +0 -6
  402. package/x/timeline/utils/audio-stream.js +0 -17
  403. package/x/timeline/utils/audio-stream.js.map +0 -1
  404. package/x/timeline/utils/video-cursor.d.ts +0 -10
  405. package/x/timeline/utils/video-cursor.js +0 -36
  406. package/x/timeline/utils/video-cursor.js.map +0 -1
  407. package/x/tools/common/loader.d.ts +0 -19
  408. package/x/tools/common/loader.js +0 -18
  409. package/x/tools/common/loader.js.map +0 -1
  410. package/x/tools/common/transformer-pipeline.d.ts +0 -8
  411. package/x/tools/common/transformer-pipeline.js +0 -24
  412. package/x/tools/common/transformer-pipeline.js.map +0 -1
  413. package/x/tools/speech-recognition/common/model.d.ts +0 -14
  414. package/x/tools/speech-recognition/common/model.js +0 -16
  415. package/x/tools/speech-recognition/common/model.js.map +0 -1
  416. package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
  417. package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
  418. package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
  419. package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
  420. package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
  421. package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
  422. package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
  423. package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
  424. package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
  425. package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
  426. package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
  427. package/x/tools/speech-recognition/whisper/parts/worker.bundle.d.ts +0 -1
  428. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
  429. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
  430. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
  431. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
  432. package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
  433. package/x/tools/speech-recognition/whisper/tool.js +0 -63
  434. package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
  435. /package/x/{tests.test.d.ts → tests.bundle.d.ts} +0 -0
  436. /package/x/{tools/speech-recognition/whisper → timeline/parts/waveform}/parts/types.js +0 -0
package/README.md CHANGED
@@ -1,120 +1,337 @@
1
1
 
2
2
  # 🚧 Work In Progress
3
3
 
4
- > **Note:** Omni Tools is under development. Expect breaking changes, evolving APIs, and experimental features.
4
+ > **Note:** Omnitool is under development. Expect breaking changes, evolving APIs, and experimental features.
5
5
 
6
6
  ---
7
7
 
8
- # 🎬 Omnitool
8
+ ## What this library is
9
9
 
10
- > Code-first video editing toolkit behind [Omniclip](https://omniclip.app) — build timelines, render videos, and automate workflows.
10
+ - API for building and rendering timelines in the browser
11
+ - Uses WebCodecs, Web Workers, and the File System Access API for export
12
+ - usage is currently JavaScript/TypeScript only, cli soon
11
13
 
12
- ---
14
+ ## 🚀 Install
13
15
 
14
- ## 🧱 Modular by Design
16
+ ```bash
17
+ npm i @omnimedia/omnitool
18
+ ```
15
19
 
16
- Omni Tools is a collection of composable utilities for working with Omniclip timelines — via code, JSON, or CLI.
20
+ ## 📦 Quick Start
17
21
 
18
- - Define timelines in JSON or TypeScript
19
- - ✅ Automate rendering with CLI tools
20
- - ✅ Ideal for scripting, CI/CD, and AI-generated workflows
22
+ #### Declaring the timeline
21
23
 
22
- ---
23
-
24
- ## 🚀 Quick Start
24
+ ```ts
25
+ import {Driver, Omni, Datafile} from "@omnimedia/omnitool"
26
+
27
+ const driver = await Driver.setup()
28
+ const omni = new Omni(driver)
29
+
30
+ const {clip} = await omni.load({
31
+ clip: Datafile.make(file) // file is a File or Blob
32
+ })
33
+
34
+ const timeline = omni.timeline(o => {
35
+ const caption = o.text("Hello world", {
36
+ duration: 1500,
37
+ styles: {fill: "white", fontSize: 48}
38
+ })
39
+ const xfade = o.transition.crossfade(500)
40
+ const softened = o.filter.blur.make({strength: 8, quality: 4})
41
+
42
+ return o.sequence(
43
+ o.stack(
44
+ o.video(clip, {start: 0, duration: 3000, filterIds: [softened.id]}),
45
+ caption
46
+ ),
47
+ o.gap(400),
48
+ xfade,
49
+ o.video(clip, {start: 5000, duration: 2500}),
50
+ o.audio(clip, {start: 5000, duration: 2500})
51
+ )
52
+ })
53
+ ```
25
54
 
26
- ### Install
55
+ Declarative helper style (no explicit `o` in timeline declarations):
27
56
 
28
- ```bash
29
- npm i @omnimedia/omnitool
57
+ ```ts
58
+ import {
59
+ Driver, Omni, Datafile,
60
+ timeline, stack, video, audio, text, gap, transition, filter
61
+ } from "@omnimedia/omnitool"
62
+
63
+ const driver = await Driver.setup()
64
+ const omni = new Omni(driver)
65
+ const {clip} = await omni.load({clip: Datafile.make(file)})
66
+
67
+ const timeline = timeline(
68
+ stack(
69
+ filter.blur(
70
+ video(clip, {start: 0, duration: 3000}),
71
+ {strength: 8, quality: 4}
72
+ ),
73
+ text("Hello world", {duration: 1500}),
74
+ ),
75
+ gap(400),
76
+ transition.crossfade(500),
77
+ video(clip, {start: 5000, duration: 2500}),
78
+ audio(clip, {start: 5000, duration: 2500})
79
+ )
30
80
  ```
31
81
 
32
- ---
82
+ ## 🎛 Filters
33
83
 
34
- ## 📦 Example (Programmatic Timeline)
84
+ Filter application:
35
85
 
36
86
  ```ts
37
- import { subtitle, crossfade, sequence, stack, video } from "@omni/tools"
38
-
39
- const watermark = subtitle("omniclip")
40
- const xfade = crossfade(500)
41
-
42
- const timeline = sequence(
43
- video("opening-credits.mp4"),
44
- xfade,
45
- stack(
46
- video("skateboarding.mp4"),
47
- watermark
48
- ),
49
- xfade,
50
- stack(
51
- video("biking.mp4"),
52
- watermark
53
- )
87
+ const timeline = omni.timeline(o =>
88
+ o.stack(
89
+ o.filter.blur(
90
+ o.video(clip, {duration: 3000}),
91
+ {strength: 8, quality: 4}
92
+ ),
93
+ o.filter.glow(
94
+ o.text("Hello world", {duration: 3000}),
95
+ {distance: 12, outerStrength: 2, color: "#ffffff"}
96
+ )
97
+ )
54
98
  )
55
-
56
99
  ```
57
100
 
58
- ---
101
+ Reusable filter items:
59
102
 
60
- ## 🧩 Timeline Format (Omni Timeline Format)
103
+ ```ts
104
+ const timeline = omni.timeline(o => {
105
+ const blur = o.filter.blur.make({strength: 8, quality: 4})
106
+
107
+ return o.stack(
108
+ o.video(clip, {duration: 3000, filterIds: [blur.id]}),
109
+ o.text("Caption", {duration: 3000, styles: {fill: "white"}})
110
+ )
111
+ })
112
+ ```
61
113
 
62
- Every timeline is defined as a graph:
114
+ Filter metadata for UI:
63
115
 
64
- ```json
65
- {
66
- "format": "omni-timeline@1",
67
- "root": "root-1",
68
- "items": [
69
- ["root-1", ["sequence", { "children": ["video-1", "stack-1"] }]],
70
- ["video-1", ["video", { ... }]],
71
- ["stack-1", ["stack", { "children": ["text-1", "audio-1"] }]],
72
- ["text-1", ["text", { ... }]],
73
- ["audio-1", ["audio", { ... }]]
74
- ]
75
- }
116
+ ```ts
117
+ import {
118
+ filters
119
+ } from "@omnimedia/omnitool"
120
+
121
+ const available = Object.entries(filters)
122
+ const blur = filters.blur
123
+ const schema = blur.schema
76
124
  ```
77
125
 
78
- Each item is a `[id, item]` pair. Items can reference others by ID, forming a directed graph of reusable, composable blocks.
126
+ ## 🧭 Spatial Transforms
79
127
 
80
- ---
128
+ ```ts
129
+ const timeline = omni.timeline(o => {
130
+ const move = o.spatial(o.transform({
131
+ position: [120, 40],
132
+ scale: [0.6, 0.6],
133
+ rotation: 0.2
134
+ }))
135
+
136
+ const title = o.text("Lower third", {
137
+ duration: 2000,
138
+ styles: {fill: "white", fontSize: 36}
139
+ })
140
+ o.set(title.id, {spatialId: move.id})
141
+
142
+ return o.stack(
143
+ o.video(clip, {duration: 4000}),
144
+ title
145
+ )
146
+ })
147
+ ```
81
148
 
82
- ## 🖥 CLI Usage
149
+ Animated spatial transforms:
83
150
 
84
- ```bash
85
- # Build a timeline (manually or via AI)
86
- omnitool build-template promo.json
151
+ ```ts
152
+ const timeline = omni.timeline(o => {
153
+ const slideIn = o.animatedSpatial(
154
+ o.anim.transform("linear", [
155
+ [0, o.transform({position: [-400, 0]})],
156
+ [1000, o.transform({position: [0, 0]})],
157
+ ])
158
+ )
159
+
160
+ const title = o.text("Lower third", {
161
+ duration: 2000,
162
+ styles: {fill: "white", fontSize: 36}
163
+ })
164
+ o.set(title.id, {spatialId: slideIn.id})
165
+
166
+ return o.stack(
167
+ o.video(clip, {duration: 4000}),
168
+ title
169
+ )
170
+ })
171
+ ```
87
172
 
88
- # Validate structure
89
- omnitool validate promo.json
173
+ Animation application:
90
174
 
91
- # Render video
92
- omnitool export promo.json --output final.mp4
175
+ ```ts
176
+ const timeline = omni.timeline(o => {
177
+ const title = o.animate.opacity(
178
+ o.text("Lower third", {
179
+ duration: 2000,
180
+ styles: {fill: "white", fontSize: 36},
181
+ }),
182
+ "easeIn",
183
+ [
184
+ [0, 0],
185
+ [700, 1],
186
+ ]
187
+ )
188
+
189
+ return o.stack(
190
+ o.video(clip, {duration: 4000}),
191
+ title
192
+ )
193
+ })
194
+ ```
93
195
 
94
- # Batch render
95
- omnitool batch-export ./projects/* --output-dir ./exports
196
+ Reusable animation:
197
+
198
+ ```ts
199
+ const timeline = omni.timeline(o => {
200
+ const fadeIn = o.animate.opacity.make("easeIn", [
201
+ [0, 0],
202
+ [700, 1],
203
+ ])
204
+
205
+ const title = o.text("Lower third", {
206
+ duration: 2000,
207
+ styles: {fill: "white", fontSize: 36},
208
+ })
209
+ o.set(title.id, {animationId: fadeIn.id})
210
+
211
+ return o.stack(
212
+ o.video(clip, {duration: 4000}),
213
+ title
214
+ )
215
+ })
96
216
  ```
97
217
 
98
- ---
218
+ Animation registry:
99
219
 
100
- ## ✅ Use Cases
220
+ ```ts
221
+ import {animations} from "@omnimedia/omnitool"
101
222
 
102
- - Render videos from scripts, templates, or AI
103
- - Build and test timelines without opening the UI
104
- - Generate video pipelines from code or prompts
223
+ Object.entries(animations).forEach(([property, meta]) => {
224
+ console.log(property, meta.type, meta.defaultTerp, meta.channels)
225
+ // transform transform linear [...]
226
+ // opacity scalar linear [...]
227
+ })
228
+ ```
105
229
 
106
- ---
230
+ Each animation definition describes the semantic shape of the animation: its value kind, default interpolation, and numeric channels with defaults and units. This is useful for tools that need to create valid keyframes without hardcoding Omnitool's track layout.
107
231
 
108
- ## 📘 More to come
232
+ Worker URL notes:
233
+ - `Driver.setup()` defaults to `/node_modules/@omnimedia/omnitool/x/driver/driver.worker.bundle.min.js`.
234
+ - If you serve the worker from a different location, pass `workerUrl`:
109
235
 
110
- - `omnitool preview` – headless timeline viewer
111
- - `omnitool optimize` auto-fit timeline elements
112
- - `omnitool ai` – native prompt-to-timeline generation
236
+ ```ts
237
+ const workerUrl = new URL(
238
+ "/path/to/driver.worker.bundle.min.js",
239
+ window.location.href
240
+ )
241
+ const driver = await Driver.setup({workerUrl})
242
+ ```
113
243
 
114
- ---
244
+ ## ▶️ Playback
245
+
246
+ ```ts
247
+ const player = await omni.playback(timeline)
248
+
249
+ document.body.appendChild(player.canvas)
250
+ player.play()
251
+ ```
252
+
253
+ Notes:
254
+ - Call `player.update(timeline)` if you update the timeline.
255
+
256
+ ## 📤 Export
257
+
258
+ ```ts
259
+ await omni.render(timeline, framerate)
260
+ ```
261
+
262
+ ## 🧩 Timeline Format (TimelineFile)
115
263
 
116
- ## 🧠 Learn More
264
+ All durations and timestamps are in milliseconds.
117
265
 
118
- Omni Tools powers AI agents, programmatic editing, and upcoming new version of omniclip video editor.
266
+ ```json
267
+ {
268
+ "format": "timeline",
269
+ "info": "https://omniclip.app/",
270
+ "version": 0,
271
+ "rootId": 123,
272
+ "items": [
273
+ {"id": 123, "kind": 0, "childrenIds": [456, 789]},
274
+ {"id": 456, "kind": 2, "mediaHash": "...", "start": 0, "duration": 3000},
275
+ {"id": 789, "kind": 4, "content": "Hello", "duration": 1500}
276
+ ]
277
+ }
278
+ ```
279
+
280
+ Timeline items:
281
+ - 0 `Sequence`
282
+ - 1 `Stack`
283
+ - 2 `Video`
284
+ - 3 `Audio`
285
+ - 4 `Text`
286
+ - 5 `Gap`
287
+ - 6 `Spatial`
288
+ - 7 `Transition`
289
+ - 8 `TextStyle`
290
+ - 9 `Filter`
291
+
292
+ ## 🗺️ Roadmap
293
+ - CLI commands:
294
+
295
+ ```bash
296
+ # build a reusable template from a timeline
297
+ omnitool build-template promo.json
298
+ # validate a timeline file
299
+ omnitool validate promo.json
300
+ # export a timeline to a video file
301
+ omnitool export promo.json --output final.mp4
302
+ # batch export multiple timelines
303
+ omnitool batch-export ./projects/* --output-dir ./exports
304
+ # headless timeline viewer
305
+ omnitool preview promo.json
306
+ # auto-fit timeline elements
307
+ omnitool optimize promo.json
308
+ # prompt-to-timeline generation
309
+ omnitool ai "make a 15s promo for tea"
310
+ ```
311
+
312
+ - smooth seeking
313
+ - keyframes
314
+ - custom filters, likely via driver-side registration with timeline sugar such as:
315
+
316
+ ```ts
317
+ // Register custom filter
318
+ driver.registerFilter({
319
+ type: "vhs",
320
+ make: params => new Filter(/* ... */),
321
+ schema: {
322
+ intensity: {type: "number", min: 0, max: 1, default: 0.5},
323
+ scanlines: {type: "boolean", default: true},
324
+ },
325
+ })
326
+
327
+ // Use custom filter
328
+ const timeline = omni.timeline(o =>
329
+ o.filter.custom(
330
+ "vhs",
331
+ o.video(clip, {duration: 3000}),
332
+ {intensity: 0.8}
333
+ )
334
+ )
335
+ ```
119
336
 
120
- [Visit Omniclip](https://omniclip.app)
337
+ - server-side, not just browsers
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnimedia/omnitool",
3
- "version": "1.1.0-8",
3
+ "version": "1.1.0-80",
4
4
  "description": "open source video processing tools",
5
5
  "license": "MIT",
6
6
  "author": "Przemysław Gałęzki",
@@ -19,31 +19,33 @@
19
19
  "_ln-s": "ln -s \"$(realpath s)\" x/s",
20
20
  "_ln-assets": "ln -s \"$(realpath assets)\" x/assets",
21
21
  "_scute": "scute -v",
22
- "test": "node x/tests.test.js",
22
+ "test": "echo \"node tests disabled for now\"",
23
23
  "test-debug": "node inspect x/tests.test.js"
24
24
  },
25
25
  "devDependencies": {
26
- "@e280/science": "^0.0.6",
27
- "@e280/scute": "^0.0.0-7",
28
- "@types/node": "^24.2.0",
26
+ "@e280/science": "^0.1.4",
27
+ "@e280/scute": "^0.1.2",
28
+ "@types/node": "^25.0.3",
29
+ "@types/wicg-file-system-access": "^2023.10.7",
29
30
  "http-server": "^14.1.1",
30
31
  "npm-run-all": "^4.1.5",
31
- "typescript": "^5.9.2"
32
+ "typescript": "^5.9.3"
32
33
  },
33
34
  "dependencies": {
34
- "@benev/slate": "^0.3.9",
35
- "@e280/comrade": "^0.0.0-23",
36
- "@e280/renraku": "^0.5.0-29",
37
- "@e280/stz": "^0.0.0-34",
38
- "@huggingface/transformers": "^3.7.1",
35
+ "@e280/comrade": "^0.1.0",
36
+ "@e280/renraku": "^0.5.3",
37
+ "@e280/sly": "^0.2.5",
38
+ "@e280/strata": "^0.2.5",
39
+ "@e280/stz": "^0.2.15",
40
+ "@huggingface/transformers": "^3.8.1",
39
41
  "comrade": "^0.0.3",
40
42
  "gl-transitions": "^1.43.0",
41
- "gsap": "^3.13.0",
42
- "mediabunny": "^1.14.3",
43
- "mp4-muxer": "^5.2.1",
44
- "pixi.js": "^8.10.1",
45
- "wavesurfer.js": "^7.10.0",
46
- "web-demuxer": "^2.3.8"
43
+ "gsap": "^3.14.2",
44
+ "lit": "^3.3.2",
45
+ "mediabunny": "^1.27.3",
46
+ "pixi-filters": "^6.1.5",
47
+ "pixi.js": "^8.14.3",
48
+ "wavesurfer.js": "^7.12.1"
47
49
  },
48
50
  "homepage": "https://github.com/omni-media/omnitool#readme",
49
51
  "repository": {
package/s/context.ts CHANGED
@@ -1,7 +0,0 @@
1
- import {Driver} from "./driver/driver.js"
2
-
3
- const workerUrl = new URL("../driver/driver.worker.bundle.min.js", import.meta.url)
4
-
5
- export const context = {
6
- driver: Driver.setup({workerUrl})
7
- }
@@ -1,21 +1,22 @@
1
1
 
2
- import {context} from "../context.js"
2
+ import {Driver} from "../driver/driver.js"
3
+ import type {Omni, TimelineFile} from "../timeline/index.js"
4
+ import {playbackTest} from "./routines/playback-test.js"
3
5
  import {waveformTest} from "./routines/waveform-test.js"
6
+ import {TimelineSchemaTest } from "./routines/timeline-setup.js"
4
7
  import {filmstripTest} from "./routines/filmstrip-test.js"
5
- import {transcriberTest} from "./routines/transcriber-test.js"
6
8
  import {setupTranscodeTest} from "./routines/transcode-test.js"
7
9
 
8
- const driver = await context.driver
9
- const results = document.querySelector(".results")!
10
+ const driver = await Driver.setup({workerUrl: new URL("../driver/driver.worker.bundle.min.js", import.meta.url)})
10
11
 
11
- const fetchButton = document.querySelector(".fetch")
12
- const importButton = document.querySelector(".import") as HTMLButtonElement
12
+ const transcodeCard = document.querySelector("[data-demo='transcode']") as HTMLElement
13
+ const filmstripCard = document.querySelector("[data-demo='filmstrip']") as HTMLElement
14
+ const waveformCard = document.querySelector("[data-demo='waveform']") as HTMLElement
15
+ const playbackCard = document.querySelector("[data-demo='playback']") as HTMLElement
16
+ const exportCard = document.querySelector("[data-demo='export']") as HTMLElement
17
+ const exportButton = exportCard.querySelector("[data-action='export']") as HTMLButtonElement
13
18
 
14
- fetchButton?.addEventListener("click", startDemoFetch)
15
- importButton?.addEventListener("click", startDemoImport)
16
-
17
- waveformTest()
18
- const transcriber = await transcriberTest(driver)
19
+ let exportState: {timeline: TimelineFile; omni: Omni} | null = null
19
20
 
20
21
  // hello world test
21
22
  {
@@ -24,45 +25,105 @@ const transcriber = await transcriberTest(driver)
24
25
  else console.error("❌ FAIL driver call didn't work")
25
26
  }
26
27
 
27
- // transcoding tests
28
- async function startDemoImport()
29
- {
30
- const [fileHandle] = await window.showOpenFilePicker()
31
- const file = await fileHandle.getFile()
32
- const transcode = setupTranscodeTest(driver, file)
33
- await filmstripTest(file)
34
- run(transcode, fileHandle.name)
35
- await transcriber.transcribe(file)
36
- }
37
-
38
- async function startDemoFetch()
39
- {
28
+ const setProgress = (card: HTMLElement, state: "idle" | "running" | "done") => {
29
+ const progress = card.querySelector(".progress") as HTMLProgressElement | null
30
+ const status = card.querySelector(".status") as HTMLSpanElement | null
40
31
 
41
- // which videos to run tests on
42
- const videos = [
43
- "/assets/temp/gl.mp4",
44
- ]
32
+ if (!progress || !status)
33
+ return
45
34
 
46
- // running each test in sequence
47
- for (const url of videos) {
48
- const transcode = setupTranscodeTest(driver, "/assets/temp/gl.mp4")
49
- run(transcode, url)
35
+ if (state === "running") {
36
+ progress.removeAttribute("value")
37
+ status.textContent = "running"
38
+ } else if (state === "done") {
39
+ progress.value = 1
40
+ status.textContent = "done"
41
+ } else {
42
+ progress.value = 0
43
+ status.textContent = "idle"
50
44
  }
51
45
  }
52
46
 
53
- async function run(transcode: ReturnType<typeof setupTranscodeTest>, label: string) {
54
- // create result div
55
- const div = document.createElement("div")
56
- results.append(div)
47
+ const bindDemo = (
48
+ card: HTMLElement,
49
+ run: (file: File, card: HTMLElement) => Promise<void>
50
+ ) => {
51
+ const input = card.querySelector("input[type='file']") as HTMLInputElement
52
+ const button = card.querySelector("[data-action='run']") as HTMLButtonElement
57
53
 
58
- // add video label
59
- const p = document.createElement("p")
60
- p.textContent = label
61
- div.append(p)
54
+ button.disabled = true
55
+ input.addEventListener("input", () => {
56
+ button.disabled = !input.files?.length
57
+ })
62
58
 
63
- // add the canvas to dom
64
- div.append(transcode.canvas)
59
+ button.addEventListener("click", async () => {
60
+ const file = input.files?.[0]
61
+ if (!file)
62
+ return
65
63
 
66
- // run the test
64
+ button.disabled = true
65
+ setProgress(card, "running")
66
+ try {
67
+ await run(file, card)
68
+ setProgress(card, "done")
69
+ } finally {
70
+ button.disabled = false
71
+ }
72
+ })
73
+ }
74
+
75
+ bindDemo(transcodeCard, async (file, card) => {
76
+ const preview = card.querySelector(".demo-preview") as HTMLDivElement
77
+ const transcode = setupTranscodeTest(driver, file)
78
+ preview.replaceChildren(transcode.canvas)
67
79
  await transcode.run()
80
+ })
81
+
82
+ bindDemo(filmstripCard, async (file, card) => {
83
+ await filmstripTest(file, card)
84
+ })
85
+
86
+ bindDemo(waveformCard, async (file, card) => {
87
+ await waveformTest(driver, file, card)
88
+ })
89
+
90
+ {
91
+ const input = playbackCard.querySelector("input[type='file']") as HTMLInputElement
92
+ input.addEventListener("input", async () => {
93
+ const file = input.files?.[0]
94
+ if (!file)
95
+ return
96
+
97
+ const {timeline, omni} = await TimelineSchemaTest(driver, file)
98
+ await playbackTest(timeline, omni, playbackCard)
99
+ })
100
+ }
101
+
102
+ {
103
+ const input = exportCard.querySelector("input[type='file']") as HTMLInputElement
104
+ input.addEventListener("input", async () => {
105
+ const file = input.files?.[0]
106
+ if (!file)
107
+ return
108
+
109
+ setProgress(exportCard, "running")
110
+ const {timeline, omni} = await TimelineSchemaTest(driver, file)
111
+ exportState = {timeline, omni}
112
+ exportButton.disabled = false
113
+
114
+ const preview = exportCard.querySelector(".demo-preview") as HTMLDivElement
115
+ const player = await omni.playback(timeline)
116
+ await player.seek(0)
117
+ preview.replaceChildren(player.canvas)
118
+ setProgress(exportCard, "done")
119
+ })
68
120
  }
121
+
122
+ exportButton.addEventListener("click", async () => {
123
+ if (!exportState)
124
+ return
125
+
126
+ setProgress(exportCard, "running")
127
+ await exportState.omni.render(exportState.timeline)
128
+ setProgress(exportCard, "done")
129
+ })