# SPDX-License-Identifier: AGPL-3.0-only import asyncdispatch, strformat, logging from net import Port from htmlgen import a from os import getEnv import jester import types, config, prefs, formatters, redis_cache, http_pool, auth import views/[general] import routes/[ preferences, timeline, status, media, search, rss, list, debug, unsupported, embed, resolver, router_utils] let configPath = getEnv("NITTER_CONF_FILE", "./nitter.conf") (cfg, fullCfg) = getConfig(configPath) sessionsPath = getEnv("NITTER_SESSIONS_FILE", "./sessions.jsonl") initSessionPool(cfg, sessionsPath) if not cfg.enableDebug: # Silence Jester's query warning addHandler(newConsoleLogger()) setLogFilter(lvlError) stdout.write &"Starting Nitter at {getUrlPrefix(cfg)}\n" stdout.flushFile updateDefaultPrefs(fullCfg) setCacheTimes(cfg) setHmacKey(cfg.hmacKey) setProxyEncoding(cfg.base64Media) setMaxHttpConns(cfg.httpMaxConns) setHttpProxy(cfg.proxy, cfg.proxyAuth) waitFor initRedisPool(cfg) stdout.write &"Connected to Redis at {cfg.redisHost}:{cfg.redisPort}\n" stdout.flushFile createUnsupportedRouter(cfg) createResolverRouter(cfg) createPrefRouter(cfg) createTimelineRouter(cfg) createListRouter(cfg) createStatusRouter(cfg) createSearchRouter(cfg) createMediaRouter(cfg) createEmbedRouter(cfg) createRssRouter(cfg) createDebugRouter(cfg) settings: port = Port(cfg.port) staticDir = cfg.staticDir bindAddr = cfg.address reusePort = true routes: get "/": resp renderMain(renderSearch(), request, cfg, themePrefs()) get "/i/redirect": let url = decodeUrl(@"url") if url.len == 0: resp Http404 redirect(replaceUrls(url, cookiePrefs())) error Http404: resp Http404, showError("Page not found", cfg) error InternalError: echo error.exc.name, ": ", error.exc.msg const link = a("ngn@ngn.tf", href = "mailto:ngn@ngn.tf") resp Http500, showError( &"An error occurred, please report to {link}", cfg) error BadClientError: echo error.exc.name, ": ", error.exc.msg resp Http500, showError("Network error occurred, please try again.", cfg) error RateLimitError: resp Http429, showError( &"Instance has been rate limited.", cfg) error NoSessionsError: resp Http429, showError( &"Instance has no auth tokens, or is fully rate limited.", cfg) extend rss, "" extend status, "" extend search, "" extend timeline, "" extend media, "" extend list, "" extend preferences, "" extend resolver, "" extend embed, "" extend debug, "" extend unsupported, ""