{"_id":"@dummy3ye/yanker","_rev":"14-6a121f2dbfd0c64ca27272b3c6c8fdfe","name":"@dummy3ye/yanker","dist-tags":{"latest":"2.4.5"},"versions":{"0.1.0":{"name":"@dummy3ye/yanker","version":"0.1.0","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"MIT","_id":"@dummy3ye/yanker@0.1.0","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"22c59d4fea715be74d72368e76b4a79650893650","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-0.1.0.tgz","fileCount":3,"integrity":"sha512-qE0EBt2EDy1t2Qcpeab3cTIX2+NMmyM/kuERmEhxZuYZXFVJlvpKC8ekp8e7Ku3ZSGdzqa7NcAD0W4yI8Ukf0w==","signatures":[{"sig":"MEYCIQCTPGu583EKv6dc646MCZRTBUKz8ll9QmUdus1blHQBBAIhAKvWqy3PA96KFENV5zIC4HVP60fNIy7VV1LLPTnC5CKB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60678},"type":"module","engines":{"node":">=18"},"gitHead":"160f98c46e5e75f1408cf2b899df92712185499c","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","build":"tsup","start":"node dist/cli.js","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"12.0.2","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"26.8.2","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0","ink-select-input":"^6.2.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^7.0.2","@types/node":"^26.1.1","@types/react":"^19.2.17"},"_npmOperationalInternal":{"tmp":"tmp/yanker_0.1.0_1789204451513_0.8941274370384285","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@dummy3ye/yanker","version":"1.0.0","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"MIT","_id":"@dummy3ye/yanker@1.0.0","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"5633882967b2acac2647cbc40b3300c8a1667c99","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-1.0.0.tgz","fileCount":3,"integrity":"sha512-q4kYeMv5Ja+UGK8og1NdnhlZnnDosTXfsfVrPxuQoMxyxZXHXd9FM56EAUXzbb0AR0d4P3FSZ9nxDZZx9k5xRw==","signatures":[{"sig":"MEQCIElj9hAnkeRw5dtlFJgejvovlwwMZCUJEDeDqd4j+UgHAiBwd6cbyvUICNzsuHy4FUrbTmA65+FTIsC+900pKruIXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62576},"type":"module","engines":{"node":">=18"},"gitHead":"7b6ce8438491c8639b64c4d082c3086366b57480","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.2","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0","ink-select-input":"^6.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_1.0.0_1789207239913_0.5172815953245469","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@dummy3ye/yanker","version":"1.0.1","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"MIT","_id":"@dummy3ye/yanker@1.0.1","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"c238aead96257c78e81af187db4bc24cc2921854","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-1.0.1.tgz","fileCount":3,"integrity":"sha512-ruj4qmDuLaqGbcAYu3hYMsfDM5dgbRkvxZmr2axdrHsG3ZEmsZQCJoQR5OIFgVHb6nVfr6Ox5JGOmmn4Xdb0/Q==","signatures":[{"sig":"MEUCIQCOhaBlcRrZy2sr2zLnRbtwrVBXhzMBEU9MOiTr6ATGOQIgew5pZqc9xDjijKcCmJsLjSaUbSrOGHZbgH+CHYFS3DU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62620},"type":"module","engines":{"node":">=18"},"gitHead":"84772243894c3884d814fc83f7d8268b3a0e0d24","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.2","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0","ink-select-input":"^6.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_1.0.1_1789207533985_0.8206456389105565","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@dummy3ye/yanker","version":"2.0.0","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"MIT","_id":"@dummy3ye/yanker@2.0.0","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"780f8dfadbb36fd39cbb769363ee025120af0b55","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.0.0.tgz","fileCount":4,"integrity":"sha512-Db1xQ13+eiGof5QbIl5PBM1D28XMYQqydlNWbbxI8KeRnBzUhtJrKZVEAo7FmGkkVLk50+OfhoC9azqak4U/ag==","signatures":[{"sig":"MEQCICw7Ey/A0GpwO90upb1sJuczL0WTloMCYz93idixQTKeAiAaTylm04QTo0wKmP3W3a8yfgwXRK5K/s7YB+yZvo3ZhA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCHp7mLpdp+tkNRyYXlP+3lkszBpSaI/AxUxa0Up8xbrAIgVYvTpCaxHodwYQ6JWtPGnXpkW2ppnYaBNgZqnk21Qdg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65272},"type":"module","engines":{"node":">=22"},"gitHead":"a204946ccbd940e5184be1c2fcbaba9f11a2f5dc","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.2","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_2.0.0_1789903841575_0.8037791149346698","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@dummy3ye/yanker","version":"2.1.0","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"Unlicense","_id":"@dummy3ye/yanker@2.1.0","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"32393383ba174102ff5a64771833758a80c7e278","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.1.0.tgz","fileCount":6,"integrity":"sha512-CusUqmONF+1pwaurHJivxQrRRBknr6cKhUCa17aD9rPlKwwKF/+b3G0picPf13XuuF5ElVEDEepzU/CokDUsOw==","signatures":[{"sig":"MEUCIC8Wm/QUPwXEhF21NBkT4EZ1Zq4eqL+7nmpnnEX011uNAiEA8tFAGsN6THLSbq87tD4w8N2Slbp9CH6XXDo2g6n8FTc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQClT0KdjThPfroZj+IdaZ7+zqld7bpkBFVqZ4FLXxmUTgIhAJqQEr1Q5vvdbXdZCct5rKQ6fvllalfbVtqEt/3rp3nr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72982},"type":"module","engines":{"node":">=22"},"gitHead":"26d21345792cb02f4d37612c0e5bf31a3527a2c4","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.2","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_2.1.0_1789931095197_0.16431273548206837","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@dummy3ye/yanker","version":"2.2.0","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"Unlicense","_id":"@dummy3ye/yanker@2.2.0","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"c73feb70484076581c8d204e091492976e44a2f0","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.2.0.tgz","fileCount":6,"integrity":"sha512-AhroybMOxPrMqdJynlDcgFs8FervwI7n9Fg8Ly/nwEkiv6lLHJ2IsP5msSf2WABD0FA62yTDwW1jBgveTKrd7A==","signatures":[{"sig":"MEUCIDJq6dLYoQ6xWpuHccTr4Wn5++3Kz1125uVxsZE+tkqnAiEAz8Gn8zJZrdaSm174aTETlkDcOhSJNpwOietqj4en4LQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCbfbSKmW7rV8Bhf70IZKjl5E7+9IPy1TX27a2TyhsORwIhAJGO1NihBZpds7ZQqwHVjCtTGjgKAme0O/t9T5ZTBYye","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72978},"type":"module","engines":{"node":">=22"},"gitHead":"ccabcba4818af83ab45463ade76fe35416a5c49d","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.2","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_2.2.0_1790018754615_0.730494606658517","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@dummy3ye/yanker","version":"2.3.0","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"Unlicense","_id":"@dummy3ye/yanker@2.3.0","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"c8bec32177da44ecd6e7ae1972551bb6fc25ce6f","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.3.0.tgz","fileCount":7,"integrity":"sha512-38IRxagDwGt9FRwl7b4KhNNrUBKwdOqXoKdEq4Orud/62LFSW5GjL6G7prRNbyJurbpJ9frUQV7vkyXqeSmCVw==","signatures":[{"sig":"MEQCIG+HvQE3LxWuDCGS2EuMrjM6u6Z8oDLlXvAiQObPh96PAiAyFVolABl09NSi0UxH3/Iz2kOZP//gZZLh9qNR7Fcuag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIARcyiva91jTS2D4/Kz8uDeCHODZK4rtpWsItjOUas2gAiEA4MGw1jUNlTBiR6QLgx+tV/BqFMIaivYyTcdyZh9Wkng=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84513},"type":"module","engines":{"node":">=22"},"gitHead":"171ec3e1c790752195fe340eca8914f61c4876c8","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","postinstall":"node scripts/postinstall.js","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.2","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_2.3.0_1790027660161_0.11380006016201705","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"@dummy3ye/yanker","version":"2.3.1","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"Unlicense","_id":"@dummy3ye/yanker@2.3.1","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"a03157ad0167f49cf66e7884786fe16fddf88ce3","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.3.1.tgz","fileCount":7,"integrity":"sha512-jCPDtMBANuZ7/wObzFJfoi22wPNIQj6+iELTaVM1gfXtS025KJK2sZgX2oeYMxs6rYVXQJ7bqkSiybwVDm4mKA==","signatures":[{"sig":"MEQCIHedl9uWTPEbW8idEcRizS/sYaAVuZBaAKiy1I0CqTrEAiAeBkvN7xXWApsjzyt4uCjUR0VA6dShjHXi3ck0KXVxEw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD/olAf+H2zjDPGs2OI7g69k3UMkKH6vyX01D5LYO5b/AIhALO9FDd6/2lVS5YsBzpHyTJYgD+ZlHh7mKVYwP8mJXQQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84613},"type":"module","engines":{"node":">=22"},"gitHead":"2c22dec2e9d1eb5cd7bd81eef6230b1d9b334fb5","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","postinstall":"node scripts/postinstall.js","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.2","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_2.3.1_1790028502494_0.05326581684775267","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@dummy3ye/yanker","version":"2.4.0","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"Unlicense","_id":"@dummy3ye/yanker@2.4.0","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"5dcee1e2b480a65eb15b5f73a1e1a8593739af01","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.4.0.tgz","fileCount":7,"integrity":"sha512-Y3Tjfez3Im8XhrHj9INIS5j+F4IB+2frvf54cQhXFTu4NF2xxCWOlCz7fFKtqK/ZAFfcLe5hkluZgTRx83PRyw==","signatures":[{"sig":"MEYCIQC04FyYfzfFY38P5PoASFP4zSJqhaanA/2oRQUzIuZJkQIhAOYcADsix4/vQze4oCZfNfKQEOAeSskSpiBlGouhEjr3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDtyYShEKlkHK5vxHN9/z1Q4RotDoVVWDza600cFVTQOgIhAI943twJJu9F8+FE51D/i/la9mnLm39J0rURyYUBC2aK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84626},"type":"module","engines":{"node":">=22"},"gitHead":"41a673fb34af0c9e7f70b2d3224476711b6f791e","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","postinstall":"node scripts/postinstall.js","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.2","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_2.4.0_1790076396388_0.309893689626662","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"@dummy3ye/yanker","version":"2.4.1","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"Unlicense","_id":"@dummy3ye/yanker@2.4.1","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"6a498f5ebcc8a87ff329b50668c584af451bd474","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.4.1.tgz","fileCount":7,"integrity":"sha512-X8xeJaEZ6tOSK24WJ2n9DJNywtqk7SRGoqVso3Q3DLd1HR0sJPcfYv0zL6vGznMRBcfRS1iYRqQEeX8Za6rjIw==","signatures":[{"sig":"MEUCIA8N5zyBE/XuBNQnlYTtVygxU2zc34OQ/Xr8Pw2Q0lPyAiEAuUICEQ9vxR4lg0KLFeuHUG0UE1OcdzOw78u+zvkc0AI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC11wgi+7RVaqHF8gSB3kOFH2TtlEwMOlBhJ5ta+eE5AgIhAOf2g/kvIYWGJ5U29YG8jzDzIsNNJzOgodqKGh4lijB4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85246},"type":"module","engines":{"node":">=22"},"gitHead":"fa54354701ea080a7d81386527a968181995a916","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","postinstall":"node scripts/postinstall.js","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.2","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_2.4.1_1790854226522_0.7728985538361735","host":"s3://npm-registry-packages-npm-production"}},"2.4.2":{"name":"@dummy3ye/yanker","version":"2.4.2","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"Unlicense","_id":"@dummy3ye/yanker@2.4.2","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"958889783b6a57bc78201c0d1a93f0cdf7bc9b05","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.4.2.tgz","fileCount":7,"integrity":"sha512-QpIWeYw/oj5hXJR7j7ftPeyZsin6/w9mxCpJKcxVh3NiR5KSVLxBmZTSjC/+dymsjgNoBh/Yk6igVNEWohb64A==","signatures":[{"sig":"MEUCIQCIO5G2ZkM1uMmlkRM7jB5mUswqEFGEno5vLkHTCxfbtwIgaD/nL4N0povs0V30cwClmNTD4SXAzATRRBuYIEUr8XE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDuiQbOJ3b2PKtpJnUoygE9VKhwBHHoi6c1zhXJtSQ9uAIhANbxXbz9QEzFWHfQ3oZ2kfzr4h8KQ0xqgGOVOPdAoeHp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88154},"type":"module","engines":{"node":">=22"},"gitHead":"08293ff05cff2d6c8c4897664de69e13bbbf853c","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","postinstall":"node scripts/postinstall.js","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.3","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_2.4.2_1790862555750_0.8700199664350559","host":"s3://npm-registry-packages-npm-production"}},"2.4.3":{"name":"@dummy3ye/yanker","version":"2.4.3","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"Unlicense","_id":"@dummy3ye/yanker@2.4.3","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"822c35d8e80e4afb2700667e28a6175db1f003b9","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.4.3.tgz","fileCount":7,"integrity":"sha512-n5gcbtXXpUjRjLv9+JQiAC35cZr+zXsQIG/ai/bwusApYFugbhKOo6byCQRREkwiqBzWv8bsGMHbOudwtRYWhA==","signatures":[{"sig":"MEUCIQCXcLjiQRDnREhJrys35c5pca29QgqduBwdjyPkhqicoAIgEyVjZsY2GObf9p2F3hpS4vkhpZZVMb4DCt78SaZNWQE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCbu3y1anQo7lfK9GyOTZK7bOXcRDJHv/YhIvIJw7fHSQIgcupICnzFUx65KSN9e3Eltcg6V94KLhWI/Xmfe4nve0M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88442},"type":"module","engines":{"node":">=22"},"gitHead":"805b977ca970139867f0e5526f4c8ed127920074","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","postinstall":"node scripts/postinstall.js","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.3","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_2.4.3_1790865050758_0.1004340414899727","host":"s3://npm-registry-packages-npm-production"}},"2.4.4":{"name":"@dummy3ye/yanker","version":"2.4.4","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"license":"Unlicense","_id":"@dummy3ye/yanker@2.4.4","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"824afb691db16dcb4e1be8651917ba9b9992f9c5","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.4.4.tgz","fileCount":7,"integrity":"sha512-6z9uFhjLhyrZw96dYrHSq0628DfphllJ3an5umDp4Puga5X8mqpPaqlImS1k/T5hzxdL72E7pca6akydOhbQxg==","signatures":[{"sig":"MEUCIEhZjkZbpcvz5x4hdVAKnQN/cLeZnKmNpqGMzo3dt1x3AiEA0hp3pUNsJekJnEcM1CGxvDpOwa65YlHwh5cTQ7tpqLY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDqV/eFfFYmeHF97W1tQYu9oSXbqCmgXjGrBzNGY5oQGQIgCV7jV18QiAKA4JdkL4dqG8pyouBHbqMVt+mWgC9470Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89066},"type":"module","engines":{"node":">=22"},"gitHead":"e809cc18a738e5635cb1a0c9e741c20047fc0fbf","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","postinstall":"node scripts/postinstall.js","format:check":"prettier --check ."},"_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"_nodeVersion":"22.23.3","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yanker_2.4.4_1790867086904_0.3510447074455967","host":"s3://npm-registry-packages-npm-production"}},"2.4.5":{"_id":"@dummy3ye/yanker@2.4.5","bin":{"yanker":"dist/cli.js"},"dist":{"shasum":"d0c5eb53faaff39a6fd89953238eac8d9b2e4b72","tarball":"https://registry.npmjs.org/@dummy3ye/yanker/-/yanker-2.4.5.tgz","fileCount":7,"integrity":"sha512-QXfXy3kQFdn70solX8PPCUuukN8IAF5sfnUv56kgj2FISx/3zR5SC09cy1YDyffpk+6mBNvdsRlSiMFwjhqFHQ==","signatures":[{"sig":"MEYCIQC/9UVkXRI/Ec0VX88Xm1b8ijMp0exu4O66HJ5mV4kYwAIhAIv65LZmh8R0Yy4j1YV69rLtXAdWskGK/LdqdC8Rfdt3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCGAs3etr/2zeTIkm9SEZ3k0MsYp/3tve5q2fJygdmXpwIgVTA9LmZsoZ0Hd2i3m9tHQz2Kkc/fS2TlnuKRew8IzCQ="}],"unpackedSize":90960},"name":"@dummy3ye/yanker","type":"module","engines":{"node":">=22"},"gitHead":"258af771d75c43e4e055602a6f9b14a81ef3fc5a","license":"Unlicense","scripts":{"dev":"tsup --watch","link":"npm run build && npm link","lint":"eslint .","build":"tsup","start":"node dist/cli.js","format":"prettier --write .","release":"semantic-release","lint:fix":"eslint . --fix","postbuild":"chmod +x dist/cli.js","typecheck":"tsc --noEmit","postinstall":"node scripts/postinstall.js","format:check":"prettier --check ."},"version":"2.4.5","_npmUser":{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"},"keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"_npmVersion":"11.19.1","description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","directories":{},"maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"_nodeVersion":"22.23.3","allowScripts":{"esbuild@0.27.7":true,"ffmpeg-static@5.3.0":true},"dependencies":{"ink":"^7.1.0","react":"^19.2.7","ink-spinner":"^5.0.0","ffmpeg-static":"^5.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"9.39.5","prettier":"3.9.6","@eslint/js":"9.39.5","typescript":"6.0.3","@types/node":"^26.1.1","@types/react":"^19.2.17","semantic-release":"25.0.9","typescript-eslint":"8.70.0","eslint-plugin-react":"7.37.5","@semantic-release/exec":"7.1.0","eslint-config-prettier":"10.1.8","eslint-plugin-react-hooks":"7.1.1","conventional-changelog-conventionalcommits":"8.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/yanker_2.4.5_1790867375753_0.04170859324611231"}}},"time":{"created":"2026-09-12T09:14:11.332Z","modified":"2026-10-01T15:09:36.646Z","0.1.0":"2026-09-12T09:14:11.644Z","1.0.0":"2026-09-12T10:00:40.055Z","1.0.1":"2026-09-12T10:05:34.125Z","2.0.0":"2026-09-20T11:30:41.656Z","2.1.0":"2026-09-20T19:04:55.277Z","2.2.0":"2026-09-21T19:25:54.702Z","2.3.0":"2026-09-21T21:54:20.246Z","2.3.1":"2026-09-21T22:08:22.597Z","2.4.0":"2026-09-22T11:26:36.473Z","2.4.1":"2026-10-01T11:30:26.605Z","2.4.2":"2026-10-01T13:49:15.840Z","2.4.3":"2026-10-01T14:30:50.854Z","2.4.4":"2026-10-01T15:04:46.983Z","2.4.5":"2026-10-01T15:09:35.836Z"},"license":"Unlicense","keywords":["video","downloader","yt-dlp","youtube","cli","tui","ink","terminal"],"description":"yanker - grab any video, every quality option with estimated size, right from your terminal.","maintainers":[{"name":"dummy3ye","email":"reza1234khan1234@gmail.com"}],"readme":"# Yanker\n\na better video **Yoinker**.\n\nStick a URL in a terminal, watch yanker show you _every_ quality the site\noffers, with estimated sizes and grab the one you want. Paste. pick and yank it.\n\npull from YouTube, Vimeo, SoundCloud, Instagram, TikTok, X and other sites.\n\n## Why yanker ?\n\n- **Every format, with sizes.** Not just \"best guess\" you can just choose from the whole list,\n  estimated file size included, sorted by quality.\n\n![yanker and its quality](https://raw.githubusercontent.com/dummy3ye/yanker/master/assets/qua.png)\n\n- **Keeps the terminal clean.** Alt-screen in, non-TTY-safe `--list` out.\n\n![non-tty mode](https://raw.githubusercontent.com/dummy3ye/yanker/master/assets/nontty.png)\n\n- **Custom output path.** Pick exactly where your downloads land with <kbd>Ctrl</kbd> + <kbd>O</kbd>.\n\n![non-tty mode](https://raw.githubusercontent.com/dummy3ye/yanker/master/assets/outselector.gif)\n\n- **Grab-protected streams.** If a site's CDN pushes back (403 throttling),\n  yanker retries with fresh extraction and browser cookies before giving up.\n\n## Troubleshooting\n\n**`yanker` says yt-dlp is missing.** Install it, or let yanker fetch the\nstandalone build for you with `yanker --update-yt-dlp`.\n\n**Downloads fail with a 403.** The CDN is challenging the request — retry,\nor pass `--cookies cookies.txt` (see the cookies section below).\n\nyanker re-extracts the stream with fresh browser cookies before it gives up.\nThat retry is bounded, so a persistently hostile CDN fails after a handful of\nattempts rather than hanging — if you are scripting around a known-bad host,\nprefer `--cookies` over relying on the retry.\n\n**Nothing appears on a non-TTY terminal.** The interactive picker needs a TTY;\nuse `--list` or `--best` when scripting over ssh.\n\n## How it fits together\n\n- `src/cli.tsx` — argument parsing and the headless paths (`--list`, `--best`, `--mp3`)\n- `src/app.tsx` — the interactive picker\n- `src/lib/ytdlp.ts` — format probing, download, and cookie retry\n- `src/lib/format.ts` — byte/duration formatting shared by both UIs\n- `src/lib/config.ts` — the remembered output directory\n- `src/lib/clipboard.ts` — paste and copy, with a bounded probe\n- `src/theme.ts` — the three themes and terminal detection\n\n## Themes\n\n`--theme light` / `--theme dark` / `--theme auto` (the default). `ctrl+t` cycles\nthe three in the picker.\n\nAuto-detection reads `COLORFGBG` when the terminal exports it. When it does\nnot, auto picks dark unless `COLORTERM=truecolor` says otherwise. If your\nterminal has a light background but exports a truecolor `COLORTERM`, set\n`YANKER_THEME=light` to force it.\n\n## Configuration\n\nyanker remembers where you last saved downloads. State lives in\n`~/.yanker/config.json`:\n\n```json\n{\n  \"lastOutDir\": \"~/Videos\"\n}\n```\n\nThat file is yours to edit or delete — removing it just resets the memory.\n`YANKER_OUT` overrides it for a single run, and `-o` overrides both.\n\nA remembered directory that has since been deleted or unmounted is ignored, so\nyanker falls back to your default rather than failing the download.\n\n## Requirements\n\n- **Node.js ≥ 22**\n- **yt-dlp** — _optional_.\n- **ffmpeg** — _optional_.\n  `ffmpeg-static` as a bundled fallback for merging and mp3 conversion\n- **Clipboard paste** — _optional_, only for Tab-paste in the URL field:\n  Linux needs `wl-paste` (Wayland) or `xclip`/`xsel` (X11), macOS uses\n  `pbpaste`, Windows uses PowerShell `Get-Clipboard`.\n\n## Installation\n\n```sh\nnpm install -g @dummy3ye/yanker\n```\n\nOr try it without installing anything:\n\n```sh\nnpx @dummy3ye/yanker\n```\n\nor you can just run the cool installer by:\n</br>_(it looks better if you have gum by charm.sh installed)_\n\n```sh\ncurl https://raw.githubusercontent.com/dummy3ye/yanker/refs/heads/master/install.sh | sh\n```\n\nPiping a script straight into a shell is convenient but means you are running\ncode you have not read. If you would rather look first:\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/dummy3ye/yanker/refs/heads/master/install.sh -o install.sh\nless install.sh\nsh install.sh\n```\n\n`npx @dummy3ye/yanker` sidesteps the question entirely.\n\n### Navigation (inside tui mode)\n\n| Key                                                                          | Action                           |\n| ---------------------------------------------------------------------------- | -------------------------------- |\n| `↵`                                                                          | download / submit                |\n| `↑` `↓`                                                                      | choose a format                  |\n| `esc`                                                                        | back (or cancel)                 |\n| `q`                                                                          | quit (when the field is empty)   |\n| `^c`                                                                         | quit                             |\n| `^t`                                                                         | cycle theme: auto → light → dark |\n| `Ctrl+o`                                                                     | open output dir                  |\n| `Tab`                                                                       | paste from clipboard             |\n| `Ctrl+u`                                                                     | clear the url field              |\n| The `auto` theme follows your terminal's own foreground/background, light or |\n| dark, without guessing.                                                      |\n\nThe interactive TUI requires a TTY. On non-TTY terminals (scripts, ssh\npipes), pass a URL with `--best` / `--mp3` / `--list` for headless output.\n**see below ↓**\n\nOver ssh or in CI, `--list` is the safest bet: it prints every format with\nits estimated size and exits, so it composes with `grep`/`head` instead of\nwaiting on a picker that can never be answered.\n\n## cli usage\n\n```sh\nyanker https://youtu.be/dQw4w9WgXcQ      # straight to the format picker\nyanker                                   # prompts for a link (auto-suggests a copied URL)\nyanker <url> --list                      # print every format + estimated size\nyanker <url> --best                      # grab the best format, no picker\nyanker <url> --mp3                       # audio only, straight to mp3\nyanker <url> -o ~/clips                  # save somewhere else\nyanker <url> --cookies cookies.txt       # use exported browser cookies (see below)\nyanker --theme light                     # force the light palette\nyanker --update-yt-dlp                   # self-update the standalone yt-dlp\n```\n\n`yanker` lists **all** available formats: resolution,\ncodec, container, bitrate and estimated file size, best options first. Pick\none with `↑`/`↓`, hit enter, and watch it fly. Files land in `~/Videos` by\ndefault, and the saved path is printed when you're finished.\n\nSizes in the list are **estimates** derived from each format's reported\nbitrate and duration, so treat them as a guide rather than an exact figure —\nthe real size depends on the container the site serves.\n\n### Shell completion\n\n`yanker` has no completion script yet, but the common invocations are short\nenough to alias:\n\n```sh\nalias yl='yanker --list'\nalias yb='yanker --best'\n```\n\n### Cookies (bot-checks & servers)\n\nYouTube starts answering every request with _\"Sign in to confirm you're not\na bot\"_ the moment it can't see your browser — which is exactly what happens\non a VPS, Docker, or any box without Chrome/Firefox on it. That's what\n`--cookies` is for: hand yanker your real logged-in session and the wall\ncomes down.\n\n> [!WARNING]\n> this app automatically pulls cookies for YouTube from Chrome or Firefox. If you hit trouble, export a `cookies.txt` with a trusted extension or addon and use that\n\n**Get the cookies.** In the browser you actually use for YouTube, export\nthem to a Netscape-format file — Chrome: _Get cookies.txt LOCALLY_\nextension; Firefox: _cookies.txt_ extension. Move it over, then:\n\n```sh\nscp cookies.txt root@your-vps:/root/\n\nyanker <url> --cookies /root/cookies.txt   # one-off\nyanker --cookies /root/cookies.txt         # or set it once and use the picker\n```\n\nThe cookies go to work **both** while fetching video info and while\ndownloading. When a file is given, it's the only cookie source — yanker\nskips its automatic browser-cookie fallbacks and trusts the file.\n\nTreat it like a password, because it is one: the file is a full login\nsession. Keep it private, and re-export it whenever YouTube expires the\nsession and the bot wall comes back.\n\nPlaylists are detected automatically — the picker offers \"grab all\"\n(best or mp3) or \"first video only\" to walk through the format list of\nthe first entry. Press **Tab** in the URL field to paste whatever is in\nyour clipboard — if it looks like a link it lands right in the field.\n\n## Development\n\n```sh\nnvm use                # switch to the pinned Node version (see .nvmrc)\nnpm install\nnpm run build          # bundle with tsup to dist/\nnpm run dev            # rebuild on change\nnpm run typecheck      # tsc --noEmit\nnpm run link           # rebuild + npm link for global `yanker`\nnpm run unlink yanker  # to unlink the global command\n```\n\nStack: TypeScript, [Ink](https://github.com/vadimdemedes/ink) (React for\nterminals), `yt-dlp`, `tsup` `ffmpeg`.\n\n## A note on fair use\n\nyanker is a personal-archiving tool. Downloading content may violate a\nplatform's terms of service — only grab what you're allowed to keep, and\nsupport the people who make what you save.\n\n## What cookies do and do not fix\n\n`--cookies` sends your browser's cookies to yt-dlp. That resolves the cases\nwhere the CDN challenges a request it would otherwise serve: age-gated videos,\nmembers-only uploads, and anything bound to a signed-in session.\n\nIt does not help with region blocks (pass `--geo-bypass-country` for those) and\nit does not bypass a takedown. If a video plays in your browser and fails in\nyanker, cookies are almost always the fix.\n\nThe file is read by yt-dlp and never sent anywhere else. Netscape format, which\nis what every browser extension exports.\n\n## Ordering\n\n`--list` and the interactive picker both read the same format table, but they do\nnot always present it in the same order. `--list` prints in yt-dlp's own order;\nthe picker sorts by height, then bitrate, then frame rate. Ties are resolved\ndeterministically, so the picker's order is stable run to run — just not\nnecessarily the same as `--list`.\n\nPick by the label (`1080p · avc1 · 60fps`), not by row number.\n\n## Exit codes\n\n| Code | Meaning |\n| --- | --- |\n| `0` | success |\n| `1` | bad usage — unknown flag, or a url yanker could not parse |\n| `2` | the download itself failed (network, CDN, disk) |\n\nScripts can therefore distinguish \"you asked for something impossible\" from\n\"the fetch broke\", without scraping stderr.\n\n**A size looks far too small.** Sizes are estimated from the bitrate whenever\nyt-dlp does not report an exact `filesize`, which is most of the time. The\nestimate assumes a constant bitrate, so VBR encodes read high. Where an exact\nfigure exists it is used instead.\n\n**A format shows no size at all.** The stream has no reported bitrate, or the\nvideo has no duration (a live stream still running). Nothing can be estimated\nin that case, so the label is blank rather than `0 B`.\n\n## Finding a format id by hand\n\n```sh\nyanker --list 'https://youtu.be/VIDEO' | grep '1080p'\n```\n\nThen hand the id straight to yt-dlp when you want something the picker does not\noffer:\n\n```sh\nyt-dlp -f 137+140 --merge-output-format mp4 'https://youtu.be/VIDEO'\n```\n\n## Support\n\nIf this saved you some time, an issue describing what you were trying to do is\nworth more than a star — it says what is still missing.\n\n## License\n\n[Unlicense](LICENSE)\n","readmeFilename":"README.md"}