Include turbovid extractor #446
Labels
No labels
MediaFlow Proxy
autorelease: pending
autorelease: tagged
bug
documentation
duplicate
enhancement
help wanted
invalid
question
wontfix
🇩🇪 German
🇫🇷 French
🇮🇳 Indian
🇸🇦 Arabic
🌐 Multi
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: Creepso/webstreamr-github#446
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Hi
There is a turbovidplay extractor here
https://github.com/Gujal00/ResolveURL/blob/master/script.module.resolveurl/lib/resolveurl/plugins/turboviplay.py
This website has planty of movies on this provider
Movie
Links are like this
https://emturbovid.com/t/68efee487b1b1
https://turbovidhls.com/t/68efee487b1b1
This is being detected as external link but as on the ResolveURL repo does exist a extractor maybe we can bring it to have it playable directly to stremio.
yes, I agree, looks also easy to do atm since the playlist is seemlingly not ip locked.
but not a 100% sure, need to take a closer look
`I tried to convert the class from ResolveURL but I failed...
This
https://emturbovid.com/t/68efee487b1b1
Redirects to this
https://turbovidhls.com/t/68efee487b1b1
Than
This
https://cdn.turboviplay.com/data/68efee487b1b1/68efee487b1b1.m3u8
Gives this
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:BANDWIDTH=52800,RESOLUTION=854x480,CODECS="avc1.64001e,mp4a.40.2"
https://cdn156.saznever.com/data/F/DA/68efee487b1b1/68efee487b1b1480.m3u8`
might need a referer to access it, you can play around with curl on the terminal if you have one. e.g.
curl <URL> -e 'https://emturbovid.com'. I tried briefly and got 403 otherwiseThis from my local host but don't know from vercel
This code shows the file source on stremio, it can play but appears only stuck and black...
If you move the seconds for ex. from 00:00:00 to 00:02:00 it goes there but still stays black...
What I'm missing?
import * as cheerio from 'cheerio';
import { NotFoundError } from '../error';
import { Context, Format, Meta, UrlResult } from '../types';
import { Extractor } from './Extractor';
import { guessHeightFromPlaylist } from '../utils/height';
export class TurboVIPlay extends Extractor {
public readonly id = 'turboviplay';
public readonly label = 'TurboVIPlay';
public override readonly ttl: number = 10800000; // 3h
private domains = [
'turboviplay.com',
'emturbovid.com',
'tuborstb.co',
'javggvideo.xyz',
'stbturbo.xyz',
'turbovidhls.com',
];
public supports(_ctx: Context, url: URL): boolean {
return this.domains.some((d) => url.host.includes(d));
}
public override normalize(url: URL): URL {
// Always use /t/{id} pattern now
return new URL(url.href.replace(//(e|d|embed-)//, '/t/'));
}
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
// Force correct referer for all requests
const headers = {
Referer: 'https://turbovidhls.com',
};
}
/** Follow redirects manually — like helpers.get_media_url() in Gujal’s Python plugin */
private async followRedirect(ctx: Context, link: string, headers: Record<string, string>): Promise {
try {
const resp = await this.fetcher.head(ctx, new URL(link), { headers, redirect: 'follow' });
if (resp && typeof resp['url'] === 'string') return String(resp['url']);
} catch {
try {
const resp = await this.fetcher.fetch(ctx, new URL(link), { headers, redirect: 'follow' });
if (resp && typeof resp['url'] === 'string') return String(resp['url']);
} catch {
// ignore
}
}
return link;
}
/** Resolve HLS master playlist to highest resolution variant */
private async resolveHlsMaster(ctx: Context, url: string, headers: Record<string, string>): Promise {
const text = await this.fetcher.text(ctx, new URL(url), { headers });
if (!text || !text.includes('#EXT-X-STREAM-INF')) return url;
}
}
2025-10-28T11:23:32.031Z [32minfo[39m 7034ba89-dfc6-4eb8-bcd1-26350afa9487: Fetch HEAD https://cdn1.turboviplay.com/data/68f73bcb1aeb9/68f73bcb1aeb9.m3u8 with referer https://www.filmaon.bz/filma/a-royal-montana-christmas/
it is able to get the final m3u8 playable link but shows black
When you test the link on a playlist directly to vlc it works
#EXTM3U
#EXTVLCOPT:http-referrer=https://turbovidhls.com
https://cdn154.foudsea.com/data/E/B9/68f73bcb1aeb9/68f73bcb1aeb9720.m3u8
What is wrong on the code
hmmm...
maybe because the master m3u8 inside is like this
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:BANDWIDTH=52800,RESOLUTION=854x480,CODECS="avc1.64001e,mp4a.40.2"
https://cdn151.teifanc.com/data/B/F1/68f73bcb1aeb9/68f73bcb1aeb9480.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=105600,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2"
https://cdn154.foudsea.com/data/E/B9/68f73bcb1aeb9/68f73bcb1aeb9720.m3u8
I was able to solve this. The turbovidplay hase two type of links:
I also have the code for webstreamr addon for you to add later which supports both type of links by checking if /data/ exist in the master link, do directly decoding, if not than pass it to mediaflow to strip those fake bytes and get ir back playble.
When he merges I will open here a pull request for you to add turbovidplay support.
https://github.com/mhdzumair/mediaflow-proxy/pull/176#pullrequestreview-3507369944