Add video proxy support

This commit is contained in:
Zed 2019-08-19 20:53:47 +02:00
parent f5fef0ff3a
commit ce6dace1d7
4 changed files with 20 additions and 6 deletions

View File

@ -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")

View File

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

View File

@ -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),

View File

@ -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