feat(source): add XDMovies

This commit is contained in:
WebStreamr 2026-02-02 14:19:05 +00:00
parent 455d84d5b1
commit 1f4d81bfc9
No known key found for this signature in database
25 changed files with 671 additions and 6 deletions

View file

@ -0,0 +1,28 @@
import { createTestContext } from '../test';
import { FetcherMock, TmdbId } from '../utils';
import { XDMovies } from './XDMovies';
const ctx = createTestContext();
describe('XDMovies', () => {
let source: XDMovies;
beforeEach(() => {
source = new XDMovies(new FetcherMock(`${__dirname}/__fixtures__/XDMovies`));
});
test('handle non-existent devil\'s bath 2024 gracefully', async () => {
const streams = await source.handle(ctx, 'movie', new TmdbId(931944, undefined, undefined));
expect(streams).toMatchSnapshot();
});
test('handle rathnam 2024', async () => {
const streams = await source.handle(ctx, 'series', new TmdbId(1171532, undefined, undefined));
expect(streams).toMatchSnapshot();
});
test('handle stranger things s05e08', async () => {
const streams = await source.handle(ctx, 'series', new TmdbId(66732, 5, 8));
expect(streams).toMatchSnapshot();
});
});

108
src/source/XDMovies.ts Normal file
View file

