media.nim 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import asyncfile, uri, strutils, httpclient, os
  2. import jester, regex
  3. import router_utils
  4. import ".."/[types, formatters, utils, prefs]
  5. import ../views/general
  6. export asyncfile, httpclient, os, strutils
  7. export regex
  8. export utils
  9. proc createMediaRouter*(cfg: Config) =
  10. router media:
  11. get "/pic/@sig/@url":
  12. cond "http" in @"url"
  13. cond "twimg" in @"url"
  14. let
  15. uri = parseUri(decodeUrl(@"url"))
  16. path = uri.path.split("/")[2 .. ^1].join("/")
  17. filename = cfg.cacheDir / cleanFilename(path & uri.query)
  18. if getHmac($uri) != @"sig":
  19. resp showError("Failed to verify signature", cfg.title)
  20. if not existsDir(cfg.cacheDir):
  21. createDir(cfg.cacheDir)
  22. if not existsFile(filename):
  23. let client = newAsyncHttpClient()
  24. await client.downloadFile($uri, filename)
  25. client.close()
  26. if not existsFile(filename):
  27. resp Http404
  28. let file = openAsync(filename)
  29. let buf = await readAll(file)
  30. file.close()
  31. resp buf, mimetype(filename)
  32. get "/video/@sig/@url":
  33. cond "http" in @"url"
  34. var url = decodeUrl(@"url")
  35. let prefs = cookiePrefs()
  36. if getHmac(url) != @"sig":
  37. resp showError("Failed to verify signature", cfg.title)
  38. let client = newAsyncHttpClient()
  39. var content = await client.getContent(url)
  40. if ".vmap" in url:
  41. var m: RegexMatch
  42. discard content.find(re"""url="(.+.m3u8)"""", m)
  43. url = decodeUrl(content[m.group(0)[0]])
  44. content = await client.getContent(url)
  45. if ".m3u8" in url:
  46. content = proxifyVideo(content, prefs.proxyVideos)
  47. client.close()
  48. resp content, mimetype(url)