nitter.nim 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. # SPDX-License-Identifier: AGPL-3.0-only
  2. import asyncdispatch, strformat, logging
  3. from net import Port
  4. from htmlgen import a
  5. from os import getEnv
  6. import jester
  7. import types, config, prefs, formatters, redis_cache, http_pool, auth, apiutils
  8. import views/[general, about]
  9. import routes/[
  10. preferences, timeline, status, media, search, rss, list, debug,
  11. unsupported, embed, resolver, broadcast, router_utils]
  12. const instancesUrl = "https://github.com/zedeus/nitter/wiki/Instances"
  13. const issuesUrl = "https://github.com/zedeus/nitter/issues"
  14. let
  15. configPath = getEnv("NITTER_CONF_FILE", "./nitter.conf")
  16. (cfg, fullCfg) = getConfig(configPath)
  17. sessionsPath = getEnv("NITTER_SESSIONS_FILE", "./sessions.jsonl")
  18. initSessionPool(cfg, sessionsPath)
  19. if not cfg.enableDebug:
  20. # Silence Jester's query warning
  21. addHandler(newConsoleLogger())
  22. setLogFilter(lvlError)
  23. stdout.write &"Starting Nitter at {getUrlPrefix(cfg)}\n"
  24. stdout.flushFile
  25. updateDefaultPrefs(fullCfg)
  26. setCacheTimes(cfg)
  27. setHmacKey(cfg.hmacKey)
  28. setProxyEncoding(cfg.base64Media)
  29. setMaxHttpConns(cfg.httpMaxConns)
  30. setHttpProxy(cfg.proxy, cfg.proxyAuth)
  31. setApiProxy(cfg.apiProxy)
  32. setDisableTid(cfg.disableTid)
  33. setMaxConcurrentReqs(cfg.maxConcurrentReqs)
  34. setMaxRetries(cfg.maxRetries)
  35. setRetryDelayMs(cfg.retryDelayMs)
  36. initAboutPage(cfg.staticDir)
  37. waitFor initRedisPool(cfg)
  38. stdout.write &"Connected to Redis at {cfg.redisHost}:{cfg.redisPort}\n"
  39. stdout.flushFile
  40. createUnsupportedRouter(cfg)
  41. createResolverRouter(cfg)
  42. createPrefRouter(cfg)
  43. createTimelineRouter(cfg)
  44. createListRouter(cfg)
  45. createStatusRouter(cfg)
  46. createSearchRouter(cfg)
  47. createMediaRouter(cfg)
  48. createEmbedRouter(cfg)
  49. createRssRouter(cfg)
  50. createBroadcastRouter(cfg)
  51. createDebugRouter(cfg)
  52. settings:
  53. port = Port(cfg.port)
  54. staticDir = cfg.staticDir
  55. bindAddr = cfg.address
  56. reusePort = true
  57. routes:
  58. before:
  59. # skip all file URLs
  60. cond "." notin request.path
  61. applyUrlPrefs()
  62. get "/":
  63. resp renderMain(renderSearch(), request, cfg, requestPrefs())
  64. get "/about":
  65. resp renderMain(renderAbout(), request, cfg, requestPrefs())
  66. get "/explore":
  67. redirect("/about")
  68. get "/help":
  69. redirect("/about")
  70. get "/i/redirect":
  71. let url = decodeUrl(@"url")
  72. if url.len == 0: resp Http404
  73. redirect(replaceUrls(url, requestPrefs()))
  74. error Http404:
  75. resp Http404, showError("Page not found", cfg)
  76. error InternalError:
  77. echo error.exc.name, ": ", error.exc.msg
  78. const link = a("open a GitHub issue", href = issuesUrl)
  79. resp Http500, showError(
  80. &"An error occurred, please {link} with the URL you tried to visit.", cfg)
  81. error BadClientError:
  82. echo error.exc.name, ": ", error.exc.msg
  83. resp Http500, showError("Network error occurred, please try again.", cfg)
  84. error RateLimitError:
  85. const link = a("another instance", href = instancesUrl)
  86. resp Http429, showError(
  87. &"Instance has been rate limited.<br>Use {link} or try again later.", cfg)
  88. error NoSessionsError:
  89. const link = a("another instance", href = instancesUrl)
  90. resp Http429, showError(
  91. &"Instance has no auth tokens, or is fully rate limited.<br>Use {link} or try again later.", cfg)
  92. extend rss, ""
  93. extend status, ""
  94. extend search, ""
  95. extend timeline, ""
  96. extend media, ""
  97. extend list, ""
  98. extend preferences, ""
  99. extend resolver, ""
  100. extend embed, ""
  101. extend broadcastRoute, ""
  102. extend debug, ""
  103. extend unsupported, ""