utils.nim 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # SPDX-License-Identifier: AGPL-3.0-only
  2. import strutils, strformat, uri, tables, base64
  3. import nimcrypto
  4. import types
  5. var
  6. hmacKey: string
  7. base64Media = false
  8. const
  9. https* = "https://"
  10. twimg* = "pbs.twimg.com/"
  11. nitterParams = ["name", "tab", "id", "list", "referer", "scroll"]
  12. twitterDomains = @[
  13. "twitter.com",
  14. "pic.twitter.com",
  15. "twimg.com",
  16. "abs.twimg.com",
  17. "pbs.twimg.com",
  18. "video.twimg.com"
  19. ]
  20. proc setHmacKey*(key: string) =
  21. hmacKey = key
  22. proc setProxyEncoding*(state: bool) =
  23. base64Media = state
  24. proc getHmac*(data: string): string =
  25. ($hmac(sha256, hmacKey, data))[0 .. 12]
  26. proc getBestMp4VidVariant(video: Video): VideoVariant =
  27. for v in video.variants:
  28. if v.bitrate >= result.bitrate:
  29. result = v
  30. proc getVidVariant*(video: Video; playbackType: VideoType): VideoVariant =
  31. case playbackType
  32. of mp4:
  33. return video.getBestMp4VidVariant
  34. of m3u8, vmap:
  35. for variant in video.variants:
  36. if variant.contentType == playbackType:
  37. return variant
  38. proc getVidUrl*(link: string): string =
  39. if link.len == 0: return
  40. let sig = getHmac(link)
  41. if base64Media:
  42. &"/video/enc/{sig}/{encode(link, safe=true)}"
  43. else:
  44. &"/video/{sig}/{encodeUrl(link)}"
  45. proc getPicUrl*(link: string): string =
  46. if base64Media:
  47. &"/pic/enc/{encode(link, safe=true)}"
  48. else:
  49. &"/pic/{encodeUrl(link)}"
  50. proc getOrigPicUrl*(link: string): string =
  51. if base64Media:
  52. &"/pic/orig/enc/{encode(link, safe=true)}"
  53. else:
  54. &"/pic/orig/{encodeUrl(link)}"
  55. proc filterParams*(params: Table): seq[(string, string)] =
  56. for p in params.pairs():
  57. if p[1].len > 0 and p[0] notin nitterParams:
  58. result.add p
  59. proc isTwitterUrl*(uri: Uri): bool =
  60. uri.hostname in twitterDomains
  61. proc isTwitterUrl*(url: string): bool =
  62. parseUri(url).hostname in twitterDomains