Add video proxy support
This commit is contained in:
		
							parent
							
								
									f5fef0ff3a
								
							
						
					
					
						commit
						ce6dace1d7
					
				| 
						 | 
				
			
			@ -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 New Issue