@pieda/video-dl 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,9 @@
1
1
  type TUseVimeo = {
2
+ ytdlpPath: string;
2
3
  videoId: string;
3
4
  dest: string;
4
5
  downloadBtnSelector?: string;
5
6
  debug?: boolean;
6
7
  };
7
- export declare const useVimeo: ({ videoId, dest, debug, }: TUseVimeo) => Promise<[Error | null, boolean | null]>;
8
+ export declare const useVimeo: ({ ytdlpPath, videoId, dest, debug, }: TUseVimeo) => Promise<[Error | null, boolean | null]>;
8
9
  export {};
@@ -1,7 +1,8 @@
1
1
  type TUseYoutube = {
2
+ ytdlpPath: string;
2
3
  videoId: string;
3
4
  dest: string;
4
5
  debug?: boolean;
5
6
  };
6
- export declare const useYoutube: ({ videoId, dest, debug, }: TUseYoutube) => Promise<[Error | null, boolean | null]>;
7
+ export declare const useYoutube: ({ ytdlpPath, videoId, dest, debug, }: TUseYoutube) => Promise<[Error | null, boolean | null]>;
7
8
  export {};
package/dist/video-dl.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=o=>new Promise((t,u)=>{import(o).then(i=>t(i.default)).catch(u)}),m=async(o,t,u)=>{const i=await l("fs"),e=await l("axios");return console.log(`Downloading ${o} to ${t}`),new Promise((n,w)=>{e.get(o,{responseType:"stream",headers:u}).then(s=>{const p=s.data,a=i.createWriteStream(t);p.pipe(a),a.on("finish",function(){a.close(()=>{n()})})}).catch(w)})},f=(o=!1)=>({log:(...t)=>{o&&console.log(...t)},error:(...t)=>{o&&console.error(...t)}}),h=async({videoId:o,dest:t,debug:u=!1})=>{f(u).log(`Downloading video: ${o} to: ${t}`);const e=await l("fs"),n=await l("path"),w=await l("youtubei.js");e.existsSync(n.dirname(t))||e.mkdirSync(n.dirname(t),{recursive:!0},777);const s=await w.create({cache:!1,generate_session_locally:!0});try{const p=await s.download(o,{type:"video+audio",quality:"best",format:"mp4",client:"WEB"}),a=e.createWriteStream(t);for await(const g of b(p))a.write(g);return[null,!0]}catch(p){return console.log("error",p),[p,null]}};async function*b(o){const t=o.getReader();try{for(;;){const{done:u,value:i}=await t.read();if(u)return;yield i}}finally{t.releaseLock()}}const y=async({videoId:o,dest:t,debug:u=!1,headless:i=!0})=>{try{const e=f(u);e.log(`Downloading video: ${o} to: ${t}`);const n=`https://m.facebook.com/watch/?v=${o}`,w=await l("fs"),s=await l("path"),p=await l("puppeteer");w.existsSync(s.dirname(t))||(w.mkdirSync(s.dirname(t),{recursive:!0},777),e.log(`建立 ${s.dirname(t)}`));const a={};i||(a.headless=!1);const g=await p.launch(a);e.log("啟動 puppeteer");const r=await g.newPage();await r.setUserAgent("'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1'"),e.log("開新分頁"),e.log(`前往 ${n}`),await Promise.race([r.goto(n,{waitUntil:"networkidle0"}),r.waitForSelector("video")]),e.log("找到 video 元素");const c=await r.$eval("video",d=>d.getAttribute("src"));return e.log(`取得 video url: ${c}`),await g.close(),e.log("關閉 puppeteer"),await m(c,t),e.log(`下載完成 ${c}`),[null,!0]}catch(e){return[e,null]}},v=async({videoId:o,dest:t,debug:u=!1})=>{const i=f(u);i.log(`Downloading video: ${o} to: ${t}`);const e=await l("fs"),n=await l("path"),w=await l("axios"),s=async()=>{const a=await w.get("https://vimeo.com/_next/viewer",{responseType:"json",headers:{"X-Requested-With":"XMLHttpRequest"}}),{jwt:g}=a.data;return g||""},p=async(a="",g="")=>{const r=await w.get(`https://api.vimeo.com/videos/${a}?&fields=download`,{responseType:"json",headers:{"X-Requested-With":"XMLHttpRequest",Authorization:`jwt ${g}`}}),{download:c=[]}=r.data,d=c[0]||null;return(d==null?void 0:d.link)||""};return e.existsSync(n.dirname(t))||(e.mkdirSync(n.dirname(t),{recursive:!0},777),i.log(`建立 ${n.dirname(t)}`)),new Promise(async(a,g)=>{try{const r=await s();i.log(`取得 jwt ${r}`);const c=await p(o,r);i.log(`取得 videoUrl ${c}`),await m(c,t),i.log(`下載完成 ${t}`),a([null,!0])}catch(r){a([r,null])}})},$=async({videoId:o,dest:t,debug:u=!1,headless:i=!0})=>{try{const e=f(u);e.log(`Downloading video: ${o} to: ${t}`);const n=`https://www.instagram.com/reel/${o}/`,w=await l("fs"),s=await l("path"),p=await l("puppeteer");w.existsSync(s.dirname(t))||(w.mkdirSync(s.dirname(t),{recursive:!0},777),e.log(`建立 ${s.dirname(t)}`));const a={};i||(a.headless=!1);const g=await p.launch(a);e.log("啟動 puppeteer");const r=await g.newPage();await r.setUserAgent("'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1'"),e.log("開新分頁"),e.log(`前往 ${n}`),await Promise.race([r.goto(n,{waitUntil:"networkidle0"}),r.waitForSelector("video")]),e.log("找到 video 元素");const c=await r.$eval("video",d=>d.getAttribute("src"));return e.log(`取得 video url: ${c}`),await g.close(),e.log("關閉 puppeteer"),await m(c,t),e.log(`下載完成 ${c}`),[null,!0]}catch(e){return[e,null]}},k=async({videoLink:o,dest:t,debug:u=!1,headless:i=!0})=>{try{const e=f(u);e.log(`Downloading video: ${o} to: ${t}`);const n=o,w=await l("fs"),s=await l("path"),p=await l("puppeteer");w.existsSync(s.dirname(t))||(w.mkdirSync(s.dirname(t),{recursive:!0},777),e.log(`建立 ${s.dirname(t)}`));const a={};i||(a.headless=!1);const g=await p.launch(a);e.log("啟動 puppeteer");const r=await g.newPage();e.log("開新分頁"),e.log(`前往 ${n}`),await Promise.race([r.goto(n,{waitUntil:"networkidle0"}),r.waitForSelector("video")]),e.log("找到 video 元素");const c=await r.$eval('video source[src^="https://www.tiktok.com/aweme/v1/play/"]',d=>d.getAttribute("src"));return e.log(`取得 video url: ${c}`),await g.close(),e.log("關閉 puppeteer"),await m(c,t,{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",Referer:"https://www.tiktok.com/"}),e.log(`下載完成 ${c}`),[null,!0]}catch(e){return[e,null]}},S=({type:o})=>{switch(o){case"youtube":case"yt-short":return h;case"facebook":case"fb-reel":return y;case"vimeo":return v;case"instagram":case"ig":case"ig-reel":return $;case"tiktok":case"tiktok-reel":return k;default:throw new Error(`Invalid video type: ${o}`)}};exports.useDownloader=S;exports.useFacebook=y;exports.useInstagram=$;exports.useTiktok=k;exports.useVimeo=v;exports.useYoutube=h;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=r=>new Promise((o,a)=>{import(r).then(g=>o(g.default)).catch(a)}),h=async(r,o,a)=>{const g=await l("fs"),e=await l("axios");return console.log(`Downloading ${r} to ${o}`),new Promise((u,s)=>{e.get(r,{responseType:"stream",headers:a}).then(c=>{const p=c.data,n=g.createWriteStream(o);p.pipe(n),n.on("finish",function(){n.close(()=>{u()})})}).catch(s)})},d=(r=!1)=>({log:(...o)=>{r&&console.log(...o)},error:(...o)=>{r&&console.error(...o)}}),$=async({ytdlpPath:r,videoId:o,dest:a,debug:g=!1})=>{const e=d(g);e.log(`Downloading video: ${o} to: ${a}`);const u=await l("fs"),s=await l("path"),{exec:c}=await l("child_process"),p=(n="")=>new Promise((w,t)=>{const i=`${r} -f b -g https://www.youtube.com/watch?v=${n}`;e.log(`[yt-dlp] 執行命令: ${i}`),c(i,(m,f,S)=>{if(e.log(`[yt-dlp] stdout: ${f}`),!f.includes("https://")){w("");return}w(f)})});return u.existsSync(s.dirname(a))||(u.mkdirSync(s.dirname(a),{recursive:!0},777),e.log(`建立 ${s.dirname(a)}`)),new Promise(async(n,w)=>{try{const t=await p(o);if(!t)throw new Error("無法取得 videoUrl");e.log(`取得 videoUrl ${t}`),await h(t,a).catch(i=>{throw e.error(`下載失敗: ${i.message}`),i}),e.log(`下載完成 ${a}`),n([null,!0])}catch(t){e.error(`下載失敗: ${t.message}`),n([t,null])}})},k=async({videoId:r,dest:o,debug:a=!1,headless:g=!0})=>{try{const e=d(a);e.log(`Downloading video: ${r} to: ${o}`);const u=`https://m.facebook.com/watch/?v=${r}`,s=await l("fs"),c=await l("path"),p=await l("puppeteer");s.existsSync(c.dirname(o))||(s.mkdirSync(c.dirname(o),{recursive:!0},777),e.log(`建立 ${c.dirname(o)}`));const n={};g||(n.headless=!1);const w=await p.launch(n);e.log("啟動 puppeteer");const t=await w.newPage();await t.setUserAgent("'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1'"),e.log("開新分頁"),e.log(`前往 ${u}`),await Promise.race([t.goto(u,{waitUntil:"networkidle0"}),t.waitForSelector("video")]),e.log("找到 video 元素");const i=await t.$eval("video",m=>m.getAttribute("src"));return e.log(`取得 video url: ${i}`),await w.close(),e.log("關閉 puppeteer"),await h(i,o),e.log(`下載完成 ${i}`),[null,!0]}catch(e){return[e,null]}},v=async({ytdlpPath:r,videoId:o,dest:a,debug:g=!1})=>{const e=d(g);e.log(`Downloading video: ${o} to: ${a}`);const u=await l("fs"),s=await l("path"),{exec:c}=await l("child_process"),p=(n="")=>new Promise((w,t)=>{const i=`${r} -f b -g https://vimeo.com/${n}`;console.log(`執行命令: ${i}`),c(i,(m,f,S)=>{if(e.log(`yt-dlp stdout: ${f}`),!f.includes("https://")){w("");return}w(f)})});return u.existsSync(s.dirname(a))||(u.mkdirSync(s.dirname(a),{recursive:!0},777),e.log(`建立 ${s.dirname(a)}`)),new Promise(async(n,w)=>{try{const t=await p(o);if(!t)throw new Error("無法取得 videoUrl");e.log(`取得 videoUrl ${t}`),await h(t,a).catch(i=>{throw e.error(`下載失敗: ${i.message}`),i}),e.log(`下載完成 ${a}`),n([null,!0])}catch(t){e.error(`下載失敗: ${t.message}`),n([t,null])}})},y=async({videoId:r,dest:o,debug:a=!1,headless:g=!0})=>{try{const e=d(a);e.log(`Downloading video: ${r} to: ${o}`);const u=`https://www.instagram.com/reel/${r}/`,s=await l("fs"),c=await l("path"),p=await l("puppeteer");s.existsSync(c.dirname(o))||(s.mkdirSync(c.dirname(o),{recursive:!0},777),e.log(`建立 ${c.dirname(o)}`));const n={};g||(n.headless=!1);const w=await p.launch(n);e.log("啟動 puppeteer");const t=await w.newPage();await t.setUserAgent("'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1'"),e.log("開新分頁"),e.log(`前往 ${u}`),await Promise.race([t.goto(u,{waitUntil:"networkidle0"}),t.waitForSelector("video")]),e.log("找到 video 元素");const i=await t.$eval("video",m=>m.getAttribute("src"));return e.log(`取得 video url: ${i}`),await w.close(),e.log("關閉 puppeteer"),await h(i,o),e.log(`下載完成 ${i}`),[null,!0]}catch(e){return[e,null]}},b=async({videoLink:r,dest:o,debug:a=!1,headless:g=!0})=>{try{const e=d(a);e.log(`Downloading video: ${r} to: ${o}`);const u=r,s=await l("fs"),c=await l("path"),p=await l("puppeteer");s.existsSync(c.dirname(o))||(s.mkdirSync(c.dirname(o),{recursive:!0},777),e.log(`建立 ${c.dirname(o)}`));const n={};g||(n.headless=!1);const w=await p.launch(n);e.log("啟動 puppeteer");const t=await w.newPage();e.log("開新分頁"),e.log(`前往 ${u}`),await Promise.race([t.goto(u,{waitUntil:"networkidle0"}),t.waitForSelector("video")]),e.log("找到 video 元素");const i=await t.$eval('video source[src^="https://www.tiktok.com/aweme/v1/play/"]',m=>m.getAttribute("src"));return e.log(`取得 video url: ${i}`),await w.close(),e.log("關閉 puppeteer"),await h(i,o,{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",Referer:"https://www.tiktok.com/"}),e.log(`下載完成 ${i}`),[null,!0]}catch(e){return[e,null]}},P=({type:r})=>{switch(r){case"youtube":case"yt-short":return $;case"facebook":case"fb-reel":return k;case"vimeo":return v;case"instagram":case"ig":case"ig-reel":return y;case"tiktok":case"tiktok-reel":return b;default:throw new Error(`Invalid video type: ${r}`)}};exports.useDownloader=P;exports.useFacebook=k;exports.useInstagram=y;exports.useTiktok=b;exports.useVimeo=v;exports.useYoutube=$;
package/dist/video-dl.js CHANGED
@@ -1,219 +1,205 @@
1
- const l = (o) => new Promise((t, u) => {
2
- import(o).then((i) => t(i.default)).catch(u);
3
- }), m = async (o, t, u) => {
4
- const i = await l("fs"), e = await l("axios");
5
- return console.log(`Downloading ${o} to ${t}`), new Promise((n, w) => {
6
- e.get(o, {
1
+ const l = (r) => new Promise((o, a) => {
2
+ import(r).then((u) => o(u.default)).catch(a);
3
+ }), f = async (r, o, a) => {
4
+ const u = await l("fs"), e = await l("axios");
5
+ return console.log(`Downloading ${r} to ${o}`), new Promise((w, c) => {
6
+ e.get(r, {
7
7
  responseType: "stream",
8
- headers: u
8
+ headers: a
9
9
  }).then((s) => {
10
- const p = s.data, a = i.createWriteStream(t);
11
- p.pipe(a), a.on("finish", function() {
12
- a.close(() => {
13
- n();
10
+ const p = s.data, n = u.createWriteStream(o);
11
+ p.pipe(n), n.on("finish", function() {
12
+ n.close(() => {
13
+ w();
14
14
  });
15
15
  });
16
- }).catch(w);
16
+ }).catch(c);
17
17
  });
18
- }, f = (o = !1) => ({
19
- log: (...t) => {
20
- o && console.log(...t);
18
+ }, $ = (r = !1) => ({
19
+ log: (...o) => {
20
+ r && console.log(...o);
21
21
  },
22
- error: (...t) => {
23
- o && console.error(...t);
22
+ error: (...o) => {
23
+ r && console.error(...o);
24
24
  }
25
- }), h = async ({
25
+ }), v = async ({
26
+ ytdlpPath: r,
26
27
  videoId: o,
27
- dest: t,
28
+ dest: a,
28
29
  debug: u = !1
29
30
  }) => {
30
- f(u).log(`Downloading video: ${o} to: ${t}`);
31
- const e = await l("fs"), n = await l("path"), w = await l("youtubei.js");
32
- e.existsSync(n.dirname(t)) || e.mkdirSync(n.dirname(t), { recursive: !0 }, 777);
33
- const s = await w.create({
34
- cache: !1,
35
- generate_session_locally: !0
36
- });
37
- try {
38
- const p = await s.download(o, {
39
- type: "video+audio",
40
- quality: "best",
41
- format: "mp4",
42
- client: "WEB"
43
- }), a = e.createWriteStream(t);
44
- for await (const g of y(p))
45
- a.write(g);
46
- return [null, !0];
47
- } catch (p) {
48
- return console.log("error", p), [p, null];
49
- }
50
- };
51
- async function* y(o) {
52
- const t = o.getReader();
53
- try {
54
- for (; ; ) {
55
- const { done: u, value: i } = await t.read();
56
- if (u)
31
+ const e = $(u);
32
+ e.log(`Downloading video: ${o} to: ${a}`);
33
+ const w = await l("fs"), c = await l("path"), { exec: s } = await l("child_process"), p = (n = "") => new Promise((g, t) => {
34
+ const i = `${r} -f b -g https://www.youtube.com/watch?v=${n}`;
35
+ e.log(`[yt-dlp] 執行命令: ${i}`), s(i, (m, h, d) => {
36
+ if (e.log(`[yt-dlp] stdout: ${h}`), !h.includes("https://")) {
37
+ g("");
57
38
  return;
58
- yield i;
39
+ }
40
+ g(h);
41
+ });
42
+ });
43
+ return w.existsSync(c.dirname(a)) || (w.mkdirSync(c.dirname(a), { recursive: !0 }, 777), e.log(`建立 ${c.dirname(a)}`)), new Promise(async (n, g) => {
44
+ try {
45
+ const t = await p(o);
46
+ if (!t)
47
+ throw new Error("無法取得 videoUrl");
48
+ e.log(`取得 videoUrl ${t}`), await f(t, a).catch((i) => {
49
+ throw e.error(`下載失敗: ${i.message}`), i;
50
+ }), e.log(`下載完成 ${a}`), n([null, !0]);
51
+ } catch (t) {
52
+ e.error(`下載失敗: ${t.message}`), n([t, null]);
59
53
  }
60
- } finally {
61
- t.releaseLock();
62
- }
63
- }
64
- const $ = async ({
65
- videoId: o,
66
- dest: t,
67
- debug: u = !1,
68
- headless: i = !0
54
+ });
55
+ }, y = async ({
56
+ videoId: r,
57
+ dest: o,
58
+ debug: a = !1,
59
+ headless: u = !0
69
60
  }) => {
70
61
  try {
71
- const e = f(u);
72
- e.log(`Downloading video: ${o} to: ${t}`);
73
- const n = `https://m.facebook.com/watch/?v=${o}`, w = await l("fs"), s = await l("path"), p = await l("puppeteer");
74
- w.existsSync(s.dirname(t)) || (w.mkdirSync(s.dirname(t), { recursive: !0 }, 777), e.log(`建立 ${s.dirname(t)}`));
75
- const a = {};
76
- i || (a.headless = !1);
77
- const g = await p.launch(a);
62
+ const e = $(a);
63
+ e.log(`Downloading video: ${r} to: ${o}`);
64
+ const w = `https://m.facebook.com/watch/?v=${r}`, c = await l("fs"), s = await l("path"), p = await l("puppeteer");
65
+ c.existsSync(s.dirname(o)) || (c.mkdirSync(s.dirname(o), { recursive: !0 }, 777), e.log(`建立 ${s.dirname(o)}`));
66
+ const n = {};
67
+ u || (n.headless = !1);
68
+ const g = await p.launch(n);
78
69
  e.log("啟動 puppeteer");
79
- const r = await g.newPage();
80
- await r.setUserAgent(
70
+ const t = await g.newPage();
71
+ await t.setUserAgent(
81
72
  "'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1'"
82
- ), e.log("開新分頁"), e.log(`前往 ${n}`), await Promise.race([
83
- r.goto(n, {
73
+ ), e.log("開新分頁"), e.log(`前往 ${w}`), await Promise.race([
74
+ t.goto(w, {
84
75
  waitUntil: "networkidle0"
85
76
  }),
86
- r.waitForSelector("video")
77
+ t.waitForSelector("video")
87
78
  ]), e.log("找到 video 元素");
88
- const c = await r.$eval("video", (d) => d.getAttribute("src"));
89
- return e.log(`取得 video url: ${c}`), await g.close(), e.log("關閉 puppeteer"), await m(c, t), e.log(`下載完成 ${c}`), [null, !0];
79
+ const i = await t.$eval("video", (m) => m.getAttribute("src"));
80
+ return e.log(`取得 video url: ${i}`), await g.close(), e.log("關閉 puppeteer"), await f(i, o), e.log(`下載完成 ${i}`), [null, !0];
90
81
  } catch (e) {
91
82
  return [e, null];
92
83
  }
93
- }, v = async ({
84
+ }, k = async ({
85
+ ytdlpPath: r,
94
86
  videoId: o,
95
- dest: t,
87
+ dest: a,
96
88
  debug: u = !1
97
89
  }) => {
98
- const i = f(u);
99
- i.log(`Downloading video: ${o} to: ${t}`);
100
- const e = await l("fs"), n = await l("path"), w = await l("axios"), s = async () => {
101
- const a = await w.get("https://vimeo.com/_next/viewer", {
102
- responseType: "json",
103
- headers: {
104
- "X-Requested-With": "XMLHttpRequest"
105
- }
106
- }), { jwt: g } = a.data;
107
- return g || "";
108
- }, p = async (a = "", g = "") => {
109
- const r = await w.get(`https://api.vimeo.com/videos/${a}?&fields=download`, {
110
- responseType: "json",
111
- headers: {
112
- "X-Requested-With": "XMLHttpRequest",
113
- Authorization: `jwt ${g}`
90
+ const e = $(u);
91
+ e.log(`Downloading video: ${o} to: ${a}`);
92
+ const w = await l("fs"), c = await l("path"), { exec: s } = await l("child_process"), p = (n = "") => new Promise((g, t) => {
93
+ const i = `${r} -f b -g https://vimeo.com/${n}`;
94
+ console.log(`執行命令: ${i}`), s(i, (m, h, d) => {
95
+ if (e.log(`yt-dlp stdout: ${h}`), !h.includes("https://")) {
96
+ g("");
97
+ return;
114
98
  }
115
- }), { download: c = [] } = r.data, d = c[0] || null;
116
- return (d == null ? void 0 : d.link) || "";
117
- };
118
- return e.existsSync(n.dirname(t)) || (e.mkdirSync(n.dirname(t), { recursive: !0 }, 777), i.log(`建立 ${n.dirname(t)}`)), new Promise(async (a, g) => {
99
+ g(h);
100
+ });
101
+ });
102
+ return w.existsSync(c.dirname(a)) || (w.mkdirSync(c.dirname(a), { recursive: !0 }, 777), e.log(`建立 ${c.dirname(a)}`)), new Promise(async (n, g) => {
119
103
  try {
120
- const r = await s();
121
- i.log(`取得 jwt ${r}`);
122
- const c = await p(o, r);
123
- i.log(`取得 videoUrl ${c}`), await m(c, t), i.log(`下載完成 ${t}`), a([null, !0]);
124
- } catch (r) {
125
- a([r, null]);
104
+ const t = await p(o);
105
+ if (!t)
106
+ throw new Error("無法取得 videoUrl");
107
+ e.log(`取得 videoUrl ${t}`), await f(t, a).catch((i) => {
108
+ throw e.error(`下載失敗: ${i.message}`), i;
109
+ }), e.log(`下載完成 ${a}`), n([null, !0]);
110
+ } catch (t) {
111
+ e.error(`下載失敗: ${t.message}`), n([t, null]);
126
112
  }
127
113
  });
128
- }, k = async ({
129
- videoId: o,
130
- dest: t,
131
- debug: u = !1,
132
- headless: i = !0
114
+ }, S = async ({
115
+ videoId: r,
116
+ dest: o,
117
+ debug: a = !1,
118
+ headless: u = !0
133
119
  }) => {
134
120
  try {
135
- const e = f(u);
136
- e.log(`Downloading video: ${o} to: ${t}`);
137
- const n = `https://www.instagram.com/reel/${o}/`, w = await l("fs"), s = await l("path"), p = await l("puppeteer");
138
- w.existsSync(s.dirname(t)) || (w.mkdirSync(s.dirname(t), { recursive: !0 }, 777), e.log(`建立 ${s.dirname(t)}`));
139
- const a = {};
140
- i || (a.headless = !1);
141
- const g = await p.launch(a);
121
+ const e = $(a);
122
+ e.log(`Downloading video: ${r} to: ${o}`);
123
+ const w = `https://www.instagram.com/reel/${r}/`, c = await l("fs"), s = await l("path"), p = await l("puppeteer");
124
+ c.existsSync(s.dirname(o)) || (c.mkdirSync(s.dirname(o), { recursive: !0 }, 777), e.log(`建立 ${s.dirname(o)}`));
125
+ const n = {};
126
+ u || (n.headless = !1);
127
+ const g = await p.launch(n);
142
128
  e.log("啟動 puppeteer");
143
- const r = await g.newPage();
144
- await r.setUserAgent(
129
+ const t = await g.newPage();
130
+ await t.setUserAgent(
145
131
  "'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1'"
146
- ), e.log("開新分頁"), e.log(`前往 ${n}`), await Promise.race([
147
- r.goto(n, {
132
+ ), e.log("開新分頁"), e.log(`前往 ${w}`), await Promise.race([
133
+ t.goto(w, {
148
134
  waitUntil: "networkidle0"
149
135
  }),
150
- r.waitForSelector("video")
136
+ t.waitForSelector("video")
151
137
  ]), e.log("找到 video 元素");
152
- const c = await r.$eval("video", (d) => d.getAttribute("src"));
153
- return e.log(`取得 video url: ${c}`), await g.close(), e.log("關閉 puppeteer"), await m(c, t), e.log(`下載完成 ${c}`), [null, !0];
138
+ const i = await t.$eval("video", (m) => m.getAttribute("src"));
139
+ return e.log(`取得 video url: ${i}`), await g.close(), e.log("關閉 puppeteer"), await f(i, o), e.log(`下載完成 ${i}`), [null, !0];
154
140
  } catch (e) {
155
141
  return [e, null];
156
142
  }
157
- }, S = async ({
158
- videoLink: o,
159
- dest: t,
160
- debug: u = !1,
161
- headless: i = !0
143
+ }, b = async ({
144
+ videoLink: r,
145
+ dest: o,
146
+ debug: a = !1,
147
+ headless: u = !0
162
148
  }) => {
163
149
  try {
164
- const e = f(u);
165
- e.log(`Downloading video: ${o} to: ${t}`);
166
- const n = o, w = await l("fs"), s = await l("path"), p = await l("puppeteer");
167
- w.existsSync(s.dirname(t)) || (w.mkdirSync(s.dirname(t), { recursive: !0 }, 777), e.log(`建立 ${s.dirname(t)}`));
168
- const a = {};
169
- i || (a.headless = !1);
170
- const g = await p.launch(a);
150
+ const e = $(a);
151
+ e.log(`Downloading video: ${r} to: ${o}`);
152
+ const w = r, c = await l("fs"), s = await l("path"), p = await l("puppeteer");
153
+ c.existsSync(s.dirname(o)) || (c.mkdirSync(s.dirname(o), { recursive: !0 }, 777), e.log(`建立 ${s.dirname(o)}`));
154
+ const n = {};
155
+ u || (n.headless = !1);
156
+ const g = await p.launch(n);
171
157
  e.log("啟動 puppeteer");
172
- const r = await g.newPage();
173
- e.log("開新分頁"), e.log(`前往 ${n}`), await Promise.race([
174
- r.goto(n, {
158
+ const t = await g.newPage();
159
+ e.log("開新分頁"), e.log(`前往 ${w}`), await Promise.race([
160
+ t.goto(w, {
175
161
  waitUntil: "networkidle0"
176
162
  }),
177
- r.waitForSelector("video")
163
+ t.waitForSelector("video")
178
164
  ]), e.log("找到 video 元素");
179
- const c = await r.$eval(
165
+ const i = await t.$eval(
180
166
  'video source[src^="https://www.tiktok.com/aweme/v1/play/"]',
181
- (d) => d.getAttribute("src")
167
+ (m) => m.getAttribute("src")
182
168
  );
183
- return e.log(`取得 video url: ${c}`), await g.close(), e.log("關閉 puppeteer"), await m(c, t, {
169
+ return e.log(`取得 video url: ${i}`), await g.close(), e.log("關閉 puppeteer"), await f(i, o, {
184
170
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
185
171
  Referer: "https://www.tiktok.com/"
186
172
  // 設定 Referer
187
- }), e.log(`下載完成 ${c}`), [null, !0];
173
+ }), e.log(`下載完成 ${i}`), [null, !0];
188
174
  } catch (e) {
189
175
  return [e, null];
190
176
  }
191
- }, b = ({ type: o }) => {
192
- switch (o) {
177
+ }, P = ({ type: r }) => {
178
+ switch (r) {
193
179
  case "youtube":
194
180
  case "yt-short":
195
- return h;
181
+ return v;
196
182
  case "facebook":
197
183
  case "fb-reel":
198
- return $;
184
+ return y;
199
185
  case "vimeo":
200
- return v;
186
+ return k;
201
187
  case "instagram":
202
188
  case "ig":
203
189
  case "ig-reel":
204
- return k;
190
+ return S;
205
191
  case "tiktok":
206
192
  case "tiktok-reel":
207
- return S;
193
+ return b;
208
194
  default:
209
- throw new Error(`Invalid video type: ${o}`);
195
+ throw new Error(`Invalid video type: ${r}`);
210
196
  }
211
197
  };
212
198
  export {
213
- b as useDownloader,
214
- $ as useFacebook,
215
- k as useInstagram,
216
- S as useTiktok,
217
- v as useVimeo,
218
- h as useYoutube
199
+ P as useDownloader,
200
+ y as useFacebook,
201
+ S as useInstagram,
202
+ b as useTiktok,
203
+ k as useVimeo,
204
+ v as useYoutube
219
205
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pieda/video-dl",
3
3
  "private": false,
4
- "version": "1.7.0",
4
+ "version": "1.8.0",
5
5
  "type": "module",
6
6
  "main": "dist/video-dl.cjs",
7
7
  "module": "dist/video-dl.js",