@ -0,0 +1,108 @@
import bytes from 'bytes';
import * as cheerio from 'cheerio';
import { BasicAcceptedElems, CheerioAPI } from 'cheerio';
import { AnyNode } from 'domhandler';
import memoize from 'memoizee';
import { ContentType } from 'stremio-addon-sdk';
import { Context, CountryCode, Meta } from '../types';
import { Fetcher, findCountryCodes, getTmdbId, getTmdbNameAndYear, Id, TmdbId } from '../utils';
import { Source, SourceResult } from './Source';
interface GetTokenResponse {
token: string;
}
interface SearchResponsePartial {
tmdb_id: number;
path: string;
audio_languages: string;
}
export class XDMovies extends Source {
public readonly id = 'xdmovies';
public readonly label = 'XDMovies';
public readonly contentTypes: ContentType[] = ['movie', 'series'];
public readonly countryCodes: CountryCode[] = [CountryCode.multi, CountryCode.hi, CountryCode.ta, CountryCode.te, CountryCode.ml, CountryCode.bl, CountryCode.mr, CountryCode.kn, CountryCode.ja, CountryCode.ko, CountryCode.pa, CountryCode.gu];
public readonly baseUrl = 'https://new.xdmovies.wtf';
private readonly fetcher: Fetcher;
public constructor(fetcher: Fetcher) {
super();
this.fetcher = fetcher;
this.getToken = memoize(this.getToken, {
maxAge: 3600000, // 1 hour
normalizer: () => 'getToken',
});
}
public async handleInternal(ctx: Context, _type: string, id: Id): Promise<SourceResult[]> {
const tmdbId = await getTmdbId(ctx, this.fetcher, id);
const token = await this.getToken(ctx);
const searchResponseEntry = await this.search(ctx, tmdbId, token);
if (!searchResponseEntry) {
return [];
}
const html = await this.fetcher.text(ctx, new URL(searchResponseEntry.path, this.baseUrl));
const $ = cheerio.load(html);
if (tmdbId.season) {
return Promise.all(
$(`#season-episodes-${tmdbId.season} .quality-section .episode-card:nth-child(${tmdbId.episode})`)
.map(async (_i, el) => await this.extractSourceResults(ctx, $, el, searchResponseEntry))
.toArray(),
);
}
return Promise.all(
$(`.download-item`)
.map(async (_i, el) => await this.extractSourceResults(ctx, $, el, searchResponseEntry))
.toArray(),
);
};
private readonly getToken = async (ctx: Context): Promise<string> => {
const getTokenUrl = new URL('/php/get_token.php', this.baseUrl);
const getTokenResponse = (await this.fetcher.json(ctx, getTokenUrl)) as GetTokenResponse;
return getTokenResponse.token;
};
private readonly search = async (ctx: Context, tmdbId: TmdbId, token: string): Promise<SearchResponsePartial | undefined> => {
const [name] = await getTmdbNameAndYear(ctx, this.fetcher, tmdbId);
const searchUrl = new URL(`/php/search_api.php?query=${encodeURIComponent(name)}&fuzzy=true`, this.baseUrl);
const searchResponse = (await this.fetcher.json(ctx, searchUrl, { headers: { 'X-Auth-Token': token, 'X-Requested-With': 'XMLHttpRequest' } })) as SearchResponsePartial[];
return searchResponse.find(searchResponseEntry => searchResponseEntry.tmdb_id === tmdbId.id);
};
private readonly extractSourceResults = async (ctx: Context, $: CheerioAPI, el: BasicAcceptedElems<AnyNode>, searchResponse: SearchResponsePartial): Promise<SourceResult> => {
const localHtml = $(el).html() as string;
const sizeMatch = localHtml.match(/([\d.]+ ?[GM]B)/);
const heightMatch = localHtml.match(/\d{3,}p/) as string[];
const meta: Meta = {
countryCodes: [CountryCode.multi, ...findCountryCodes(searchResponse.audio_languages), ...findCountryCodes(localHtml)],
height: parseInt(heightMatch[0] as string),
title: $('.custom-title, .episode-title', el).text().trim(),
...(sizeMatch && { bytes: bytes.parse(sizeMatch[1] as string) as number }),
};
const url = $('a', el)
.map((_i, el) => new URL($(el).attr('href') as string))
.get(0) as URL;
return { url: await this.fetcher.getFinalRedirectUrl(ctx, url, undefined, 1), meta };
};
}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:55 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/njntlayllkcrtb1","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=YBYEFkMbTA4iMW8GC6eRz4QlqQBopkAZwm%2FXkEGGQfLxQbKw6jXvy20LfqkfyZXDMoK7v%2B5aZm2ii%2FwxYHgKA%2FvQENffFAhA8gHhAIP2JP6f\"}]}","server":"cloudflare","cf-ray":"9c7a3929fdddd260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:55 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/ft5h778dgcot8yd","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=lqIDpDMkvXJQ5dkF70SqrWsI8XImbtVOjGPNXInqqkAy%2ByiCIrxYo1fRWKnnJXNQ5GEl0MDKhkbmibVWZqUtLDcXgdhGMlvK9EY4ONU8TFQ%2B\"}]}","server":"cloudflare","cf-ray":"9c7a3929eda8d260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:55 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/d140ytrad4r228o","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=l%2BNnPWvf9ij7mPQdO8%2BHxtgPOQJHQ%2FGlIIrBbYj3cOIMwZJAtCXKZ%2FLQFQFPBVfX9YXc2CA6perTIbqkd7NUQ71DcyLHQLohNxxA7YbCPf0m\"}]}","server":"cloudflare","cf-ray":"9c7a3929ed81d260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:55 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/bzxqjl1vkvdxsvy","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=q8jtF8CzKNn9J%2FBYloLn5t478p27MxGets2ArRdDzcU7ug4AiaiN1yQd7zbBAs7t5UwIfl3o0JgvUEB8BJn5quVMvifvAl0%2Bi%2F4tmS6SY9Yj\"}]}","server":"cloudflare","cf-ray":"9c7a3929fdefd260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:54 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/qgdndi5j1rvil2l","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=CndX24Z%2F5xNQioSyD6GPCEcdQ9y2OX2BH82NA1ebxp%2BT5AUwWgHQMQF8vRwVXqfu9rLEGSB0uyy2UvuhN%2FY8XN2H22BuN6%2F9ZRUvQ%2F3coopk\"}]}","server":"cloudflare","cf-ray":"9c7a3923becad260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:55 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/k7sgskvmmzppzap","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=FCm7UXGA9B03WO0EYOxtIOqNkrCO4McPd%2Fc9VOwIXPKVu31CQO2Ln9VIMc8kicF0gRW5I9K8DfZ1UGxB3r7%2Bk4qww6edjGeVekfvYrIf365C\"}]}","server":"cloudflare","cf-ray":"9c7a3929ed93d260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:54 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/iy7587kppeg6b6p","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=6XMv9bJamwNxTeB52HAJpQ08oeKPf%2B2u1RiFLYNupdQ8jKH8A%2FIaNqcra%2BJgZpJ%2BZrF6ukAfSUDTyUUeFOjIwQ7ibuGk0QwQ70atGJ%2BnPQSZ\"}]}","server":"cloudflare","cf-ray":"9c7a3923bea8d260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:54 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/dn5g8g5drixrrl1","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=d9hgkpK%2BBaxmEdaTfnVUQQ4f9wimIa1aVmEUOITdFc6uI%2FrhlhMapqM5dKhNcPFAO0zv%2BRox0dCBqhE3SkQj1%2BXbagiJoxsEoXSY49HJnPLc\"}]}","server":"cloudflare","cf-ray":"9c7a3923bed5d260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:55 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/vfhor1uv59jkrha","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=pVuXO1Q3Hlt%2F7W8RndGEqTmf%2F7emrgBHbj8avfgD%2FaX7H57KeI8gDfuUTczuM2vJIB7rrcGM9np9Emccer9iUTy4pjWPGsuYJYZOMKjA%2FChb\"}]}","server":"cloudflare","cf-ray":"9c7a3929fdc8d260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:55 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/8mxktxm8ho4ib44","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=78P8cxuwo%2F1QFBjF3Opd9tV5atvAgV5fS5uQ6nxdTCdxiDFvXZ9r1ksV3oe81m5MNbfdK2MmtvJCzHSMJiboeK18DRrksg6z9THJHMxl%2F%2FVR\"}]}","server":"cloudflare","cf-ray":"9c7a3929fdb9d260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"date":"Mon, 02 Feb 2026 14:01:54 GMT","content-type":"text/html; charset=utf-8","connection":"close","access-control-allow-origin":"*","location":"https://hubcloud.foo/drive/oae0mzzzje1xrvy","vary":"Accept","x-powered-by":"Express","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=Gnyqle3rvoos3APD9mqtMsTNzfJdNZzyohGec%2BxDaPewpwya87zoH5jG8yG5ouV1akQjnRdrX5o1ukf6Av3W6Pl4MrukRCkwGtDLrBW6DSYF\"}]}","server":"cloudflare","cf-ray":"9c7a3923cee1d260-FRA","alt-svc":"h3=\":443\"; ma=86400"}

