{"_id":"@donkeypanzee/terabox-api","_rev":"5-4353084e442f5d1eef61fbca373f3525","name":"@donkeypanzee/terabox-api","dist-tags":{"latest":"2.10.0"},"versions":{"2.9.2":{"name":"@donkeypanzee/terabox-api","version":"2.9.2","keywords":["terabox","donkeypanzee","ai-optimized"],"author":{"name":"Seiya Dev."},"license":"MIT","_id":"@donkeypanzee/terabox-api@2.9.2","maintainers":[{"name":"donkeypanzee","email":"donkeypanzee@yatsuhashi.net"}],"homepage":"https://github.com/donkeypanzee/terabox-api#readme","bugs":{"url":"https://github.com/donkeypanzee/terabox-api/issues"},"dist":{"shasum":"8ecf1386eef2ca4266fd76af7aef053a2799b79d","tarball":"https://registry.npmjs.org/@donkeypanzee/terabox-api/-/terabox-api-2.9.2.tgz","fileCount":20,"integrity":"sha512-4ZDKicId377x8/VVDlQxnHi1esJ54rn9/eoKTd5fYrHB4RvfvhbsGD6OcN9vdntksByyl2no/gqaN01muFltbw==","signatures":[{"sig":"MEUCIQC7iVXCEc+gTPEdy6De0yrL7NAXYiktYyvUvK+G2n2ihAIgYrhUc3weSv7s+DpTWXJS6s2hmbxSFrwxDGGe751KxlE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128645},"main":"api.js","type":"module","_from":"file:donkeypanzee-terabox-api-2.9.2.tgz","types":"./types/public.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./types/public.d.ts","import":"./api.js"},"./helper":{"types":"./types/helper-public.d.ts","import":"./helper.js"},"./package.json":"./package.json"},"scripts":{"html":"python docs/apidoc.py","lint":"eslint . --config .eslint.config.js","test":"node --test test/**/*.test.js","types":"tsc -p tsconfig.json","lint:fix":"eslint . --config .eslint.config.js --fix","test:e2e":"node --test test/e2e-smoke.test.js","pack:check":"npm pack --dry-run"},"_npmUser":{"name":"donkeypanzee","email":"donkeypanzee@yatsuhashi.net"},"name_ext":"TeraBox API","_resolved":"/tmp/b7359cbe1d17bb36fea89888036a36c6/donkeypanzee-terabox-api-2.9.2.tgz","_integrity":"sha512-4ZDKicId377x8/VVDlQxnHi1esJ54rn9/eoKTd5fYrHB4RvfvhbsGD6OcN9vdntksByyl2no/gqaN01muFltbw==","deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/donkeypanzee/terabox-api.git","type":"git"},"_npmVersion":"10.9.8","description":"TeraBox cloud API client (fork: ai-optimized) — Node.js ESM","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"crc-32":"^1.2.2","undici":"^8.7.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^4.0.5","eslint":"^10.7.0","docdash":"^2.0.2","globals":"^17.7.0","@eslint/js":"^10.0.1","typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/terabox-api_2.9.2_1784298031012_0.42148987531800164","host":"s3://npm-registry-packages-npm-production"}},"2.9.3":{"name":"@donkeypanzee/terabox-api","version":"2.9.3","keywords":["terabox","somekeykongdong","ai-optimized"],"author":{"name":"Seiya Dev."},"license":"MIT","_id":"@donkeypanzee/terabox-api@2.9.3","maintainers":[{"name":"donkeypanzee","email":"donkeypanzee@yatsuhashi.net"}],"homepage":"https://github.com/somekeykongdong/terabox-api#readme","bugs":{"url":"https://github.com/somekeykongdong/terabox-api/issues"},"dist":{"shasum":"c7c10d8f44cfe7eea460db92689d5f98e33f2cb1","tarball":"https://registry.npmjs.org/@donkeypanzee/terabox-api/-/terabox-api-2.9.3.tgz","fileCount":20,"integrity":"sha512-nbiXucGWQxggp76063BhTYMkLn6hc2zSWoB9MF6SnfsViVAeN9N0rkAteaWGmDxY/5jKo46H/a6Uy+fJLPBgeQ==","signatures":[{"sig":"MEUCIQCogVgSw68HrDBA9ldLiYO91oyqTvbnz1UTSr4EiB2eagIgd2qWkrMPmt1Q97ZcBLV6VqyXiwLQW9n1NWOi8bh04Lk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@donkeypanzee%2fterabox-api@2.9.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":129268},"main":"api.js","pnpm":{"overrides":{"linkify-it":">=5.0.1","markdown-it":">=14.2.0","underscore@<=1.13.7":">=1.13.8","lodash@>=4.0.0 <=4.17.22":">=4.17.23","minimatch@>=10.0.0 <10.2.3":">=10.2.3","markdown-it@>=13.0.0 <14.1.1":">=14.1.1"}},"type":"module","types":"./types/public.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./types/public.d.ts","import":"./api.js"},"./helper":{"types":"./types/helper-public.d.ts","import":"./helper.js"},"./package.json":"./package.json"},"gitHead":"8b159715cba40e6fdfdf9d02768f67f9d7371ee3","scripts":{"html":"python docs/apidoc.py","lint":"eslint . --config .eslint.config.js","test":"node --test test/**/*.test.js","types":"tsc -p tsconfig.json","lint:fix":"eslint . --config .eslint.config.js --fix","test:e2e":"node --test test/e2e-smoke.test.js","pack:check":"npm pack --dry-run","prepublishOnly":"pnpm lint && pnpm test && pnpm types"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7618b090-2b21-4a17-8b9f-fd34c0307c5a"}},"name_ext":"TeraBox API","deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/somekeykongdong/terabox-api.git","type":"git"},"_npmVersion":"12.0.1","description":"TeraBox cloud API client (fork: ai-optimized) — Node.js ESM","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"crc-32":"^1.2.2","undici":"^8.7.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.15.0","devDependencies":{"jsdoc":"^4.0.5","eslint":"^10.7.0","docdash":"^2.0.2","globals":"^17.7.0","@eslint/js":"^10.0.1","typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/terabox-api_2.9.3_1784299734085_0.04700312653391503","host":"s3://npm-registry-packages-npm-production"}},"2.10.0":{"name":"@donkeypanzee/terabox-api","version":"2.10.0","keywords":["terabox","somekeykongdong","ai-optimized"],"license":"MIT","_id":"@donkeypanzee/terabox-api@2.10.0","maintainers":[{"name":"donkeypanzee","email":"donkeypanzee@yatsuhashi.net"}],"homepage":"https://github.com/somekeykongdong/terabox-api#readme","bugs":{"url":"https://github.com/somekeykongdong/terabox-api/issues"},"dist":{"shasum":"16c4354ccd53c9c73c821b011cc757ab6b4609d7","tarball":"https://registry.npmjs.org/@donkeypanzee/terabox-api/-/terabox-api-2.10.0.tgz","fileCount":20,"integrity":"sha512-Eb4mcRcFGgik3Jqj8PvNjXqpQIWtCkKtuO+ZanlL/cR/H6mk9Nh0HorjkurOl3OAUj07Ex+QdHSCfHGzNadR8w==","signatures":[{"sig":"MEQCID6bb5JsPKlQR+ROE5tYEmGOme49UqfnGdLJHf2HkxzAAiAB5Zf0eHeYCvv0aRfhAIA24N17TRwf8BvRPoef1Eaj8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@donkeypanzee%2fterabox-api@2.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":132765},"main":"api.js","pnpm":{"overrides":{"linkify-it":">=5.0.1","markdown-it":">=14.2.0","underscore@<=1.13.7":">=1.13.8","lodash@>=4.0.0 <=4.17.22":">=4.17.23","minimatch@>=10.0.0 <10.2.3":">=10.2.3","markdown-it@>=13.0.0 <14.1.1":">=14.1.1"}},"type":"module","types":"./types/public.d.ts","engines":{"node":">=20.3.0"},"exports":{".":{"types":"./types/public.d.ts","import":"./api.js"},"./helper":{"types":"./types/helper-public.d.ts","import":"./helper.js"},"./package.json":"./package.json"},"gitHead":"84eb197e39804e2506494511978c464d0e7b97b8","scripts":{"html":"python docs/apidoc.py","lint":"eslint . --config .eslint.config.js","test":"node --test test/**/*.test.js","types":"tsc -p tsconfig.json","lint:fix":"eslint . --config .eslint.config.js --fix","test:e2e":"node --test test/e2e-smoke.test.js","pack:check":"npm pack --dry-run","prepublishOnly":"pnpm lint && pnpm test && pnpm types"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7618b090-2b21-4a17-8b9f-fd34c0307c5a"}},"name_ext":"TeraBox API","deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/somekeykongdong/terabox-api.git","type":"git"},"_npmVersion":"12.0.1","description":"TeraBox cloud API client (fork: ai-optimized) — Node.js ESM","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"crc-32":"^1.2.2","undici":"^8.7.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.15.0","devDependencies":{"jsdoc":"^4.0.5","eslint":"^10.7.0","docdash":"^2.0.2","globals":"^17.7.0","@eslint/js":"^10.0.1","typescript":"^7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/terabox-api_2.10.0_1784356361981_0.6265897400399685","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-07-17T14:20:30.892Z","modified":"2026-07-23T03:14:03.663Z","2.9.2":"2026-07-17T14:20:31.144Z","2.9.3":"2026-07-17T14:48:54.242Z","2.10.0":"2026-07-18T06:32:42.128Z"},"bugs":{"url":"https://github.com/somekeykongdong/terabox-api/issues"},"license":"MIT","homepage":"https://github.com/somekeykongdong/terabox-api#readme","keywords":["terabox","somekeykongdong","ai-optimized"],"repository":{"url":"git+https://github.com/somekeykongdong/terabox-api.git","type":"git"},"description":"TeraBox cloud API client (fork: ai-optimized) — Node.js ESM","maintainers":[{"email":"support@npmjs.com","name":"npm-support"}],"readme":"# TeraBox API\n\n[![npm](https://img.shields.io/npm/v/@donkeypanzee/terabox-api?style=flat-square)](https://www.npmjs.com/package/@donkeypanzee/terabox-api)\n[![npm downloads](https://img.shields.io/npm/dm/@donkeypanzee/terabox-api?style=flat-square)](https://www.npmjs.com/package/@donkeypanzee/terabox-api)\n\nNodeJS tool for interacting with the TeraBox cloud service without the need to use the website or app ☁️\n\n## Requirements\n\n- Node.js **>= 20.3** (`AbortSignal.any`)\n- A valid TeraBox session cookie (`ndus=...`)\n\n## Install\n\n```bash\npnpm add @donkeypanzee/terabox-api\n# or: npm install @donkeypanzee/terabox-api\n```\n\n## npm package\n\nPublished as **`@donkeypanzee/terabox-api`**.\n\n```bash\npnpm add @donkeypanzee/terabox-api\n```\n\nRelease (after push to GitHub):\n\n1. Bump `version` in `package.json` on `main`\n2. Either:\n   - Actions → **Publish @donkeypanzee/terabox-api** → Run workflow on `main`, or\n   - `git tag vX.Y.Z && git push origin vX.Y.Z` (tag must match `package.json` version)\n\nPublishing uses **npm Trusted Publishing (OIDC)** via workflow `publish-scoped.yml` (no long-lived npm token).\n\n\n## Project layout\n\n```\napi.js / helper.js   # public entry re-exports\nsrc/\n  app.js             # TeraBoxApp core + prototype mixins\n  cookie.js          # cookie merge helpers\n  crypto-util.js\n  form.js / path.js / logger.js\n  helper.js          # low-level: hashFile, getChunkSize, readSlice, …\n  methods/           # auth, fs, upload, share, clouddl, core_http\ntypes/\n  public.d.ts\n  helper-public.d.ts\n```\n\n## Quick start\n\n```js\nimport TeraBoxApp from '@donkeypanzee/terabox-api';\n\nconst app = new TeraBoxApp(process.env.TERABOX_NDUS, { logger: false });\nawait app.updateAppData();\nconst login = await app.checkLogin();\nif (login.errno !== 0) throw new Error('Invalid or expired ndus cookie');\n\nconst listing = await app.getRemoteDir('/', 1);\nconsole.log(listing);\n```\n\n## Upload (low-level)\n\nNo high-level `uploadChunks` orchestrator — compose the steps yourself.\n\n```js\nimport fs from 'node:fs';\nimport TeraBoxApp from '@donkeypanzee/terabox-api';\nimport {\n    hashFile,\n    getChunkSize,\n    readSlice,\n    runWithConcurrencyLimit,\n} from '@donkeypanzee/terabox-api/helper';\n\nconst app = new TeraBoxApp(process.env.TERABOX_NDUS, { logger: false });\nawait app.updateAppData();\nawait app.getUploadHost();\n\nconst localPath = './example.bin';\nconst size = fs.statSync(localPath).size;\nconst hash = await hashFile(localPath, { is_vip: app.params.is_vip });\nconst data = {\n    remote_dir: '/Apps/terabox-api',\n    file: 'example.bin',\n    size,\n    hash,\n    uploaded: hash.chunks.map(() => false),\n};\n\n// Optional: skip transfer if server already has the content\n// const rapid = await app.rapidUpload(data);\n\nconst pre = await app.precreateFile(data);\ndata.upload_id = pre.uploadid;\n// if pre.block_list marks finished parts, set data.uploaded[i] = true\n\nconst splitSize = getChunkSize(size, app.params.is_vip);\nconst file = await fs.promises.open(localPath, 'r');\ntry {\n    const tasks = [];\n    for (let partSeq = 0; partSeq < hash.chunks.length; partSeq++) {\n        if (data.uploaded[partSeq]) continue;\n        tasks.push(async () => {\n            const start = partSeq * splitSize;\n            const end = Math.min(start + splitSize, size);\n            const buf = await readSlice(file, start, end - start);\n            const blob = new Blob([buf], { type: 'application/octet-stream' });\n            const res = await app.uploadChunk(data, partSeq, blob);\n            // optional: verify res.md5 === hash.chunks[partSeq]\n            data.uploaded[partSeq] = true;\n            data.hash.chunks[partSeq] = res.md5 || data.hash.chunks[partSeq];\n        });\n    }\n    // pick your own concurrency (watch RAM: ~splitSize per in-flight part)\n    await runWithConcurrencyLimit(tasks, 4);\n} finally {\n    await file.close();\n}\n\nconst created = await app.createFile(data);\nconsole.log(created);\nawait app.dispose();\n```\n\nLow-level surface:\n\n| API | Role |\n|-----|------|\n| `hashFile` / `getChunkSize` | local hash + chunk size |\n| `readSlice` | read one part from disk |\n| `runWithConcurrencyLimit` | optional pool helper |\n| `app.getUploadHost` | pick upload host |\n| `app.precreateFile` | reserve `uploadid` |\n| `app.uploadChunk` | POST one part |\n| `app.createFile` | commit |\n| `app.rapidUpload` | hash-only upload when possible |\n\n## Types\n\n`types/public.d.ts` lists `TeraBoxApp` methods for editor autocomplete (including low-level upload methods).\n\n## Live smoke test (optional)\n\n```bash\nexport TERABOX_NDUS='your-ndus-value'   # never commit\npnpm test:e2e\n```\n\nWithout `TERABOX_NDUS`, the e2e suite is skipped.\n\n> Keep `ndus` secret. Do not commit cookies or dump full `Cookie` headers in logs.\n\n## Docs\n\nGenerate local HTML docs (gitignored):\n\n```bash\npnpm html\n# open html/index.html\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}