Add video proxy support
This commit is contained in:
parent
f5fef0ff3a
commit
ce6dace1d7
|
@ -1,7 +1,7 @@
|
||||||
import strutils, strformat, htmlgen, xmltree, times
|
import strutils, strformat, htmlgen, xmltree, times
|
||||||
import regex
|
import regex
|
||||||
|
|
||||||
import types
|
import types, utils
|
||||||
|
|
||||||
from unicode import Rune, `$`
|
from unicode import Rune, `$`
|
||||||
|
|
||||||
|
@ -74,6 +74,12 @@ proc stripTwitterUrls*(text: string): string =
|
||||||
result = result.replace(picRegex, "")
|
result = result.replace(picRegex, "")
|
||||||
result = result.replace(ellipsisRegex, "")
|
result = result.replace(ellipsisRegex, "")
|
||||||
|
|
||||||
|
proc proxifyVideo*(manifest: string; proxy: bool): string =
|
||||||
|
proc cb(m: RegexMatch; s: string): string =
|
||||||
|
result = "https://video.twimg.com" & s[m.group(0)[0]]
|
||||||
|
if proxy: result = result.getSigUrl("video")
|
||||||
|
result = manifest.replace(re"(.+(.ts|.m3u8|.vmap))", cb)
|
||||||
|
|
||||||
proc getUserpic*(userpic: string; style=""): string =
|
proc getUserpic*(userpic: string; style=""): string =
|
||||||
let pic = userpic.replace(re"_(normal|bigger|mini|200x200|400x400)(\.[A-z]+)$", "$2")
|
let pic = userpic.replace(re"_(normal|bigger|mini|200x200|400x400)(\.[A-z]+)$", "$2")
|
||||||
pic.replace(re"(\.[A-z]+)$", style & "$1")
|
pic.replace(re"(\.[A-z]+)$", style & "$1")
|
||||||
|
|
|
@ -182,16 +182,19 @@ routes:
|
||||||
|
|
||||||
get "/video/@sig/@url":
|
get "/video/@sig/@url":
|
||||||
cond "http" in @"url"
|
cond "http" in @"url"
|
||||||
cond "video.twimg" in @"url"
|
var url = decodeUrl(@"url")
|
||||||
let url = decodeUrl(@"url")
|
let prefs = cookiePrefs()
|
||||||
|
|
||||||
if getHmac(url) != @"sig":
|
if getHmac(url) != @"sig":
|
||||||
resp showError("Failed to verify signature", cfg.title)
|
resp showError("Failed to verify signature", cfg.title)
|
||||||
|
|
||||||
let client = newAsyncHttpClient()
|
let client = newAsyncHttpClient()
|
||||||
let video = await client.getContent(url)
|
var content = await client.getContent(url)
|
||||||
client.close()
|
|
||||||
|
|
||||||
resp video, mimetype(url)
|
if ".m3u8" in url:
|
||||||
|
content = proxifyVideo(content, prefs.proxyVideos)
|
||||||
|
|
||||||
|
client.close()
|
||||||
|
resp content, mimetype(url)
|
||||||
|
|
||||||
runForever()
|
runForever()
|
||||||
|
|
|
@ -40,6 +40,10 @@ const prefList*: Table[string, seq[Pref]] = {
|
||||||
label: "Enable hls video streaming (requires JavaScript)",
|
label: "Enable hls video streaming (requires JavaScript)",
|
||||||
defaultState: false),
|
defaultState: false),
|
||||||
|
|
||||||
|
Pref(kind: checkbox, name: "proxyVideos",
|
||||||
|
label: "Proxy video streaming through the server (might be slow)",
|
||||||
|
defaultState: false),
|
||||||
|
|
||||||
Pref(kind: checkbox, name: "muteVideos",
|
Pref(kind: checkbox, name: "muteVideos",
|
||||||
label: "Mute videos by default",
|
label: "Mute videos by default",
|
||||||
defaultState: false),
|
defaultState: false),
|
||||||
|
|
|
@ -53,6 +53,7 @@ db("cache.db", "", "", ""):
|
||||||
Prefs* = object
|
Prefs* = object
|
||||||
hlsPlayback*: bool
|
hlsPlayback*: bool
|
||||||
mp4Playback*: bool
|
mp4Playback*: bool
|
||||||
|
proxyVideos*: bool
|
||||||
muteVideos*: bool
|
muteVideos*: bool
|
||||||
autoplayGifs*: bool
|
autoplayGifs*: bool
|
||||||
hideTweetStats*: bool
|
hideTweetStats*: bool
|
||||||
|
|
Loading…
Reference in New Issue