Skip to content
This repository was archived by the owner on Jan 31, 2026. It is now read-only.
This repository was archived by the owner on Jan 31, 2026. It is now read-only.

Provider Request: fmovies4u.com #80

Description

@An0n-00

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

https://fmovies4u.com/

Provider Description

https://fmovies4u.com/ requested by #65

Implementation Details

check first which sources are available:
GET: https://fmovies4u.com/api/metadata

GET: https://fmovies4u.com/api/scrape?type=movie&releaseYear=2008&imdbId=tt0468569&tmdbId=155&title=The+Dark+Knight&sourceOrder=flixhq%2Csoapyto%2Cembed2%2Ccatflix

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()
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    🌟enhancementNew feature or request📀providerEverything that has something to do with providers

    Fields

    No fields configured for Feature.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions