nitter/src/routes/media.nim

92 lines
2.3 KiB
Nim
Raw Normal View History

2019-10-21 03:55:18 +00:00
import asyncfile, uri, strutils, httpclient, os, mimetypes
2019-09-06 00:42:35 +00:00
import jester, regex
import router_utils
import ".."/[types, formatters, agents]
2019-09-06 00:42:35 +00:00
import ../views/general
export asyncfile, httpclient, os, strutils
export regex
2020-01-22 12:04:35 +00:00
const m3u8Regex* = re"""url="(.+.m3u8)""""
let mediaAgent* = getAgent()
2020-01-22 12:04:35 +00:00
2019-09-06 00:42:35 +00:00
proc createMediaRouter*(cfg: Config) =
router media:
2020-05-26 12:24:41 +00:00
get "/pic/?":
resp Http404
get "/pic/@url":
2019-09-06 00:42:35 +00:00
cond "http" in @"url"
cond "twimg" in @"url"
let uri = parseUri(decodeUrl(@"url"))
cond isTwitterUrl($uri) == true
let path = uri.path.split("/")[2 .. ^1].join("/")
let filename = cfg.cacheDir / cleanFilename(path & uri.query)
2019-09-06 00:42:35 +00:00
2019-10-23 22:04:54 +00:00
if path.len == 0:
resp Http404
2019-09-06 00:42:35 +00:00
if not existsDir(cfg.cacheDir):
createDir(cfg.cacheDir)
if not existsFile(filename):
let client = newAsyncHttpClient(userAgent=mediaAgent)
var failed = false
try:
await client.downloadFile($uri, filename)
2019-10-21 05:59:36 +00:00
except HttpRequestError:
failed = true
2019-10-21 05:59:36 +00:00
removeFile(filename)
except OSError as e:
echo "Disk full, or network error: ", e.msg
failed = true
2020-01-10 17:18:22 +00:00
finally:
client.safeClose()
2019-09-06 00:42:35 +00:00
if failed:
resp Http404
2019-10-21 03:55:18 +00:00
sendFile(filename)
2019-09-06 00:42:35 +00:00
get "/gif/@url":
cond "http" in @"url"
cond "twimg" in @"url"
cond "mp4" in @"url" or "gif" in @"url"
let url = decodeUrl(@"url")
cond isTwitterUrl(url) == true
let content = await safeFetch(url, mediaAgent)
if content.len == 0: resp Http404
2019-12-06 14:14:38 +00:00
let filename = parseUri(url).path.split(".")[^1]
resp content, settings.mimes.getMimetype(filename)
2019-09-06 00:42:35 +00:00
get "/video/@sig/@url":
cond "http" in @"url"
var url = decodeUrl(@"url")
let prefs = cookiePrefs()
if getHmac(url) != @"sig":
resp showError("Failed to verify signature", cfg)
2019-09-06 00:42:35 +00:00
var content = await safeFetch(url, mediaAgent)
if content.len == 0: resp Http404
2019-09-06 00:42:35 +00:00
if ".vmap" in url:
var m: RegexMatch
2020-01-22 12:04:35 +00:00
discard content.find(m3u8Regex, m)
2019-09-06 00:42:35 +00:00
url = decodeUrl(content[m.group(0)[0]])
content = await safeFetch(url, mediaAgent)
2019-09-06 00:42:35 +00:00
if ".m3u8" in url:
content = proxifyVideo(content, prefs.proxyVideos)
2019-10-21 03:55:18 +00:00
let ext = parseUri(url).path.split(".")[^1]
resp content, settings.mimes.getMimetype(ext)