utils.nim 1.2 KB

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