]*class="item\\s+server-item"[^>]*data-type="${esc(wantTrack)}"[^>]*data-id="(\\d+)"[^>]*>[\\s\\S]*?
]*>[\\s\\S]*?${esc(serverName)}[\\s\\S]*?<\\/a>`,
+ "i"
+ );
- let serverId = "";
-
- const re = new RegExp(`data-id="([^"]+)"[^>]*>\\s*${server.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*<`, "i");
- const mm = re.exec(html);
- if (mm) serverId = String(mm[1] || "").trim();
+ let m = strictRe.exec(serverHtml);
+ let serverId = m ? String(m[1] || "").trim() : "";
if (!serverId) {
- const re2 = /data-id="([^"]+)"/i;
- const mm2 = re2.exec(html);
- if (mm2) serverId = String(mm2[1] || "").trim();
+ const trackAnyRe = new RegExp(
+ `]*class="item\\s+server-item"[^>]*data-type="${esc(wantTrack)}"[^>]*data-id="(\\d+)"`,
+ "i"
+ );
+ m = trackAnyRe.exec(serverHtml);
+ serverId = m ? String(m[1] || "").trim() : "";
}
- if (!serverId) throw new Error("No server id found");
+ if (!serverId) {
+ const anyRe = /data-id="(\d+)"/i;
+ const mm = anyRe.exec(serverHtml);
+ serverId = mm ? String(mm[1] || "").trim() : "";
+ }
+
+ if (!serverId) throw new Error(`Server id not found (track=${wantTrack} server=${serverName})`);
const sourcesJson = this._getJson(
`${this.baseUrl}/ajax/v2/episode/sources?id=${encodeURIComponent(serverId)}`,
{ "X-Requested-With": "XMLHttpRequest" }
);
- const embed = (sourcesJson && sourcesJson.link) ? String(sourcesJson.link) : "";
- if (!embed) throw new Error("No embed link returned");
+ const embedUrl = sourcesJson && sourcesJson.link ? String(sourcesJson.link) : "";
+ if (!embedUrl) throw new Error("No embed link returned");
let decryptData = null;
let requiredHeaders = {};
try {
- decryptData = this.extractMegaCloudSync(embed);
+ decryptData = this.extractMegaCloudSync(embedUrl);
requiredHeaders = (decryptData && decryptData.headersProvided) ? decryptData.headersProvided : {};
} catch (e) {
decryptData = null;
@@ -309,14 +285,13 @@ class HiAnime {
if (!decryptData) {
decryptData = this._getJson(
- `https://ac-api.ofchaos.com/api/anime/embed/convert/v2?embedUrl=${encodeURIComponent(embed)}`,
+ `https://ac-api.ofchaos.com/api/anime/embed/convert/v2?embedUrl=${encodeURIComponent(embedUrl)}`,
{}
);
requiredHeaders = {
- Referer: "https://megacloud.club/",
- Origin: "https://megacloud.club",
- "User-Agent":
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
+ "Referer": "https://megacloud.club/",
+ "Origin": "https://megacloud.club",
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
"X-Requested-With": "XMLHttpRequest"
};
}
@@ -325,14 +300,13 @@ class HiAnime {
const sources = decryptData.sources || [];
const streamSource =
- sources.find((s) => s && s.type === "hls" && s.file) ||
- sources.find((s) => s && s.type === "mp4" && s.file) ||
+ sources.find((s) => s && String(s.type || "").toLowerCase() === "hls" && s.file) ||
+ sources.find((s) => s && String(s.type || "").toLowerCase() === "mp4" && s.file) ||
sources.find((s) => s && s.file);
if (!streamSource || !streamSource.file) throw new Error("No valid stream file found");
- const tracks = decryptData.tracks || [];
- const subtitles = (tracks || [])
+ const subtitles = (decryptData.tracks || [])
.filter((t) => t && String(t.kind || "").toLowerCase() === "captions" && t.file)
.map((track, index) => ({
id: `sub-${index}`,
@@ -344,16 +318,15 @@ class HiAnime {
const outType = (String(streamSource.type || "").toLowerCase() === "hls") ? "m3u8" : "mp4";
return JSON.stringify({
- server: server,
+ server: serverName,
headers: requiredHeaders || {},
- videoSources: [
- {
- url: String(streamSource.file),
- type: outType,
- quality: "auto",
- subtitles: subtitles
- }
- ]
+ _debug: { scUsed: wantTrack, serverId: serverId },
+ videoSources: [{
+ url: String(streamSource.file),
+ type: outType,
+ quality: "auto",
+ subtitles
+ }]
});
}
@@ -367,12 +340,11 @@ class HiAnime {
const baseDomain = `${protocol}://${host}/`;
const headers = {
- Accept: "*/*",
+ "Accept": "*/*",
"X-Requested-With": "XMLHttpRequest",
- Referer: baseDomain,
- Origin: `${protocol}://${host}`,
- "User-Agent":
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"
+ "Referer": baseDomain,
+ "Origin": `${protocol}://${host}`,
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"
};
const html = this._getText(embedUrl, headers);