source/youtube/youtube.js
2025-11-03 18:30:31 +00:00

149 lines
5.3 KiB
JavaScript

async function searchResults(keyword) {
const results = [];
try {
const youtubeRegex = /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=)?([a-zA-Z0-9_-]{11})/;
const youtubeMatch = keyword.match(youtubeRegex);
if (youtubeMatch) {
const videoId = youtubeMatch[1];
try {
const response = await fetchv2("https://invidious.nikkosphere.com/api/v1/videos/" + videoId);
const data = await response.json();
results.push({
title: data.title || "YouTube Video",
image: "https://proxy.piped.private.coffee" + (data.videoThumbnails && data.videoThumbnails.length > 0 ? data.videoThumbnails[0].url : ""),
href: videoId
});
return JSON.stringify(results);
} catch (err) {
console.error("Error fetching YouTube video:", err);
return JSON.stringify([{
title: "Error",
image: "Error",
href: "Error"
}]);
}
}
const response = await fetchv2("https://api.piped.private.coffee/search?q=" + encodeURIComponent(keyword) + "&filter=all");
const data = await response.json();
if (data && Array.isArray(data.items)) {
for (const item of data.items) {
if (item.type === "stream") {
const videoId = item.url ? item.url.replace("/watch?v=", "") : "";
results.push({
title: item.title || "",
image: item.thumbnail || "",
href: videoId
});
}
}
}
let nextpage = data.nextpage;
if (nextpage) {
try {
const response2 = await fetchv2("https://api.piped.private.coffee/nextpage/search?nextpage=" + encodeURIComponent(nextpage) + "&q=" + encodeURIComponent(keyword) + "&filter=all");
const data2 = await response2.json();
if (data2 && Array.isArray(data2.items)) {
for (const item of data2.items) {
if (item.type === "stream") {
const videoId = item.url ? item.url.replace("/watch?v=", "") : "";
results.push({
title: item.title || "",
image: item.thumbnail || "",
href: videoId
});
}
}
}
nextpage = data2.nextpage;
if (nextpage) {
const response3 = await fetchv2("https://api.piped.private.coffee/nextpage/search?nextpage=" + encodeURIComponent(nextpage) + "&q=" + encodeURIComponent(keyword) + "&filter=all");
const data3 = await response3.json();
if (data3 && Array.isArray(data3.items)) {
for (const item of data3.items) {
if (item.type === "stream") {
const videoId = item.url ? item.url.replace("/watch?v=", "") : "";
results.push({
title: item.title || "",
image: item.thumbnail || "",
href: videoId
});
}
}
}
}
} catch (err) {
console.error("Error fetching additional pages:", err);
}
}
return JSON.stringify(results);
} catch (err) {
console.error(err);
return JSON.stringify([{
title: "Error",
image: "Error",
href: "Error"
}]);
}
}
async function extractDetails(ID) {
try {
const response = await fetchv2("https://invidious.nikkosphere.com/api/v1/videos/" + ID);
const data = await response.json();
return JSON.stringify([{
description: data.description,
aliases: data.author,
airdate: data.publishedText
}]);
} catch (err) {
return JSON.stringify([{
description: "Error",
aliases: "Error",
airdate: "Error"
}]);
}
}
async function extractEpisodes(ID) {
const results = [];
try {
results.push({
href: ID,
number: 1
});
return JSON.stringify(results);
} catch (err) {
return JSON.stringify([{
href: "Error",
number: "Error"
}]);
}
}
async function extractStreamUrl(ID) {
try {
const response = await fetchv2("https://invidious.nikkosphere.com/api/v1/videos/" + ID);
const data = await response.json();
if (data && Array.isArray(data.formatStreams) && data.formatStreams.length > 0) {
return data.formatStreams[0].url || "https://error.org/";
}
return "https://error.org/";
} catch (err) {
return "https://error.org/";
}
}