From 5e2d126aea5b225e4dd9ee2b9c2d69d01e894612 Mon Sep 17 00:00:00 2001 From: Cynthia Foxwell Date: Tue, 11 Feb 2025 14:04:53 -0700 Subject: [PATCH] no more redis --- public/md/about.md | 1 + src/nitter.nim | 12 ++++++------ src/routes/home.nim | 4 ++-- src/routes/list.nim | 16 ++++++++++++---- src/routes/timeline.nim | 23 ++++++++++++++++++----- src/views/general.nim | 14 +++++++------- 6 files changed, 46 insertions(+), 24 deletions(-) diff --git a/public/md/about.md b/public/md/about.md index dc51697..1bcb949 100644 --- a/public/md/about.md +++ b/public/md/about.md @@ -28,6 +28,7 @@ maintained by the community. * Image zooming/carousel (requires JavaScript) * Up to date Twitter features, e.g. Community Notes * Embeds for chat services on-par with services like [FxTwitter](https://github.com/FixTweet/FxTwitter) and [vxTwitter](https://github.com/dylanpdx/BetterTwitFix) +* No dependency on Redis, as it has caused ratelimiting issues, but also forcably disables RSS ## Why use Nitter? diff --git a/src/nitter.nim b/src/nitter.nim index d3901ae..a299280 100644 --- a/src/nitter.nim +++ b/src/nitter.nim @@ -9,7 +9,7 @@ import jester import types, config, prefs, formatters, redis_cache, http_pool import views/[general, about] import routes/[ - preferences, timeline, status, media, search, rss, list, #debug, + preferences, timeline, status, media, search, list, #rss, debug, unsupported, embed, resolver, router_utils, home, follow, twitter_api] const instancesUrl = "https://github.com/zedeus/nitter/wiki/Instances" @@ -35,9 +35,9 @@ setMaxHttpConns(cfg.httpMaxConns) setHttpProxy(cfg.proxy, cfg.proxyAuth) initAboutPage(cfg.staticDir) -waitFor initRedisPool(cfg) -stdout.write &"Connected to Redis at {cfg.redisHost}:{cfg.redisPort}\n" -stdout.flushFile +#waitFor initRedisPool(cfg) +#stdout.write &"Connected to Redis at {cfg.redisHost}:{cfg.redisPort}\n" +#stdout.flushFile createUnsupportedRouter(cfg) createResolverRouter(cfg) @@ -48,7 +48,7 @@ createStatusRouter(cfg) createSearchRouter(cfg) createMediaRouter(cfg) createEmbedRouter(cfg) -createRssRouter(cfg) +#createRssRouter(cfg) #createDebugRouter(cfg) createTwitterApiRouter(cfg) @@ -93,7 +93,7 @@ routes: extend home, "" extend follow, "" - extend rss, "" + #extend rss, "" extend status, "" extend search, "" extend timeline, "" diff --git a/src/routes/home.nim b/src/routes/home.nim index dcdbb5e..43ff4e7 100644 --- a/src/routes/home.nim +++ b/src/routes/home.nim @@ -1,6 +1,6 @@ import jester import asyncdispatch, strutils, options, router_utils, timeline -import ".."/[prefs, types, utils, redis_cache] +import ".."/[prefs, types, utils] import ../views/[general, home, search] export home @@ -43,7 +43,7 @@ proc createHomeRouter*(cfg: Config) = query.kind = userList for name in names: - let prof = await getCachedUser(name) + let prof = await getGraphUser(name) profs &= @[prof] resp renderMain(renderFollowing(query, profs, prefs), request, cfg, prefs) diff --git a/src/routes/list.nim b/src/routes/list.nim index ac3e97e..0bd7305 100644 --- a/src/routes/list.nim +++ b/src/routes/list.nim @@ -4,7 +4,7 @@ import strutils, strformat, uri import jester import router_utils -import ".."/[types, redis_cache, api] +import ".."/[types, api] import ../views/[general, timeline, list] template respList*(list, timeline, title, vnode: typed) = @@ -20,6 +20,14 @@ template respList*(list, timeline, title, vnode: typed) = proc title*(list: List): string = &"@{list.username}/{list.name}" + +proc getList*(username=""; slug=""; id=""): Future[List] {.async.} = + if id.len > 0: + result = await getGraphList(id) + else: + result = await getGraphListBySlug(username, slug) + + proc createListRouter*(cfg: Config) = router list: get "/@name/lists/@slug/?": @@ -28,7 +36,7 @@ proc createListRouter*(cfg: Config) = cond @"slug" != "memberships" let slug = decodeUrl(@"slug") - list = await getCachedList(@"name", slug) + list = await getList(@"name", slug) if list.id.len == 0: resp Http404, showError(&"""List "{@"slug"}" not found""", cfg) redirect(&"/i/lists/{list.id}") @@ -37,7 +45,7 @@ proc createListRouter*(cfg: Config) = cond '.' notin @"id" let prefs = cookiePrefs() - list = await getCachedList(id=(@"id")) + list = await getList(id=(@"id")) timeline = await getGraphListTweets(list.id, getCursor()) vnode = renderTimelineTweets(timeline, prefs, request.path) respList(list, timeline, list.title, vnode) @@ -46,6 +54,6 @@ proc createListRouter*(cfg: Config) = cond '.' notin @"id" let prefs = cookiePrefs() - list = await getCachedList(id=(@"id")) + list = await getList(id=(@"id")) members = await getGraphListMembers(list, getCursor()) respList(list, members, list.title, renderTimelineUsers(members, prefs, request.path)) diff --git a/src/routes/timeline.nim b/src/routes/timeline.nim index 96e61a5..70fd199 100644 --- a/src/routes/timeline.nim +++ b/src/routes/timeline.nim @@ -3,13 +3,13 @@ import asyncdispatch, strutils, sequtils, uri, options, times import jester, karax/vdom import router_utils -import ".."/[types, redis_cache, formatters, query, api] +import ".."/[types, formatters, query, api] import ../views/[general, profile, timeline, status, search] export vdom export uri, sequtils export router_utils -export redis_cache, formatters, query, api +export formatters, query, api export profile, timeline, status proc getQuery*(request: Request; tab, name: string): Query = @@ -28,6 +28,19 @@ template skipIf[T](cond: bool; default; body: Future[T]): Future[T] = else: body +proc getUserId(username: string): Future[string] {.async.} = + let user = await getGraphUser(username) + if user.suspended: + return "suspended" + else: + return user.id + + +proc getUsername*(userId: string): Future[string] {.async.} = + let user = await getGraphUserById(userId) + result = user.username + + proc fetchProfile*(after: string; query: Query; cfg: Config; skipRail=false; skipPinned=false): Future[Profile] {.async.} = let @@ -48,9 +61,9 @@ proc fetchProfile*(after: string; query: Query; cfg: Config; skipRail=false; let rail = skipIf(skipRail or query.kind == media, @[]): - getCachedPhotoRail(name) + getPhotoRail(name) - user = getCachedUser(name) + user = getGraphUser(name) result = case query.kind @@ -94,7 +107,7 @@ template respTimeline*(timeline: typed) = template respUserId*() = cond @"user_id".len > 0 - let username = await getCachedUsername(@"user_id") + let username = await getUsername(@"user_id") if username.len > 0: redirect("/" & username) else: diff --git a/src/views/general.nim b/src/views/general.nim index 13e85c6..576cf87 100644 --- a/src/views/general.nim +++ b/src/views/general.nim @@ -29,8 +29,8 @@ proc renderNavbar(cfg: Config; req: Request; rss, canonical: string): VNode = tdiv(class="nav-item right"): icon "search", title="Search", href="/search" - if cfg.enableRss and rss.len > 0: - icon "rss-feed", title="RSS Feed", href=rss + #if cfg.enableRss and rss.len > 0: + #icon "rss-feed", title="RSS Feed", href=rss icon "bird", title="Open in Twitter", href=canonical a(href="https://liberapay.com/zedeus"): verbatim lp icon "info", title="About", href="/about" @@ -46,7 +46,7 @@ proc renderHead*(prefs: Prefs; cfg: Config; req: Request; titleText=""; desc=""; let ogType = if video.len > 0: "video.other" - elif rss.len > 0: "object" + #elif rss.len > 0: "object" elif images.len > 0: "photo" else: "article" @@ -73,8 +73,8 @@ proc renderHead*(prefs: Prefs; cfg: Config; req: Request; titleText=""; desc=""; if canonical.len > 0: link(rel="canonical", href=canonical) - if cfg.enableRss and rss.len > 0: - link(rel="alternate", type="application/rss+xml", href=rss, title="RSS feed") + #if cfg.enableRss and rss.len > 0: + #link(rel="alternate", type="application/rss+xml", href=rss, title="RSS feed") if prefs.hlsPlayback: script(src="/js/hls.light.min.js", `defer`="") @@ -128,8 +128,8 @@ proc renderHead*(prefs: Prefs; cfg: Config; req: Request; titleText=""; desc=""; meta(property="og:image", content=image) if video.len == 0: meta(property="twitter:image:src", content=image) - if rss.len > 0: - meta(property="twitter:card", content="summary") + #if rss.len > 0: + #meta(property="twitter:card", content="summary") elif video.len == 0: meta(property="twitter:card", content="summary_large_image") elif avatar.len > 0: