nitter.nim 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import asyncdispatch, strformat
  2. from net import Port
  3. from htmlgen import a
  4. from os import getEnv
  5. import jester
  6. import types, config, prefs, formatters, redis_cache, http_pool, tokens
  7. import views/[general, about]
  8. import routes/[
  9. preferences, timeline, status, media, search, rss, list,
  10. unsupported, embed, resolver, router_utils]
  11. const instancesUrl = "https://github.com/zedeus/nitter/wiki/Instances"
  12. let configPath = getEnv("NITTER_CONF_FILE", "./nitter.conf")
  13. let (cfg, fullCfg) = getConfig(configPath)
  14. when defined(release):
  15. import logging
  16. # Silence Jester's query warning
  17. addHandler(newConsoleLogger())
  18. setLogFilter(lvlError)
  19. stdout.write &"Starting Nitter at {getUrlPrefix(cfg)}\n"
  20. stdout.flushFile
  21. updateDefaultPrefs(fullCfg)
  22. setCacheTimes(cfg)
  23. setHmacKey(cfg.hmacKey)
  24. setProxyEncoding(cfg.base64Media)
  25. setMaxHttpConns(cfg.httpMaxConns)
  26. waitFor initRedisPool(cfg)
  27. stdout.write &"Connected to Redis at {cfg.redisHost}:{cfg.redisPort}\n"
  28. stdout.flushFile
  29. asyncCheck initTokenPool(cfg)
  30. createUnsupportedRouter(cfg)
  31. createResolverRouter(cfg)
  32. createPrefRouter(cfg)
  33. createTimelineRouter(cfg)
  34. createListRouter(cfg)
  35. createStatusRouter(cfg)
  36. createSearchRouter(cfg)
  37. createMediaRouter(cfg)
  38. createEmbedRouter(cfg)
  39. createRssRouter(cfg)
  40. settings:
  41. port = Port(cfg.port)
  42. staticDir = cfg.staticDir
  43. bindAddr = cfg.address
  44. routes:
  45. get "/":
  46. resp renderMain(renderSearch(), request, cfg, themePrefs())
  47. get "/about":
  48. resp renderMain(renderAbout(), request, cfg, themePrefs())
  49. get "/explore":
  50. redirect("/about")
  51. get "/help":
  52. redirect("/about")
  53. get "/i/redirect":
  54. let url = decodeUrl(@"url")
  55. if url.len == 0: resp Http404
  56. redirect(replaceUrl(url, cookiePrefs()))
  57. error Http404:
  58. resp Http404, showError("Page not found", cfg)
  59. error RateLimitError:
  60. echo error.exc.msg
  61. resp Http429, showError("Instance has been rate limited.<br>Use " &
  62. a("another instance", href = instancesUrl) &
  63. " or try again later.", cfg)
  64. extend unsupported, ""
  65. extend preferences, ""
  66. extend resolver, ""
  67. extend rss, ""
  68. extend search, ""
  69. extend timeline, ""
  70. extend list, ""
  71. extend status, ""
  72. extend media, ""
  73. extend embed, ""