mirror of
https://github.com/bytedream/stream-bypass.git
synced 2025-06-27 18:40:31 +02:00
Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
841c824590 | |||
2055a3ea81 | |||
0262d1853c | |||
81da6600e6 | |||
817f5b82f9 | |||
9a17fb0d9b | |||
17f8aab216 | |||
44d4c9cbcf | |||
b34531b982 | |||
e699d3885c | |||
396038a803 | |||
bd64d4ed0b | |||
a207c336b0 | |||
2460657f2a | |||
698ed5ac3c | |||
dc42220f09 | |||
e146649bbf | |||
424e34190c |
@ -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) | ✔ | |
|
||||||
|
@ -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": {
|
||||||
|
14
src/index.ts
14
src/index.ts
@ -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()
|
||||||
|
@ -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": {
|
||||||
|
@ -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(),
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user