{"_id":"@alessiofrittoli/media-utils","_rev":"22-ed36482d8cf31b21d7af62996a0d81e5","name":"@alessiofrittoli/media-utils","dist-tags":{"alpha":"1.0.0-alpha.16","latest":"1.3.0"},"versions":{"0.1.0":{"name":"@alessiofrittoli/media-utils","version":"0.1.0","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@0.1.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"a40cf7377bb3f6c117c8b45f771fb555308d029d","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-0.1.0.tgz","fileCount":11,"integrity":"sha512-KZOUhXNnj4LRax7YKupB+X5q6uZZ8YO1Mcu6LH2Ae+hhd5tw+GUQpJfOV/B50RiKf+9GjJZSfBs6AmNJuqzpYA==","signatures":[{"sig":"MEQCIEC3D9sntgLFwnmwgDHvyFrThH3OVra3hPPPJGjwmXwvAiAuntAyQLVAMCbawtz9GgNl7RphxB2LDasQrVFuP51fIQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86481},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./mime":{"import":{"types":"./dist/mime.d.mts","default":"./dist/mime.mjs"},"require":{"types":"./dist/mime.d.ts","default":"./dist/mime.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"58b9740b602626263dbac2b180e914d7ab310f06","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/web-utils":"^1.20.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.0","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.55.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_0.1.0_1771195202692_0.05689273589020494","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.1":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.1","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"45af16ede3bfecaa449b77e6cfd9b35b5bc90203","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.1.tgz","fileCount":7,"integrity":"sha512-KKvThABNkBqPSKzoYuVTWe14K0LrV25/u6HV3bRMobBGuUJMhR4PTCTo2gNQH9nRiY43VZ6VFtYdWnp6mnxufg==","signatures":[{"sig":"MEUCIEbPRYVr/rQ+/pMNw6dbNkm4jVUR85xMSOmYXP7v0Zj7AiEAo9r9mZ94f1MSV2+WFhtU4Ol9mnlylVEFiydjCpegijw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85043},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"a652e8f5fc28874e698f0eede03c39ef2fd3179b","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.0","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.55.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.1_1771238491354_0.7946460998611995","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.2":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.2","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.2","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"ef00062ba9b509cda7a2ae765402f202856e7c5b","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.2.tgz","fileCount":11,"integrity":"sha512-veWYZvbpjzPJDo9oPHN0qvACgTBjZwZ1sc0IGjjCygf265gD8iI/KEcwptGE5e0OgxVmXJMI425yB9eH+FcqKw==","signatures":[{"sig":"MEQCIGoJr8xth26JaDlbzwF1nPccuX/twPPISmqmY9PqTyWMAiAOfPQSa1sB+c7wKc3W97mOSNhFW+OynWqCYi8O+KpR7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103131},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"f01ed7a17281b7194e607391799e1fe471c96058","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.0","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.55.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.2_1771332217627_0.8460913334311557","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.3":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.3","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.3","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"45dfa18d70804655d168793c3f8cb1d0ff4ee51d","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.3.tgz","fileCount":15,"integrity":"sha512-H+ctzj+tf7Ywj3r976upfG8tXnhNUto0funZrfWJnllIB8t5tQ3Lp8GJ5qAYFqnPGJPR669mNhD7seTLuU57RA==","signatures":[{"sig":"MEYCIQCwyH0WCDbzeuIGtFvfEY3FBAOJ3Q/iJ8pYPfPDu5pmxQIhAP/g79a2HX1mBDM3kPVf8HR2+rs870tX0CGoLLhLZCdP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116707},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"7a407ca43a79450a5a03cc06bc59d9cb926853ef","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.0","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.55.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.3_1771351470207_0.019325668207612834","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.4":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.4","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.4","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"e99cd9d2f1797c9b004f4e86f5b9ffc99603b66e","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.4.tgz","fileCount":15,"integrity":"sha512-vlnSOV2on68qab7o0iZtwFGPkUPqqClzZEMWvGx9oDFAt4JiPPqzXOjWElv1CfygOyFU1sUG1ApHBO/r409bjA==","signatures":[{"sig":"MEQCIHLxsU/y2sOTNPtVlNiMFJrMaJddtUT8SCffGGMq5iQeAiAbiLSiefoVe31oJrVzObqa7Z9Wsii/ugMHrvzeBnCnzg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116849},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"2bcd4f265a770b2c504466a990e4b0a17768e86e","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.0","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.55.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.4_1771353202909_0.09983567133806392","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.5":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.5","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.5","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"6073de7628f84b76d180a8a7d0c38f77a7723edd","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.5.tgz","fileCount":15,"integrity":"sha512-lpQifzUIqQtjqY9cKICiF0j9Hwzk+LphXkpmkqb8/ySo2BNtIQLsLIeVKrHsKFSetxyj5ndAOlISuwpIyJsuhw==","signatures":[{"sig":"MEYCIQDX+AgK4Ay418P6EVqShZO6tGVeQ7dfyRcS4yzmK8lOdwIhALDnC+uMWeqc2CdUGvK/uSMIMPP/bH0dLIlPLvqroWas","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120657},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"c4465c4fd9d79e2171d07498d4efac20dbe8fd6b","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.0","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.5_1771355746375_0.12958150629536602","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.6":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.6","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.6","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"020d1f7e974367f121cef09aa1e9ee080d30d280","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.6.tgz","fileCount":15,"integrity":"sha512-sTP0aFABbYv6d5nhIetOCdX6KY4tZW108HvmJHGiPcCZtDl34pgB/febRb2kmAJI0Zlv7JLuRy3E4bjJ8MHvUQ==","signatures":[{"sig":"MEUCIQDgRhn6yI4BlA8aarHVe9f4YvDcVEOWq+H1nv+FGrkvQgIgQ6e4+/VH68KgsyRBSzU2dEO0Bv5sUKKrCx0eOZ7n4lQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120649},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"c30ee8cf1ab89e7f7f26ca0ed7be91cc6edb78a2","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.0","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.6_1771408001817_0.48049468423566144","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.7":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.7","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.7","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"5ac3648a4185cddbcfb5eb60d550f405dde8faf4","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.7.tgz","fileCount":15,"integrity":"sha512-9LmnWzDeslblHDVYJTr2kq2oht8IoPgQSUymjQCZXWBIV+RgZqg2kE1upzedzZkB9kBns8hR8evHWQazCkwwVA==","signatures":[{"sig":"MEUCIEL0l1V36uKMMy+UnIP49UA5Js1t1RATfHZsw74zJgzIAiEAkEROgagLVid+2C2/yB6nIlDDhAPQgGhXFC9s861sXRs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121404},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"eeda4761c8eb37396c8e72ea52292e8fb59e78d8","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.0","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.7_1771690703464_0.9912783819577351","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.8":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.8","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.8","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"e16c4d8a334e8e0bb3fd750da98ac2291feebc5d","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.8.tgz","fileCount":15,"integrity":"sha512-eePkbCIy7SpMyMuD9xrwVrbeWz1SmxPLaPX9A7oMYRbzbAnYrhNQV04/En/mOJ58uNU3bhdZ1hScOqvBvss3HQ==","signatures":[{"sig":"MEUCIHWiehFPeaEIKq6rpgtqJZplz+o+vIRO/IMfLw54VLQnAiEAnt7y84IqeAwrbuuBgCkMyAzlh3pTiLRy7lA/LO+ZMzc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121825},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"cdaf5094d1811763a2906a0fed2c8d340bfcbb05","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.1","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.0","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.8_1771694442313_0.5122078958968102","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.9":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.9","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.9","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"712b2186258ffd7d82199ed4431ad464aa6502cc","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.9.tgz","fileCount":15,"integrity":"sha512-M7fLGoV0Qllt0VuwOjgpOHDwxsPScwfdwwyP77f1KU32652iUcS7jVhZbtA1irPGhgB+seV7MlRwSsPWu6m/NQ==","signatures":[{"sig":"MEUCIDti77XhBgo++jbYMwOl70XwHxg2cvBgzEw929GUCS99AiEA0EMU9YsYKVnOnhLp36pI/8GzBlpAlR9MA4PvI2udTYE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121863},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"32f33249e84f1cb0073b7847793ef06b874a6882","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.1","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.0","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.9_1771726672704_0.41097860744778525","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.10":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.10","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.10","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"c6353dae76ce7560a203970bd8b21c16de472e15","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.10.tgz","fileCount":15,"integrity":"sha512-6VHidw1M1uxuxbUoWZcCCyS3GM9UELLlsekzQkfIoiF2C9GyZtIowLR/YocOzVk0ufYTqR4a9kH7GrcgRjN7dA==","signatures":[{"sig":"MEUCIQCYn9tLH/SVuV5PTcUN4gfoxPaIbxQnC6K6qJNaKnQNcAIgL1VqcLHWV2X657Zd/80J8EY2egJeeAn8ittjLCZ+aO8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121906},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"a7bca690068beecd6d8ff198cf186bc4f80ed56f","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.1","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.0","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.10_1771891466442_0.19518622271443453","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.11":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.11","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.11","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"c3a55d282a36c18bc71097bb1ed9364da8f34c57","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.11.tgz","fileCount":15,"integrity":"sha512-LnpmCnp7wv0oIEYNlGbGZWVYNIET9gDUxE22gpM55bcDU3dXsFOyk8VXft+oAT+VXGnPpkD/eKamQuIaYhZ81A==","signatures":[{"sig":"MEUCIQDGynGSpz4zI6zOcp1fsAnt1QHrZnsNJkDCMJMT6gTtQQIgOMU0f+kUtxiJSBq+8fusfnapgiRZv8rn80ofN/IsDck=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131264},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"c0e8d1e5b51f8f71d4ec2646ccd8f4c2b399afbf","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.1","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.0","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.11_1771936782505_0.6481797116611843","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.12":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.12","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.12","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"5857fb6fe18d672893aa29270e4dbe52a412cc2b","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.12.tgz","fileCount":15,"integrity":"sha512-cvJ4OHxmA6H3zrU2DJ46lZJKRVULmJo+480ayMoUxY8WcbVLqcnhl3MlyeSNa073MbLP6m44bHUQt1CNKGK4ew==","signatures":[{"sig":"MEUCIQDpQ7B4I5bW9bNkvC7Uosqa9PCpnoRjz/4wLqqq2PUgYAIgU1OeDwOjem1UIPuyvGqPQhGFggc0IAm2o0i1tUUN80s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131579},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"7b127cdf7491aa6368d11d4bfa150d3d45791abf","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/fetcher":"^1.1.0","@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.1","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.0","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.12_1771949996793_0.38796599760707795","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.13":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.13","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.13","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"798e0bf31674055c2acee472b136fddd5dab7453","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.13.tgz","fileCount":15,"integrity":"sha512-E6mUydMmoF23EaUjIlM3vX9y7p4OTHqUmBX45J2go4KFE9+3L1KwbQP3iviNlr2PZwUyIYPFiV6pmFGAY5AFMQ==","signatures":[{"sig":"MEUCIHlE2A78Qq+5Tiu5CJAP+eAeg8+wi+2gG8HGQKAU2Z8jAiEAtk+VhJl7+0qWhhXIzHdw8tx2+cHB9hIBwhrA2Bi1Va0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":138464},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"4e5dbb918265473b2c9c475d230c85ce303c6caa","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/fetcher":"^1.1.0","@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.1","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.0","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.13_1771950210267_0.23204921887251562","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.14":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.14","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.14","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"12ab4b9154cacfac8b5b1102f2aaac19860d8ca5","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.14.tgz","fileCount":23,"integrity":"sha512-4kyLR2Op/SyynM910No7ZNIcyBRfK0m9s6kyfJp4EuxL/p8kFOpmCIVfIE/xE55V178TIVrx6lijkuyMjW/O3A==","signatures":[{"sig":"MEYCIQCRS2aKWBobFEHVrMqZl41sy1l3XIHZcPOpQ6IzgMswHgIhAOsSb2J66V49vBcweJxlW0BNyQVn/W/0lwwUnOvOysAQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146818},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"c6c539d94be747c1ec2c351d3d57f17c555c4543","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/fetcher":"^1.1.0","@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.1","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.0","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.14_1771962876739_0.8332172940238427","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.15":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.15","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.15","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"a21697afa30ffb4d88c80b5705344de615a810ae","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.15.tgz","fileCount":23,"integrity":"sha512-iYeg1rG7Md8j0qrv6xoCkdfRePsumH07KObO5mLOPL5irBNQB2HQo9xt/Qi3pQ6LPB2/dzSRIZ+Sjx93k5vEWg==","signatures":[{"sig":"MEUCIQCl+3qTg+BfCBhMcIjG1pBhdicvW/lIgJzi3k0bz2omDAIgZr+E01fWjbWRKNFMXEk0BpeQMWT6tp9xKw/vgT3E7L8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152410},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"d147fddddf000c5885dbb469d158062f9cda4eed","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/fetcher":"^1.1.0","@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^3.7.1","@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.1","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.0","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.0","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.15_1772028278861_0.3825154597979643","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.16":{"name":"@alessiofrittoli/media-utils","version":"1.0.0-alpha.16","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0-alpha.16","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"49bb3f86ee14d1e4b340f29f2016425b0068db02","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0-alpha.16.tgz","fileCount":23,"integrity":"sha512-vxHwZe49TnXUGdNXrVxCLCGmreIGA5XVL6q+dMw+kGxuG8Tute6vNofDLZOqZIWqQngeoqnY2cIF0tbHgqx8bw==","signatures":[{"sig":"MEYCIQDOcComhl6tWALDrZIW5yEow8E/is8VxuyaWWukvn235wIhANyqAc9F/znWLWbnjjGRAKwIRjk7b0mRaXieZ5WCYFXX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153874},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"8cda724f01cc998b929730f7eefae35eb0b2b1d0","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/fetcher":"^1.1.0","@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^4.0.0","@alessiofrittoli/web-utils":"^2.0.1","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.2","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.1","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.1","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0-alpha.16_1772128456591_0.3924672923643282","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@alessiofrittoli/media-utils","version":"1.0.0","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.0.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"52568c9de5ff9255dc2c644c8f2047ad1ab51c11","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.0.0.tgz","fileCount":23,"integrity":"sha512-pMYBetFO8pZNa5GQ1iQCt1ivj/xxQtspV/YDWlF01XbnHh1qLmDX8qq4qCTSfSmMUy+uxY3KBY3zsHreUrTB5w==","signatures":[{"sig":"MEQCIDQsj5KSFK1CyvE+JhBp+7JLUdVtl8pLgzPyGeSLID01AiBd4xyBK8GeUisQSjJQpe/pgNTkMvWowbeTXY06GekEoA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153865},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"2efbfd44093615da082ae42ffa51eca3ebeb3a50","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/fetcher":"^1.1.0","@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^4.0.0","@alessiofrittoli/web-utils":"^2.0.1","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.2","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.1","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.1","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.0.0_1772128683888_0.30492593908121535","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@alessiofrittoli/media-utils","version":"1.1.0","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.1.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"bbed3ce91d97aff7ae8f090a0feeaad1fe1cda9b","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.1.0.tgz","fileCount":23,"integrity":"sha512-hSoU6WvCtfSuZngNZi73KwnGjjs75YvN2e/eITUvWhJnyVxnLY5BT4WbHUSAh6d7jWzJ2M8XinPEdIP4WCF/pA==","signatures":[{"sig":"MEUCIQCSCqF/0JpGsB1P+0kPutYo+kSqpGb9vylWwCZsoUuCGwIgbin9D2xwZB5YmOjGdaiqlo0vC2mGYTCJqg0E6oNuTRE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177445},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"64027633301947043c188a4bf8d4124cdf2c35c1","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/fetcher":"^1.1.0","@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^4.0.0","@alessiofrittoli/web-utils":"^2.0.1","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.2","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.2","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.1","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.1.0_1772233273379_0.23370708075215174","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@alessiofrittoli/media-utils","version":"1.1.1","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.1.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"ee9dc5c561aacd1625bf96b1df1af74efd00256c","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.1.1.tgz","fileCount":23,"integrity":"sha512-Yg8hGIn85oJ4Iji6pXBG8Sqx93xHW8f3qSuAYtbGuSJjn10Y3s9pY5arI+1mZB9Fukn+BG7wZaz2WimU+t8YBg==","signatures":[{"sig":"MEUCIQCrzf/IY6js5f+Q9xBwLe36SgFvMT8YdLCFrZ+eyH0okwIgK6JXFgGvqhgsqT79fI6uajwbAsVs30kENX9qj3L5VBM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179763},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"04fe5a1c43732d5904c7d361e5cc98fa3c5be236","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"11.7.0","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"@alessiofrittoli/fetcher":"^1.1.0","@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^4.0.0","@alessiofrittoli/web-utils":"^2.0.1","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.2","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.2","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.1","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.1.1_1772235252216_0.8549955333113324","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@alessiofrittoli/media-utils","version":"1.2.0","keywords":["nodejs","npm","node_modules"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/media-utils@1.2.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"96be11b0077f6a95f9395d9edf54c67d2725527c","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.2.0.tgz","fileCount":23,"integrity":"sha512-kogjnxaO6Loe2EduwxDcQzezjkrqyMgWOsiPIMCVTqURcbc/SaLOB9odm+HHumUrBWuVwt8jgtcCoaJtYOksfw==","signatures":[{"sig":"MEQCIGfxTrM6ncY7QH03iwrfeatuA0UO+WbwGtlUXYSUWf6xAiB2aqiPwZXiOSOBzjB26QOCixQRN0buAZpqF63RwQkZNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177900},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"b0a5537bec5e1c700664023512e4ef05cdc93323","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:mime":"pnpm test:watch mime.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/media-utils.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript media utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/fetcher":"^1.1.0","@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/url-utils":"^4.0.0","@alessiofrittoli/web-utils":"^2.1.0","@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/math-utils":"2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.3.1","eslint":"^10.0.2","globals":"^17.4.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.56.1","jest-environment-jsdom":"^30.2.0","@alessiofrittoli/node-scripts":"3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/media-utils_1.2.0_1772548444073_0.8538080232247676","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@alessiofrittoli/media-utils","version":"1.3.0","description":"TypeScript media utility library","author":{"name":"Alessio Frittoli","email":"info@alessiofrittoli.it","url":"https://alessiofrittoli.it"},"license":"MIT","funding":[{"type":"github","url":"https://github.com/sponsors/alessiofrittoli"}],"keywords":["nodejs","npm","node_modules"],"homepage":"https://github.com/alessiofrittoli/media-utils#readme","bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"repository":{"type":"git","url":"git+https://github.com/alessiofrittoli/media-utils.git"},"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./*":{"import":{"types":"./dist/*/index.d.mts","default":"./dist/*/index.mjs"},"require":{"types":"./dist/*/index.d.ts","default":"./dist/*/index.js"}}},"sideEffects":false,"scripts":{"//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","dev":"cross-env NODE_ENV=development tsup --watch","build:prod":"cross-env NODE_ENV=production tsup","build":"pnpm lint && pnpm test:ci && pnpm build:prod","lint":"eslint","release":"node scripts/release.js --verbose --npm","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","test":"jest --verbose","test:watch":"jest --watchAll --verbose","test:ci":"jest --ci --verbose","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","test:mime":"pnpm test:watch mime.test.ts"},"devDependencies":{"@alessiofrittoli/node-scripts":"3.3.0","@eslint/js":"^10.0.1","@jest/globals":"^30.2.0","@types/jest":"^30.0.0","@types/node":"^25.3.3","concurrently":"^9.2.1","cross-env":"^10.1.0","dotenv":"^17.3.1","eslint":"^10.0.2","globals":"^17.4.0","http-server":"^14.1.1","jest":"^30.2.0","jest-environment-jsdom":"^30.2.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","tsup":"^8.5.1","typescript":"^5.9.3","typescript-eslint":"^8.56.1"},"dependencies":{"@alessiofrittoli/date-utils":"^4.1.0","@alessiofrittoli/exception":"^3.5.0","@alessiofrittoli/fetcher":"^1.1.0","@alessiofrittoli/math-utils":"2.0.0","@alessiofrittoli/url-utils":"^4.0.0","@alessiofrittoli/web-utils":"^2.1.0"},"_id":"@alessiofrittoli/media-utils@1.3.0","gitHead":"49137ba4ed20c295b1ee9993b57e9f3fc90586bb","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-DvVMsNYumR4DGPwc+H85L0pZRePYfzvc8tVmsgXCIRrQglsVZyoc7FLYB+g5re7Z7bjafN+L3iIwWFwDUqyZvw==","shasum":"d26cd4f2a43dfe2c84340f00e45a9d7d4049b129","tarball":"https://registry.npmjs.org/@alessiofrittoli/media-utils/-/media-utils-1.3.0.tgz","fileCount":23,"unpackedSize":180325,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCvBOy7YeUT5sSurc2+N6bNFrww6mbyMcF0L62eYqGhFwIgBUshs/57VDVTCQijnd/22oAvmURTiSVKUhFa2zHeErk="}]},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"directories":{},"maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/media-utils_1.3.0_1772626376280_0.2917589167830703"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-15T22:40:02.616Z","modified":"2026-03-04T12:12:56.544Z","0.1.0":"2026-02-15T22:40:02.849Z","1.0.0-alpha.1":"2026-02-16T10:41:31.501Z","1.0.0-alpha.2":"2026-02-17T12:43:37.778Z","1.0.0-alpha.3":"2026-02-17T18:04:30.394Z","1.0.0-alpha.4":"2026-02-17T18:33:23.049Z","1.0.0-alpha.5":"2026-02-17T19:15:46.535Z","1.0.0-alpha.6":"2026-02-18T09:46:41.960Z","1.0.0-alpha.7":"2026-02-21T16:18:23.624Z","1.0.0-alpha.8":"2026-02-21T17:20:42.473Z","1.0.0-alpha.9":"2026-02-22T02:17:52.858Z","1.0.0-alpha.10":"2026-02-24T00:04:26.596Z","1.0.0-alpha.11":"2026-02-24T12:39:42.643Z","1.0.0-alpha.12":"2026-02-24T16:19:56.942Z","1.0.0-alpha.13":"2026-02-24T16:23:30.429Z","1.0.0-alpha.14":"2026-02-24T19:54:36.949Z","1.0.0-alpha.15":"2026-02-25T14:04:39.003Z","1.0.0-alpha.16":"2026-02-26T17:54:16.725Z","1.0.0":"2026-02-26T17:58:04.049Z","1.1.0":"2026-02-27T23:01:13.572Z","1.1.1":"2026-02-27T23:34:12.383Z","1.2.0":"2026-03-03T14:34:04.222Z","1.3.0":"2026-03-04T12:12:56.429Z"},"bugs":{"url":"https://github.com/alessiofrittoli/media-utils/issues","email":"info@alessiofrittoli.it"},"author":{"name":"Alessio Frittoli","email":"info@alessiofrittoli.it","url":"https://alessiofrittoli.it"},"license":"MIT","homepage":"https://github.com/alessiofrittoli/media-utils#readme","keywords":["nodejs","npm","node_modules"],"repository":{"type":"git","url":"git+https://github.com/alessiofrittoli/media-utils.git"},"description":"TypeScript media utility library","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"readme":"<h1 align=\"center\">Media Utils 🎥</h1>\n<p align=\"center\">\n  TypeScript media utility library\n</p>\n<p align=\"center\">\n  <a href=\"https://npmjs.org/package/@alessiofrittoli/media-utils\">\n    <img src=\"https://img.shields.io/npm/v/@alessiofrittoli/media-utils\" alt=\"Latest version\"/>\n  </a>\n  <a href=\"https://coveralls.io/github/alessiofrittoli/media-utils\">\n    <img src=\"https://coveralls.io/repos/github/alessiofrittoli/media-utils/badge.svg\" alt=\"Test coverage\"/>\n  </a>\n  <a href=\"https://socket.dev/npm/package/@alessiofrittoli/media-utils/overview\">\n    <img src=\"https://socket.dev/api/badge/npm/package/@alessiofrittoli/media-utils\" alt=\"Socket Security score\"/>\n  </a>\n  <a href=\"https://npmjs.org/package/@alessiofrittoli/media-utils\">\n    <img src=\"https://img.shields.io/npm/dm/@alessiofrittoli/media-utils.svg\" alt=\"npm downloads\"/>\n  </a>\n  <a href=\"https://bundlephobia.com/package/@alessiofrittoli/media-utils\">\n    <img src=\"https://badgen.net/bundlephobia/dependency-count/@alessiofrittoli/media-utils\" alt=\"Dependencies\"/>\n  </a>\n  <a href=\"https://libraries.io/npm/%40alessiofrittoli%2Fmedia-utils\">\n    <img src=\"https://img.shields.io/librariesio/release/npm/@alessiofrittoli/media-utils\" alt=\"Dependencies status\"/>\n  </a>\n</p>\n<p align=\"center\">\n  <a href=\"https://bundlephobia.com/package/@alessiofrittoli/media-utils\">\n    <img src=\"https://badgen.net/bundlephobia/min/@alessiofrittoli/media-utils\" alt=\"minified\"/>\n  </a>\n  <a href=\"https://bundlephobia.com/package/@alessiofrittoli/media-utils\">\n    <img src=\"https://badgen.net/bundlephobia/minzip/@alessiofrittoli/media-utils\" alt=\"minizipped\"/>\n  </a>\n  <a href=\"https://bundlephobia.com/package/@alessiofrittoli/media-utils\">\n    <img src=\"https://badgen.net/bundlephobia/tree-shaking/@alessiofrittoli/media-utils\" alt=\"Tree shakable\"/>\n  </a>\n</p>\n<p align=\"center\">\n  <a href=\"https://github.com/sponsors/alessiofrittoli\">\n    <img src=\"https://img.shields.io/static/v1?label=Fund%20this%20package&message=%E2%9D%A4&logo=GitHub&color=%23DB61A2\" alt=\"Fund this package\"/>\n  </a>\n</p>\n\n[sponsor-badge]: https://img.shields.io/static/v1?label=Fund%20this%20package&message=%E2%9D%A4&logo=GitHub&color=%23DB61A2\n[sponsor-url]: https://github.com/sponsors/alessiofrittoli\n\n### Table of Contents\n\n- [Getting started](#getting-started)\n- [API Reference](#api-reference)\n  - [MIME types](#mime-types)\n  - [MediaSession](#mediasession)\n  - [AudioEngine](#audioengine)\n    - [Audio Engine Manager](#audio-engine-manager)\n    - [Audio Utilities](#audio-utilities)\n  - [Media Playback](#media-playback)\n  - [Image Video Stream](#image-video-stream)\n  - [Media Artwork Picture-in-Picture](#media-artwork-picture-in-picture)\n  - [Utilities](#utilities)\n- [Development](#development)\n  - [Install depenendencies](#install-depenendencies)\n  - [Build the source code](#build-the-source-code)\n  - [ESLint](#eslint)\n  - [Jest](#jest)\n- [Contributing](#contributing)\n- [Security](#security)\n- [Credits](#made-with-)\n\n---\n\n### Getting started\n\nRun the following command to start using `media-utils` in your projects:\n\n```bash\nnpm i @alessiofrittoli/media-utils\n```\n\nor using `pnpm`\n\n```bash\npnpm i @alessiofrittoli/media-utils\n```\n\n---\n\n### API Reference\n\n#### MIME types\n\n##### `getMimeType()`\n\nGet the MIME type from the given `input` string.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type        | Description                                                                                                                 |\n| --------- | ----------- | --------------------------------------------------------------------------------------------------------------------------- |\n| `input`   | `string`    | The input string where MIME type is extracted from.                                                                         |\n| `type`    | `MediaType` | (Optional) Accepted media type. This may be usefull when subtype matches other media types (eg. `audio/mp4` - `video/mp4`). |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `MIMEType`\n\n- The MIME type if found.\n- `undefined` otherwise.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { getMimeType } from \"@alessiofrittoli/media-utils\";\n\nconsole.log(getMimeType(\"/path/to/video-file.mp4\")); // Outputs: 'video/mp4'\nconsole.log(getMimeType(\"/path/to/audio-file.mp4\", \"audio\")); // Outputs: 'audio/mp4'\nconsole.log(getMimeType(\"/path/to/audio-file.mp3\")); // Outputs: 'audio/mpeg'\n```\n\n</details>\n\n---\n\n##### `getAllowedMimeTypes()`\n\nGet allowed MIME types.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type     | Description                                                                                                                                         |\n| --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `accept`  | `string` | (Optioanl) A string describing allowed MIME types.                                                                                                  |\n|           |          | The format is the same accepted by [`HTMLInputElement.accept`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/accept) attribute. |\n|           |          | It could be one of the following examples:                                                                                                          |\n|           |          | - `*`                                                                                                                                               |\n|           |          | - `image` (type)                                                                                                                                    |\n|           |          | - `image/*` ({type}/{subtype})                                                                                                                      |\n|           |          | - `image/png` ({type}/{subtype}) - specific                                                                                                         |\n|           |          | - `.png` (extension)                                                                                                                                |\n|           |          | - `image,audio` (multiple types)                                                                                                                    |\n|           |          | - `image/*,audio/*` (multiple {type}/{subtype})                                                                                                     |\n|           |          | - `.png, .mp3` (multiple extensions)                                                                                                                |\n|           |          | - `.docx, audio, video/*, text/html` (mixed)                                                                                                        |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `(MIMEType | '*')[]`\n\nAn array of MIME types based on the `accept` value. `[ '*' ]` if a wildcard or no `accept` is given.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { getAllowedMimeTypes } from \"@alessiofrittoli/media-utils\";\n\nconsole.log(getAllowedMimeTypes());\nconsole.log(getAllowedMimeTypes(\"*\"));\nconsole.log(getAllowedMimeTypes(\"image\"));\nconsole.log(getAllowedMimeTypes(\"audio/*\"));\nconsole.log(getAllowedMimeTypes(\"image,video\"));\nconsole.log(getAllowedMimeTypes(\"image/*,video/*\"));\nconsole.log(getAllowedMimeTypes(\".mp3,mp4\"));\nconsole.log(getAllowedMimeTypes(\".jpg, .png\"));\nconsole.log(getAllowedMimeTypes(\"image/jpeg,.jpg\"));\n```\n\n</details>\n\n---\n\n#### MediaSession\n\n##### Types\n\n###### `MediaArtWork`\n\nThe Media Artwork.\n\nCompatible type with the global `MediaImage` interface.\n\n<details>\n\n<summary style=\"cursor:pointer\">Properties</summary>\n\n| Property | Type       | Description                                                                                         |\n| -------- | ---------- | --------------------------------------------------------------------------------------------------- |\n| `src`    | `UrlInput` | The Media Artwork image URL.                                                                        |\n|          |            | See [`UrlInput`](https://npmjs.com/package/@alessiofrittoli/url-utils#urlinput) type for more info. |\n| `size`   | `number`   | The Media Artwork image size.                                                                       |\n|          |            | Common values are: `96`, `128`, `192`, `256`, `384`, `512`.                                         |\n| `type`   | `MIMEType` | The Media Artwork image MIME type.                                                                  |\n\n</details>\n\n---\n\n###### `Media`\n\nDefines the media.\n\nExtends the global [`MediaMetadata`](https://developer.mozilla.org/en-US/docs/Web/API/MediaMetadata) interface.\n\n<details>\n\n<summary style=\"cursor:pointer\">Properties</summary>\n\n| Property  | Type             | Description                                                                                         |\n| --------- | ---------------- | --------------------------------------------------------------------------------------------------- |\n| `src`     | `UrlInput`       | The media URL.                                                                                      |\n|           |                  | See [`UrlInput`](https://npmjs.com/package/@alessiofrittoli/url-utils#urlinput) type for more info. |\n| `type`    | `MIMEType`       | The media MIME type.                                                                                |\n| `title`   | `string`         | The title of the media.                                                                             |\n| `artwork` | `MediaArtWork[]` | The media artwork.                                                                                  |\n|           |                  | See [`MediaArtWork`](#mediaartwork) type for more info.                                             |\n| `artist`  | `string`         | The artist of the media.                                                                            |\n| `album`   | `string`         | The album of the media.                                                                             |\n\n</details>\n\n---\n\n###### `UpdateMediaMetadataAndPositionOptions`\n\nDefines the MediaSession update options.\n\n<details>\n\n<summary style=\"cursor:pointer\">Properties</summary>\n\n| Property | Type                 | Description             |\n| -------- | -------------------- | ----------------------- |\n| `media`  | `HTMLMediaElement`   | The HTMLMediaElement.   |\n| `data`   | `Omit<Media, 'src'>` | The playing media data. |\n\n</details>\n\n---\n\n##### `updatePositionState()`\n\nUpdate `MediaSession` position state.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type               | Description           |\n| --------- | ------------------ | --------------------- |\n| `media`   | `HTMLMediaElement` | The HTMLMediaElement. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { updatePositionState } from \"@alessiofrittoli/media-utils\";\n\nnavigator.mediaSession.setActionHandler(\"seekto\", (details) => {\n  if (typeof details.seekTime === \"undefined\") return;\n\n  media.currentTime = details.seekTime;\n\n  updatePositionState(media);\n});\n```\n\n</details>\n\n---\n\n##### `updateMediaMetadata()`\n\nUpdate `MediaSession` metadata.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                 | Description             |\n| --------- | -------------------- | ----------------------- |\n| `data`    | `Omit<Media, 'src'>` | The playing media data. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { updateMediaMetadata } from \"@alessiofrittoli/media-utils\";\n\nmedia.play().then(() => {\n  updateMediaMetadata({\n    type: \"audio/mpeg\",\n    title: \"Song name\",\n    album: \"Album name\",\n    artist: \"Artist name\",\n    artwork: [\n      {\n        src: { pathname: \"/path-to-image-96.png\" },\n        size: 96,\n        type: \"image/png\",\n      },\n      {\n        src: { pathname: \"/path-to-image-128.png\" },\n        size: 128,\n        type: \"image/png\",\n      },\n      {\n        src: { pathname: \"/path-to-image-192.png\" },\n        size: 192,\n        type: \"image/png\",\n      },\n      {\n        src: { pathname: \"/path-to-image-256.png\" },\n        size: 256,\n        type: \"image/png\",\n      },\n      {\n        src: { pathname: \"/path-to-image-384.png\" },\n        size: 384,\n        type: \"image/png\",\n      },\n      {\n        src: { pathname: \"/path-to-image-512.png\" },\n        size: 512,\n        type: \"image/png\",\n      },\n    ],\n  });\n});\n```\n\n</details>\n\n---\n\n##### `updateMediaMetadataAndPosition()`\n\nUpdate `MediaSession` metadata and position state.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                                    | Description                                                                                          |\n| --------- | --------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| `options` | `UpdateMediaMetadataAndPositionOptions` | An object defining `media` HTMLMediaElement and associated data.                                     |\n|           |                                         | See [`UpdateMediaMetadataAndPositionOptions`](#updatemediametadataandpositionoptions) for more info. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { updateMediaMetadataAndPosition } from \"@alessiofrittoli/media-utils\";\n\nmedia.play().then(() => {\n  updateMediaMetadataAndPosition({\n    media,\n    data: {\n      type: \"audio/mpeg\",\n      title: \"Song name\",\n      album: \"Album name\",\n      artist: \"Artist name\",\n      artwork: [\n        {\n          src: { pathname: \"/path-to-image-96.png\" },\n          size: 96,\n          type: \"image/png\",\n        },\n        {\n          src: { pathname: \"/path-to-image-128.png\" },\n          size: 128,\n          type: \"image/png\",\n        },\n        {\n          src: { pathname: \"/path-to-image-192.png\" },\n          size: 192,\n          type: \"image/png\",\n        },\n        {\n          src: { pathname: \"/path-to-image-256.png\" },\n          size: 256,\n          type: \"image/png\",\n        },\n        {\n          src: { pathname: \"/path-to-image-384.png\" },\n          size: 384,\n          type: \"image/png\",\n        },\n        {\n          src: { pathname: \"/path-to-image-512.png\" },\n          size: 512,\n          type: \"image/png\",\n        },\n      ],\n    },\n  });\n});\n```\n\n</details>\n\n---\n\n#### `AudioEngine`\n\nManages volume manipulation for HTML media elements.\n\nProvides methods for fading volume with customizable tweening, and utilities for converting\nbetween normalized volume values (0.0-1.0) and linear gain values using decibel-based calculations\nthat better match human perception of audio loudness.\n\n- Refer to the [Audio Engine Manager](#audio-engine-manager) section to understand how instance caching prevents redundant `AudioEngine` instantiation.\n\n##### AudioEngine Types\n\n###### `TickHandler`\n\nCallback executed on each interpolation tick.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type     | Description                     |\n| --------- | -------- | ------------------------------- |\n| `value`   | `number` | The current interpolated value. |\n\n</details>\n\n---\n\n###### `FadeVolumeOptions`\n\n<details>\n\n<summary style=\"cursor:pointer\">Properties</summary>\n\n| Property   | Type          | Default         | Description                                                                                                                     |\n| ---------- | ------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------- |\n| `to`       | `number`      | -               | Defines the final volume to set [0-1].                                                                                          |\n| `duration` | `number`      | `200`           | (Optional) Duration of the tween in milliseconds.                                                                               |\n| `onTick`   | `TickHandler` | -               | Callback executed on each interpolation tick.                                                                                   |\n|            |               |                 | See [`TickHandler`](#tickhandler) types for more info.                                                                          |\n| `onEnd`    | `TickHandler` | -               | (Optional) Callback executed when the interpolation completes.                                                                  |\n|            |               |                 | See [`TickHandler`](#tickhandler) types for more info.                                                                          |\n| `easing`   | `EasingFn`    | `Easing.linear` | (Optional) Easing function used to transform the linear time progression.                                                       |\n|            |               |                 | See [`EasingFn`](https://github.com/alessiofrittoli/math-utils/blob/master/docs/easing/README.md#easingfn) types for more info. |\n| `Hz`       | `number`      | `120`           | (Optional) Custom tick rate in Hz.                                                                                              |\n\n</details>\n\n---\n\n##### Methods\n\n###### `AudioEngine.fade()`\n\nFade media volume.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                | Description                                                  |\n| --------- | ------------------- | ------------------------------------------------------------ |\n| `options` | `FadeVolumeOptions` | An object defining customization and callbacks.              |\n|           |                     | See [`FadeVolumeOptions`](#fadevolumeoptions) for more info. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { AudioEngine } from '@alessiofrittoli/media-utils/audio'\n\nconst audio  = new Audio( ... )\nconst engine = new AudioEngine( audio )\n\naudio.volume = 0\naudio.play()\n .then( () => {\n   // Fade volume to 0.5 over 2 seconds\n   engine.fade( {\n     to         : 1,\n     duration   : 2000,\n   } )\n } )\n```\n\n</details>\n\n---\n\n##### Static methods\n\n###### `AudioEngine.VolumeToGain()`\n\nConverts a volume value (0.0 to 1.0) to a linear gain value.\n\nThe returned value will better match the human perceived volume.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type     | Description                                                                   |\n| --------- | -------- | ----------------------------------------------------------------------------- |\n| `volume`  | `number` | The volume value, where 0 represents silence and 1 represents maximum volume. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `number`.\n\nThe corresponding linear gain value, or 0 if the gain is effectively inaudible.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { AudioEngine } from '@alessiofrittoli/media-utils/audio'\n\nconst audio  = new Audio( ... )\nconst engine = new AudioEngine( audio )\n\naudio.volume = 0\naudio.play()\n  .then( () => {\n    engine.fade( {\n      to: AudioEngine.VolumeToGain( 0.5 ),\n      onEnd() {\n        console.log( audio.volume ) // Outputs: `0.03162277660168379`\n      },\n    } )\n  } )\n```\n\n</details>\n\n---\n\n###### `AudioEngine.GainToVolume()`\n\nConverts a linear gain value to a normalized volume value between 0 and 1.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type     | Description                       |\n| --------- | -------- | --------------------------------- |\n| `gain`    | `number` | The linear gain value to convert. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `number`.\n\nThe normalized volume value in the range [0, 1].\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { AudioEngine } from '@alessiofrittoli/media-utils/audio'\n\nconst audio  = new Audio( ... )\nconst engine = new AudioEngine( audio )\n\naudio.volume = 0\naudio.play()\n  .then( () => {\n    engine.fade( {\n      to: AudioEngine.VolumeToGain( 0.5 ),\n      onEnd() {\n        console.log( audio.volume ) // Outputs: `0.03162277660168379`\n        console.log( AudioEngine.GainToVolume( audio.volume ) ) // Outputs: `0.5`\n      },\n    } )\n  } )\n```\n\n</details>\n\n---\n\n###### `AudioEngine.normalize()`\n\nConditionally normalize volume using [`AudioEngine.VolumeToGain`](#audioenginevolumetogain).\n\nThis method acts as a wrapper and has the same API of [`AudioEngine.VolumeToGain()`](#audioenginevolumetogain) but it accepts a boolean value\nas second argument that allows you to quickly opt-in/opt-out based on an incoming variable,\nthus there is no need to call `AudioEngine.VolumeToGain()` conditionally.\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { AudioEngine } from '@alessiofrittoli/media-utils/audio'\n\n// `normalizeAudio` may come from global settings\nconst audio  = new Audio( ... )\nconst engine = new AudioEngine( audio )\n\naudio.volume = 0\naudio.play()\n  .then( () => {\n    engine.fade( {\n      to: AudioEngine.normalize( 0.5, normalizeAudio ),\n      onEnd() {\n        console.log( audio.volume ) // Outputs: `0.03162277660168379` if `normalizeAudio` is set to `true`, 0.5 otherwise.\n      },\n    } )\n  } )\n```\n\n</details>\n\n---\n\n###### `AudioEngine.denormalize()`\n\nConditionally denormalize volume using [`AudioEngine.GainToVolume`](#audioenginegaintovolume).\n\nThis method acts as a wrapper and has the same API of [`AudioEngine.GainToVolume()`](#audioenginegaintovolume) but it accepts a boolean value\nas second argument that allows you to quickly opt-in/opt-out based on an incoming variable,\nthus there is no need to call `AudioEngine.GainToVolume()` conditionally.\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { AudioEngine } from '@alessiofrittoli/media-utils/audio'\n\n// `normalizeAudio` may come from global settings\nconst audio  = new Audio( ... )\nconst engine = new AudioEngine( audio )\n\naudio.volume = 0\naudio.play()\n  .then( () => {\n    engine.fade( {\n      to: AudioEngine.normalize( 0.5, normalizeAudio ),\n      onEnd() {\n        console.log(\n          AudioEngine.denormalize( audio.volume, normalizeAudio )\n        )\n      },\n    } )\n  } )\n```\n\n</details>\n\n---\n\n##### Audio Engine Manager\n\nThe Audio Engine Manager is responsible for maintaining a one-to-one association between an `HTMLMediaElement` and its corresponding `AudioEngine` instance.\nIts primary goal is to prevent unnecessary re-creation of `AudioEngine` objects when interacting with the same media element.\n\nWhen working with audio processing APIs, repeatedly instantiating `AudioEngine` for the same HTMLMediaElement would:\n\n- Introduce unnecessary computational overhead.\n- Potentially duplicate internal state.\n- Increase memory usage.\n- Lead to inconsistent behavior.\n\nThe manager ensures that each media element has exactly one `AudioEngine` instance.\n\n###### `getEngine()`\n\nGet the `AudioEngine` associated with the given `media`. If none exists, it lazily creates a new instance.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | type               | Decription            |\n| --------- | ------------------ | --------------------- |\n| `media`   | `HTMLMediaElement` | The HTMLMediaElement. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `AudioEngine`.\n\nThe `AudioEngine` associated with the given `media` or a new `AudioEngine` instance if none exists.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { getEngine } from \"@alessiofrittoli/media-utils/audio\";\n\nconst mute = (media: HTMLMediaElement) => {\n  getEngine(media).fade({ to: 0 });\n};\n\nconst unmute = (media: HTMLMediaElement) => {\n  getEngine(media).fade({ to: 1 });\n};\n```\n\n</details>\n\n---\n\n###### `destroyEngine()`\n\nProactively delete the `AudioEngine` associated with the given `media` to free resources.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | type               | Decription            |\n| --------- | ------------------ | --------------------- |\n| `media`   | `HTMLMediaElement` | The HTMLMediaElement. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `boolean`.\n\n- `true` if the element was successfully removed.\n- `false` if no engine was registered.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { getEngine, destroyEngine } from \"@alessiofrittoli/media-utils/audio\";\n\nconst stop = (media: HTMLMediaElement) => {\n  getEngine(media).fade({\n    to: 0,\n    onEnd() {\n      media.pause();\n      destroyEngine(media);\n    },\n  });\n};\n```\n\n</details>\n\n---\n\n##### Audio Utilities\n\n###### `fadeVolume()`\n\nFade media volume.\n\nThis utility function acts as a wrapper handling [`AudioEngine`](#audioengine) instances for you using the [Audio Engine Manager](#audio-engine-manager).\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | type                | Decription                                                   |\n| --------- | ------------------- | ------------------------------------------------------------ |\n| `media`   | `HTMLMediaElement`  | The HTMLMediaElement.                                        |\n| `options` | `FadeVolumeOptions` | An object defining customization and callbacks.              |\n|           |                     | See [`FadeVolumeOptions`](#fadevolumeoptions) for more info. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { fadeVolume } from \"@alessiofrittoli/media-utils/audio\";\n\nconst play = (media: HTMLMediaElement) => {\n  media.volume = 0;\n  media.play().then(() => {\n    fadeVolume(media, { to: 1 });\n  });\n};\n```\n\n</details>\n\n---\n\n#### Media Playback\n\n#### Media Playback types\n\n##### `PlayMediaOptions`\n\nAn object defining play options and callbacks.\n\nIt extends [`UpdateMediaMetadataAndPositionOptions`](#updatemediametadataandpositionoptions) and [`FadeVolumeOptions`](#fadevolumeoptions) interfaces and adds/overrides the following properties.\n\n<details>\n\n<summary style=\"cursor:pointer\">Properties</summary>\n\n| Property  | Type                            | Default | Description                                                                      |\n| --------- | ------------------------------- | ------- | -------------------------------------------------------------------------------- |\n| `volume`  | `number`                        | -       | Defines the final volume to set [0-1].                                           |\n|           |                                 |         | - overrides `FadeVolumeOptions['to']`                                            |\n| `fade`    | `number`                        | `200`   | (Optional) A custom volume fade duration in milliseconds.                        |\n|           |                                 |         | - overrides `FadeVolumeOptions['duration']`                                      |\n| `onError` | `( error: MediaError ) => void` | -       | (Optional) A custom callback executed when an error occurs when playing a media. |\n\n</details>\n\n---\n\n##### `PauseMediaOptions`\n\nAn object defining pause options and callbacks.\n\nIt extends [`PlayMediaOptions`](#playmediaoptions) and omits unnecessary properties.\n\n---\n\n#### `playMedia()`\n\nPlay the given media.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type               | Description                                                |\n| --------- | ------------------ | ---------------------------------------------------------- |\n| `options` | `PlayMediaOptions` | An object defining play options and callbacks.             |\n|           |                    | See [`PlayMediaOptions`](#playmediaoptions) for more info. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `Promise<void>`\n\nA new `Promise` which resolves once `media.play()` promise is resolved.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { playMedia } from \"@alessiofrittoli/media-utils\";\n\nconst media = new Audio( ... )\n\nplay.addEventListener(\"click\", () => {\n\n  playMedia( {\n    media,\n    volume: 1,\n    fade: 800,\n    data: {\n      type: 'audio/mpeg',\n      title: 'Media title',\n    },\n    onError( error ) {\n      switch ( error.code ) {\n        case MediaError.MEDIA_ERR_ABORTED:\n          console.error( 'The fetching of the associated resource was aborted by the user\\'s request.' )\n          break\n        case MediaError.MEDIA_ERR_NETWORK:\n          console.error( 'Some kind of network error occurred which prevented the media from being successfully fetched, despite having previously been available.' )\n          break\n        case MediaError.MEDIA_ERR_DECODE:\n          console.error( 'Despite having previously been determined to be usable, an error occurred while trying to decode the media resource, resulting in an error.' )\n          break\n        case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:\n          console.error( 'The associated resource or media provider object (such as a MediaStream) has been found to be unsuitable.' )\n          break\n        default:\n          console.error( 'Unknow error.' )\n      }\n    },\n  } )\n\n});\n```\n\n</details>\n\n---\n\n#### `pauseMedia()`\n\nPause the given media.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                | Description                                                                 |\n| --------- | ------------------- | --------------------------------------------------------------------------- |\n| `options` | `PauseMediaOptions` | An object defining pause options and callbacks.                             |\n|           |                     | See [`PauseMediaOptions`](#pausemediaoptions) for more info. for more info. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { pauseMedia } from \"@alessiofrittoli/media-utils\";\n\nconst media = new Audio( ... )\n\npause.addEventListener(\"click\", () => {\n\n  pauseMedia( { media, fade: 800 } )\n\n});\n```\n\n</details>\n\n---\n\n#### Image Video Stream\n\n##### Types\n\n###### `CreateImageVideoStreamOptions` interface\n\nOptions for rendering an image into a video stream.\n\nIt optionally accepts a previously created `HTMLVideoElement` where image will get streamed into.\n\n<details>\n\n<summary style=\"cursor:pointer\">Properties</summary>\n\n- Extends [`RenderOptions`](#renderoptions-interface) interface.\n\n| Property | Type                     | Default | Description                                                                              |\n| -------- | ------------------------ | ------- | ---------------------------------------------------------------------------------------- |\n| `media`  | `Blob\\|HTMLImageElement` | -       | The image source to render. It can be either a `Blob` or a preloaded `HTMLImageElement`. |\n\n</details>\n\n---\n\n###### `RenderOptions` interface\n\nRendering options.\n\n<details>\n\n<summary style=\"cursor:pointer\">Properties</summary>\n\n| Property      | Type                     | Default   | Description                                                                                         |\n| ------------- | ------------------------ | --------- | --------------------------------------------------------------------------------------------------- |\n| `media`       | `Blob\\|HTMLImageElement` | -         | (Optional) The image source to render. It can be either a `Blob` or a preloaded `HTMLImageElement`. |\n| `video`       | `HTMLVideoElement`       | -         | (Optional) A previously created `HTMLVideoElement` where image get streamed into.                   |\n| `aspectRatio` | `number`                 | -         | (Optional) Target aspect ratio (width / height) of the rendering area.                              |\n|               |                          |           | If omitted, the original media aspect ratio is preserved.                                           |\n| `fit`         | `'contain'\\|'cover'`     | `contain` | (Optional) Defines how the media should fit inside the rendering area.                              |\n|               |                          |           | - `contain` (default) behaves like `object-fit: contain`                                            |\n|               |                          |           | - `cover` behaves like `object-fit: cover`                                                          |\n|               |                          |           | Only applies when `aspectRatio` is specified.                                                       |\n\n</details>\n\n---\n\n###### `RenderResult` interface\n\nThe rendering result.\n\n<details>\n\n<summary style=\"cursor:pointer\">Properties</summary>\n\n| Property | Type               | Description                                           |\n| -------- | ------------------ | ----------------------------------------------------- |\n| `video`  | `HTMLVideoElement` | The `HTMLVideoElement` where image get streamed into. |\n\n</details>\n\n---\n\n###### `RenderHandler` type\n\nRender a new image to the video stream.\n\n```ts\ntype RenderHandler = (options?: RenderOptions) => Promise<RenderResult>;\n```\n\n---\n\n###### `DestroyHandler` type\n\nStop stream tracks and release allocated resources.\n\n```ts\ntype DestroyHandler = () => void;\n```\n\n---\n\n###### `CreateImageVideoStream` interface\n\nDefines the returned result of rendering an image into a video.\n\n<details>\n\n<summary style=\"cursor:pointer\">Properties</summary>\n\n- Extends [`RenderResult`](#renderresult-interface) interface.\n\n| Property  | Type             | Description                                          |\n| --------- | ---------------- | ---------------------------------------------------- |\n| `render`  | `RenderHandler`  | Render a new image to the video stream.              |\n|           |                  | - See [`RenderHandler` type](#renderhandler-type).   |\n| `destroy` | `DestroyHandler` | Stop stream tracks and release allocated resources.  |\n|           |                  | - See [`DestroyHandler` type](#destroyhandler-type). |\n\n</details>\n\n---\n\n##### `createImageVideoStream`\n\nRender an image into a video stream.\n\nIf the provided media (HTMLImageElement) fails to load, a 1x1 black frame is rendered instead and the promise does not reject.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                            | Description                                                                                  |\n| --------- | ------------------------------- | -------------------------------------------------------------------------------------------- |\n| `options` | `CreateImageVideoStreamOptions` | Rendering options.                                                                           |\n|           |                                 | - See [`CreateImageVideoStreamOptions`](#createimagevideostreamoptions-interface) interface. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `Promise<CreateImageVideoStream>`\n\nA new Promise that resolves the allocated rendering resources.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n###### Fetch and render image Blob\n\n```ts\nimport { fetch } from \"@alessiofrittoli/fetcher\";\nimport {\n  getFallbackImage,\n  createImageVideoStream,\n} from \"@alessiofrittoli/media-utils\";\n\nconst createImageStream = async () => {\n  const { data: media, error } = await fetch<Blob>(\"/path-to/image.png\", {\n    responseType: \"blob\",\n  });\n\n  if (error) {\n    return createImageVideoStream({ media: getFallbackImage() });\n  }\n\n  return createImageVideoStream({ media });\n};\n```\n\n---\n\n###### Custom aspect ratio\n\n```ts\nimport { createImageVideoStream } from \"@alessiofrittoli/media-utils\";\n\nconst createImageStream = () => {\n  const media = document.createElement(\"img\");\n  media.src = \"/path-to/image.png\";\n\n  return createImageVideoStream({\n    media,\n    aspectRatio: 16 / 9,\n    fit: \"cover\", // or 'contain'\n  });\n};\n```\n\n---\n\n###### Update streamed content\n\n```ts\nimport { createImageVideoStream } from \"@alessiofrittoli/media-utils\";\n\nconst createImageStream = async () => {\n  const media = document.createElement(\"img\");\n  media.src = \"/path-to/image.png\";\n\n  const { video, render } = await createImageVideoStream({\n    media,\n    aspectRatio: 16 / 9,\n    fit: \"cover\", // or 'contain'\n  });\n\n  // update streamed content after 5 seconds\n  setTimeout(() => {\n    media.src = \"/path-to/image-2.png\";\n\n    await render({ aspectRatio: 1 });\n  }, 5000);\n\n  return video;\n};\n```\n\n---\n\n###### Using a previously created video\n\n```ts\nimport { createImageVideoStream } from \"@alessiofrittoli/media-utils\";\n\nconst createImageStream = async () => {\n  const video = document.createElement(\"video\");\n  video.src = \"/path-to/video.mp4\";\n\n  const media = document.createElement(\"img\");\n  media.src = \"/path-to/image.png\";\n\n  // replace original video content with streamed image\n  await createImageVideoStream({\n    media,\n    video,\n    aspectRatio: 16 / 9,\n    fit: \"cover\", // or 'contain'\n  });\n\n  return video;\n};\n```\n\n---\n\n###### Free allocated resources\n\n```ts\nimport { createImageVideoStream } from \"@alessiofrittoli/media-utils\";\n\nconst createImageStream = async () => {\n  const media = document.createElement(\"img\");\n  media.src = \"/path-to/image.png\";\n\n  // replace original video content with streamed image\n  const { video, destroy } = await createImageVideoStream({\n    media,\n    aspectRatio: 16 / 9,\n    fit: \"cover\", // or 'contain'\n  });\n\n  // free allocated resources after 5 seconds\n  setTimeout(() => {\n    destroy();\n  }, 5000);\n\n  return video;\n};\n```\n\n</details>\n\n---\n\n#### Media Artwork Picture-in-Picture\n\n##### Types\n\n###### `OpenPictureInPictureCommonOptions` interface\n\nDefines common configuration options for opening the media in Picture-in-Picture mode.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type         | Description                                                                |\n| --------- | ------------ | -------------------------------------------------------------------------- |\n| `onQuit`  | `() => void` | (Optional) A callback to execute when Picture-in-Picture window is closed. |\n\n</details>\n\n---\n\n###### `OpenImagePictureInPictureOptions` interface\n\nDefines configuration options for opening the image in Picture-in-Picture mode.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n- Extends [`OpenPictureInPictureCommonOptions`](#openpictureinpicturecommonoptions-interface) interface.\n- Extends [`CreateImageVideoStreamOptions`](#createimagevideostreamoptions-interface) interface.\n- Partially extends [`CreateImageVideoStream`](#createimagevideostream-interface) interface.\n\n| Parameter | Type                                                 | Description                                         |\n| --------- | ---------------------------------------------------- | --------------------------------------------------- |\n| `media`   | `CreateImageVideoStreamOptions[ 'media' ]\\|UrlInput` | The media to render in a Picture-in-Picture window. |\n\n</details>\n\n---\n\n###### `OpenImagePictureInPicture` type\n\nDefines the returned result of opening a rendered image into a video Picture-in-Picture window.\n\n- Alias for [`CreateImageVideoStream`](#createimagevideostream-interface) interface\n\n---\n\n###### `OpenVideoArtworkPictureInPictureOptions` interface\n\nDefines configuration options for opening the video in Picture-in-Picture window.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n- Extends [`OpenPictureInPictureCommonOptions`](#openpictureinpicturecommonoptions-interface) interface.\n- Partially extends [`OpenVideoArtworkPictureInPicture`](#openvideoartworkpictureinpictureoptions-interface) interface.\n\n| Parameter | Type                         | Description                                       |\n| --------- | ---------------------------- | ------------------------------------------------- |\n| `media`   | `HTMLVideoElement\\|UrlInput` | The media to open in a Picture-in-Picture window. |\n\n</details>\n\n---\n\n###### `OpenVideoArtworkPictureInPicture` interface\n\nDefines the returned result of opening a video into a Picture-in-Picture window.\n\n<details>\n\n<summary style=\"cursor:pointer\">Properties</summary>\n\n| Property | Type               | Description                                   |\n| -------- | ------------------ | --------------------------------------------- |\n| `video`  | `HTMLVideoElement` | The `HTMLVideoElement` in Picture-in-Picture. |\n\n</details>\n\n---\n\n###### `OpenArtworkPictureInPictureOptions` interface\n\nDefines configuration options for opening media artwork in Picture-in-Picture window.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n- Extends [`OpenImagePictureInPictureOptions`](#openimagepictureinpictureoptions-interface) interface.\n- Extends [`OpenVideoArtworkPictureInPictureOptions`](#openvideoartworkpictureinpictureoptions-interface) interface.\n\n| Parameter | Type                                                                      | Description                                                                           |\n| --------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |\n| `media`   | `CreateImageVideoStreamOptions['media']\\| HTMLVideoElement\\|MediaArtWork` | The media to open in a Picture-in-Picture window.                                     |\n|           |                                                                           | - See [`CreateImageVideoStreamOptions`](#createimagevideostream-interface) interface. |\n|           |                                                                           | - See [`MediaArtWork`](#mediaartwork) interface.                                      |\n\n</details>\n\n---\n\n###### `OpenArtworkPictureInPicture` interface\n\nDefines the returned result of opening a media artwork into a Picture-in-Picture window.\n\nIt could be [`OpenImagePictureInPicture`](#openimagepictureinpicture-type) or [`OpenVideoArtworkPictureInPicture`](#openvideoartworkpictureinpicture-interface).\n\n---\n\n##### `isPictureInPictureSupported`\n\nChecks if the Picture-in-Picture API is supported by the current browser.\n\n---\n\n##### `requiresPictureInPictureAPI`\n\nValidates that the Picture-in-Picture API is supported by the current browser.\n\n- Throws a new `Exception` with code `ErrorCode.PIP_NOT_SUPPORTED` if the Picture-in-Picture API is not supported.\n\n---\n\n##### `openImagePictureInPicture`\n\nOpens an image in Picture-in-Picture window.\n\nOnce Picture-in-Picture get closed by the user, allocated resources are automatically freed.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                               | Description                                                                                        |\n| --------- | ---------------------------------- | -------------------------------------------------------------------------------------------------- |\n| `options` | `OpenImagePictureInPictureOptions` | Configuration options for opening the image in PiP window.                                         |\n|           |                                    | - See [`OpenImagePictureInPictureOptions`](#openimagepictureinpictureoptions-interface) interface. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `Promise<OpenImagePictureInPicture>`\n\nA new Promise that resolves to the Picture-in-Picture result containing the video element and destroy function.\n\n- See [`OpenImagePictureInPicture`](#openimagepictureinpicture-type) for more info.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n###### Simple usage\n\n```ts\nimport {\n  ErrorCode,\n  openImagePictureInPicture,\n} from \"@alessiofrittoli/media-utils\";\n\ntry {\n  navigator.mediaSession.setActionHandler(\"enterpictureinpicture\", async () => {\n    try {\n      await openImagePictureInPicture({\n        media: { pathname: \"path/to/image.png\" },\n        aspectRatio: 1,\n        fit: \"cover\",\n        onQuit: () => console.log(\"Picture-in-Picture closed\"),\n      });\n    } catch (_err) {\n      const err = _err as Error;\n\n      const error = Exception.isException<string, ErrorCode>(err)\n        ? err\n        : new Exception(err.message, {\n            code: ErrorCode.UNKNOWN,\n            name: err.name,\n            cause: err,\n          });\n      switch (error.code) {\n        case ErrorCode.PIP_NOT_SUPPORTED:\n          alert(\"Picture-In-Picture is not supported by the current browser.\");\n          break;\n        case ErrorCode.RENDERING_CONTEXT_UNAVAILABLE:\n          alert(\"Couldn't render image in Picture-in-Picture.\");\n          break;\n        default:\n          console.error(error);\n      }\n    }\n  });\n} catch (error) {\n  console.warn(\n    'Warning! The \"enterpictureinpicture\" media session action is not supported.',\n    error,\n  );\n}\n```\n\n---\n\n###### Update image Picture-in-Picture content\n\n```ts\nimport {\n  openImagePictureInPicture,\n  type OpenImagePictureInPicture,\n} from \"@alessiofrittoli/media-utils\";\n\nlet resources: OpenImagePictureInPicture;\n\nnavigator.mediaSession.setActionHandler(\"enterpictureinpicture\", async () => {\n  resources = await openImagePictureInPicture({\n    media: { pathname: \"/path/to/image.png\" },\n  });\n});\n\nnavigator.mediaSession.setActionHandler(\"nexttrack\", async () => {\n  resources = await openImagePictureInPicture({\n    media: { pathname: \"/path/to/image.png\" },\n    ...resources,\n  });\n});\n```\n\n</details>\n\n---\n\n##### `openVideoArtworkPictureInPicture`\n\nOpens a video artwork element in Picture-in-Picture window.\n\nThis function is intended for rendering a short song artwork video.\nThis is not suitable if your're looking for a proper video Picture-in-Picture since it simple as calling `video.requestPictureInPicture()`.\n\nSupports both `HTMLVideoElement` instances and URL inputs. When a URL is provided, a video element is created and the URL is set as its source.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                                      | Description                                                                                                      |\n| --------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| `options` | `OpenVideoArtworkPictureInPictureOptions` | Configuration options for opening the video in Picture-in-Picture.                                               |\n|           |                                           | - See [`OpenVideoArtworkPictureInPictureOptions`](#openvideoartworkpictureinpictureoptions-interface) interface. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `Promise<OpenVideoArtworkPictureInPicture>`\n\nA new Promise that resolves with an object containing the video element displayed in Picture-in-Picture mode.\n\n- See [`OpenVideoArtworkPictureInPicture`](#openvideoartworkpictureinpicture-interface) for more info.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { openVideoArtworkPictureInPicture } from \"@alessiofrittoli/media-utils\";\n\n// With a URL\nconst { video } = await openVideoArtworkPictureInPicture({\n  media: \"/song-artwork-video.mp4\",\n  onQuit: () => console.log(\"Picture-in-Picture closed\"),\n});\n\n// With an HTMLVideoElement\nconst media = document.querySelector(\"video\");\nmedia.src = \"/song-artwork-video.mp4\";\n\nconst { video } = await openVideoArtworkPictureInPicture({ media });\n```\n\n</details>\n\n---\n\n##### `openArtworkPictureInPicture`\n\nOpens the given media in Picture-in-Picture window.\n\nIt easly handles images and videos rendering using [`openImagePictureInPicture`](#openimagepictureinpicture) or [`openVideoArtworkPictureInPicture`](#openvideoartworkpictureinpicture).\n\nOnce Picture-in-Picture get closed by the user, allocated resources are automatically freed.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                                 | Description                                                                                            |\n| --------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------ |\n| `options` | `OpenArtworkPictureInPictureOptions` | Configuration options for opening the media in Picture-in-Picture window.                              |\n|           |                                      | - See [`OpenArtworkPictureInPictureOptions`](#openartworkpictureinpictureoptions-interface) interface. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `Promise<OpenArtworkPictureInPicture>`\n\nA new Promise that resolves to the Picture-in-Picture result.\n\n- See [`OpenArtworkPictureInPicture`](#openartworkpictureinpicture-interface).\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n###### Simple usage\n\n```ts\nimport { openArtworkPictureInPicture } from \"@alessiofrittoli/media-utils\";\n\nconst result = await openArtworkPictureInPicture({\n  media: {\n    type: \"image/png\",\n    src: \"/path/to/image.png\",\n  },\n  aspectRatio: 1,\n  fit: \"cover\",\n});\n\n// update\nawait openArtworkPictureInPicture({\n  media: {\n    type: \"video/mp4\",\n    src: \"/path/to/video.mp4\",\n  },\n  ...result,\n});\n```\n\n---\n\n###### Using media session image\n\n```ts\nimport {\n  openArtworkPictureInPicture,\n  updateMediaMetadata,\n  type MediaSessionMetadata,\n} from \"@alessiofrittoli/media-utils\";\n\nconst data: MediaSessionMetadata = {\n  title: \"Test Song\",\n  artist: \"Test Artist\",\n  album: \"Test Album\",\n  artwork: [\n    { src: \"/path/to/song-artwork.png\", sizes: 128, type: \"image/png\" },\n  ],\n};\n\nupdateMediaMetadata(data);\n\nawait openArtworkPictureInPicture();\n```\n\n---\n\n###### Handling errors\n\n```ts\nimport {\n  ErrorCode,\n  openArtworkPictureInPicture,\n} from \"@alessiofrittoli/media-utils\";\n\ntry {\n  await openArtworkPictureInPicture({ ... });\n} catch (_err) {\n  const err = _err as Error;\n\n  const error = Exception.isException<string, ErrorCode>(err)\n    ? err\n    : new Exception(err.message, {\n        code: ErrorCode.UNKNOWN,\n        name: err.name,\n        cause: err,\n      });\n  switch (error.code) {\n    case ErrorCode.PIP_NOT_SUPPORTED:\n      alert(\"Picture-In-Picture is not supported by the current browser.\");\n      break;\n    case ErrorCode.RENDERING_CONTEXT_UNAVAILABLE:\n      alert(\"Couldn't render image in Picture-in-Picture.\");\n      break;\n    default:\n      console.error(error);\n  }\n}\n```\n\n</details>\n\n---\n\n#### Utilities\n\n##### `formatMediaTiming()`\n\nFormats a time value in seconds into a human-readable media timing string (M:SS or H:MM:SS).\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter   | Type      | Default | Description                                                  |\n| ----------- | --------- | ------- | ------------------------------------------------------------ |\n| `time`      | `number`  | -       | The time value in seconds to format.                         |\n| `showHours` | `boolean` | `false` | (Optional) Whether to include hours in the formatted output. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `string`\n\nA formatted time string in the format \"M:SS\" or \"H:MM:SS\" if `showHours` is `true`.\nIf the time is 0 or invalid, returns \"0:00\".\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```ts\nimport { formatMediaTiming } from \"@alessiofrittoli/media-utils\";\n\nconsole.log(formatMediaTiming(45)); // Outputs: \"0:45\"\nconsole.log(formatMediaTiming(90)); // Outputs: \"1:30\"\nconsole.log(formatMediaTiming(125)); // Outputs: \"2:05\"\n\nconsole.log(formatMediaTiming(3661, true)); // Outputs: \"1:01:01\"\n\nconsole.log(formatMediaTiming(0)); // Outputs: \"0:00\"\nconsole.log(formatMediaTiming(-NaN)); // Outputs: \"0:00\"\nconsole.log(formatMediaTiming(NaN)); // Outputs: \"0:00\"\nconsole.log(formatMediaTiming(-Infinity)); // Outputs: \"0:00\"\nconsole.log(formatMediaTiming(Infinity)); // Outputs: \"0:00\"\n\nconsole.log(formatMediaTiming(0, true)); // Outputs: \"0:00:00\"\nconsole.log(formatMediaTiming(-NaN, true)); // Outputs: \"0:00:00\"\nconsole.log(formatMediaTiming(NaN, true)); // Outputs: \"0:00:00\"\nconsole.log(formatMediaTiming(-Infinity, true)); // Outputs: \"0:00:00\"\nconsole.log(formatMediaTiming(Infinity, true)); // Outputs: \"0:00:00\"\n```\n\n</details>\n\n---\n\n##### `getPreloadStrategy`\n\nDetermines the optimal preload strategy for media elements based on network conditions.\n\nIt returns a value that corresponds to the preload attribute used in HTML media elements like `<video>` and `<audio>`.\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `HTMLMediaElement[ 'preload' ]`\n\nThe recommended preload attribute value ('none', 'metadata', or 'auto').\n\n- Returns 'auto' if network connection information is unavailable\n- Returns 'none' if data saver mode is enabled\n- Returns 'metadata' for slow-2g or 2g connections\n- Returns 'auto' for faster connections (3g, 4g, etc.)\n\n</details>\n\n---\n\n---\n\n### Development\n\n#### Install depenendencies\n\n```bash\nnpm install\n```\n\nor using `pnpm`\n\n```bash\npnpm i\n```\n\n#### Build the source code\n\nRun the following command to test and build code for distribution.\n\n```bash\npnpm build\n```\n\n#### [ESLint](https://www.npmjs.com/package/eslint)\n\nwarnings / errors check.\n\n```bash\npnpm lint\n```\n\n#### [Jest](https://npmjs.com/package/jest)\n\nRun all the defined test suites by running the following:\n\n```bash\n# Run tests and watch file changes.\npnpm test:watch\n\n# Run tests in a CI environment.\npnpm test:ci\n```\n\n- See [`package.json`](./package.json) file scripts for more info.\n\nRun tests with coverage.\n\nAn HTTP server is then started to serve coverage files from `./coverage` folder.\n\n⚠️ You may see a blank page the first time you run this command. Simply refresh the browser to see the updates.\n\n```bash\ntest:coverage:serve\n```\n\n---\n\n### Contributing\n\nContributions are truly welcome!\n\nPlease refer to the [Contributing Doc](./CONTRIBUTING.md) for more information on how to start contributing to this project.\n\nHelp keep this project up to date with [GitHub Sponsor][sponsor-url].\n\n[![GitHub Sponsor][sponsor-badge]][sponsor-url]\n\n---\n\n### Security\n\nIf you believe you have found a security vulnerability, we encourage you to **_responsibly disclose this and NOT open a public issue_**. We will investigate all legitimate reports. Email `security@alessiofrittoli.it` to disclose any security vulnerabilities.\n\n### Made with ☕\n\n<table style='display:flex;gap:20px;'>\n  <tbody>\n    <tr>\n      <td>\n        <img alt=\"avatar\" src='https://avatars.githubusercontent.com/u/35973186' style='width:60px;border-radius:50%;object-fit:contain;'>\n      </td>\n      <td>\n        <table style='display:flex;gap:2px;flex-direction:column;'>\n          <tbody>\n              <tr>\n                <td>\n                  <a href='https://github.com/alessiofrittoli' target='_blank' rel='noopener'>Alessio Frittoli</a>\n                </td>\n              </tr>\n              <tr>\n                <td>\n                  <small>\n                    <a href='https://alessiofrittoli.it' target='_blank' rel='noopener'>https://alessiofrittoli.it</a> |\n                    <a href='mailto:info@alessiofrittoli.it' target='_blank' rel='noopener'>info@alessiofrittoli.it</a>\n                  </small>\n                </td>\n              </tr>\n          </tbody>\n        </table>\n      </td>\n    </tr>\n  </tbody>\n</table>\n","readmeFilename":"README.md"}