{"_id":"video-pipeline","_rev":"59-b2fd35a45227955f588086f5f09f284f","name":"video-pipeline","dist-tags":{"latest":"2.2.1"},"versions":{"1.0.4":{"name":"video-pipeline","version":"1.0.4","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.0.4","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"f7fb9d44927ad2afbf1056434208c8f755befc72","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.0.4.tgz","fileCount":6,"integrity":"sha512-7JO1UYrsWSHTKsNbAK+QqJwjNQIPMggzWLXQFgSxWzPgcHRkDwp+YS6KE4XBT0U/HRVc6bwN505U9Lm3KsgNCw==","signatures":[{"sig":"MEUCIQDQOxh1JvGzi/o0di5BVxapCR6UCZVPDig1N4LI/83NsQIgSht2tDaesX3X1PyG2cjB378jxdq4BzE9SsbXOPUKPKs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116248},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b0869f25da1923de2078e80c0b8c3463847e9ae4","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.0.4_1781153362371_0.030914631114881574","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"video-pipeline","version":"1.1.0","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.1.0","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"745289a397719567e90491070e6cc1f061da6adc","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.1.0.tgz","fileCount":6,"integrity":"sha512-buiPH5n+7Iz4nMBNl0WeRS75txcgu8oqCMvkBurCJeRZ+Q8LY219L9eKfZO1Vqd/rEaCoxeh/xszWOWwOODejQ==","signatures":[{"sig":"MEQCICuHPk5C6xMVnnFg5pTfzJHQ3WY0p8POHCI9U3fdpUPWAiBQPjmoplwLzmBCCFJB0ZT9H5NMTZu6XBWWcuUeGUHQ5A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134874},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"31faf659989e0b09f807204d237d74155ab6a9e0","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.1.0_1781157349423_0.47360558758169713","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"video-pipeline","version":"1.2.0","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.0","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"6f6318069b79bd516e9edcbcd56fa1ec7a707908","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.0.tgz","fileCount":6,"integrity":"sha512-fMzza+x4YSiOK2mPES4fMV3zBaKVoQ55clR+AmkG+0nCv9PkNjdI0NFRd69PDb1LQWwxX/hS6x2Py2UFf9DwyQ==","signatures":[{"sig":"MEQCID5u0rWl4hv6s6chePFf8tE1lGNqVWfj/0ahjPget31FAiAeFK3E2+Hz1DAnjWrqL97rmGqLxAYV5UERQAyD2d0ltA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135671},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ab060e7346b5b63de8d5c8361236c478fc2c6147","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.0_1781160979541_0.33967515688165273","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"video-pipeline","version":"1.2.2","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.2","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"ab33158725cabd85ee79daa442f071c4b3110b54","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.2.tgz","fileCount":6,"integrity":"sha512-gFj4DdMYsGMfJrbqM7r9iRlt8Px4Y9995JqIQzx8Pj0VoWLKVNlx5SAQSR9XLITGu85ZV7Mz43CFm2I+rq0oSQ==","signatures":[{"sig":"MEUCIBXH6oFk6ASL+PV36bURxBSUaezDss/JXy6WdDthVVhiAiEA+nevX4Raq1BAA+SQgYbIxVV3Dc3saKJONkxs9VRfyHM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136041},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"2e7682906532b5e160a52f32954fba9fe9e27743","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"https://gitee.com/siriussupreme/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.2_1781162499178_0.6732011882271658","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"video-pipeline","version":"1.2.3","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.3","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"496c756f63893d028abcf66badbeb968b34e5a7d","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.3.tgz","fileCount":6,"integrity":"sha512-pZBk/OB2bdyDEjAXIBtWG0Tz4FMO4liCoFIp1zmAD6bGJ0e125s5S8OtKvzNoAERC0H2ANpn7vivRiOXxqC/AQ==","signatures":[{"sig":"MEQCIAzQ2nBYdEPz7jSiLAIKVAfvyL/ouTcWxUpSCTce2slaAiBthmZ211p49k42BC1Y3AYmGHVo+AWXmlL18j+WceHhOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136230},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"bb59320ae1562f83a1a821ad7e6cc9d44de4e579","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.3_1781162917388_0.6026586271950851","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"video-pipeline","version":"1.2.4","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.4","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"a14cf7ff1e3d40cda7a79457e6691affc2acf41c","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.4.tgz","fileCount":6,"integrity":"sha512-5nXsANV0dl784RYR/VF1PYBRHFbivrvhRQ3GGK0afUYyQU3M4fKHYrENUXYmvBVZjDwwJGXHSXQ5V2SQ0tklCQ==","signatures":[{"sig":"MEQCIAztArReYiZJGIKxr3PxBq69Tze37tvm/aXKQulDfzVDAiAqQAkfGv7Y/HT3bYMGYrXnb6AGVGlZbDb8EFWPDZ8vhA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136496},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"39815338841251cf3d658ce5157e8fb18e78b9db","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.4_1781165042443_0.5270372934652092","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"video-pipeline","version":"1.2.5","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.5","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"fb6e0f61527971a110d56a229080007690d55bb3","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.5.tgz","fileCount":6,"integrity":"sha512-OfhX7P1Q12X/q5FEz+yiXSx7fisL1B6UKIjsX+zzcXr/tm2lTdPn7ZwwPAls0DA16oy7GXNimxpIZXilRJY7Kg==","signatures":[{"sig":"MEUCIQCQdREkriMvbqIjqp922C/YxCKWr9M9OjyI53Avw/X4VQIgYlo/fwXwpKvYra8hf2WP6CWLiwrEpTntvfvZxtMT2ko=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":137883},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"0383c52fc9b4c7ef506b7e05faed10e881762196","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.5_1781166368715_0.3846935082610481","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"video-pipeline","version":"1.2.6","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.6","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"5299ee22b4429e41f0ac908e443f186446c9cf99","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.6.tgz","fileCount":6,"integrity":"sha512-BuO+XdV+G4dnQHoxKpFGAGvtXnJZJKV21WCOz0xasoxeDiaRY4rpBEpl1mEmyj5XhhddMb5Cqqix5wY+rq/XDA==","signatures":[{"sig":"MEUCIEbY66i/4gt0D5A2bHi7/jUImGSBpi4e8wIwI9mmaZ2dAiEA4tbGGl+J03qrhN2TLRVe/mf5c1hn6uf+VB92+JhvhbM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146655},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"bd26136ce5d971c4ac6ada992fb26f881f8a3185","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.6_1781169751939_0.18033153357040033","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"name":"video-pipeline","version":"1.2.7","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.7","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"81c25cb437faea1d1d2ce3a60e89c94884918b6e","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.7.tgz","fileCount":6,"integrity":"sha512-SOUeBUaGHJMZB7NzIY6DUxim4KK+m4oH+UawQIpy7xL9vv/ursjaHjd/80oKE2eDBdSYFbeVla3omfWjXyjNsQ==","signatures":[{"sig":"MEUCIEomwmr5gyyiJ+ii96JgLtxAD/sn8sYnwDdi4nV5Hb3HAiEA9IFSKI5xEjz2oOXYQWDuTBphuEgBv8E04l1LW4aMrdQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":160712},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"9e6feec2b6a962d42ae16bd2c019df4196ead827","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.7_1781176705682_0.7093594900486806","host":"s3://npm-registry-packages-npm-production"}},"1.2.8":{"name":"video-pipeline","version":"1.2.8","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.8","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"c381355c97be7d49b4c11498210800e33e2c2fc2","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.8.tgz","fileCount":6,"integrity":"sha512-I+FZCwCAJQYAIOjWcZcalN5fEW9F/aGIooI1zLJucdRuexaR81VPB9o07dHRmUglkmTbLjFkhAWELJp+Ih84Sg==","signatures":[{"sig":"MEUCIQCCG23dKr/jzjaOOarIzEg59eo97tuHuwGol/mNGYbcjAIgDo/XRkEG1MJXk9jCZtSBQa/t4St5blnoR8XUe4VtD9I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":163798},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"babe137c4ca6d21f059417334ea07305ea3206e2","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.8_1781183670765_0.2744708488495107","host":"s3://npm-registry-packages-npm-production"}},"1.2.9":{"name":"video-pipeline","version":"1.2.9","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.9","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"15bd46b09e1c098fc10fcab3b18beddf93f1f868","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.9.tgz","fileCount":6,"integrity":"sha512-xhMygVNI3zB4TrAhfLjeq62YQNNGb5gbKsFP6cIrm0Cv5kWSNnM5SWUSmLkRPefxBpU4cvCFG/cWlv0lVh6ssQ==","signatures":[{"sig":"MEUCICfMyg6QqLhd6CZlMX787YF5z1hzgejQJUpMR4l0JP7yAiEA/ruCp8xiR0YyQMpUJB9xeE29K9SiTwtkDJ3C3OKvDM4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":164543},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"3360c6e3e27ffc974afd6210377d0101205cbf30","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.9_1781187841588_0.2734188719550521","host":"s3://npm-registry-packages-npm-production"}},"1.2.10":{"name":"video-pipeline","version":"1.2.10","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.10","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"02298867122a8c04ae0a29b94cd82be668c0ac03","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.10.tgz","fileCount":6,"integrity":"sha512-eMPnmwPJLlKt6qlDednKjrR73g2EkvZyz124oGq7ljwXQ2rmN21rtAfNxbShhMv0LpJEy2CAvz3lDxtr7FFplg==","signatures":[{"sig":"MEYCIQCHxH9nVnAwYFza/F3JaqtkPDWkxHtfAghoGZUbqcjSYAIhAJtZNTtzU7PmWfPmQwOgBQi0tzmzNEi9eikHq0oGup2x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171665},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"3c4ad0bf28eee45831c7580b0aa36cc688ef28e8","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.10_1781193654846_0.46056578041376195","host":"s3://npm-registry-packages-npm-production"}},"1.2.11":{"name":"video-pipeline","version":"1.2.11","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.11","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"cf7bbdbe82d09308631f3f9c7b519878e515eaa1","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.11.tgz","fileCount":6,"integrity":"sha512-lbZPw7B5QiNuwcSBJoMYEDsB/Fb8jVugLFugpYH0CmbcHMbls0g9tgMiWOjZgoBsjIembC+zkHr+fqkCbRSXPg==","signatures":[{"sig":"MEUCIQDw2xGStJVPdrUNLIVVBWV5fu5uAJpvszhJov1/XnKxVAIgA0mTab0uQMyw6xzccypnNgnIrwf0/juDnzPSm53DcTY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176041},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"4a2ac129a36083f17ebda5d9469d503841afaa46","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.11_1781253931952_0.23412602426404372","host":"s3://npm-registry-packages-npm-production"}},"1.2.12":{"name":"video-pipeline","version":"1.2.12","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.12","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"16c136d88233b40a50a7355baf07a62262bf7ddc","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.12.tgz","fileCount":6,"integrity":"sha512-tMSF31U2LujVEhrrDycCWCpjmgRZUA/o5YfQ29xRRg/AbqWADeH158HfR9a653V/hlY9IgxAyYH45JfR2U8FLQ==","signatures":[{"sig":"MEQCIAcEXmFuqnai1EhIsyY1fGFHh5vlRQqMj/635qxyojcjAiASsQ4QqwkRVl814YotqD67z2mrDqqtWTFui/TTcGlj6Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177401},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"6c94595aad06bdbca19be2d7916a98e8f3ff3b6a","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.12_1781255634049_0.7261975991291518","host":"s3://npm-registry-packages-npm-production"}},"1.2.13":{"name":"video-pipeline","version":"1.2.13","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.13","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"0140f2b4d88601e90eddbee0ea4b98c7fbeac735","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.13.tgz","fileCount":6,"integrity":"sha512-ePc059qfi8l+yaeU4ch9tSCocTrWRkf1jKW7kBiInwLeCQdUq8yOIiVBFeNy81pt+jSKZ4/Fm1EPBr+FzfFNGA==","signatures":[{"sig":"MEYCIQDVTjhkrnxSdy/qqqjG21BHt5QqqIjBJYTrvQ5ca+FgFAIhAJTIZmqfMPZZjrTnS0jTVzTq8xVHtc6fUpynL9NGuJdC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177477},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"16a7b23e4c72286b679b3f432ea73b9c57c15ad8","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.13_1781256232052_0.8395397157069027","host":"s3://npm-registry-packages-npm-production"}},"1.2.14":{"name":"video-pipeline","version":"1.2.14","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.14","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"d81ab1363837ca9f2e5b845d9ee781c9ada78800","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.14.tgz","fileCount":6,"integrity":"sha512-myWqEBpJ+fTGli7IsDpVJrSgIctRh7sv65a+x6MX0F0a3BhmwH99o6OMxiAw8+xziCVDcBdb8Mn82j0XpRjgOg==","signatures":[{"sig":"MEUCIQDkOBegmJwJhl4SAxNaGP/EauwW1Ar9c9t5h2IIExeFMwIgOKT/4UQcNWnBA8w8DppruIffGXEKSRHqFBCzHO6aYVU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181165},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"fba0b302278bf6140ed10d00dc5fd11b7158e994","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.14_1781263328676_0.3941545452708308","host":"s3://npm-registry-packages-npm-production"}},"1.2.15":{"name":"video-pipeline","version":"1.2.15","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.15","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"1b5ff34a02ffc0ddcbb4b41f46238d63f26d9cdd","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.15.tgz","fileCount":6,"integrity":"sha512-S6LARH8F12g5y42aUVQDa+JoaYt+QbETBqtZYT6GaxSqaUUe98zp7zNGeNK/TrcFwwJZZ1b2KM5Beij9/KmqtA==","signatures":[{"sig":"MEYCIQDAQ0VZKu40QCNzxGJbDvn7jSoUDAyisngqW9SFvvqNhgIhAImdy/EDBeKdAJd0jy+F7/PSIdoSE3KpNOOERPn3pur3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181207},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"99c0f2887f0ebc8b9c3d272adfdda18dbbac7075","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.15_1781263801226_0.5240223317361961","host":"s3://npm-registry-packages-npm-production"}},"1.2.16":{"name":"video-pipeline","version":"1.2.16","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.16","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"d5ad940466a139a89501f04d3515f69add7fac93","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.16.tgz","fileCount":7,"integrity":"sha512-m++egPcl3BhS18a+ptb5LUTSx1Wacpy8fI+w+pVTKUpAaqSdC+omJyb9FLkJqj7D/UpGpM/dMlicAZeEkOvBRg==","signatures":[{"sig":"MEQCIGvJkZaGyeLOjkRA+DhC7Qff85dv4uzoNmO4cm3tTGcVAiB8PP2lIP1vY/I4AqqOJk6IuxYu8LdXiyvIshsQIsUxZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187549},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"1ab7c95c0d46e2f20e3feed62cce3187b60a52d6","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.16_1781264285577_0.3191168356549685","host":"s3://npm-registry-packages-npm-production"}},"1.2.17":{"name":"video-pipeline","version":"1.2.17","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.17","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"749035ef56fb5e9af66e763cd9360d73fe7254f7","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.17.tgz","fileCount":7,"integrity":"sha512-hUd1ebSqV05lE2izR3ULsSfyN5eZFOw8SbvnVZlDjud4DWYGTO/HnCIvboVW9vZhZHUQVaWPpyZo8TXCfGQBhA==","signatures":[{"sig":"MEUCIDK+LcDEXI0WaTuq3wWK63m0/q3FqsSs5IetexaJuQ5QAiEAkx20PwUDFOmGzmEpdoD0+/0HJBDJy75Fb6kkJQp9iWQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194853},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"37d6a5ac3c7e92e37e79c1d83466ca88495cfc23","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.17_1781270905058_0.3673589462537379","host":"s3://npm-registry-packages-npm-production"}},"1.2.18":{"name":"video-pipeline","version":"1.2.18","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.18","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"6ef535f91cd8db2cda24f71dd0b87e26be9f6833","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.18.tgz","fileCount":7,"integrity":"sha512-cIBYWWE1H+TMG/FXQxDpHD96f2E7Hbef7Ev7+Jcu5PSGzn5IJxqat/RC7SGYILj5QQGV8DZaYB2O3p7zuxf7nA==","signatures":[{"sig":"MEYCIQCxkoE1O/doWMfc0tBokSI11A3HqvkdNr1sbfw0QMPvcgIhALgeqyoUIwODg6eei5+r2URUYV/8sInO/8HZb1Wr0ilg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195122},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"6f8feaff27a5a5bc064cb489bece8be50f2fd42c","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.18_1781271521035_0.08102861687461038","host":"s3://npm-registry-packages-npm-production"}},"1.2.19":{"name":"video-pipeline","version":"1.2.19","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.19","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"492aace2bfadff0b61720f75fe0130885f3306a0","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.19.tgz","fileCount":7,"integrity":"sha512-6dEB/25Pep927rXXq7skJR0i8yap2FSuHRHR/m5DnSzY1SD1Gdjon7kqiCGvgVfbYl/wZDMl+LBDrVsXAX05BA==","signatures":[{"sig":"MEUCIQCGgw9UbRcFktxSnkpXtyAfOc+mMki/wUJTRuDBv0WK1AIgecMVeiK/T9E8t9iXfSElcdWBRZ2xlPIu56GtUFimmMU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195314},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"31d0e918624946eb0a29f4d3686f7bf902398036","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.19_1781272314224_0.9341317238534255","host":"s3://npm-registry-packages-npm-production"}},"1.2.20":{"name":"video-pipeline","version":"1.2.20","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.20","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"1f6f5efddca723e1fd2650fd2b5fc50f98411772","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.20.tgz","fileCount":7,"integrity":"sha512-9zl8Z8Ys+UHXvRWiLk+TvMIUttXYf7EI8JlvlvarPUB0zboll3jgMlu9iVbWk6fzFOd90Mi5lRJe02nkRFF0IQ==","signatures":[{"sig":"MEUCIQCi5G2wUwprGz7KOnRlkP91PFiClTsa3ASQftsj2UCa6AIgcrzuFJm1de0FB7zTDZ5a8+BTetO8yVLm3TrXc5Z787E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199790},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"228ba84b51f6b961cd977789a555a5fd6c097900","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.20_1781275979023_0.9819723538076335","host":"s3://npm-registry-packages-npm-production"}},"1.2.21":{"name":"video-pipeline","version":"1.2.21","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.21","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"96845c34671c911cac144267986dde447f648401","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.21.tgz","fileCount":7,"integrity":"sha512-K8u1peROJKan93Eau2C8wgl8CtJW+gsbazjgoBUpxCHlgeZt6MScOPQBzd2ccDPehSY3Zv/LLO2VVbqKajzWSg==","signatures":[{"sig":"MEUCIE+xXUslrGdJ063+daOpNNWzfepGiJONDDb+xDBsBCptAiEA3sJgQ8fZIyQEfvQPPCuLcyXfWZ5FCWpdHDWwvnX7ehs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200227},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b4ba154c8b226407138be370f1e1e629b37f9778","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.21_1781278534275_0.6592222223255526","host":"s3://npm-registry-packages-npm-production"}},"1.2.22":{"name":"video-pipeline","version":"1.2.22","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.2.22","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"5e43f01fe6c03d798ea4daef66e47ed970626a5f","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.2.22.tgz","fileCount":7,"integrity":"sha512-4j+CHPGJq3BV//AMheTl/kNr8PyJEoi6eVBG0f9QceXDNYwKqXSkYxVdoWEvmWDqNdNTjb5J3h6peZj6gipNSg==","signatures":[{"sig":"MEQCIGzXeCg6QEzcODayOgiHI8Q0AvC2KA/qJyRueRBsyJC9AiBzevi2DywjrzVTB2pe1lFGrOyrpMNe/QxNoaJMFy7QCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201312},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ebb0137ab55aed8e74994b73adb2f20cadf6eef2","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.2.22_1781304448271_0.5675379069056659","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"video-pipeline","version":"1.3.0","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.3.0","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"132a2d4a04649fb76780a85ea6c7a44785dfb401","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.3.0.tgz","fileCount":7,"integrity":"sha512-bh10BrtE4/WVEmGYhFwuuQYLNNlwQSfBbbxyVExCyYwbvMEOzIHI00PT0lcUqPast8ynS3i4Yni/OVzcKzXbPg==","signatures":[{"sig":"MEUCIEBVrBM+WFobFWeEKlP6mjOPJbBrfAmGO1ugYmhf9d5DAiEAi7A1/AnW2r+w3s3Jp8xsZrF8jtm3/D0NZMV5KrdZrr4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205962},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"a2cecd4351a2ee0d9bb6d0f338d851660d9fe2bf","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.3.0_1781353315327_0.480501677404056","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"video-pipeline","version":"1.3.1","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.3.1","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"e8037f5acd7f74ad91af6440e683c0be88ea4bed","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.3.1.tgz","fileCount":7,"integrity":"sha512-hoL1L/ouIMI1RQZsC5Y4aeduOnFnKnryGlgNrivwbzCpf6IHTWLbrJ1liQqUkdZjNw0C2yLhBnpIkIg97am84Q==","signatures":[{"sig":"MEUCIFu1/54I+NT5g5eaby8/Ozx5Q445Isryfru/Ewv7kechAiEA5lNagO8DTbYywB1Z6BoSpXdrpxt8FbCw15s5FEGc1y4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208421},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"1a8e92480f3bac4e0788425d575abdbc25365df6","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.3.1_1781354371000_0.9783232230269399","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"video-pipeline","version":"1.3.2","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.3.2","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"77a7a1822fa48c0d2340ffaa14dba6a2674a4f51","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.3.2.tgz","fileCount":7,"integrity":"sha512-hpWFHRkbtIHJnnVHdGuQZaA8bYr6lBjZGLhWq76R/2/5lwGl5zdWW7jxE98TfP43Un89a2bOUVdxTW0B52fcew==","signatures":[{"sig":"MEUCICysr0rSvFhQu3OJ8iprn0gG5C0TOJfk9JNxwFohbtRhAiEAvBIEiVc1RfyCZAzgIGe6ekKA1ry2w08hKxbOKCXzluI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208791},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"08ea5cc26aba809cf28e10222c0091ea5b188f70","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.3.2_1781357596051_0.5447663350631784","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"video-pipeline","version":"1.3.3","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.3.3","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"cb5b068686303402350b1084c22f3b95cdd1d4dc","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.3.3.tgz","fileCount":7,"integrity":"sha512-diXaQ7cGRlwP+x5sCalJa3wOf4Jypg5oBbRS1/vzwo8VRKR09BBe95ZJiA7jc2jGjN5PYIihHCHGDptNNy/bzA==","signatures":[{"sig":"MEYCIQD+QQYQibxUnXPbdKZkQcAr1YF/G7P1IIx4HKXV1Hy+jgIhAJqFNT3xoCW20SDfMGQyRoFzUR6M1ztdCi5yacz+/UDz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":210032},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ead2961d3e5ade25386dffe809476cf1583e1bdc","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.3.3_1781361635202_0.6295662094775867","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"video-pipeline","version":"1.4.0","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.4.0","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"cb9d1f157bd015deadef771c3b09e1c0dbaa5c18","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.4.0.tgz","fileCount":7,"integrity":"sha512-qxymZL3MRs2n/scFQIxgXWPHXhrBDRX4UeEsqbcWjVBhso/enTXUv3gIlIsrEUoWtaL4D+3lbNzPqEQyHfS9xg==","signatures":[{"sig":"MEYCIQD16EIQiMaqrZboEEri+1CXzuxkiqWbeCBtPHbwcxvJMQIhAMKPL/oFPSuyg/ryCPLEEkhxo6PN1Ns0mpQHql6wxKHw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231185},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"5f56b12160ddadd6fa08906ee2885d56d749a7e0","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.4.0_1781574972950_0.053753657496049545","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"video-pipeline","version":"1.4.1","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.4.1","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"c62d1d8d4038b48c0cfa28c4611ebc7cca22b14b","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.4.1.tgz","fileCount":7,"integrity":"sha512-jSXZLJo+o6/d7FUZCpyl23w7rra6CEcviGAvMPe1STIQs1ubRBlOVT68KVh3ilubw1Ok3/T5/DOcB1sCCsUkcg==","signatures":[{"sig":"MEQCIH3voCT4xGn4FotyG699CDOWpk52KXIQUXZeUjBhF138AiBnGtRkUbPUDzGqhWUe3m9n6USxciYIgH9kjK0Q4qyXzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232508},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"70bf5d950ba538c05c5846247a5f3c6c1b4d622e","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.4.1_1781577661882_0.7669095485203485","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"video-pipeline","version":"1.4.2","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.4.2","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"7ed92d20fbbe58830976adf39a728fd1de52f548","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.4.2.tgz","fileCount":7,"integrity":"sha512-PhMq3EKaXmEZjx6uMOtncs/+FS1/wyvryAxG2Kpza/2rGem3WJaQ/petb8NISk8RadILxapcKKnApBoI0ezRYQ==","signatures":[{"sig":"MEYCIQDObjFOckkkWp9heVzhpNKar4Z7cgBg9lGqzPL2iloGKgIhAJesiUDdvaNH8HzCHo+jHoyxD22iwerzLppHhr+ljlM1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242006},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"70c1f50d31b9cc8c436d258627d23e124a258daf","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.4.2_1781578586774_0.1489008175494302","host":"s3://npm-registry-packages-npm-production"}},"1.4.3":{"name":"video-pipeline","version":"1.4.3","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.4.3","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"b25dd16d07746f5193560ca0ad26feeb23592c41","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.4.3.tgz","fileCount":7,"integrity":"sha512-pJ/q81o3UFRM2x6L93SO6yjIDfB70OXnQZ4HEmd3bho/lsU8KSq9Bnna8F3ns86q6zPxp4LcCTproUSm4rvvww==","signatures":[{"sig":"MEYCIQC0dgKth0Cq8Ay9zlhlqiGCt2FlrmvF003nPQh2NQq+EQIhAPqdhgq9yRzOEanMEb/VRH0z2CLLmvNQX7+nWyWJ5Pv/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242168},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"6c488b9d75a68bcda8da145c549055b2fac7d67b","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.4.3_1781578900344_0.4629093697019875","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"video-pipeline","version":"1.5.0","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.0","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"0b000625053c7fc7c571829c74ef30cba4312cdc","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.0.tgz","fileCount":7,"integrity":"sha512-3FhaLvxV+9JCvQR5ciD/RP7gFdTCIHiwel0qQ+fhG84W0g2xQlEQA1ogiOcDe1YWtDsOPXO5CLMETTxdPNn8ig==","signatures":[{"sig":"MEUCIQDhdKk1Br5qTrdSHnRxxm9HIp9DMxarNKwODP+PgPTWsQIgfECiQgUWp/uacTWhNv7BUtHsGm6A7NwMlYCvEmOxDY0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":263293},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"5e659ca72ef6df80dcdc63f0011602c193e7d6cf","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.0_1781585944000_0.7120222061158727","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"video-pipeline","version":"1.5.1","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.1","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"f59979f61167dd4676403763852036800a0c822e","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.1.tgz","fileCount":7,"integrity":"sha512-GAskxLi+b6IkwCzsaM3efgV2oiIG917a2dCknsCbfml7N5h/3G9TG56Ck8yB6czrVHYdXfrVOIQHaU5JieVI3Q==","signatures":[{"sig":"MEUCIQDExENjfrNf5udS5+7ZZnXqoEdfaSXdBBai8+vJNzzYEAIgAq4uYUFa+lIXvGK/tkl5bxjhJRGbl3FcfZBAp+QbizY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":271714},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"7f1be40a16efdbb9d1e97d545717418b222356df","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.1_1781797591520_0.901785308428158","host":"s3://npm-registry-packages-npm-production"}},"1.5.3":{"name":"video-pipeline","version":"1.5.3","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.3","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"759a4988f88871eecda2caaca827d992f5ed9b7d","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.3.tgz","fileCount":7,"integrity":"sha512-LvP+QwtPwYsPAucjc4QfVlm2UuBs4hdKLgw62MdAdQGg/U37zVobRxJrWLT2O8X0/ljd52Dg+/o6oznVgAcwgg==","signatures":[{"sig":"MEUCIHWPvTSw24GmC07uMRuixxPG0l2lw6Q0SAj1TebTKVoQAiEA6jW+8oO3tJ6XHR0Tz49531TmgQ2u0aYvEC8mmpr73GM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":274336},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"f19be51ada77677f51c4a880e44a299db8b2d9f4","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.3_1781806408980_0.7228989884580057","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"video-pipeline","version":"1.5.2","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.2","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"c340f38a7e4b56476e67acaf4b358be8c1a4e4ec","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.2.tgz","fileCount":7,"integrity":"sha512-6woFa/+yTc9hJly/3f23/qE128pzvAE6eqaWT35QjitiOcKqTRn2AQS9uQeQIyj6RkxAD8rnVFTPaSmQZNF22w==","signatures":[{"sig":"MEQCIAaWRD1AUhIiz2HKy7oGptGOfHDWF+DjmwKs+LU6zvFUAiABVhdF2rHY5yXMOnH7SayIIp6NPnVFJ1Tf2hc4URmoPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":275212},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"9d105f52bb847a9bad4fab096ee3bc659e171bea","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.2_1781806413289_0.020787273007465856","host":"s3://npm-registry-packages-npm-production"}},"1.5.4":{"name":"video-pipeline","version":"1.5.4","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.4","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"38c9820233d3926e3b287b9b6feec61b1e9c8162","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.4.tgz","fileCount":7,"integrity":"sha512-uV5DudO2HcUWok2ODX86c70C4jJRaNm5a+d01kna8Aky6pqDXo7MBZghyv2pR7rP/dASbpqCgrf7lZnHgF5XEg==","signatures":[{"sig":"MEQCIDoKVn+ESiAfKJ+EW5HG34VCZ+pgT9EAo7VdxtztXRvxAiBC/NB/myU7R9DGZ60PDBs7hEB4m6stWpEl5imOzOeCeg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":274408},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"881e52a8d99bbc8760f6e3ed7e529634e3be01fe","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.4_1781806711830_0.3578628371943686","host":"s3://npm-registry-packages-npm-production"}},"1.5.5":{"name":"video-pipeline","version":"1.5.5","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.5","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"b279cbc406972df6df5aa4282f587dc7321a62e3","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.5.tgz","fileCount":7,"integrity":"sha512-5dQhzmPNSs2pAyCjAoUCHde8VpvunBndGa9R1u29JHzfHat3GGAVacWE1hHV0K2SfjhOJoKnwAsIXkI2nUIkLg==","signatures":[{"sig":"MEUCIQDFvEAmVhISG9rPXoP3/cIiyXUqE0sjtXcK7RYd2xXK9AIgFGLk/qbEc286yG8nwsYTia3m6AJIQLov3AIm8/xilwU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":274609},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"fb6ec4e07bfaa67c03ff076555239efa813ce8b5","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.5_1781807554682_0.5524907250192235","host":"s3://npm-registry-packages-npm-production"}},"1.5.6":{"name":"video-pipeline","version":"1.5.6","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.6","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"1d40c5be486db707030f0cb6efa3f526b2c1cb16","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.6.tgz","fileCount":7,"integrity":"sha512-6MxdYK6MWiMmqJFuhsXpVEY5JDiron2lMPBAWI2zUEHR2jbFd6SAeZJO3dkBF7Yg6lv5AkhQuT+lS8f9j8MaBA==","signatures":[{"sig":"MEYCIQDN90dt1Szn33e3RqoSpyZwoaAdYFUv1RkzyloJWFpN2QIhAL8zexfr4uk2F7xbgLc7gkiBaiJZWvKzFYfIgzO5EpzK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":276447},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ac5fe3d0a6db0ec2a4f1c5eae18e0aff499e0db7","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.6_1781851098373_0.10022624547885717","host":"s3://npm-registry-packages-npm-production"}},"1.5.7":{"name":"video-pipeline","version":"1.5.7","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.7","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"7cb0dbf6222f487c57d519648b0292a3c3b83877","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.7.tgz","fileCount":7,"integrity":"sha512-/y6KFp1gXBMJLajIPq43xFfS+xOViGXLN3BmPH1ikj9JKZZKYEN9isVWi/uFFbu55jhAVnoGwbaeDIrVveH/cQ==","signatures":[{"sig":"MEUCIH5XJnAsYv/1zBEBitYt6KUVtezZ6BDrLhFiwJogQZFAAiEAl4jpWBjTojvPGBx7ifyxmYJXfbEl7N6FsE9PiReSshs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278072},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"bbce217ba24d2d175610bd794731233aabe3578c","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.7_1781852469761_0.05339032446600234","host":"s3://npm-registry-packages-npm-production"}},"1.5.8":{"name":"video-pipeline","version":"1.5.8","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.8","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"2e2a6799ef4b321a3bc14ebdf20b70780398cc2f","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.8.tgz","fileCount":7,"integrity":"sha512-V7qXb9hj+kTy3vXK5iJNiVoexv07mNS5pXTc7IKtJzxW5esf/HMq8ITTa0S5aqXsRndnpntr94Q3Ufj79ma08A==","signatures":[{"sig":"MEUCIQDfDhpJi5eI/v0A+dQt4ER9ckG4kMMo2lKCCh8b6o2y9QIgCHF8x/XyQ1LOP+3AC6W0vbOsPh//gxObDp1ttyvtCUI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278472},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"96965ba672a98737aa88f6b102a25ee7efbfd13c","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.8_1781853778538_0.5458974947524604","host":"s3://npm-registry-packages-npm-production"}},"1.5.9":{"name":"video-pipeline","version":"1.5.9","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.9","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"4077925448cad23f31a86368e2eef4e819ee0768","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.9.tgz","fileCount":7,"integrity":"sha512-9YAlHEFSfCtDaBy+UFsJI/YvjlcH4fhSYMazBtnUzax0yahGUw2SpUhExxAVwPJq/uyeZZSO4xpdJrrhetSSpw==","signatures":[{"sig":"MEUCIQC4E6EzmB2dAwGYlmdhK7KMz3Ss80GgZrJgVv8nwm8NkwIgeH3A4Rf43g2UhLwjaALHn0rBep2z72aa5i8N8P3FRzM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278721},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"a437d2420405a32db9dfdffb246c5ed95c14897e","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.9_1781854892284_0.686710551349957","host":"s3://npm-registry-packages-npm-production"}},"1.5.10":{"name":"video-pipeline","version":"1.5.10","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.10","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"e0639387a0b12a096b8f894e4f5cae990f096abc","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.10.tgz","fileCount":7,"integrity":"sha512-taieU5p4DGHhpqTxqoIr5nj0fChQSkwQwFrZjy1k5hc+40FuW2o80T2WnLWP6tXL7Z9SdbDXn9PDdNP8bDzzmQ==","signatures":[{"sig":"MEUCIE8LPHAvDAQQQRppGKMmGtNCmkupcvawOp57QHawxY93AiEA65GqTbK2Bijm2suXW0/KJA/qgMNMhDCopEjp+xXasJM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":279598},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"e1399164a8d5299fa5a221d6c977209b0d8fc846","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.10_1781918152971_0.0005922667262139303","host":"s3://npm-registry-packages-npm-production"}},"1.5.11":{"name":"video-pipeline","version":"1.5.11","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.11","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"da2cbd396bef4e4b9fc13293a032c134a9aef265","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.11.tgz","fileCount":7,"integrity":"sha512-CHxHt9k0pJ8301Cbj4VFm3cqhZ8wfLPokEzp41Tvn7nAwOF/7+p97J+dcdj0mu+5D1s7U78nXK4HdEuY9SpaGw==","signatures":[{"sig":"MEUCIAZYQxoeqwYqZlS/k8l/AktJBiLcJBJPzA5sZsZFs1qAAiEA5weEPxLxaMwIx8PG0COD5Fbm/42VXoZixlZp6co16hk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":279954},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"657a39018dd311938bfb675ca87806e3750be974","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.11_1781919443598_0.3486683542074607","host":"s3://npm-registry-packages-npm-production"}},"1.5.12":{"name":"video-pipeline","version":"1.5.12","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.12","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"e58aad80d1ba952b9cbaec1a4af3e0f5e7e38f46","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.12.tgz","fileCount":7,"integrity":"sha512-u00mAABC6B5fzvivzxDxXW9h5meqOnjRHpcNz9QQMgnBPko2J0mp6pBIwhTQGTA+Oa37rkkCJXdVRYBaLShauw==","signatures":[{"sig":"MEUCIQCpoqu4kZZLnQZ21ZJpwoG8OqHhi6lb7NLvLDs5rs0KlwIgBtfNJFCG0uYhsBy6crGt1V38SMYe6wYfZYzxQ3NGrgI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":280239},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"76f1e10deb97603b7f3850b1c7c69fdc4e404005","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.12_1781920132300_0.15848083472613284","host":"s3://npm-registry-packages-npm-production"}},"1.5.13":{"name":"video-pipeline","version":"1.5.13","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.13","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"13f9901a0fc826820ee6ffa94b5222af9819ed2f","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.13.tgz","fileCount":7,"integrity":"sha512-5gOKJ/pMpWnpmIYHExGXLSVYqvdS7CVo37LK1n1aTa6mYhw3lHmJPfP120p2Z35Ojm4m+JAJsJaGEg9tFdDb3g==","signatures":[{"sig":"MEUCICWoLq3LXqTopAo+UaWTadV0VkrNN0UdBUXpm1CoSUPLAiEAijMdJ1j3n6kQVUHJKUScV3ZVIXQhzYy+u0zDFoz09Ls=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":280779},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"735941a53a08cbdae9c2a9e2fe899ccf1cf64ec8","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.13_1781921682444_0.3610184325654968","host":"s3://npm-registry-packages-npm-production"}},"1.5.15":{"name":"video-pipeline","version":"1.5.15","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.15","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"90a6ea49534b6a9329ebb05ef61f994ffbc2fe4a","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.15.tgz","fileCount":7,"integrity":"sha512-3GsJaZ5JbieHp+mabmuZD9C4aRyVWNpMn6MUJq53RG4OFK7Ne0imqtY9LtvOJKbx+cKDql+wiwrApYQlfmmFZA==","signatures":[{"sig":"MEQCICgLigpdLQA9JzXO854qxeLwRvRwtcyVWYrpwWhzwCqFAiBqhlU0z0lcGZvAbBBHaqRTZWu5WxeNwld/b1G9WINcOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":294191},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ef62810e0663782f57cf576d82f752c7c012245b","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.13.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.16.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.15_1781931899423_0.5624988590014739","host":"s3://npm-registry-packages-npm-production"}},"1.5.16":{"name":"video-pipeline","version":"1.5.16","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.5.16","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"6cdd1c82b5afa1146eb5a1b4eb6622b30e78a6fb","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.5.16.tgz","fileCount":7,"integrity":"sha512-tSF+wv5xezoLHboZx89qo4oJWB/zsl55Ad1/iUEGsanKrf8tyBZztcs+6/MpNmliJliCqPVpfjq81+h/SginPA==","signatures":[{"sig":"MEYCIQCmcoP34SX1AIrdj/4LO6swK2qAhMxTSRHGvjgnw/wrHAIhAI3IMJ64KsXrw/TdDWoLjdu3+BQb0gvmIEOGmb/mHpnL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":294787},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"90b5964e5386c17a734381e9bf23e424cdb72fb5","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.5.16_1786699873735_0.8661693666967378","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"video-pipeline","version":"1.6.0","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.6.0","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"63ac06d945749004dbc1c2e704baded948a6f03f","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.6.0.tgz","fileCount":7,"integrity":"sha512-b/RmEzRQXJSXJUoGIrgnvAsPYSLGataQMLPBOEqkoTnKXqmxo61Tv823+ldp3x9QGYJ+133GMmO5COe07LvQ6g==","signatures":[{"sig":"MEQCIElTJ7zEQnIWMDvO4lwkj07YTyROML9XssES8sahPBFhAiBltxkCmhDxkNJcPHAbYYs25Uk07eqKbP4ae2rfvMAvOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":298216},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"7f9b5777335cd92adc20715adca7125290aed664","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.6.0_1786707176500_0.14752757805770123","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"video-pipeline","version":"1.6.1","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.6.1","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"0220a0bfc77ac02fa362c3730f8463fd07df9cc3","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.6.1.tgz","fileCount":7,"integrity":"sha512-DOZUEf0r6BuKJxq0lkj2tWLWX0gQvyYg7stOLWQXJbXvIxVkipfZhQlQD8CydIp7R+BBvqg0yx+yUCIMmUNQlA==","signatures":[{"sig":"MEUCIDDYsoiS6q5phiJxzT+Ca6OBTuuhMVvZErQylpZBtxeQAiEAn1AEIJ7hXOhcHxc7LaIymw1KxsifGOcQTXrJO/7W4xc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":314552},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"dfb22bd0a1b004553bd28c5be69608b914b9a47b","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.6.1_1786714596373_0.5451907751045098","host":"s3://npm-registry-packages-npm-production"}},"1.6.2":{"name":"video-pipeline","version":"1.6.2","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.6.2","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"7d12418a7a5732a5e8d95dd68dd552cb4f6c22ea","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.6.2.tgz","fileCount":7,"integrity":"sha512-Ec4NCRd8MxTWOl0iyS9CtydQT+aMG6zHXFk/IOPlwqbl2DFJaeAViJokRscJorjtYD9t3tku6kmIFg0guxbH/A==","signatures":[{"sig":"MEQCIGtuqDw84WWjU+O3Xykhi6Khi8CUmmGu9x6LrP1cHmkNAiBF75CbbJpBqmgGC1RVxVgzLCzNSG/xsMKnJClsvTx2/A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322773},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"8c84873eaeafd001006abe418245d44d52fe7849","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.6.2_1786758695541_0.8545451098259007","host":"s3://npm-registry-packages-npm-production"}},"1.6.3":{"name":"video-pipeline","version":"1.6.3","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@1.6.3","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"671b5e08d630ac300d22c96099ed8b8dbbbb91eb","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-1.6.3.tgz","fileCount":7,"integrity":"sha512-Ujq4yI6xALQfNHLu3x9x3hX0kCbCpMhjcsnIJyGushJnC/XwSfrRweSY/Yr9j1kc5/+zJMwTca9SZctg2PmZQA==","signatures":[{"sig":"MEUCIQCNwFEGnOT0+qIAB8gqKh8lo3dA5UJDaRrsMGipRtEGagIgNja7r9yqRcUlCJAnwcxhmouSNNuUuEJCPbGdxUHv3zU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":336082},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"e3703e6fa7eeef7c38588df6bceeda94b6897aa2","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_1.6.3_1786760131575_0.05286787131809767","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"video-pipeline","version":"2.0.0","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@2.0.0","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"3c0637edeccdfd434054b3c79e02df86a820b0a8","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-2.0.0.tgz","fileCount":7,"integrity":"sha512-1SFgtlkQyp1YtPRtRB94mi+hJkK2SSGlCwX/7+OLst7UDUpDFwzvZ4rOdRCpcaRf70LyT0WvTkJeRInwDL6mjQ==","signatures":[{"sig":"MEQCID22YkUjx6Gku6FQwnxB/pdgwsmTTvyXI34cMOQPuD5zAiBtQyZpYeU7uwTU4ikKeDuGOjFwh3M2YYYuQgCRosa9pQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":354943},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"2caa0ed612894ac0b03d7d8f38e29f39e999f9ba","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_2.0.0_1786771337085_0.06081094170580048","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"video-pipeline","version":"2.0.1","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@2.0.1","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"3b65d170705ae3006a290314de225963e83c4ed5","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-2.0.1.tgz","fileCount":7,"integrity":"sha512-zKrh9B+kz67fyBBjRmOaJKaStS+c4hej4CpuueuvdHPH8VUHW7LOrlAQrV8Yuoiokn/JsMTxpvmrW79ipL1LqA==","signatures":[{"sig":"MEUCIQCtQgm5PaxqTNc1sSPKi5n7veDve9gLWLNX50dC2uKvkgIgOmj8U9IaCflBZlLWzj/f9Bti78uAoRq2+fb/Ge7bwVk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":359633},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"15cec5329ede984947646f127a91011be9edbb6a","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_2.0.1_1786779833240_0.7736005011578824","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"video-pipeline","version":"2.0.2","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@2.0.2","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"3112e9c86d705866b1ec14d43cc4eb29435c8a59","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-2.0.2.tgz","fileCount":10,"integrity":"sha512-Ad25EmulAf5XWD4/B7ZS1atT61OZZSvsaUHWdrWneYzPnrpE3YoW2mCfYvt9GJuEiIAAuoAIMQwSPULrCbiv5g==","signatures":[{"sig":"MEQCIA0cO1Nj7taGLwRodZt8ztb0raLLAN0oBPA9jMrMOHrZAiBvROGmDC/TsPH9+RiAL+5tsGTuJDOXPE9SFZUHHZmBvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":580854},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ee139fa98b068a7bd6c7a97855cc8e482762000b","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_2.0.2_1786785802583_0.5998624866219169","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"video-pipeline","version":"2.0.3","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@2.0.3","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"5a8120b4cf33a4adaba2e534bcd19d43b15566b3","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-2.0.3.tgz","fileCount":10,"integrity":"sha512-g5u/u9+JtnQ9TcWvgWOF3bD9PtlMdM7wBf73VM2G9b5G1KqG3MuPMaFcVtQwTC8nAFalNHPbn5eiWsc9gvaB5g==","signatures":[{"sig":"MEQCIGCivdxWAhos34ozTsY7/CzqsEx6+QcCPjZhe0NrUT7xAiALAe83zHVUmWGxcnLBx34itKqm/TOzRrhzwjZqX17BAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":589427},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"bca37deceedc1c68a8457ee45f0bbd3677c1305a","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_2.0.3_1786790387608_0.2733612221805295","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"video-pipeline","version":"2.1.0","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@2.1.0","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"1680682f728f8bd0e242a8ec23696d1347f5479a","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-2.1.0.tgz","fileCount":10,"integrity":"sha512-z2O0TUDX1NSfFC+x5Q6Zf/qEArXHbO5hysRpMXqEv3cWJcS+POfJlmnZ+MbJT4WZbrv94B5aBAQa6FY9yyKUQw==","signatures":[{"sig":"MEYCIQDfYjEmI/CuhHD+QhqK29GLDowJGvwzbJC40ykMvHaEtQIhAK9Y2EYyJYLwlzc+cYcqmgXVOuN5t43K8HbGRaVKv+N7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":595713},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"f1fcee6f9431ccd0d659c2fbb7c7af6e1b9f9f22","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_2.1.0_1786932042472_0.4644114960320844","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"video-pipeline","version":"2.2.0","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"author":"","license":"MIT","_id":"video-pipeline@2.2.0","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"bin":{"video-pipeline":"process_videos.js"},"dist":{"shasum":"0b993df3c7b1c521a2a959d9ee4363afd4231f6e","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-2.2.0.tgz","fileCount":10,"integrity":"sha512-Q6wuPQ2xgAipmtrQW1/8bXYzm20fJyWQBsJqlfXz7kMT6d+MV54UPt9xsH2CHJb0pYuzYoGVt0SefZAaBX+bKw==","signatures":[{"sig":"MEYCIQC5CQrnDNnkrXMYCZH3js/YyMqW8eqZBpCS+Av3MEA6BAIhAN7lTB4JsLjVBP+4Qc3Y80dllRxvfvjo6lQMZ1d+s1uv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":601932},"main":"process_videos.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d2cc5aee5210abb1403c66110a35143e21685890","scripts":{"test":"node -c process_videos.js","start":"node process_videos.js","prepare":"husky","release":"node scripts/release.js","lint:commit":"commitlint --edit","release:dry":"node scripts/release.js --dry-run"},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"repository":{"url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git","type":"git"},"_npmVersion":"11.17.0","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","directories":{},"_nodeVersion":"24.19.0","dependencies":{"xlsx":"^0.18.5","dotenv":"^17.4.2","p-limit":"^7.3.0","commander":"^15.0.0","@inquirer/prompts":"^8.5.2"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","release-it":"^20.2.0","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1"},"_npmOperationalInternal":{"tmp":"tmp/video-pipeline_2.2.0_1786950200940_0.04599311599401368","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"video-pipeline","version":"2.2.1","description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","repository":{"type":"git","url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git"},"bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"license":"MIT","author":"","type":"module","main":"process_videos.js","bin":{"video-pipeline":"process_videos.js"},"engines":{"node":">=18.0.0"},"scripts":{"start":"node process_videos.js","test":"node -c process_videos.js","lint:commit":"commitlint --edit","release":"node scripts/release.js","release:dry":"node scripts/release.js --dry-run","prepare":"husky"},"dependencies":{"@inquirer/prompts":"^8.5.2","commander":"^15.0.0","dotenv":"^17.4.2","p-limit":"^7.3.0","xlsx":"^0.18.5"},"devDependencies":{"@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@release-it/conventional-changelog":"^11.0.1","husky":"^9.1.7","release-it":"^20.2.0"},"gitHead":"a6b07ba300b72755b3ee92a64dde7059dfa76c09","_id":"video-pipeline@2.2.1","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-HRHlYtXZZY2Hk34BGlUfQPPyxH52ACzG8DZGtdA6mN6Y7nuxGBQ/d+OM/Yv1Os+SiBZkYF88u12wyQqnEisO3A==","shasum":"add76dbe6f763c5589655ccc14d91d96d61de536","tarball":"https://registry.npmjs.org/video-pipeline/-/video-pipeline-2.2.1.tgz","fileCount":10,"unpackedSize":613008,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC/oBZAbKeNGzAssonhYenkEVe+SmUMeVmuxPmSenU98QIhAJ/F7ycvjbkUdugqOdPOh95P39dzHJWO+X762iUXasf5"}]},"_npmUser":{"name":"siriussupreme","email":"guoplc@163.com"},"directories":{},"maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/video-pipeline_2.2.1_1787101961179_0.3026830422982505"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-11T04:49:22.137Z","modified":"2026-08-19T01:12:41.457Z","1.0.4":"2026-06-11T04:49:22.514Z","1.1.0":"2026-06-11T05:55:49.565Z","1.2.0":"2026-06-11T06:56:19.692Z","1.2.2":"2026-06-11T07:21:39.388Z","1.2.3":"2026-06-11T07:28:37.521Z","1.2.4":"2026-06-11T08:04:02.588Z","1.2.5":"2026-06-11T08:26:08.842Z","1.2.6":"2026-06-11T09:22:32.084Z","1.2.7":"2026-06-11T11:18:25.829Z","1.2.8":"2026-06-11T13:14:30.912Z","1.2.9":"2026-06-11T14:24:01.738Z","1.2.10":"2026-06-11T16:00:55.052Z","1.2.11":"2026-06-12T08:45:32.134Z","1.2.12":"2026-06-12T09:13:54.199Z","1.2.13":"2026-06-12T09:23:52.194Z","1.2.14":"2026-06-12T11:22:08.839Z","1.2.15":"2026-06-12T11:30:01.381Z","1.2.16":"2026-06-12T11:38:05.729Z","1.2.17":"2026-06-12T13:28:25.222Z","1.2.18":"2026-06-12T13:38:41.185Z","1.2.19":"2026-06-12T13:51:54.348Z","1.2.20":"2026-06-12T14:52:59.206Z","1.2.21":"2026-06-12T15:35:34.432Z","1.2.22":"2026-06-12T22:47:28.409Z","1.3.0":"2026-06-13T12:21:55.461Z","1.3.1":"2026-06-13T12:39:31.150Z","1.3.2":"2026-06-13T13:33:16.185Z","1.3.3":"2026-06-13T14:40:35.345Z","1.4.0":"2026-06-16T01:56:13.087Z","1.4.1":"2026-06-16T02:41:02.112Z","1.4.2":"2026-06-16T02:56:26.906Z","1.4.3":"2026-06-16T03:01:40.593Z","1.5.0":"2026-06-16T04:59:04.177Z","1.5.1":"2026-06-18T15:46:31.671Z","1.5.3":"2026-06-18T18:13:29.202Z","1.5.2":"2026-06-18T18:13:33.429Z","1.5.4":"2026-06-18T18:18:32.004Z","1.5.5":"2026-06-18T18:32:34.899Z","1.5.6":"2026-06-19T06:38:18.531Z","1.5.7":"2026-06-19T07:01:09.907Z","1.5.8":"2026-06-19T07:22:58.720Z","1.5.9":"2026-06-19T07:41:32.424Z","1.5.10":"2026-06-20T01:15:53.127Z","1.5.11":"2026-06-20T01:37:23.725Z","1.5.12":"2026-06-20T01:48:52.436Z","1.5.13":"2026-06-20T02:14:42.592Z","1.5.15":"2026-06-20T05:04:59.558Z","1.5.16":"2026-08-14T09:31:13.897Z","1.6.0":"2026-08-14T11:32:56.651Z","1.6.1":"2026-08-14T13:36:36.524Z","1.6.2":"2026-08-15T01:51:35.689Z","1.6.3":"2026-08-15T02:15:31.727Z","2.0.0":"2026-08-15T05:22:17.221Z","2.0.1":"2026-08-15T07:43:53.415Z","2.0.2":"2026-08-15T09:23:22.763Z","2.0.3":"2026-08-15T10:39:47.762Z","2.1.0":"2026-08-17T02:00:42.620Z","2.2.0":"2026-08-17T07:03:21.097Z","2.2.1":"2026-08-19T01:12:41.319Z"},"bugs":{"url":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai/issues"},"license":"MIT","homepage":"https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai","keywords":["video","download","transcode","whisper","transcribe","ai","keywords","yt-dlp","ffmpeg","bilibili","youtube","tencent","youku"],"repository":{"type":"git","url":"git+https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git"},"description":"视频下载、转码、文本识别、AI 关键词分析一体化流程 CLI 工具","maintainers":[{"name":"siriussupreme","email":"guoplc@163.com"}],"readme":"# 视频处理流水线 (Video Pipeline)\n\n基于 `process_videos.js` (Node.js) 或 `process_videos.py` (Python)，一键完成：yt-dlp 下载 → ffmpeg 转码 → whisper 识别 → **OCR 抽帧识别**（画面字幕兜底）→ AI 关键词归纳 → 写回 Excel。\n\n**五种使用方式，覆盖不同场景：**\n\n| 模式 | 输入 | 跳过步骤 | 适用场景 |\n|------|------|---------|----------|\n| **Excel 批量** | Excel 行（多视频） | — | 批量处理全流程 |\n| **--url 直链** | 单个视频 URL | — | 临时下载单个视频 |\n| **--input 本地** | 本地视频/音频文件 | 下载 | 处理已有文件 |\n| **--content 纯文本** | 文件路径或内联文本 | 下载+转码+识别 | 已有文本直接分析 |\n| **--content-column** | Excel 列的已有文本 | 下载+转码+识别 | 批量分析 Excel 中的文本 |\n\n---\n\n# 一、项目介绍\n\n## 1.1 它能做什么\n\n把「视频网站链接 / 本地视频 / 已有文本」自动变成「可检索的结构化关键词」，中间链路全部自动：\n\n```\n下载(yt-dlp) → 转码(ffmpeg 16k mono wav) → 语音识别(Whisper/FunASR)\n                                                  ↓ 无音轨 / ASR 过短时兜底\n                                              画面文字识别(PaddleOCR 抽帧)\n                                                  ↓\n                                          择优合并 bestText\n                                                  ↓\n                                      AI 关键词归纳(OpenAI 兼容 API)\n                                                  ↓\n                                          写回 Excel 关键词列\n```\n\n- **语音识别**：支持 `local`(openai-whisper) / `faster-whisper`(CTranslate2, 速度 4×) / `service`(whisper.cpp server) / `funasr`(阿里, 中文 WER ~5%) 四种后端。\n- **画面文字兜底**：当视频**没有音轨**（录屏、图文轮播）或**音轨是水印循环 / 背景音乐、ASR 识别为空或极少**时，自动用 PaddleOCR 对关键帧做文字识别补回 transcript。\n- **AI 关键词归纳**：两步法（先语义修正 Whisper 同音/形近/术语错误，再提取关键词），结果写回 Excel。\n\n## 1.2 双端一致\n\n同一套 `.env` 配置、同一套命令行参数，Node.js 与 Python 双端行为、默认值、识别效果完全一致：\n\n- **Node.js 版**（推荐，npm 包 `video-pipeline`）：调用 `whisper-ctranslate2` CLI、`funasr` CLI、`python scripts/ocr_frames.py`。\n- **Python 版**：调用 `faster_whisper` / `funasr` Python API + `scripts/ocr_frames.py`。\n\n---\n\n# 二、安装与配置（逐步流程）\n\n> 首次使用请按以下步骤顺序完成，**后续换电脑只需重复第一步和第六步**。\n> 安装完成后，所有路径、字段映射、平台参数均通过 `.env` 文件配置，同一套脚本可直接套用其他 Excel。\n\n## 2.1 第一步：获取代码\n\n**Node.js 版本（推荐）**：\n```bash\nnpm install -g video-pipeline\nvideo-pipeline --help\n```\n\n**Python 版本**：\n```bash\ngit clone https://github.com/GuoSirius/yt-dlp_ffmpeg_whisper_memo-ai.git\ncd yt-dlp_ffmpeg_whisper_memo-ai\npip install -r requirements.txt\n```\n\n## 2.2 第二步：安装环境依赖（必装）\n\n| 工具 | 版本要求 | 安装方式 | 用途 |\n|------|-----------|----------|------|\n| Python | 3.9+ | [python.org](https://www.python.org/) | 脚本运行 |\n| yt-dlp | 最新 | `pip install yt-dlp` 或 [GitHub Release](https://github.com/yt-dlp/yt-dlp/releases) | 视频下载 |\n| ffmpeg + ffprobe | 4.0+ | [ffmpeg.org](https://ffmpeg.org/download.html) 或 `winget install ffmpeg` | 音频转码 + 时长检测 |\n\n> **验证安装**：在终端执行 `yt-dlp --version`、`ffmpeg -version`、`ffprobe -version`，确保均在 PATH 中。\n\n## 2.3 第三步：安装 Node.js（YouTube n-sig 挑战）\n\nYouTube 要求 JS 运行时解开 n-sig 挑战，否则无法提取视频格式。\n\n| 方式 | 安装命令 |\n|------|----------|\n| Node.js（推荐） | [nodejs.org](https://nodejs.org/) 下载 LTS 版，安装后 `node --version` 验证 |\n| Deno | `winget install DenoSirius.Deno` 或 [deno.com](https://deno.com/) |\n\n> 脚本默认使用 `--js-runtime node`，如果你装的是 deno，修改 `.env` 中 `YOUTUBE_JS_RUNTIMES=deno`。\n\n## 2.4 第四步：安装 Python 依赖\n\n```bash\npip install -r requirements.txt\n```\n\n**手动安装**（如果不使用 `requirements.txt`）：\n```bash\npip install pandas openpyxl requests python-dotenv colorama questionary\n```\n\n> `questionary` 为可选依赖（交互式确认时使用），建议一并安装。\n\n## 2.5 第五步：安装识别后端（至少选一个）\n\n语音识别与画面文字识别都在此步安装。OCR 引擎（PaddleOCR）与 ASR 后端紧邻说明，方便对照安装。\n\n### ① openai-whisper（local 后端）\n```bash\npip install openai-whisper\n```\n- 支持 CPU / CUDA\n- 模型自动下载到 `~/.cache/whisper`（Linux/Mac）或 `%USERPROFILE%\\.cache\\whisper`（Windows）\n- **更改缓存目录**：设置环境变量 `XDG_CACHE_HOME` 指向其他磁盘\n  ```bash\n  # Windows（临时）\n  set XDG_CACHE_HOME=D:\\models\\whisper\n  # Windows（永久）：控制面板 → 系统 → 高级系统设置 → 环境变量 → 新建系统变量\n  #   变量名：XDG_CACHE_HOME，变量值：D:\\models\\whisper\n  # Linux/Mac\n  export XDG_CACHE_HOME=/d/models/whisper\n  ```\n- 配置：`WHISPER_BACKEND=local`\n\n### ② faster-whisper（推荐，速度约 4×）\n```bash\npip install faster-whisper\n```\n- **CPU 模式**：`WHISPER_COMPUTE_TYPE=int8`（推荐）\n- **GPU 模式**：`WHISPER_COMPUTE_TYPE=float16` + `WHISPER_DEVICE=cuda`\n- **国内网络**（必备）：设置 `HF_ENDPOINT=https://hf-mirror.com`（清华镜像加速模型下载）\n- 模型自动下载到 `~/.cache/huggingface/hub`（Linux/Mac）或 `%USERPROFILE%\\.cache\\huggingface\\hub`（Windows）\n- **更改缓存目录**：设置环境变量 `HF_HOME` 或 `HF_HUB_CACHE` 指向其他磁盘\n  ```bash\n  # Windows（临时）\n  set HF_HOME=D:\\models\\huggingface\n  # Windows（永久）：控制面板 → 系统 → 高级系统设置 → 环境变量 → 新建系统变量\n  #   变量名：HF_HOME，变量值：D:\\models\\huggingface\n  # Linux/Mac\n  export HF_HOME=/d/models/huggingface\n  ```\n- 配置：`WHISPER_BACKEND=faster-whisper`\n\n### ③ FunASR（中文推荐，中文 WER ~5%）\n```bash\npip install funasr modelscope\n```\n\n**子模式选择**（`FUNASR_MODE`）：\n\n| 子模式 | 适用场景 | 启动方式 |\n|--------|----------|----------|\n| `cli`（默认） | 本地 CPU/GPU 推理 | 安装后直接运行 |\n| `service` | 远程 GPU 并发（多任务） | 需先启动 server |\n\n**CPU 模式**（默认）：\n```bash\n# 无需额外操作，FUNASR_DEVICE=cpu（默认）\n```\n\n**GPU 模式**（强烈推荐，中文 large 模型速度差距 10×+）：\n```bash\nFUNASR_MODE=cli\nFUNASR_DEVICE=cuda\n```\n\n**service 模式**（远程 GPU 并发）：\n```bash\n# 先启动 funasr-server（GPU 推荐）\npip install funasr vllm fastapi uvicorn python-multipart\nfunasr-server --device cuda --port 8899\n\n# 然后配置 .env\n# WHISPER_BACKEND=funasr\n# FUNASR_MODE=service\n# FUNASR_SERVICE=http://127.0.0.1:8899\n```\n\n- 模型自动下载到 `~/.cache/modelscope`（Linux/Mac）或 `%USERPROFILE%\\.cache\\modelscope`（Windows）\n- **更改缓存目录**：设置环境变量 `MODELSCOPE_CACHE` 指向其他磁盘\n  ```bash\n  # Windows（临时）\n  set MODELSCOPE_CACHE=D:\\models\\modelscope\n  # Windows（永久）：控制面板 → 系统 → 高级系统设置 → 环境变量 → 新建系统变量\n  #   变量名：MODELSCOPE_CACHE，变量值：D:\\models\\modelscope\n  # Linux/Mac\n  export MODELSCOPE_CACHE=/d/models/modelscope\n  ```\n- 配置：`WHISPER_BACKEND=funasr`\n\n### ④ PaddleOCR（OCR 抽帧识别，画面字幕兜底）\n\n当视频**没有音轨**（如纯 PPT 录屏、产品图轮播），或**音轨是水印循环 / 背景音乐、ASR 识别为空或极少**时，语音识别派不上用场。此类视频若画面中烧录了字幕 / 标题 / 关键词文字，可用 **PaddleOCR（百度，Apache 2.0 开源）** 对关键帧做文字识别，把画面文字补回 transcript。\n\n- 完全免费、全离线、无 API 调用费、无境外依赖（国内无 GFW 问题）\n- 默认语言 `en`（英文数字识别强），中文视频可在 `.env` 设 `OCR_LANG=ch`\n- 识别逻辑只在 `scripts/ocr_frames.py`（Python + PaddleOCR），JS / Python 双端统一 `subprocess` 调它——比 faster-whisper 的「JS 调 CLI / Py 调 API」更一致\n\n**安装**：\n```bash\n# CPU 版 paddlepaddle（推荐，无需 GPU）\npip install paddlepaddle paddleocr\n\n# 如需 GPU（CUDA 11.8 示例）\npip install paddlepaddle-gpu==2.6.1.post118 paddleocr\n```\n\n首次运行 `scripts/ocr_frames.py` 时，PaddleOCR 会自动下载检测(det) + 识别(rec) + 方向分类(cls) 三个模型并缓存。\n\n**模型默认位置 & 如何改位置避开 C 盘**\n\n- Windows 默认缓存目录：`C:\\Users\\{你的用户名}\\.paddlex`（paddleocr 3.x 的 PaddleX 缓存目录；2.x 为 `.paddleocr`）。首次运行自动下载检测 / 识别 / 方向分类三类模型\n- 该目录可能占用 **数百 MB ~ 1GB+**，C 盘空间紧张时可改到其他盘：\n\n```bash\n# 方法一：环境变量（推荐，双端自动读取）\nPADDLE_OCR_BASE_DIR=D:\\AI_Models\\PaddleOCR\n\n# 方法二：CLI 参数（效果同 PADDLE_OCR_BASE_DIR）\npython scripts/ocr_frames.py --model-dir D:\\AI_Models\\PaddleOCR ...\n```\n\n> 设了 `PADDLE_OCR_BASE_DIR` 后，`scripts/ocr_frames.py` 会在 import 前把它设为 `PADDLE_PDX_CACHE_HOME`（3.x）/ `PADDLEOCR_HOME`（2.x），模型下载与加载都落到该目录，C 盘零占用。\n\n## 2.6 第六步：配置环境变量\n\n```bash\n# 首次使用：复制模板\ncp .env.example .env\n\n# 编辑 .env 适配你的 Excel 结构\n# 详见 .env.example 中的注释\n```\n\n> **换电脑使用**：只需把 `.env` 一起拷贝，或在新电脑上重新 `cp .env.example .env` 并编辑。\n\n---\n\n# 三、核心配置详解（.env）\n\n从 v2 开始，所有路径、字段映射、平台参数均通过 `.env` 文件配置。这意味着同一套脚本可以直接用于其他 Excel 文件，只需修改 `.env` 中的值即可。\n\n```bash\n# 首次使用：复制模板\ncp .env.example .env\n\n# 编辑 .env 适配你的 Excel 结构\n# 详见 .env.example 中的注释\n```\n\n## 3.1 核心配置项一览\n\n| 分类 | 变量 | 说明 |\n|------|------|------|\n| 输入 | `EXCEL_FILE` | Excel 文件路径 |\n| 列映射 | `COL_ID` / `COL_TITLE` / `COL_CONTENT` / `COL_KEYWORDS` | 唯一标识列 / 标题列 / 识别文本输出列 / AI 关键词输出列 |\n| 列映射 | `COL_TENCENTVID` / `COL_BILIBILIBVID` / `COL_YOUTUBEID` / `COL_YOUKUID` | 各平台视频 ID 所在列（默认 `extra.tencentVid` / `extra.bilibiliBvid` / `extra.youtubeId` / `extra.youkuId`），至少配置一个 |\n| 列映射 | `COL_VIDEOLINK` | 视频链接列（默认 `extra.videoLink`）。单元格内为**完整视频链接**（标准观看页 / 短链 / 内嵌 `iframe` 等均可），下载时**优先**解析它，自动识别平台并提取 ID，免去手动区分平台、提取 id 的麻烦。链接为空或无法识别平台时，自动回退到上面的四个显式 ID 列。无法识别平台的链接会在控制台告警并写入 `output/logs/unknown-platform-links.log`，作为后续新增平台下载功能的依据 |\n| Sheet | `VIDEO_SHEETS` | 逗号分隔需要处理的 sheet（留空则全部） |\n| 平台 | `PLATFORM_PRIORITY` | 平台重试优先级 |\n| 平台 | `{平台}_URL_TPL` | URL 模板（如 `YOUTUBE_URL_TPL=https://youtu.be/{youtube}`） |\n| 平台 | `{平台}_COOKIES_FROM_BROWSER` | 从浏览器直读 cookie（推荐 Firefox，替代手动导出文件） |\n| 平台 | `{平台}_COOKIE_FILE` | cookie 文件路径（备用方案，需定期更新） |\n| 平台 | `{平台}_PROXY` | 代理地址（如 `http://127.0.0.1:7890`，Clash）。⚠️ 必须是代理客户端**实际监听**的混合/HTTP 端口，换客户端后务必核对（各客户端默认端口见「工具预检 · 代理预检」） |\n| 平台 | `PROXY_PROBE_TIMEOUT` | 代理预检 TCP 探测超时（毫秒，默认 `2000`），`0` = 关闭。详见「工具预检 · 代理预检」 |\n| 平台 | `{平台}_FORMAT` / `{平台}_USER_AGENT` | 下载格式 / UA |\n| 平台 | `{平台}_JS_RUNTIMES` / `{平台}_REMOTE_COMPONENTS` | JS 运行时 / 远程组件（YouTube n-sig 求解） |\n| 平台 | `{平台}_EXTRA_ARGS` | 透传任意 yt-dlp 参数（shell 字符串，支持双引号/单引号包裹，如 `--extractor-args \"youtube:player_client=android_vr,web_safari,tv,ios,web\"`）；留空则不注入。用于缓解 YouTube 限速断流（见下方「故障排查」） |\n| 平台 | `{平台}_REFERER` | 防盗链 Referer 请求头（如 `BILIBILI_REFERER=https://www.bilibili.com`，B 站下载必备，否则易 403）。仅 B 站生效，留空则不加 |\n| 平台 | `{平台}_CONCURRENT_FRAGMENTS` | 分片并发数（如 `BILIBILI_CONCURRENT_FRAGMENTS=16`），控制 ytdlp 并行拉取的片段数，留空用 ytdlp 默认 |\n| 识别 | `WHISPER_BACKEND` | `local`（本地 openai-whisper）/ `faster-whisper`（CTranslate2 加速，推荐）/ `service`（whisper.cpp server）/ `funasr`（阿里 FunASR，中文 WER ~5%，中文场景强烈推荐） |\n| 识别 | `WHISPER_*` / `FUNASR_*` 系列 | 详见下方「Whisper 语音识别」章节——分共享(4) / 本地(11) / faster-whisper(4) / 服务(2) / **funasr 共享(9) + funasr CLI(4) + funasr service(2) = 15** 七组，共 36 个变量。（其中进阶调参项代码不单独读取，须经对应的 `WHISPER_EXTRA_ARGS` / `FUNASR_EXTRA_ARGS` 传入） |\n| 工具 | `YTDLP` / `FFMPEG` / `FFPROBE` | 外部工具路径 |\n| 转码 | `TRANSCODE_EXT` | 转码输出音频扩展名（默认 `.wav`），决定 `transcoded/{sheet}/{stem}{ext}` 产物名 |\n| 转码 | `TRANSCODE_ARGS` | 完整 ffmpeg 转码参数链（默认含 `loudnorm` 响度归一化 + soxr 重采样至 16kHz 单声道 pcm_s16le）。不需要响度归一化可参考 `.env.example` 中的备选方案 |\n| 输出 | `OUTPUT_DIR` | 输出根目录（默认 `output`），7 个子目录（`downloads/` `transcoded/` `transcripts/` `keywords/` `reports/` `progress/` `logs/`）由代码自动创建，目录名硬编码。优先级：**CLI `--output <dir>` > env `OUTPUT_DIR` > 默认 `output`** |\n| 输出 | `COOKIES_DIR` | Cookie 文件目录（独立于 `OUTPUT_DIR`，不归并到其下） |\n| 校验 | `MIN_TRANSCRIPT_CHARS` / `MIN_KEYWORDS_CHARS` | 断点续跑时的最小长度阈值（字符数）。识别文本/关键词文件低于此值视为残缺产物，会被清理并重做。默认 `50` / `5` |\n| 写回 | `EXCEL_FLUSH_INTERVAL` | Excel 实时写回的落盘间隔，**单位秒，双端写法一致**（JS 内部自动 ×1000 转毫秒）。默认 `3`，建议 `3~5`，不建议 >5。详见下方「断点续跑 · Excel 实时写回」 |\n| 写回 | `EXCEL_LOCK_MAX_WAIT` | Excel 被占用时的等待上限，**单位秒**。默认 `300`，`0`=无限。中途用 Excel 打开查看导致文件锁定时，控制台只告警一次、任务继续跑；关闭后自动恢复。任务跑完仍被占用则阻塞等待至写成功再退出；超时仍占用则另存 `<Excel名>.pending.xlsx` 兜底 |\n| AI 分析 | `AI_ENABLED` | `true` 启用 / `false` 跳过（默认 true） |\n| AI 分析 | `AI_API_KEY` / `AI_BASE_URL` / `AI_MODEL` | OpenAI 兼容 API 配置 |\n| AI 分析 | `AI_PROMPT_TPL` | 提示词模板，必须包含 `{content}` 占位符。支持文件路径（try-file-first），CLI 覆盖：`--ai-prompt <text|path>`（CLI > .env > 内置默认） |\n| AI 分析 | `AI_TEMPERATURE` | AI 推理温度 (0.0~2.0) |\n| AI 分析 | `AI_DEBUG` | `true` 时打印实际发送的 prompt 前 500 字符 + AI 返回内容前 500 字符，用于排查关键词质量问题（默认 `false`） |\n| OCR | `OCR_MODE` | `auto`（默认，按需触发）/ `always`（全量跑 OCR）/ `off`（关闭）。auto 下仅「无音轨」或「ASR 字符数/时长分钟 < `OCR_TRIGGER_CPM`」才跑 |\n| OCR | `OCR_BACKEND` / `OCR_LANG` | 引擎（仅 `paddleocr`）/ 语言 `en`/`ch` |\n| OCR | `OCR_SCENE_THRESH` / `OCR_MAX_FRAMES` | 场景切换抽帧阈值（默认 `0.3`）/ 抽帧保护上限（默认 `2000`，超则放宽阈值重抽，不丢字幕帧） |\n| OCR | `OCR_CONF_THRESH` / `OCR_TRIGGER_CPM` / `OCR_MIN_CHARS` | 文本块置信度下限（默认 `0.6`）/ auto 触发 CPM 阈值（默认 `2`）/ ocr 产物最短长度（默认 `30`） |\n| OCR | `PYTHON_BIN` / `PADDLE_OCR_BASE_DIR` | 调用 `scripts/ocr_frames.py` 的解释器（默认 `python`）/ PaddleOCR 模型目录（默认 `C:\\Users\\{user}\\.paddlex`，改此处避 C 盘） |\n\n## 3.2 配置项变更权限\n\n`.env.example` 中每个配置项都带有变更权限标记，含义如下：\n\n| 标记 | 含义 | 涵盖的配置项 | 示例 |\n|------|------|-------------|------|\n| **【自由】** | 值可随意改为任意合法内容 | 路径、开关、数字、字符串、URL、UA、格式参数等 | `EXCEL_FILE`, `YOUTUBE_PROXY`, `WHISPER_MODEL` |\n| **【调序】** | 只能从固定集合中增减/排序，不能用集合外的值 | `PLATFORM_PRIORITY` | 只能包含 `bilibili` / `youtube` / `tencent` / `youku` |\n| **【关联】** | 值需与脚本内约定的 Key 名一致 | URL 模板中的 `{占位符}` | `YOUTUBE_URL_TPL` 里的占位符必须写成 `{youtube}`——即与 `PLATFORM_PRIORITY` 中的平台 key 同名，而非列名 |\n| **【固定】** | 除非 Excel 列名或脚本内部逻辑改变，否则不应修改 | 列名映射 | `COL_ID=extra.id`、`COL_TITLE=title` 等 |\n\n> **最容易混淆的是【调序】**：`PLATFORM_PRIORITY` 可以调整顺序、增减条目，但只能用脚本已定义的 4 个 key，新增 `tiktok`、`douyin` 等无效 key 会导致脚本无法识别。\n\n## 3.3 Whisper 语音识别\n\n> ASR 后端的安装方法详见上方「2.5 第五步」。下方仅列出各后端的配置参数与行为差异。\n\n支持**四种后端**，通过 `WHISPER_BACKEND` 切换。所有 Whisper / FunASR 相关环境变量分多组管理：\n\n**🔷 共享变量（四种后端均生效）**\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `WHISPER_BACKEND` | `local` | 后端选择：`local` / `faster-whisper` / `service` / **`funasr`**（中文专用, WER ~5%） |\n| `WHISPER_TEMPERATURE` | `0.0` | 采样温度（0.0=贪婪解码，推荐中文识别） |\n| `WHISPER_TEMPERATURE_INC` | `0.2` | 温度递减步长（fallback 时温度递增步长） |\n| `WHISPER_OUTPUT_FORMAT` | `json` | 输出格式：`json` / `txt` / `srt` / `vtt` / `tsv` |\n\n**🔶 服务模式独有**（`WHISPER_BACKEND=service`）\n\n需要本地或远程运行 whisper.cpp server，监听 `http://127.0.0.1:9588`。\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `WHISPER_SERVICE` | `http://127.0.0.1:9588` | whisper.cpp server 地址 |\n| `WHISPER_SERVICE_MODEL` | （模型文件路径） | 模型文件路径，如 `models/ggml-base.bin`；留空=使用当前已加载模型 |\n\nAPI 端点：\n- `POST /inference` ← 上传 wav 文件，返回识别文本（参数: file / temperature / temperature_inc / response_format）\n- `POST /load` ← 切换模型（参数: model=模型文件路径），脚本首次识别时自动调用，同一模型只加载一次（缓存）\n\n> 注意：四种模式不能混用。`WHISPER_MODEL` / `WHISPER_LANGUAGE` 等本地变量在服务模式或 faster-whisper 模式下不生效；`WHISPER_COMPUTE_TYPE` / `WHISPER_VAD_FILTER` 等 faster-whisper 专有变量在其他模式下不生效；`FUNASR_*` 仅在 funasr 模式下生效；反之亦然。\n\n**🔸 本地模式独有**（`WHISPER_BACKEND=local`）\n\n需安装 `openai-whisper`：`pip install openai-whisper`，脚本直接调用 `whisper` CLI。\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `WHISPER_TASK` | `transcribe` | 任务类型: transcribe / translate |\n| `WHISPER_MODEL` | `large-v3` | 模型大小：tiny / base / small / medium / large-v3 / turbo |\n| `WHISPER_LANGUAGE` | `en` | 语言代码（zh/en/ja 等），空=多语言自动检测 |\n| `WHISPER_DEVICE` | `cpu` | 推理设备：cpu / cuda |\n| `WHISPER_MODEL_DIR` | 空 | 模型缓存目录，空=`~/.cache/whisper`（或 `$XDG_CACHE_HOME/whisper`） |\n| `WHISPER_BEAM_SIZE` | `5` | Beam search 宽度（越大越准但越慢，建议 5） |\n| `WHISPER_BEST_OF` | `5` | 候选采样数（非零时启用温度采样） |\n| `WHISPER_INITIAL_PROMPT` | 生物医学 90+ 术语 | 首段音频提示词，已预填细胞/免疫/分子/蛋白/实验技术等高频术语，空格分隔。支持文件路径（try-file-first）：值指向存在的文件则读取内容。CLI 覆盖：`--whisper-initial-prompt <text|path>`（CLI > .env > 内置默认） |\n| `WHISPER_CONDITION_ON_PREV` | `False` | 推荐 `False`：每段独立解码，避免长视频错误累积；`True`=前段文本传入当前段（仅适合短音频<30分钟） |\n| `WHISPER_FP16` | `False` | FP16 推理（需 CUDA/GPU，CPU 上无效） |\n| `WHISPER_THREADS` | `0` | CPU 线程数（0=自动检测） |\n| `WHISPER_EXTRA_ARGS` | 空 | 额外 whisper CLI 参数（shell 字符串，如 `--beam_size 5 --verbose`），追加到命令末尾。同名参数自动去重（extra 覆盖已有）。CLI 覆盖：`--whisper-extra-args`（CLI > .env） |\n\n> **选择建议**：默认 `False`（每段独立，避免长视频错误累积）；短音频(<30min)单人连贯语音可设 `True` 提升连贯性。专有名词多的场景可配合 `INITIAL_PROMPT` 提升准确率，详细示例见 `.env.example`。需要微调 whisper 行为时可通过 `WHISPER_EXTRA_ARGS` 传入额外 CLI 参数（如 `--beam_size 10 --verbose`），同名参数自动去重。\n\n**🔹 faster-whisper 模式独有**（`WHISPER_BACKEND=faster-whisper`）\n\nCTranslate2 重写的 Whisper 推理实现，速度约为 openai-whisper 的 4 倍、内存减半，推荐用于 CPU 批量场景。\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `WHISPER_COMPUTE_TYPE` | `int8` | 计算精度：`int8`（CPU 最优）/`float16`（GPU 推荐）/`int8_float16`/`default`/`auto` |\n| `WHISPER_VAD_FILTER` | `True` | 启用 Silero VAD 静音过滤，减少幻觉、加速推理 |\n| `WHISPER_VAD_ONSET` | `0.5` | VAD 灵敏度阈值（0.0~1.0，越高越严格/只保留高置信语音） |\n| `WHISPER_NUM_WORKERS` | `1` | CTranslate2 并行 worker 数（仅 Python 版生效；JS 版 CLI 不支持此参数） |\n\n> **Python vs JS 差异**：\n> - Python 版：使用 `faster_whisper.WhisperModel` Python API（`num_workers` + `vad_parameters.onset`）\n> - Node.js 版：调用 `whisper-ctranslate2` CLI（无 `--num_workers`，VAD 阈值参数名为 `--vad_threshold`）\n> - 两者参数语义一致，CLI 参数名自动映射，用户无需关心差异\n>\n> **依赖**：\n> - Python 版：`pip install faster-whisper`（使用 Python API 模块导入，模型实例全局缓存）\n> - Node.js 版：`pip install whisper-ctranslate2`（脚本以 `whisper-ctranslate2` CLI 方式调用，参数透传）\n>\n> **HuggingFace 镜像（国内网络必备）**：\n> `faster-whisper` 首次加载模型时需从 `huggingface.co` 下载，国内网络通常无法访问。\n> 在 `.env` 中设置 `HF_ENDPOINT` 使用清华镜像加速：\n> ```\n> HF_ENDPOINT=https://hf-mirror.com\n> ```\n> 此变量对 Python 版（`huggingface-hub` 库自动读取）和 Node.js 版（子进程继承环境变量）均生效。\n> 设置后首次运行会自动从镜像下载模型并缓存到 `~/.cache/huggingface/hub/`，后续运行无需联网。\n>\n> **共享参数复用**：`WHISPER_MODEL` / `WHISPER_LANGUAGE` / `WHISPER_BEAM_SIZE` / `WHISPER_INITIAL_PROMPT` / `WHISPER_EXTRA_ARGS` 等 17 个共享变量在 faster-whisper 模式下同样生效，无需重复配置。\n\n**🔸 funasr 模式独有**（`WHISPER_BACKEND=funasr`）\n\n阿里达摩院开源的工业级中文语音识别工具包，中文 WER 约 **5%**（Whisper 中文约 15%），内置 VAD + 标点 + 热词 + 说话人 + 情感识别能力。推荐中文场景使用。\n\nfunasr 模式通过 `FUNASR_MODE` 进一步选择子模式：\n- **`cli`**（默认）= 本地 `funasr` CLI（首次自动从 ModelScope 下载模型，CPU 也能跑）\n- **`service`** = 远程 `funasr-server`（OpenAI 兼容 API，GPU 推荐，多任务并发）\n\n**funasr 共享变量（cli + service 通用）**\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `FUNASR_MODE` | `cli` | 子模式：`cli`（本地 AutoModel）/`service`（远程 funasr-server） |\n| `FUNASR_MODEL` | `paraformer-zh` | 主 ASR 模型：见下「可用模型对比表」 |\n| `FUNASR_VAD_MODEL` | `fsmn-vad` | VAD 模型（语音活动检测），留空=用主模型内置 VAD |\n| `FUNASR_PUNC_MODEL` | `ct-punc` | 标点恢复模型（自动加中英文标点），留空=不做标点恢复 |\n| `FUNASR_SPK_MODEL` | 空 | 说话人分离/确认模型（`cam++`），留空=不做说话人分离 |\n| `FUNASR_EMOTION_MODEL` | 空 | 情感识别模型（`emotion2vec_plus_large`），留空=不做情感识别 |\n| `FUNASR_HOTWORD` | 空 | 热词列表（空格分隔），如 `\"魔搭 ModelScope 通义千问\"`，显著提升专有名词识别 |\n| `FUNASR_LANGUAGE` | `zh` | 主语言（中文 `zh`；SenseVoice 配 `auto` 可自动检测 50+ 语种） |\n| `FUNASR_EXTRA_ARGS` | 空 | 额外 funasr 参数（shell 字符串），追加到命令末尾。同名参数自动去重（extra 覆盖已有）。CLI 覆盖：`--funasr-extra-args`（CLI > .env） |\n\n**funasr CLI 模式独有**（`FUNASR_MODE=cli`）\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `FUNASR_DEVICE` | `cpu` | 推理设备：`cpu` / `cuda`（GPU 强烈推荐，中文 large 模型差距 10×+） |\n| `FUNASR_QUANTIZE` | `True` | int8 量化（省 50% 内存，CPU 推荐；GPU 设为 `False`） |\n| `FUNASR_BATCH_SIZE_S` | `300` | 动态批处理音频秒数（60-600，大文件=更大值） |\n| `FUNASR_VAD_MAX_SEGMENT` | `20000` | VAD 最大单段长度（ms，`0`=不切分） |\n\n依赖：`pip install funasr modelscope`，脚本以 `funasr ++model=... ++input=...` 方式调用，模型自动从 ModelScope 下载到 `~/.cache/modelscope/hub`。\n\n**funasr 服务模式独有**（`FUNASR_MODE=service`）\n\n需先启动 `funasr-server`：\n```bash\n# GPU 模式（强烈推荐）\npip install funasr vllm fastapi uvicorn python-multipart\nfunasr-server --device cuda --port 8899\n\n# CPU 模式\nfunasr-server --device cpu --port 8899\n\n# 额外启用 MCP 协议（让 Claude / Cursor 等 AI 助手能直接调用语音识别）\nfunasr-server --device cuda --port 8899 --enable-mcp\n```\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `FUNASR_SERVICE_URL` | `http://localhost:8899` | funasr-server 地址 |\n| `FUNASR_SERVICE_MODEL` | `iic/SenseVoiceSmall` | 服务侧加载的模型 ID（首次调用会触发 ModelScope 下载） |\n\nAPI 端点（OpenAI 兼容）：`POST {URL}/v1/audio/transcriptions`（参数: file / model / response_format / prompt=热词 / language），脚本首次识别时直接调用，模型由服务端管理。\n\n**FunASR 可用模型对比表**（funasr 1.3.9，2026-05-29 发布）\n\n| 模型名 | 参数量 | 磁盘 | 速度 | 语种 | 时间戳 | 情绪 | 事件 | 说话人 | 推荐场景 |\n|--------|--------|------|------|------|--------|------|------|--------|----------|\n| `paraformer-zh` | 220M | ~1GB | 13×实时 | zh/en | ✓ | ✗ | ✗ | 需 cam++ | **中文首选（精度最高）** |\n| `SenseVoiceSmall` | 234M | ~1GB | 170×实时 | 50+ | ✗ | ✓ | ✓ | 需 cam++ | 多语种/实时/需情绪/事件 |\n| `Fun-ASR-Nano` | 800M | ~3GB | 加速（vLLM） | 31 | ✓ | ✗ | ✗ | 需 cam++ | 复杂上下文理解 |\n| `paraformer-zh-streaming` | 220M | ~1GB | 流式 | zh/en | ✓ | ✗ | ✗ | 需 cam++ | 实时字幕 |\n| `Qwen3-ASR` | 1700M | ~7GB | 较慢 | 52 | ✗ | ✗ | ✗ | 需 cam++ | 多语种高质量 |\n| `GLM-ASR-Nano` | 1500M | ~6GB | 较慢 | 17 | ✗ | ✗ | ✗ | 需 cam++ | 方言场景 |\n| `Whisper-large-v3` | 1550M | ~3GB | 1× | 多 | ✗ | ✗ | ✗ | 需 cam++ | 兼容 Whisper 用户 |\n| `Whisper-large-v3-turbo` | 809M | ~2GB | 2-3× | 多 | ✗ | ✗ | ✗ | 需 cam++ | Whisper 加速 |\n\n辅助模型（按需搭配主模型）：\n\n| 模型 | 参数量 | 磁盘 | 速度 | 功能 |\n|------|--------|------|------|------|\n| `fsmn-vad` | 0.4M | 内置 | 实时 | VAD 语音活动检测 |\n| `ct-punc` | 290M | ~1GB | — | 中英文标点恢复 |\n| `cam++` | 7.2M | 内置 | 实时 | 说话人分离/确认（CPU 实时） |\n| `emotion2vec_plus_large` | 300M | ~1GB | — | 情感识别 |\n\n> **选择建议**：\n> - **中文批量处理** → `paraformer-zh`（高精 + 13×实时，CPU 也能跑，性价比最高）\n> - **多语种 / 实时** → `SenseVoiceSmall`（170×实时，50+ 语种，内置情绪/事件检测）\n> - **需要说话人分离** → `paraformer-zh` + `cam++`\n> - **流式字幕** → `paraformer-zh-streaming`\n> - **GPU 高质量** → `Qwen3-ASR`（52 语种）/ `Fun-ASR-Nano`（31 语种 LLM 架构）\n\n> **WHISPER vs FunASR 选型**：Whisper 优势是 99 种语言覆盖 + 翻译任务 (`task=translate`)；FunASR 优势是中文 WER 显著更低、内置 VAD/标点/说话人/情感、中文场景速度更快。**纯中文识别强烈推荐 FunASR**。\n\n## 3.4 OCR 抽帧识别（画面字幕 / 无音轨视频）\n\n> 安装方法见上方「2.5 第五步 · ④ PaddleOCR」。下方仅列配置参数、触发与择优逻辑。\n\n**适用场景**\n\n- 无音轨视频（录屏、图文轮播、静态海报视频）\n- 有音轨但 ASR 输出为空或过短（水印循环音、纯 BGM、VAD 把人声过滤成静音）\n- 画面中烧录了重要文字（字幕、标题、卖点、步骤说明）\n\n**触发条件（`OCR_MODE=auto` 默认开启）**\n\n- `auto`：仅当视频「**无音轨**」或「**ASR 字符数 / 时长(分钟) < `OCR_TRIGGER_CPM`(默认 2)**」时才跑 OCR；ASR 充足时跳过，零额外开销\n- `always`：无视 ASR 结果，强制跑 OCR（调试 / 对比用）\n- `off`：完全关闭 OCR\n\n**ASR 识别失败 → 自动 OCR 兜底（关键行为）**\n\n为保证语音识别异常时不至于整条任务 `partial`，流水线在 ASR 失败时按以下规则决定是否转入 OCR 抽帧：\n\n- ASR 返回异常 / 空文本 / 未生成输出文件时，只要任务步骤含 `ocr` 且源视频已成功下载，即**自动转入 OCR 抽帧兜底**，不再因语音识别失败直接 `partial`。\n- `OCR_MODE=auto`：空文本自然满足 `0 < OCR_TRIGGER_CPM`，**触发** OCR。\n- `OCR_MODE=always`：强制跑 OCR。\n- `OCR_MODE=off`：OCR 已关闭，ASR 失败无处兜底 → 任务 `partial`（符合预期，用户明确要求关闭 OCR）。\n- 续跑兼容：若上次续跑记录把 `ocr` 标记为 `skipped`（依据旧 ASR 结果判定），本次 ASR 失败时会**重新评估** `shouldTriggerOcr`，重新触发 OCR，而非沿用旧的跳过判定。\n\n**OCR / ASR 择优规则（OCR 是兜底，但 ASR 失败时优先采用 OCR）**\n\n`bestText` 的选取逻辑（**OCR 绝不喧宾夺主**）：\n\n- 若 `OCR_MODE=off` 或未触发 → `bestText = ASR 文本`\n- ASR **失败（空文本）**时：只要 OCR 通过校验（`OCR_MIN_CHARS` + 置信度达标）即直接采用 OCR 文本，避免丢弃唯一可用内容（不再要求「OCR 字符数 ≥ ASR 字符数」，因为 ASR 本就为空）\n- ASR **成功**时：仅当 **OCR 字符数 ≥ ASR 字符数** 且 **OCR 平均置信度 ≥ `OCR_CONF_THRESH`(默认 0.6)** 才用 OCR 覆盖 ASR\n- 否则回退 ASR（OCR 质量不达标 → 信任语音识别结果）\n\n> 即「OCR 不如 ASR」时自动回退，阈值已放宽到足够包容；画面文字确实比语音多且清晰时才采用 OCR。而当 ASR 彻底失败时，OCR 抽到的画面文字即是唯一可用的文本内容，会被直接采用。\n\n**抽帧策略（不丢字幕、支持长视频）**\n\n- 用 ffmpeg 场景切换抽帧：`select='gt(scene,0.3)'` + `scale=-1:720`，只在画面显著变化时才抽帧\n- 烧录字幕随场景切换出现，会天然卡帧被抽中，**不丢文字**\n- `-fps_mode passthrough` 保持帧序；完全静止视频退化为均匀抽帧兜底\n- 抽帧数超过 `OCR_MAX_FRAMES`(默认 2000) 时自动放宽场景阈值重抽 / 按步长抽稀，**绝不丢字幕内容**，也不因 1~2h 长视频超时\n\n**产物命名 & 断点续跑兼容**\n\n- OCR 输出：`transcripts/{sheet}/{stem}.ocr.txt`（与 ASR 的 `{stem}.txt` **完全独立**，互不覆盖）\n- 续跑判定：`.ocr.txt` 与 ASR `.txt` 各自校验，互不影响；`progress` JSON 的 `content` 字段统一用 `bestText`\n- 跳过复用：前序已跑过 OCR 且文件存在 + 字符数 ≥ `OCR_MIN_CHARS`(默认 30) → 直接复用，不重跑\n\n---\n\n# 四、Cookie 设置（首次使用必须）\n\n## 4.1 YouTube（推荐：Firefox 浏览器直读）\n\nyt-dlp 可直接从 Firefox 浏览器读取 cookie，无需手动导出：\n\n1. 用 Firefox 浏览器登录 [youtube.com](https://www.youtube.com)\n2. 在 `.env` 中设置 `YOUTUBE_COOKIES_FROM_BROWSER=firefox`\n3. 脚本自动通过 `--cookies-from-browser firefox` 读取\n\n> Firefox 在 Windows 上的 cookie 加密格式 yt-dlp 可稳定解密，只要浏览器保持登录态即可。\n> **Chrome/Edge 在 Windows 上 DPAPI 解密已知失败**，不推荐使用。\n\n### YouTube（备用：手动导出文件）\n\n如果无法使用 Firefox，可手动导出 cookie 文件：\n\n1. Chrome 安装扩展 [Get cookies.txt LOCALLY](https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc)\n2. 访问 [youtube.com](https://www.youtube.com) 并登录\n3. 点击扩展图标 → Export → 保存为 `cookies/youtube.txt`\n4. 在 `.env` 中注释掉 `YOUTUBE_COOKIES_FROM_BROWSER`，启用 `YOUTUBE_COOKIE_FILE=cookies/youtube.txt`\n\n> ⚠️ YouTube cookie 有效期约 48 小时，过期后需重新导出。下载时如果报 `cookies does no longer seem to be valid`，说明 cookie 已失效。**优先用 Firefox 方案，免维护。**\n\n## 4.2 B站（bilibili）\n\n**方案 A（推荐）：直接从 Firefox 浏览器读 cookie**\n\n1. 用 Firefox 浏览器登录 [bilibili.com](https://www.bilibili.com)\n2. 在 `.env` 中设置 `BILIBILI_COOKIES_FROM_BROWSER=firefox`\n3. 脚本自动通过 `--cookies-from-browser firefox` 读取\n\n> Firefox cookie 直读方案同样适用于 B站，无需手动导出。\n\n**方案 B（备用）：从文件读取 cookie**\n\n1. Chrome 安装扩展 [Get cookies.txt LOCALLY](https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc)\n2. 访问 [bilibili.com](https://www.bilibili.com) 并登录\n3. 点击扩展图标 → Export → 保存为 `cookies/bilibili.txt`\n4. 在 `.env` 中注释掉 `BILIBILI_COOKIES_FROM_BROWSER`，启用 `BILIBILI_COOKIE_FILE=cookies/bilibili.txt`\n\n---\n\n# 五、使用方法\n\n## 5.1 单条测试\n\n```bash\n# 下载 + 转码 + 识别 + AI分析，指定 sheet + extra.id\nnode process_videos.js --sheet \"YouTube视频\" --id 2143\n# 或 Python 版本\npython process_videos.py --sheet \"YouTube视频\" --id 2143\n\n# 只跑下载\nnode process_videos.js --sheet \"普诺赛中文站\" --id 16 --step download\n# 或 Python 版本\npython process_videos.py --sheet \"普诺赛中文站\" --id 16 --step download\n\n# 只跑转码（需要已有下载文件）\nnode process_videos.js --sheet \"普诺赛中文站\" --id 16 --step transcode\n\n# 只跑识别（需要已有转码文件）\nnode process_videos.js --sheet \"普诺赛中文站\" --id 16 --step transcribe\n\n# 只跑 AI 分析（需要已有识别文本）\nnode process_videos.js --sheet \"普诺赛中文站\" --id 16 --step analyze\n\n# 强制重新下载（忽略已有文件）\nnode process_videos.js --sheet \"YouTube视频\" --id 2143 --force\n```\n\n## 5.2 批量全量\n\n```bash\n# 全量执行（2 个并发，失败重试 3 次）\nnode process_videos.js --concurrency 2 --retry 3\n\n# 只跑某一 sheet\nnode process_videos.js --sheet \"YouTube视频\" --concurrency 2 --retry 3\n\n# 先干跑预览\nnode process_videos.js --dry-run\n\n# Excel 数据量大时，偏移+限量调试\nnode process_videos.js --offset 10 --limit 5 --dry-run  # 跳过前10条，预览5条\nnode process_videos.js --limit 3 --concurrency 1        # 只处理前3条\n```\n\n## 5.3 重跑失败\n\n```bash\n# 第一次跑完后生成 reports/{sheet名称}/report_xxx.json\n# 查看失败项：\nnode process_videos.js --retry-failed reports/YouTube视频/report_20260610_143000.json --dry-run\n\n# 重跑：\nnode process_videos.js --retry-failed reports/YouTube视频/report_20260610_143000.json --concurrency 2 --retry 3\n```\n\n## 5.4 超时控制（防止任务卡死）\n\n每个步骤都有独立超时，超时后自动 kill 子进程、标记失败并继续执行后续任务：\n\n```bash\n# 自定义超时（单位秒，设为 0 表示不限制）\nnode process_videos.js \\\n    --download-timeout 1800 \\   # 下载 30 分钟\n    --transcode-timeout 1200 \\  # 转码 20 分钟\n    --transcribe-timeout 0 \\    # 识别 不限制\n    --analyze-timeout 300       # AI 分析 5 分钟\n\n# 默认值：下载 1800s / 转码 1200s / 识别 0(不限制) / AI 分析 300s\n```\n\n- 超时属于**可重试错误**，会触发指数退避重试（`--retry` 控制次数）\n- 无论超时多少次，**不会阻塞其他并发任务**，失败项会记录到报告\n- 超时失败的任务可用 `--retry-failed` 单独重跑\n\n## 5.5 直接指定 URL 下载\n\n```bash\n# 直接指定视频链接，自动识别平台（支持标准链接、短链接、内嵌链接）\nnode process_videos.js --url \"https://www.youtube.com/watch?v=zzJmKPX8a3c\"\npython process_videos.py --url \"https://www.bilibili.com/video/BV1xx411c7mD\"\n\n# 指定输出文件名（不含扩展名）\nnode process_videos.js --url \"https://youtu.be/zzJmKPX8a3c\" --name \"产品介绍\"\n\n# 只执行部分步骤\nnode process_videos.js --url \"https://www.youtube.com/watch?v=zzJmKPX8a3c\" --step transcode\n```\n\n**支持的 URL 格式：**\n- YouTube: 标准页、短链接、Shorts、内嵌页、直播\n- B站: 标准页（BV/av号）、短链接、内嵌页、移动端\n- 腾讯视频: 标准页、内嵌页、移动端\n- 优酷: 标准页、video 路径、www 域名\n\n**文件命名规则：**\n- 默认：`{平台}_{视频ID}`（如 `youtube_zzJmKPX8a3c`）\n- 自定义：通过 `--name` 指定（如 `--name \"产品介绍\"`）\n- 冲突处理：自动提示选择（覆盖 / 跳过 / 自定义名称）\n\n> **并发处理**：多 URL 时支持并发（受 `--concurrency` 控制）；非 `--force` 时建议单 URL 执行（避免交互阻塞）。\n\n## 5.6 处理本地文件\n\n```bash\n# 指定本地视频文件，跳过下载，直接转码→识别→分析\nnode process_videos.js --input \"downloads/产品介绍.mp4\"\npython process_videos.py --input \"downloads/产品介绍.mp4\"\n\n# 指定输出文件名\nnode process_videos.js --input \"downloads/产品介绍.mp4\" --name \"产品介绍_分析\"\n\n# 只执行部分步骤\nnode process_videos.js --input \"downloads/产品介绍.mp4\" --step analyze\n```\n\n**文件校验：**\n- 检查文件是否存在\n- 检查文件格式是否支持（视频/音频）\n- 检查是否可以正常读取\n- 校验失败会提示错误并退出\n\n> **并发处理**：多文件时支持并发（受 `--concurrency` 控制）；非 `--force` 时建议单文件执行（避免交互阻塞）。\n\n## 5.7 处理纯文本内容（跳过视频步骤）\n\n如果你已经有了一段文本内容（比如爬虫爬取的、之前识别好的、或者从其他途径获取的），可以直接做 AI 分析，跳过下载、转码、识别三个步骤：\n\n```bash\n# ═══════════ --content 模式：纯文本 AI 分析 ═══════════\n\n# 从文件读取内容，自动用文件名作为输出名\nnode process_videos.js --content \"data/article.txt\"\npython process_videos.py --content \"data/article.txt\"\n\n# 直接提供内联文本，自动取前 32 字符作为输出名\nnode process_videos.js --content \"这是一段需要分析的内容...\"\npython process_videos.py --content \"这是一段需要分析的内容...\"\n\n# 指定输出文件名（--name）\nnode process_videos.js --content \"data/article.txt\" --name \"文章分析\"\npython process_videos.py --content \"data/article.txt\" --name \"文章分析\"\n\n# 配合 --dry-run 预览\nnode process_videos.js --content \"data/article.txt\" --dry-run\n```\n\n**输出文件命名规则：**\n- 指定了 `--name` → 使用 `--name` 的值\n- 内容是文件路径 → 使用文件名（不含扩展名）\n- 内容是内联文本 → 使用前 32 个字符\n\n**输出位置：** `output/reports/content/tasks/{name}.txt` + `output/reports/content/report_xxx.json`\n\n## 5.8 Excel 列文本批量 AI 分析\n\n当 Excel 某列已经存好了文本内容（比如之前爬虫爬取的），可以批量对这些文本做 AI 关键词分析：\n\n```bash\n# ═══════════ --content-column 模式：批量 AI 分析 ═══════════\n\n# 对 Excel 中 \"content\" 列的文本逐行做 AI 关键词分析，结果写回 \"keywords\" 列\nnode process_videos.js --content-column \"content\"\n\n# 指定其他列名\nnode process_videos.js --content-column \"爬取文本\"\n\n# 指定特定 sheet\nnode process_videos.js --sheet \"普诺赛中文站\" --content-column \"content\"\n\n# 配合 --dry-run 预览\nnode process_videos.js --content-column \"content\" --dry-run\n\n# 配合 --offset / --limit 调试\nnode process_videos.js --content-column \"content\" --offset 0 --limit 3\nnode process_videos.js --content-column \"content\" --concurrency 2 --retry 2\n```\n\n> **注意**：`--content-column` 模式自动设置 `--step analyze`（仅 AI 分析），不会触发下载/转码/识别。\n> 文本为空的行会自动跳过。\n> 分析结果写入 Excel 的 `keywords` 列（由 `COL_KEYWORDS` 环境变量指定）。\n\n## 5.9 工具预检（执行前自动检测）\n\n每次执行任务前，脚本会自动检测本次涉及步骤所需的工具/服务是否可用：\n\n| 步骤 | 检测项 | 不可用时行为 |\n|------|--------|-------------|\n| download | yt-dlp 可调用 | 提示用户，输入 `yes` 继续 / 其他取消 |\n| download | **代理连通性**（所有配了 `{平台}_PROXY` 的平台） | 同上 |\n| transcode | ffmpeg + ffprobe 可调用 | 同上 |\n| transcribe | whisper 后端可用（按 `WHISPER_BACKEND` 分支检测） | 同上 |\n| analyze | AI_ENABLED=true 且 API 配置完整 | 同上 |\n\n### 代理预检（避免整批任务白跑）\n\nYouTube 等站点必须走代理，而**换代理客户端后监听端口经常变化**。端口填错时 yt-dlp 每条任务都会重试到超时，最终「N 条全失败」，且错误信息埋在一堆重试日志里很难发现。\n\n因此含 `download` 步骤时，会对每个配置了 `{平台}_PROXY` 的地址做一次 **TCP 连通性探测**（同一 proxy 只探一次，默认 2 秒超时，几乎不增加启动耗时）：\n\n```text\n═══ 工具/服务预检 ═══\n以下依赖不可用:\n  • 代理不可用: http://127.0.0.1:7890 连不上（平台: youtube）\n      · 127.0.0.1:7890 当前无服务监听，走该代理的平台会 100% 下载失败\n      · 请在代理客户端查看实际的「混合端口 / HTTP 端口」，并把 .env 里的 YOUTUBE_PROXY 改成该端口\n```\n\n| 配置 | 默认 | 说明 |\n|------|------|------|\n| `PROXY_PROBE_TIMEOUT` | `2000` | TCP 探测超时（毫秒）。设 `0` 关闭代理预检 |\n\n- 支持 `http://` / `https://` / `socks5://` / `socks5h://`，也兼容 `user:pass@host:port` 与省略端口（按 scheme 取默认端口）\n- 探测只做 TCP 握手，**不校验能否真正翻墙** —— 端口通但节点没连上仍可能失败\n- dry-run 的「环境检测」面板会多出一行 `代理: youtube→http://127.0.0.1:7890`（✅/❌）\n\n**代理端口对不上时怎么定位**：\n\n1. 代理客户端里找「**混合端口 / Mixed Port / HTTP 端口**」，这个才是要填进 `{平台}_PROXY` 的端口\n   （常见默认：Clash / Clash Verge / Clash for Windows `7890`、v2rayN `10809`(HTTP) / `10808`(SOCKS)、Shadowsocks `1080`；你当前的「魔戒」等非标客户端以界面实际显示的「本地代理/监听端口」为准）\n2. 或直接列出本机监听端口：\n\n   ```bash\n   # Windows\n   netstat -ano | findstr LISTENING | findstr 127.0.0.1\n   # macOS / Linux\n   lsof -nP -iTCP -sTCP:LISTEN | grep 127.0.0.1\n   ```\n\n3. 验证某端口是否真能翻墙（端口换成你自己的）：\n\n   ```bash\n   yt-dlp --proxy http://127.0.0.1:7890 --skip-download --get-title \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\"\n   ```\n\n   能打印出标题即代理可用；报 `Unable to connect to proxy ... [WinError 10061] 目标计算机积极拒绝` 就是端口没有服务监听。\n4. 改完 `.env` 后干跑确认：`node process_videos.js --step download --dry-run`，看代理那一行是否 ✅\n\n**ASR 后端检测策略**（轻量秒级，不实际启动 CLI）：\n\n| 后端 | 检测方式 | 说明 |\n|------|---------|------|\n| `local` | `where`/`which whisper` | 检查 `whisper` 可执行文件是否存在（JS）；`shutil.which()`（Python） |\n| `faster-whisper` | JS: `where`/`which whisper-ctranslate2`；Python: `importlib.util.find_spec(\"faster_whisper\")` | JS 用 CLI，Python 用 Python API |\n| `funasr` (cli) | `where`/`which funasr`（JS）；`importlib.util.find_spec(\"funasr\")`（Python） | 同上 |\n| `funasr` (service) | HTTP GET `FUNASR_SERVICE_URL` | 3 秒超时 |\n| `service` | HTTP GET `WHISPER_SERVICE` | 3 秒超时 |\n\n> **为什么不直接跑 `--help`？** `whisper`、`whisper-ctranslate2`、`funasr` 等 Python CLI 的 `--help` 均会触发框架初始化（Hydra / CTranslate2 / 模型注册），耗时 **5-30 秒**，严重拖慢 dry-run 和预检。改用可执行文件/包存在检测后，全量检测 < 0.3 秒。\n\n- **dry-run** 模式下同样展示检测结果（但不中断执行）\n- 所有模式（正常执行、重跑失败、单步运行）均执行预检\n- 即使工具不可用，用户仍可选择强制继续（但相应步骤大概率失败）\n\n## 5.10 命令行参数说明\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|---------|------|\n| `--sheet <name>` | str | 全部 | 指定 sheet 名称（可多次指定，或逗号/空格/中文逗号分隔） |\n| `--id <id>` | str | — | 指定 extra.id 或 title（可多次指定，或逗号/空格/中文逗号分隔） |\n| `--offset <n>` | int | 0 | 跳过前 N 条任务（从 0 开始），适合调试大量数据 |\n| `--limit <n>` | int | 0 | 最多处理 N 条任务，0 表示无限制 |\n| `--step <step>` | str | 全跑 | 只执行某步：`download` / `transcode` / `transcribe` / `ocr` / `analyze`（`ocr` 为可选步骤，默认随 transcribe 之后自动运行，仅对无音轨/ASR 过短的视频补画面文字） |\n| `--force` | flag | off | 强制重做下载+转码，忽略已有文件 |\n| `--concurrency <n>` | int | 1 | 并发数，建议 2~3。适用于：Excel 批量模式（已支持）、`--url` 多 URL（JS/Py 均支持）、`--input` 多文件（Py 支持；JS 需 `--force` 跳过交互冲突） |\n| `--retry <n>` | int | 0 | 每步失败最大重试次数 |\n| `--retry-delay <n>` | float | 5 | 重试间隔基数（秒），指数退避 5→10→20 |\n| `--download-timeout <n>` | int | 1800 | 单个下载任务最长执行时间（秒），0=不限制 |\n| `--transcode-timeout <n>` | int | 1200 | 单个转码任务最长执行时间（秒），0=不限制 |\n| `--transcribe-timeout <n>` | int | 0 | 单个识别任务最长执行时间（秒），0=不限制 |\n| `--analyze-timeout <n>` | int | 300 | 单个 AI 分析任务最长执行时间（秒），0=不限制 |\n| `--dry-run` | flag | off | 干跑模式，只列任务不执行 |\n| `--retry-failed <path>` | path | — | 从报告 JSON 重跑失败项（如 `reports/YouTube视频/report_xxx.json`） |\n| `--init` | flag | off | 复制 .env.example 到当前目录并重命名为 .env |\n| `--file <path>` | path | — | 指定 Excel 文件路径（优先级高于 EXCEL_FILE 环境变量） |\n| `--output <dir>` | path | `output` | 整体覆盖 `OUTPUT_DIR`（优先级：**CLI > env > 默认**）。子目录名由代码硬编码 |\n| `--input <path>` | path | — | 指定本地视频文件路径（可多次指定，或逗号/空格/中文逗号分隔），跳过下载，直接转码→识别→分析 |\n| `--url <url>` | str | — | 直接指定视频下载链接（可多次指定，或逗号/空格/中文逗号分隔），跳过 Excel |\n| `--content <text 或 path>` | str | — | 直接提供文本内容（文件路径或内联文本），跳过下载/转码/识别，仅做 AI 分析 |\n| `--content-column <col>` | str | — | Excel 模式：指定包含已有文本的列名，批量做 AI 分析（自动设 --step analyze） |\n| `--name <name>` | str | — | 指定输出文件名，不含扩展名（与 --url / --input / --content 配合使用；**多文件时忽略**） |\n| `--env-file <path>` | path | .env | 指定要加载的 .env 文件路径 |\n| `--whisper-initial-prompt <text\\|path>` | str | .env | Whisper 初始提示词（文本或文件路径，CLI 优先级最高） |\n| `--ai-prompt <text\\|path>` | str | .env | AI 分析提示词模板（文本或文件路径，CLI 优先级最高） |\n| `--whisper-extra-args <args>` | str | .env | Whisper 额外参数（shell 字符串，如 `\"--beam_size 5\"`，最高优先级且自动去重） |\n\n---\n\n# 六、进阶机制\n\n## 6.1 重试规则\n\n| 可重试 | 不重试 |\n|----------|----------|\n| 网络超时、连接拒绝 | HTTP 404 / 403 / 401 |\n| yt-dlp 下载中断 | 视频已删除 / 私有 |\n| whisper 服务超时 | 无效 URL、文件不存在 |\n| **步骤级超时（任务卡死）** | 参数错误（ValueError/TypeError） |\n\n## 6.2 智能跳过与自动重转码\n\n脚本默认不会重复处理已有文件，但会在以下情况自动触发重做：\n\n| 步骤 | 跳过条件 | 自动重做条件 |\n|------|-----------|----------------|\n| 下载 | 同名文件已存在（非 `--force`） | `--force` 或文件不存在 |\n| 转码 | WAV 已存在 **且** MP4 时间戳 ≤ WAV 时间戳 | `--force` 或 **MP4 比 WAV 新**（重新下载过） |\n| 识别 | —（每次必跑，覆盖写入 Excel） | — |\n\n> 关键设计：即使不加 `--force`，只要视频重新下载过（MP4 的修改时间晚于 WAV），转码也会自动重新执行，**确保下载和转码内容始终保持一致**。\n\n## 6.3 断点续跑（Resume）机制\n\n从 v1.4 开始，脚本在「智能跳过」基础上引入了严格的**断点续跑校验**——四步产物要么完整落盘 + 校验通过，要么不留尾巴，确保断电/中断后可安全续跑。\n\n### 产物路径与校验依据\n\n| 步骤 | 产物 | 校验条件 | 校验失败行为 |\n|------|------|---------|--------------|\n| download | `downloads/{sheet}/{stem}.mp4` | 文件存在 + size>0 | 清理 `.part`/`.ytdl`，重做 |\n| transcode | `transcoded/{sheet}/{stem}.wav`（扩展名由 `TRANSCODE_EXT` 决定） | 文件存在 + size>0 | 清理 0 字节产物，重做 |\n| transcribe | `transcripts/{sheet}/{stem}.txt` | 长度 ≥ `MIN_TRANSCRIPT_CHARS`（默认 50） | 清理文本，重做 |\n| ocr | `transcripts/{sheet}/{stem}.ocr.txt` | 长度 ≥ `OCR_MIN_CHARS`（默认 30）且与 ASR 独立校验；仅当 `OCR_MODE≠off` 且触发条件成立才跑 | 清理 `.ocr.txt` + `.meta.json`，重做；未触发则标记 `skipped` 直接复用 |\n| analyze | `keywords/{sheet}/{stem}.txt` | 长度 ≥ `MIN_KEYWORDS_CHARS`（默认 5） | 清理关键词，重做 |\n\n### 跳过判定（每次 `process_one_task` 入口）\n\n1. 读取 `progress/{sheet}/task_{stem}.json`，若 `force=False` 且步骤状态 = `success` 才进入跳过检查\n2. **校验产物文件**：存在性 + 长度阈值\n3. **校验通过** → 跳过该步 + 复制之前的产物（避免重复推理）\n4. **校验失败** → 视为\"上次的 success 不可信\"，**降级为重做该 step**\n\n### 失败不留尾巴\n\n| 失败步骤 | 清理动作 |\n|----------|----------|\n| download | 清理 `*.part` / `*.ytdl` 残留 |\n| transcode | 清理 0 字节的转码文件 |\n| transcribe | 清理 transcript 文本文件（不留半残文本） |\n| analyze | 清理 keywords 文本文件 |\n\n### Excel 实时写回\n\n从 v1.6 开始，实时写回由「每条任务整表 reload + save」改为**内存缓存 + 周期落盘**，在保留中断安全的同时不再拖垮并发吞吐。\n\n**写入链路**\n\n1. 任务完成 → `write_excel_cell`（Python）/ `writeExcelCellByKey`（JS）**只更新内存中的 Workbook 缓存**并打脏标记，不碰磁盘\n2. 首次写入时才把整表加载进缓存（`_ensure_excel_loaded` / `_ensureExcelLoaded`），后续复用\n3. 后台按 `EXCEL_FLUSH_INTERVAL`（默认 **3 秒**）把脏数据落盘；无修改时不做任何磁盘写\n\n**三重落盘兜底**（确保中断不丢）\n\n| 触发时机 | Python | JS |\n|----------|--------|-----|\n| 周期落盘 | daemon 线程 `_excel_flush_loop` | `setInterval` + `unref()` |\n| 正常退出 | `atexit` | `process.on('exit')` |\n| Ctrl+C / 被终止 | `SIGINT` / `SIGTERM` handler | `SIGINT` / `SIGTERM` handler |\n\n> **JS 端 `unref()` 不能省**：`setInterval` 默认会吊住 event loop，导致任务全部跑完后进程也不退出（终端一直挂着不回提示符）。`unref()` 让它对齐 Python daemon 线程语义——不阻塞退出，未落盘的脏数据由 `process.on('exit')` 钩子兜底 flush。\n\n**丢数据风险对比**\n\n| 场景 | 旧方案（每条整表 save） | 新方案（缓存 + 周期落盘） |\n|------|------------------------|--------------------------|\n| 正常结束 / Ctrl+C | 不丢 | 不丢（信号 handler 兜底 flush） |\n| 强杀 `kill -9` / 断电 | 不丢，但每条都付出整表序列化代价 | 最坏丢失一个间隔（默认 ≤3 秒）内的修改 |\n| 高并发吞吐 | 被 Excel 写锁串行化，明显拖慢 | 无磁盘串行化瓶颈 |\n\n**间隔怎么选**：默认 `3` 秒是平衡点；Excel 很大或任务很密集想省 I/O 可设 `5`；想更保守可设 `2`。不建议 >5（边际收益小，收尾风险变大）。\n\n> `EXCEL_FLUSH_INTERVAL` **单位统一为秒，Python 与 JS 写法完全一致**（JS 内部自动 ×1000 转毫秒），同一份 `.env` 双端通用。\n\n**其他约定**\n\n- 末尾批量写（`write_all_contents_to_excel`）会先 flush 再失效缓存，以磁盘为权威源，避免覆盖实时写结果\n- 单步运行（`--step`）不写 Excel（避免误覆盖）\n\n**中途用 Excel 打开查看（文件被占用）怎么办**\n\n流水线在后台按 `EXCEL_FLUSH_INTERVAL` 周期落盘；若此时你用 Excel 打开了同一个 `.xlsx`，文件被独占锁定，落盘会失败。处理策略（双端一致）：\n\n1. **只告警一次**：首次检测到占用打印一行 `⚠️ Excel 文件被占用…将每 Ns 重试`，之后保持静默，不再每 3 秒刷屏。\n2. **任务继续跑**：落盘在独立的后台定时器/线程，不影响主流程；脏数据一直保留在内存，不会丢。\n3. **自动恢复**：你关闭 Excel 查看窗口后，下一次周期落盘自动写成功，并打印 `✅ Excel 已恢复写入`。\n4. **收尾不丢数据**：若所有任务跑完文件仍然被占用，进程会**阻塞等待**直到写成功再退出（不再像旧版那样静默丢数据）。等待上限由 `EXCEL_LOCK_MAX_WAIT`（秒，默认 `300`，`0`=无限）控制；超过上限仍占用，则把全部改动另存为 `<Excel名>.pending.xlsx`（该文件未被锁定），你可打开后把值复制回原表。\n\n> 缺失列（如 `content` / `keywords`）无需手动建：首次写入时自动在末列创建该列并写表头，后续命中即复用。\n\n### 启动统计\n\n启动时扫描 progress JSON 并打印：\n\n```\n♻️  完整跳过 5 条 / 部分续跑 12 条 / 全量重跑 78 条\n```\n\n> **核心原则**：transcribe / analyze 不允许\"半成功\"——要么完整产物落盘 + 校验通过，要么清理掉。\n\n## 6.4 错误信息透传\n\n从 v1.4.1 开始，失败时不再只显示 \"Exit code 2\" 这种无意义信息，而是**完整透传 stderr / traceback**。\n\n### 透传机制\n\n| 层 | 行为 |\n|----|------|\n| **JS `spawnWithTimeout`** | 子进程退出码非 0 时，把 stderr **末尾 3000 字符**直接嵌入到 `error.message` 中，所有调用方自动受益 |\n| **Python `_transcribe_local`** | 累积 stderr 到 `_stderr_lines`，subprocess 失败时随异常一并抛出 |\n| **Python `_transcribe_faster_whisper` except** | 打印完整 traceback + 音频路径 + 文件大小 + 模型配置 + SSL 错误自动检测 |\n| **JS 三个 transcribe catch 块** | 不再 `slice(0, 500)` 截断，上限提至 5000 字符；用 `e.stderr || e.message` 取最详细的那一份 |\n\n### 长消息打印辅助\n\n新增 `_print_long()`（Python）/ `printLong()`（JS）助手：\n\n- 超过 `max_chars`（默认 800）时按字符截断，并附 `...(已截断)` 提示\n- 含换行时**逐行缩进**打印，便于在多行 traceback 中保持可读性\n\n### SSL/CERTIFICATE 错误自动检测\n\n当 `faster-whisper` 识别抛出 SSL 错误时（例如 `CERTIFICATE_VERIFY_FAILED`），自动检测并提示三条解决建议：\n\n```\n💡 SSL 证书验证失败，可能原因：\n  1. Python 证书未更新 → 运行 /Applications/Python\\ 3.13/Install\\ Certificates.command\n  2. 代理拦截 HTTPS   → 临时关闭代理或设置 REQUESTS_CA_BUNDLLE\n  3. 使用系统证书     → pip install --upgrade certifi\n```\n\n### 失败样例对比\n\n**修复前**（只知道 exit code）：\n\n```\n[2143] 转码失败: download+transcode success but transcribe failed: Exit code 2\n[2143] 识别失败: Exit code 2\n```\n\n**修复后**（完整 traceback + SSL 提示）：\n\n```\n[2143] 转码失败: download+transcode success but transcribe failed: whisper-ctranslate2 退出码 2\n       stderr 末尾:\n         RuntimeError: Failed to load audio\n         urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded\n         ...\n       💡 SSL 证书验证失败，可能原因：\n         1. Python 证书未更新 → ...\n         2. 代理拦截 HTTPS   → ...\n         3. 使用系统证书     → ...\n```\n\n## 6.5 临时文件自动清理\n\nyt-dlp 下载过程中会生成 `.part`（未完成分片）和 `.ytdl`（元数据）临时文件。脚本在以下时机自动清理这些残留：\n\n| 时机 | 说明 |\n|------|------|\n| 下载开始前 | 清除上次中断留下的 `.part` / `.ytdl`，确保干净环境 |\n| 跳过已有文件时 | 检查并清除该视频的历史残留 |\n| 下载失败后 | 立即清理，避免无效文件占磁盘 |\n\n> 例如：`2152.mp4.part` + `2152.mp4.ytdl` 会在下次下载该视频时自动删除，无需手动清理。\n\n## 6.6 AI 关键词归纳\n\n在识别完成后，脚本可自动调用 OpenAI 兼容 API 对识别文本做关键词归纳，结果写入 `keywords` 列。\n\n### 配置\n\n在 `.env` 中配置以下变量（见 `.env.example`）：\n\n```env\n# 启用/禁用 AI 分析环节\nAI_ENABLED=true\n\n# OpenAI 兼容 API（支持任何兼容接口）\nAI_API_KEY=sk-xxx\nAI_BASE_URL=https://apihub.agnes-ai.com/v1\nAI_MODEL=agnes-2.0-flash\n\n# 提示词模板（{content} 会被识别文本替换）\n# 采用两步法：先语义修正 Whisper 同音/形近/术语错误，再提取关键词\n# 支持文件路径：值指向存在的文件则读取内容（try-file-first 策略）\n# CLI 覆盖：--ai-prompt <text|path> 优先级最高（CLI > .env > 内置默认）\nAI_PROMPT_TPL=你是多语言内容分析专家...这是内容：{content}\n\n# 请求超时（秒，通过 --analyze-timeout 参数设置）\n```\n\n### 工作原理\n\n1. whisper 识别完成 → 得到文本（存入 `content` 列）\n2. AI 先对识别文本做**语义修正**（修正 Whisper 常见的同音错字、专业术语误判、形近字混淆）\n3. 再对修正后的文本提取搜索关键词 → 写入 `keywords` 列\n\n> **提示词模板可自由定制**：只需保留 `{content}` 占位符，提示词内容可改为翻译、摘要、分类等任意任务。完整模板见 `.env.example`。值支持文件路径（指向存在的文件则自动读取内容），也可通过 `--ai-prompt` CLI 参数临时覆盖（优先级：CLI > .env > 内置默认）。\n\n### 单独运行\n\n```bash\n# 已有识别文本，只跑 AI 分析\nnode process_videos.js --sheet \"普诺赛中文站\" --id 427 --step analyze\n# 或 Python 版本\npython process_videos.py --sheet \"普诺赛中文站\" --id 427 --step analyze\n\n# 单独跑 analyze 超过 16 条不会写入 Excel\n# 要想写入 Excel 跑完整流程 --step analyze\nnode process_videos.js --sheet \"YouTube视频\" --step analyze --concurrency 2\n```\n\n### 禁用 AI 分析\n\n设置 `AI_ENABLED=false`，识别完成后跳过 AI 分析步骤。\n\n### 提示词优先级\n\n`WHISPER_INITIAL_PROMPT` 和 `AI_PROMPT_TPL` 均支持三种输入方式：\n\n| 方式 | 示例 | 说明 |\n|------|------|------|\n| 内联文本 | `WHISPER_INITIAL_PROMPT=细胞 冻存` | 直接写入值 |\n| 文件路径 | `AI_PROMPT_TPL=./prompts/my-prompt.txt` | 值指向存在的文件时自动读取内容 |\n| CLI 覆盖 | `--ai-prompt ./prompts/custom.txt` | 优先级最高，临试覆盖不修改 .env |\n\n优先级：**CLI 参数 > .env 环境变量 > 内置默认值**\n\n> **`{content}` 替换安全性**：JS 版使用 `replace('{content}', () => text)` 函数替换，避免转录文本中的 `$&`、`` $` ``、`$'`、`$$` 等 JavaScript 特殊模式被错误解释。Python 版 `str.replace()` 天然无此问题。\n\n```bash\n# 用自定义 prompt 文件跑全量\nvideo-pipeline --ai-prompt ./prompts/keyword-extract.txt --sheet \"普诺赛中文站\"\n\n# 临时覆盖 whisper 初始提示词 + 额外参数\nvideo-pipeline --whisper-initial-prompt \"细胞冻存,复苏\" --whisper-extra-args \"--beam_size 10 --verbose\" --id 427\n```\n\n## 6.7 文件名去重\n\n脚本默认使用 `COL_ID`（即 `extra.id`）作为文件名 stem。当同一个 sheet 内出现重复 id 时，自动应用以下去重策略：\n\n| 优先级 | 格式 | 示例 |\n|--------|------|------|\n| 1 | `{id}` | `2143` |\n| 2 | `{id}_{title}` | `2143_产品介绍` |\n| 3 | `{id}_{title}_{platform}` | `2143_产品介绍_bilibili` |\n\n> 去重仅在同 sheet 内生效，不同 sheet 之间允许同名文件（存放在不同子目录）。\n\n## 6.8 进度显示\n\n执行时会同时展示**总体进度**和**单视频进度**：\n\n```text\n[1/91] [2143] 开始处理 (sheet=YouTube视频, platform=youtube, title=xxx)\n  [2143] 开始下载 (平台=youtube)\n  [2143] https://youtu.be/zzJmKPX8a3c\n  [2143] 解析页面...\n  [2143] 15.2% 2.50MiB/s ETA 00:17          ← 下载实时进度\n  [2143] 45.8% 3.12MiB/s ETA 00:08\n  [2143] 下载完成 -> 2143.mp4\n  [2143] 开始转码 -> 2143.wav\n  [2143] 25.3% (38s/150s)                    ← 转码进度 + 时长比\n  [2143] 50.1% (75s/150s)\n  [2143] 转码完成\n  [2143] 开始识别 (文件 45.2MB)...\n  [2143] 识别中... 5s                        ← 识别每 5s 报时\n  [2143] 识别完成 (22s, 1234 字符)\n  [2143] AI 分析中... 5s                     ← AI 每 5s 报时\n  [2143] AI 分析中... 10s\n  [2143] AI 分析完成 (567 字符)\n\n[总进度 1/91 (1.1%)] ✅1 ❌0 ⚠️0 ⏭️0         ← 每完成一个刷新\n```\n\n| 层级 | 显示内容 |\n|------|----------|\n| 总体进度 | 完成/总任务数、百分比、✅成功 ❌失败 ⚠️部分 ⏭️无视频 四维计数 |\n| 下载 | yt-dlp 实时百分比 + 速度 + ETA |\n| 转码 | 先 ffprobe 取时长，再用 `-progress pipe:1` 读 `out_time_us` 算百分比（如 `25.3% (38s/150s)`） |\n| 识别 | 每 5s 打印已用时间，完成时显示总耗时和文本长度 |\n| AI 分析 | 每 5s 打印已用时间，完成时显示结果长度或失败原因 |\n\n**并发下的进度隔离**（v1.6 修复）\n\n- **每任务独立进度状态**：转码进度解析器由工厂函数为每个任务创建独立状态（Python `make_ffmpeg_parser` / JS `makeFfmpegProgressParser`），不再共用模块级全局变量。此前 `--concurrency 2+` 时多个转码任务会互相污染百分比（出现跳 0 或倒退）。\n- **终端刷新加锁**：Python 端 `update_line` / `clear_line` / `Spinner` 的单行刷新统一由 `_term_lock` 串行化，避免并发时 ANSI 转义序列交错导致乱码。JS 为单线程事件循环，`process.stderr.write` 本身原子，无需额外加锁。\n- **模型加载去重**：Python 的 faster-whisper / FunASR 模型缓存采用双检锁（`_model_load_lock`），并发转录时只加载一次模型，不会重复下载或重复构造。\n\n---\n\n# 七、输出结构速查表\n\n五种输入来源在不同处理环节的输出路径汇总如下。所有路径均以 `output/` 为根，可通过 **`OUTPUT_DIR` 环境变量** 或 **`--output <dir>` CLI 参数** 整体覆盖（CLI > env > 默认 `output`）。子目录名（`downloads/` `transcoded/` `transcripts/` `keywords/` `reports/` `progress/` `logs/`）由代码硬编码，不支持单独覆盖。\n\n> `{sheet}` = Excel 工作表名（如 `YouTube视频`、`普诺赛中文站`）\n> `{platform}` = 视频平台标识（如 `youtube`、`bilibili`、`tencent`、`youku`）\n> `{stem}` = 去重后的安全文件名（不含扩展名）\n\n## 7.1 ① Excel 批量模式（默认）\n\n| 环节 | 输出路径 | 产物格式 | 说明 |\n|------|---------|---------|------|\n| 下载 | `output/downloads/{sheet}/{stem}.mp4` | 视频 | yt-dlp 下载原始视频 |\n| 转码 | `output/transcoded/{sheet}/{stem}.wav` | 音频 | ffmpeg 转 16kHz mono WAV |\n| 识别 | `output/transcripts/{sheet}/{stem}.txt` | 文本 | whisper 识别原文（断点续跑校验依据，< `MIN_TRANSCRIPT_CHARS` 视为残缺） |\n| AI 关键词 | `output/keywords/{sheet}/{stem}.txt` | 文本 | AI 关键词归纳结果（断点续跑校验依据，< `MIN_KEYWORDS_CHARS` 视为残缺） |\n| 进度 | `output/progress/{sheet}/task_{stem}.json` | JSON | 单任务增量进度（每步完成立即写入，断电可续） |\n| JSON 报告 | `output/reports/{sheet}/report_YYYYMMDD_HHMMSS.json` | JSON | 机器可读，含 summary + failed_items，可供 --retry-failed 重跑 |\n| 文本报告 | `output/reports/{sheet}/tasks/{stem}.txt` | 文本 | 人类可读，含语音识别原文 + AI 关键词分析 |\n| 运行日志 | `output/logs/` | 文本 | console-ui / 步骤日志（按时间戳） |\n\n> 多 sheet 同时执行时，每个 sheet 独立一个子目录，互不干扰。\n\n## 7.2 ② --url 直链模式\n\n> 支持**多个 URL**（可多次指定，或逗号/空格/中文逗号分隔），逐条下载处理。多 URL 时 `--name` 被忽略，每条使用各自解析出的文件名。\n\n| 环节 | 输出路径 | 产物格式 | 说明 |\n|------|---------|---------|------|\n| 下载 | `output/downloads/{platform}/{name}.mp4` | 视频 | yt-dlp 下载单个视频 |\n| 转码 | `output/transcoded/{platform}/{name}.wav` | 音频 | ffmpeg 转 16kHz mono WAV |\n| 识别 | `output/transcripts/{platform}/{name}.txt` | 文本 | whisper 识别原文 |\n| AI 关键词 | `output/keywords/{platform}/{name}.txt` | 文本 | AI 关键词归纳结果 |\n| 进度 | `output/progress/{platform}/task_{name}.json` | JSON | 单任务增量进度 |\n| JSON 报告 | `output/reports/{platform}/report_YYYYMMDD_HHMMSS.json` | JSON | 格式与 Excel 模式一致 |\n| 文本报告 | `output/reports/{platform}/tasks/{name}.txt` | 文本 | 含识别原文 + AI 分析 |\n\n> `{platform}` 由脚本自动从 URL 解析，如 `https://www.youtube.com/watch?v=xxx` → `youtube`。\n>\n> **多 URL 示例**：\n> ```\n> # 多次指定\n> --url \"https://youtu.be/aaa\" --url \"https://youtu.be/bbb\"\n> # 逗号分隔\n> --url \"https://youtu.be/aaa,https://youtu.be/bbb\"\n> # 空格分隔（Git Bash / Linux）\n> --url \"https://youtu.be/aaa https://youtu.be/bbb\"\n> ```\n\n## 7.3 ③ --input 本地文件模式\n\n> 支持**多个本地文件**（可多次指定，或逗号/空格/中文逗号分隔），逐条处理。多文件时 `--name` 被忽略，每个文件使用自己的文件名。\n\n| 环节 | 输出路径 | 产物格式 | 说明 |\n|------|---------|---------|------|\n| 下载 | —（跳过） | — | 本地文件无需下载 |\n| 转码 | `output/transcoded/local/{stem}.wav` | 音频 | ffmpeg 转 16kHz mono WAV |\n| 识别 | `output/transcripts/local/{stem}.txt` | 文本 | whisper 识别原文 |\n| AI 关键词 | `output/keywords/local/{stem}.txt` | 文本 | AI 关键词归纳结果 |\n| 进度 | `output/progress/local/task_{stem}.json` | JSON | 单任务增量进度 |\n| JSON 报告 | `output/reports/local/report_YYYYMMDD_HHMMSS.json` | JSON | 格式与 Excel 模式一致（含所有文件汇总） |\n| 文本报告 | `output/reports/local/tasks/{stem}.txt` | 文本 | 含识别原文 + AI 分析 |\n\n> `local` 是 `--input` 模式的固定目录名（与 Excel 模式的 sheet 名无关），所有本地文件处理结果统一归入此目录。\n>\n> **多文件示例**：\n> ```\n> # 多次指定\n> --input \"videos/a.mp4\" --input \"videos/b.mp4\"\n> # 逗号分隔\n> --input \"videos/a.mp4,videos/b.mp4\"\n> ```\n\n## 7.4 ④ --content 纯文本模式\n\n| 环节 | 输出路径 | 产物格式 | 说明 |\n|------|---------|---------|------|\n| 下载 | —（跳过） | — | 无需下载 |\n| 转码 | —（跳过） | — | 无需转码 |\n| 识别 | —（跳过） | — | 无需语音识别 |\n| AI 关键词 | `output/keywords/content/{stem}.txt` | 文本 | AI 关键词归纳结果 |\n| 进度 | `output/progress/content/task_{stem}.json` | JSON | 单任务增量进度 |\n| JSON 报告 | `output/reports/content/report_YYYYMMDD_HHMMSS.json` | JSON | 格式与 Excel 模式一致 |\n| 文本报告 | `output/reports/content/tasks/{stem}.txt` | 文本 | 含源内容 + AI 关键词分析 |\n\n> `content` 是固定目录名。{stem} = `--name` 值 > 文件名 stem > 内联文本前 32 字符。\n\n## 7.5 ⑤ --content-column Excel列文本批量模式\n\n| 环节 | 输出路径 | 产物格式 | 说明 |\n|------|---------|---------|------|\n| 下载 | —（跳过） | — | 无需下载 |\n| 转码 | —（跳过） | — | 无需转码 |\n| 识别 | —（跳过） | — | 无需语音识别 |\n| AI 关键词 | `output/keywords/{sheet}/{stem}.txt` | 文本 | AI 关键词归纳结果 |\n| 进度 | `output/progress/{sheet}/task_{stem}.json` | JSON | 单任务增量进度 |\n| JSON 报告 | `output/reports/{sheet}/report_YYYYMMDD_HHMMSS.json` | JSON | 按 Excel sheet 分目录，格式与 Excel 模式一致 |\n| 文本报告 | `output/reports/{sheet}/tasks/{stem}.txt` | 文本 | 含列文本 + AI 关键词分析 |\n| Excel 写回 | `{EXCEL_FILE}` 的 `keywords` 列 | Excel | AI 关键词写入 Excel |\n\n> 此模式自动设置 `--step analyze`，下载/转码/识别全跳过。AI 结果同时写入 Excel 和报告文件。\n\n## 7.6 五种来源对比一览\n\n| 维度 | Excel 批量 | --url 直链 | --input 本地文件 | --content 纯文本 | --content-column 列文本 |\n|------|-----------|-----------|-----------------|-----------------|------------------------|\n| 输入 | Excel 行（多视频批量） | 单个视频 URL | 本地视频/音频文件 | 文件路径或内联文本 | Excel 列的已有文本 |\n| 下载 | ✅ yt-dlp | ✅ yt-dlp | ❌ 跳过 | ❌ 跳过 | ❌ 跳过 |\n| 转码 | ✅ ffmpeg | ✅ ffmpeg | ✅ ffmpeg | ❌ 跳过 | ❌ 跳过 |\n| 识别 | ✅ whisper | ✅ whisper | ✅ whisper | ❌ 跳过 | ❌ 跳过 |\n| AI 分析 | ✅ | ✅ | ✅ | ✅ | ✅ |\n| 下载目录 | `downloads/{sheet}/` | `downloads/{platform}/` | 无 | 无 | 无 |\n| 转码目录 | `transcoded/{sheet}/` | `transcoded/{platform}/` | `transcoded/local/` | 无 | 无 |\n| 识别目录 | `transcripts/{sheet}/` | `transcripts/{platform}/` | `transcripts/local/` | 无 | 无 |\n| 关键词目录 | `keywords/{sheet}/` | `keywords/{platform}/` | `keywords/local/` | `keywords/content/` | `keywords/{sheet}/` |\n| 进度目录 | `progress/{sheet}/` | `progress/{platform}/` | `progress/local/` | `progress/content/` | `progress/{sheet}/` |\n| 报告目录 | `reports/{sheet}/` | `reports/{platform}/` | `reports/local/` | `reports/content/` | `reports/{sheet}/` |\n| 分组依据 | Excel sheet 名 | URL 解析的平台名 | 固定 `local` | 固定 `content` | Excel sheet 名 |\n| 并发支持 | ✅ 多线程 | ❌ 单任务 | ❌ 单任务 | ❌ 单任务 | ✅ 多线程 |\n| 写入 Excel | ✅ | ❌ | ❌ | ❌ | ✅ |\n| 支持 --retry-failed | ✅ | ❌ | ❌ | ❌ | ❌ |\n| 适用场景 | 批量处理全流程 | 临时下载单个视频 | 处理已有视频文件 | 已有文本直接分析 | 批量分析Excel中的文本 |\n\n## 7.7 JSON 报告结构\n\n```json\n{\n  \"timestamp\": \"2026-06-10T14:30:00\",\n  \"config\": { \"concurrency\": 3, \"retry\": 3 },\n  \"summary\": {\n    \"total\": 91,\n    \"success\": 85,\n    \"partial\": 3,\n    \"failed\": 2,\n    \"no_video\": 1\n  },\n  \"failed_items\": [\n    {\n      \"sheet\": \"普诺赛中文站\",\n      \"id\": \"427\",\n      \"title\": \"xxx视频\",\n      \"download_error\": \"HTTP Error 403\",\n      \"transcode_error\": null,\n      \"transcribe_error\": null\n    }\n  ]\n}\n```\n\n### 状态含义\n\n- **success**：下载 + 转码 + 识别全部成功（AI 分析失败不影响此状态）\n- **partial**：下载 + 转码成功，识别或 AI 分析失败\n- **failed**：下载或转码失败\n- **no_video**：该行无可用视频 ID\n\n---\n\n# 八、典型工作流\n\n## 场景一：Excel 批量处理视频\n\n```bash\n# 1. 干跑预览\nnode process_videos.js --dry-run\n# 或 Python 版本\npython process_videos.py --dry-run\n\n# 2. 单条验证\nnode process_videos.js --sheet \"YouTube视频\" --id 2143 --retry 2\n\n# 3. 全量执行\nnode process_videos.js --concurrency 3 --retry 3\n\n# 4. 查看报告，重跑失败项\nnode process_videos.js --retry-failed reports/YouTube视频/report_xxx.json --concurrency 2 --retry 3\n```\n\n## 场景二：临时下载单个视频\n\n```bash\n# 从 URL 下载 → 转码 → 识别 → AI 分析，一条龙\nnode process_videos.js --url \"https://www.youtube.com/watch?v=zzJmKPX8a3c\"\n\n# 指定输出文件名\nnode process_videos.js --url \"https://www.bilibili.com/video/BV1xx411c7mD\" --name \"产品介绍视频\"\n```\n\n## 场景三：处理本地视频文件\n\n```bash\n# 已有视频文件，直接转码分析\nnode process_videos.js --input \"downloads/产品介绍.mp4\"\n\n# 只做 AI 分析（已有转码+识别结果）\nnode process_videos.js --input \"downloads/产品介绍.mp4\" --step analyze\n```\n\n## 场景四：纯文本 AI 分析\n\n```bash\n# 已有文本内容，跳过所有视频步骤，直接做关键词提取\nnode process_videos.js --content \"data/article.txt\"\n\n# 内联文本直接分析\nnode process_videos.js --content \"今天我们要讨论的是普诺赛产品...\" --name \"产品讨论\"\n```\n\n## 场景五：批量分析 Excel 中的已有文本\n\n```bash\n# Excel 某列已有文本（如爬虫爬取的），批量做 AI 关键词分析\nnode process_videos.js --content-column \"content\" --dry-run      # 先预览\nnode process_videos.js --content-column \"content\" --concurrency 2  # 执行\n```\n\n---\n\n# 九、平台适配说明\n\n脚本支持四个视频平台的下载，各有不同的反爬配置：\n\n| 平台 | 字段 | 反爬措施 |\n|------|-------|----------|\n| B站 (bilibili) | `extra.bilibili` | Chrome UA + Referer 头 + 有效 cookie + 并发分片 |\n| YouTube | `extra.youtube` | Chrome UA + Firefox cookie 直读 + 代理 + Node.js 解 n-sig |\n| 腾讯视频 | `extra.tencent` | 无需特殊配置 |\n| 优酷 | `extra.youku` | 无需特殊配置（部分视频需会员） |\n\n> YouTube 反爬最强：需要 **代理** + **登录态 cookie** + **JS runtime 解 n-sig** 三者配合。\n> 脚本会自动给 yt-dlp 及其 node/ejs 子进程注入 `HTTPS_PROXY` 环境变量，确保所有流量走代理。\n\n## 9.1 各平台 URL 格式与视频 ID 提取\n\n脚本通过 `{平台}_URL_TPL` 生成下载链接，支持 yt-dlp 能识别的所有 URL 格式。\n下表列出各平台「标准页面 / 内嵌链接 / 短链接」格式及视频 ID 提取正则，方便从完整 URL 中解析视频 ID。\n\n### YouTube\n\n| 格式类型 | URL 示例 | 视频 ID 提取正则 |\n|----------|-----------|-------------------|\n| 标准观看页 | `https://www.youtube.com/watch?v=VIDEO_ID` | `youtube\\.com/watch\\?v=([a-zA-Z0-9_-]{11})` |\n| 短链接 | `https://youtu.be/VIDEO_ID` | `youtu\\.be/([a-zA-Z0-9_-]{11})` |\n| Shorts | `https://www.youtube.com/shorts/VIDEO_ID` | `youtube\\.com/shorts/([a-zA-Z0-9_-]{11})` |\n| 内嵌页 | `https://www.youtube.com/embed/VIDEO_ID` | `youtube\\.com/embed/([a-zA-Z0-9_-]{11})` |\n| 直播 | `https://www.youtube.com/live/VIDEO_ID` | `youtube\\.com/live/([a-zA-Z0-9_-]{11})` |\n\n- **视频 ID 格式**：11 位字符（大小写字母 + 数字 + `-` + `_`）\n- **统一提取正则**（覆盖所有格式）：\n  ```\n  (?:youtube\\.com\\/(?:watch\\?v=|embed\\/|shorts\\/|live\\/)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})\n  ```\n- **格式互转**：\n  - 标准 → 短链接：提取 `VIDEO_ID` → `https://youtu.be/VIDEO_ID`\n  - 标准 → 内嵌：提取 `VIDEO_ID` → `https://www.youtube.com/embed/VIDEO_ID`\n  - Shorts → 标准：提取 `VIDEO_ID` → `https://www.youtube.com/watch?v=VIDEO_ID`\n\n### B站（bilibili）\n\n| 格式类型 | URL 示例 | 视频 ID 提取正则 |\n|----------|-----------|-------------------|\n| 标准页（BV 号） | `https://www.bilibili.com/video/BV1xx411c7mD` | `bilibili\\.com\\/video\\/(BV[a-zA-Z0-9]{10})` |\n| 标准页（av 号） | `https://www.bilibili.com/video/av170001` | `bilibili\\.com\\/video\\/av(\\d+)` |\n| 短链接 | `https://b23.tv/BV1xx411c7mD` | `b23\\.tv\\/(BV[a-zA-Z0-9]{10})` |\n| 内嵌页 | `https://player.bilibili.com/player.html?bvid=BV1xx411c7mD&cid=CID` | `bvid=(BV[a-zA-Z0-9]{10})` |\n| 移动端 | `https://m.bilibili.com/video/BV1xx411c7mD` | `m\\.bilibili\\.com\\/video\\/(BV[a-zA-Z0-9]{10})` |\n\n- **BV 号格式**：`BV` + 10 位字符（大小写敏感）\n- **统一提取正则**：\n  ```\n  bilibili\\.com\\/video\\/(BV[a-zA-Z0-9]{10})|bvid=(BV[a-zA-Z0-9]{10})\n  ```\n- **格式互转**：\n  - 标准 → 内嵌：提取 `BV_ID` 后需通过 B站 API 获取 `cid`\n    → `https://api.bilibili.com/x/player/pagelist?bvid=BV_ID` 获取 cid\n    → 内嵌 URL：`https://player.bilibili.com/player.html?bvid=BV_ID&cid=CID&page=1`\n  - BV 号 → av 号：需调用 API（`https://api.bilibili.com/x/web-interface/view?bvid=BV_ID` 返回 `aid`）\n\n### 腾讯视频\n\n| 格式类型 | URL 示例 | 视频 ID 提取正则 |\n|----------|-----------|-------------------|\n| 标准页（x/page） | `https://v.qq.com/x/page/VIDEO_ID.html` | `v\\.qq\\.com\\/x\\/page\\/([a-zA-Z0-9]+)\\.html` |\n| 标准页（x/cover） | `https://v.qq.com/x/cover/COVER/VIDEO_ID.html` | `v\\.qq\\.com\\/x\\/cover\\/[^\\/]+\\/([a-zA-Z0-9]+)\\.html` |\n| 内嵌页 | `https://v.qq.com/txp/iframe/player.html?vid=VIDEO_ID` | `[?&]vid=([a-zA-Z0-9]+)` |\n| 移动端 | `https://m.v.qq.com/x/mv.xhtml?vid=VIDEO_ID` | `[?&]vid=([a-zA-Z0-9]+)` |\n\n- **视频 ID 格式**：字母 + 数字组合（如 `o0325y3hqh`，长度不固定）\n- **统一提取正则**：\n  ```\n  v\\.qq\\.com\\/(?:x\\/page\\/|x\\/cover\\/[^\\/]+\\/)([a-zA-Z0-9]+)\\.html|[?&]vid=([a-zA-Z0-9]+)\n  ```\n- **格式互转**：\n  - 标准 → 内嵌：提取 `VIDEO_ID` → `https://v.qq.com/txp/iframe/player.html?vid=VIDEO_ID`\n\n### 优酷（Youku）\n\n| 格式类型 | URL 示例 | 视频 ID 提取正则 |\n|----------|-----------|-------------------|\n| 标准页（v_show） | `https://v.youku.com/v_show/id_VIDEO_ID.html` | `v\\.youku\\.com\\/v_show\\/id_([a-zA-Z0-9=]+)\\.html` |\n| 标准页（video） | `https://v.youku.com/video/VIDEO_ID` | `v\\.youku\\.com\\/video\\/([a-zA-Z0-9=]+)` |\n| 标准页（www） | `https://www.youku.com/v_show/id_VIDEO_ID.html` | `www\\.youku\\.com\\/v_show\\/id_([a-zA-Z0-9=]+)\\.html` |\n\n- **视频 ID 格式**：旧格式 `X` + Base64 字符串（可能含 `=` 填充）；新格式长度不固定\n- **统一提取正则**：\n  ```\n  v\\.youku\\.com\\/v_show\\/id_([a-zA-Z0-9=]+)\\.html|v\\.youku\\.com\\/video\\/([a-zA-Z0-9=]+)\n  ```\n- **格式互转**：\n  - 优酷内嵌格式较复杂，建议直接使用标准页链接（`{YOUKU_URL_TPL}`）\n\n> **脚本使用提示**：Excel 中只需填入视频 ID（如 `zzJmKPX8a3c`、`BV1pg411b7Ug`、`o0325y3hqh`、`XMzgxNzExNTY4MA==`），脚本自动替换 URL 模板中的 `{youtube}`、`{bilibili}` 等占位符生成下载链接。\n\n## 9.2 常见下载错误\n\n| 错误 | 平台 | 原因 | 解决方案 |\n|------|------|------|----------|\n| `Sign in to confirm you're not a bot` | YouTube | cookie 过期或无效 | 检查 Firefox 登录态，或重新导出 cookie 文件 |\n| `cookies does no longer seem to be valid` | YouTube | cookie 文件超过 48h | 用 Firefox cookies-from-browser 方案（免维护） |\n| `Unable to download webpage: HTTP Error 403` | YouTube | IP 被识别为非 YouTube 地区 | 确保代理运行，核对 `YOUTUBE_PROXY` 端口 |\n| `Unable to connect to proxy ... [WinError 10061] 目标计算机积极拒绝` | 任意 | `{平台}_PROXY` 端口没有服务监听（**换代理客户端后端口变了**） | 见「工具预检 · 代理预检」定位实际混合端口；预检会在开跑前直接拦下 |\n| **N 条任务全部下载失败**（国内站正常、只有国外站失败） | YouTube | 大概率是代理端口失效，而非 cookie/格式问题 | 先 `--step download --dry-run` 看代理预检是否 ✅，再排查 cookie |\n| `n challenge solving failed` | YouTube | 无 JS 运行时 | 安装 Node.js，确保 `YOUTUBE_JS_RUNTIMES=node` |\n| `Requested format is not available` | YouTube | n-sig 未解开，格式不可用 | 同上，安装 JS 运行时 |\n| `HTTP Error 412` | B站 | 缺少 Chrome UA 或 cookie 过期 | 重新导出 `cookies/bilibili.txt` 或使用 Firefox 直读 |\n| `HTTP Error 403` | B站 | 地区限制或视频已删除 | 检查视频是否可访问 |\n| `dpapi decryption failed` | YouTube | Windows Chrome cookie 加密 | **改用 Firefox**（`.env` 中设 `YOUTUBE_COOKIES_FROM_BROWSER=firefox`） |\n\n---\n\n# 十、换电脑与多项目适配\n\n## 10.1 换电脑使用\n\n### Node.js 版本\n\n1. 安装 Node.js (18+)：[nodejs.org](https://nodejs.org/)\n2. 安装视频处理工具：\n   ```bash\n   npm install -g video-pipeline\n   ```\n3. 克隆或下载项目文件（`.env.example`、`.env`、`cookies/` 等）\n4. 安装必装工具：`yt-dlp`、`ffmpeg`、`ffprobe`，确保均在 PATH\n5. 用 Firefox 登录 YouTube，设置 `YOUTUBE_COOKIES_FROM_BROWSER=firefox`\n6. B站 cookie 仍需手动导出 `cookies/bilibili.txt`（或设置 `BILIBILI_COOKIES_FROM_BROWSER=firefox`）\n7. 启动代理（Clash Verge 等），把 `YOUTUBE_PROXY` 改成代理客户端**实际监听**的混合/HTTP 端口\n8. `video-pipeline --step download --dry-run` 验证（重点看「代理: ✅」那一行）\n\n### Python 版本\n\n1. 安装 Python 3.9+：[python.org](https://www.python.org/)\n2. 安装必装工具：`yt-dlp`、`ffmpeg`、`ffprobe`，确保均在 PATH\n3. 安装 Python 依赖：`pip install pandas openpyxl requests python-dotenv questionary`\n4. `cp .env.example .env`，根据实际情况修改 `.env` 中的路径、代理端口和字段映射\n5. 用 Firefox 登录 YouTube，设置 `YOUTUBE_COOKIES_FROM_BROWSER=firefox`\n6. B站 cookie 仍需手动导出 `cookies/bilibili.txt`（或设置 `BILIBILI_COOKIES_FROM_BROWSER=firefox`）\n7. 启动代理（Clash Verge 等），把 `YOUTUBE_PROXY` 改成代理客户端**实际监听**的混合/HTTP 端口\n8. `python process_videos.py --step download --dry-run` 验证（重点看「代理: ✅」那一行）\n\n## 10.2 适配其他 Excel\n\n如果需要用这套脚本处理**其他项目的 Excel**（列名不同、平台不同）：\n\n**方法一：修改 .env 文件**\n\n1. 复制 `.env.example` 为新 `.env`（或修改现有 `.env`）\n2. 修改 `EXCEL_FILE` 指向新 Excel\n3. 修改列映射（`COL_ID`、`COL_TITLE`、`COL_CONTENT` 及各平台列名）\n4. 修改 `VIDEO_SHEETS` 为新的 sheet 名称\n5. 如需新平台，在 `PLATFORM_PRIORITY` 中添加 key，并配置对应的 `{KEY}_URL_TPL`\n6. `node process_videos.js --dry-run` 验证配置\n7. 跑全量\n\n**方法二：使用 --file 选项（推荐）**\n\n```bash\n# 直接指定 Excel 文件，无需修改 .env\nnode process_videos.js --file \"data/其他项目.xlsx\" --dry-run\n\n# 配合 --env-file 使用自定义环境变量\nnode process_videos.js --file \"data/其他项目.xlsx\" --env-file \".env.其他项目\" --dry-run\n```\n\n**优点：**\n- 无需修改 `.env` 文件\n- 可以为不同项目创建不同的 `.env` 配置文件\n- 命令行优先级高于环境变量\n","readmeFilename":"README.md"}