From 597f279e491d8dfb86dae16b9f7bd2556e5dac05 Mon Sep 17 00:00:00 2001 From: aka paul <80717571+50n50@users.noreply.github.com> Date: Wed, 27 May 2026 20:30:23 +0200 Subject: [PATCH] update --- {1movies => .archive/1movies}/1movies.js | 0 {1movies => .archive/1movies}/1movies.json | 0 {anicrush => .archive/anicrush}/anicrush.js | 0 {anicrush => .archive/anicrush}/anicrush.json | 0 .../anime-sama}/anime-sama.js | 17 +- .../animebalkan}/animebalkan.js | 0 .../animebalkan}/animebalkan.json | 0 .../animebalkan}/iconalt.png | Bin .../animeindo}/animeindo.js | 0 .../animeindo}/animeindo.json | 0 {animekai => .archive/animekai}/animekai.js | 0 {animekai => .archive/animekai}/animekai.json | 0 .../animekai}/arabic/animekai.js | 0 .../animekai}/arabic/animekai.json | 0 .../animekai}/dub/animekai.js | 0 .../animekai}/dub/animekai.json | 0 .../animekai}/hardsub/animekai.js | 0 .../animekai}/hardsub/animekai.json | 0 {animeler => .archive/animeler}/animeler.js | 0 {animeler => .archive/animeler}/animeler.json | 0 .../animenana}/animenana.js | 0 .../animenana}/animenana.json | 0 {animenix => .archive/animenix}/animenix.js | 0 {animenix => .archive/animenix}/animenix.json | 0 .../animesaturn}/animesaturn.js | 0 .../animesaturn}/animesaturn.json | 0 {animez => .archive/animez}/animez.js | 0 {animez => .archive/animez}/animez.json | 0 {aniwatch => .archive/aniwatch}/aniwatch.js | 0 {aniwatch => .archive/aniwatch}/aniwatch.json | 0 {ashi => .archive/ashi}/ashi.js | 0 {ashi => .archive/ashi}/ashi.json | 0 .../crimsonfansubs}/crimsonfansubs.js | 0 .../crimsonfansubs}/crimsonfansubs.json | 0 {cuevana3 => .archive/cuevana3}/cuevana3.js | 0 {cuevana3 => .archive/cuevana3}/cuevana3.json | 0 .../dora-video}/dora-video.js | 0 .../dora-video}/dora-video.json | 0 {faselhd => .archive/faselhd}/faselhd.js | 0 {faselhd => .archive/faselhd}/faselhd.json | 0 {hexa => .archive/hexa}/hexa.js | 0 {hexa => .archive/hexa}/hexa.json | 0 {hianime => .archive/hianime}/hianime.js | 0 {hianime => .archive/hianime}/hianime.json | 0 {hianime => .archive/hianime}/icon.png | Bin {hianime => .archive/hianime}/iconapp.png | Bin {himovies => .archive/himovies}/himovies.js | 0 {himovies => .archive/himovies}/himovies.json | 0 {kaido => .archive/kaido}/kaido.js | 0 {kaido => .archive/kaido}/kaido.json | 0 {kawaiifu => .archive/kawaiifu}/kawaiifu.js | 0 {kawaiifu => .archive/kawaiifu}/kawaiifu.json | 0 .../kickassanimes}/kickassanimes.js | 0 .../kickassanimes}/kickassanimes.json | 0 .../poseidonhd2}/poseidonhd2.js | 0 .../poseidonhd2}/poseidonhd2.json | 0 {tidal => .archive/tidal}/tidal.js | 0 {tidal => .archive/tidal}/tidal.json | 0 {tiktok => .archive/tiktok}/tiktok.js | 0 {tiktok => .archive/tiktok}/tiktok.json | 0 .../tokyoinsider}/tokyoinsider.js | 0 .../tokyoinsider}/tokyoinsider.json | 0 .../topstreamfilm}/topstreamfilm.js | 0 .../topstreamfilm}/topstreamfilm.json | 0 .../veranimes}/veranimes.js | 0 .../veranimes}/veranimes.json | 0 .../veziseriale}/veziseriale.js | 12 +- .../veziseriale}/veziseriale.json | 0 {witanime => .archive/witanime}/witanime.js | 87 +++++- {witanime => .archive/witanime}/witanime.json | 0 {youtube => .archive/youtube}/youtube.js | 0 {youtube => .archive/youtube}/youtube.json | 0 123anime/123anime.js | 38 ++- 123anime/123anime.json | 8 +- 1tamilcrow/1tamilcrow.js | 2 +- 1tamilcrow/1tamilcrow.json | 2 +- aksv/aksv.js | 106 ++++--- aksv/aksv.json | 2 +- an1me/an1me.js | 256 ++++++++--------- an1me/an1me.json | 2 +- anihq/anihq.js | 258 +++++++++++++++--- anihq/anihq.json | 2 +- anime-sama/anime-sama.json | 26 -- animedefenders/animedefenders.js | 63 +++-- animedefenders/animedefenders.json | 2 +- animeheaven/animeheaven.js | 3 +- animeheaven/animeheaven.json | 2 +- animekhor/animekhor.js | 21 +- animelib/animelib.js | 47 +++- animelib/animelib.json | 2 +- animenosub/animenosub.js | 92 +++++-- animenosub/animenosub.json | 2 +- animepahe/animepahe.js | 189 ++++++++----- animepahe/animepahe.json | 2 +- animeweek/animeweek.js | 112 ++++---- animeweek/animeweek.json | 2 +- animexin/animexin.js | 1 + anitube/anitube.js | 29 +- anitube/anitube.json | 2 +- asia2tv/asia2tv.js | 224 ++++----------- asia2tv/asia2tv.json | 2 +- coflix/coflix.js | 140 ++++------ coflix/coflix.json | 2 +- gojowtf/gojowtf.js | 4 +- gojowtf/gojowtf.json | 2 +- hdfilme/hdfilme.js | 24 +- hdfilme/hdfilme.json | 2 +- monoschinos2/monoschinos2.js | 249 ++++------------- monoschinos2/monoschinos2.json | 2 +- turkish123/turkish123.js | 139 ++++++++-- turkish123/turkish123.json | 2 +- videasy/videasy.js | 4 +- videasy/videasy.json | 2 +- 113 files changed, 1207 insertions(+), 980 deletions(-) rename {1movies => .archive/1movies}/1movies.js (100%) rename {1movies => .archive/1movies}/1movies.json (100%) rename {anicrush => .archive/anicrush}/anicrush.js (100%) rename {anicrush => .archive/anicrush}/anicrush.json (100%) rename {anime-sama => .archive/anime-sama}/anime-sama.js (93%) rename {animebalkan => .archive/animebalkan}/animebalkan.js (100%) rename {animebalkan => .archive/animebalkan}/animebalkan.json (100%) rename {animebalkan => .archive/animebalkan}/iconalt.png (100%) rename {animeindo => .archive/animeindo}/animeindo.js (100%) rename {animeindo => .archive/animeindo}/animeindo.json (100%) rename {animekai => .archive/animekai}/animekai.js (100%) rename {animekai => .archive/animekai}/animekai.json (100%) rename {animekai => .archive/animekai}/arabic/animekai.js (100%) rename {animekai => .archive/animekai}/arabic/animekai.json (100%) rename {animekai => .archive/animekai}/dub/animekai.js (100%) rename {animekai => .archive/animekai}/dub/animekai.json (100%) rename {animekai => .archive/animekai}/hardsub/animekai.js (100%) rename {animekai => .archive/animekai}/hardsub/animekai.json (100%) rename {animeler => .archive/animeler}/animeler.js (100%) rename {animeler => .archive/animeler}/animeler.json (100%) rename {animenana => .archive/animenana}/animenana.js (100%) rename {animenana => .archive/animenana}/animenana.json (100%) rename {animenix => .archive/animenix}/animenix.js (100%) rename {animenix => .archive/animenix}/animenix.json (100%) rename {animesaturn => .archive/animesaturn}/animesaturn.js (100%) rename {animesaturn => .archive/animesaturn}/animesaturn.json (100%) rename {animez => .archive/animez}/animez.js (100%) rename {animez => .archive/animez}/animez.json (100%) rename {aniwatch => .archive/aniwatch}/aniwatch.js (100%) rename {aniwatch => .archive/aniwatch}/aniwatch.json (100%) rename {ashi => .archive/ashi}/ashi.js (100%) rename {ashi => .archive/ashi}/ashi.json (100%) rename {crimsonfansubs => .archive/crimsonfansubs}/crimsonfansubs.js (100%) rename {crimsonfansubs => .archive/crimsonfansubs}/crimsonfansubs.json (100%) rename {cuevana3 => .archive/cuevana3}/cuevana3.js (100%) rename {cuevana3 => .archive/cuevana3}/cuevana3.json (100%) rename {dora-video => .archive/dora-video}/dora-video.js (100%) rename {dora-video => .archive/dora-video}/dora-video.json (100%) rename {faselhd => .archive/faselhd}/faselhd.js (100%) rename {faselhd => .archive/faselhd}/faselhd.json (100%) rename {hexa => .archive/hexa}/hexa.js (100%) rename {hexa => .archive/hexa}/hexa.json (100%) rename {hianime => .archive/hianime}/hianime.js (100%) rename {hianime => .archive/hianime}/hianime.json (100%) rename {hianime => .archive/hianime}/icon.png (100%) rename {hianime => .archive/hianime}/iconapp.png (100%) rename {himovies => .archive/himovies}/himovies.js (100%) rename {himovies => .archive/himovies}/himovies.json (100%) rename {kaido => .archive/kaido}/kaido.js (100%) rename {kaido => .archive/kaido}/kaido.json (100%) rename {kawaiifu => .archive/kawaiifu}/kawaiifu.js (100%) rename {kawaiifu => .archive/kawaiifu}/kawaiifu.json (100%) rename {kickassanimes => .archive/kickassanimes}/kickassanimes.js (100%) rename {kickassanimes => .archive/kickassanimes}/kickassanimes.json (100%) rename {poseidonhd2 => .archive/poseidonhd2}/poseidonhd2.js (100%) rename {poseidonhd2 => .archive/poseidonhd2}/poseidonhd2.json (100%) rename {tidal => .archive/tidal}/tidal.js (100%) rename {tidal => .archive/tidal}/tidal.json (100%) rename {tiktok => .archive/tiktok}/tiktok.js (100%) rename {tiktok => .archive/tiktok}/tiktok.json (100%) rename {tokyoinsider => .archive/tokyoinsider}/tokyoinsider.js (100%) rename {tokyoinsider => .archive/tokyoinsider}/tokyoinsider.json (100%) rename {topstreamfilm => .archive/topstreamfilm}/topstreamfilm.js (100%) rename {topstreamfilm => .archive/topstreamfilm}/topstreamfilm.json (100%) rename {veranimes => .archive/veranimes}/veranimes.js (100%) rename {veranimes => .archive/veranimes}/veranimes.json (100%) rename {veziseriale => .archive/veziseriale}/veziseriale.js (95%) rename {veziseriale => .archive/veziseriale}/veziseriale.json (100%) rename {witanime => .archive/witanime}/witanime.js (77%) rename {witanime => .archive/witanime}/witanime.json (100%) rename {youtube => .archive/youtube}/youtube.js (100%) rename {youtube => .archive/youtube}/youtube.json (100%) delete mode 100644 anime-sama/anime-sama.json diff --git a/1movies/1movies.js b/.archive/1movies/1movies.js similarity index 100% rename from 1movies/1movies.js rename to .archive/1movies/1movies.js diff --git a/1movies/1movies.json b/.archive/1movies/1movies.json similarity index 100% rename from 1movies/1movies.json rename to .archive/1movies/1movies.json diff --git a/anicrush/anicrush.js b/.archive/anicrush/anicrush.js similarity index 100% rename from anicrush/anicrush.js rename to .archive/anicrush/anicrush.js diff --git a/anicrush/anicrush.json b/.archive/anicrush/anicrush.json similarity index 100% rename from anicrush/anicrush.json rename to .archive/anicrush/anicrush.json diff --git a/anime-sama/anime-sama.js b/.archive/anime-sama/anime-sama.js similarity index 93% rename from anime-sama/anime-sama.js rename to .archive/anime-sama/anime-sama.js index d0b5d86..16994a6 100644 --- a/anime-sama/anime-sama.js +++ b/.archive/anime-sama/anime-sama.js @@ -1,7 +1,9 @@ async function getDomainsList() { try { + console.log("Fetching domains from anime-sama.pw..."); const response = await fetchv2("https://anime-sama.pw/"); const html = await response.text(); + console.log("Fetched HTML length:", html.length); const domainRegex = /{ name: '([^']+)' }/g; const domains = []; @@ -10,37 +12,47 @@ async function getDomainsList() { domains.push(match[1]); } + console.log("Parsed domains:", domains); return domains.length > 0 ? domains : ["anime-sama.tv"]; } catch (err) { + console.error("Error in getDomainsList:", err); return ["anime-sama.tv"]; } } async function searchResults(keyword) { + console.log("searchResults keyword:", keyword); const domains = await getDomainsList(); const regex = /]+href="([^"]+)"[\s\S]*?]+src="([^"]+)"[\s\S]*?]*>(.*?)<\/h3>/gi; const firstDomain = domains[0]; + console.log("Trying first domain:", firstDomain); const firstResult = await trySearch(firstDomain, keyword, regex); if (firstResult && firstResult.length > 0) { + console.log("Results found in first domain:", firstDomain); return JSON.stringify(firstResult); } + console.log("No results in first domain, trying others..."); const otherDomains = domains.slice(1); const promises = otherDomains.map(domain => trySearch(domain, keyword, regex)); const results = await Promise.all(promises); - for (let result of results) { + for (let i = 0; i < results.length; i++) { + const result = results[i]; if (result && result.length > 0) { + console.log("Results found in domain:", otherDomains[i]); return JSON.stringify(result); } } + console.log("No results found in any domain."); return JSON.stringify([]); } async function trySearch(domain, keyword, regex) { try { + console.log("trySearch domain:", domain, "keyword:", keyword); const headers = { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "X-Requested-With": "XMLHttpRequest", @@ -54,6 +66,7 @@ async function trySearch(domain, keyword, regex) { `query=${encodeURIComponent(keyword)}` ); const html = await response.text(); + console.log("trySearch HTML length:", html.length); const results = []; let match; @@ -66,8 +79,10 @@ async function trySearch(domain, keyword, regex) { }); } + console.log("trySearch found results:", results.length); return results; } catch (err) { + console.error("trySearch error for domain", domain, ":", err); return []; } } diff --git a/animebalkan/animebalkan.js b/.archive/animebalkan/animebalkan.js similarity index 100% rename from animebalkan/animebalkan.js rename to .archive/animebalkan/animebalkan.js diff --git a/animebalkan/animebalkan.json b/.archive/animebalkan/animebalkan.json similarity index 100% rename from animebalkan/animebalkan.json rename to .archive/animebalkan/animebalkan.json diff --git a/animebalkan/iconalt.png b/.archive/animebalkan/iconalt.png similarity index 100% rename from animebalkan/iconalt.png rename to .archive/animebalkan/iconalt.png diff --git a/animeindo/animeindo.js b/.archive/animeindo/animeindo.js similarity index 100% rename from animeindo/animeindo.js rename to .archive/animeindo/animeindo.js diff --git a/animeindo/animeindo.json b/.archive/animeindo/animeindo.json similarity index 100% rename from animeindo/animeindo.json rename to .archive/animeindo/animeindo.json diff --git a/animekai/animekai.js b/.archive/animekai/animekai.js similarity index 100% rename from animekai/animekai.js rename to .archive/animekai/animekai.js diff --git a/animekai/animekai.json b/.archive/animekai/animekai.json similarity index 100% rename from animekai/animekai.json rename to .archive/animekai/animekai.json diff --git a/animekai/arabic/animekai.js b/.archive/animekai/arabic/animekai.js similarity index 100% rename from animekai/arabic/animekai.js rename to .archive/animekai/arabic/animekai.js diff --git a/animekai/arabic/animekai.json b/.archive/animekai/arabic/animekai.json similarity index 100% rename from animekai/arabic/animekai.json rename to .archive/animekai/arabic/animekai.json diff --git a/animekai/dub/animekai.js b/.archive/animekai/dub/animekai.js similarity index 100% rename from animekai/dub/animekai.js rename to .archive/animekai/dub/animekai.js diff --git a/animekai/dub/animekai.json b/.archive/animekai/dub/animekai.json similarity index 100% rename from animekai/dub/animekai.json rename to .archive/animekai/dub/animekai.json diff --git a/animekai/hardsub/animekai.js b/.archive/animekai/hardsub/animekai.js similarity index 100% rename from animekai/hardsub/animekai.js rename to .archive/animekai/hardsub/animekai.js diff --git a/animekai/hardsub/animekai.json b/.archive/animekai/hardsub/animekai.json similarity index 100% rename from animekai/hardsub/animekai.json rename to .archive/animekai/hardsub/animekai.json diff --git a/animeler/animeler.js b/.archive/animeler/animeler.js similarity index 100% rename from animeler/animeler.js rename to .archive/animeler/animeler.js diff --git a/animeler/animeler.json b/.archive/animeler/animeler.json similarity index 100% rename from animeler/animeler.json rename to .archive/animeler/animeler.json diff --git a/animenana/animenana.js b/.archive/animenana/animenana.js similarity index 100% rename from animenana/animenana.js rename to .archive/animenana/animenana.js diff --git a/animenana/animenana.json b/.archive/animenana/animenana.json similarity index 100% rename from animenana/animenana.json rename to .archive/animenana/animenana.json diff --git a/animenix/animenix.js b/.archive/animenix/animenix.js similarity index 100% rename from animenix/animenix.js rename to .archive/animenix/animenix.js diff --git a/animenix/animenix.json b/.archive/animenix/animenix.json similarity index 100% rename from animenix/animenix.json rename to .archive/animenix/animenix.json diff --git a/animesaturn/animesaturn.js b/.archive/animesaturn/animesaturn.js similarity index 100% rename from animesaturn/animesaturn.js rename to .archive/animesaturn/animesaturn.js diff --git a/animesaturn/animesaturn.json b/.archive/animesaturn/animesaturn.json similarity index 100% rename from animesaturn/animesaturn.json rename to .archive/animesaturn/animesaturn.json diff --git a/animez/animez.js b/.archive/animez/animez.js similarity index 100% rename from animez/animez.js rename to .archive/animez/animez.js diff --git a/animez/animez.json b/.archive/animez/animez.json similarity index 100% rename from animez/animez.json rename to .archive/animez/animez.json diff --git a/aniwatch/aniwatch.js b/.archive/aniwatch/aniwatch.js similarity index 100% rename from aniwatch/aniwatch.js rename to .archive/aniwatch/aniwatch.js diff --git a/aniwatch/aniwatch.json b/.archive/aniwatch/aniwatch.json similarity index 100% rename from aniwatch/aniwatch.json rename to .archive/aniwatch/aniwatch.json diff --git a/ashi/ashi.js b/.archive/ashi/ashi.js similarity index 100% rename from ashi/ashi.js rename to .archive/ashi/ashi.js diff --git a/ashi/ashi.json b/.archive/ashi/ashi.json similarity index 100% rename from ashi/ashi.json rename to .archive/ashi/ashi.json diff --git a/crimsonfansubs/crimsonfansubs.js b/.archive/crimsonfansubs/crimsonfansubs.js similarity index 100% rename from crimsonfansubs/crimsonfansubs.js rename to .archive/crimsonfansubs/crimsonfansubs.js diff --git a/crimsonfansubs/crimsonfansubs.json b/.archive/crimsonfansubs/crimsonfansubs.json similarity index 100% rename from crimsonfansubs/crimsonfansubs.json rename to .archive/crimsonfansubs/crimsonfansubs.json diff --git a/cuevana3/cuevana3.js b/.archive/cuevana3/cuevana3.js similarity index 100% rename from cuevana3/cuevana3.js rename to .archive/cuevana3/cuevana3.js diff --git a/cuevana3/cuevana3.json b/.archive/cuevana3/cuevana3.json similarity index 100% rename from cuevana3/cuevana3.json rename to .archive/cuevana3/cuevana3.json diff --git a/dora-video/dora-video.js b/.archive/dora-video/dora-video.js similarity index 100% rename from dora-video/dora-video.js rename to .archive/dora-video/dora-video.js diff --git a/dora-video/dora-video.json b/.archive/dora-video/dora-video.json similarity index 100% rename from dora-video/dora-video.json rename to .archive/dora-video/dora-video.json diff --git a/faselhd/faselhd.js b/.archive/faselhd/faselhd.js similarity index 100% rename from faselhd/faselhd.js rename to .archive/faselhd/faselhd.js diff --git a/faselhd/faselhd.json b/.archive/faselhd/faselhd.json similarity index 100% rename from faselhd/faselhd.json rename to .archive/faselhd/faselhd.json diff --git a/hexa/hexa.js b/.archive/hexa/hexa.js similarity index 100% rename from hexa/hexa.js rename to .archive/hexa/hexa.js diff --git a/hexa/hexa.json b/.archive/hexa/hexa.json similarity index 100% rename from hexa/hexa.json rename to .archive/hexa/hexa.json diff --git a/hianime/hianime.js b/.archive/hianime/hianime.js similarity index 100% rename from hianime/hianime.js rename to .archive/hianime/hianime.js diff --git a/hianime/hianime.json b/.archive/hianime/hianime.json similarity index 100% rename from hianime/hianime.json rename to .archive/hianime/hianime.json diff --git a/hianime/icon.png b/.archive/hianime/icon.png similarity index 100% rename from hianime/icon.png rename to .archive/hianime/icon.png diff --git a/hianime/iconapp.png b/.archive/hianime/iconapp.png similarity index 100% rename from hianime/iconapp.png rename to .archive/hianime/iconapp.png diff --git a/himovies/himovies.js b/.archive/himovies/himovies.js similarity index 100% rename from himovies/himovies.js rename to .archive/himovies/himovies.js diff --git a/himovies/himovies.json b/.archive/himovies/himovies.json similarity index 100% rename from himovies/himovies.json rename to .archive/himovies/himovies.json diff --git a/kaido/kaido.js b/.archive/kaido/kaido.js similarity index 100% rename from kaido/kaido.js rename to .archive/kaido/kaido.js diff --git a/kaido/kaido.json b/.archive/kaido/kaido.json similarity index 100% rename from kaido/kaido.json rename to .archive/kaido/kaido.json diff --git a/kawaiifu/kawaiifu.js b/.archive/kawaiifu/kawaiifu.js similarity index 100% rename from kawaiifu/kawaiifu.js rename to .archive/kawaiifu/kawaiifu.js diff --git a/kawaiifu/kawaiifu.json b/.archive/kawaiifu/kawaiifu.json similarity index 100% rename from kawaiifu/kawaiifu.json rename to .archive/kawaiifu/kawaiifu.json diff --git a/kickassanimes/kickassanimes.js b/.archive/kickassanimes/kickassanimes.js similarity index 100% rename from kickassanimes/kickassanimes.js rename to .archive/kickassanimes/kickassanimes.js diff --git a/kickassanimes/kickassanimes.json b/.archive/kickassanimes/kickassanimes.json similarity index 100% rename from kickassanimes/kickassanimes.json rename to .archive/kickassanimes/kickassanimes.json diff --git a/poseidonhd2/poseidonhd2.js b/.archive/poseidonhd2/poseidonhd2.js similarity index 100% rename from poseidonhd2/poseidonhd2.js rename to .archive/poseidonhd2/poseidonhd2.js diff --git a/poseidonhd2/poseidonhd2.json b/.archive/poseidonhd2/poseidonhd2.json similarity index 100% rename from poseidonhd2/poseidonhd2.json rename to .archive/poseidonhd2/poseidonhd2.json diff --git a/tidal/tidal.js b/.archive/tidal/tidal.js similarity index 100% rename from tidal/tidal.js rename to .archive/tidal/tidal.js diff --git a/tidal/tidal.json b/.archive/tidal/tidal.json similarity index 100% rename from tidal/tidal.json rename to .archive/tidal/tidal.json diff --git a/tiktok/tiktok.js b/.archive/tiktok/tiktok.js similarity index 100% rename from tiktok/tiktok.js rename to .archive/tiktok/tiktok.js diff --git a/tiktok/tiktok.json b/.archive/tiktok/tiktok.json similarity index 100% rename from tiktok/tiktok.json rename to .archive/tiktok/tiktok.json diff --git a/tokyoinsider/tokyoinsider.js b/.archive/tokyoinsider/tokyoinsider.js similarity index 100% rename from tokyoinsider/tokyoinsider.js rename to .archive/tokyoinsider/tokyoinsider.js diff --git a/tokyoinsider/tokyoinsider.json b/.archive/tokyoinsider/tokyoinsider.json similarity index 100% rename from tokyoinsider/tokyoinsider.json rename to .archive/tokyoinsider/tokyoinsider.json diff --git a/topstreamfilm/topstreamfilm.js b/.archive/topstreamfilm/topstreamfilm.js similarity index 100% rename from topstreamfilm/topstreamfilm.js rename to .archive/topstreamfilm/topstreamfilm.js diff --git a/topstreamfilm/topstreamfilm.json b/.archive/topstreamfilm/topstreamfilm.json similarity index 100% rename from topstreamfilm/topstreamfilm.json rename to .archive/topstreamfilm/topstreamfilm.json diff --git a/veranimes/veranimes.js b/.archive/veranimes/veranimes.js similarity index 100% rename from veranimes/veranimes.js rename to .archive/veranimes/veranimes.js diff --git a/veranimes/veranimes.json b/.archive/veranimes/veranimes.json similarity index 100% rename from veranimes/veranimes.json rename to .archive/veranimes/veranimes.json diff --git a/veziseriale/veziseriale.js b/.archive/veziseriale/veziseriale.js similarity index 95% rename from veziseriale/veziseriale.js rename to .archive/veziseriale/veziseriale.js index 4cad9e2..632e1ab 100644 --- a/veziseriale/veziseriale.js +++ b/.archive/veziseriale/veziseriale.js @@ -107,11 +107,8 @@ async function extractEpisodes(url) { } } - console.log(`[Debug] Found ${results.length} episodes`); - console.log(`[Debug]`, JSON.stringify(results, null, 2)); return JSON.stringify(results.reverse()); } catch (err) { - console.error('Error extracting episodes:', err); return JSON.stringify([{ href: "Error", number: "Error" }]); } } @@ -121,7 +118,7 @@ async function extractStreamUrl(url) { const firstresponse = await fetchv2(url); const firsthtml = await firstresponse.text(); - const idMatch = firsthtml.match(/href=['"]https:\/\/www3\.veziseriale\.org\/\?p=(\d+)['"]/); + const idMatch = firsthtml.match(/href=['"][^'"]+\?p=(\d+)['"]/) || firsthtml.match(/\?p=(\d+)/); if (!idMatch) throw new Error('ID not found'); const id = idMatch[1]; @@ -160,11 +157,10 @@ async function extractStreamUrl(url) { }); } catch (err) { - console.error('Error extracting stream URL: ' + err); - return { - stream: "https://files.catbox.moe/avolvc.mp4", + return JSON.stringify({ + stream: "", subtitles: "" - }; + }); } } diff --git a/veziseriale/veziseriale.json b/.archive/veziseriale/veziseriale.json similarity index 100% rename from veziseriale/veziseriale.json rename to .archive/veziseriale/veziseriale.json diff --git a/witanime/witanime.js b/.archive/witanime/witanime.js similarity index 77% rename from witanime/witanime.js rename to .archive/witanime/witanime.js index b0a4c4b..404513b 100644 --- a/witanime/witanime.js +++ b/.archive/witanime/witanime.js @@ -52,10 +52,31 @@ async function extractDetails(url) { async function extractEpisodes(url) { const results = []; + function myAtob(input) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let str = ''; + let buffer = 0; + let bits = 0; + for (let i = 0; i < input.length; i++) { + const char = input.charAt(i); + if (char === '=') break; + const index = chars.indexOf(char); + if (index === -1) continue; + buffer = (buffer << 6) | index; + bits += 6; + if (bits >= 8) { + bits -= 8; + str += String.fromCharCode((buffer >> bits) & 0xFF); + buffer &= (1 << bits) - 1; + } + } + return str; + } + function decryptEpisodeData(encodedData) { const parts = encodedData.split('.'); - const encryptedData = atob(parts[0]); - const xorKey = atob(parts[1]); + const encryptedData = myAtob(parts[0]); + const xorKey = myAtob(parts[1]); let decryptedString = ''; @@ -66,6 +87,10 @@ async function extractEpisodes(url) { decryptedString += decryptedChar; } + try { + decryptedString = decodeURIComponent(escape(decryptedString)); + } catch (e) {} + return JSON.parse(decryptedString); } @@ -79,20 +104,58 @@ async function extractEpisodes(url) { const encodedData = dataMatch ? dataMatch[1] : null; if (encodedData) { - const decoded = decryptEpisodeData(encodedData); + try { + const decoded = decryptEpisodeData(encodedData); - const addEpisode = (ep) => { - const num = parseInt(ep.number, 10); - results.push({ href: ep.url, number: isNaN(num) ? 0 : num }); - }; + const addEpisode = (ep) => { + const num = parseInt(ep.number, 10); + results.push({ href: ep.url, number: isNaN(num) ? 0 : num }); + }; - if (Array.isArray(decoded)) { - decoded.forEach(addEpisode); - } else { - addEpisode(decoded); + if (Array.isArray(decoded)) { + decoded.forEach(addEpisode); + } else { + addEpisode(decoded); + } + + return JSON.stringify(results); + } catch (innerErr) { + console.log("Decryption failed, using fallback..."); } + } - return JSON.stringify(results); + const regex = /openEpisode\('([^']+)'\)[\s\S]*?>[^<]*?(\d+)[^<]*?<\/a>/gi; + let match; + const seenHrefs = new Set(); + + while ((match = regex.exec(html)) !== null) { + const href = myAtob(match[1]); + const number = parseInt(match[2], 10); + + if (!seenHrefs.has(href)) { + results.push({ + href: href, + number: isNaN(number) ? 0 : number + }); + seenHrefs.add(href); + } + } + + if (results.length === 0) { + const fallbackRegex = /openEpisode\('([^']+)'\)/gi; + while ((match = fallbackRegex.exec(html)) !== null) { + const href = atob(match[1]); + if (!seenHrefs.has(href)) { + const numMatch = href.match(/-(\d+)\/?$/); + const number = numMatch ? parseInt(numMatch[1], 10) : results.length + 1; + + results.push({ + href: href, + number: number + }); + seenHrefs.add(href); + } + } } return JSON.stringify(results); diff --git a/witanime/witanime.json b/.archive/witanime/witanime.json similarity index 100% rename from witanime/witanime.json rename to .archive/witanime/witanime.json diff --git a/youtube/youtube.js b/.archive/youtube/youtube.js similarity index 100% rename from youtube/youtube.js rename to .archive/youtube/youtube.js diff --git a/youtube/youtube.json b/.archive/youtube/youtube.json similarity index 100% rename from youtube/youtube.json rename to .archive/youtube/youtube.json diff --git a/123anime/123anime.js b/123anime/123anime.js index 3810a4c..d5a7ec1 100644 --- a/123anime/123anime.js +++ b/123anime/123anime.js @@ -1,7 +1,7 @@ async function searchResults(keyword) { const results = []; try { - const response = await fetchv2("https://123animes.ru/search?keyword=" + encodeURIComponent(keyword)); + const response = await fetchv2("https://123animehub.cc/search?keyword=" + encodeURIComponent(keyword)); const html = await response.text(); const filmListMatch = html.match(/
([\s\S]*?)
<\/div>/); @@ -15,8 +15,8 @@ async function searchResults(keyword) { while ((match = itemRegex.exec(filmList)) !== null) { results.push({ title: match[2].trim(), - image: "https://123animes.ru" + match[3].trim(), - href: "https://123animes.ru" + match[1].trim() + image: "https://123animehub.cc" + match[3].trim(), + href: "https://123animehub.cc" + match[1].trim() }); } @@ -73,7 +73,7 @@ async function extractEpisodes(url) { try { const animeId = url.split('/').pop(); - const response = await fetchv2("https://123animes.ru/ajax/film/sv?id=" + animeId); + const response = await fetchv2("https://123animehub.cc/ajax/film/sv?id=" + animeId); const jsonData = await response.json(); const html = jsonData.html; @@ -111,19 +111,35 @@ async function extractEpisodes(url) { async function extractStreamUrl(ID) { try { - const response = await fetchv2("https://123animes.ru/ajax/episode/info?epr=" + ID); + const response = await fetchv2("https://123animehub.cc/ajax/episode/info?epr=" + encodeURIComponent(ID)); const data = await response.json(); - const target = data.target; - const streamID = target.split('/').pop(); - const responseTwo = await fetchv2("https://play.shipimagesbolt.online/hs/getSources?id=" + streamID); - const dataTwo = await responseTwo.json(); + if (!target) throw new Error("No target in response: " + JSON.stringify(data)); - const stream = dataTwo.sources; + const responseTarget = await fetchv2(target); + const htmlTarget = await responseTarget.text(); + const zrpart2Match = htmlTarget.match(/var\s+zrpart2\s*=\s*'([^']+)';/); + if (!zrpart2Match) throw new Error("zrpart2 not found"); + const zrpart2 = zrpart2Match[1]; - return stream; + const originMatch = target.match(/^(https?:\/\/[^\/]+)/); + const origin = originMatch ? originMatch[1] : ""; + + const hsUrl = `${origin}/hs/${zrpart2}`; + const responseHs = await fetchv2(hsUrl); + const htmlHs = await responseHs.text(); + const dataIdMatch = htmlHs.match(/id="mg-player"[^>]*data-id="([^"]+)"/); + if (!dataIdMatch) throw new Error("data-id not found"); + const dataId = dataIdMatch[1]; + + const sourcesUrl = `${origin}/hs/getSources?id=${dataId}`; + const responseSources = await fetchv2(sourcesUrl); + const dataSources = await responseSources.json(); + + return dataSources.sources; } catch (err) { + console.log("Stream URL Error details:", err.message, err.stack); return "https://error.org/"; } } diff --git a/123anime/123anime.json b/123anime/123anime.json index 8569a64..85ccd0e 100644 --- a/123anime/123anime.json +++ b/123anime/123anime.json @@ -1,16 +1,16 @@ { "sourceName": "123Anime", - "iconUrl": "https://123animes.ru/assets/favicons/apple-touch-icon.png", + "iconUrl": "https://123animehub.cc/assets/favicons/apple-touch-icon.png", "author": { "name": "50/50", "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" }, - "version": "1.0.0", + "version": "1.0.1", "language": "English (DUB/HARDSUB)", "streamType": "HLS", "quality": "1080p", - "baseUrl": "https://play.shipimagesbolt.online/", - "searchBaseUrl": "https://play.shipimagesbolt.online/", + "baseUrl": "https://123animehub.cc/", + "searchBaseUrl": "https://123animehub.cc/", "scriptUrl": "https://git.luna-app.eu/50n50/sources/raw/branch/main/123anime/123anime.js", "type": "anime", "asyncJS": true, diff --git a/1tamilcrow/1tamilcrow.js b/1tamilcrow/1tamilcrow.js index 6e059fe..a60d838 100644 --- a/1tamilcrow/1tamilcrow.js +++ b/1tamilcrow/1tamilcrow.js @@ -22,7 +22,7 @@ async function searchResults(keyword) { if (linkMatch) { results.push({ href: linkMatch[1].trim(), - title: decodeHtml(linkMatch[2].trim()), + title: decodeHtml(linkMatch[2].trim()).replace(/^Watch\s+/i, ""), image: image }); } diff --git a/1tamilcrow/1tamilcrow.json b/1tamilcrow/1tamilcrow.json index 287026e..3e79407 100644 --- a/1tamilcrow/1tamilcrow.json +++ b/1tamilcrow/1tamilcrow.json @@ -5,7 +5,7 @@ "name": "50/50", "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" }, - "version": "1.0.1", + "version": "1.0.2", "language": "Tamil", "streamType": "HLS", "quality": "1080p", diff --git a/aksv/aksv.js b/aksv/aksv.js index 3a2402d..1eddfba 100644 --- a/aksv/aksv.js +++ b/aksv/aksv.js @@ -71,9 +71,17 @@ async function extractEpisodes(url) { const movieRegex = /]+href=["']([^"']+)["'][^>]+class=["'][^"']*link-btn link-show[^"']*["'][^>]*>/i; const movieMatch = movieRegex.exec(html); + const buildHref = (extractedHref) => { + const watchMatch = extractedHref.match(/\/watch\/(\d+)/i); + if (watchMatch) { + return url.replace(/\/(movie|series|episode)\//i, `/watch/${watchMatch[1]}/`); + } + return extractedHref; + }; + if (movieMatch && movieMatch[1]) { episodes.push({ - href: movieMatch[1], + href: buildHref(movieMatch[1]), number: 1 }); } else { @@ -86,7 +94,7 @@ async function extractEpisodes(url) { const hrefMatch = block.match(/href=["']([^"']+)["']/); if (hrefMatch) { episodes.push({ - href: hrefMatch[1], + href: buildHref(hrefMatch[1]), number: index + 1 }); } @@ -99,67 +107,57 @@ async function extractEpisodes(url) { } async function extractStreamUrl(url) { - let stream = null; - const response = await fetchv2(url); - const html = await response.text(); - const urlMatch = html.match(/]*class="link-btn link-show[^"]*"[^>]*>[\s\S]*?<\/a>/g); - let match = null; - - if (linkBtnMatches && linkBtnMatches.length > 0) { - const hrefMatch = linkBtnMatches[0].match(/href="([^"]+)"/); - if (hrefMatch && hrefMatch[1]) { - match = [null, hrefMatch[1]]; - } - } - - if (match && match[1]) { - try { - const shortnerResponse = await fetch(match[1]); - const shortnerHtml = await shortnerResponse; - - const finalMatch = shortnerHtml.match(/
\s*]+href=["']([^"']+)["'][^>]+class=["'][^"']*link-btn link-show[^"']*["'][^>]*>/i; + const linkMatch = linkRegex.exec(epHtml); + + if (linkMatch && linkMatch[1]) { + const watchMatch = linkMatch[1].match(/\/watch\/(\d+)/i); + if (watchMatch) { + streamPageUrl = url.replace(/\/(episode)\//i, `/watch/${watchMatch[1]}/`); + } else { + streamPageUrl = linkMatch[1]; } - } catch (error) { - console.error("Error fetching shortener URL:", error); - return null; } } - } else { - const finalMatch = html.match(/
\s*]+>/gi; + let match; + + while ((match = sourceTagRegex.exec(html)) !== null) { + const sourceHtml = match[0]; + const srcMatch = sourceHtml.match(/src=["']([^"']+)["']/i); + const sizeMatch = sourceHtml.match(/size=["']([^"']+)["']/i); + + if (srcMatch) { + streams.push({ + title: sizeMatch ? sizeMatch[1] : "Default", + streamUrl: srcMatch[1], + headers: {} + }); } } + } catch (error) { + console.error("Error fetching stream:", error); } - console.log(stream); - return stream; + const result = { + streams: streams, + subtitle: "" + }; + + console.log(JSON.stringify(result)); + return JSON.stringify(result); } function decodeHTMLEntities(text) { diff --git a/aksv/aksv.json b/aksv/aksv.json index 3a97989..87d05f3 100644 --- a/aksv/aksv.json +++ b/aksv/aksv.json @@ -5,7 +5,7 @@ "name": "50/50", "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" }, - "version": "1.0.5", + "version": "1.0.6", "language": "Arabic (SUB)", "streamType": "MP4", "quality": "1080p", diff --git a/an1me/an1me.js b/an1me/an1me.js index 80c6ee4..ed0ca37 100644 --- a/an1me/an1me.js +++ b/an1me/an1me.js @@ -1,57 +1,53 @@ async function searchResults(keyword) { const results = []; - const headers = { - "Content-Type": "multipart/form-data; boundary=----geckoformboundary38c356867533a17de80e8c65d9125df5" - }; - const postData = `------geckoformboundary38c356867533a17de80e8c65d9125df5 -Content-Disposition: form-data; name="s_keyword" - -${keyword} -------geckoformboundary38c356867533a17de80e8c65d9125df5 -Content-Disposition: form-data; name="orderby" - -popular -------geckoformboundary38c356867533a17de80e8c65d9125df5 -Content-Disposition: form-data; name="order" - -DESC -------geckoformboundary38c356867533a17de80e8c65d9125df5 -Content-Disposition: form-data; name="action" - -advanced_search -------geckoformboundary38c356867533a17de80e8c65d9125df5 -Content-Disposition: form-data; name="page" - -1 -------geckoformboundary38c356867533a17de80e8c65d9125df5--`; - + try { - const response = await fetchv2("https://an1me.to/wp-admin/admin-ajax.php", headers, "POST", postData); - const data = await response.json(); - const html = data.data.html; - const articlePattern = /]*class="anime-card[^"]*"[^>]*>([\s\S]*?)<\/article>/g; - let articleMatch; - - while ((articleMatch = articlePattern.exec(html)) !== null) { - const articleHtml = articleMatch[1]; - - const imgMatch = articleHtml.match(/]+src=['"]([^'"]+)['"][^>]+alt=['"]([^'"]+)['"]/); - + const url = "https://an1me.to/wp-admin/admin-ajax.php?action=instant_search&query=" + encodeURIComponent(keyword); + const headers = { + "Accept": "application/json, text/javascript, */*; q=0.01", + "X-Requested-With": "XMLHttpRequest", + "Referer": "https://an1me.to/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" + }; + const response = await fetchv2(url, headers); + const text = await response.text(); - const linkMatch = articleHtml.match(/]*>[\s\S]*?]+href=['"]([^'"]+)['"][^>]*title=['"]([^'"]+)['"]/); + let data; + try { + data = JSON.parse(text); + } catch (e) { + return JSON.stringify(results); + } + + if (!data.success || !data.data || !data.data.html) { + return JSON.stringify(results); + } + + const html = data.data.html; + const anchorPattern = /]+href=["']([^"']+)["'][^>]*title=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/g; + let anchorMatch; + let matchCount = 0; + + while ((anchorMatch = anchorPattern.exec(html)) !== null) { + matchCount++; + const href = anchorMatch[1]; + const title = anchorMatch[2]; + const innerHtml = anchorMatch[3]; - if (imgMatch && linkMatch) { + const imgMatch = innerHtml.match(/]+src=["']([^"']+)["'][^>]*>/); + + if (imgMatch) { results.push({ - title: linkMatch[2].trim(), + title: title.trim(), image: imgMatch[1].trim(), - href: linkMatch[1].trim() + href: href.trim() }); } } return JSON.stringify(results); } catch (err) { - console.log(err); + console.log("Search error:", err.message); return JSON.stringify([{ title: "Error", image: "Error", @@ -62,15 +58,18 @@ Content-Disposition: form-data; name="page" async function extractDetails(url) { try { - const response = await fetchv2(url); + const headers = { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8", + "Referer": "https://an1me.to/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" + }; + const response = await fetchv2(url, headers); const html = await response.text(); - const match = html.match( - /
[\s\S]*?

([\s\S]*?)<\/p>/ - ); + const match = html.match(/aria-label="Anime Overview"[^>]*>([\s\S]*?)<\/section>/); const description = match - ? match[1].replace(/\s+/g, " ").trim() + ? match[1].replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim() : "N/A"; return JSON.stringify([{ @@ -78,7 +77,8 @@ async function extractDetails(url) { aliases: "N/A", airdate: "N/A" }]); - } catch { + } catch (err) { + console.log("extractDetails error:", err.message); return JSON.stringify([{ description: "Error", aliases: "Error", @@ -91,30 +91,64 @@ async function extractDetails(url) { async function extractEpisodes(url) { const results = []; try { - const response = await fetchv2(url); + const headers = { + "Accept": "application/json, text/javascript, */*; q=0.01", + "X-Requested-With": "XMLHttpRequest", + "Referer": "https://an1me.to/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" + }; + const response = await fetchv2(url, headers); const html = await response.text(); + const postIdMatch = html.match(/postid-(\d+)/) || + html.match(/post_id['"]\s*,\s*['"](\d+)['"]/) || + html.match(/anime_id['"]\s*:\s*(\d+)/); - const regex = /]*class="episode-list-display-box episode-list-item[^"]*"[^>]*>[\s\S]*?\s*(\d+)\s*<\/span>/g; - - let match; - while ((match = regex.exec(html)) !== null) { - results.push({ - href: match[1].trim(), - number: parseInt(match[2], 10) - }); + if (!postIdMatch) { + console.log("Could not find anime_id (postid)"); + return JSON.stringify(results); } + + const animeId = postIdMatch[1]; - if (results.length === 0 && url) { - results.push({ - href: url, - number: 1 + const firstPageUrl = `https://an1me.to/wp-admin/admin-ajax.php?action=get_episodes&anime_id=${animeId}&page=1&order=desc`; + const firstPageRes = await fetchv2(firstPageUrl, headers); + const firstPageData = await firstPageRes.json(); + + if (firstPageData.success && firstPageData.data && Array.isArray(firstPageData.data.episodes)) { + firstPageData.data.episodes.forEach(ep => { + results.push({ + href: ep.url, + number: parseFloat(ep.meta_number) + }); }); + + const maxPages = firstPageData.data.max_episodes_page || 1; + + if (maxPages > 1) { + const promises = []; + for (let i = 2; i <= maxPages; i++) { + const pageUrl = `https://an1me.to/wp-admin/admin-ajax.php?action=get_episodes&anime_id=${animeId}&page=${i}&order=desc`; + promises.push(fetchv2(pageUrl, headers).then(res => res.json())); + } + + const otherPagesData = await Promise.all(promises); + otherPagesData.forEach(data => { + if (data.success && data.data && Array.isArray(data.data.episodes)) { + data.data.episodes.forEach(ep => { + results.push({ + href: ep.url, + number: parseFloat(ep.meta_number) + }); + }); + } + }); + } } return JSON.stringify(results); } catch (err) { - console.log(err); + console.log("Error in extractEpisodes:", err); return JSON.stringify([{ href: "Error", number: "Error" @@ -124,85 +158,31 @@ async function extractEpisodes(url) { async function extractStreamUrl(url) { try { - const response = await fetchv2(url); + const headers = { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8", + "Referer": "https://an1me.to/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" + }; + const response = await fetchv2(url, headers); const html = await response.text(); - const sources = await getSourcesFromEpisode(url); - if(sources == null) return null; - - const streams = await extractStreamsFromSources(sources); - if(streams == null) return null; - console.log("Streams: " + JSON.stringify(streams)); - - const streamUrl = streams[0].stream; - console.log("Stream URL: " + streamUrl); - return streamUrl; + + const iframeMatch = html.match(/]+src=["']([^"']+)["']/i); + if (!iframeMatch) throw new Error("Iframe not found"); + + let iframeUrl = iframeMatch[1].replace(/&/g, '&').replace(/&/g, '&'); + const iframeResponse = await fetchv2(iframeUrl, headers); + const iframeHtml = await iframeResponse.text(); + + const paramsMatch = iframeHtml.match(/const\s+params\s*=\s*({.*?});/s); + if (!paramsMatch) throw new Error("Params not found"); + + const params = JSON.parse(paramsMatch[1]); + const streamUrl = params.sources?.[0]?.url; + + console.log("Stream URL secured:", streamUrl); + return streamUrl || "https://files.catbox.moe/avolvc.mp4"; } catch (err) { + console.log("extractStreamUrl error:", err.message); return "https://files.catbox.moe/avolvc.mp4"; } } - -async function getSourcesFromEpisode(url) { - const sources = []; - try { - const res = await fetchv2(url); - const html = await res.text(); - - const regex = /]+data-embed-id="([^"]+)"[^>]*>/gi; - let match; - - while ((match = regex.exec(html)) !== null) { - const dataEmbedId = match[1]; - const [_, iframeBase64] = dataEmbedId.split(":"); - if (!iframeBase64) continue; - - const iframeHtml = atob(iframeBase64); - - const srcMatch = iframeHtml.match(/src\s*=\s*["']([^"']+)["']/i); - if (!srcMatch) continue; - - const isSub = /class="[^"]*player-sub[^"]*"/.test(match[0]); - - sources.push({ - source: srcMatch[1], - audio: isSub ? 'original' : 'Greek' - }); - } - - return sources; - } catch (e) { - console.error('Error extracting source: ' + e.message); - return []; - } -} - -async function extractStreamsFromSources(sources) { - const streams = []; - - for(let source of sources) { - try { - const res = await fetchv2(source.source); - const html = await res.text(); - - const jsonString = html.match(/params[\s]*=[\s]*(\{[^;]*);/)?.[1]; - if(jsonString == null) continue; - - const json = JSON.parse(jsonString); - if(json?.sources == null || json.sources.length <= 0) continue; - - for(let s of json.sources) { - const resolution = s?.html ?? null; - let arrayLength = streams.push(source); - let i = arrayLength - 1; - - streams[i].stream = s.url; - streams[i].resolution = resolution != null ? resolution.slice(0, -1) : null; - } - - - } catch(e) { - console.warn('Error extracting stream: ' + e.message); - } - } - - return streams.filter(source => source.stream != null); -} diff --git a/an1me/an1me.json b/an1me/an1me.json index 7a6eca9..8e5ddf1 100644 --- a/an1me/an1me.json +++ b/an1me/an1me.json @@ -5,7 +5,7 @@ "name": "50/50", "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" }, - "version": "1.0.2", + "version": "1.0.3", "language": "Greek", "streamType": "HLS", "encrypted": true, diff --git a/anihq/anihq.js b/anihq/anihq.js index 987cb79..6efbe9f 100644 --- a/anihq/anihq.js +++ b/anihq/anihq.js @@ -63,10 +63,19 @@ Content-Disposition: form-data; name="page" async function extractDetails(url) { try { - const response = await fetchv2(url); + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", + "Referer": "https://anihq.to/" + }; + const response = await fetchv2(url, headers); const html = await response.text(); - const descMatch = html.match(/]*>([\s\S]*?)<\/div>/); + let descMatch = html.match(/[\s\S]*?]+class=["']prose[^"']*["'][^>]*>([\s\S]*?)<\/div>/i); + + if (!descMatch) { + descMatch = html.match(/]+aria-label=["']Anime Overview["'][^>]*>([\s\S]*?)<\/section>/i); + } + let description = "N/A"; if (descMatch) { @@ -84,7 +93,7 @@ async function extractDetails(url) { }]); } catch (err) { return JSON.stringify([{ - description: "Error", + description: "Error: " + err.message, aliases: "Error", airdate: "Error" }]); @@ -139,46 +148,209 @@ async function extractEpisodes(url) { async function extractStreamUrl(url) { try { - const response = await fetchv2(url); - const html = await response.text(); - - const iframeMatch = html.match(/]+src=['"]https:\/\/([^'"]+\.playerp2p\.com)\/#([^'"]+)['"]/); - - if (!iframeMatch) { - console.log("No iframe ID found"); - return "https://error.org/"; - } - - const domain = iframeMatch[1]; - const videoId = iframeMatch[2]; - - const apiUrl = `https://${domain}/api/v1/video?id=${videoId}&w=1792&h=1120&r=anihq.to`; - const apiResponse = await fetchv2(apiUrl); - const encodedString = await apiResponse.text(); - - const hasUppercase = /[A-Z]/.test(encodedString); - - let stringToSend; - if (hasUppercase) { - stringToSend = atob(encodedString); - console.log("Decoded string: " + stringToSend); - } else { - stringToSend = encodedString; - console.log("Using encoded string directly (no uppercase found)"); - } - - const postData = { - text: stringToSend + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", + "Referer": "https://anihq.to/" }; - const headers = { "Content-Type": "application/json" }; - const response2 = await fetchv2("https://enc-dec.app/api/dec-vidstack", headers, "POST", postData); - const data = await response2.json(); - console.log(JSON.stringify(data)); - console.log("Final URL: " + data.result.source); - return data.result.cf; + const response = await fetchv2(url, headers); + const html = await response.text(); + + const iframeMatch = html.match(/]+src=['"]([^'"]+)['"]/i); + if (!iframeMatch) { + console.log("No iframe found on page"); + return null; + } + + const iframeUrl = iframeMatch[1]; + console.log("Found iframe URL:", iframeUrl); + + const iframeResponse = await fetchv2(iframeUrl, headers); + const iframeHtml = await iframeResponse.text(); + + let streamData = null; + try { + streamData = voeExtractor(iframeHtml); + } catch (error) { + console.log("VOE extraction error:", error.message || error); + return null; + } + + const streamUrlResult = typeof streamData === "string" ? streamData : getStreamUrl(streamData); - } catch (err) { - console.log("Error: " + err.message); - return "https://error.org/"; + if (streamUrlResult) { + const origin = "https://bryantenunder.com"; + console.log("Stream URL secured:", streamUrlResult); + + return JSON.stringify({ + streams: [ + { + title: "Server 1", + streamUrl: streamUrlResult, + headers: { + "Origin": origin, + "Referer": origin + "/" + } + } + ] + }); + } + + console.log("No stream URL found"); + return null; + } catch (error) { + console.log("Fetch error:", error.message || error); + return null; } -} \ No newline at end of file +} + +/* SCHEME START */ + +/** + * @name voeExtractor + * @author Cufiy + */ + +function voeExtractor(html, url = null) { + const regex = /]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/gi; + let match; + let obfuscatedString = null; + while ((match = regex.exec(html)) !== null) { + try { + const data = JSON.parse(match[1].trim()); + if (Array.isArray(data) && typeof data[0] === "string") { + obfuscatedString = data[0]; + break; + } + } catch (e) { + // Ignore syntax/parse errors for other script tags + } + } + + if (!obfuscatedString) { + console.log("No valid VOE application/json script tag found"); + return null; + } + + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + + // check if direct_access_url is set, not null and starts with http + const streamUrl = getStreamUrl(result); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + return result; +} + +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} + +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} + +function voeBase64Decode(str) { + if (typeof atob === "function") { + try { + return atob(str); + } catch (e) { + // fallback if atob fails + } + } + + // Pure Javascript Base64 decoding fallback to avoid reliance on Buffer or atob + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + let cleaned = str.replace(/=+$/, '').replace(/[^A-Za-z0-9+/]/g, ''); + let output = ''; + let buffer = 0; + let bits = 0; + + for (let i = 0; i < cleaned.length; i++) { + const char = cleaned[i]; + const idx = chars.indexOf(char); + if (idx === -1) continue; + + buffer = (buffer << 6) | idx; + bits += 6; + + if (bits >= 8) { + bits -= 8; + const byte = (buffer >> bits) & 0xFF; + output += String.fromCharCode(byte); + } + } + + try { + return decodeURIComponent(escape(output)); + } catch (e) { + return output; + } +} + +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +function getStreamUrl(result) { + if (!result) return null; + if (typeof result === "string" && result.startsWith("http")) { + return result; + } + if (typeof result === "object") { + if (typeof result.source === "string" && result.source.startsWith("http")) { + return result.source; + } + if (typeof result.direct_access_url === "string" && result.direct_access_url.startsWith("http")) { + return result.direct_access_url; + } + if (Array.isArray(result.source)) { + const url = result.source + .map((source) => typeof source === "string" ? source : (source.direct_access_url || source.file || source.url)) + .find((url) => url && url.startsWith("http")); + if (url) return url; + } + } + return null; +} +/* SCHEME END */ \ No newline at end of file diff --git a/anihq/anihq.json b/anihq/anihq.json index a3dad3b..746cea2 100644 --- a/anihq/anihq.json +++ b/anihq/anihq.json @@ -5,7 +5,7 @@ "name": "50/50", "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" }, - "version": "1.0.1", + "version": "1.0.2", "language": "English", "streamType": "HLS", "quality": "1080p", diff --git a/anime-sama/anime-sama.json b/anime-sama/anime-sama.json deleted file mode 100644 index 2ab1ab7..0000000 --- a/anime-sama/anime-sama.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "sourceName": "Anime-Sama", - "iconUrl": "https://cdn.statically.io/gh/Anime-Sama/IMG/img/autres/logo_icon.png", - "author": { - "name": "50/50", - "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" - }, - "version": "1.1.1", - "language": "French", - "streamType": "HLS", - "quality": "1080p", - "baseUrl": "https://anime-sama.fr/", - "searchBaseUrl": "https://anime-sama.fr/", - "scriptUrl": "https://git.luna-app.eu/50n50/sources/raw/branch/main/anime-sama/anime-sama.js", - "type": "anime", - "asyncJS": true, - "softsub": false, - "downloadSupport": false, - "supportsMojuru": true, - "supportsDartotsu": true, - "supportsSora": true, - "supportsLuna": true, - "supportsAnymex": true, - "supportsTsumi": true, - "supportsHiyoku": true -} \ No newline at end of file diff --git a/animedefenders/animedefenders.js b/animedefenders/animedefenders.js index 8a4da44..eb2dac9 100644 --- a/animedefenders/animedefenders.js +++ b/animedefenders/animedefenders.js @@ -66,7 +66,7 @@ async function extractEpisodes(url) { server.server_data?.forEach(ep => { results.push({ number: parseInt(ep.name, 10), - href: "https://anibd.app/playid/" + postid + "/?server=" + server.id + "&slug=" + ep.slug + href: "https://epeng.animeapps.top/apilink.php?data=" + ep.link }); }); }); @@ -79,26 +79,45 @@ async function extractEpisodes(url) { async function extractStreamUrl(url) { try { - const pageHtml = await (await fetchv2(url)).text(); - const iframeUrl = pageHtml.match(/id="video-player-iframe"\s+src="([^"]+)"/)?.[1]?.replace(/&/g, '&'); - if (!iframeUrl) return JSON.stringify({ streams: [], subtitle: "" }); - - const iframeHtml = await (await fetchv2(iframeUrl, { "Referer": "https://anibd.app/" })).text(); - let streamUrl = iframeHtml.match(/url:\s*['"]([^'"]+\.m3u8)['"]/)?.[1] || iframeHtml.match(/videoUrl:\s*["']([^"']+\.m3u8)['"]/)?.[1]; - - if (streamUrl) { - const fullUrl = streamUrl.startsWith("/") ? "https://playeng.animeapps.top" + streamUrl : streamUrl.startsWith("http") ? streamUrl : "https://playeng.animeapps.top/r2/" + streamUrl; - return JSON.stringify({ - streams: [{ - title: "Server 1", - streamUrl: fullUrl, - headers: { "Referer": "https://anibd.app/" } - }], - subtitle: "" - }); - } - return JSON.stringify({ streams: [], subtitle: "" }); + const response = await fetchv2(url); + const servers = await response.json(); + const headers = { + "Referer": "https://anibd.app/" + }; + + const promises = servers.map(async (server) => { + try { + const res = await fetchv2(server.link, headers); + const html = await res.text(); + const match = html.match(/url:\s*['"]([^'"]+)['"]/); + if (match) { + let streamUrl = match[1]; + if (!streamUrl.startsWith("http")) { + const baseUrl = server.link.substring(0, server.link.lastIndexOf("/") + 1); + streamUrl = baseUrl + streamUrl; + } + return { + title: server.server, + streamUrl: streamUrl + }; + } + } catch (err) {} + return null; + }); + + const results = await Promise.all(promises); + const streams = results.filter(s => s !== null); + + return JSON.stringify({ + type: "servers", + streams: streams, + subtitle: null + }); } catch (err) { - return JSON.stringify({ streams: [], subtitle: "" }); + return JSON.stringify({ + type: "servers", + streams: [], + subtitle: null + }); } -} +} \ No newline at end of file diff --git a/animedefenders/animedefenders.json b/animedefenders/animedefenders.json index 3f712bb..361cd43 100644 --- a/animedefenders/animedefenders.json +++ b/animedefenders/animedefenders.json @@ -5,7 +5,7 @@ "name": "50/50", "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" }, - "version": "1.0.4", + "version": "1.0.5", "language": "English (SUB)", "streamType": "HLS", "quality": "1080p", diff --git a/animeheaven/animeheaven.js b/animeheaven/animeheaven.js index 50a8089..aebaa10 100644 --- a/animeheaven/animeheaven.js +++ b/animeheaven/animeheaven.js @@ -58,7 +58,7 @@ async function extractEpisodes(url) { const html = await response.text(); const episodes = []; - const episodeRegex = /]+id="([^"]+)"[^>]*>[\s\S]*?

]*>(\d+)<\/div>/g; + const episodeRegex = /]+id="([^"]+)"[^>]*>[\s\S]*?
(\d+)<\/div>/g; let match; while ((match = episodeRegex.exec(html)) !== null) { @@ -75,7 +75,6 @@ async function extractEpisodes(url) { episodes.reverse(); - console.log(episodes); return JSON.stringify(episodes); } diff --git a/animeheaven/animeheaven.json b/animeheaven/animeheaven.json index ae300e3..138f2d4 100644 --- a/animeheaven/animeheaven.json +++ b/animeheaven/animeheaven.json @@ -5,7 +5,7 @@ "name": "50/50", "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" }, - "version": "1.0.7", + "version": "1.0.8", "language": "English (SUB)", "streamType": "HLS", "quality": "720p", diff --git a/animekhor/animekhor.js b/animekhor/animekhor.js index a269d5e..e4a675e 100644 --- a/animekhor/animekhor.js +++ b/animekhor/animekhor.js @@ -49,17 +49,28 @@ async function extractEpisodes(url) { const response = await fetchv2(url); const html = await response.text(); - const regex = /
\s*\s*New Episode<\/span>/; - const match = regex.exec(html); + const episodeRegex = /]*>\s*]*>\s*
(\d+)<\/div>/g; + let match; - if (match) { + while ((match = episodeRegex.exec(html)) !== null) { results.push({ href: match[1].trim(), - number: 1 + number: parseInt(match[2], 10) }); } + + if (results.length === 0) { + const singleRegex = /
\s*\s*New Episode<\/span>/; + const singleMatch = singleRegex.exec(html); + if (singleMatch) { + results.push({ + href: singleMatch[1].trim(), + number: 1 + }); + } + } - return JSON.stringify(results); + return JSON.stringify(results.reverse()); } async function extractStreamUrl(url) { try { diff --git a/animelib/animelib.js b/animelib/animelib.js index 9b3eff0..edded80 100644 --- a/animelib/animelib.js +++ b/animelib/animelib.js @@ -1,8 +1,13 @@ async function searchResults(keyword) { const results = []; + const headers = { + "Referer": "https://v3.animelib.org/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" + }; try { const response = await fetchv2( - "https://hapi.hentaicdn.org/api/anime?fields[]=rate_avg&fields[]=rate&fields[]=releaseDate&q=" + keyword + "https://hapi.hentaicdn.org/api/anime?fields[]=rate_avg&fields[]=rate&fields[]=releaseDate&q=" + keyword, + headers ); const json = await response.json(); @@ -15,7 +20,7 @@ async function searchResults(keyword) { title, image: "https://passthrough-worker.simplepostrequest.workers.dev/?simple=" + image + - "&referer=https://animelib.org/", + "&referer=https://v3.animelib.org/", href: item.slug_url || item.slug || item.id, _score: scoreTitle(title, keyword) }); @@ -47,16 +52,38 @@ function scoreTitle(title, keyword) { } async function extractDetails(slug) { + const headers = { + "Referer": "https://v3.animelib.org/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" + }; try { const response = await fetchv2( "https://hapi.hentaicdn.org/api/anime/" + slug + "?fields[]=background&fields[]=eng_name&fields[]=otherNames&fields[]=summary&fields[]=releaseDate&fields[]=type_id&fields[]=caution&fields[]=views&fields[]=close_view&fields[]=rate_avg&fields[]=rate&fields[]=genres&fields[]=tags&fields[]=teams&fields[]=user&fields[]=franchise&fields[]=authors&fields[]=publisher&fields[]=userRating&fields[]=moderated&fields[]=metadata&fields[]=metadata.count&fields[]=metadata.close_comments&fields[]=anime_status_id&fields[]=time&fields[]=episodes&fields[]=episodes_count&fields[]=episodesSchedule&fields[]=shiki_rate" - ); + , headers); const json = await response.json(); const data = json.data || {}; + + let description = "No summary available"; + if (data.summary) { + if (typeof data.summary === "string") { + description = data.summary; + } else if (data.summary.content && Array.isArray(data.summary.content)) { + description = data.summary.content + .map(block => { + if (block.content && Array.isArray(block.content)) { + return block.content.map(t => t.text || "").join(""); + } + return ""; + }) + .join("\n") + .trim(); + } + } + const aliases = Array.isArray(data.otherNames) ? data.otherNames.join(", ") : ""; return JSON.stringify([{ - description: data.summary || "No summary available", + description: description, airdate: data.releaseDate || "Unknown", aliases: aliases }]); @@ -71,8 +98,12 @@ async function extractDetails(slug) { async function extractEpisodes(slug) { const results = []; + const headers = { + "Referer": "https://v3.animelib.org/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" + }; try { - const response = await fetchv2("https://hapi.hentaicdn.org/api/episodes?anime_id=" + slug); + const response = await fetchv2("https://hapi.hentaicdn.org/api/episodes?anime_id=" + slug, headers); const json = await response.json(); if (json && Array.isArray(json.data)) { @@ -94,9 +125,13 @@ async function extractEpisodes(slug) { } async function extractStreamUrl(ID) { + const headers = { + "Referer": "https://v3.animelib.org/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" + }; try { const url = "https://hapi.hentaicdn.org/api/episodes/" + ID; - const response = await fetchv2(url); + const response = await fetchv2(url, headers); const json = await response.json(); const data = json.data || {}; diff --git a/animelib/animelib.json b/animelib/animelib.json index 6cc87b3..6228307 100644 --- a/animelib/animelib.json +++ b/animelib/animelib.json @@ -5,7 +5,7 @@ "name": "50/50", "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" }, - "version": "1.0.4", + "version": "1.0.5", "language": "Russian", "streamType": "MP4 & HLS", "quality": "4K", diff --git a/animenosub/animenosub.js b/animenosub/animenosub.js index 305bca0..52d6432 100644 --- a/animenosub/animenosub.js +++ b/animenosub/animenosub.js @@ -56,7 +56,7 @@ async function extractEpisodes(url) { while ((match = regex.exec(html)) !== null) { results.push({ href: match[1].trim(), - number: parseInt(match[2], 10) + number: parseFloat(match[2]) }); } results.reverse(); @@ -65,28 +65,78 @@ async function extractEpisodes(url) { async function extractStreamUrl(url) { - const response = await fetchv2(url); - const html = await response.text(); + try { + const response = await fetchv2(url); + const html = await response.text(); + const streams = []; + + const optionRegex = /