mirror of
https://github.com/vega-org/vega-providers.git
synced 2026-04-17 23:51:44 +00:00
Add new providers for kmMovies, movies4u,katmoviefix, and zeefliz
Co-authored-by: DHR-Store <boss@dhrgroup.ai>
This commit is contained in:
171
providers/kmMovies/meta.ts
Normal file
171
providers/kmMovies/meta.ts
Normal file
@@ -0,0 +1,171 @@
|
||||
import { Info, Link, ProviderContext } from "../types";
|
||||
|
||||
const kmmHeaders = {
|
||||
Referer: "https://google.com",
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
|
||||
};
|
||||
|
||||
export const getMeta = async function ({
|
||||
link,
|
||||
providerContext,
|
||||
}: {
|
||||
link: string;
|
||||
providerContext: ProviderContext;
|
||||
}): Promise<Info> {
|
||||
try {
|
||||
const { axios, cheerio } = providerContext;
|
||||
|
||||
if (!link.startsWith("http")) {
|
||||
const baseUrl = await providerContext.getBaseUrl("kmmovies");
|
||||
link = `${baseUrl}${link.startsWith("/") ? "" : "/"}${link}`;
|
||||
}
|
||||
|
||||
const res = await axios.get(link, { headers: kmmHeaders });
|
||||
const $ = cheerio.load(res.data);
|
||||
|
||||
// --- Title
|
||||
const title =
|
||||
$("h1, h2, .animated-text").first().text().trim() ||
|
||||
$("meta[property='og:title']").attr("content")?.trim() ||
|
||||
$("title").text().trim() ||
|
||||
"Unknown";
|
||||
|
||||
// --- Poster Image
|
||||
let image =
|
||||
$("div.wp-slider-container img").first().attr("src") ||
|
||||
$("meta[property='og:image']").attr("content") ||
|
||||
$("meta[name='twitter:image']").attr("content") ||
|
||||
"";
|
||||
if (!image || !image.startsWith("http")) {
|
||||
image = new URL(image || "/placeholder.png", link).href;
|
||||
}
|
||||
|
||||
// --- Synopsis
|
||||
let synopsis = "";
|
||||
$("p").each((_, el) => {
|
||||
const text = $(el).text().trim();
|
||||
if (
|
||||
text &&
|
||||
text.length > 40 &&
|
||||
!text.toLowerCase().includes("download") &&
|
||||
!text.toLowerCase().includes("quality")
|
||||
) {
|
||||
synopsis = text;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if (!synopsis) {
|
||||
synopsis =
|
||||
$("meta[property='og:description']").attr("content") ||
|
||||
$("meta[name='description']").attr("content") ||
|
||||
"";
|
||||
}
|
||||
|
||||
// --- Tags / Genre
|
||||
const tags: string[] = [];
|
||||
if (res.data.toLowerCase().includes("action")) tags.push("Action");
|
||||
if (res.data.toLowerCase().includes("drama")) tags.push("Drama");
|
||||
if (res.data.toLowerCase().includes("romance")) tags.push("Romance");
|
||||
if (res.data.toLowerCase().includes("thriller")) tags.push("Thriller");
|
||||
|
||||
// --- Cast
|
||||
const cast: string[] = [];
|
||||
$("p").each((_, el) => {
|
||||
const text = $(el).text().trim();
|
||||
if (/starring|cast/i.test(text)) {
|
||||
text.split(",").forEach((name) => cast.push(name.trim()));
|
||||
}
|
||||
});
|
||||
|
||||
// --- Rating
|
||||
let rating =
|
||||
$("p")
|
||||
.text()
|
||||
.match(/IMDb Rating[:\s]*([0-9.]+)/i)?.[1] || "";
|
||||
if (rating && !rating.includes("/")) rating = rating + "/10";
|
||||
|
||||
// --- IMDb ID
|
||||
const imdbLink = $("p a[href*='imdb.com']").attr("href") || "";
|
||||
const imdbId =
|
||||
imdbLink && imdbLink.includes("/tt")
|
||||
? "tt" + imdbLink.split("/tt")[1].split("/")[0]
|
||||
: "";
|
||||
|
||||
// --- Download Links
|
||||
const linkList: Link[] = [];
|
||||
const isSeries = $(".download-options-grid").length > 0; // Series tab structure
|
||||
|
||||
if (isSeries) {
|
||||
// --- Series: loop through each download-card
|
||||
$(".download-card").each((_, card) => {
|
||||
const card$ = $(card);
|
||||
const quality = card$.find(".download-quality-text").text().trim();
|
||||
const size = card$.find(".download-size-info").text().trim() || "";
|
||||
const href = card$.find("a.tabs-download-button").attr("href") || "";
|
||||
if (href) {
|
||||
const titleText = `Download ${quality} ${size}`.trim();
|
||||
linkList.push({
|
||||
title: titleText,
|
||||
episodesLink: href,
|
||||
quality: quality || "AUTO",
|
||||
directLinks: [
|
||||
{
|
||||
link: href,
|
||||
title: titleText,
|
||||
type: "series",
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// --- Movie: same as before
|
||||
$("a.modern-download-button").each((_, a) => {
|
||||
const parent = $(a).closest(".modern-option-card");
|
||||
const quality = parent.find(".modern-badge").text().trim() || "AUTO";
|
||||
const href = $(a).attr("href") || "";
|
||||
const titleText = `Download ${quality}`;
|
||||
if (href) {
|
||||
linkList.push({
|
||||
title: titleText,
|
||||
episodesLink: href,
|
||||
quality,
|
||||
directLinks: [
|
||||
{
|
||||
link: href,
|
||||
title: titleText,
|
||||
type: "movie",
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
title,
|
||||
synopsis,
|
||||
image,
|
||||
imdbId,
|
||||
type: isSeries ? "series" : "movie",
|
||||
tags,
|
||||
cast,
|
||||
rating,
|
||||
linkList,
|
||||
};
|
||||
} catch (err) {
|
||||
console.error("KMMOVIES getMeta error:", err);
|
||||
return {
|
||||
title: "",
|
||||
synopsis: "",
|
||||
image: "https://via.placeholder.com/300x450",
|
||||
imdbId: "",
|
||||
type: "movie",
|
||||
tags: [],
|
||||
cast: [],
|
||||
rating: "",
|
||||
linkList: [],
|
||||
};
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user