utils.nim 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. # SPDX-License-Identifier: AGPL-3.0-only
  2. import sequtils, strutils, strformat, uri, tables, base64
  3. import nimcrypto
  4. var
  5. hmacKey: string
  6. base64Media = false
  7. const
  8. https* = "https://"
  9. twimg* = "pbs.twimg.com/"
  10. nitterParams* = ["name", "tab", "id", "list", "referer", "scroll", "prefs"]
  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. "x.com",
  19. "pscp.tv",
  20. "video.pscp.tv"
  21. ]
  22. proc setHmacKey*(key: string) =
  23. hmacKey = key
  24. proc setProxyEncoding*(state: bool) =
  25. base64Media = state
  26. proc getHmac*(data: string): string =
  27. ($hmac(sha256, hmacKey, data))[0 .. 12]
  28. proc getVidUrl*(link: string): string =
  29. if link.len == 0: return
  30. let sig = getHmac(link)
  31. if base64Media:
  32. &"/video/enc/{sig}/{encode(link, safe=true)}"
  33. else:
  34. &"/video/{sig}/{encodeUrl(link)}"
  35. proc getPicUrl*(link: string): string =
  36. if base64Media:
  37. &"/pic/enc/{encode(link, safe=true)}"
  38. else:
  39. &"/pic/{encodeUrl(link)}"
  40. proc getOrigPicUrl*(link: string): string =
  41. if base64Media:
  42. &"/pic/orig/enc/{encode(link, safe=true)}"
  43. else:
  44. &"/pic/orig/{encodeUrl(link)}"
  45. proc filterParams*(params: Table): seq[(string, string)] =
  46. for p in params.pairs():
  47. if p[1].len > 0 and p[0] notin nitterParams:
  48. result.add p
  49. proc isTwitterUrl*(uri: Uri): bool =
  50. uri.hostname in twitterDomains or
  51. uri.hostname.endsWith(".video.pscp.tv")
  52. proc isTwitterUrl*(url: string): bool =
  53. isTwitterUrl(parseUri(url))
  54. proc validateNumber*(value: string): string =
  55. if value.anyIt(not it.isDigit):
  56. return ""
  57. return value