This repository was archived by the owner on Jan 31, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 49
This repository was archived by the owner on Jan 31, 2026. It is now read-only.
Provider Request: fmovies4u.com #80
Copy link
Copy link
Open
Labels
🌟enhancementNew feature or requestNew feature or request📀providerEverything that has something to do with providersEverything that has something to do with providers
Description
Prerequisites
- I have checked the existing issues and this is not a duplicate
- I have read the README.md and ensured that this provider is not already supported
- I have included all relevant details in this request
- I did not answer truthfully to ALL the above checkboxes
Provider Name
fmovies4u
Provider URL
Provider Description
https://fmovies4u.com/ requested by #65
Implementation Details
check first which sources are available:
GET: https://fmovies4u.com/api/metadata
response:
event: update
data: {"id":"scrape","percentage":25,"status":"Searching for movie streams..."}
event: update
data: {"id":"scrape","percentage":75,"status":"Processing stream data..."}
event: init
data: {"sourceIds":["flixhq","soapyto"]}
event: completed
data: {"sourceId":"flixhq","stream":[{"type":"hls","playlist":"https://fmovies4u.com/proxy/m3u8?url=https%3A%2F%2Ff5.megacdn.co%3A2228%2Fv3-hls-playback%2F6976f6ac1c9650a0f293a4866de3a42711b6a75363dc1ba4793c17e6c74e6c16b933260a1bb80b24434ba1f9db27d4aee8b50933dc838118d6b65c32a9cb221a4152bfb637338673223b2082d9f60731989edee5b2883eea3907ca8ad73fc110ef61ad6201ad4af6c6428e8b36f856bb652b731d0f504c1840f8e0f537e1d7c64b3229d0bab893c4e69c921678655cef3b3f14c743abbf091c4819a5294f54ecd41709630053bcd4d6a921aa47ce45d834f2101037cbaee627e5b3f2a8e6896d%2Fplaylist.m3u8&headers=%7B%22Referer%22%3A%22https%3A%2F%2Fmegacloud.store%2F%22%7D","headers":{},"captions":[{"language":"English","url":"https://cca.megafiles.store/c4/7c/c47c5e764a8c8e1f37953b09eb49e16b/c47c5e764a8c8e1f37953b09eb49e16b.vtt","type":"srt"},{"language":"French","url":"https://cca.megafiles.store/b7/1d/b71dc7e568a1d5f94039947dfaf428f4/b71dc7e568a1d5f94039947dfaf428f4.vtt","type":"srt"},{"language":"Italian","url":"https://cca.megafiles.store/c8/7e/c87e94ef31e5e4e11c8fdff1ef60b779/c87e94ef31e5e4e11c8fdff1ef60b779.vtt","type":"srt"},{"language":"Russian","url":"https://cca.megafiles.store/e9/b0/e9b06bcc39dbf0b7d55e618567978f54/e9b06bcc39dbf0b7d55e618567978f54.vtt","type":"srt"},{"language":"Spanish","url":"https://cca.megafiles.store/d2/25/d22571cffeb6771169c095cebcaad90b/d22571cffeb6771169c095cebcaad90b.vtt","type":"srt"}]}]}
Additional Context
async function fetchMetadata(at) {
if (metaDataCache) {
console.log("[providerApi] Using cached metadata:", metaDataCache.slice(0, 5).map(st => ({
id: st.id,
name: st.name
})));
return
}
console.log("[providerApi] Fetching fresh metadata from:", `${at}/metadata`),
metaDataCache = (await mwFetch(`${at}/metadata`)).flat(),
metaDataCache && (console.log("[providerApi] Metadata loaded - Total:", metaDataCache.length, "providers"),
console.log("[providerApi] First 5 entries:", metaDataCache.slice(0, 5).map(st => ({
id: st.id,
name: st.name
}))))
}
function scrapeMediaToQueryMedia(at) {
let j = {};
return at.type === "show" && (j = {
episodeNumber: at.episode.number.toString(),
episodeTmdbId: at.episode.tmdbId,
seasonNumber: at.season.number.toString(),
seasonTmdbId: at.season.tmdbId
}),
{
type: at.type,
releaseYear: at.releaseYear.toString(),
imdbId: at.imdbId,
tmdbId: at.tmdbId,
title: at.title,
...j
}
}
function addQueryDataToUrl(at, j) {
Object.entries(j).forEach(st => {
st[1] && at.searchParams.set(st[0], st[1])
}
)
}
function makeProviderUrl(at) {
const j = st => new URL(`${at}${st}`);
return {
scrapeSource(st, ut) {
const dt = j("/scrape/source");
return addQueryDataToUrl(dt, scrapeMediaToQueryMedia(ut)),
addQueryDataToUrl(dt, {
id: st
}),
dt.toString()
},
scrapeAll(st, ut, dt) {
const ct = j("/scrape");
return addQueryDataToUrl(ct, scrapeMediaToQueryMedia(st)),
ut && ut.length > 0 && ct.searchParams.set("sourceOrder", ut.join(",")),
dt && dt.length > 0 && ct.searchParams.set("embedOrder", dt.join(",")),
ct.toString()
},
scrapeEmbed(st, ut) {
const dt = j("/scrape/embed");
return addQueryDataToUrl(dt, {
id: st,
url: ut
}),
dt.toString()
}
}
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
🌟enhancementNew feature or requestNew feature or request📀providerEverything that has something to do with providersEverything that has something to do with providers