UNPKG

tk4-downloader

Version:

Modern TikTok video downloader with FHD quality and no watermark

3 lines (2 loc) 3.53 kB
import{EventEmitter as c}from"events";import{createHash as n}from"crypto";import r from"axios";var o=class extends c{constructor(e={}){super(),this.options={timeout:e.timeout||1e4,maxRetries:e.maxRetries||3,preferredQuality:e.preferredQuality||"high",includeWatermark:e.includeWatermark||!1,proxyUrl:e.proxyUrl||null,debug:e.debug||!1,downloadPath:e.downloadPath||process.cwd(),autoRetry:e.autoRetry??!0,cacheResults:e.cacheResults??!0,maxCacheAge:e.maxCacheAge||36e5,parallelDownloads:e.parallelDownloads||3,outputFormat:e.outputFormat||"mp4",includeAudio:e.includeAudio??!0,customFileName:e.customFileName||null,headers:e.headers||{}},this.userAgents=["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36","Mozilla/5.0 (iPhone; CPU iPhone OS 17_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1.2 Mobile/15E148 Safari/604.1","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2.1 Safari/605.1.15","Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.43 Mobile Safari/537.36","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"],this.apis={snaptik:"https://api.snaptik.com/video-details",tikwm:"https://www.tikwm.com/api",tikmate:"https://api.tikmate.app/api",savett:"https://savett.cc/api",tikdown:"https://tikdown.org/api",tiktokapi:"https://api16-normal-c-useast1a.tiktokv.com/aweme/v1/feed",dlpanda:"https://dlpanda.com/api/v2/video",ssstik:"https://ssstik.io/api/v1/download"},this.stats={totalDownloads:0,cacheHits:0,cacheMisses:0,errors:0},this.cache=new Map,this.initializeEventHandlers()}initializeEventHandlers(){this.on("error",e=>{this.stats.errors++,this.debug(`Error occurred: ${e.message}`,"error")}),this.on("success",e=>{let t=e.source;this.stats.apiUsage[t]&&(this.stats.apiUsage[t].successes++,this.stats.apiUsage[t].averageResponseTime=(this.stats.apiUsage[t].averageResponseTime*(this.stats.apiUsage[t].successes-1)+e.duration)/this.stats.apiUsage[t].successes)})}cleanCache(){let e=Date.now();for(let[t,s]of this.cache.entries())e-s.timestamp>this.options.maxCacheAge&&this.cache.delete(t)}generateCacheKey(e){return n("md5").update(e).digest("hex")}getRandomUserAgent(){return this.userAgents[Math.floor(Math.random()*this.userAgents.length)]}debug(e,t="info"){if(this.options.debug){let s=new Date().toISOString();this.emit("debug",{timestamp:s,level:t,message:e})}}async getVideoId(e){try{let t=[/video\/(\d+)/,/\/v\/(\d+)/,/vm\.tiktok\.com\/(\w+)/,/vt\.tiktok\.com\/(\w+)/];for(let s of t){let a=e.match(s);if(a)return a[1]}if(e.includes("vm.tiktok.com")||e.includes("vt.tiktok.com")){let a=(await r.head(e)).request.res.responseUrl;return this.getVideoId(a)}return null}catch(t){return this.debug(`Error extracting video ID: ${t.message}`,"error"),null}}async downloadVideo(e){try{let t=await this.getVideoId(e);if(!t)throw new Error("Could not extract video ID");let s=this.cache.get(t);if(s)return this.stats.cacheHits++,s;this.stats.cacheMisses++;let a=await r.get(e),i={id:t,url:e,data:a.data};return this.cache.set(t,i),this.stats.totalDownloads++,i}catch(t){throw this.stats.errors++,t}}getDetailedStats(){return{...this.stats}}resetStats(){this.stats={totalDownloads:0,cacheHits:0,cacheMisses:0,errors:0}}async downloadVideos(e){let t=e.map(a=>this.downloadVideo(a));return await Promise.all(t)}};export{o as TikTokDownloader}; //# sourceMappingURL=tiktok.js.map