View file

@ -0,0 +1 @@
{"adult":false,"backdrop_path":"/u2dKiAl7UQ9sTwhqzFxVpCnjyYT.jpg","belongs_to_collection":null,"budget":0,"genres":[{"id":28,"name":"Action"},{"id":10749,"name":"Romance"}],"homepage":"","id":1171532,"imdb_id":"tt27577888","origin_country":["IN"],"original_language":"ta","original_title":"ரத்னம்","overview":"Rathnam, a henchmen working for MLA Panneer Selvam in Vellore, protects Malliga, a medical student who bears a resemblance to Rathnam's late mother, from the relentless pursuit of land grabbers Rayudu brothers and becomes her guardian angel.","popularity":0.6786,"poster_path":"/j35uUmrMgWNQHrs0Obi8ll0OVfe.jpg","production_companies":[{"id":95823,"logo_path":"/guoPHeFGMZSXvMnF8zNnOgWPuGO.png","name":"Stone Bench Creations","origin_country":"IN"},{"id":86347,"logo_path":"/ir79iQBhrXk9PJ5Pr9vlLjM4viO.png","name":"Zee Studios","origin_country":"IN"}],"production_countries":[{"iso_3166_1":"IN","name":"India"}],"release_date":"2024-04-26","revenue":0,"runtime":159,"spoken_languages":[{"english_name":"Tamil","iso_639_1":"ta","name":"தமிழ்"}],"status":"Released","tagline":"","title":"Rathnam","video":false,"vote_average":5.273,"vote_count":11}

View file

@ -0,0 +1 @@
{"adult":false,"backdrop_path":"/9oD95lebaaSNQHnLTLjjfITaCg7.jpg","belongs_to_collection":null,"budget":0,"genres":[{"id":18,"name":"Drama"},{"id":9648,"name":"Mystery"},{"id":36,"name":"History"},{"id":27,"name":"Horror"}],"homepage":"","id":931944,"imdb_id":"tt29141112","origin_country":["AT","DE"],"original_language":"de","original_title":"Des Teufels Bad","overview":"In 1750 Austria, a deeply religious woman named Agnes has just married her beloved, but her mind and heart soon grow heavy as her life becomes a long list of chores and expectations. Day after day, she is increasingly trapped in a murky and lonely path leading to evil thoughts, until the possibility of committing a shocking act of violence seems like the only way out of her inner prison.","popularity":4.649,"poster_path":"/txVfrmwFOKB5qczM0ENYSqKMnSv.jpg","production_companies":[{"id":25523,"logo_path":"/hVnHNJUHSxaTpQdWPzC8B5CRvns.png","name":"Ulrich Seidl Filmproduktion","origin_country":"AT"},{"id":23406,"logo_path":"/BTYR4mdM8dQxK0cK0gPVhkXd8j.png","name":"Heimatfilm","origin_country":"DE"},{"id":122,"logo_path":"/pbRxJ8oia1MypvLbukeamObtYr2.png","name":"Coop99 Filmproduktion","origin_country":"AT"}],"production_countries":[{"iso_3166_1":"AT","name":"Austria"},{"iso_3166_1":"DE","name":"Germany"}],"release_date":"2024-03-08","revenue":0,"runtime":121,"spoken_languages":[{"english_name":"German","iso_639_1":"de","name":"Deutsch"}],"status":"Released","tagline":"","title":"The Devil's Bath","video":false,"vote_average":6.6,"vote_count":151}

View file

