update
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
async function searchResults(keyword) {
|
||||
const results = [];
|
||||
try {
|
||||
const response = await fetchv2("https://www.tokyoinsider.com/anime/search?k=" + encodeURIComponent(keyword));
|
||||
const html = await response.text();
|
||||
|
||||
const regex = /<img class="a_img" src="([^"]*)"[^>]*><\/a>[\s\S]*?<a href="([^"]*)" style="font: bold 14px verdana;">([^<]*(?:<span[^>]*>[^<]*<\/span>[^<]*)*)<\/a>/g;
|
||||
|
||||
let match;
|
||||
while ((match = regex.exec(html)) !== null) {
|
||||
const titleText = match[3].replace(/<span class="searchhighlight">(.*?)<\/span>/g, '$1').replace(/ /g, ' ');
|
||||
results.push({
|
||||
title: titleText.trim(),
|
||||
image: match[1].trim(),
|
||||
href: match[2].trim()
|
||||
});
|
||||
}
|
||||
|
||||
return JSON.stringify(results);
|
||||
} catch (err) {
|
||||
return JSON.stringify([{
|
||||
title: "Error",
|
||||
image: "Error",
|
||||
href: "Error"
|
||||
}]);
|
||||
}
|
||||
}
|
||||
|
||||
async function extractDetails(slug) {
|
||||
try {
|
||||
const response = await fetchv2("https://www.tokyoinsider.com" + slug);
|
||||
const html = await response.text();
|
||||
|
||||
let titles = "N/A";
|
||||
let airdate = "N/A";
|
||||
let description = "N/A";
|
||||
|
||||
const titlesMatch = html.match(/<td width="80" valign="top"><b>Title\(s\):<\/b><\/td>\s*<td>([\s\S]*?)<\/td>\s*<\/tr>/);
|
||||
if (titlesMatch) {
|
||||
titles = titlesMatch[1].replace(/<br>/g, ', ').replace(/\s+/g, ' ').trim();
|
||||
}
|
||||
|
||||
const airdateMatch = html.match(/<td valign="top"><b>Vintage:<\/b><\/td>\s*<td>([\s\S]*?)<\/td>\s*<\/tr>/);
|
||||
if (airdateMatch) {
|
||||
airdate = airdateMatch[1].replace(/\s+/g, ' ').trim();
|
||||
}
|
||||
|
||||
const summaryMatch = html.match(/<td valign="top" style="border-bottom: 0;"><b>Summary:<\/b><\/td>\s*<td style="border-bottom: 0;">([\s\S]*?)<\/td>\s*<\/tr>/);
|
||||
if (summaryMatch) {
|
||||
description = summaryMatch[1].replace(/\s+/g, ' ').trim();
|
||||
}
|
||||
|
||||
return JSON.stringify([{
|
||||
aliases: titles,
|
||||
airdate: airdate,
|
||||
description: description
|
||||
}]);
|
||||
} catch (err) {
|
||||
return JSON.stringify([{
|
||||
description: "Error",
|
||||
aliases: "Error",
|
||||
airdate: "Error"
|
||||
}]);
|
||||
}
|
||||
}
|
||||
|
||||
async function extractEpisodes(url) {
|
||||
const results = [];
|
||||
try {
|
||||
const response = await fetchv2("https://www.tokyoinsider.com" + url);
|
||||
const html = await response.text();
|
||||
|
||||
const regex = /<div class="episode[^"]*">\s*<div><a class="download-link" href="([^"]*)">[^<]*<em>(\w+)<\/em>\s*<strong>(\d+)<\/strong>(?:<i[^>]*>\s*:\s*([^<]*)<\/i>)?/g;
|
||||
|
||||
let match;
|
||||
while ((match = regex.exec(html)) !== null) {
|
||||
const number = parseInt(match[3], 10);
|
||||
|
||||
results.push({
|
||||
href: match[1].trim(),
|
||||
number: number,
|
||||
});
|
||||
}
|
||||
|
||||
return JSON.stringify(results.reverse());
|
||||
} catch (err) {
|
||||
return JSON.stringify([{
|
||||
href: "Error",
|
||||
type: "Error",
|
||||
number: "Error",
|
||||
title: "Error"
|
||||
}]);
|
||||
}
|
||||
}
|
||||
|
||||
async function extractStreamUrl(slug) {
|
||||
try {
|
||||
const response = await fetchv2("https://www.tokyoinsider.com" + slug);
|
||||
const html = await response.text();
|
||||
|
||||
const streams = [];
|
||||
|
||||
const containerMatch = html.match(/<div\s+id="inner_page">([\s\S]*?)<div\s+class="fsplit">/);
|
||||
if (!containerMatch) {
|
||||
return JSON.stringify({
|
||||
streams: [],
|
||||
subtitle: "Error"
|
||||
});
|
||||
}
|
||||
|
||||
const container = containerMatch[1];
|
||||
|
||||
const downloadRegex = /<a\s+href="(https:\/\/media\.tokyoinsider\.com:8080\/[^"]+)"\s*>([^<]+)<\/a>/g;
|
||||
|
||||
let match;
|
||||
while ((match = downloadRegex.exec(container)) !== null) {
|
||||
streams.push({
|
||||
title: match[2].trim(),
|
||||
streamUrl: match[1].trim(),
|
||||
headers: {}
|
||||
});
|
||||
}
|
||||
|
||||
return JSON.stringify({
|
||||
streams: streams,
|
||||
subtitle: "None"
|
||||
});
|
||||
} catch (err) {
|
||||
return JSON.stringify({
|
||||
streams: [],
|
||||
subtitle: "Error"
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"sourceName": "TokyoInsider",
|
||||
"iconUrl": "https://files.catbox.moe/0c4r1z.png",
|
||||
"author": {
|
||||
"name": "50/50",
|
||||
"icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s"
|
||||
},
|
||||
"version": "1.0.0",
|
||||
"language": "English",
|
||||
"streamType": "HLS",
|
||||
"quality": "1080p",
|
||||
"baseUrl": "https://www.tokyoinsider.com/",
|
||||
"searchBaseUrl": "https://www.tokyoinsider.com/",
|
||||
"scriptUrl": "https://git.luna-app.eu/50n50/sources/raw/branch/main/tokyoinsider/tokyoinsider.js",
|
||||
"type": "anime",
|
||||
"asyncJS": true,
|
||||
"softsub": true,
|
||||
"downloadSupport": true,
|
||||
"supportsLuna": true
|
||||
}
|
||||
Reference in New Issue
Block a user