{"_rev":"4-f1c03d8305477c5d4c4ea3175020fe58","time":{"created":"2026-09-11T04:03:36.535Z","modified":"2026-09-11T04:03:37.042Z","1.0.0":"2026-09-11T03:59:45.397Z","1.0.1":"2026-09-11T04:03:36.833Z"},"_id":"@amir734jj/stream-ripper","name":"@amir734jj/stream-ripper","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"@amir734jj/stream-ripper","version":"1.0.1","description":"Rip Icecast audio streams and ICY metadata using fetch","keywords":["icecast","icy","internet-radio","metadata","stream-ripper"],"type":"module","main":"dist/src/index.js","types":"dist/src/index.d.ts","sideEffects":false,"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"}},"repository":{"type":"git","url":"git+https://github.com/amir734jj/stream-ripper-js.git"},"bugs":{"url":"https://github.com/amir734jj/stream-ripper-js/issues"},"homepage":"https://github.com/amir734jj/stream-ripper-js#readme","scripts":{"build":"tsc -p tsconfig.json","test":"npm run build && node --test dist/test/StreamRipper.test.js","prepublishOnly":"npm test"},"publishConfig":{"name":"stream-ripper","version":"1.0.1","publishConfig":{"registry":"https://registry.npmjs.org/"}},"engines":{"node":">=18"},"devDependencies":{"@types/node":"^24.3.1","typescript":"^5.9.2"},"gitHead":"439f320df756eb73353e70db9380104b87652b0d","_id":"@amir734jj/stream-ripper@1.0.1","_nodeVersion":"18.19.1","_npmVersion":"9.2.0","dist":{"integrity":"sha512-6MMl9OuQ/1jvWR0SaNEhTivsS2AQPRBH3wANoSAiA+QUxy7+Zn46QN9blHx4jZDXTBUjFyIdY5OVqbd+R2yrIQ==","shasum":"425b5a1f64b02f0c28992e2527e84a48cfcfea28","tarball":"https://registry.npmjs.org/@amir734jj/stream-ripper/-/stream-ripper-1.0.1.tgz","fileCount":10,"unpackedSize":13966,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDL6GiPNAHOi6pGit9vQM7kgWnRPy9hMH85yG0/sHjfOwIgOkvnZKYcNjqeiHJHr1UQvCS3SRr+KlW9l/0OC3/umlY="}]},"_npmUser":{"name":"amir734jj","email":"amirhesamyan@gmail.com"},"directories":{},"maintainers":[{"name":"amir734jj","email":"amirhesamyan@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/stream-ripper_1.0.1_1789099416696_0.739112003256011"},"_hasShrinkwrap":false}},"maintainers":[{"name":"amir734jj","email":"amirhesamyan@gmail.com"}],"description":"Rip Icecast audio streams and ICY metadata using fetch","homepage":"https://github.com/amir734jj/stream-ripper-js#readme","keywords":["icecast","icy","internet-radio","metadata","stream-ripper"],"repository":{"type":"git","url":"git+https://github.com/amir734jj/stream-ripper-js.git"},"bugs":{"url":"https://github.com/amir734jj/stream-ripper-js/issues"},"readme":"# Stream Ripper\n\nFetch-based TypeScript library for splitting an Icecast stream into audio and ICY metadata. It works in Node.js 18+ and in browsers whose stream server permits the required CORS request and response headers.\n\n## Install\n\n```sh\nnpm config set @amir734jj:registry https://npm.pkg.github.com\nnpm install @amir734jj/stream-ripper\n```\n\nGitHub Packages requires npm authentication. Authenticate with a GitHub personal access\ntoken that has `read:packages` permission before installing.\n\n## Usage\n\n```ts\nimport { writeFile } from \"node:fs/promises\";\nimport { StreamRipper } from \"@amir734jj/stream-ripper\";\n\nconst ripper = new StreamRipper({\n  url: \"http://stream.radiojavan.com/radiojavan\",\n  maxBufferSize: 10 * 1_000_000,\n});\n\nripper.on(\"song\", async ({ songInfo }) => {\n  const name = `${songInfo.metadata.artist ?? \"Unknown\"}-${songInfo.metadata.title ?? \"Unknown\"}`;\n  await writeFile(`Music/ripped/${name}.mp3`, songInfo.data);\n});\n\nripper.on(\"failed\", ({ error }) => console.error(error));\n\nawait ripper.start();\n\n// Stop an active request:\n// ripper.stop();\n```\n\nEvents are `started`, `update`, `metadata`, `song`, `ended`, and `failed`. Event handlers may be async; stream processing waits for them, providing backpressure while a song is saved.\n\nUse `await ripper.checkUrlValid()` to verify that the URL responds successfully with an audio content type or an `icy-metaint` header. In a browser, the Icecast server or a same-origin proxy must allow the `icy-metadata` request header and expose `icy-metaint` through CORS.\n\n## Development\n\n```sh\nnpm install\nnpm test\n```\n\n## Publishing\n\nUpdate the version in `package.json` and push to `master`. The workflow tests the package\nand publishes it to GitHub Packages using the repository's built-in `GITHUB_TOKEN`.","readmeFilename":"README.md"}