@ -0,0 +1 @@
{"adult":false,"backdrop_path":"/8zbAoryWbtH0DKdev8abFAjdufy.jpg","created_by":[{"id":1179422,"credit_id":"57599b039251410a99001cce","name":"Ross Duffer","original_name":"Ross Duffer","gender":2,"profile_path":"/7wdhSHgMLry5jBKJT1mdLT3BYaZ.jpg"},{"id":1179419,"credit_id":"57599b0e925141378a002c87","name":"Matt Duffer","original_name":"Matt Duffer","gender":2,"profile_path":"/kXO5CnSxC0znMAICGxnPeuGP73U.jpg"}],"episode_run_time":[],"first_air_date":"2016-07-15","genres":[{"id":10765,"name":"Sci-Fi & Fantasy"},{"id":9648,"name":"Mystery"},{"id":10759,"name":"Action & Adventure"}],"homepage":"https://www.netflix.com/title/80057281","id":66732,"in_production":false,"languages":["en"],"last_air_date":"2025-12-31","last_episode_to_air":{"id":5607051,"name":"Chapter Eight: The Rightside Up","overview":"As Vecna prepares to destroy the world as we know it, the party must put everything on the line to defeat him once and for all.","vote_average":6.769,"vote_count":180,"air_date":"2025-12-31","episode_number":8,"episode_type":"finale","production_code":"","runtime":129,"season_number":5,"show_id":66732,"still_path":"/kP23RWbUWM6vGhT9PxFyP5VT3y4.jpg"},"name":"Stranger Things","next_episode_to_air":null,"networks":[{"id":213,"logo_path":"/wwemzKWzjKYJFfCeiB57q3r4Bcm.png","name":"Netflix","origin_country":""}],"number_of_episodes":42,"number_of_seasons":5,"origin_country":["US"],"original_language":"en","original_name":"Stranger Things","overview":"When a young boy vanishes, a small town uncovers a mystery involving secret experiments, terrifying supernatural forces, and one strange little girl.","popularity":364.1766,"poster_path":"/uOOtwVbSr4QDjAGIifLDwpb2Pdl.jpg","production_companies":[{"id":2575,"logo_path":"/9YJrHYlcfHtwtulkFMAies3aFEl.png","name":"21 Laps Entertainment","origin_country":"US"},{"id":170090,"logo_path":null,"name":"Monkey Massacre Productions","origin_country":"US"},{"id":184664,"logo_path":"/4qv40ryAKUzvwptbv13eXUAl1Wm.png","name":"Upside Down Pictures","origin_country":"US"}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"seasons":[{"air_date":"2016-07-15","episode_count":8,"id":77680,"name":"Season 1","overview":"Strange things are afoot in Hawkins, Indiana, where a young boy's sudden disappearance unearths a young girl with otherworldly powers.","poster_path":"/fOaUnQwDJV22esXEswhaDMSqn2w.jpg","season_number":1,"vote_average":8.4},{"air_date":"2017-10-27","episode_count":9,"id":83248,"name":"Stranger Things 2","overview":"It's been nearly a year since Will's strange disappearance. But life's hardly back to normal in Hawkins. Not even close.","poster_path":"/74nFJmiapxKuUBXRbSu6VqGGcuo.jpg","season_number":2,"vote_average":8.2},{"air_date":"2019-07-04","episode_count":8,"id":115216,"name":"Stranger Things 3","overview":"Budding romance. A brand-new mall. And rabid rats running toward danger. It's the summer of 1985 in Hawkins ... and one summer can change everything.","poster_path":"/x2LSRK2Cm7MZhjluni1msVJ3wDF.jpg","season_number":3,"vote_average":8.1},{"air_date":"2022-05-27","episode_count":9,"id":163313,"name":"Stranger Things 4","overview":"Darkness returns to Hawkins just in time for spring break, igniting fresh terror, disturbing memories — and an ominous new threat.","poster_path":"/zvGTZYDCoMSMIBkXExxRxLYimqN.jpg","season_number":4,"vote_average":8.5},{"air_date":"2025-11-26","episode_count":8,"id":402292,"name":"Stranger Things 5","overview":"The fall of 1987. Hawkins is scarred by rifts. Vecna has vanished and the government has placed the town under military quarantine, forcing Eleven back into hiding. To end this nightmare, they'll need everyone together, one last time.","poster_path":"/5i5Fg549J27knMvhI5NRM2FT3Gn.jpg","season_number":5,"vote_average":7.3}],"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Ended","tagline":"It only gets stranger...","type":"Scripted","vote_average":8.581,"vote_count":20501}

View file

@ -0,0 +1,138 @@
<!doctype html>
<html lang="en">
<head>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-KFGX1HHK8C"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-KFGX1HHK8C');
</script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Rathnam — Movie</title>
<meta name="description" content="Rathnam, a henchmen working for MLA Panneer Selvam in Vellore, protects Malliga, a medical student who bears a resemblance to Rathnam's late mother, from the relentless pursuit of land grabbers Rayudu brothers and becomes her guardian angel.">
<link rel="stylesheet" href="/css/styles.css">
<link rel="stylesheet" href="/css/movie-grid.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css">
<meta property="og:title" content="Rathnam">
<meta property="og:description" content="Rathnam, a henchmen working for MLA Panneer Selvam in Vellore, protects Malliga, a medical student who bears a resemblance to Rathnam's late mother, from the relentless pursuit of land grabbers Rayudu brothers and becomes her guardian angel.">
<meta property="og:image" content="https://image.tmdb.org/t/p/w500/j35uUmrMgWNQHrs0Obi8ll0OVfe.jpg">
<meta name="twitter:card" content="summary_large_image">
<link rel="canonical" href="/movies/rathnam-1080p-720p-hindi-download-1171532">
<script>window.AUTH_TOKEN = '<?php echo htmlspecialchars(getenv('AUTH_TOKEN') ?: ''); ?>';</script>
<script data-cfasync="false" src="//d2n5v45616cm6u.cloudfront.net/?mcvnd=1226697"></script>
</head>
<body class="dark-mode">
<header class="details-header">
<div class="navbar">
<div style="display:flex;align-items:center;">
<a href="/" style="display:flex;align-items:center;text-decoration:none;color:inherit;">
<img src="/assets/logo1.png" style="width:32px;height:auto;" alt="XDMovies Logo" />
<span><h1 class="logo" style="margin-left:8px;">XDMovies</h1></span>
</a>
</div>
<nav style="margin-left:auto;"><ul class="nav-links"><li><a href="/">Home</a></li><li><a href="/search.html"><i class="fa-solid fa-magnifying-glass" style="margin-right:5px;"></i></a></li></ul></nav>
</div>
</header>
<main>
<div class="movie-header" id="movie-header" style="background-image: url('https://image.tmdb.org/t/p/original/u2dKiAl7UQ9sTwhqzFxVpCnjyYT.jpg'); background-size: cover; background-position: center; background-attachment: fixed;">
</div>
<div class="container" id="movie-details">
<div class="details-wrapper">
<img class="poster" src="https://image.tmdb.org/t/p/w500/j35uUmrMgWNQHrs0Obi8ll0OVfe.jpg" alt="Rathnam">
<div class="info">
<h2>Rathnam</h2>
<p><strong>Rating:</strong> 5.273 / 10 ⭐</p>
<p><strong>Genres:</strong> Action, Romance</p>
<p><strong>Release Date:</strong> 2024-04-26</p>
<p id="audio-info"><strong>Audios:</strong> <span class="neon-audio">Hindi</span></p>
<p id="source-info"><strong>Sources:</strong> <span class="neon-source">Amazon</span></p>
<p class="overview">Rathnam, a henchmen working for MLA Panneer Selvam in Vellore, protects Malliga, a medical student who bears a resemblance to Rathnam&#039;s late mother, from the relentless pursuit of land grabbers Rayudu brothers and becomes her guardian angel.</p>
<div class="cast">
<h3>Star Cast:</h3>
<p><em>Vishal Krishna, Priya Bhavani Shankar, Samuthirakani, Murali Sharma, Hareesh Peradi</em></p>
</div>
<h3 class="text-center mb-3 text-warning">Download Links:</h3><div class="download-box card shadow-lg pt-2 px-4 pb-4 mt-2"><details class="mb-3"><summary style="cursor:pointer; font-weight:600;">Amazon Versions(4)</summary><div class="download-buttons d-flex flex-wrap justify-content-center gap-3 mt-2"><div class="download-item text-center mb-3"><div class="custom-title mb-2 text-light">Rathnam.2024.720p.AMZN.WEB-DL.DDP2.0.H.265-XDMovies.mkv</div><a href="https://link.xdmovies.wtf/download/YHbqYlMcSKtmw8aTccl621fRFqJWXxeGHAstPRuA0E4" target="_blank" class="movie-download-btn btn btn-warning"><i class="fas fa-download me-2"></i>1.30 GB</a></div><div class="download-item text-center mb-3"><div class="custom-title mb-2 text-light">Rathnam.2024.720p.AMZN.WEB-DL.DDP2.0.H.264-XDMovies.mkv</div><a href="https://link.xdmovies.wtf/download/p1Z-Ii4P-ohUxG4Tc93JP_3jl9-7I5ZOifOf0mDT__4" target="_blank" class="movie-download-btn btn btn-warning"><i class="fas fa-download me-2"></i>4.61 GB</a></div><div class="download-item text-center mb-3"><div class="custom-title mb-2 text-light">Rathnam.2024.1080p.AMZN.WEB-DL.DDP2.0.H.265-XDMovies.mkv</div><a href="https://link.xdmovies.wtf/download/xUChy50yiRXZgCF-_8FbzG46XEGYm13LO2JcZMvY5HE" target="_blank" class="movie-download-btn btn btn-warning"><i class="fas fa-download me-2"></i>3.80 GB</a></div><div class="download-item text-center mb-3"><div class="custom-title mb-2 text-light">Rathnam.2024.1080p.AMZN.WEB-DL.DDP2.0.H.264-XDMovies.mkv</div><a href="https://link.xdmovies.wtf/download/spgEvICetLWnULbCYnmAM0gB_7pNtkDGI-chtTjOteM" target="_blank" class="movie-download-btn btn btn-warning"><i class="fas fa-download me-2"></i>8.48 GB</a></div></div></details></div>
<details class="seo-text" aria-hidden="true">
<summary class="seo-summary">Tags Ignore</summary>
<p>Download Rathnam in Hindi Full Movie 2024 Free Direct Download from Amazon.</p>
<p>Watch Rathnam Online &amp; Download Latest 2024 Direct Download Links &amp; Fast Mirrors.</p>
<p>Available quality versions: 1080p, 720p for Rathnam.</p>
<p>&quot;Rathnam full movie download&quot;? We provide direct download links and cloud downloads available.</p>
<p>Genres: Action, Romance. #action #romance</p>
<p>Action Romance 2024 Amazon Online</p>
<p>Latest Amazon for free — direct download links and watch online options for Rathnam.</p>
<p>Search terms: &quot;Rathnam free download&quot;, &quot;Rathnam Hindi full movie download&quot;, &quot;Amazon Rathnam download&quot;.</p>
<p style="display:none;">#action #romance</p>
</details>
</div>
</div>
</div>
</main>
<footer>
<div class="container"><p>&copy; 2025 XDMovies</p></div>
</footer>
<script>
function toggleSeason(elementId, button) {
const contentEl = document.getElementById(elementId);
const icon = button.querySelector('i');
const container = button.closest('.movie-resolutions');
if (container) {
const allResolutions = container.querySelectorAll('.resolution-episodes');
allResolutions.forEach(resolution => {
if (resolution.id !== elementId && resolution.classList.contains('active')) {
resolution.classList.remove('active');
const btn = resolution.previousElementSibling;
if (btn) {
const btnIcon = btn.querySelector('i');
btnIcon.classList.replace('fa-angle-up', 'fa-angle-down');
}
}
});
}
contentEl.classList.toggle('active');
if (contentEl.classList.contains('active')) {
icon.classList.replace('fa-angle-down', 'fa-angle-up');
} else {
icon.classList.replace('fa-angle-up', 'fa-angle-down');
}
}
function toggleQuality(elementId, button) {
const contentEl = document.getElementById(elementId);
const icon = button.querySelector('i');
const resolutionEl = button.closest('.resolution-episodes');
const allQualities = resolutionEl.querySelectorAll('.quality-episodes');
allQualities.forEach(quality => {
if (quality.id !== elementId && quality.classList.contains('active')) {
quality.classList.remove('active');
const btn = quality.previousElementSibling;
if (btn) {
const btnIcon = btn.querySelector('i');
btnIcon.classList.replace('fa-angle-up', 'fa-angle-down');
}
}
});
contentEl.classList.toggle('active');
if (contentEl.classList.contains('active')) {
icon.classList.replace('fa-angle-down', 'fa-angle-up');
} else {
icon.classList.replace('fa-angle-up', 'fa-angle-down');
}
}
</script>
</body>
</html>

View file

@ -0,0 +1 @@
{"token":"7297skkihkajwnsgaklakshuwd"}

View file

@ -0,0 +1 @@
[{"id":1565591,"tmdb_id":1171532,"title":"Rathnam","type":"movie","poster":"\/j35uUmrMgWNQHrs0Obi8ll0OVfe.jpg","release_year":"2024","path":"\/movies\/rathnam-1080p-720p-hindi-download-1171532","qualities":["1080p","720p"],"audio_languages":"Hindi"}]

View file

@ -0,0 +1 @@
[{"id":196,"tmdb_id":66732,"title":"Stranger Things","type":"tv","poster":"\/cVxVGwHce6xnW8UaVUggaPXbmoE.jpg","release_year":"2016","path":"\/series\/stranger-things-2160p-1080p-hindi-english-download-66732","qualities":["2160p","1080p"],"audio_languages":"Hindi, English, Tamil, Telugu"},{"id":1565254,"tmdb_id":1610413,"title":"One Last Adventure: The Making of Stranger Things 5","type":"movie","exact_match":0,"poster":"\/aZhrAx5CevLfjXcGIG3wBXxDiAL.jpg","release_year":"2026","path":"\/movies\/one-last-adventure-the-making-of-stranger-things-5-1080p-720p-hindi-english-download-1610413","qualities":["1080p","720p"],"audio_languages":"Hindi, English "},{"id":166,"tmdb_id":1525025,"title":"A Stranger by the Hill","type":"movie","exact_match":0,"poster":"\/1DK8gt7H99ctCPKt57lyoDG5dpe.jpg","release_year":"2024","path":"\/movies\/a-stranger-by-the-hill-1080p-720p-hindi-download-1525025","qualities":["1080p","720p"],"audio_languages":"Hindi"},{"id":2427,"tmdb_id":1389255,"title":"The Stranger in My Home","type":"movie","exact_match":0,"poster":"\/8rxFUdvtFwAxbyZfSBKPB2Vaal9.jpg","release_year":"2025","path":"\/movies\/the-stranger-in-my-home-2160p-1080p-hindi-english-download-1389255","qualities":["2160p","1080p"],"audio_languages":"Hindi, English "},{"id":1565521,"tmdb_id":48781,"title":"Never Talk to Strangers","type":"movie","exact_match":0,"poster":"\/naZWa06duMvKr4dLrPGgl9yrPZ1.jpg","release_year":"1995","path":"\/movies\/never-talk-to-strangers-1080p-english-download-48781","qualities":["1080p"],"audio_languages":"English"},{"id":2410,"tmdb_id":1010756,"title":"The Strangers: Chapter 2","type":"movie","exact_match":0,"poster":"\/pqADzs5SJvI2jC0DThPVMuNJcWS.jpg","release_year":"2025","path":"\/movies\/the-strangers-chapter-2-1080p-english-download-1010756","qualities":["1080p"],"audio_languages":"English"},{"id":1565325,"tmdb_id":1240592,"title":"The Wild Blade of Strangers","type":"movie","exact_match":0,"poster":"\/9DZOU5qibB8WeXtzQ00Nl6tiqfw.jpg","release_year":"2024","path":"\/movies\/the-wild-blade-of-strangers-1080p-720p-hindi-tamil-download-1240592","qualities":["1080p","720p"],"audio_languages":"Hindi, Tamil, Telugu, Chinese "},{"id":1565283,"tmdb_id":371608,"title":"The Strangers: Prey at Night","type":"movie","exact_match":0,"poster":"\/vdxLpPsZkPZdFrREp7eSeSzcimj.jpg","release_year":"2018","path":"\/movies\/the-strangers-prey-at-night-1080p-720p-hindi-english-download-371608","qualities":["1080p","720p"],"audio_languages":"Hindi, English"},{"id":152,"tmdb_id":70626,"title":"Stranger","type":"tv","exact_match":0,"poster":"\/blbbtx7DyvZ3JTGyc9MCArDL79b.jpg","release_year":"2017","path":"\/series\/stranger-1080p-hindi-korean-download-70626","qualities":["1080p"],"audio_languages":"Hindi , Korean"},{"id":980,"tmdb_id":60956,"title":"Doctor Stranger","type":"tv","exact_match":0,"poster":"\/odH9cebqUNHKh1p6BKVSs0gsD34.jpg","release_year":"2014","path":"\/series\/doctor-stranger-1080p-korean-download-60956","qualities":["1080p"],"audio_languages":"Korean "},{"id":637,"tmdb_id":89959,"title":"Strangers from Hell","type":"tv","exact_match":0,"poster":"\/o66rEzPzZZWxSrcus2f46CedHhq.jpg","release_year":"2019","path":"\/series\/strangers-from-hell-1080p-720p-english-download-89959","qualities":["1080p","720p"],"audio_languages":"English "}]

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,166 @@
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`XDMovies handle non-existent devil's bath 2024 gracefully 1`] = `[]`;
exports[`XDMovies handle rathnam 2024 1`] = `
[
{
"meta": {
"bytes": 1395864371,
"countryCodes": [
"multi",
"hi",
],
"height": 720,
"title": "Rathnam.2024.720p.AMZN.WEB-DL.DDP2.0.H.265-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/qgdndi5j1rvil2l",
},
{
"meta": {
"bytes": 4949949808,
"countryCodes": [
"multi",
"hi",
],
"height": 720,
"title": "Rathnam.2024.720p.AMZN.WEB-DL.DDP2.0.H.264-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/iy7587kppeg6b6p",
},
{
"meta": {
"bytes": 4080218931,
"countryCodes": [
"multi",
"hi",
],
"height": 1080,
"title": "Rathnam.2024.1080p.AMZN.WEB-DL.DDP2.0.H.265-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/oae0mzzzje1xrvy",
},
{
"meta": {
"bytes": 9105330667,
"countryCodes": [
"multi",
"hi",
],
"height": 1080,
"title": "Rathnam.2024.1080p.AMZN.WEB-DL.DDP2.0.H.264-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/dn5g8g5drixrrl1",
},
]
`;
exports[`XDMovies handle stranger things s05e08 1`] = `
[
{
"meta": {
"bytes": 17544941404,
"countryCodes": [
"multi",
"en",
"hi",
"ta",
"te",
],
"height": 2160,
"title": "Stranger.Things.S05E08.2160p.NF.WEB-DL.DDP5.1.H.265-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/k7sgskvmmzppzap",
},
{
"meta": {
"bytes": 1513975971,
"countryCodes": [
"multi",
"en",
"hi",
"ta",
"te",
],
"height": 1080,
"title": "Stranger.Things.S05E08.1080p.NF.WEB-DL.AAC5.1.AV1-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/ft5h778dgcot8yd",
},
{
"meta": {
"bytes": 5508295557,
"countryCodes": [
"multi",
"en",
"hi",
"ta",
"te",
],
"height": 1080,
"title": "Stranger.Things.S05E08.1080p.NF.WEB-DL.DDP5.1.H.265-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/d140ytrad4r228o",
},
{
"meta": {
"bytes": 7215545057,
"countryCodes": [
"multi",
"en",
"hi",
"ta",
"te",
],
"height": 1080,
"title": "Stranger.Things.S05E08.1080p.NF.WEB-DL.DDP5.1.Atmos.H.264-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/8mxktxm8ho4ib44",
},
{
"meta": {
"bytes": 5991479377,
"countryCodes": [
"multi",
"en",
"hi",
"ta",
"te",
],
"height": 1080,
"title": "Stranger.Things.S05E08.1080p.NF.WEB-DL.DDP5.1.DV.HDR.H.265-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/bzxqjl1vkvdxsvy",
},
{
"meta": {
"bytes": 1170378588,
"countryCodes": [
"multi",
"en",
"hi",
"ta",
"te",
],
"height": 720,
"title": "Stranger.Things.S05E08.720p.NF.WEB-DL.AAC5.1.AV1-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/vfhor1uv59jkrha",
},
{
"meta": {
"bytes": 2534030704,
"countryCodes": [
"multi",
"en",
"hi",
"ta",
"te",
],
"height": 720,
"title": "Stranger.Things.S05E08.720p.NF.WEB-DL.AAC5.1.H.264-XDMovies.mkv",
},
"url": "https://hubcloud.foo/drive/njntlayllkcrtb1",
},
]
`;

