UNPKG

tk4-downloader

Version:

Modern TikTok video downloader with FHD quality and no watermark

53 lines (41 loc) 5.49 kB
#!/usr/bin/env node import m from"figlet";import{TikTokDownloader as b}from"./lib/tiktok.js";import e from"chalk";import p from"inquirer";import y from"ora";import a from"boxen";import d from"gradient-string";import f from"node-fetch";import{createRequire as h}from"module";import k from"fs";var v=h(import.meta.url),c=v("./package.json"),T={padding:1,margin:1,borderStyle:"double",borderColor:"cyan",backgroundColor:"#1B1B1B"},$={padding:1,margin:1,borderStyle:"round",borderColor:"yellow",backgroundColor:"#2D2D2D"},S={padding:1,margin:1,borderStyle:"bold",borderColor:"green",backgroundColor:"#1B1B1B"},F={padding:1,margin:1,borderStyle:"bold",borderColor:"red",backgroundColor:"#1B1B1B"},x=d(["#FF0000","#FF7F00","#FFFF00","#00FF00","#0000FF","#4B0082","#9400D3"]),w=o=>d(["#ff0000","#00ff00","#0000ff"])(o),s=o=>d(["#00ff00","#00ffff","#ff00ff"])(o),D=o=>d(["#FFD700","#FFA500"])(o);async function B(){let o=y({text:w("Checking for updates..."),color:"cyan",spinner:"dots12"}).start();try{let n=await(await f("https://raw.githubusercontent.com/lyssadev/tk4-downloader/main/package.json")).json();n.version!==c.version?o.info(a(`${e.yellow("\u26A1 UPDATE AVAILABLE \u26A1")} Current: ${e.dim(c.version)} \u2192 Latest: ${e.green(n.version)} Run: ${e.cyan("npm install -g tk4-downloader")} to update ${e.dim("Stay updated for the best experience!")}`,$)):o.succeed(e.green("\u2728 You are using the latest version!"))}catch{o.warn(e.yellow("\u26A0\uFE0F Could not check for updates"))}}function C(){console.clear();let o=m.textSync("TK4",{font:"ANSI Shadow",horizontalLayout:"full",verticalLayout:"default"}),r=m.textSync("DOWNLOADER",{font:"Small",horizontalLayout:"fitted",verticalLayout:"default"}),n=m.textSync(`v${c.version}`,{font:"Mini",horizontalLayout:"fitted"});console.log(` `),o.split(` `).forEach(t=>console.log(x(t))),r.split(` `).forEach(t=>console.log(s(t))),n.split(` `).forEach(t=>console.log(D(t))),console.log(a(`${e.bold(w("TK4 Downloader"))} ${e.dim(`v${c.version}`)} ${e.blue("\u25C6")} ${s("Download TikTok videos in FHD quality")} ${e.blue("\u25C6")} ${e.red("Remove watermarks automatically")} ${e.blue("\u25C6")} ${e.magenta("Modern CLI with real-time progress")} ${e.blue("\u25C6")} ${e.yellow("Optimized for speed and quality")} ${e.blue("\u25C6")} ${e.green("Multiple download sources")} ${e.blue("\u25C6")} ${e.cyan("Smart caching system")} ${e.dim("\u2501".repeat(50))} ${e.dim("Created with")} ${e.red("\u2665")} ${e.dim("by")} ${e.cyan("lyssadev")} ${e.dim("&")} ${e.cyan("chifft")} ${e.dim("Optimized for Termux & Linux Users")}`,T))}async function L(o){let r=/^https:\/\/(www\.)?(vm\.)?(vt\.)?tiktok\.com\//;if(!(await f(o)).ok||!r.test(o))throw new Error("Invalid TikTok URL");return!0}async function R(o){let r=y({text:s("Initializing download process..."),color:"cyan",spinner:"dots12"}).start();try{let n=new b,t=await n.downloadVideo(o);if(!t||!t.url)throw new Error("Could not fetch video information");let u=`tiktok_${o.split("/").pop().split("?")[0]||Date.now()}.mp4`;r.text=s("\u2B07\uFE0F Downloading video...");let g=await(await f(t.url)).arrayBuffer();k.writeFileSync(u,Buffer.from(g));let i=n.getDetailedStats();if(r.succeed(e.green("\u2728 Download completed successfully!")),console.log(a(`${e.green("\u2713")} ${e.bold("Download Summary")} ${e.blue("\u{1F4C1}")} Filename: ${e.cyan(u)} ${e.blue("\u{1F464}")} Author: ${e.cyan(t.author)} ${e.blue("\u{1F3A5}")} Quality: ${e.green(t.quality)} ${e.blue("\u{1F50D}")} Source: ${e.yellow(t.source)} ${e.blue("\u{1F4CD}")} Location: ${e.cyan(process.cwd())} ${e.blue("\u26A1")} Status: ${e.green("Ready to play!")} ${e.blue("\u{1F4CA}")} Success Rate: ${e.green(`${Math.round(i.successRate)}%`)} ${e.blue("\u23F1\uFE0F")} Response Time: ${e.yellow(`${i.averageSpeedMs}ms`)} ${e.blue("\u{1F4BE}")} Cache Status: ${i.cacheSaves>0?e.green("Hit"):e.yellow("Miss")} ${e.dim("Tip: Your video is ready to be shared!")}`,S)),t.source&&i.apiUsage[t.source]){let l=i.apiUsage[t.source];console.log(a(`${e.yellow("API Performance Metrics")} ${e.blue("\u{1F3AF}")} Success Rate: ${e.green(`${Math.round(l.successes/l.calls*100)}%`)} ${e.blue("\u26A1")} Avg Response: ${e.cyan(`${Math.round(l.averageResponseTime)}ms`)} ${e.blue("\u{1F4CA}")} Total Calls: ${e.yellow(l.calls)}`,$))}return u}catch(n){throw r.fail(e.red(`\u274C Download failed: ${n.message}`)),console.error(a(`${e.red("\u274C Error Details")} ${e.red(n.message)} ${e.dim("Troubleshooting Tips:")} ${e.dim("1. Check your internet connection")} ${e.dim("2. Verify the TikTok URL is valid")} ${e.dim("3. Try again in a few moments")} ${e.dim("4. The video might be private or deleted")}`,F)),n}}process.on("SIGINT",()=>{console.log(a(`${e.yellow("\u{1F44B} Thanks for using TK4 Downloader!")} ${e.dim("Follow us on GitHub for updates:")} ${e.cyan("https://github.com/lyssadev/tk4-downloader")} ${e.dim("Star \u2B50 the repository if you found it helpful!")}`,{padding:1,margin:1,borderColor:"yellow",dimBorder:!0})),process.exit(0)});async function A(){C(),await B();let o=!0;for(;o;)try{let{url:r}=await p.prompt([{type:"input",name:"url",message:s("Enter TikTok video URL:"),validate:L,prefix:"\u{1F3A5}"}]);await R(r),o=(await p.prompt([{type:"confirm",name:"continue",message:"Would you like to download another video?",default:!1}])).continue}catch{let{retry:n}=await p.prompt([{type:"confirm",name:"retry",message:s("Would you like to try again?"),default:!0}]);n||process.exit(1)}}A(); //# sourceMappingURL=cli.js.map