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