utils.nim 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import strutils, strformat, sequtils, uri, tables, base64
  2. import nimcrypto, regex
  3. var
  4. hmacKey {.threadvar.}: string
  5. base64Media = false
  6. const
  7. https* = "https://"
  8. twimg* = "pbs.twimg.com/"
  9. badJpgExts = @["1500x500", "jpgn", "jpg:", "jpg_", "_jpg"]
  10. badPngExts = @["pngn", "png:", "png_", "_png"]
  11. twitterDomains = @[
  12. "twitter.com",
  13. "pic.twitter.com",
  14. "twimg.com",
  15. "abs.twimg.com",
  16. "pbs.twimg.com",
  17. "video.twimg.com"
  18. ]
  19. proc setHmacKey*(key: string) =
  20. hmacKey = key
  21. proc setProxyEncoding*(state: bool) =
  22. base64Media = state
  23. proc getHmac*(data: string): string =
  24. ($hmac(sha256, hmacKey, data))[0 .. 12]
  25. proc getVidUrl*(link: string): string =
  26. if link.len == 0: return
  27. let sig = getHmac(link)
  28. if base64Media:
  29. &"/video/enc/{sig}/{encode(link, safe=true)}"
  30. else:
  31. &"/video/{sig}/{encodeUrl(link)}"
  32. proc getPicUrl*(link: string): string =
  33. if base64Media:
  34. &"/pic/enc/{encode(link, safe=true)}"
  35. else:
  36. &"/pic/{encodeUrl(link)}"
  37. proc cleanFilename*(filename: string): string =
  38. const reg = re"[^A-Za-z0-9._-]"
  39. result = filename.replace(reg, "_")
  40. if badJpgExts.anyIt(it in result):
  41. result &= ".jpg"
  42. elif badPngExts.anyIt(it in result):
  43. result &= ".png"
  44. proc filterParams*(params: Table): seq[(string, string)] =
  45. const filter = ["name", "id", "list", "referer", "scroll"]
  46. toSeq(params.pairs()).filterIt(it[0] notin filter and it[1].len > 0)
  47. proc isTwitterUrl*(uri: Uri): bool =
  48. uri.hostname in twitterDomains
  49. proc isTwitterUrl*(url: string): bool =
  50. parseUri(url).hostname in twitterDomains