Merge pull request #182 from Swakshan/extension/autoembed

Update: Autoembed
This commit is contained in:
Moustapha Kodjo Amadou
2025-03-09 12:03:26 +01:00
committed by GitHub

View File

@@ -7,7 +7,7 @@ const mangayomiSources = [{
"typeSource": "multi", "typeSource": "multi",
"isManga": false, "isManga": false,
"itemType": 1, "itemType": 1,
"version": "1.2.1", "version": "1.2.4",
"dateFormat": "", "dateFormat": "",
"dateFormatLocale": "", "dateFormatLocale": "",
"pkgPath": "anime/src/all/autoembed.js" "pkgPath": "anime/src/all/autoembed.js"
@@ -156,15 +156,20 @@ class DefaultExtension extends MProvider {
// Extracts the streams url for different resolutions from a hls stream. // Extracts the streams url for different resolutions from a hls stream.
async extractStreams(url, lang = "", hdr = {}) { async extractStreams(url, lang = "", hdr = {}) {
const response = await new Client().get(url);
const body = response.body;
const lines = body.split('\n');
var streams = [{ var streams = [{
url: url, url: url,
originalUrl: url, originalUrl: url,
quality: "auto", quality: `${lang} - Auto`,
}]; }];
var pref = this.getPreference("autoembed_split_stream_quality");
if(!pref) return streams
const response = await new Client().get(url);
const body = response.body;
const lines = body.split('\n');
for (let i = 0; i < lines.length; i++) { for (let i = 0; i < lines.length; i++) {
if (lines[i].startsWith('#EXT-X-STREAM-INF:')) { if (lines[i].startsWith('#EXT-X-STREAM-INF:')) {
var resolution = lines[i].match(/RESOLUTION=(\d+x\d+)/)[1]; var resolution = lines[i].match(/RESOLUTION=(\d+x\d+)/)[1];
@@ -185,8 +190,18 @@ class DefaultExtension extends MProvider {
// For some streams, we can form stream url using a default template. // For some streams, we can form stream url using a default template.
async splitStreams(url, lang = "", hdr = {}) { async splitStreams(url, lang = "", hdr = {}) {
var streams = []; var streams = [{
var quality = ["auto", "360", "480", "720", "1080"] url: url,
originalUrl: url,
quality: `${lang} - Auto`,
headers: hdr
}];
var pref = this.getPreference("autoembed_split_stream_quality");
if(!pref) return streams
var quality = ["360", "480", "720", "1080"]
for (var q of quality) { for (var q of quality) {
var link = url var link = url
if (q != "auto") { if (q != "auto") {
@@ -253,7 +268,7 @@ class DefaultExtension extends MProvider {
// For anime episode video list // For anime episode video list
async getVideoList(url) { async getVideoList(url) {
var streamAPI = parseInt(this.getPreference("autoembed_stream_source")) var streamAPI = parseInt(this.getPreference("autoembed_stream_source_2"))
var parts = url.split("||"); var parts = url.split("||");
var media_type = parts[0]; var media_type = parts[0];
@@ -278,7 +293,7 @@ class DefaultExtension extends MProvider {
var response = await new Client().get(api); var response = await new Client().get(api);
if (response.statusCode != 200) { if (response.statusCode != 200) {
throw new Error("Video unavailable"); throw new Error("play2.123embed.net unavailable\nPlease choose a different server");
} }
var body = JSON.parse(response.body); var body = JSON.parse(response.body);
@@ -300,14 +315,14 @@ class DefaultExtension extends MProvider {
var response = await new Client().get(api); var response = await new Client().get(api);
if (response.statusCode != 200) { if (response.statusCode != 200) {
throw new Error("Video unavailable"); throw new Error("autoembed.cc unavailable\nPlease choose a different server");
} }
var body = response.body var body = response.body
var sKey = '"file": ' var sKey = '"file": '
var eKey = "]});" var eKey = "]});"
var start = body.indexOf(sKey) var start = body.indexOf(sKey)
if (start < 0) { if (start < 0) {
throw new Error("Video unavailable"); throw new Error("autoembed.cc videos unavailable\nPlease choose a different server");
} }
start += sKey.length start += sKey.length
@@ -330,14 +345,14 @@ class DefaultExtension extends MProvider {
var response = await new Client().get(api, { "Referer": "https://flicky.host/", "sec-fetch-dest": "iframe" }); var response = await new Client().get(api, { "Referer": "https://flicky.host/", "sec-fetch-dest": "iframe" });
if (response.statusCode != 200) { if (response.statusCode != 200) {
throw new Error("Video unavailable"); throw new Error("flicky.host unavailable\nPlease choose a different server");
} }
var body = response.body var body = response.body
var sKey = 'streams = ' var sKey = 'streams = '
var eKey = "];" var eKey = "];"
var start = body.indexOf(sKey) var start = body.indexOf(sKey)
if (start < 0) { if (start < 0) {
throw new Error("Video unavailable"); throw new Error("flicky.host videos unavailable\nPlease choose a different server");
} }
start += sKey.length start += sKey.length
@@ -361,7 +376,7 @@ class DefaultExtension extends MProvider {
var response = await new Client().get(api); var response = await new Client().get(api);
if (response.statusCode != 200) { if (response.statusCode != 200) {
throw new Error("Video unavailable"); throw new Error("vidapi.click unavailable\nPlease choose a different server");
} }
var body = JSON.parse(response.body); var body = JSON.parse(response.body);
@@ -378,43 +393,73 @@ class DefaultExtension extends MProvider {
var response = await new Client().get(api, hdr); var response = await new Client().get(api, hdr);
if (response.statusCode != 200) { if (response.statusCode != 200) {
throw new Error("Video unavailable"); throw new Error("hexa.watch unavailable\nPlease choose a different server");
} }
var body = JSON.parse(response.body); var body = JSON.parse(response.body);
var strms = body.streams var strms = body.streams
for (var strm of strms) { for (var strm of strms) {
var streamLink = strm.url;
if (streamLink.length > 0) {
streams.push({ streams.push({
url: strm.url, url: strm.url,
originalUrl: strm.url, originalUrl: strm.url,
quality: strm.quality, quality: `${strm.label} - Auto`,
headers: strm.headers headers: strm.headers
}); });
} }
}
break; break;
} }
case 7: { case 7: {
if (media_type == "tv") { if (media_type == "tv") {
id = `${id}/${s}/${e}` id = `${id}/${s}/${e}`
} }
var api = `https://febapi.bludclart.com/${media_type}/${id}` var api = `https://vidsrc.su/embed/${media_type}/${id}`
var response = await new Client().get(api); var response = await new Client().get(api);
if (response.statusCode != 200) { if (response.statusCode != 200) {
throw new Error("Video unavailable"); throw new Error("vidsrc.su unavailable\nPlease choose a different server");
} }
var body = response.body
var sKey = 'fixedServers = '
var eKey = "];"
var start = body.indexOf(sKey)
if (start < 0) {
throw new Error("vidsrc.su videos unavailable\nPlease choose a different server");
}
start += sKey.length
var body = JSON.parse(response.body); var end = body.substring(start,).indexOf(eKey) + start + 1
var strms = body.streams.qualities var strms = body.substring(start, end)
for (var strm in strms) {
var quality = strm === "ORG" ? "auto" : strm // Split the data into lines
var url = strms[strm] var lines = strms.split('\n');
streams.push({
url: url, // Regex to match URLs in quotes that start with https://
originalUrl: url, var regex = /url:\s*'(https:\/\/[^']+)'/;
quality: quality, var availableStreams = [];
// Process each line
lines.forEach(line => {
var match = line.match(regex);
if (match && match[1]) {
// Extract the label from the line
var labelMatch = line.match(/label:\s*'([^']+)'/);
var label = labelMatch ? labelMatch[1] : "Unknown";
// Add to our results
availableStreams.push({
url: match[1],
label: label,
}); });
} }
});
for (var stream of availableStreams) {
var streamSplit = await this.extractStreams(stream.url, stream.label);
streams = [...streams, ...streamSplit]
}
break; break;
} }
default: { default: {
@@ -425,7 +470,7 @@ class DefaultExtension extends MProvider {
var response = await new Client().get(api, this.getHeaders()); var response = await new Client().get(api, this.getHeaders());
if (response.statusCode != 200) { if (response.statusCode != 200) {
throw new Error("Video unavailable"); throw new Error("tom.autoembed.cc unavailable\nPlease choose a different server");
} }
var body = JSON.parse(response.body); var body = JSON.parse(response.body);
@@ -436,7 +481,7 @@ class DefaultExtension extends MProvider {
} }
if (streams.length < 1) { if (streams.length < 1) {
throw new Error("Video unavailable"); throw new Error("No streams unavailable\nPlease choose a different server");
} }
@@ -483,12 +528,20 @@ class DefaultExtension extends MProvider {
} }
}, },
{ {
key: 'autoembed_stream_source', key: 'autoembed_split_stream_quality',
"switchPreferenceCompat": {
'title': 'Split stream into different quality streams',
"summary": "Split stream Auto into 360p/720p/1080p",
"value": true
}
},
{
key: 'autoembed_stream_source_2',
listPreference: { listPreference: {
title: 'Preferred stream source', title: 'Preferred stream source',
summary: '', summary: '',
valueIndex: 0, valueIndex: 0,
entries: ["tom.autoembed.cc", "123embed.net", "autoembed.cc - Indian languages", "flicky.host - Indian languages", "vidapi.click", "hexa.watch", "febapi (supports 4K)"], entries: ["tom.autoembed.cc", "123embed.net", "autoembed.cc - Indian languages", "flicky.host - Indian languages", "vidapi.click", "hexa.watch", "vidsrc.su"],
entryValues: ["1", "2", "3", "4", "5", "6", "7"] entryValues: ["1", "2", "3", "4", "5", "6", "7"]
} }
}, },