View file

@ -19,6 +19,7 @@ import { StreamKiste } from './StreamKiste';
import { VerHdLink } from './VerHdLink';
import { VidSrc } from './VidSrc';
import { VixSrc } from './VixSrc';
import { XDMovies } from './XDMovies';
export * from './Source';
@ -28,6 +29,7 @@ export const createSources = (fetcher: Fetcher): Source[] => {
return [
// multi
new FourKHDHub(fetcher),
new XDMovies(fetcher),
new VixSrc(fetcher),
new VidSrc(),
new RgShows(fetcher),

View file

@ -11,7 +11,7 @@ exports[`buildManifest default manifest 1`] = `
"config": [
{
"key": "multi",
"title": "Multi 🌐 (4KHDHub, RgShows, VidSrc, VixSrc)",
"title": "Multi 🌐 (4KHDHub, RgShows, VidSrc, VixSrc, XDMovies)",
"type": "checkbox",
},
{
@ -19,6 +19,11 @@ exports[`buildManifest default manifest 1`] = `
"title": "Albanian 🇦🇱 (Kokoshka)",
"type": "checkbox",
},
{
"key": "bl",
"title": "Bengali 🇮🇳 (XDMovies)",
"type": "checkbox",
},
{
"key": "de",
"title": "German 🇩🇪 (Einschalten, KinoGer, MegaKino, MeineCloud, StreamKiste)",
@ -34,9 +39,14 @@ exports[`buildManifest default manifest 1`] = `
"title": "French 🇫🇷 (Frembed, FrenchCloud, Movix)",
"type": "checkbox",
},
{
"key": "gu",
"title": "Gujarati 🇮🇳 (XDMovies)",
"type": "checkbox",
},
{
"key": "hi",
"title": "Hindi 🇮🇳 (4KHDHub)",
"title": "Hindi 🇮🇳 (4KHDHub, XDMovies)",
"type": "checkbox",
},
{
@ -44,19 +54,49 @@ exports[`buildManifest default manifest 1`] = `
"title": "Italian 🇮🇹 (Eurostreaming, MostraGuarda, VixSrc)",
"type": "checkbox",
},
{
"key": "ja",
"title": "Japanese 🇯🇵 (XDMovies)",
"type": "checkbox",
},
{
"key": "kn",
"title": "Kannada 🇮🇳 (XDMovies)",
"type": "checkbox",
},
{
"key": "ko",
"title": "Korean 🇰🇷 (XDMovies)",
"type": "checkbox",
},
{
"key": "ml",
"title": "Malayalam 🇮🇳 (XDMovies)",
"type": "checkbox",
},
{
"key": "mr",
"title": "Marathi 🇮🇳 (XDMovies)",
"type": "checkbox",
},
{
"key": "mx",
"title": "Latin American Spanish 🇲🇽 (CineHDPlus, Cuevana, HomeCine, VerHdLink)",
"type": "checkbox",
},
{
"key": "pa",
"title": "Punjabi 🇮🇳 (XDMovies)",
"type": "checkbox",
},
{
"key": "ta",
"title": "Tamil 🇮🇳 (4KHDHub)",
"title": "Tamil 🇮🇳 (4KHDHub, XDMovies)",
"type": "checkbox",
},
{
"key": "te",
"title": "Telugu 🇮🇳 (4KHDHub)",
"title": "Telugu 🇮🇳 (4KHDHub, XDMovies)",
"type": "checkbox",
},
{
@ -84,9 +124,9 @@ exports[`buildManifest default manifest 1`] = `
],
"description": "Provides HTTP URLs from streaming websites. Configure add-on for additional languages. Add MediaFlow proxy for more URLs.
Supported languages: Albanian, German, Castilian Spanish, French, Hindi, Italian, Latin American Spanish, Tamil, Telugu
Supported languages: Albanian, Bengali, German, Castilian Spanish, French, Gujarati, Hindi, Italian, Japanese, Kannada, Korean, Malayalam, Marathi, Latin American Spanish, Punjabi, Tamil, Telugu
Supported sources: 4KHDHub, CineHDPlus, Cuevana, Einschalten, Eurostreaming, Frembed, FrenchCloud, HomeCine, KinoGer, Kokoshka, MegaKino, MeineCloud, MostraGuarda, Movix, RgShows, StreamKiste, VerHdLink, VidSrc, VixSrc
Supported sources: 4KHDHub, CineHDPlus, Cuevana, Einschalten, Eurostreaming, Frembed, FrenchCloud, HomeCine, KinoGer, Kokoshka, MegaKino, MeineCloud, MostraGuarda, Movix, RgShows, StreamKiste, VerHdLink, VidSrc, VixSrc, XDMovies
Supported extractors: ",
"id": "webstreamr",