UNPKG

odesus

Version:

OdesuS (Otakudesu Scraper) is a simple scraper for otakudesu.ltd

2 lines (1 loc) 7.22 kB
var k=Object.defineProperty;var P=(o,e)=>{for(var t in e)k(o,t,{get:e[t],enumerable:!0})};import{load as S}from"cheerio";import{load as p}from"cheerio";import*as l from"gaxios";var c=o=>{let e=p(o),t=a=>({url:a.attribs.href,source:p(a).text().trim()});return{resolution:e("strong").text().trim(),size:e("i").text().trim(),urls:e("a").map((a,n)=>t(n)).toArray()}},q=o=>{let e=p(o),t=e("a").attr("data-content");if(!t)return;let a=JSON.parse(atob(t));return{source:e("a").text().trim(),resolution:a.q,_encoded:t,async getNonceCode(){return(await l.request({url:"/wp-admin/admin-ajax.php",method:"POST",data:new URLSearchParams({action:"aa1208d27f29ca340c92c66d1926f13f"}).toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data.data},async getMirrorUrl(n){n||(n=await this.getNonceCode());let r=await l.request({url:"/wp-admin/admin-ajax.php",method:"POST",data:new URLSearchParams({q:a.q,i:a.i.toString(),id:a.id.toString(),action:"2a3505c93b0035d3f455df82bf976b84",nonce:n}).toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"}});return p(atob(r.data.data))("iframe").attr("src")},async getStreamUrl(){var i,d;let n=await this.getMirrorUrl();if(!n)return;let r=await l.request({url:n,baseUrl:""});if(r.status!==200)throw new Error("Unexpected Response#status from frameUrl");let s=(i=/(?:'|")file(?:'|"):(?:'|")(.+)(?:'|")(?:,)/gi.exec(r.data))!=null?i:/\[{'file':'(.+)','type/gi.exec(r.data);return(d=s==null?void 0:s.at(1))!=null?d:void 0},async getStreamFileSize(){var s;let n=await this.getStreamUrl();if(!(n!=null&&n.length))return;let r=await l.request({url:n,baseUrl:"",method:"HEAD"});return parseInt((s=r.headers["content-length"])!=null?s:"0",10)},async stream(n){let r=await this.getStreamUrl();if(!(r!=null&&r.length))throw new Error("Fail to extract the streamUrl");let s={downloadedChunks:0,fileSize:await this.getStreamFileSize()};if(!s.fileSize)throw new Error("Fail to extract the file size");let i=await l.request({method:"GET",url:r,baseUrl:"",responseType:"stream",...n});return i.data.on("data",d=>{s.downloadedChunks+=Buffer.from(d).length,i.data.emit("progress",{downloaded:s.downloadedChunks,total:s.fileSize,progress:s.downloadedChunks/s.fileSize*100})}),i.data}}},x=async(o,e)=>{var n;if(e.type!=="episode")throw new TypeError("Invalid slug.type");let t=await o.request({url:"/".concat(e.type,"/",encodeURIComponent(e.slug))});if(t.status!==200)return;let a=p(t.data);return{title:a("h1.posttl").text().trim(),postedBy:a(".kategoz span").eq(0).text().replace(/posted by/gi,"").trim(),releasedTime:a(".kategoz span").eq(1).text().replace(/release on/gi,"").trim(),downloads:a(".download ul li").map((r,s)=>c(s)).toArray(),url:t.request.responseURL,picture:(n=a(".cukder img.wp-post-image").attr("src"))!=null?n:"-",credit:a(".infozingle p").eq(0).text().trim(),mirrors:a(".mirrorstream ul li").map((r,s)=>q(s)).toArray()}};var U=(o,e,t)=>{let n=S(e).text().trim();if(o%2===0){let r={japanese:"japaneseName",studios:"studio",duration:"duration",type:"type",judul:"name",producers:"producers",aired:"aired",credit:"credit",rating:"rating",episodes:"totalEpisodes"},s=n.toLowerCase(),i=Reflect.get(r,s);Reflect.set(t,"_key",i),i&&Reflect.set(t,i,"")}else{let r=Reflect.get(t,"_key");if(r){let s=n.replace(/:/g,"").trim();Reflect.set(t,r,s),!isNaN(parseFloat(s))&&r!=="duration"?Reflect.set(t,r,parseFloat(s)):r==="aired"?Reflect.set(t,r,new Date(s)):r==="genres"&&Reflect.set(t,r,s.split(",").map(i=>i.trim())),Reflect.deleteProperty(t,"_key")}}},w=async(o,e)=>{if(e.type!=="batch")throw new TypeError("Invalid slug.type");let t=await o.request({url:"/".concat(e.type,"/",encodeURIComponent(e.slug)),follow:0});if(t.status!==200)return;let a=S(t.data),n={name:void 0,totalEpisodes:void 0,duration:void 0,producers:void 0,rating:0,genres:[],japaneseName:void 0,studio:void 0,url:t.request.responseURL,credit:void 0,aired:void 0,downloads:a(".download2 .batchlink ul li").map((r,s)=>c(s)).toArray()};return a(".infos").contents().filter((r,s)=>a(s).text().trim().length>1).each((r,s)=>{U(r,s,n)}),n};import{load as m}from"cheerio";var I=async(o,e)=>{let t=m(o),a=i=>({name:m(i).text(),url:i.attribs.href}),[n,r]=[t("b").text().trim().toLowerCase(),t("span").contents().eq(1).text().replace(/:/g,"").trim()],s={japanese:"japaneseName",studio:"studio",durasi:"duration",status:"status",tipe:"type",judul:"name",produser:"producers"};if(n==="tanggal rilis")Reflect.set(e,"releasedAt",new Date(r));else if(n==="total episode")Reflect.set(e,"totalEpisodes",r==="?"?0:parseInt(r,10));else if(n==="skor")Reflect.set(e,"rating",parseFloat(r));else if(n==="genre")Reflect.set(e,"genres",t("a").map((i,d)=>a(d)).toArray());else{let i=Reflect.get(s,n);i&&Reflect.set(e,i,r)}},G=o=>{let e=m(o);return{title:e("a").text().trim(),url:e("a").attr("href"),uploadedAt:new Date(e(".zeebr").text().trim())}},E=async(o,e)=>{var r;if(e.type!=="anime")throw new TypeError("Invalid slug.type");let t=await o.request({method:"GET",url:"/".concat(e.type,"/",encodeURIComponent(e.slug))});if(t.status!==200)return;let a=m(t.data);if(/anime archive/gi.test(a("title").text().trim()))return;let n={name:"",image:(r=a("img.wp-post-image").attr("src"))!=null?r:"-",genres:[],url:t.request.responseURL,rating:0,status:"unknown",synopsis:a(".sinopc").text().trim(),japaneseName:"",type:"",totalEpisodes:0,duration:"",studio:"",releasedAt:new Date,producers:"",episodes:a(".episodelist ul li").map((s,i)=>G(i)).toArray()};return await Promise.all(a(".infozingle p").map(async(s,i)=>I(i,n)).toArray()),n};var g={};P(g,{resolveSlug:()=>u});var u=o=>{try{let e=new URL(o).pathname.split("/").filter(t=>t.length);return{type:e[0],slug:e[1]}}catch{return}};import{load as T}from"cheerio";var R=async o=>{let e=await o.request({url:"/jadwal-rilis"}),t=T(e.data);return t(".kglist321").map((n,r)=>({day:t(r).find("h2").text().trim(),animes:t(r).find("ul li").map((s,i)=>{var d,h;return{name:t(i).find("a").text().trim(),url:(d=t(i).find("a").attr("href"))!=null?d:"-",slug:u((h=t(i).find("a").attr("href"))!=null?h:"-")}}).toArray()})).toArray()};import{load as f}from"cheerio";var _=o=>{var a;let e=f(o),t=n=>({name:f(n).text().trim(),url:n.attribs.href});return{image:e("img").attr("src"),name:e("h2").text().trim(),url:e("h2 a").attr("href"),genres:e("div").eq(0).find("a").map((n,r)=>t(r)).toArray(),status:e("div").eq(1).eq(0).text().replace(/(status|\s+|:)/gi,"").trim().toLowerCase(),rating:(a=parseFloat(e("div").eq(2).eq(0).text().replace(/(rating|\s+|:)/gi,"").trim()))!=null?a:0,getSlug:()=>u(e("h2 a").attr("href"))}},A=async(o,e)=>{let t=await o.request({url:"/",params:{s:encodeURIComponent(e),post_type:"anime"}});if(t.status===200){let a=f(t.data);return a("ul.chivsrc li").length?a("ul.chivsrc li").map((n,r)=>_(r)).toArray():[]}return[]};import*as y from"gaxios";var $={};var b=class{constructor(e="https://otakudesu.cloud"){y.instance.defaults={baseUrl:e,headers:{"User-Agent":"Odesus/1.0"}},this.client=y.instance}async search(e){return A(this.client,e)}async getAnimeInfo(e){return E(this.client,e)}async getEpisode(e){return x(this.client,e)}async getBatch(e){return w(this.client,e)}async getSchedules(){return R(this.client)}};export{b as Odesus,$ as Types,g as Util};