{"_id":"movi-player","_rev":"28-97371a84ba04354f3027851dd5ce8a88","name":"movi-player","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0-beta.1":{"name":"movi-player","version":"0.1.0-beta.1","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.0-beta.1","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"05881783e8b2f4752ae2c6ee7201d846b236d026","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.0-beta.1.tgz","fileCount":347,"integrity":"sha512-YWOPyEQC+bg4bibz0IaM3lvscxsnOaYYvB54bIscV9C8z64rS/L41mBVJRL84xvotJGVfcH1d7ZckcV1MlS5Eg==","signatures":[{"sig":"MEUCIQC1jh9ngTXef40T2OVg9SlG3mmWEntLk46rJAPvrn7i4gIgdpYl1OALb1ddZJKm/C78mi/DcByrY/QSvH9kipdrDsc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66394648},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"bc5a7e3482ff7af071b85e4a62fa39c22e832512","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.0-beta.1_1770307917231_0.5238659935455756","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-beta.2":{"name":"movi-player","version":"0.1.0-beta.2","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.0-beta.2","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"271c4d27859b364ccf4dec3e504898164df8f876","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.0-beta.2.tgz","fileCount":347,"integrity":"sha512-SPUtA0Z2XnkrQzTT5FQ/PTK6arDtPpLjlOcSNdduYYChJfckBps/l68tO9ZgjgaVebN8x0Rf9e74aTtg8V6QUg==","signatures":[{"sig":"MEYCIQCkqbF5xmTI0CY8PdqMw95kdPr0gLzqjmDIbSiHyZ6w5wIhAMWOhu7HY/X77r3xPGLZHiOZBlyc9Y7j7xVm37jA1fNW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66395743},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"27a643a162296c88332d2a47a33b4329f37158d5","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.0-beta.2_1770316517706_0.9572262086780599","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"movi-player","version":"0.1.0","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.0","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"fc8acbac749cb6e38a7e50dd14dc1de45bb73990","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.0.tgz","fileCount":347,"integrity":"sha512-4kG+UJNUIh116f/JnD7oGb4RvmIDYKh4css3VLm72bOOXNbVbX1fZzPo5os4BBg/wgYC1NNE8KkSflPwWQJtow==","signatures":[{"sig":"MEQCIDpCh6NFvv6jnZtIlemNlWDtuc01X8omTC8Cp6Y8lNRDAiAEPItRLvU95uC7XjMBthoxp7kbEZh8cGT4Bcbosqxddg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66395736},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"27a643a162296c88332d2a47a33b4329f37158d5","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.0_1770316712261_0.5722211358197409","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"movi-player","version":"0.1.1","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.1","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"80fa8218324172b2a40d752b15fe59c660d18372","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.1.tgz","fileCount":347,"integrity":"sha512-sxVFyl7nK3MHkJBgw6jpR0ddRaPFNGqZKfbPt/1Dn/O/k3YwDv7T1nLpLghFArVxzr//mhCUI/ExPYw6lax4Hw==","signatures":[{"sig":"MEMCIG70SqA5ocAK8BSGE9/pEfM7t/9ujkqmImAIf51TM5XVAh8buKTQ1HByL2PxQU7X+KHGLhgCfs31ZSNjaiAv8fWe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66395736},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"de327e84db705e0dcd7f7e93589aacc6649462e9","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.1_1770317060117_0.20779924479989687","host":"s3://npm-registry-packages-npm-production"}},"0.1.2-beta.1":{"name":"movi-player","version":"0.1.2-beta.1","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.2-beta.1","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"536e43f09a74ce8fa9030ddd8ee5117619c7dd97","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.2-beta.1.tgz","fileCount":347,"integrity":"sha512-h/X9vBJ6fLRV/xEFDbql5SRaJABZBFN62r/6nnyVCkg3NMWnYk/8rnicyhOW5I51BjrERR3pspgSt3xKBHblZQ==","signatures":[{"sig":"MEYCIQCI7FCSqoWngHwYUZyuHm3NGoZsHOcPQ4A72GQelLlYkgIhAILUEkpAp9tN9mk8+5SfNleRA8F5vVJc/8ETljlgdmPX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66395743},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"de327e84db705e0dcd7f7e93589aacc6649462e9","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.2-beta.1_1770317545570_0.6248892817322202","host":"s3://npm-registry-packages-npm-production"}},"0.1.2-beta.2":{"name":"movi-player","version":"0.1.2-beta.2","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.2-beta.2","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"fcf248c661f8fe2179799c1091b43fb61ec0293d","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.2-beta.2.tgz","fileCount":347,"integrity":"sha512-1Uw8/MeX4EDjr0JH7YvRQq6PLMAp+Fx1o6n+Tg9FjV+i1pRmHl6ZSv8F1GZCLSdcXFEgYINRcmnoZAlST8NuEQ==","signatures":[{"sig":"MEUCIQD2sNFgTIupxP+3dgYXQxwMBcXG7HsoRcEUmqzZUvMgbgIgK6ZBl0y3KHrds7t1xhynhtoDjcVYqdHCSmr545QGIZk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66416465},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"e8eeeb2f6f30c452f9f998ab8e026ce1f1d3278d","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.2-beta.2_1770349079650_0.3028729796946321","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"movi-player","version":"0.1.2","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.2","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"c80d12d3ab057dd053837e376bdb924ab1628cdb","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.2.tgz","fileCount":359,"integrity":"sha512-TLMX23pMV8mNNYi5+zAd0BqxjkIRp7VT6WEfjD9oIAHIWrYW+NT90jtq9YsKhBz/QGBNLT17aw7Bq2ggYWtHbA==","signatures":[{"sig":"MEUCIQChFq7+4RX7kwmUZqEqTuPj/a+13jYUze0tMMjSNZCIRwIgEEkUy2n4TWHUglKeS0G53fdPbv0MyexcUZctwbHJOcY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72733835},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"7b3f728630d7c12ee5b83e7d98d30ef20b7f4db0","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.2_1770472553276_0.4330320197474693","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"movi-player","version":"0.1.3","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.3","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"6421c82b3cd459d5467fcaff41c0d0a0c786bb97","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.3.tgz","fileCount":359,"integrity":"sha512-3catjvSI6dQLSyDphAWTEoKfONyckz8Mjel1ivA5NHN/41rYYKDNrwot+4TZ9REzYA6O5hT/r83kDi63bFvApg==","signatures":[{"sig":"MEYCIQD02iY9cwNj5J3TV/z8NVha82QXNy5g0FtnDldUaZgvmgIhALRaFZRaU83Cu81x5nHudoc+r6knxZIHAk+C0U1aYktH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72793674},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"fb87beb4ee655fa5b0331e65ef0ce754867193da","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.3_1770536528089_0.8372938652777795","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"movi-player","version":"0.1.4","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.4","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"7c16af07d28f52f93825d33db7b3a2b097fb7d38","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.4.tgz","fileCount":364,"integrity":"sha512-flJFWFpvBGpSa9baN+LXwNdnuU/adOooll4M2/PBRHlMKBX+Jx0gFkwdFB3k9+lW2NKKbcjzMgTb5I5RwZGCVQ==","signatures":[{"sig":"MEUCIGvS1m1cwfJifLXPvyH1En/vUWoJd0Nf5LC5LVPcJUXzAiEAtzRyelxDfLtmSIyDEFoD/YMZV7iVOc4acxc/Lh1yNnc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72920952},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"f73456c87c24eedcca5e018a61d1fdaafcc3f497","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.4_1770760047511_0.6506324731790945","host":"s3://npm-registry-packages-npm-production"}},"0.1.5-beta.0":{"name":"movi-player","version":"0.1.5-beta.0","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.5-beta.0","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"8c8c597fe4790c4fc02c0e0a82312873df8b8035","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.5-beta.0.tgz","fileCount":364,"integrity":"sha512-givzVyzrTwYOJ1ezknk0kSP9NNB2ZGFpG7F9hxsCmxm6NW+BrUwLgDXoaHNgMO8T2hKeliN1TM1zIvkfeMXyMw==","signatures":[{"sig":"MEYCIQCOX4T7ySisNRgltso8ZQlRoLfP/P5fE+/7WbA9CPMryAIhAMhtDS4m8ZESBSS9Uau1E2B5lQehxbfkHQIcEBygqhDl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72947248},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"f36272f2d59056f542944ac4cd8dcdd41a4820c4","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.5-beta.0_1770827539947_0.8452384045744878","host":"s3://npm-registry-packages-npm-production"}},"0.1.5-beta.1":{"name":"movi-player","version":"0.1.5-beta.1","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.5-beta.1","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"9fb301c0ab8b57b47c096f13c7865e9573432329","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.5-beta.1.tgz","fileCount":364,"integrity":"sha512-XmlZSJriNVcFSv7Au9Up46t92CuEyp9t51JoSVwXXootf291eQ0PW2D6FOz5Q3HQyAlaToUJpG31v/P3FC7OyQ==","signatures":[{"sig":"MEYCIQCtH1S7joXgZdLAj6RB3pgTocFP8EXUWbWLkRiU8rqyFgIhAI+AyLKYLkT3DTCeAKX+duPPKJ7vG4IMzOpApCS8yAw0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72959964},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"c772613589f141acfb7680c16e98aaa80f267ed5","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.5-beta.1_1770836273578_0.20835351714672035","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"movi-player","version":"0.1.5","keywords":["video","streaming","ffmpeg","wasm","webassembly","webcodecs","demuxer","decoder","player","hdr","video-player","mp4","mkv","hevc","h264"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.1.5","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://github.com/mrujjwalg/movi-player#readme","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"58deb657de47584a3c603518a6a0a9ceb94ad5bd","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.1.5.tgz","fileCount":368,"integrity":"sha512-aHtX4NBVJWaTkP3JcxVZMGXuQisEoPkoPZ6IH2hEE54BWbrnUny81nyYl/n7RBQPJNH4QZzMNDlKMB9ghGdg5g==","signatures":[{"sig":"MEUCIHYR5a7VmheYV+QBYhIcpPSuLZabHHyO3o/cnMz+ijWMAiEApDseomHhvdyeFC1RiqmEDUWjtF5IfXf9TuxPKPOczes=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73222384},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"7c3a87f4720099378b479eda5861b0409256f6a9","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Modular streaming video library for browsers with WebAssembly FFmpeg pipeline","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.1.5_1771103898687_0.21323602305360878","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-beta.0":{"name":"movi-player","version":"0.2.0-beta.0","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.2.0-beta.0","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://mrujjwalg.github.io/movi-player/","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"75b16460267a88518689eb0117a598f9619f4a68","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.2.0-beta.0.tgz","fileCount":396,"integrity":"sha512-FczxFKigR93kKebSmUCG1JnAvL9WN7ap6ArB15n1iExRFmRgubwRqpl89olIbKp+blFERyOuM3C/zuRNrvUR0A==","signatures":[{"sig":"MEUCIQDsDnADJ5Z+0UeYHBmMogF9I7naJ7BjexhNj9HktguMqgIgL8yRqmDhDONxSIhR9oR372m8zvjNh3egnXROZb+Jy4E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73828102},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"a6a6f79fc7347dd2fc668981208331a883f07fed","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.2.0-beta.0_1775365784142_0.9207923504087752","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-beta.1":{"name":"movi-player","version":"0.2.0-beta.1","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.2.0-beta.1","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://mrujjwalg.github.io/movi-player/","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"b6d37f1abf2570bf521df40b1c24b20a960026cc","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.2.0-beta.1.tgz","fileCount":396,"integrity":"sha512-Rw9qAfcG7UBj0boApHE7WFBDZYiBwnhRcmUl8Es8xIbDI46qYwXH0+RI57iK+R4WkYFtdjBlFdM3trh9tN32FQ==","signatures":[{"sig":"MEUCIQCHx2XfKRIO9OwNJGloR0LHXlgOjO0wqIyzeDtoTeNuYAIgeloGdh/v4ML6mmMyu+3phe1MHVABOw0MLVELjaESM4k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73869082},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"5b7e9f8ded4362bca531929c4ea0ce4274aecb9b","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.2.0-beta.1_1775380476375_0.3388249710477875","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-beta.3":{"name":"movi-player","version":"0.2.0-beta.3","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.2.0-beta.3","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://mrujjwalg.github.io/movi-player/","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"246912a880333060852dca2f6b7393a211e27d42","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.2.0-beta.3.tgz","fileCount":398,"integrity":"sha512-MEeBKhrS/4BSHOM7v2O7jeh4JhV8X9ksZv+a7qZadMujIQIUye7sz6op3TSc5cvRUF5HrIn4r6LZRBM/VguWGg==","signatures":[{"sig":"MEUCICRHrsnzhbpttSYqZ9GFtoU/of+PcRt1YkDb16hUYTocAiEA56Ee+om4zXe6FxAdZony1ulFcHs5vWycnytVGoDnX5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74132536},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"99ad20f51af1f52402397b2ec24a9d78573ab633","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.2.0-beta.3_1775561245122_0.1645471400027576","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"movi-player","version":"0.2.0","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.2.0","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://mrujjwalg.github.io/movi-player/","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"2c706c823e2060211a1ff8f2ffb89d24a1d583cd","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.2.0.tgz","fileCount":398,"integrity":"sha512-LwG5e1dzQ0Xb8DRBA1XWkFGED6HS8qepoC1tiEzNUIIjHiXgUw627C1gVR9EgLaXxt0wRqjbniGLadEiQ6pcow==","signatures":[{"sig":"MEYCIQCWJLQPWzBjAGgYg6EffE6/qzGqRIzs1AO+dp/sSYw1YQIhANQTaHMiJ50VSMqNwerBuuwmQ5sRCC42Av/TQ1v2r7Dl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74713987},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"ad09f1efd95570943b3d9867434ebfac7f722dcb","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.2.0_1775724601348_0.6209846243345398","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"movi-player","version":"0.2.2","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjwal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.2.2","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://moviplayer.com/","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"74d53bd992f1de8b90618a624e56fd4459d7a0f7","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.2.2.tgz","fileCount":483,"integrity":"sha512-Eck9MXmPMVzOzEengWjy4xemxcjT50CkY7oQLqtBqYeOTitQSukwEMGBb0bJ8bQcPCVZmUd3Jd8R/WG2paLxjA==","signatures":[{"sig":"MEQCIA4N/h1AKKEKl71Vs1LS33E7yMt2kxlc71Pk+Koz8k4XAiB20fmUUS6KK6eYJvYuID08Lwsv2gbWEMMj3exIES0a3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93149072},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"b270d0310ebd46f25466bcd7c92b2cff3f0d3c06","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","app:dev":"cd app && npx wrangler dev","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","app:deploy":"cd app && cp worker.js worker.js.bak && sed -i '' \"s|\\\"__BUILD_VERSION__\\\"|\\\"$(date +%s)\\\"|\" worker.js && npx wrangler deploy; mv worker.js.bak worker.js","app:harden":"node scripts/harden-element.js","app:upload":"npm run app:harden && wrangler r2 object put movi-assets/element.js --file dist/element.js --remote","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","app:release":"npm run build:ts && npm run app:upload && npm run app:deploy","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","app:upload:local":"wrangler r2 object put movi-assets/element.js --file dist/element.js --local --persist-to app/.wrangler/state","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.6.2","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.2.2_1777214485277_0.5255003168317733","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"movi-player","version":"0.2.3","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjawal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.2.3","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://moviplayer.com","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"c7f4b52c18cf23483b6d82060078085a2ebbe86d","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.2.3.tgz","fileCount":380,"integrity":"sha512-f4tv4RzTGEgu/9NxyHDWxD+xHo/BqKNo345eFwcBe6IIOGYhrvd0IgCoSMmGIPKkbKm0rXCKIrZk0ngKoZ45lw==","signatures":[{"sig":"MEUCIQDLtvvEW8LNm/Z+og+8Ez6u+SWvy3Xj72o2UOy4WuLz1gIgDST2KXatlrJVrkZyn1qUB4ixqixl0munpNe1iVvzaQU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88851042},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"15bb499892d0f0980fc9782da7ca5d1aafb01455","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","app:dev":"cd app && npx wrangler dev","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","app:deploy":"cd app && cp worker.js worker.js.bak && sed -i '' \"s|\\\"__BUILD_VERSION__\\\"|\\\"$(date +%s)\\\"|\" worker.js && npx wrangler deploy; mv worker.js.bak worker.js","app:harden":"node scripts/harden-element.js","app:upload":"npm run app:harden && wrangler r2 object put movi-assets/element.js --file dist/element.js --remote","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","app:release":"npm run build:ts && npm run app:upload && npm run app:deploy","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","app:upload:local":"wrangler r2 object put movi-assets/element.js --file dist/element.js --local --persist-to app/.wrangler/state","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.13.0","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.2.3_1778188481454_0.8763190958161284","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"movi-player","version":"0.3.0","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjawal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.3.0","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://moviplayer.com","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"cb36d08fce548630df03e68cc49f126c0cf02d05","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.3.0.tgz","fileCount":393,"integrity":"sha512-xEuIYga6YE5YnGViPZTuYOSnBIMosa185lCaTxDjz4GmfpQ1ycSFP/bk2FSknagErVrq1eXbYijE5Fs2L2dp6Q==","signatures":[{"sig":"MEQCIFS3u2bSx0tTDjxbbIABe//yLwQj/0hKNqIX9+1k7FGWAiADC05Q4d1uW57Htr6I0b/zu0pH+v/vv5N0bP+uVf+0gg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90348899},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"725b377c6c2884907946982da05e65a72f1fa9b4","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","app:dev":"cd app && npx wrangler dev","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","app:deploy":"cd app && cp worker.js worker.js.bak && sed -i '' \"s|\\\"__BUILD_VERSION__\\\"|\\\"$(date +%s)\\\"|\" worker.js && npx wrangler deploy; mv worker.js.bak worker.js","app:harden":"node scripts/harden-element.js","app:upload":"npm run app:harden && wrangler r2 object put movi-assets/element.js --file dist/element.js --remote","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","app:release":"npm run build:ts && npm run app:upload && npm run app:deploy","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","app:upload:local":"wrangler r2 object put movi-assets/element.js --file dist/element.js --local --persist-to app/.wrangler/state","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.15.0","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^1.0.0","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^3.6.0","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.3.0_1780349695296_0.11894852681187396","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"movi-player","version":"0.3.1","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjawal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.3.1","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://moviplayer.com","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"e99c9c3e14a5d4061fc194de00b491aa6359fe9b","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.3.1.tgz","fileCount":413,"integrity":"sha512-/YZ5SfdBdzdckhPDXu21hq6mIv+Nh3dTRQh3Vrh2U49g5SK2/YSdwEN244oImhR0MHeDUhWscRk9/T/Y/XtjKA==","signatures":[{"sig":"MEQCIBdI757FVuDg6gsg2XY5dUW+ahA661TVR6qkLV97TSLBAiB4gEBJWhFE9CcuveJsbF/vjR2z8E4BcV1VEkiU6Wr3+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105296672},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"9b4d3d975668df27760909dd0a25fbca3449a452","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","app:dev":"cd app && npx wrangler dev","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","app:deploy":"cd app && cp worker.js worker.js.bak && sed -i '' \"s|\\\"__BUILD_VERSION__\\\"|\\\"$(date +%s)\\\"|\" worker.js && npx wrangler deploy; mv worker.js.bak worker.js","app:harden":"node scripts/harden-element.js","app:upload":"npm run app:harden && wrangler r2 object put movi-assets/element.js --file dist/element.js --remote","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","app:release":"npm run build:ts && npm run app:upload && npm run app:deploy","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","app:upload:local":"wrangler r2 object put movi-assets/element.js --file dist/element.js --local --persist-to app/.wrangler/state","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.15.0","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dashjs":"^5.2.0","hls.js":"^1.6.16","shaka-player":"^4.11.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^4.1.8","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^5.0.2","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.3.1_1781036428330_0.2463065091718062","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"movi-player","version":"0.3.2","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020","hls","dash","mpeg-dash","m3u8","adaptive-streaming","live-streaming","picture-in-picture","lcevc"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjawal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.3.2","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://moviplayer.com","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"4eafb958ac07519cb4486a2e428a254e6a7d25ac","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.3.2.tgz","fileCount":413,"integrity":"sha512-mTWbV3g9nEnL3Lqu8EJlpG0byS3O1H+KSKUS3V6nap8ulsznrGzxxjBGdyHeiAkJmMisc27vVB4m9KZUs0zW+Q==","signatures":[{"sig":"MEUCIQCo/LmqhpEwze84KW2F/lBhETucNDgVj6Eilf76FilTswIgd99Sep1thlCJwSdFTHyOLYh2uKNYLGrZlEgx8H4c8CU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105302766},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"bc454f8858a95c8b0d1c188c461901174d977c8f","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","app:dev":"cd app && npx wrangler dev","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","app:deploy":"cd app && cp worker.js worker.js.bak && sed -i '' \"s|\\\"__BUILD_VERSION__\\\"|\\\"$(date +%s)\\\"|\" worker.js && npx wrangler deploy; mv worker.js.bak worker.js","app:harden":"node scripts/harden-element.js","app:upload":"npm run app:harden && wrangler r2 object put movi-assets/element.js --file dist/element.js --remote","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","app:release":"npm run build:ts && npm run app:upload && npm run app:deploy","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","app:upload:local":"wrangler r2 object put movi-assets/element.js --file dist/element.js --local --persist-to app/.wrangler/state","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.15.0","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dashjs":"^5.2.0","hls.js":"^1.6.16","shaka-player":"^4.11.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^4.1.8","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^5.0.2","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.3.2_1781681139331_0.5552809712843285","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"movi-player","version":"0.3.3","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020","hls","dash","mpeg-dash","m3u8","adaptive-streaming","live-streaming","picture-in-picture","lcevc"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjawal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.3.3","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://moviplayer.com","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"a515d550cd163d019f018bdace905accba9283c5","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.3.3.tgz","fileCount":413,"integrity":"sha512-Y/KOjiJ66lZrnisupvhW6Yi0oEZJmd3MVIlJg8FcJ//BxsX1JwR3WaPrFwSBx87Xii8UPNlTBzCJe8a8zpeh/w==","signatures":[{"sig":"MEQCIEPAMrjm+dBAoYnoE4gmnl3Pz8CwgGBt9D9UDMaokqpqAiABcgZM9hRnlZK7DjLT7tw9j3Nf9j2N3JjWzA8qDCDXrA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105584212},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"aa2625fca14aba0b838c088f833b3d984704ea4e","scripts":{"dev":"vite","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","app:dev":"cd app && npx wrangler dev","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","app:deploy":"cd app && cp worker.js worker.js.bak && sed -i '' \"s|\\\"__BUILD_VERSION__\\\"|\\\"$(date +%s)\\\"|\" worker.js && npx wrangler deploy; mv worker.js.bak worker.js","app:harden":"node scripts/harden-element.js","app:upload":"npm run app:harden && wrangler r2 object put movi-assets/element.js --file dist/element.js --remote","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","app:release":"npm run build:ts && npm run app:upload && npm run app:deploy","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","app:upload:local":"wrangler r2 object put movi-assets/element.js --file dist/element.js --local --persist-to app/.wrangler/state","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true -e FORCE_DAV1D=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.15.0","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dashjs":"^5.2.0","hls.js":"^1.6.16","shaka-player":"^4.11.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^4.1.8","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^5.0.2","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.3.3_1782708761352_0.4720643748583295","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"movi-player","version":"0.3.4","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020","hls","dash","mpeg-dash","m3u8","adaptive-streaming","live-streaming","picture-in-picture","lcevc"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjawal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.3.4","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://moviplayer.com","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"0770ae0767b260a49d7a86bd111081671bdee886","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.3.4.tgz","fileCount":417,"integrity":"sha512-AGA6HXt7TbEV391SswNp3PkcIcAi3ourr4FxzD69rqpfeH4tp13F8ny1pPVjHQePijEIUF4uPLlQfKGQ6+TDQg==","signatures":[{"sig":"MEQCIHTihmhZDkYUKFyUW2+UjaZsGYVc7GlUKjx4titEh/4fAiBxfZLtlnt6rSglZtRSpdYh8+3NiDH9TfnVCm8yzcy4Mg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106116653},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"48cc285dcd24bf942f10b93cae2eac9807c39aa6","scripts":{"dev":"vite --open /dev/","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","app:dev":"cd app && npx wrangler dev","release":"node scripts/release.mjs","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","app:deploy":"cd app && cp worker.js worker.js.bak && sed -i '' \"s|\\\"__BUILD_VERSION__\\\"|\\\"$(date +%s)\\\"|\" worker.js && npx wrangler deploy; mv worker.js.bak worker.js","app:harden":"node scripts/harden-element.js","app:upload":"npm run app:harden && wrangler r2 object put movi-assets/element.js --file dist/element.js --remote","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","app:release":"npm run build:ts && npm run app:upload && npm run app:deploy","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","app:upload:local":"wrangler r2 object put movi-assets/element.js --file dist/element.js --local --persist-to app/.wrangler/state","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true -e FORCE_DAV1D=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.15.0","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dashjs":"^5.2.0","hls.js":"^1.6.16","shaka-player":"^4.11.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^4.1.8","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^5.0.2","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.3.4_1783729732127_0.4724662976994991","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"movi-player","version":"0.3.5","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020","hls","dash","mpeg-dash","m3u8","adaptive-streaming","live-streaming","picture-in-picture","lcevc"],"author":{"url":"https://github.com/mrujjwalg","name":"Ujjawal Kashyap","email":"mr.ujjwalg@gmail.com"},"license":"Apache-2.0","_id":"movi-player@0.3.5","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"homepage":"https://moviplayer.com","bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"dist":{"shasum":"d47d5a24cc34093df3fdbfdf9d0616d70e231c7e","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.3.5.tgz","fileCount":417,"integrity":"sha512-jyJBsu7OEoB1On0fDx89um7mqRcpIPGBQPUI4o8mdqxlXsJhsOoF89u5Mx2JzzznhW74fLNIiUM8mSpxskY/lA==","signatures":[{"sig":"MEUCIEwNtUGJxkxQSut146RMdsy8pqpr38Dpb1c6RnAbfo0YAiEA/OQq9JzPOdRKelW+XFF73hh+je8xSVLi38g4U87FDKQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106134490},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./player":{"types":"./dist/player.d.ts","import":"./dist/player.js","require":"./dist/player.cjs"},"./demuxer":{"types":"./dist/demuxer.d.ts","import":"./dist/demuxer.js","require":"./dist/demuxer.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js","require":"./dist/element.cjs"}},"gitHead":"e6a044ec54926bbdc1a2076219644c607ffa0845","scripts":{"dev":"vite --open /dev/","test":"vitest","build":"npm run build:wasm && npm run build:ts","clean":"rm -rf dist","app:dev":"cd app && npx wrangler dev","release":"node scripts/release.mjs","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","app:deploy":"cd app && cp worker.js worker.js.bak && sed -i '' \"s|\\\"__BUILD_VERSION__\\\"|\\\"$(date +%s)\\\"|\" worker.js && npx wrangler deploy; mv worker.js.bak worker.js","app:harden":"node scripts/harden-element.js","app:upload":"npm run app:harden && wrangler r2 object put movi-assets/element.js --file dist/element.js --remote","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","docs:build":"vitepress build docs","app:release":"npm run build:ts && npm run app:upload && npm run app:deploy","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build && npm run typecheck","app:upload:local":"wrangler r2 object put movi-assets/element.js --file dist/element.js --local --persist-to app/.wrangler/state","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true -e FORCE_DAV1D=true build"},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"repository":{"url":"git+https://github.com/mrujjwalg/movi-player.git","type":"git"},"_npmVersion":"11.15.0","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dashjs":"^5.2.0","hls.js":"^1.6.16","shaka-player":"^4.11.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","terser":"^5.44.1","vitest":"^4.1.8","gh-pages":"^6.3.0","vitepress":"^1.6.4","typescript":"^5.9.3","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","vite-plugin-dts":"^5.0.2","@playwright/test":"^1.40.0","@rollup/plugin-terser":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/movi-player_0.3.5_1783760557220_0.9663161906537661","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"movi-player","version":"0.4.0","description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","type":"module","main":"dist/index.js","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs","types":"./dist/index.d.ts"},"./demuxer":{"import":"./dist/demuxer.js","require":"./dist/demuxer.cjs","types":"./dist/demuxer.d.ts"},"./player":{"import":"./dist/player.js","require":"./dist/player.cjs","types":"./dist/player.d.ts"},"./element":{"import":"./dist/element.js","require":"./dist/element.cjs","types":"./dist/element.d.ts"},"./element/slim":{"import":"./dist/element.slim.js","require":"./dist/element.slim.cjs","types":"./dist/element.d.ts"},"./movi.wasm":"./dist/movi.wasm","./react":{"types":"./dist/react/index.tsx","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./react/slim":{"types":"./dist/react/slim.tsx","import":"./dist/react/slim.js","default":"./dist/react/slim.js"},"./vue":{"types":"./dist/vue/index.ts","import":"./dist/vue/index.js","default":"./dist/vue/index.js"},"./vue/slim":{"types":"./dist/vue/slim.ts","import":"./dist/vue/slim.js","default":"./dist/vue/slim.js"},"./svelte":{"types":"./dist/svelte/MoviPlayer.svelte","svelte":"./dist/svelte/MoviPlayer.svelte","default":"./dist/svelte/MoviPlayer.svelte"},"./svelte/slim":{"types":"./dist/svelte/MoviPlayerSlim.svelte","svelte":"./dist/svelte/MoviPlayerSlim.svelte","default":"./dist/svelte/MoviPlayerSlim.svelte"},"./svelte/MoviSource":{"types":"./dist/svelte/MoviSource.svelte","svelte":"./dist/svelte/MoviSource.svelte","default":"./dist/svelte/MoviSource.svelte"},"./svelte/MoviTrack":{"types":"./dist/svelte/MoviTrack.svelte","svelte":"./dist/svelte/MoviTrack.svelte","default":"./dist/svelte/MoviTrack.svelte"}},"customElements":"custom-elements.json","peerDependencies":{"react":">=17","vue":">=3.3","svelte":">=4"},"peerDependenciesMeta":{"react":{"optional":true},"vue":{"optional":true},"svelte":{"optional":true}},"scripts":{"build":"npm run build:wasm && npm run build:ts","build:ts":"node scripts/check-wasm.js && tsc && node scripts/build-standalone.js && node scripts/build-wrappers.mjs && node scripts/build-custom-data.mjs","release":"node scripts/release.mjs","sync:element":"node scripts/sync-element.mjs","build:wasm":"mkdir -p dist/wasm && docker compose run --rm build","build:wasm:force":"mkdir -p dist/wasm && docker compose run --rm -e FORCE_FFMPEG=true -e FORCE_DAV1D=true build","dev":"vite --open /dev/","test":"vitest","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run build && npm run typecheck","docs:dev":"vitepress dev docs","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs","docs:deploy":"npm run docs:build && npx gh-pages -d docs/.vitepress/dist","app:dev":"cd app && npx wrangler dev","app:deploy":"cd app && cp worker.js worker.js.bak && sed -i '' \"s|\\\"__BUILD_VERSION__\\\"|\\\"$(date +%s)\\\"|\" worker.js && npx wrangler deploy; mv worker.js.bak worker.js","app:harden":"node scripts/harden-element.js","app:upload":"npm run app:harden && wrangler r2 object put movi-assets/element.js --file dist/element.js --remote && wrangler r2 object put movi-assets/element.slim.js --file dist/element.slim.js --remote && wrangler r2 object put movi-assets/movi.wasm --file dist/movi.wasm --content-type application/wasm --remote","app:upload:local":"wrangler r2 object put movi-assets/element.js --file dist/element.js --local --persist-to app/.wrangler/state","app:release":"npm run build:ts && npm run app:upload && npm run app:deploy"},"keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020","hls","dash","mpeg-dash","m3u8","adaptive-streaming","live-streaming","picture-in-picture","lcevc","webcodecs-player","wasm-video-player","browser-video-player","play-mkv-browser","mkv-player","hevc-player","av1-player","client-side-video","media-source-extensions","mse","libmedia","ffmpeg-wasm","video.js-alternative","hls.js-alternative","shaka-player-alternative"],"author":{"name":"Ujjawal Kashyap","email":"mr.ujjwalg@gmail.com","url":"https://github.com/mrujjwalg"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/mrujjwalg/movi-player.git"},"bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"homepage":"https://moviplayer.com","devDependencies":{"@playwright/test":"^1.40.0","@rollup/plugin-terser":"^1.0.0","@types/node":"^20.10.0","@webgpu/types":"^0.1.69","gh-pages":"^6.3.0","terser":"^5.44.1","typescript":"^5.9.3","vite":"^5.0.0","vite-plugin-dts":"^5.0.2","vitepress":"^1.6.4","vitest":"^4.1.8"},"engines":{"node":">=18"},"dependencies":{"dashjs":"^5.2.0","hls.js":"^1.6.16","shaka-player":"^4.11.2"},"gitHead":"054208c42382a323d337c72b179c94f434b82b28","_id":"movi-player@0.4.0","_nodeVersion":"24.12.0","_npmVersion":"11.15.0","dist":{"integrity":"sha512-FaOIxgZKtTZ+Cpy4vyxmtjlz8uazGQ7uztO+vLe9VkAa9f3tpyU4Fjxp/O+URWCBLk8GTN0x2mDnj7ntZ0xe7w==","shasum":"e0369678bc315fd5ace16da558c594dbffbd2ab9","tarball":"https://registry.npmjs.org/movi-player/-/movi-player-0.4.0.tgz","fileCount":455,"unpackedSize":131232766,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID0ZkVnWXr+G0ESzi7ljfoYI8/IZ1iginfsfT0TtmxO0AiB5LpSYPzyXeHn8vaAe86uzcrwMU8ou4yaqWReabIMuQQ=="}]},"_npmUser":{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"},"directories":{},"maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/movi-player_0.4.0_1786734176249_0.00869586440419079"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-05T16:11:57.230Z","modified":"2026-08-14T19:02:57.189Z","0.1.0-beta.1":"2026-02-05T16:11:57.924Z","0.1.0-beta.2":"2026-02-05T18:35:18.503Z","0.1.0":"2026-02-05T18:38:33.035Z","0.1.1":"2026-02-05T18:44:20.969Z","0.1.2-beta.1":"2026-02-05T18:52:26.305Z","0.1.2-beta.2":"2026-02-06T03:38:00.418Z","0.1.2":"2026-02-07T13:55:54.045Z","0.1.3":"2026-02-08T07:42:08.842Z","0.1.4":"2026-02-10T21:47:28.336Z","0.1.5-beta.0":"2026-02-11T16:32:21.001Z","0.1.5-beta.1":"2026-02-11T18:57:54.510Z","0.1.5":"2026-02-14T21:18:19.555Z","0.2.0-beta.0":"2026-04-05T05:09:45.063Z","0.2.0-beta.1":"2026-04-05T09:14:37.198Z","0.2.0-beta.3":"2026-04-07T11:27:25.905Z","0.2.0":"2026-04-09T08:50:02.172Z","0.2.1":"2026-04-15T23:20:29.028Z","0.2.2":"2026-04-26T14:41:26.219Z","0.2.3":"2026-05-07T21:14:42.317Z","0.3.0":"2026-06-01T21:34:55.953Z","0.3.1":"2026-06-09T20:20:29.031Z","0.3.2":"2026-06-17T07:25:39.932Z","0.3.3":"2026-06-29T04:52:41.921Z","0.3.4":"2026-07-11T00:28:52.703Z","0.3.5":"2026-07-11T09:02:37.825Z","0.4.0":"2026-08-14T19:02:56.989Z"},"bugs":{"url":"https://github.com/mrujjwalg/movi-player/issues"},"author":{"name":"Ujjawal Kashyap","email":"mr.ujjwalg@gmail.com","url":"https://github.com/mrujjwalg"},"license":"Apache-2.0","homepage":"https://moviplayer.com","keywords":["video-player","video","player","webcodecs","ffmpeg","wasm","webassembly","hdr","hevc","h265","h264","av1","vp9","mkv","mp4","webm","demuxer","decoder","streaming","subtitles","srt","ass","multi-audio","canvas","encrypted-video","drm","content-protection","chapters","web-component","custom-element","html5-video","media-player","4k","hdr10","hlg","bt2020","hls","dash","mpeg-dash","m3u8","adaptive-streaming","live-streaming","picture-in-picture","lcevc","webcodecs-player","wasm-video-player","browser-video-player","play-mkv-browser","mkv-player","hevc-player","av1-player","client-side-video","media-source-extensions","mse","libmedia","ffmpeg-wasm","video.js-alternative","hls.js-alternative","shaka-player-alternative"],"repository":{"type":"git","url":"git+https://github.com/mrujjwalg/movi-player.git"},"description":"Play MKV, HEVC, AV1, HDR videos in the browser. WebCodecs + FFmpeg WASM player with encrypted playback, chapters, subtitles, multi-audio tracks. No server transcoding needed.","maintainers":[{"name":"mrujjwalg","email":"mr.ujjwalg@gmail.com"}],"readme":"<div align=\"center\">\n\n<img src=\"docs/images/banner.png\" alt=\"Movi Player\" width=\"100%\" />\n\n### Play any video format directly in the browser.\n##### No transcoding. No server processing. <br /> Just `<movi-player src=\"video.mkv\" controls>`.\n\n[![npm version](https://img.shields.io/npm/v/movi-player.svg?style=flat-square&color=cb3837&logo=npm)](https://www.npmjs.com/package/movi-player)\n[![npm downloads](https://img.shields.io/npm/dm/movi-player.svg?style=flat-square&color=blue&logo=npm&label=npm%20downloads)](https://www.npmjs.com/package/movi-player)\n[![jsDelivr hits](https://img.shields.io/jsdelivr/npm/hy/movi-player?style=flat-square&color=ff5627&logo=jsdelivr&label=jsDelivr%2Fyear)](https://www.jsdelivr.com/package/npm/movi-player)\n[![TypeScript](https://img.shields.io/npm/types/movi-player?style=flat-square&logo=typescript&color=3178c6)](https://www.npmjs.com/package/movi-player)\n[![js bundle](https://img.shields.io/badge/js%20bundle-50--410KB-success?style=flat-square)](https://www.npmjs.com/package/movi-player)\n[![with wasm](https://img.shields.io/badge/with%20wasm-~1.8--3.2MB-orange?style=flat-square)](#modules)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat-square)](LICENSE)\n[![GitHub stars](https://img.shields.io/github/stars/MrUjjwalG/movi-player?style=flat-square&color=yellow&logo=github)](https://github.com/MrUjjwalG/movi-player/stargazers)\n\n**[Web App](https://moviplayer.com)** &nbsp;·&nbsp; **[Documentation](https://moviplayer.com/docs/)** &nbsp;·&nbsp; **[Live Demo](https://movi-player-examples.vercel.app/element.html)** &nbsp;·&nbsp; **[Examples](https://moviplayer.com/examples)** &nbsp;·&nbsp; **[Changelog](CHANGELOG.md)**\n\n![Movi Player](docs/images/element.gif)\n\n<sub>Built with care by <a href=\"https://github.com/mrujjwalg\"><b>mrujjwalg</b></a> · MKV · HEVC · AV1 · 4K HDR · DRM · Encrypted Streaming</sub>\n\n</div>\n\n---\n\n## Quickstart\n\nOne script tag, one element — this plays an MKV (or HEVC, AV1, HDR, multi-audio…) file that a plain `<video>` cannot open:\n\n```html\n<script type=\"module\" src=\"https://cdn.jsdelivr.net/npm/movi-player/dist/element.js\"></script>\n\n<movi-player src=\"video.mkv\" controls></movi-player>\n```\n\nOr with npm:\n\n```bash\nnpm i movi-player\n```\n\n```html\n<script type=\"module\">\n  import \"movi-player\";\n</script>\n\n<movi-player src=\"video.mkv\" controls></movi-player>\n```\n\n> Prefer the official hosted build? Load it straight from **`https://moviplayer.com/dist/element.js`** — always the latest release, and a drop-in on any page (no COOP/COEP or isolation headers required).\n\n## Contents\n\n- [Why Movi Player?](#why-movi-player)\n- [What's New in 0.4.0](#whats-new-in-040)\n- [Getting Started](#getting-started)\n- [Common Use Cases](#common-use-cases)\n- [Advanced](#advanced)\n- [Reference](#reference)\n- [Server Requirements](#server-requirements)\n- [Browser Support](#browser-support)\n- [Development](#development)\n- [AI Assistants](#ai-assistants)\n\n## Why Movi Player?\n\n**The browser can't play MKV, HEVC, or HDR videos.** You either transcode everything server-side or tell users \"format not supported.\" Movi Player fixes this.\n\n- **Play anything** -- MKV, HEVC, AV1, 4K HDR, multi-audio, subtitles. Formats that `<video>` can't touch.\n- **Zero server cost** -- No FFmpeg on your server. No transcoding pipeline. Everything runs in the browser via WebAssembly.\n- **Drop-in replacement** -- `<movi-player src=\"video.mp4\" controls>` works like `<video>` but plays everything — the full `HTMLMediaElement` API surface answers, so code written against a native `<video>` works unchanged.\n- **Content protection** -- Built-in encrypted playback with AES-256-GCM, token auth, HMAC signing. No DRM license server needed.\n- **HDR rendering** -- Detects and renders BT.2020/PQ/HLG content on supported displays. Other players can't.\n- **Canvas-based** -- No `<video>` element exposed. Right-click save disabled.\n- **Picture-in-Picture** -- Document PiP with controls (play/pause, seek, mute, progress). Chromium 116+.\n- **Ambient mode** -- Dynamic letterbox glow that samples video colors in real-time. Press `G` or use context menu.\n- **Split sources** -- Separate video and audio files via child `<source kind=\"audio\">` elements, external subtitles via `<track>` — standard `<video>`-style markup.\n- **Adaptive streaming** -- HLS (`.m3u8`), MPEG-DASH (`.mpd`), and Smooth Streaming (`.ism`) unified through Shaka Player, with a live-edge UI and DVR seeking.\n- **Custom request headers** -- Send auth tokens / signed headers across manifests, segments, progressive HTTP, and the encrypted source via the `headers` attribute.\n- **DRM ready** -- Optional Widevine/PlayReady/FairPlay support via `drm` + `licenseurl` attributes for adaptive streams.\n\n<details>\n<summary><b>Full feature overview</b> — everything in the box</summary>\n\n<br />\n\n**Playback** -- MP4, MKV, WebM, MOV, TS, AVI. H.264, HEVC, VP9, AV1. Hardware decode with software fallback. Pitch-preserving time-stretch via Signalsmith Stretch.\n\n**Adaptive Streaming** -- HLS (`.m3u8`), MPEG-DASH (`.mpd`), and Smooth Streaming (`.ism`) unified through Shaka Player (hls.js / dash.js fallbacks). Live-edge badge, DVR-window seeking, Auto-mode quality badge. Streams whose codec the browser can't decode escalate through the other MSE engine and finally the built-in FFmpeg-WASM demuxer, keeping quality switching and track menus working. Optional MPEG-5 LCEVC enhancement-layer decoding via `lcevc` + `lcevcurl`.\n\n**Adaptive Quality** -- An \"Auto\" mode measures the link's real throughput (past CDN pacing bursts), opens on the rung it can sustain, and switches renditions seamlessly in place — no reload, no dropped playhead. Works for HLS/DASH and plain multi-file quality ladders alike.\n\n**Custom Headers** -- Send auth tokens / signed headers across the whole media flow (manifest, segments, progressive HTTP, thumbnails, encrypted source) via the `headers` attribute (JSON) or property (object).\n\n**Audio** -- AAC, MP3, Opus, FLAC, AC-3, E-AC-3. Multi-track switching. **Output-device routing** (`audiooutput` attribute / `setAudioOutput()` / right-click \"Audio Output\" menu, via `AudioContext.setSinkId`). Stable volume (loudness normalization). First-class audio-only mode with cover art extraction and a dedicated strip UI. Data-saver `audioonly` mode skips the video decode (and fetches an audio-only stream rendition). Perceptual (log) volume curve. Muted-autoplay fallback with tap-to-unmute.\n\n**Non-Range Servers** -- Servers that ignore `Range` (respond `200`, not `206`) still play via a forward-only sliding-window \"linear mode\" with in-window seeking; the `linearmode` event lets your UI adapt.\n\n**Subtitles** -- SRT, ASS, WebVTT, PGS (image-based), DVB. Multi-track with on-the-fly switching. Per-source delay/offset (`Z` / `X` to nudge ±100ms), full transcript browser with search + click-to-seek, customizable size/color/background/edge (persisted), karaoke-aligned VTT. Pluggable `SubtitleRenderer` hook for full ASS/SSA styling via an external renderer (e.g. jassub).\n\n**HDR** -- BT.2020/PQ/HLG detection + Display-P3 rendering on supported browsers.\n\n**Immersive / VR** -- 360° equirectangular, 180° (VR180), fisheye, side-by-side stereo (3D), and stereographic \"little planet\" video via a WebGL2 raycast with a spring-animated look-around camera. Auto-enters from the source's spherical metadata (no toggle UI) or force a projection with the `vr` attribute (`vr=\"180 fisheye sbs\"`, `vr=\"littleplanet\"`); opt-in on-screen joystick via `vrpad`.\n\n**UI** -- Controls, context menu, keyboard shortcuts (`?` to view all), themes (dark/light), gestures, ambient mode. Settings live behind a single gear panel; the bar groups controls into capsules and cuts real chapter gaps through the progress track.\n\n**Custom Controls** -- `addControl()` adds host-defined buttons and context-menu rows that sit with the built-ins (toggles, hotkeys, nested submenus, per-surface anchors); `showOverlay()` puts host panels (end screens, up-next cards) over the picture, including in fullscreen.\n\n**Native `<video>` Parity** -- All `HTMLMediaElement` / `HTMLVideoElement` members answer — `buffered`/`seekable`/`played`, `textTracks`/`audioTracks`/`videoTracks`, `srcObject`, `canPlayType`, `captureStream`, `getVideoPlaybackQuality`, `requestVideoFrameCallback`, `setSinkId`, `fastSeek` — plus the standard event set (`seeking`/`seeked`, `durationchange`, `abort`, `suspend`, `cuechange`, …). Every documented attribute reflects as a JS property (`el.rotate = 90`).\n\n**Persistent Preferences** -- Volume, mute, playback rate, stable volume, ambient mode, and HDR toggles persist across reloads via OPFS. User choices override HTML attribute defaults. The `persist` attribute takes over that decision explicitly — an opt-in list of exactly which settings (including audio/subtitle language) are remembered, namespaced by `persistkey`.\n\n**Picture-in-Picture** -- Document PiP with play/pause, seek, mute, progress bar. Press `P`.\n\n**Aspect Ratio** -- Press `A` to cycle contain/cover/fill/zoom. Context menu sub-menu with icons.\n\n**Crop Bars** -- `cropbars` strips letterbox/pillarbox padding baked into the source pixels before applying `cover`/`fill`/`zoom`, detected automatically with a conservative check so dark scenes are never mistaken for bars.\n\n**Nerd Stats** -- Press `I` for codec, resolution, FPS, decoder type, buffer health, network graph. HLS-aware stats. 8K/16K resolutions labeled correctly.\n\n**Timeline** -- Press `T` for thumbnail strip. Chapter-aware. Keyboard navigation (arrows + enter).\n\n**Chapters** -- Auto-detected from video metadata; or supplied from outside the file via the `chapters` attribute/property. Markers on progress bar, titles in seek tooltip.\n\n**Rotation** -- Press `R` to rotate 90, or set the `rotate` attribute (`0`/`90`/`180`/`270`). Metadata rotation auto-applied. Thumbnails sync.\n\n**Resume** -- `<movi-player resume>` saves position to localStorage, shows resume dialog on reload. Keyboard navigable.\n\n**Poster from Timestamp** -- `postertime=\"10%\"` (or `\"5\"`, `\"1:30\"`, `\"0:01:30\"`) generates a native-resolution poster frame from any timestamp. Runs on an isolated thumbnail pipeline, respects rotation metadata, and never paints stale frames after a `src` change.\n\n**Encrypted** -- AES-256-GCM chunked encryption with HMAC-signed token auth. See encrypted-server/.\n\n**Custom SourceAdapter** -- Plug any byte protocol (WebSocket, WebRTC, IndexedDB, custom encryption) directly into the element or player. Same `SourceAdapter` contract works across `<movi-player>`, `MoviPlayer`, and `Demuxer`; `registerSourceAdapter()` teaches the element custom `src` schemes (`s3://`, `ipfs://`, …) with no per-element wiring.\n\n**DRM** -- Optional Widevine/FairPlay for HLS streams via `drm` + `licenseurl` attributes. Uses native `<video>` + EME API.\n\n**Premuxed Quality Menu** -- Multiple `<source data-height=\"...\">` children give you a YouTube-style quality picker for plain MP4/MKV files, no HLS manifest needed.\n\n**File Revoked Recovery** -- Mobile browsers silently revoke `File` handles after long backgrounding; the `filerevoked` event fires so playlist UIs can prompt for re-pick instead of hanging forever.\n\n**Host Fullscreen Handoff** -- Cancelable `movi-fullscreen-request` event + `setHostFullscreen()` so embedders (VS Code webview, custom apps) can take over fullscreen and keep the player's UI in sync. `exitFullscreen()` covers every fullscreen route.\n\n**Host Error Screen** -- Restyle the built-in error overlay via `::part()`, replace it outright with `slot=\"error\"`, and read the exact on-screen wording from the `errordisplay` event.\n\n</details>\n\n### vs. Other Players\n\n|  | Movi Player | video.js | hls.js | dash.js | Shaka Player | Plyr |\n|---|---|---|---|---|---|---|\n| Raw MKV / HEVC / AV1 file | Yes | No | No | No | No | No |\n| HDR (BT.2020 / PQ / HLG) | Yes | No | No | No | Native | No |\n| Adaptive HLS / DASH | Yes | Plugin | HLS only | DASH only | Yes | No |\n| Canvas render (no `<video>`) | Yes | No | No | No | No | No |\n| Encrypted playback (built-in AES) | Yes | No | No | No | EME/DRM | No |\n| Multi-audio track switching | Yes | Plugin | Yes | Yes | Yes | No |\n| Built-in subtitle rendering | Yes | Plugin | No | No | Yes | No |\n| Chapters on progress bar | Yes | Plugin | No | No | No | No |\n| Document Picture-in-Picture | Yes | Basic | No | No | No | Basic |\n| Drop-in web component | Yes | No | No | No | No | No |\n| Bundle size (JS) | 50-410KB | 500KB+ | 60KB | 200KB+ | 400KB+ | 25KB |\n\n### Alternatives\n\nEvaluating Movi Player against the ecosystem:\n\n- **[video.js](https://videojs.com/), [Plyr](https://plyr.io/), [Vidstack](https://vidstack.io/) and [Media Chrome](https://www.media-chrome.org/)** are UI players for browser-**native** formats (MP4/WebM) and HLS/DASH — they can't open a raw MKV, HEVC or AV1 file.\n- **[hls.js](https://github.com/video-dev/hls.js) and [dash.js](https://github.com/Dash-Industry-Forum/dash.js)** are streaming *engines* (no arbitrary-file playback); **[Shaka Player](https://github.com/shaka-project/shaka-player)** is the DASH/HLS heavyweight. All three need content pre-packaged into adaptive streams server-side.\n- For playing an **arbitrary file** (MKV / AV1 / HEVC / 4K HDR) with **zero server work**, the closest peers are **[ffmpeg.wasm](https://github.com/ffmpegwasm/ffmpeg.wasm)** — a transcode/processing *library*, not a player, that CPU-decodes (heavy, no GPU) — and **[libmedia](https://github.com/zhaohappy/libmedia)**, a WASM + WebCodecs media SDK.\n\nMovi Player's niche is that same WebCodecs + FFmpeg-WASM playback, delivered as a **drop-in `<movi-player>` web component** with a batteries-included UI — HDR, chapters, multi-audio, built-in subtitles, ambient mode, Document PiP and encrypted playback — so it's a practical **alternative to video.js / hls.js / Shaka Player** when your files aren't browser-native, and a friendlier, GPU-accelerated **alternative to ffmpeg.wasm / libmedia** when you want a player, not a toolkit.\n\n## What's New in 0.4.0\n\nThe headline changes — see the [full changelog](CHANGELOG.md) for everything:\n\n- **[Custom controls API](#custom-controls-and-overlays)** — `addControl()` puts your own buttons in the player's bar and context menu (toggles, hotkeys, nested submenus); `showOverlay()` layers your own panels (end screens, up-next) over the picture, including in fullscreen.\n- **[Engine selection](#engine-selection-and-native-fallback)** — the `engine` attribute picks which playback engine leads (`wasm`, `shaka`, `dashjs`, `hlsjs`, `native`) and what follows it; `fallback=\"native\"` hands unplayable sources to a wrapped `<video>` instead of a dead end.\n- **Seamless quality switching + true Auto quality** — manual and adaptive rendition changes swap in place with no reload, no dropped playhead; Auto mode measures real link throughput and opens on the right rung, on HLS/DASH and plain multi-file ladders alike.\n- **Full native `<video>` parity** — all 78 `HTMLMediaElement`/`HTMLVideoElement` members answer, ten more standard events fire, and every documented attribute reflects as a JS property.\n- **[External chapters](#chapters)** — a `chapters` attribute/property for sources that keep chapters outside the container (CMS, watch page).\n- **`cropbars`** — strips letterbox/pillarbox padding baked into the source pixels before `cover`/`fill`/`zoom`.\n- **`titlemode` and granular `fastseek`** — control where the title bar appears (with an optional back arrow firing a cancelable `back` event), and which skip affordances (`buttons` / `keys` / `gestures`) are on.\n- **[Slim build](#slim-build)** — `movi-player/element/slim` ships the FFmpeg WASM as a separate cacheable `movi.wasm` (4.2MB JS vs. 11.4MB), with slim twins for the React/Vue/Svelte wrappers.\n- **Firefox extension** — the same player-in-a-tab experience as the Chrome extension, built from one shared codebase.\n- **Host-supplied error screen** — restyle via `::part()`, replace via `slot=\"error\"`, observe via the `errordisplay` event.\n- **Pluggable `SubtitleRenderer`** — plug in a custom ASS/SSA renderer (e.g. jassub) for full styling.\n- **`registerSourceAdapter()`** — teach the player custom `src` schemes (`s3://`, `ipfs://`, `ws://`) globally.\n- **Settings-change events** — `aspectchange`, `loopchange`, `stablevolumechange`, `hdrchange`, `ambientchange`, `rotatechange`, `audioonlychange`.\n- **VS Code IntelliSense** — attribute/value completion with hover docs for `<movi-player>`, plus CSS completion for the `--movi-*` theme variables.\n\n## Getting Started\n\n### Install\n\n```bash\nnpm i movi-player\n```\n\nOr skip the install entirely and load from a CDN as in the [Quickstart](#quickstart). Browser and editor integrations live in [`chrome-extension/`](chrome-extension/), [`firefox-extension/`](firefox-extension/), and [`vscode-extension/`](vscode-extension/).\n\n### HTML Element (simplest)\n\n```html\n<script type=\"module\" src=\"https://cdn.jsdelivr.net/npm/movi-player/dist/element.js\"></script>\n\n<movi-player src=\"video.mp4\" controls autoplay muted></movi-player>\n```\n\nOr with npm:\n\n```html\n<script type=\"module\">\n  import \"movi-player\";\n</script>\n\n<movi-player src=\"video.mp4\" controls autoplay muted></movi-player>\n```\n\n### Local File\n\n```html\n<movi-player id=\"player\" controls></movi-player>\n<input type=\"file\" onchange=\"document.getElementById('player').src = this.files[0]\" />\n```\n\n### React / Vue / Svelte\n\nTyped wrappers ship in the package — same attributes as the element, as props:\n\n```tsx\nimport { MoviPlayer } from \"movi-player/react\";\n\n<MoviPlayer src=\"video.mkv\" controls />\n```\n\n- **Vue**: `import { MoviPlayer } from \"movi-player/vue\"`\n- **Svelte**: `import MoviPlayer from \"movi-player/svelte\"`\n- Typed `<source>` / `<track>` children via `MoviSource` / `MoviTrack` — named exports of `movi-player/react` and `movi-player/vue`; Svelte imports them per file, from `movi-player/svelte/MoviSource` and `movi-player/svelte/MoviTrack`.\n- Each wrapper has a [slim](#slim-build) twin: `movi-player/react/slim`, `movi-player/vue/slim`, `movi-player/svelte/slim`.\n\n### Modules\n\n| Module | Size | Gzip | Brotli | What you get |\n|---|---|---|---|---|\n| `movi-player` / `movi-player/element` | ~410KB | 3.13 MB | 2.37 MB | Full player with UI, controls, gestures |\n| `movi-player/element/slim` | ~410KB | 1.00 MB + WASM | 750 KB + WASM | Same player, WASM shipped as a separate `movi.wasm` |\n| `movi-player/player` | ~180KB | 3.15 MB | 2.38 MB | Programmatic playback, no UI |\n| `movi-player/demuxer` | ~50KB | 2.37 MB | 1.79 MB | Metadata extraction, decoding only |\n\n> **Note:** Module sizes (first column) exclude the embedded WASM binary. Gzip/Brotli columns show the total transfer size including WASM. Enable Brotli compression on your server for optimal delivery.\n\n## Common Use Cases\n\n### Adaptive Streaming (HLS / DASH / Smooth)\n\n```html\n<!-- HLS -->\n<movi-player src=\"https://example.com/master.m3u8\" controls autoplay muted></movi-player>\n\n<!-- MPEG-DASH -->\n<movi-player src=\"https://example.com/manifest.mpd\" controls autoplay muted></movi-player>\n\n<!-- Smooth Streaming -->\n<movi-player src=\"https://example.com/manifest.ism/manifest\" controls autoplay muted></movi-player>\n```\n\n`.m3u8`, `.mpd`, and `.ism` are unified through Shaka Player (with hls.js / dash.js as automatic fallbacks) and drawn to the same canvas pipeline, so the quality menu, stats, and track switching work identically across all three. Live streams get a `LIVE` badge, jump-to-edge, DVR-window seeking, and an Auto-mode quality badge. Streams whose codec the browser can't decode escalate to the built-in FFmpeg-WASM demuxer automatically, keeping quality and track switching intact.\n\n### External Subtitles (`<track>`)\n\nStandard `<video>`-style markup, no JS wiring needed. Treats `kind=\"subtitles\"`, `kind=\"captions\"`, or no `kind` as caption tracks. `data-format=\"srt\"` to load SRT instead of the default VTT.\n\n```html\n<movi-player controls>\n  <source src=\"video.mp4\" type=\"video/mp4\">\n  <track src=\"subs-en.vtt\" srclang=\"en\" label=\"English\" kind=\"subtitles\" default>\n  <track src=\"subs-hi.vtt\" srclang=\"hi\" label=\"Hindi\" kind=\"subtitles\">\n  <track src=\"subs-jp.srt\" srclang=\"ja\" label=\"Japanese\" kind=\"subtitles\" data-format=\"srt\">\n</movi-player>\n```\n\n### Split Video + Audio Sources\n\nSeparate video and audio files via child `<source>` elements with `kind=\"audio\"`:\n\n```html\n<movi-player controls>\n  <source src=\"video-only.mp4\" type=\"video/mp4\">\n  <source src=\"audio-only.m4a\" type=\"audio/mp4\" kind=\"audio\">\n</movi-player>\n```\n\n### Multi-Language Audio\n\nDeclare two or more `<source kind=\"audio\">` tags with `srclang` (or `label`) and the player surfaces an audio-language menu. Default pick: explicit `default` / `data-default`, else the first match for the page locale, else the first one.\n\n```html\n<movi-player controls>\n  <source src=\"video.mp4\" type=\"video/mp4\">\n  <source src=\"audio-en.m4a\" type=\"audio/mp4\" kind=\"audio\" srclang=\"en\" label=\"English\" default>\n  <source src=\"audio-hi.m4a\" type=\"audio/mp4\" kind=\"audio\" srclang=\"hi\" label=\"Hindi\">\n  <source src=\"audio-ja.m4a\" type=\"audio/mp4\" kind=\"audio\" srclang=\"ja\" label=\"Japanese\">\n</movi-player>\n```\n\n### Quality Menu from Plain Files\n\nDeclare multiple video sources with `data-height` to get a YouTube-style quality picker without an HLS manifest — with seamless in-place switching and an Auto (adaptive) mode when bitrates are declared:\n\n```html\n<movi-player controls>\n  <source src=\"video-1080p.mp4\" type=\"video/mp4\" data-height=\"1080\" data-label=\"1080p\">\n  <source src=\"video-720p.mp4\"  type=\"video/mp4\" data-height=\"720\"  data-label=\"720p\">\n  <source src=\"video-480p.mp4\"  type=\"video/mp4\" data-height=\"480\"  data-label=\"480p\">\n</movi-player>\n```\n\n### Chapters\n\nChapters embedded in MKV/MP4 containers are picked up automatically — markers on the progress bar, titles in the seek tooltip. For sources that keep chapters elsewhere (a CMS, a watch page), pass them in:\n\n```html\n<movi-player src=\"video.mp4\" controls\n  chapters='[{\"title\":\"Intro\",\"start\":0},{\"title\":\"The Build\",\"start\":95},{\"title\":\"Results\",\"start\":310}]'>\n</movi-player>\n```\n\nOr as a property: `player.chapters = [{ title, start, end? }]` (times in seconds). Supplied chapters win over the container's.\n\nAdd `image` to a chapter and the timeline strip shows that artwork instead of decoding a frame at `start` — the picture you chose, and one less seek per chapter:\n\n```js\nplayer.chapters = [\n  { title: \"Intro\", start: 0, image: \"/art/intro.jpg\" },\n  { title: \"The Build\", start: 95 },   // no image → a frame from the video\n];\n```\n\nA URL that fails to load falls back to the same title-only tile a missing frame gets.\n\n### Remembering Viewer Settings\n\nBy default the player remembers volume, mute, speed, and its toggles on its own. The `persist` attribute takes over that decision explicitly — an opt-in list of exactly what is remembered:\n\n```html\n<movi-player src=\"video.mp4\" controls\n             persist=\"volume speed audiolang subtitlelang\"\n             persistkey=\"my-app\"></movi-player>\n```\n\nSettings: `loop`, `muted`, `volume`, `speed`, `ambient`, `stablevolume`, `hdr`, `aspect`, `cropbars`, `audiolang`, `subtitlelang`. Languages are remembered as a *language*, not a track number, and matched against each new file's tracks. `persistkey` namespaces the store so two players on a page don't share preferences. See [`persist`](https://moviplayer.com/docs/api/element#persist) in the docs.\n\n### Resume and Posters\n\n```html\n<movi-player src=\"video.mp4\" controls resume postertime=\"10%\"></movi-player>\n```\n\n`resume` saves the position to localStorage and shows a resume dialog on reload. `postertime` accepts `\"5\"`, `\"1:30\"`, `\"0:01:30\"`, or `\"10%\"` and renders a native-resolution frame — no pre-rendered thumbnail needed.\n\n## Advanced\n\n### Custom Controls and Overlays\n\n`addControl()` puts a control of your own in the player's chrome — the bottom bar, the right-click menu, or both — so it sits with the built-ins instead of beside them. Described once; the player builds the button and the menu row, keeps them in sync, and removes them together.\n\n```js\nplayer.addControl({\n  id: \"autoplay-next\",\n  label: \"Autoplay\",\n  icon: '<svg viewBox=\"0 0 24 24\">…</svg>',\n  before: \"cc\",            // sits just left of the subtitles button\n  placement: \"both\",       // bar AND context menu, one shared state\n  toggle: true,\n  hotkey: \"shift+a\",       // appears in the shortcuts panel, flashes the OSD\n  onSelect: (on) => setAutoplay(on),\n});\n```\n\nControls can open nested submenus (`items` / `onPick`, any depth), persist their toggle state (`persist: true`), group into a bar capsule of their own (`group`), anchor differently per surface (`anchors: { bar, menu }` — an anchor can be a list for a neighbour that only sometimes exists), and declare `media: \"video\" | \"audio\" | \"both\"` to hide themselves for content they don't apply to. `updateControl(id, patch)` and `removeControl(id)` manage them afterwards.\n\nHost overlays put your own panel over the picture — including in fullscreen:\n\n```js\nplayer.showOverlay({\n  id: \"up-next\",\n  content: upNextCard,           // markup or an Element\n  placement: \"bottom-end\",       // \"fill\" | \"center\" | \"bottom-end\"\n  dismissOn: [\"play\", \"escape\"],\n});\n// later: player.updateOverlay(\"up-next\", { content }) / player.hideOverlay(\"up-next\")\n```\n\nFull spec: [Custom Controls](https://moviplayer.com/docs/api/element#custom-controls) in the docs.\n\n### Engine Selection and Native Fallback\n\nMovi has multiple ways to play a source and a sensible built-in order: its own WASM demuxer + WebCodecs pipeline first, Shaka (then dash.js / hls.js) for adaptive manifests, the browser's `<video>` last. The `engine` attribute re-orders that — the first name leads, any others replace the built-in escalation:\n\n```html\n<!-- Play through the browser; fall back to Movi's pipeline only if it can't -->\n<movi-player src=\"video.mp4\" engine=\"native wasm\" controls></movi-player>\n\n<!-- Prefer dash.js over Shaka for manifests -->\n<movi-player src=\"manifest.mpd\" engine=\"dashjs shaka\" controls></movi-player>\n```\n\nValues: `wasm`, `shaka`, `dashjs`, `hlsjs`, `native`.\n\n`fallback=\"native\"` handles the other direction — a source Movi itself can't read (a no-CORS cross-origin file, a transient network failure) is handed to the browser's own `<video>` wrapped in the player's controls instead of a dead end. The degraded surface keeps a `<source>` quality ladder switching in place, parses `<track>` subtitles into Movi's own overlay, and syncs a companion `<audio>` for split video+audio sources. The `nativefallback` event tells you it happened.\n\n```html\n<movi-player src=\"video.mkv\" fallback=\"native\" controls></movi-player>\n```\n\n### Slim Build\n\n`movi-player/element/slim` is the same `<movi-player>` element with the same API — only the WASM ships differently. The default build embeds the FFmpeg WASM inside the JS (11.4 MB of JS); the slim build keeps it as a separate `movi.wasm` (4.2 MB JS + 5.6 MB WASM), so the engine streams and compiles as a cacheable asset and the JS parses far faster. If the WASM can't be fetched, playback falls back to the browser's native `<video>` automatically — no `fallback=\"native\"` needed.\n\n```typescript\nimport \"movi-player/element/slim\";\n```\n\nYou host `movi.wasm` yourself — it ships in the package at `movi-player/dist/movi.wasm`. Vite / webpack 5 / Parcel 2 emit it automatically; otherwise copy it next to your bundle or point at it with `wasmurl`:\n\n```html\n<movi-player\n  src=\"video.mkv\"\n  wasmurl=\"https://cdn.example.com/movi-player/movi.wasm\"\n  controls\n></movi-player>\n```\n\nThe framework wrappers have slim twins too — `movi-player/react/slim`, `movi-player/vue/slim`, `movi-player/svelte/slim` — same components, same props. At runtime, `MoviElement.build` / `el.build` reports `\"slim\"` or `\"full\"`, and `MoviElement.version` / `el.version` the package version. See [Modules](https://moviplayer.com/docs/guide/modules) for details.\n\n### Custom Request Headers\n\n```html\n<!-- JSON attribute -->\n<movi-player\n  src=\"https://example.com/master.m3u8\"\n  headers='{\"Authorization\":\"Bearer <token>\"}'\n  controls autoplay muted\n></movi-player>\n```\n\n```js\n// Or the property (preferred for non-trivial maps)\nplayer.headers = { Authorization: `Bearer ${token}` };\n```\n\nHeaders ride along on every media request -- manifest + segments, progressive HTTP, thumbnails, and the encrypted source.\n\n### Encrypted Playback\n\n```html\n<movi-player\n  encrypted\n  tokenurl=\"/api/token\"\n  videourl=\"/api/video\"\n  videoid=\"movie.mp4\"\n  controls autoplay muted\n></movi-player>\n```\n\nAES-256-GCM encrypted, HMAC signed, 2s token expiry, IP + fingerprint binding.\nSee [encrypted-server/](encrypted-server/) for the server example.\n\n### DRM (Widevine / PlayReady / FairPlay)\n\n```html\n<movi-player\n  src=\"https://example.com/encrypted.m3u8\"\n  drm\n  licenseurl=\"https://license.pallycon.com/ri/licenseManager.do\"\n  controls autoplay\n></movi-player>\n```\n\nRequires a DRM license server (PallyCon, EZDRM, BuyDRM, etc.). Key systems are tried Widevine → PlayReady → FairPlay. Extra headers for the license request only (auth token, customer ID) go in `licenseheaders` (a JSON object string). In DRM mode, the native `<video>` element is used (canvas features like rotation are disabled).\n\n### Programmatic Playback (no UI)\n\n```typescript\nimport { MoviPlayer } from \"movi-player/player\";\n\nconst player = new MoviPlayer({\n  source: { type: \"url\", url: \"video.mp4\" },\n  canvas: document.getElementById(\"canvas\"),\n});\n\nawait player.load();\nawait player.play();\n```\n\nSee the [Programmatic API guide](https://moviplayer.com/docs/guide/programmatic-api).\n\n### Demuxer Only (50KB)\n\n![Demuxer](docs/images/demuxer.webp)\n\n[Live Demo](https://movi-player-examples.vercel.app/demuxer.html) | [Source](https://github.com/MrUjjwalG/movi-player-examples/blob/main/demuxer.html)\n\nExtract metadata, tracks, HDR info, and thumbnails without playing the video.\n\n```typescript\nimport { Demuxer, HttpSource } from \"movi-player/demuxer\";\n\nconst demuxer = new Demuxer(new HttpSource(\"video.mp4\"));\nconst info = await demuxer.open();\n\nconsole.log(`Duration: ${info.duration}s, Format: ${info.formatName}`);\nconsole.log(`Chapters: ${info.chapters.length}`);\n\nconst video = demuxer.getVideoTracks()[0];\nconsole.log(`${video.width}x${video.height} ${video.codec} ${video.frameRate}fps`);\nconsole.log(`HDR: ${video.isHDR}, Color: ${video.colorPrimaries}/${video.colorTransfer}`);\n\nconst audio = demuxer.getAudioTracks();\nconsole.log(`Audio: ${audio.map(a => `${a.codec} ${a.language}`).join(\", \")}`);\n\nconst subs = demuxer.getSubtitleTracks();\nconsole.log(`Subtitles: ${subs.map(s => `${s.codec} ${s.language}`).join(\", \")}`);\n\ndemuxer.close();\n```\n\nUse cases: video validators, asset management, HDR detection pipelines, search indexing, format analysis before transcoding.\n\n### Custom Source Adapters\n\nPlug any byte protocol (WebSocket, WebRTC, IndexedDB, custom encryption) into the element, player, or demuxer via the `SourceAdapter` contract. `registerSourceAdapter()` teaches the player custom `src` schemes globally — no per-element wiring:\n\n```typescript\nimport { registerSourceAdapter } from \"movi-player\";\n\nregisterSourceAdapter(\"s3\", (config) => new MyS3Source(config.url));\n```\n\n```html\n<movi-player src=\"s3://bucket/video.mkv\" controls></movi-player>\n```\n\nSee [Sources](https://moviplayer.com/docs/api/sources) in the docs.\n\n### Embedding Hooks\n\n- **Host fullscreen handoff** — a cancelable `movi-fullscreen-request` event plus `setHostFullscreen()` let embedders (VS Code webview, custom apps) take over fullscreen and keep the player's UI in sync; `exitFullscreen()` covers all fullscreen routes.\n- **Host error screen** — every piece of the built-in error overlay carries a `part=` for `::part()` restyling; `slot=\"error\"` replaces it outright; the `errordisplay` event (and `errorTitle` / `errorMessage` properties) carries the exact wording on screen, including format/codec failures that never raise a runtime `error`. See [Customizing the Error Screen](https://moviplayer.com/docs/api/element#customizing-the-error-screen).\n- **`noerrorscreen`** — suppress the built-in error overlays entirely and render your own.\n\n## Reference\n\nFull reference with every property, method, and event: **[API docs](https://moviplayer.com/docs/api/element)**.\n\n### Element Attributes\n\nEvery attribute can also be read and set as a JS property (`el.rotate = 90`). Grouped by concern:\n\n<details>\n<summary><b>Source & network</b> — <code>src</code>, <code>preload</code>, <code>headers</code>, <code>buffersize</code>, …</summary>\n\n<br />\n\n| Attribute | Example | Description |\n|---|---|---|\n| `src` | `src=\"video.mkv\"` | Video source URL — or assign a `File` from JS: `player.src = file` |\n| `preload` | `preload=\"metadata\"` | `none` \\| `metadata` \\| `auto` — how much data to buffer initially |\n| `headers` | `headers='{\"k\":\"v\"}'` | Custom HTTP headers (JSON) applied to every media request — manifests, segments, progressive HTTP, thumbnails, encrypted source |\n| `crossorigin` | `crossorigin=\"anonymous\"` | CORS mode: `anonymous` \\| `use-credentials` |\n| `buffersize` | `buffersize=\"200\"` | Target prefetch window in **MB** (HTTP + encrypted) |\n| `probesize` | `probesize=\"2mb\"` | How far the demuxer may read before naming the streams — bytes, or `\"512kb\"` / `\"2mb\"` |\n| `probeduration` | `probeduration=\"5000\"` | How much media it may analyse first, in milliseconds |\n| `backgroundplay` | `backgroundplay` | Let `autoplay` start while the tab is hidden (off by default) |\n| `bindav` | `bindav=\"false\"` | Stall sound and picture together on a slow link. **On by default** — `\"false\"` opts out |\n\n</details>\n\n<details>\n<summary><b>Playback</b> — <code>controls</code>, <code>autoplay</code>, <code>loop</code>, <code>volume</code>, <code>resume</code>, …</summary>\n\n<br />\n\n| Attribute | Example | Description |\n|---|---|---|\n| `controls` | `controls` | Show the built-in UI controls |\n| `autoplay` | `autoplay` | Start playback automatically when loaded |\n| `muted` | `muted` | Start muted |\n| `loop` | `loop` | Restart playback when the video ends |\n| `volume` | `volume=\"0.8\"` | Initial volume 0..1 (a persisted user choice overrides it) |\n| `playbackrate` | `playbackrate=\"1.25\"` | Initial playback speed |\n| `startat` | `startat=\"30\"` | Start playback at this time, in seconds |\n| `playsinline` | `playsinline` | Play inline (no auto-fullscreen on iOS); on touch devices, suppresses swipe/volume gestures while inline so they don't fight page scroll |\n| `resume` | `resume` | Save position to localStorage; show a resume dialog on reload |\n\n</details>\n\n<details>\n<summary><b>Appearance & layout</b> — <code>theme</code>, <code>objectfit</code>, <code>rotate</code>, <code>hdr</code>, <code>cropbars</code>, <code>title</code>, …</summary>\n\n<br />\n\n| Attribute | Example | Description |\n|---|---|---|\n| `poster` | `poster=\"thumb.jpg\"` | Poster image before playback starts |\n| `posterfit` | `posterfit=\"cover\"` | How the poster is fitted, when it should differ from the video's fit |\n| `postertime` | `postertime=\"10%\"` | Generate a native-resolution poster frame from a timestamp (`\"5\"`, `\"1:30\"`, `\"10%\"`) |\n| `width` / `height` | `width=\"640\"` | Element dimensions (CSS preferred) |\n| `theme` | `theme=\"dark\"` | UI theme: `dark` \\| `light` |\n| `themecolor` | `themecolor=\"#8B5CF6 #22D3EE\"` | Accent colour — one or two, space-separated (secondary drives the centre play/pause flash) |\n| `objectfit` | `objectfit=\"contain\"` | `contain` \\| `cover` \\| `fill` \\| `zoom` \\| `control` |\n| `rotate` | `rotate=\"90\"` | Rotate the video: `0` \\| `90` \\| `180` \\| `270` degrees |\n| `cropbars` | `cropbars` | Crop letterbox/pillarbox bars baked into the picture, so `cover`/`fill`/`zoom` size the image, not its padding |\n| `hdr` | `hdr` | Enable HDR rendering (Chromium + canvas renderer + HDR source) |\n| `renderer` | `renderer=\"canvas\"` | Rendering backend (`canvas`; HLS/DASH/DRM auto-pick their own pipeline) |\n| `ambientmode` | `ambientmode` | Ambient background glow |\n| `ambientwrapper` | `ambientwrapper=\"#wrap\"` | CSS selector for an external element to receive the ambient glow |\n| `title` | `title=\"My Video\"` | Video title (in-player overlay only — no native tooltip) |\n| `showtitle` | `showtitle` | Show the title bar overlay at the top |\n| `titlemode` | `titlemode=\"fullscreen back\"` | Where the title bar may show: `both` (default) \\| `fullscreen` \\| `windowed`; add `back` (or `back-mobile`, `back-fullscreen`, `back-mobile-fullscreen`) for a back arrow that fires a cancelable `back` event |\n\n</details>\n\n<details>\n<summary><b>Controls & input</b> — <code>fastseek</code>, <code>doubletap</code>, <code>nohotkeys</code>, <code>controlslist</code>, …</summary>\n\n<br />\n\n| Attribute | Example | Description |\n|---|---|---|\n| `fastseek` | `fastseek=\"keys gestures\"` | ±10s skip affordances. Bare = all; or narrow to `buttons`, `keys`, `gestures` (aliases: `touch`, `nontouch`, `keyonly`, `controls`, `none`) |\n| `doubletap` | `doubletap=\"true\"` | Double-tap to seek ±10s |\n| `thumb` | `thumb` | Generate on-demand thumbnails for seek-bar previews |\n| `nohotkeys` | `nohotkeys` | Disable all keyboard shortcuts |\n| `controlslist` | `controlslist=\"nofullscreen nopip nospeed\"` | Switch built-in controls off, as `no<name>` tokens (`noplay`, `nocc`, `noquality`, `nosettings`, … or the `id` of an `addControl()` control) |\n| `noerrorscreen` | `noerrorscreen` | Suppress the built-in error overlays (host renders its own) |\n| `disablepictureinpicture` | `disablepictureinpicture` | Refuse Picture-in-Picture, like `<video disablepictureinpicture>` |\n| `disableremoteplayback` | `disableremoteplayback` | Turn off remote playback targets (AirPlay, Cast) |\n| `gesturefs` | — | **Deprecated** — use `playsinline` |\n\n</details>\n\n<details>\n<summary><b>Subtitles</b> — <code>subtitledelay</code>, <code>subtitlesize</code>, <code>subtitlecolor</code>, …</summary>\n\n<br />\n\n| Attribute | Example | Description |\n|---|---|---|\n| `subtitledelay` | `subtitledelay=\"0.2\"` | Subtitle offset in seconds (positive = later; VLC/mpv sign) |\n| `subtitlesize` | `subtitlesize=\"1.2\"` | Size multiplier (also persisted via UI) |\n| `subtitlecolor` | `subtitlecolor=\"#FFFF00\"` | Text colour |\n| `subtitlebg` | `subtitlebg=\"0.5\"` | Background opacity 0..1 |\n| `subtitleedge` | `subtitleedge=\"outline\"` | `none` \\| `shadow` \\| `outline` \\| `raised` |\n\n</details>\n\n<details>\n<summary><b>Audio</b> — <code>audioonly</code>, <code>audiooutput</code>, <code>stablevolume</code></summary>\n\n<br />\n\n| Attribute | Example | Description |\n|---|---|---|\n| `audioonly` | `audioonly` | Data-saver: play audio only, skip the video decode (toggleable live) |\n| `audiooutput` | `audiooutput=\"Headphones\"` | Route audio to a device — a `deviceId` or a case-insensitive label substring; `\"\"` = system default |\n| `stablevolume` | `stablevolume` | Loudness normalization (DynamicsCompressorNode) |\n\n</details>\n\n<details>\n<summary><b>Chapters & persistence</b> — <code>chapters</code>, <code>persist</code>, <code>persistkey</code></summary>\n\n<br />\n\n| Attribute | Example | Description |\n|---|---|---|\n| `chapters` | `chapters='[{\"title\":\"Intro\",\"start\":0}]'` | Chapters from outside the media file — JSON array of `{title, start, end?, image?}` (seconds); `image` is artwork for the timeline tile, in place of a decoded frame. The property takes the array directly |\n| `persist` | `persist=\"volume speed audiolang\"` | Which settings to remember across loads — space-separated, opt-in per setting; see [Remembering Viewer Settings](#remembering-viewer-settings) |\n| `persistkey` | `persistkey=\"my-app\"` | Namespace for everything `persist` stores |\n\n</details>\n\n<details>\n<summary><b>Engine & decoding</b> — <code>engine</code>, <code>fallback</code>, <code>sw</code>, <code>wasmurl</code>, <code>lcevc</code>, …</summary>\n\n<br />\n\n| Attribute | Example | Description |\n|---|---|---|\n| `engine` | `engine=\"native wasm\"` | Playback-engine priority, space-separated: `wasm` \\| `shaka` \\| `dashjs` \\| `hlsjs` \\| `native`. First name leads; the rest replace the built-in escalation |\n| `fallback` | `fallback=\"native\"` | Hand a source Movi can't play to the browser's `<video>`, wrapped in the player's controls |\n| `sw` | `sw` | Force software decoding (FFmpeg WASM) instead of WebCodecs |\n| `fps` | `fps=\"60\"` | Override the video frame rate (0 = use the source's own) |\n| `wasmurl` | `wasmurl=\"/movi.wasm\"` | Slim build only: URL of the external `movi.wasm` |\n| `lcevc` | `lcevc` | MPEG-5 LCEVC enhancement-layer decoding for adaptive streams (needs `lcevc_dec.js`) |\n| `lcevcurl` | `lcevcurl=\"https://…\"` | URL to lazy-load the `lcevc_dec.js` decoder library |\n\n</details>\n\n<details>\n<summary><b>Immersive / VR</b> — <code>vr</code>, <code>vrpad</code></summary>\n\n<br />\n\n| Attribute | Example | Description |\n|---|---|---|\n| `vr` | `vr=\"180 fisheye sbs\"` | Force an immersive projection: `360` / `180` / `fisheye` / `sbs` (3D) / `littleplanet`. Sources with spherical metadata auto-enter without it |\n| `vrpad` | `vrpad` | Opt-in on-screen look-around joystick for `vr` mode |\n\n</details>\n\n<details>\n<summary><b>Encrypted playback & DRM</b> — <code>encrypted</code>, <code>drm</code>, <code>licenseurl</code>, …</summary>\n\n<br />\n\n| Attribute | Example | Description |\n|---|---|---|\n| `encrypted` | `encrypted` | Encrypted playback mode (requires `tokenurl` + `videourl`) |\n| `tokenurl` | `tokenurl=\"/api/token\"` | Token endpoint — returns HMAC signing secret and file metadata |\n| `videourl` | `videourl=\"/api/video\"` | Video endpoint — chunks served with token + HMAC validation |\n| `videoid` | `videoid=\"movie.mp4\"` | Video identifier sent to the token server |\n| `drm` | `drm` | DRM mode for adaptive streams (native `<video>` + EME; canvas-only features disabled) |\n| `licenseurl` | `licenseurl=\"https://…\"` | Widevine/PlayReady/FairPlay license server URL |\n| `licenseheaders` | `licenseheaders='{\"k\":\"v\"}'` | Extra HTTP headers for the DRM **license request only** (JSON object string) |\n\n</details>\n\n### Events\n\nThe standard `HTMLMediaElement` events all fire (`loadedmetadata`, `canplay`, `play`, `pause`, `seeking`/`seeked`, `timeupdate`, `progress`, `durationchange`, `ended`, `error`, `volumechange`, `ratechange`, …), so `<video>`-oriented code works unchanged. Movi adds its own:\n\n<details>\n<summary><b>Player-specific events</b></summary>\n\n<br />\n\n| Event | Payload | Fires when |\n|---|---|---|\n| `statechange` | `PlayerState` | Underlying player state transitioned |\n| `errordisplay` | `{ title, message, canRetry, canTrySoftware }` | An error screen went up — the wording the viewer sees, including codec failures that raise no runtime `error` |\n| `trackschange` | `Track[]` | Available tracks list updated |\n| `audiotrackchange` / `subtitletrackchange` | — | Active audio / subtitle track switched |\n| `qualitychange` | `{ trackId }` | Active video quality / track switched |\n| `subtitledelaychange` | `{ subtitleDelay }` | Subtitle offset changed |\n| `aspectchange`, `loopchange`, `stablevolumechange`, `hdrchange`, `ambientchange`, `rotatechange`, `audioonlychange` | setting-specific | A viewer changed a setting — persist it host-side if you want |\n| `fullscreenchange` | `{ fullscreen }` | Entered/exited fullscreen |\n| `movi-fullscreen-request` | cancelable | Before `requestFullscreen()` — `preventDefault()` to take over via `setHostFullscreen()` |\n| `back` | cancelable | The `titlemode` back arrow was pressed |\n| `pipchange` (+ `enterpictureinpicture` / `leavepictureinpicture`) | `{ pip }` | PiP window opened/closed |\n| `titlechange` | `{ title }` | Displayed title changed |\n| `coverart` | `ImageBitmap \\| null` | Embedded cover art extracted |\n| `audiooutputchange` | `{ deviceId }` | Audio routed to a different output device |\n| `audiostripchange` | `{ active }` | Audio-only strip layout entered/left |\n| `preloadcomplete` | — | Initial preload buffer filled |\n| `linearmode` | — | Server ignores `Range` — playback is forward-only; hide seek-dependent UI |\n| `nativefallback` | `{ src }` | Source handed to a native `<video>` (`fallback=\"native\"`) |\n| `filerevoked` | `{ offset, length, reason }` | The browser revoked the underlying `File` handle — prompt a re-pick |\n| `movi-control` | control-specific | A custom control added via `addControl()` was used |\n| `movi-qoe` | QoE snapshot | Playback-quality telemetry sample |\n\n</details>\n\nFull list with payload types: [Events](https://moviplayer.com/docs/api/events).\n\n### Keyboard Shortcuts\n\nPress `?` during playback to toggle the shortcuts panel (also available from the right-click context menu).\n\n<details>\n<summary><b>Shortcut table</b></summary>\n\n<br />\n\n| Key | Action | Key | Action |\n|---|---|---|---|\n| `Space` / `K` | Play / Pause | `B` | Cycle audio track |\n| `F` | Fullscreen | `L` | Toggle loop |\n| `M` | Mute | `U` | Toggle stable volume |\n| `R` | Rotate 90 | `G` | Toggle ambient mode |\n| `A` | Cycle aspect ratio | `H` | Toggle HDR |\n| `I` | Stats for nerds | `+` / `-` | Speed up / down |\n| `T` | Timeline | `?` | Shortcuts panel |\n| `S` | Snapshot | `0` / `Home` | Seek to start |\n| `P` | Picture-in-Picture | Arrows | Seek / Volume |\n| `V` | Cycle subtitle track | `Z` / `X` | Subtitle delay -/+ 100ms |\n| `1` – `9` | Seek to 10%–90% | | |\n\n</details>\n\n### Theming\n\nThe UI is themeable through `--movi-*` CSS custom properties (accent colours, radii, control sizes, shadows, transitions) — set them on the element or any ancestor. The full variable list ships in [`custom-elements.json`](custom-elements.json) and the [element docs](https://moviplayer.com/docs/api/element#theming), with IntelliSense in VS Code via the [extension](vscode-extension/).\n\n## Server Requirements\n\nVideos served over HTTP need:\n\n1. **Range requests** -- for seeking\n2. **CORS headers** -- if cross-origin\n\n**COOP/COEP headers are _optional_.** The WASM engine is single-threaded with Asyncify I/O, so it plays fine **without** `SharedArrayBuffer` — no isolation headers, no service worker, no \"Security Headers Missing\" screen. Setting them only enables an optional **zero-copy `SharedArrayBuffer` fast-path** for HTTP streaming; without them `HttpSource` uses a plain-buffer path and streams normally.\n\n```\nCross-Origin-Opener-Policy: same-origin\nCross-Origin-Embedder-Policy: require-corp\n```\n\nOn static hosts where you can't set response headers (GitHub Pages, Netlify free tier, etc.), [coi-serviceworker](https://github.com/gzuidhof/coi-serviceworker) can inject these client-side if you want the fast-path — but it's no longer required to play.\n\n## Browser Support\n\n| Browser | WebCodecs | HDR |\n|---|---|---|\n| Chrome 110+ | Yes | Yes |\n| Edge 110+ | Yes | Yes |\n| Safari 18+ | Yes | Yes |\n| Firefox 130+ | Yes | Limited |\n\n## Development\n\n```bash\ngit clone --recurse-submodules https://github.com/mrujjwalg/movi-player.git\ncd movi-player\nnpm install\nnpm run build:wasm    # Requires Docker\nnpm run build:ts\nnpm run dev\n```\n\n## AI Assistants\n\n[AGENTS.md](./AGENTS.md) is a tour of the architecture, public API, and the\nnon-obvious tradeoffs (4K rate cap, ambient-mode cost, `.ts` long-GOP handling,\naudio threshold ↔ AudioContext `latencyHint` coupling, etc.). It's written for\nAI coding assistants — Claude, Cursor, Codex, Copilot — but humans onboarding\nto the codebase will find it useful too.\n\nThe file ships inside the npm package as well, so when you install\n`movi-player` you can point your assistant at\n`node_modules/movi-player/AGENTS.md` (most tools either pick it up\nautomatically from the workspace or accept it via an `@-mention`). Filename\nfollows the [AGENTS.md convention](https://agents.md/) so newer tools that\nauto-discover it work out of the box.\n\n## License\n\nApache 2.0 -- [Ujjawal Kashyap](https://github.com/mrujjwalg)\n","readmeFilename":"README.md"}