18 Commits

8 changed files with 68 additions and 41 deletions

View File

@ -68,11 +68,11 @@ Install the addon directly from the [firefox addon store](https://addons.mozilla
## 📜 Supported sites ## 📜 Supported sites
| Site | Supported | Note | | Site | Supported | Note |
|-----------------------------------------------------------------------|-----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |-----------------------------------------------------------------------|-----------|--------------------------------------------------|
| [doodstream.com](doodstream.com) / [dood.pm](https://dood.pm) | | URL can be extracted but not played (see [here](https://github.com/ByteDream/stream-bypass/blob/674527ed9c1aa35a30fed135c46017571dd3ce31/src/match/matches.ts#L18) for more information) | | [doodstream.com](doodstream.com) / [dood.pm](https://dood.pm) | ✔️ | |
| [evoload.io](https://evoload.io) | ✔️ | | | [evoload.io](https://evoload.io) | ✔️ | |
| [mixdrop.co](https://mixdrop.co) | ✔ | | | [mixdrop.co](https://mixdrop.co) | ✔ | |
| [mp4upload.com](https://mp4upload.com) | | URL can be extracted but not. Probably the same issue as with doodstream | | [mp4upload.com](https://mp4upload.com) | | |
| [newgrounds.com](https://newgrounds.com) | ✔ | | | [newgrounds.com](https://newgrounds.com) | ✔ | |
| [streamtape.com](https://streamtape.com) | ✔ | | | [streamtape.com](https://streamtape.com) | ✔ | |
| [streamzz.to](https://streamzz.to) / [streamz.ws](https://streamz.ws) | ✔ | | | [streamzz.to](https://streamzz.to) / [streamz.ws](https://streamz.ws) | ✔ | |

View File

@ -1,6 +1,6 @@
{ {
"name": "stream-bypass", "name": "stream-bypass",
"version": "2.1.0", "version": "2.1.2",
"description": "Multi-browser addon for multiple streaming providers which redirects directly to the source video", "description": "Multi-browser addon for multiple streaming providers which redirects directly to the source video",
"main": "src/index.ts", "main": "src/index.ts",
"scripts": { "scripts": {

View File

@ -20,7 +20,19 @@ async function main() {
} }
const url = await match.match(re) const url = await match.match(re)
location.assign(chrome.runtime.getURL(`ui/player/player.html?id=${match.id}&url=${encodeURIComponent(url)}`))
if (match.replace && !url.endsWith('.m3u8')) {
const player = document.createElement('video')
player.style.width = '100%'
player.style.height = '100%'
player.controls = true
player.src = url
document.body.innerHTML = ''
document.body.append(player)
} else {
window.location.assign(chrome.runtime.getURL(`ui/player/player.html?id=${match.id}&url=${encodeURIComponent(url)}&domain=${window.location.host}`))
}
} }
main() main()

View File

@ -3,7 +3,7 @@
"name": "Stream Bypass", "name": "Stream Bypass",
"author": "ByteDream", "author": "ByteDream",
"description": "A multi-browser addon / extension for multiple streaming providers which redirects directly to the source video.", "description": "A multi-browser addon / extension for multiple streaming providers which redirects directly to the source video.",
"version": "2.1.0", "version": "2.1.2",
"homepage_url": "https://github.com/ByteDream/stream-bypass", "homepage_url": "https://github.com/ByteDream/stream-bypass",
"browser_specific_settings": { "browser_specific_settings": {
"gecko": { "gecko": {

View File

@ -9,24 +9,23 @@ export abstract class Match {
id: string id: string
reliability: Reliability reliability: Reliability
domains: string[] domains: string[]
replace?: boolean
regex: RegExp regex: RegExp
abstract match(match: RegExpMatchArray): Promise<string> abstract match(match: RegExpMatchArray): Promise<string>
notice?: string notice?: string
} }
// DOES NOT WORK.
// The url can be extracted (sometimes??? wtf) without problems but to receive the actual video, custom request
// headers must be set. And because the javascript and browser ecosystem is so fucked up, there is no good way to
// do this with media which can be natively played with the browser, like here.
class Doodstream implements Match { class Doodstream implements Match {
name = 'Doodstream' name = 'Doodstream'
id = 'doodstream' id = 'doodstream'
reliability = Reliability.HIGH reliability = Reliability.HIGH
domains = [ domains = [
'doodstream.com', 'doodstream.com',
'dood.pm' 'dood.pm',
'dood.ws'
] ]
replace = true
regex = new RegExp(/(\/pass_md5\/.*?)'.*(\?token=.*?expiry=)/s) regex = new RegExp(/(\/pass_md5\/.*?)'.*(\?token=.*?expiry=)/s)
async match(match: RegExpMatchArray): Promise<string> { async match(match: RegExpMatchArray): Promise<string> {
@ -68,30 +67,39 @@ class Evoload implements Match {
class Mixdrop implements Match { class Mixdrop implements Match {
name = 'Mixdrop' name = 'Mixdrop'
id = 'mixdrop' id = 'mixdrop'
reliability = Reliability.HIGH reliability = Reliability.NORMAL
domains = [ domains = [
'mixdrop.co' 'mixdrop.co'
] ]
regex = new RegExp(/(?<=\|)\w{2,}/gm) regex = new RegExp(/(?<=\|)\w{2,}/gm)
async match(match: RegExpMatchArray): Promise<string> { async match(match: RegExpMatchArray): Promise<string> {
return `https://a-${match[1]}.${match[4]}.${match[5]}/v/${match[2]}.${match[6]}?s=${match[12]}&e=${match[13]}` const prefix = /(?<=\/\/)[a|s](?=-)/.exec(document.body.innerHTML)[0]
const subdomain = match[1].length < match[2].length ? match[1] : match[2]
const domain = match.slice().sort((a, b) => b.length - a.length).find(m => /^[a-z]+$/.test(m))
const id = match[1].length > match[2].length ? match[1] : match[2]
const tld = match.find(m => ['net', 'io', 'to', 'sx', 'com'].indexOf(m) !== -1)
const s = match.slice().sort((a, b) => b.length - a.length).slice(1)[0]
const e_t = match.find(m => m.length === 10 && !isNaN(parseInt(m)))
return `https://${prefix}-${subdomain}.${domain}.${tld}/v/${id}.mp4?s=${s}&e=${e_t}&_t=${e_t}`
} }
} }
/*class Mp4Upload implements Match { class Mp4Upload implements Match {
name = 'Mp4Upload' name = 'Mp4Upload'
id = 'mp4upload' id = 'mp4upload'
reliability = Reliability.LOW reliability = Reliability.NORMAL
domains = [ domains = [
'mp4upload.com' 'mp4upload.com'
] ]
replace = true
regex = new RegExp(/(?<=\|)\w{2,}/gm) regex = new RegExp(/(?<=\|)\w{2,}/gm)
async match(match: RegExpMatchArray): Promise<string> { async match(match: RegExpMatchArray): Promise<string> {
return `https://${match[34]}.mp4upload.com:${match[89]}/d/${match[88]}/video.mp4` return `https://${match[34]}.mp4upload.com:${match[89]}/d/${match[88]}/video.mp4`
} }
}*/ }
class Newgrounds implements Match { class Newgrounds implements Match {
name = 'Newgrounds' name = 'Newgrounds'
@ -121,10 +129,10 @@ class Streamtape implements Match {
domains = [ domains = [
'streamtape.com' 'streamtape.com'
] ]
regex = new RegExp(/\/get_video\S*(?=')/gm) regex = new RegExp(/id=.*(?=')/gm)
async match(match: RegExpMatchArray): Promise<string> { async match(match: RegExpMatchArray): Promise<string> {
return `https://streamtape.com${match[0]}` return `https://streamtape.com/get_video?${match.reverse()[0]}`
} }
} }
@ -242,8 +250,10 @@ class Vupload implements Match {
} }
export const matches = [ export const matches = [
new Doodstream(),
new Evoload(), new Evoload(),
new Mixdrop(), new Mixdrop(),
new Mp4Upload(),
new Newgrounds(), new Newgrounds(),
new Streamtape(), new Streamtape(),
new Streamzz(), new Streamzz(),

View File

@ -2,14 +2,16 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>HLS</title> <title>Stream Bypass</title>
<link rel="stylesheet" href="player.css"> <link rel="stylesheet" href="player.css">
<script src="player.js" defer></script> <script src="player.js" defer></script>
</head> </head>
<body> <body>
<video id="video"></video> <video id="video"></video>
<div id="message-container"> <div id="message-container" hidden>
<p id="message" hidden></p> <p id="message"></p>
<br>
<p>Open a new issue <a href="https://github.com/ByteDream/stream-bypass/issues/new">here</a></p>
</div> </div>
</body> </body>
</html> </html>

View File

@ -15,8 +15,10 @@ video
display: flex display: flex
justify-content: center justify-content: center
align-items: center align-items: center
height: 100% flex-direction: column
#message
color: white color: white
text-align: center text-align: center
height: 100%
& a, & a:visited
color: red

View File

@ -49,12 +49,12 @@ async function play_hls(url: string, match: Match) {
break break
case Reliability.HIGH: case Reliability.HIGH:
message = `The reliability for this domains is high, errors like this are very unlikely to happen. message = `The reliability for this domains is high, errors like this are very unlikely to happen.
Try to refresh the page and if the error still exists you might want to open a new issue <a href="https://github.com/ByteDream/stream-bypass/issues/new">here</a>. Try to refresh the page and if the error still exists you might want to open a new issue.
When you're using <a href="https://www.torproject.org/">Tor</a> such errors have a slight chance to occur more often, When you're using Tor, such errors have a slight chance to occur more often,
so if this is the case just try to reload the page and see if it's working then` so if this is the case just try to reload the page and see if it's working then`
break break
} }
show_message(`Could not load HLS video. ${message}`) show_message(`Could not load video. ${message}`)
} }
} else { } else {
show_message('Failed to play m3u8 video (hls is not supported). Try again or create a new issue <a href="https://github.com/ByteDream/stream-bypass/issues/new">here</a>') show_message('Failed to play m3u8 video (hls is not supported). Try again or create a new issue <a href="https://github.com/ByteDream/stream-bypass/issues/new">here</a>')
@ -65,13 +65,14 @@ async function main() {
const urlQuery = new URLSearchParams(window.location.search) const urlQuery = new URLSearchParams(window.location.search)
const id = urlQuery.get('id') const id = urlQuery.get('id')
const url = urlQuery.get('url') const url = urlQuery.get('url')
const domain = urlQuery.get('domain')
const match = matches.find((m) => m.id === id) const match = matches.find((m) => m.id === id)
if (match === undefined) { if (match === undefined) {
show_message(`Invalid id: ${id}. Please report this <a href="https://github.com/ByteDream/stream-bypass/issues/new">here</a>`) show_message(`Invalid id: ${id}. Please report this <a href="https://github.com/ByteDream/stream-bypass/issues/new">here</a>`)
return return
} }
document.title = match.name document.title = `Stream Bypass (${domain})`
url.endsWith('.m3u8') ? await play_hls(url, match) : await play_native(url, match) url.endsWith('.m3u8') ? await play_hls(url, match) : await play_native(url, match)
} }