tk4-downloader
Version:
Modern TikTok video downloader with FHD quality and no watermark
53 lines (41 loc) • 5.49 kB
JavaScript
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