fast-dirpy 0.3.9 → 0.3.10

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.
package/README.md CHANGED
@@ -19,12 +19,13 @@ A simple library/CLI to download youtube(etc.) videos.
19
19
  <details>
20
20
  <summary>NSFW</summary>
21
21
 
22
- * [Animehentai](https://animeidhentai.com/)
23
- * [Koreanpornmovies](https://koreanpornmovie.com/)
24
- * [XVideos](https://www.xvideos.com/)
25
- * [Missav](https://missav.ws/) (m3u8)
26
- * [Hanime1.me](https://hanime1.me/)
27
- * [wow.xxx](https://www.wow.xxx/)
22
+ - [Animehentai](https://animeidhentai.com/)
23
+ - [Koreanpornmovies](https://koreanpornmovie.com/)
24
+ - [XVideos](https://www.xvideos.com/)
25
+ - [Missav](https://missav.ws/) (m3u8)
26
+ - [Hanime1.me](https://hanime1.me/)
27
+ - [wow.xxx](https://www.wow.xxx/)
28
+ - [xhamster](https://xhamster.com/) (m3u8, retry if error)
28
29
  </details>
29
30
 
30
31
  And `.m3u8` videos.
@@ -38,6 +39,7 @@ You can use this [userscript](https://greasyfork.org/zh-CN/scripts/449581-m3u8%E
38
39
  ## Installation
39
40
 
40
41
  ### As a library
42
+
41
43
  ```shell
42
44
  npm i fast-dirpy
43
45
 
@@ -46,6 +48,7 @@ deno add jsr:@vince-g/fast-dirpy
46
48
  ```
47
49
 
48
50
  ### As a **command line tool**
51
+
49
52
  ```shell
50
53
  npm i fast-dirpy -g
51
54
  ```
@@ -112,6 +115,7 @@ fast-dirpy get https\://www.youtube.com/watch\?v\=6c28qWDMPBA
112
115
  #### Download Video
113
116
 
114
117
  > [!IMPORTANT]
118
+ >
115
119
  > 1. Some website listed in [Supported Websites](#supported-websites) requires Google Chrome installed for Puppeteer use. You have to use a config file or give parameter of puppeteer executable path.
116
120
  > 2. `.m3u8` source is handled by `ffmpeg`.
117
121
 
@@ -150,6 +154,7 @@ fast-dirpy --help
150
154
  ```
151
155
 
152
156
  ### Use as a library
157
+
153
158
  ```ts
154
159
  import { fastLink, fastDownload, remoteM3U8ToMP4, downloadVideo } from 'fast-dirpy'
155
160
 
package/dist/cli.mjs CHANGED
@@ -1 +1 @@
1
- import{C as e,_ as t,a as n,b as r,c as i,f as a,g as o,h as s,i as c,l,m as u,n as d,p as f,r as p,s as m,t as h,u as g,v as _,w as v,y}from"./judgeUrl-C8A0NXW8.mjs";import{bold as b,dim as x}from"ansis";import{cac as S}from"cac";import C from"restore-cursor";const w=S(`fast-dirpy`),{version:T}=e;w.command(`get <url>`,`get video direct link.`).option(`--proxyHost, -H <proxyHost>`,`Proxy host.`).option(`--proxyPort, -P <proxyPort>`,`Proxy port.`).option(`--config, -c <path>`,`Specify an external config file.`).option(`--silent`,`Suppress non-error logs`).option(`--chromePath`,`Path to your Google Chrome browser`).action(async(e,n)=>{let i=h(e),{proxyHost:a,proxyPort:o,config:u,silent:p,chromePath:m}=n,g=a?{proxy:{host:a,port:o}}:void 0,_=m?{puppeteer:{executablePath:m}}:void 0;if(r(!!p),y.info(`fast-dirpy ${x(`v${T}`)} : ${b(`Direct Link Getter`)}.`),i===d.AnimeIdHentai){y.info(`Matched link source: Animeidhentai.`);let n=await t({url:e,cwd:u},{...g,..._});console.log(n)}else if(i===d.KoreanPM){y.info(`Matched link source: KoreanPM.`);let t=await l({url:e,cwd:u},g);console.log(t)}else if(i===d.Wowxxx){y.info(`Matched link source: Wowxxx.`);let t=await c({url:e,cwd:u},g);console.log(t)}else if(i===d.Bilibili){if(y.info(`Matched link source: Bilibili.`),!e.includes(`bilibili.com`)){y.error(`Please provide a valid Bilibili URL.`);return}let t=await s(e);console.log(t)}else if(i===d.Dirpy){y.info(`Matched link source: Dirpy.`);let t=await f({url:e,cwd:u},g);console.log(t)}else y.error(`Your link is not supported!`)}),w.command(`download <url>`,`download a video.`).option(`--path, -p <path>`,`Download destination path + filename. e.g. /xxx/example.mp4.`).option(`--proxyHost, -H <proxyHost>`,`Proxy host.`).option(`--proxyPort, -P <proxyPort>`,`Proxy port.`).option(`--config, -c <path>`,`Specify an external config file.`).option(`--silent`,`Suppress non-error logs`).option(`--chromePath`,`Path to your Google Chrome browser`).action(async(e,t)=>{let s=h(e),{proxyHost:c,proxyPort:l,path:f,config:v,silent:S,chromePath:C}=t,w=c?{proxy:{host:c,port:l}}:void 0,E=C?{puppeteer:{executablePath:C}}:void 0;r(!!S),y.info(`fast-dirpy ${x(`v${T}`)} : ${b(`Video Downloader`)}.`),s===d.Bilibili?(y.info(`Matched link source: Bilibili.`),await u({url:e,path:f})):s===d.Dirpy?(y.info(`Matched link source: Dirpy.`),a({url:e,path:f||`./dirpy.mp4`,cwd:v},w)):s===d.AnimeIdHentai?(y.info(`Matched link source: AnimeIdHentai.`),await o({url:e,path:f||`./animeidhentai.mp4`,cwd:v},{...w,...E})):s===d.KoreanPM?(y.info(`Matched link source: KoreanPM.`),await i({url:e,path:f||`./korean-pm.mp4`,cwd:v},w)):s===d.Wowxxx?(y.info(`Matched link source: Wowxxx.`),await p({url:e,path:f||`./wowxxx.mp4`,cwd:v},w)):s===d.MissAV?(y.info(`Matched link source: MissAV.`),await n({url:e,path:f,cwd:v})):s===d.Hanime?(y.info(`Matched link source: Hanime.`),await g({url:e,path:f,cwd:v})):s===d.M3U8?(y.info(`Matched link source: m3u8.`),await m({url:e,path:f||`./m3u8-download.mp4`,cwd:v})):s===d.MP4?(y.info(`Matched link source: mp4.`),await _({url:e,path:f,cwd:v})):y.error(`Your link is not supported!`)}),w.help(),w.version(v),w.parse(),C();export{};
1
+ import{E as e,S as t,T as n,_ as r,a as i,b as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as m,r as h,s as g,t as _,u as v,v as y,x as b,y as x}from"./judgeUrl-ChKFgqzP.mjs";import{bold as S,dim as C}from"ansis";import{cac as w}from"cac";import T from"restore-cursor";const E=w(`fast-dirpy`),{version:D}=n;E.command(`get <url>`,`get video direct link.`).option(`--proxyHost, -H <proxyHost>`,`Proxy host.`).option(`--proxyPort, -P <proxyPort>`,`Proxy port.`).option(`--config, -c <path>`,`Specify an external config file.`).option(`--silent`,`Suppress non-error logs`).option(`--chromePath`,`Path to your Google Chrome browser`).action(async(e,n)=>{let i=_(e),{proxyHost:a,proxyPort:s,config:c,silent:d,chromePath:f}=n,h=a?{proxy:{host:a,port:s}}:void 0,g=f?{puppeteer:{executablePath:f}}:void 0;if(t(!!d),b.info(`fast-dirpy ${C(`v${D}`)} : ${S(`Direct Link Getter`)}.`),i===p.AnimeIdHentai){b.info(`Matched link source: Animeidhentai.`);let t=await x({url:e,cwd:c},{...h,...g});console.log(t)}else if(i===p.KoreanPM){b.info(`Matched link source: KoreanPM.`);let t=await o({url:e,cwd:c},h);console.log(t)}else if(i===p.Wowxxx){b.info(`Matched link source: Wowxxx.`);let t=await m({url:e,cwd:c},h);console.log(t)}else if(i===p.XHamster){b.info(`Matched link source: XHamster.`);let t=await u({url:e,cwd:c},h);console.log(t)}else if(i===p.Bilibili){if(b.info(`Matched link source: Bilibili.`),!e.includes(`bilibili.com`)){b.error(`Please provide a valid Bilibili URL.`);return}let t=await r(e);console.log(t)}else if(i===p.Dirpy){b.info(`Matched link source: Dirpy.`);let t=await l({url:e,cwd:c},h);console.log(t)}else b.error(`Your link is not supported!`)}),E.command(`download <url>`,`download a video.`).option(`--path, -p <path>`,`Download destination path + filename. e.g. /xxx/example.mp4.`).option(`--proxyHost, -H <proxyHost>`,`Proxy host.`).option(`--proxyPort, -P <proxyPort>`,`Proxy port.`).option(`--config, -c <path>`,`Specify an external config file.`).option(`--silent`,`Suppress non-error logs`).option(`--chromePath`,`Path to your Google Chrome browser`).action(async(e,n)=>{let r=_(e),{proxyHost:o,proxyPort:l,path:u,config:m,silent:x,chromePath:w}=n,T=o?{proxy:{host:o,port:l}}:void 0,E=w?{puppeteer:{executablePath:w}}:void 0;t(!!x),b.info(`fast-dirpy ${C(`v${D}`)} : ${S(`Video Downloader`)}.`),r===p.Bilibili?(b.info(`Matched link source: Bilibili.`),await c({url:e,path:u})):r===p.Dirpy?(b.info(`Matched link source: Dirpy.`),f({url:e,path:u||`./dirpy.mp4`,cwd:m},T)):r===p.AnimeIdHentai?(b.info(`Matched link source: AnimeIdHentai.`),await y({url:e,path:u||`./animeidhentai.mp4`,cwd:m},{...T,...E})):r===p.KoreanPM?(b.info(`Matched link source: KoreanPM.`),await v({url:e,path:u||`./korean-pm.mp4`,cwd:m},T)):r===p.Wowxxx?(b.info(`Matched link source: Wowxxx.`),await i({url:e,path:u||`./wowxxx.mp4`,cwd:m},T)):r===p.XHamster?(b.info(`Matched link source: XHamster.`),await h({url:e,path:u||`./xhamster-vid.mp4`,cwd:m},T)):r===p.MissAV?(b.info(`Matched link source: MissAV.`),await g({url:e,path:u,cwd:m})):r===p.Hanime?(b.info(`Matched link source: Hanime.`),await s({url:e,path:u,cwd:m},T)):r===p.M3U8?(b.info(`Matched link source: m3u8.`),d({url:e,path:u||`./m3u8-download.mp4`,cwd:m})):r===p.MP4?(b.info(`Matched link source: mp4.`),await a({url:e,path:u,cwd:m},T)):b.error(`Your link is not supported!`)}),E.help(),E.version(e),E.parse(),T();export{};
@@ -33,7 +33,8 @@ declare enum UrlType {
33
33
  MissAV = 5,
34
34
  Hanime = 6,
35
35
  Wowxxx = 7,
36
- MP4 = 8,
36
+ XHamster = 8,
37
+ MP4 = 9,
37
38
  }
38
39
  //#endregion
39
40
  //#region src/config.d.ts
package/dist/config.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { t as defineConfig } from "./config-COA6iekn.mjs";
1
+ import { t as defineConfig } from "./config-DPmVNe2Q.mjs";
2
2
  export { defineConfig };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as Options, i as M3U8Params, n as DirectLinkParams, o as UrlType, r as DownloadParams, t as defineConfig } from "./config-COA6iekn.mjs";
1
+ import { a as Options, i as M3U8Params, n as DirectLinkParams, o as UrlType, r as DownloadParams, t as defineConfig } from "./config-DPmVNe2Q.mjs";
2
2
 
3
3
  //#region src/constants.d.ts
4
4
  declare const DEFAULT_OPTIONS: Options;
@@ -38,6 +38,10 @@ declare function downloadMissav(params: Partial<DownloadParams>): Promise<void>;
38
38
  declare function getWowxxxLink(params: DirectLinkParams, options?: Partial<Options>): Promise<Record<string, any>[]>;
39
39
  declare function downloadWowxxx(params: DownloadParams, options?: Partial<Options>): Promise<void>;
40
40
  //#endregion
41
+ //#region src/core/xhamster.d.ts
42
+ declare function getXHamsterLink(params: DirectLinkParams, options?: Partial<Options>): Promise<string>;
43
+ declare function downloadXHamster(params: DownloadParams, options?: Partial<Options>): Promise<void>;
44
+ //#endregion
41
45
  //#region src/utils/downloader.d.ts
42
46
  declare function downloadVideo(params: DownloadParams, options?: Partial<Options>): Promise<void>;
43
47
  //#endregion
@@ -45,4 +49,4 @@ declare function downloadVideo(params: DownloadParams, options?: Partial<Options
45
49
  declare function fastLink(params: DirectLinkParams, options?: Partial<Options>): Promise<string | Record<string, any>[]>;
46
50
  declare function fastDownload(params: DownloadParams, options?: Partial<Options>): Promise<void>;
47
51
  //#endregion
48
- export { DEFAULT_OPTIONS, DirectLinkParams, DownloadParams, M3U8Params, Options, UrlType, __dirname, defineConfig, downloadAnimeIdHentai, downloadBilibili, downloadDirpy, downloadHanime, downloadKoreanPm, downloadMissav, downloadVideo, downloadWowxxx, fastDownload, fastLink, getAnimeIdHentaiLink, getBilibiliLink, getDirpyLink, getHanimeLink, getKoreanPmLink, getMissavLink, getWowxxxLink, remoteM3U8ToMP4 };
52
+ export { DEFAULT_OPTIONS, DirectLinkParams, DownloadParams, M3U8Params, Options, UrlType, __dirname, defineConfig, downloadAnimeIdHentai, downloadBilibili, downloadDirpy, downloadHanime, downloadKoreanPm, downloadMissav, downloadVideo, downloadWowxxx, downloadXHamster, fastDownload, fastLink, getAnimeIdHentaiLink, getBilibiliLink, getDirpyLink, getHanimeLink, getKoreanPmLink, getMissavLink, getWowxxxLink, getXHamsterLink, remoteM3U8ToMP4 };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{C as e,S as t,_ as n,a as r,c as i,d as a,f as o,g as s,h as c,i as l,l as u,m as d,n as f,o as p,p as m,r as h,s as g,t as _,u as v,v as y,x as b,y as x}from"./judgeUrl-C8A0NXW8.mjs";import{defineConfig as S}from"./config.mjs";import{bold as C,dim as w}from"ansis";const{version:T}=e;async function E(e,t=b){let{url:r,cwd:i}=e,{proxy:o,puppeteer:s}=t,d=o||{},h=s||{},g=_(r);return x.info(`fast-dirpy ${w(`v${T}`)} : ${C(`Direct Link Getter`)}.`),g===f.Bilibili?(x.info(`Matched link source: Bilibili.`),r.includes(`bilibili.com`)?await c(r):(x.error(`Please provide a valid Bilibili URL.`),``)):g===f.AnimeIdHentai?(x.info(`Matched link source: Animeidhentai.`),await n({url:r,cwd:i},{...d,...h})):g===f.KoreanPM?(x.info(`Matched link source: KoreanPM.`),await u({url:r,cwd:i},d)):g===f.MissAV?(x.info(`Matched link source: MissAV.`),await p({url:r,cwd:i})):g===f.Hanime?(x.info(`Matched link source: Hanime.`),await a({url:r,cwd:i},d)):g===f.Wowxxx?(x.info(`Matched link source: Wowxxx.`),await l({url:r,cwd:i},d)):g===f.Dirpy?(x.info(`Matched link source: Dirpy.`),await m({url:r,cwd:i},d)):(x.error(`Your link is not supported!`),``)}async function D(e,t=b){let{url:n,path:a,cwd:c}=e,{proxy:l,puppeteer:u}=t,p=l||{},m=u||{},S=_(n);x.info(`fast-dirpy ${w(`v${T}`)} : ${C(`Video Downloader`)}.`),S===f.Bilibili?(x.info(`Matched link source: Bilibili.`),await d({url:n,path:a})):S===f.AnimeIdHentai?(x.info(`Matched link source: AnimeIdHentai.`),await s({url:n,path:a||`./animeidhentai.mp4`,cwd:c},{...p,...m})):S===f.KoreanPM?(x.info(`Matched link source: KoreanPM.`),await i({url:n,path:a||`./korean-pm.mp4`,cwd:c},p)):S===f.MissAV?(x.info(`Matched link source: MissAV.`),await r({url:n,path:a,cwd:c})):S===f.Hanime?(x.info(`Matched link source: Hanime.`),await v({url:n,path:a,cwd:c})):S===f.Wowxxx?(x.info(`Matched link source: Wowxxx.`),await h({url:n,path:a,cwd:c})):S===f.Dirpy?(x.info(`Matched link source: Dirpy.`),o({url:n,path:a||`./dirpy.mp4`,cwd:c},p)):S===f.MP4?(x.info(`Matched link source: mp4.`),await y({url:n,path:a||`./mp4-download.mp4`,cwd:c})):S===f.M3U8?(x.info(`Matched link source: m3u8.`),await g({url:n,path:a||`./m3u8-download.mp4`,cwd:c})):x.error(`Your link is not supported!`)}export{b as DEFAULT_OPTIONS,f as UrlType,t as __dirname,S as defineConfig,s as downloadAnimeIdHentai,d as downloadBilibili,o as downloadDirpy,v as downloadHanime,i as downloadKoreanPm,r as downloadMissav,y as downloadVideo,h as downloadWowxxx,D as fastDownload,E as fastLink,n as getAnimeIdHentaiLink,c as getBilibiliLink,m as getDirpyLink,a as getHanimeLink,u as getKoreanPmLink,p as getMissavLink,l as getWowxxxLink,g as remoteM3U8ToMP4};
1
+ import{C as e,T as t,_ as n,a as r,b as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as m,p as h,r as g,s as _,t as v,u as y,v as b,w as x,x as S,y as C}from"./judgeUrl-ChKFgqzP.mjs";import{defineConfig as w}from"./config.mjs";import{bold as T,dim as E}from"ansis";const{version:D}=t;async function O(t,r=e){let{url:i,cwd:s}=t,{proxy:c,puppeteer:d}=r,f=c||{},g=d||{},_=v(i);return S.info(`fast-dirpy ${E(`v${D}`)} : ${T(`Direct Link Getter`)}.`),_===p.Bilibili?(S.info(`Matched link source: Bilibili.`),i.includes(`bilibili.com`)?await n(i):(S.error(`Please provide a valid Bilibili URL.`),``)):_===p.AnimeIdHentai?(S.info(`Matched link source: Animeidhentai.`),await C({url:i,cwd:s},{...f,...g})):_===p.KoreanPM?(S.info(`Matched link source: KoreanPM.`),await o({url:i,cwd:s},f)):_===p.MissAV?(S.info(`Matched link source: MissAV.`),await a({url:i,cwd:s})):_===p.Hanime?(S.info(`Matched link source: Hanime.`),await h({url:i,cwd:s},f)):_===p.Wowxxx?(S.info(`Matched link source: Wowxxx.`),await m({url:i,cwd:s},f)):_===p.XHamster?(S.info(`Matched link source: XHamster.`),await u({url:i,cwd:s},f)):_===p.Dirpy?(S.info(`Matched link source: Dirpy.`),await l({url:i,cwd:s},f)):(S.error(`Your link is not supported!`),``)}async function k(t,n=e){let{url:a,path:o,cwd:l}=t,{proxy:u,puppeteer:m}=n,h=u||{},x=m||{},C=v(a);S.info(`fast-dirpy ${E(`v${D}`)} : ${T(`Video Downloader`)}.`),C===p.Bilibili?(S.info(`Matched link source: Bilibili.`),await c({url:a,path:o})):C===p.AnimeIdHentai?(S.info(`Matched link source: AnimeIdHentai.`),await b({url:a,path:o||`./animeidhentai.mp4`,cwd:l},{...h,...x})):C===p.KoreanPM?(S.info(`Matched link source: KoreanPM.`),await y({url:a,path:o||`./korean-pm.mp4`,cwd:l},h)):C===p.MissAV?(S.info(`Matched link source: MissAV.`),await _({url:a,path:o,cwd:l})):C===p.Hanime?(S.info(`Matched link source: Hanime.`),await s({url:a,path:o,cwd:l},h)):C===p.Wowxxx?(S.info(`Matched link source: Wowxxx.`),await r({url:a,path:o,cwd:l},h)):C===p.XHamster?(S.info(`Matched link source: XHamster.`),await g({url:a,path:o,cwd:l},h)):C===p.Dirpy?(S.info(`Matched link source: Dirpy.`),f({url:a,path:o||`./dirpy.mp4`,cwd:l},h)):C===p.MP4?(S.info(`Matched link source: mp4.`),await i({url:a,path:o||`./mp4-download.mp4`,cwd:l},h)):C===p.M3U8?(S.info(`Matched link source: m3u8.`),d({url:a,path:o||`./m3u8-download.mp4`,cwd:l})):S.error(`Your link is not supported!`)}export{e as DEFAULT_OPTIONS,p as UrlType,x as __dirname,w as defineConfig,b as downloadAnimeIdHentai,c as downloadBilibili,f as downloadDirpy,s as downloadHanime,y as downloadKoreanPm,_ as downloadMissav,i as downloadVideo,r as downloadWowxxx,g as downloadXHamster,k as fastDownload,O as fastLink,C as getAnimeIdHentaiLink,n as getBilibiliLink,l as getDirpyLink,h as getHanimeLink,o as getKoreanPmLink,a as getMissavLink,m as getWowxxxLink,u as getXHamsterLink,d as remoteM3U8ToMP4};
@@ -0,0 +1,3 @@
1
+ import e from"axios";import{load as t}from"cheerio";import n from"node:path";import{fileURLToPath as r}from"node:url";import{createConfigLoader as i}from"unconfig";import a from"node:process";import{consola as o}from"consola";import s,{createWriteStream as c}from"node:fs";import l from"puppeteer-core";import u from"m3u8stream";var d=Object.create,f=Object.defineProperty,p=Object.getOwnPropertyDescriptor,m=Object.getOwnPropertyNames,h=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty,ee=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),_=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=m(t),a=0,o=i.length,s;a<o;a++)s=i[a],!g.call(e,s)&&s!==n&&f(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=p(t,s))||r.enumerable});return e},v=(e,t,n)=>(n=e==null?{}:d(h(e)),_(t||!e||!e.__esModule?f(n,`default`,{value:e,enumerable:!0}):n,e)),y=`0.3.10`,b={name:`fast-dirpy`,type:`module`,version:y,description:`A simple library/CLI to download video from several websites.`,author:`Vincent-the-gamer`,license:`MIT`,homepage:`https://github.com/Vincent-the-gamer/fast-dirpy#readme`,repository:{type:`git`,url:`git+https://github.com/Vincent-the-gamer/fast-dirpy.git`},bugs:{url:`https://github.com/Vincent-the-gamer/fast-dirpy/issues`},sideEffects:!1,main:`dist/index.mjs`,module:`dist/index.mjs`,types:`dist/index.d.mts`,typesVersions:{"*":{".":[`./dist/index.d.mts`,`./dist/cli.d.mts`]}},bin:{"fast-dirpy":`bin/fast-dirpy.js`},files:[`dist`],scripts:{tsx:`tsx`,build:`tsdown`,test:`vitest`,dep:`taze major -I`,"lint:fix":`eslint . --fix`,login:`pnpm login --registry https://registry.npmjs.com`},publishConfig:{registry:`https://registry.npmjs.com`,access:`public`},dependencies:{ansis:`^4.2.0`,axios:`^1.13.2`,cac:`^6.7.14`,cheerio:`^1.1.2`,consola:`^3.4.2`,m3u8stream:`^0.8.6`,"puppeteer-core":`^24.35.0`,"restore-cursor":`^5.1.0`,unconfig:`^7.4.2`},devDependencies:{"@antfu/eslint-config":`^7.2.0`,"@types/node":`^25.0.10`,deepmerge:`^4.3.1`,eslint:`^9.39.2`,taze:`^19.9.2`,tsdown:`^0.19.0`,tsx:`^4.21.0`,typescript:`^5.9.3`,vitest:`^4.0.17`}};const x={timeout:2e4},S=r(import.meta.url),C=n.dirname(S);var w=ee(((e,t)=>{var n=function(e){return r(e)&&!i(e)};function r(e){return!!e&&typeof e==`object`}function i(e){var t=Object.prototype.toString.call(e);return t===`[object RegExp]`||t===`[object Date]`||o(e)}var a=typeof Symbol==`function`&&Symbol.for?Symbol.for(`react.element`):60103;function o(e){return e.$$typeof===a}function s(e){return Array.isArray(e)?[]:{}}function c(e,t){return t.clone!==!1&&t.isMergeableObject(e)?g(s(e),e,t):e}function l(e,t,n){return e.concat(t).map(function(e){return c(e,n)})}function u(e,t){if(!t.customMerge)return g;var n=t.customMerge(e);return typeof n==`function`?n:g}function d(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[]}function f(e){return Object.keys(e).concat(d(e))}function p(e,t){try{return t in e}catch{return!1}}function m(e,t){return p(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))}function h(e,t,n){var r={};return n.isMergeableObject(e)&&f(e).forEach(function(t){r[t]=c(e[t],n)}),f(t).forEach(function(i){m(e,i)||(p(e,i)&&n.isMergeableObject(t[i])?r[i]=u(i,n)(e[i],t[i],n):r[i]=c(t[i],n))}),r}function g(e,t,r){r||={},r.arrayMerge=r.arrayMerge||l,r.isMergeableObject=r.isMergeableObject||n,r.cloneUnlessOtherwiseSpecified=c;var i=Array.isArray(t);return i===Array.isArray(e)?i?r.arrayMerge(e,t,r):h(e,t,r):c(t,r)}g.all=function(e,t){if(!Array.isArray(e))throw Error(`first argument should be an array`);return e.reduce(function(e,n){return g(e,n,t)},{})},t.exports=g}));const T=o.withTag(`fast-dirpy`);function te(e){`CONSOLA_LEVEL`in a.env||(T.level=e?0:3)}var E=v(w(),1);async function D(e,t){let n=x,{config:r,sources:a}=await i({sources:[{files:[`fast-dirpy.config`],extensions:[`ts`,`mts`,`cts`,`js`,`mjs`,`cjs`,`json`]}],cwd:t||process.cwd(),merge:!1}).load();return a.length?(T.info(`Config file found: ${a[0]}`),(0,E.default)((0,E.default)(n,r),e)):(0,E.default)(n,e)}function O(e){return e[Math.floor(Math.random()*e.length)]}const k=[`Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10`,`Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1`,`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36`,`Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36`,`Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/27.0.1453.93 Chrome/27.0.1453.93 Safari/537.36`];function A(){return O(k)}async function j(t,n=x){let{path:r,url:i}=t,{proxy:a,timeout:o}=await D(n),c=a?.host===``?void 0:a;if(i===``)return Promise.reject(`Extract direct link failed!`);let l=s.createWriteStream(r||`./download.mp4`);return(await e({url:i,headers:{"User-Agent":A(),...n.headers},method:`GET`,responseType:`stream`,proxy:c,timeout:o,onDownloadProgress:e=>{let{loaded:t,total:n,progress:r}=e,i=`loaded:${t} total: ${n} progress: ${(r*100).toFixed(2)}%`;T.info(i)}})).data.pipe(l),new Promise((e,t)=>{l.on(`finish`,e),l.on(`error`,t)})}async function M(e){return await l.launch(e)}async function ne(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await D(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(i,{headers:{"User-Agent":A()},proxy:c,timeout:s}),u=t(l),d=``,f=u(`div.embed.rad2 > iframe`).attr();return f&&(d=f.src),d}async function N(e,t=x){let{url:n,cwd:r}=e,{proxy:i,puppeteer:a}=await D(t,r),o=i?.host===``?void 0:i,s=await ne({url:n},{proxy:o}),{executablePath:c,headless:l}=a,u=await M({executablePath:c,headless:l,args:[`--proxy-server=http://${o?.host}:${i?.port}`]}),d=A(),f=await u.newPage();await f.setUserAgent(d),await f.goto(s),await f.waitForSelector(`div.play.p-pulse`),await f.click(`div.play.p-pulse`),await f.waitForSelector(`div.frame > iframe`);let p=await f.$eval(`div.frame > iframe`,e=>e.src),m=await u.newPage();await m.goto(`${p}`),await m.waitForSelector(`video.jw-video.jw-reset`);let h=await m.$eval(`video.jw-video.jw-reset`,e=>e.src);return await u.close(),h}async function P(e,t=x){let{path:n,url:r,cwd:i}=e;await j({url:await N({url:r},t),path:n,cwd:i},t)}function F(e){let t=e.match(/BV[a-zA-Z0-9]+/);return t?`https://bilibili-real-url.deno.dev/${t[0]}.mp4`:``}async function I(e){let{path:t,url:n}=e,r=F(n);r===``?console.error(`Extract direct link failed!`):await j({url:r,path:t||`./download.mp4`})}async function L(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await D(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(`https://dirpy.com/studio`,{params:{url:i},headers:{"User-Agent":A(),Referer:`https://dirpy.com/studio?url=${i}`},proxy:c,timeout:s}),u=t(l),d=``,f=u(`#media-source`).attr();return f&&(d=f.src),d}async function R(e,t=x){let{path:n,url:r,cwd:i}=e;await j({url:await L({url:r},t),path:n,cwd:i},t)}function z(e,t){return Number(e.size)-Number(t.size)}async function B(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await D(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(i,{headers:{"User-Agent":A(),Referer:`https://hanime1.me/`},proxy:c,timeout:s}),u=t(l)(`source[type="video/mp4"]`);return Object.values(u).map(e=>e.attribs).filter(e=>e!=null).sort(z)}async function V(e,t=x){let{path:n,url:r,cwd:i}=e,a=await B({url:r},t);a.length>0&&T.success(`Successfully get video sources, size ${a[a.length-1].size} to be downloaded.`),await j({url:a[a.length-1].src,path:n,cwd:i},t)}async function H(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await D(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(i,{headers:{"User-Agent":A()},proxy:c,timeout:s}),u=t(l),d=``,f=u(`meta[itemprop="contentURL"]`).attr();return f&&(d=f.content),d}async function U(e,t=x){let{path:n,url:r,cwd:i}=e;await j({url:await H({url:r},t),path:n,cwd:i},t)}function W(e){let{url:t,path:r}=e,i=r??n.resolve(C,`../m3u8-download.mp4`),a=u(t);a.pipe(c(i)),a.on(`progress`,(e,t,n)=>{T.info(`Segment: ${JSON.stringify(e)},
2
+ Total Segments: ${t},
3
+ downloaded: ${(n/1024/1024).toFixed(2)}MB Downloaded`),e.num>=t&&a.end()})}function G(e){return new Promise(t=>setTimeout(t,e*1e3))}async function K(e,t=x){let{url:n,cwd:r}=e,{proxy:i,puppeteer:a}=await D(t,r),o=i?.host===``?void 0:i,{executablePath:s,headless:c}=a,l=await M({executablePath:s,headless:c,args:[`--proxy-server=http://${o?.host}:${i?.port}`,`--disable-features=IsolateOrigins,site-per-process`,`--disable-site-isolation-trials`,`--disable-web-security`,`--disable-setuid-sandbox`,`--no-sandbox`,`--disable-gpu`,`--disable-dev-shm-usage`,`--disable-accelerated-2d-canvas`,`--no-first-run`,`--no-zygote`,`--single-process`,`--window-size=1920,1080`],slowMo:50,timezoneId:`America/New_York`,locale:`en-US`}),u=await l.newPage(),d=A();await u.setUserAgent(d);try{let e=await u.goto(n,{waitUntil:`domcontentloaded`});e&&T.info(`http status: ${e.status()}`);let t=await u.title(),r=await u.content();if(T.info(`Page title: ${t}`),t.includes(`Just a moment`)||r.includes(`Checking your browser`)){T.info(`Cloudflare challenge detected, waiting for it to complete...`);try{T.info(`Waiting for page title to change...`),await u.waitForFunction(`document.title != 'Just a moment...'`,{timeout:3e4}),T.info(`Page title has changed`)}catch(e){T.error(`Timeout waiting for title change: ${e}`);try{for(let e of[`input[type='checkbox']`,`.ray-button`,`#challenge-stage button`,`button:has-text('Verify')`,`button:has-text('Continue')`])if(await u.$(e)){T.info(`Found possible verification button: ${e}`),await u.click(e),G(5);break}}catch(e){T.error(`Failed to click verification button: ${e}`)}}}let i=await u.title();T.info(`current page title: ${i}`),T.info(`Simulating page scroll...`);for(let e=0;e<3;e++)await u.evaluate(`window.scrollBy(0, window.innerHeight / 2)`),await u.evaluate(`window.scrollBy(0, window.innerHeight / 4)`);T.info(`Getting page content...`);let a=await u.content();return T.info(`Page content retrieved successfully.`),a}catch(e){T.error(`Error during scraping: ${e}`)}finally{T.info(`Closing browser`),await l.close()}}async function q(e){let t=e.match(/m3u8\|([a-f0-9|]+)\|com\|surrit\|https\|video/);return t?t[1].split(`|`).reverse().join(`-`):(T.error(`Failed to extract UUID from HTML.`),null)}function J(e){return e.split(`/`).pop()||(T.error(`Failed to extract movie ID from URL.`),null)}async function Y(t){let{url:n,cwd:r}=t,i=await q(await K({url:n,cwd:r})),a=`https://surrit.com/${i}/playlist.m3u8`,{data:o}=await e.get(a),s=o.match(/(?:\d+p|\d+x\d+)\/video\.m3u8/g);return`https://surrit.com/${i}/${s[s.length-1]}`}async function X(e){let{url:t,cwd:n,path:r}=e,i=J(t);W({url:await Y({url:t,cwd:n}),cwd:n,path:r||`${i}.mp4`})}function re(e,t){let n=e.label.slice(0,e.label.length-1),r=t.label.slice(0,t.label.length-1);return Number(n)-Number(r)}async function Z(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await D(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(i,{headers:{"User-Agent":A(),Referer:`https://www.wow.xxx/`},proxy:c,timeout:s}),u=t(l)(`source[type="video/mp4"]`);return Object.values(u).map(e=>e.attribs).filter(e=>e!=null).sort(re)}async function ie(e,t=x){let{path:n,url:r,cwd:i}=e,a=await Z({url:r},t);a.length>0&&T.success(`Successfully get video sources, size ${a[a.length-1].label} to be downloaded.`),await j({url:a[a.length-1].src,path:n,cwd:i},t)}async function Q(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await D(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(i,{headers:{"User-Agent":A(),Referer:`https://xhamster.com`},proxy:c,timeout:s}),u=t(l),d=``,f=u(`head link[rel="preload"][crossorigin="true"][as="fetch"]`).attr();return f&&(d=f.href),d}async function ae(e,t=x){let{path:n,url:r,cwd:i}=e,a=await Q({url:r},t);if(!a)return Promise.reject(Error(`Failed to fetch XHamster video link`));a=a.includes(`1080p`)?a.replace(`_TPL_`,`1080p`):a.includes(`720p`)?a.replace(`_TPL_`,`720p`):a.includes(`480p`)?a.replace(`_TPL_`,`480p`):a.includes(`240p`)?a.replace(`_TPL_`,`240p`):a.replace(`_TPL_`,`144p`),W({url:a,cwd:i,path:n||`./xhamster-vid.mp4`})}let $=function(e){return e[e.Bilibili=0]=`Bilibili`,e[e.AnimeIdHentai=1]=`AnimeIdHentai`,e[e.Dirpy=2]=`Dirpy`,e[e.M3U8=3]=`M3U8`,e[e.KoreanPM=4]=`KoreanPM`,e[e.MissAV=5]=`MissAV`,e[e.Hanime=6]=`Hanime`,e[e.Wowxxx=7]=`Wowxxx`,e[e.XHamster=8]=`XHamster`,e[e.MP4=9]=`MP4`,e}({});function oe(e){return e.includes(`bilibili`)||/BV[a-zA-Z0-9]+/.test(e)?$.Bilibili:e.includes(`animeidhentai`)?$.AnimeIdHentai:e.includes(`koreanpornmovie`)?$.KoreanPM:e.includes(`missav`)?$.MissAV:e.includes(`hanime1.me`)?$.Hanime:e.includes(`wow.xxx`)?$.Wowxxx:e.includes(`xhamster.com`)?$.XHamster:e.endsWith(`.m3u8`)||e.includes(`.m3u8`)&&!e.endsWith(`.mp4`)?$.M3U8:e.endsWith(`.mp4`)||e.includes(`.mp4`)&&!e.endsWith(`.m3u8`)?$.MP4:$.Dirpy}export{x as C,y as E,te as S,b as T,F as _,ie as a,j as b,Y as c,H as d,V as f,I as g,L as h,Q as i,W as l,R as m,$ as n,Z as o,B as p,ae as r,X as s,oe as t,U as u,P as v,C as w,T as x,N as y};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "fast-dirpy",
3
3
  "type": "module",
4
- "version": "0.3.9",
4
+ "version": "0.3.10",
5
5
  "description": "A simple library/CLI to download video from several websites.",
6
6
  "author": "Vincent-the-gamer",
7
7
  "license": "MIT",
@@ -42,20 +42,20 @@
42
42
  "cheerio": "^1.1.2",
43
43
  "consola": "^3.4.2",
44
44
  "m3u8stream": "^0.8.6",
45
- "puppeteer-core": "^24.34.0",
45
+ "puppeteer-core": "^24.35.0",
46
46
  "restore-cursor": "^5.1.0",
47
47
  "unconfig": "^7.4.2"
48
48
  },
49
49
  "devDependencies": {
50
- "@antfu/eslint-config": "^6.7.3",
51
- "@types/node": "^25.0.3",
50
+ "@antfu/eslint-config": "^7.2.0",
51
+ "@types/node": "^25.0.10",
52
52
  "deepmerge": "^4.3.1",
53
53
  "eslint": "^9.39.2",
54
54
  "taze": "^19.9.2",
55
- "tsdown": "^0.18.3",
55
+ "tsdown": "^0.19.0",
56
56
  "tsx": "^4.21.0",
57
57
  "typescript": "^5.9.3",
58
- "vitest": "^4.0.16"
58
+ "vitest": "^4.0.17"
59
59
  },
60
60
  "scripts": {
61
61
  "tsx": "tsx",
@@ -1,3 +0,0 @@
1
- import e from"axios";import{load as t}from"cheerio";import n from"node:path";import{fileURLToPath as r}from"node:url";import{createConfigLoader as i}from"unconfig";import a from"node:process";import{consola as o}from"consola";import s,{createWriteStream as c}from"node:fs";import l from"puppeteer-core";import u from"m3u8stream";var d=Object.create,f=Object.defineProperty,p=Object.getOwnPropertyDescriptor,m=Object.getOwnPropertyNames,h=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty,ee=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),_=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=m(t),a=0,o=i.length,s;a<o;a++)s=i[a],!g.call(e,s)&&s!==n&&f(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=p(t,s))||r.enumerable});return e},v=(e,t,n)=>(n=e==null?{}:d(h(e)),_(t||!e||!e.__esModule?f(n,`default`,{value:e,enumerable:!0}):n,e)),y=`0.3.9`,b={name:`fast-dirpy`,type:`module`,version:y,description:`A simple library/CLI to download video from several websites.`,author:`Vincent-the-gamer`,license:`MIT`,homepage:`https://github.com/Vincent-the-gamer/fast-dirpy#readme`,repository:{type:`git`,url:`git+https://github.com/Vincent-the-gamer/fast-dirpy.git`},bugs:{url:`https://github.com/Vincent-the-gamer/fast-dirpy/issues`},sideEffects:!1,main:`dist/index.mjs`,module:`dist/index.mjs`,types:`dist/index.d.mts`,typesVersions:{"*":{".":[`./dist/index.d.mts`,`./dist/cli.d.mts`]}},bin:{"fast-dirpy":`bin/fast-dirpy.js`},files:[`dist`],scripts:{tsx:`tsx`,build:`tsdown`,test:`vitest`,dep:`taze major -I`,"lint:fix":`eslint . --fix`,login:`pnpm login --registry https://registry.npmjs.com`},publishConfig:{registry:`https://registry.npmjs.com`,access:`public`},dependencies:{ansis:`^4.2.0`,axios:`^1.13.2`,cac:`^6.7.14`,cheerio:`^1.1.2`,consola:`^3.4.2`,m3u8stream:`^0.8.6`,"puppeteer-core":`^24.34.0`,"restore-cursor":`^5.1.0`,unconfig:`^7.4.2`},devDependencies:{"@antfu/eslint-config":`^6.7.3`,"@types/node":`^25.0.3`,deepmerge:`^4.3.1`,eslint:`^9.39.2`,taze:`^19.9.2`,tsdown:`^0.18.3`,tsx:`^4.21.0`,typescript:`^5.9.3`,vitest:`^4.0.16`}};const x={timeout:2e4},S=r(import.meta.url),C=n.dirname(S);var w=ee(((e,t)=>{var n=function(e){return r(e)&&!i(e)};function r(e){return!!e&&typeof e==`object`}function i(e){var t=Object.prototype.toString.call(e);return t===`[object RegExp]`||t===`[object Date]`||o(e)}var a=typeof Symbol==`function`&&Symbol.for?Symbol.for(`react.element`):60103;function o(e){return e.$$typeof===a}function s(e){return Array.isArray(e)?[]:{}}function c(e,t){return t.clone!==!1&&t.isMergeableObject(e)?g(s(e),e,t):e}function l(e,t,n){return e.concat(t).map(function(e){return c(e,n)})}function u(e,t){if(!t.customMerge)return g;var n=t.customMerge(e);return typeof n==`function`?n:g}function d(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[]}function f(e){return Object.keys(e).concat(d(e))}function p(e,t){try{return t in e}catch{return!1}}function m(e,t){return p(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))}function h(e,t,n){var r={};return n.isMergeableObject(e)&&f(e).forEach(function(t){r[t]=c(e[t],n)}),f(t).forEach(function(i){m(e,i)||(p(e,i)&&n.isMergeableObject(t[i])?r[i]=u(i,n)(e[i],t[i],n):r[i]=c(t[i],n))}),r}function g(e,t,r){r||={},r.arrayMerge=r.arrayMerge||l,r.isMergeableObject=r.isMergeableObject||n,r.cloneUnlessOtherwiseSpecified=c;var i=Array.isArray(t);return i===Array.isArray(e)?i?r.arrayMerge(e,t,r):h(e,t,r):c(t,r)}g.all=function(e,t){if(!Array.isArray(e))throw Error(`first argument should be an array`);return e.reduce(function(e,n){return g(e,n,t)},{})},t.exports=g}));const T=o.withTag(`fast-dirpy`);function E(e){`CONSOLA_LEVEL`in a.env||(T.level=e?0:3)}var D=v(w(),1);async function O(e,t){let n=x,{config:r,sources:a}=await i({sources:[{files:[`fast-dirpy.config`],extensions:[`ts`,`mts`,`cts`,`js`,`mjs`,`cjs`,`json`]}],cwd:t||process.cwd(),merge:!1}).load();return a.length?(T.info(`Config file found: ${a[0]}`),(0,D.default)((0,D.default)(n,r),e)):(0,D.default)(n,e)}function k(e){return e[Math.floor(Math.random()*e.length)]}const A=[`Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10`,`Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1`,`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36`,`Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36`,`Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/27.0.1453.93 Chrome/27.0.1453.93 Safari/537.36`];function j(){return k(A)}async function M(t,n=x){let{path:r,url:i}=t,{proxy:a,timeout:o}=await O(n),c=a?.host===``?void 0:a;if(i===``)return Promise.reject(`Extract direct link failed!`);let l=s.createWriteStream(r||`./download.mp4`);return(await e({url:i,headers:{"User-Agent":j(),...n.headers},method:`GET`,responseType:`stream`,proxy:c,timeout:o,onDownloadProgress:e=>{let{loaded:t,total:n,progress:r}=e,i=`loaded:${t} total: ${n} progress: ${(r*100).toFixed(2)}%`;T.info(i)}})).data.pipe(l),new Promise((e,t)=>{l.on(`finish`,e),l.on(`error`,t)})}async function N(e){return await l.launch(e)}async function te(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await O(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(i,{headers:{"User-Agent":j()},proxy:c,timeout:s}),u=t(l),d=``,f=u(`div.embed.rad2 > iframe`).attr();return f&&(d=f.src),d}async function P(e,t=x){let{url:n,cwd:r}=e,{proxy:i,puppeteer:a}=await O(t,r),o=i?.host===``?void 0:i,s=await te({url:n},{proxy:o}),{executablePath:c,headless:l}=a,u=await N({executablePath:c,headless:l,args:[`--proxy-server=http://${o?.host}:${i?.port}`]}),d=j(),f=await u.newPage();await f.setUserAgent(d),await f.goto(s),await f.waitForSelector(`div.play.p-pulse`),await f.click(`div.play.p-pulse`),await f.waitForSelector(`div.frame > iframe`);let p=await f.$eval(`div.frame > iframe`,e=>e.src),m=await u.newPage();await m.goto(`${p}`),await m.waitForSelector(`video.jw-video.jw-reset`);let h=await m.$eval(`video.jw-video.jw-reset`,e=>e.src);return await u.close(),h}async function F(e,t=x){let{path:n,url:r,cwd:i}=e;await M({url:await P({url:r},t),path:n,cwd:i},t)}function I(e){let t=e.match(/BV[a-zA-Z0-9]+/);return t?`https://bilibili-real-url.deno.dev/${t[0]}.mp4`:``}async function L(e){let{path:t,url:n}=e,r=I(n);r===``?console.error(`Extract direct link failed!`):await M({url:r,path:t||`./download.mp4`})}async function R(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await O(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(`https://dirpy.com/studio`,{params:{url:i},headers:{"User-Agent":j(),Referer:`https://dirpy.com/studio?url=${i}`},proxy:c,timeout:s}),u=t(l),d=``,f=u(`#media-source`).attr();return f&&(d=f.src),d}async function z(e,t=x){let{path:n,url:r,cwd:i}=e;await M({url:await R({url:r},t),path:n,cwd:i},t)}function B(e,t){return Number(e.size)-Number(t.size)}async function V(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await O(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(i,{headers:{"User-Agent":j(),Referer:`https://hanime1.me/`},proxy:c,timeout:s}),u=t(l)(`source[type="video/mp4"]`);return Object.values(u).map(e=>e.attribs).filter(e=>e!=null).sort(B)}async function H(e,t=x){let{path:n,url:r,cwd:i}=e,a=await V({url:r},t);a.length>0&&T.success(`Successfully get video sources, size ${a[a.length-1].size} to be downloaded.`),await M({url:a[a.length-1].src,path:n,cwd:i},t)}async function U(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await O(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(i,{headers:{"User-Agent":j()},proxy:c,timeout:s}),u=t(l),d=``,f=u(`meta[itemprop="contentURL"]`).attr();return f&&(d=f.content),d}async function W(e,t=x){let{path:n,url:r,cwd:i}=e;await M({url:await U({url:r},t),path:n,cwd:i},t)}function G(e){let{url:t,path:r}=e,i=r??n.resolve(C,`../m3u8-download.mp4`),a=u(t);a.pipe(c(i)),a.on(`progress`,(e,t,n)=>{T.info(`Segment: ${JSON.stringify(e)},
2
- Total Segments: ${t},
3
- downloaded: ${(n/1024/1024).toFixed(2)}MB Downloaded`),e.num>=t&&a.end()})}function K(e){return new Promise(t=>setTimeout(t,e*1e3))}async function q(e,t=x){let{url:n,cwd:r}=e,{proxy:i,puppeteer:a}=await O(t,r),o=i?.host===``?void 0:i,{executablePath:s,headless:c}=a,l=await N({executablePath:s,headless:c,args:[`--proxy-server=http://${o?.host}:${i?.port}`,`--disable-features=IsolateOrigins,site-per-process`,`--disable-site-isolation-trials`,`--disable-web-security`,`--disable-setuid-sandbox`,`--no-sandbox`,`--disable-gpu`,`--disable-dev-shm-usage`,`--disable-accelerated-2d-canvas`,`--no-first-run`,`--no-zygote`,`--single-process`,`--window-size=1920,1080`],slowMo:50,timezoneId:`America/New_York`,locale:`en-US`}),u=await l.newPage(),d=j();await u.setUserAgent(d);try{let e=await u.goto(n,{waitUntil:`domcontentloaded`});e&&T.info(`http status: ${e.status()}`);let t=await u.title(),r=await u.content();if(T.info(`Page title: ${t}`),t.includes(`Just a moment`)||r.includes(`Checking your browser`)){T.info(`Cloudflare challenge detected, waiting for it to complete...`);try{T.info(`Waiting for page title to change...`),await u.waitForFunction(`document.title != 'Just a moment...'`,{timeout:3e4}),T.info(`Page title has changed`)}catch(e){T.error(`Timeout waiting for title change: ${e}`);try{for(let e of[`input[type='checkbox']`,`.ray-button`,`#challenge-stage button`,`button:has-text('Verify')`,`button:has-text('Continue')`])if(await u.$(e)){T.info(`Found possible verification button: ${e}`),await u.click(e),K(5);break}}catch(e){T.error(`Failed to click verification button: ${e}`)}}}let i=await u.title();T.info(`current page title: ${i}`),T.info(`Simulating page scroll...`);for(let e=0;e<3;e++)await u.evaluate(`window.scrollBy(0, window.innerHeight / 2)`),await u.evaluate(`window.scrollBy(0, window.innerHeight / 4)`);T.info(`Getting page content...`);let a=await u.content();return T.info(`Page content retrieved successfully.`),a}catch(e){T.error(`Error during scraping: ${e}`)}finally{T.info(`Closing browser`),await l.close()}}async function J(e){let t=e.match(/m3u8\|([a-f0-9|]+)\|com\|surrit\|https\|video/);return t?t[1].split(`|`).reverse().join(`-`):(T.error(`Failed to extract UUID from HTML.`),null)}function Y(e){return e.split(`/`).pop()||(T.error(`Failed to extract movie ID from URL.`),null)}async function X(t){let{url:n,cwd:r}=t,i=await J(await q({url:n,cwd:r})),a=`https://surrit.com/${i}/playlist.m3u8`,{data:o}=await e.get(a),s=o.match(/(?:\d+p|\d+x\d+)\/video\.m3u8/g);return`https://surrit.com/${i}/${s[s.length-1]}`}async function Z(e){let{url:t,cwd:n,path:r}=e,i=Y(t);await G({url:await X({url:t,cwd:n}),cwd:n,path:r||`${i}.mp4`})}function ne(e,t){let n=e.label.slice(0,e.label.length-1),r=t.label.slice(0,t.label.length-1);return Number(n)-Number(r)}async function Q(n,r=x){let{url:i,cwd:a}=n,{proxy:o,timeout:s}=await O(r,a),c=o?.host===``?void 0:o,{data:l}=await e.get(i,{headers:{"User-Agent":j(),Referer:`https://www.wow.xxx/`},proxy:c,timeout:s}),u=t(l)(`source[type="video/mp4"]`);return Object.values(u).map(e=>e.attribs).filter(e=>e!=null).sort(ne)}async function re(e,t=x){let{path:n,url:r,cwd:i}=e,a=await Q({url:r},t);a.length>0&&T.success(`Successfully get video sources, size ${a[a.length-1].label} to be downloaded.`),await M({url:a[a.length-1].src,path:n,cwd:i},t)}let $=function(e){return e[e.Bilibili=0]=`Bilibili`,e[e.AnimeIdHentai=1]=`AnimeIdHentai`,e[e.Dirpy=2]=`Dirpy`,e[e.M3U8=3]=`M3U8`,e[e.KoreanPM=4]=`KoreanPM`,e[e.MissAV=5]=`MissAV`,e[e.Hanime=6]=`Hanime`,e[e.Wowxxx=7]=`Wowxxx`,e[e.MP4=8]=`MP4`,e}({});function ie(e){return e.includes(`bilibili`)||/BV[a-zA-Z0-9]+/.test(e)?$.Bilibili:e.includes(`animeidhentai`)?$.AnimeIdHentai:e.includes(`koreanpornmovie`)?$.KoreanPM:e.includes(`missav`)?$.MissAV:e.includes(`hanime1.me`)?$.Hanime:e.includes(`wow.xxx`)?$.Wowxxx:e.endsWith(`.m3u8`)||e.includes(`.m3u8`)&&!e.endsWith(`.mp4`)?$.M3U8:e.endsWith(`.mp4`)||e.includes(`.mp4`)&&!e.endsWith(`.m3u8`)?$.MP4:$.Dirpy}export{b as C,C as S,P as _,Z as a,E as b,W as c,V as d,z as f,F as g,I as h,Q as i,U as l,L as m,$ as n,X as o,R as p,re as r,G as s,ie as t,H as u,M as v,y as w,x,T as y};