From c6710540457cd81e86c5cbdff2cf6a1e2a4e431b Mon Sep 17 00:00:00 2001 From: Himanshu Date: Fri, 19 Jun 2026 17:49:44 +0530 Subject: [PATCH] fix: update animetsu stream logic and bump version --- dist/animetsu/stream.js | 2 +- manifest.json | 2 +- providers/animetsu/stream.ts | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/dist/animetsu/stream.js b/dist/animetsu/stream.js index c350049..1fc032b 100644 --- a/dist/animetsu/stream.js +++ b/dist/animetsu/stream.js @@ -1 +1 @@ -"use strict";var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value:value}):obj[key]=value,__spreadValues=(a,b)=>{for(var prop in b||(b={}))__hasOwnProp.call(b,prop)&&__defNormalProp(a,prop,b[prop]);if(__getOwnPropSymbols)for(var prop of __getOwnPropSymbols(b))__propIsEnum.call(b,prop)&&__defNormalProp(a,prop,b[prop]);return a},__spreadProps=(a,b)=>__defProps(a,__getOwnPropDescs(b)),__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),stream_exports={};__export(stream_exports,{getStream:()=>getStream});var getStream=__name(function(_0){return __async(this,arguments,function*({link:id,providerContext:providerContext}){var _a;try{const{axios:axios,openWebView:openWebView,commonHeaders:commonHeaders}=providerContext,baseUrl="https://animetsu.net";let wafCookies;try{yield axios.get(baseUrl,{headers:__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl})})}catch(error){if(403===(null==(_a=error.response)?void 0:_a.status)){const wafResult=yield openWebView(baseUrl,{title:"Solve the captcha below and click done",description:"Required to bypass Animetsu anti-bot protection.",headers:__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl}),force:!0,waitForCookie:"cf_clearance"});wafCookies=wafResult.cookies}}const[animeId,episodeNumber]=id.split(":");if(!animeId||!episodeNumber)throw new Error("Invalid link format");const servers=["sage","meg","dio","kite"],streamLinks=[];return yield Promise.all(servers.map(server=>__async(null,null,function*(){try{const url=`${baseUrl}/v2/api/anime/oppai/${animeId}/${episodeNumber}?server=${server}&source_type=sub`,res=yield axios.get(url,{headers:__spreadValues(__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl}),wafCookies?{Cookie:wafCookies}:{})});if(res.data&&res.data.sources){const subtitles=[];res.data.subs&&Array.isArray(res.data.subs)&&res.data.subs.forEach(sub=>{if(sub.url&&sub.lang){const langCode=sub.lang.toLowerCase().includes("english")?"en":sub.lang.toLowerCase().includes("arabic")?"ar":sub.lang.toLowerCase().includes("french")?"fr":sub.lang.toLowerCase().includes("german")?"de":sub.lang.toLowerCase().includes("italian")?"it":sub.lang.toLowerCase().includes("portuguese")?"pt":sub.lang.toLowerCase().includes("russian")?"ru":sub.lang.toLowerCase().includes("spanish")?"es":"und";subtitles.push({title:sub.lang,language:langCode,type:"text/vtt",uri:sub.url})}}),res.data.sources.forEach(source=>{const sourceUrl=source.url.startsWith("/")?`${baseUrl}${source.url}`:source.url;streamLinks.push({server:`${server} (Sub): ${source.quality}`,link:`https://m3u8.8man.workers.dev?url=${encodeURIComponent(sourceUrl)}`,type:"m3u8",quality:source.quality,headers:{referer:baseUrl},subtitles:subtitles.length>0?subtitles:[]})})}}catch(e){console.log(`Error with server ${server}:`,e)}}))),yield Promise.all(servers.map(server=>__async(null,null,function*(){try{const url=`${baseUrl}/v2/api/anime/oppai/${animeId}/${episodeNumber}?server=${server}&source_type=dub`,res=yield axios.get(url,{headers:__spreadValues(__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl}),wafCookies?{Cookie:wafCookies}:{})});if(res.data&&res.data.sources){const subtitles=[];res.data.subs&&Array.isArray(res.data.subs)&&res.data.subs.forEach(sub=>{if(sub.url&&sub.lang){const langCode=sub.lang.toLowerCase().includes("english")?"en":sub.lang.toLowerCase().includes("arabic")?"ar":sub.lang.toLowerCase().includes("french")?"fr":sub.lang.toLowerCase().includes("german")?"de":sub.lang.toLowerCase().includes("italian")?"it":sub.lang.toLowerCase().includes("portuguese")?"pt":sub.lang.toLowerCase().includes("russian")?"ru":sub.lang.toLowerCase().includes("spanish")?"es":"und";subtitles.push({title:sub.lang,language:langCode,type:"text/vtt",uri:sub.url})}}),res.data.sources.forEach(source=>{const sourceUrl=source.url.startsWith("/")?`${baseUrl}${source.url}`:source.url;streamLinks.push({server:`${server} (Dub): ${source.quality}`,link:`https://m3u8.8man.workers.dev?url=${encodeURIComponent(sourceUrl)}`,type:"m3u8",quality:source.quality,headers:{referer:baseUrl},subtitles:subtitles.length>0?subtitles:[]})})}}catch(e){console.log(`Error with server ${server} (dub):`,e)}}))),console.log("Stream links:",streamLinks),streamLinks}catch(err){return console.error("animetsu stream error:",err),[]}})},"getStream");exports.getStream=getStream; \ No newline at end of file +"use strict";var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value:value}):obj[key]=value,__spreadValues=(a,b)=>{for(var prop in b||(b={}))__hasOwnProp.call(b,prop)&&__defNormalProp(a,prop,b[prop]);if(__getOwnPropSymbols)for(var prop of __getOwnPropSymbols(b))__propIsEnum.call(b,prop)&&__defNormalProp(a,prop,b[prop]);return a},__spreadProps=(a,b)=>__defProps(a,__getOwnPropDescs(b)),__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),stream_exports={};__export(stream_exports,{getStream:()=>getStream});var getStream=__name(function(_0){return __async(this,arguments,function*({link:id,providerContext:providerContext}){var _a;try{const{axios:axios,openWebView:openWebView,commonHeaders:commonHeaders}=providerContext,baseUrl="https://animetsu.net",streamUrl="https://swiftstream.top/proxy";let wafCookies;try{yield axios.get(baseUrl,{headers:__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl})})}catch(error){if(403===(null==(_a=error.response)?void 0:_a.status)){const wafResult=yield openWebView(baseUrl,{title:"Solve the captcha below and click done",description:"Required to bypass Animetsu anti-bot protection.",headers:__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl}),force:!0,waitForCookie:"cf_clearance"});wafCookies=wafResult.cookies}}const[animeId,episodeNumber]=id.split(":");if(!animeId||!episodeNumber)throw new Error("Invalid link format");const servers=["sage","meg","dio","kite"],streamLinks=[];return yield Promise.all(servers.map(server=>__async(null,null,function*(){try{const url=`${baseUrl}/v2/api/anime/oppai/${animeId}/${episodeNumber}?server=${server}&source_type=sub`,res=yield axios.get(url,{headers:__spreadValues(__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl}),wafCookies?{Cookie:wafCookies}:{})});if(res.data&&res.data.sources){const subtitles=[];res.data.subs&&Array.isArray(res.data.subs)&&res.data.subs.forEach(sub=>{if(sub.url&&sub.lang){const langCode=sub.lang.toLowerCase().includes("english")?"en":sub.lang.toLowerCase().includes("arabic")?"ar":sub.lang.toLowerCase().includes("french")?"fr":sub.lang.toLowerCase().includes("german")?"de":sub.lang.toLowerCase().includes("italian")?"it":sub.lang.toLowerCase().includes("portuguese")?"pt":sub.lang.toLowerCase().includes("russian")?"ru":sub.lang.toLowerCase().includes("spanish")?"es":"und";subtitles.push({title:sub.lang,language:langCode,type:"text/vtt",uri:sub.url})}}),res.data.sources.forEach(source=>{const sourceUrl=source.url.startsWith("/")?`${streamUrl}${source.url}`:source.url;streamLinks.push({server:`${server} (Sub): ${source.quality}`,link:sourceUrl,type:"m3u8",quality:source.quality,headers:{referer:baseUrl},subtitles:subtitles.length>0?subtitles:[]})})}}catch(e){console.log(`Error with server ${server}:`,e)}}))),yield Promise.all(servers.map(server=>__async(null,null,function*(){try{const url=`${baseUrl}/v2/api/anime/oppai/${animeId}/${episodeNumber}?server=${server}&source_type=dub`,res=yield axios.get(url,{headers:__spreadValues(__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl}),wafCookies?{Cookie:wafCookies}:{})});if(res.data&&res.data.sources){const subtitles=[];res.data.subs&&Array.isArray(res.data.subs)&&res.data.subs.forEach(sub=>{if(sub.url&&sub.lang){const langCode=sub.lang.toLowerCase().includes("english")?"en":sub.lang.toLowerCase().includes("arabic")?"ar":sub.lang.toLowerCase().includes("french")?"fr":sub.lang.toLowerCase().includes("german")?"de":sub.lang.toLowerCase().includes("italian")?"it":sub.lang.toLowerCase().includes("portuguese")?"pt":sub.lang.toLowerCase().includes("russian")?"ru":sub.lang.toLowerCase().includes("spanish")?"es":"und";subtitles.push({title:sub.lang,language:langCode,type:"text/vtt",uri:sub.url})}}),res.data.sources.forEach(source=>{const sourceUrl=source.url.startsWith("/")?`${streamUrl}${source.url}`:source.url;streamLinks.push({server:`${server} (Dub): ${source.quality}`,link:sourceUrl,type:"m3u8",quality:source.quality,headers:{referer:baseUrl},subtitles:subtitles.length>0?subtitles:[]})})}}catch(e){console.log(`Error with server ${server} (dub):`,e)}}))),console.log("Stream links:",streamLinks),streamLinks}catch(err){return console.error("animetsu stream error:",err),[]}})},"getStream");exports.getStream=getStream; \ No newline at end of file diff --git a/manifest.json b/manifest.json index 46bed87..fe924c2 100644 --- a/manifest.json +++ b/manifest.json @@ -258,7 +258,7 @@ { "display_name": "Animetsu", "value": "animetsu", - "version": "1.3", + "version": "1.4", "icon": "", "type": "english", "disabled": false diff --git a/providers/animetsu/stream.ts b/providers/animetsu/stream.ts index 315c5f1..fba7868 100644 --- a/providers/animetsu/stream.ts +++ b/providers/animetsu/stream.ts @@ -10,6 +10,7 @@ export const getStream = async function ({ try { const { axios, openWebView, commonHeaders } = providerContext; const baseUrl = "https://animetsu.net"; + const streamUrl = `https://swiftstream.top/proxy`; let wafCookies: string | undefined; try { @@ -86,11 +87,11 @@ export const getStream = async function ({ } res.data.sources.forEach((source: any) => { const sourceUrl = source.url.startsWith("/") - ? `${baseUrl}${source.url}` + ? `${streamUrl}${source.url}` : source.url; streamLinks.push({ server: `${server} (Sub): ${source.quality}`, - link: `https://m3u8.8man.workers.dev?url=${encodeURIComponent(sourceUrl)}`, + link: sourceUrl, type: "m3u8", quality: source.quality, headers: { @@ -155,11 +156,11 @@ export const getStream = async function ({ } res.data.sources.forEach((source: any) => { const sourceUrl = source.url.startsWith("/") - ? `${baseUrl}${source.url}` + ? `${streamUrl}${source.url}` : source.url; streamLinks.push({ server: `${server} (Dub): ${source.quality}`, - link: `https://m3u8.8man.workers.dev?url=${encodeURIComponent(sourceUrl)}`, + link: sourceUrl, type: "m3u8", quality: source.quality, headers: {