|
@@ -3,13 +3,14 @@ import asyncfile, uri, strutils, httpclient, os, mimetypes
|
|
|
import jester, regex
|
|
import jester, regex
|
|
|
|
|
|
|
|
import router_utils
|
|
import router_utils
|
|
|
-import ".."/[types, formatters]
|
|
|
|
|
|
|
+import ".."/[types, formatters, agents]
|
|
|
import ../views/general
|
|
import ../views/general
|
|
|
|
|
|
|
|
export asyncfile, httpclient, os, strutils
|
|
export asyncfile, httpclient, os, strutils
|
|
|
export regex
|
|
export regex
|
|
|
|
|
|
|
|
const m3u8Regex* = re"""url="(.+.m3u8)""""
|
|
const m3u8Regex* = re"""url="(.+.m3u8)""""
|
|
|
|
|
+let mediaAgent* = getAgent()
|
|
|
|
|
|
|
|
proc createMediaRouter*(cfg: Config) =
|
|
proc createMediaRouter*(cfg: Config) =
|
|
|
router media:
|
|
router media:
|
|
@@ -33,19 +34,23 @@ proc createMediaRouter*(cfg: Config) =
|
|
|
createDir(cfg.cacheDir)
|
|
createDir(cfg.cacheDir)
|
|
|
|
|
|
|
|
if not existsFile(filename):
|
|
if not existsFile(filename):
|
|
|
- let client = newAsyncHttpClient()
|
|
|
|
|
|
|
+ let client = newAsyncHttpClient(userAgent=mediaAgent)
|
|
|
|
|
+ var failed = false
|
|
|
|
|
+
|
|
|
try:
|
|
try:
|
|
|
await client.downloadFile($uri, filename)
|
|
await client.downloadFile($uri, filename)
|
|
|
except HttpRequestError:
|
|
except HttpRequestError:
|
|
|
- client.safeClose()
|
|
|
|
|
|
|
+ failed = true
|
|
|
removeFile(filename)
|
|
removeFile(filename)
|
|
|
- resp Http404
|
|
|
|
|
- except OSError:
|
|
|
|
|
- echo "Disk full"
|
|
|
|
|
- resp Http404
|
|
|
|
|
|
|
+ except OSError as e:
|
|
|
|
|
+ echo "Disk full, or network error: ", e.msg
|
|
|
|
|
+ failed = true
|
|
|
finally:
|
|
finally:
|
|
|
client.safeClose()
|
|
client.safeClose()
|
|
|
|
|
|
|
|
|
|
+ if failed:
|
|
|
|
|
+ resp Http404
|
|
|
|
|
+
|
|
|
sendFile(filename)
|
|
sendFile(filename)
|
|
|
|
|
|
|
|
get "/gif/@url":
|
|
get "/gif/@url":
|
|
@@ -56,7 +61,7 @@ proc createMediaRouter*(cfg: Config) =
|
|
|
let url = decodeUrl(@"url")
|
|
let url = decodeUrl(@"url")
|
|
|
cond isTwitterUrl(url) == true
|
|
cond isTwitterUrl(url) == true
|
|
|
|
|
|
|
|
- let content = await safeFetch(url)
|
|
|
|
|
|
|
+ let content = await safeFetch(url, mediaAgent)
|
|
|
if content.len == 0: resp Http404
|
|
if content.len == 0: resp Http404
|
|
|
|
|
|
|
|
let filename = parseUri(url).path.split(".")[^1]
|
|
let filename = parseUri(url).path.split(".")[^1]
|
|
@@ -70,14 +75,14 @@ proc createMediaRouter*(cfg: Config) =
|
|
|
if getHmac(url) != @"sig":
|
|
if getHmac(url) != @"sig":
|
|
|
resp showError("Failed to verify signature", cfg)
|
|
resp showError("Failed to verify signature", cfg)
|
|
|
|
|
|
|
|
- var content = await safeFetch(url)
|
|
|
|
|
|
|
+ var content = await safeFetch(url, mediaAgent)
|
|
|
if content.len == 0: resp Http404
|
|
if content.len == 0: resp Http404
|
|
|
|
|
|
|
|
if ".vmap" in url:
|
|
if ".vmap" in url:
|
|
|
var m: RegexMatch
|
|
var m: RegexMatch
|
|
|
discard content.find(m3u8Regex, m)
|
|
discard content.find(m3u8Regex, m)
|
|
|
url = decodeUrl(content[m.group(0)[0]])
|
|
url = decodeUrl(content[m.group(0)[0]])
|
|
|
- content = await safeFetch(url)
|
|
|
|
|
|
|
+ content = await safeFetch(url, mediaAgent)
|
|
|
|
|
|
|
|
if ".m3u8" in url:
|
|
if ".m3u8" in url:
|
|
|
content = proxifyVideo(content, prefs.proxyVideos)
|
|
content = proxifyVideo(content, prefs.proxyVideos)
|