浏览代码

Add video proxy support

Zed 7 年之前
父节点
当前提交
ce6dace1d7
共有 4 个文件被更改,包括 20 次插入6 次删除
  1. 7 1
      src/formatters.nim
  2. 8 5
      src/nitter.nim
  3. 4 0
      src/prefs_impl.nim
  4. 1 0
      src/types.nim

+ 7 - 1
src/formatters.nim

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

+ 8 - 5
src/nitter.nim

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

+ 4 - 0
src/prefs_impl.nim

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

+ 1 - 0
src/types.nim

@@ -53,6 +53,7 @@ db("cache.db", "", "", ""):
     Prefs* = object
       hlsPlayback*: bool
       mp4Playback*: bool
+      proxyVideos*: bool
       muteVideos*: bool
       autoplayGifs*: bool
       hideTweetStats*: bool