Просмотр исходного кода

Add t.co and /cards link resolvers

For t.co links: https://t.co/.. -> nitter.net/t.co/..
For card links: https://cards.twitter.com/cards/.. -> nitter.net/cards/...
Zed 6 лет назад
Родитель
Сommit
1aa1487402
5 измененных файлов с 46 добавлено и 3 удалено
  1. 2 2
      src/api.nim
  2. 13 0
      src/api/resolver.nim
  3. 4 0
      src/formatters.nim
  4. 4 1
      src/nitter.nim
  5. 23 0
      src/routes/resolver.nim

+ 2 - 2
src/api.nim

@@ -1,2 +1,2 @@
-import api/[profile, timeline, tweet, search, media, list]
-export profile, timeline, tweet, search, media, list
+import api/[profile, timeline, tweet, search, media, list, resolver]
+export profile, timeline, tweet, search, media, list, resolver

+ 13 - 0
src/api/resolver.nim

@@ -0,0 +1,13 @@
+import asyncdispatch, httpclient
+
+import ".."/[formatters, types]
+
+proc resolve*(url: string; prefs: Prefs): Future[string] {.async.} =
+  let client = newAsyncHttpClient(maxRedirects=0)
+  try:
+    let resp = await client.request(url, $HttpHead)
+    result = resp.headers["location"].replaceUrl(prefs)
+  except:
+    discard
+  finally:
+    client.close()

+ 4 - 0
src/formatters.nim

@@ -9,6 +9,8 @@ from unicode import Rune, `$`
 const
   ytRegex = re"([A-z.]+\.)?youtu(be.com|.be)"
   twRegex = re"(www.|mobile.)?twitter.com"
+  cards = "https://cards.twitter.com/cards"
+  tco = "https://t.co"
   nbsp = $Rune(0x000A0)
 
 proc stripText*(text: string): string =
@@ -33,6 +35,8 @@ proc replaceUrl*(url: string; prefs: Prefs; absolute=""): string =
     result = result.replace(ytRegex, prefs.replaceYouTube)
   if prefs.replaceTwitter.len > 0:
     result = result.replace(twRegex, prefs.replaceTwitter)
+    result = result.replace(tco, "https://" & prefs.replaceTwitter & "/t.co")
+    result = result.replace(cards, "https://" & prefs.replaceTwitter & "/cards")
   if absolute.len > 0:
     result = result.replace("href=\"/", "href=\"https://" & absolute & "/")
 

+ 4 - 1
src/nitter.nim

@@ -6,7 +6,8 @@ import jester
 import types, config, prefs, formatters
 import views/[general, about]
 import routes/[
-  preferences, timeline, status, media, search, rss, list, unsupported, embed]
+  preferences, timeline, status, media, search, rss, list,
+  unsupported, embed, resolver]
 
 const configPath {.strdefine.} = "./nitter.conf"
 let cfg = getConfig(configPath)
@@ -14,6 +15,7 @@ let cfg = getConfig(configPath)
 setHmacKey(cfg.hmacKey)
 
 createUnsupportedRouter(cfg)
+createResolverRouter(cfg)
 createPrefRouter(cfg)
 createTimelineRouter(cfg)
 createListRouter(cfg)
@@ -51,6 +53,7 @@ routes:
 
   extend unsupported, ""
   extend preferences, ""
+  extend resolver, ""
   extend rss, ""
   extend search, ""
   extend timeline, ""

+ 23 - 0
src/routes/resolver.nim

@@ -0,0 +1,23 @@
+import strutils
+
+import jester
+
+import router_utils
+import ".."/[query, types, api, agents]
+import ../views/general
+
+template respResolved*(url, kind: string): untyped =
+  if url.len == 0:
+    resp showError("Invalid $1 link" % kind, cfg)
+  else:
+    redirect(url)
+
+proc createResolverRouter*(cfg: Config) =
+  router resolver:
+    get "/cards/@card/@id":
+      let url = "https://cards.twitter.com/cards/$1/$2" % [@"card", @"id"]
+      respResolved(await resolve(url, cookiePrefs()), "card")
+
+    get "/t.co/@url":
+      let url = "https://t.co/" & @"url"
+      respResolved(await resolve(url, cookiePrefs()), "t.co")