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/...
This commit is contained in:
		
							parent
							
								
									d27ab68a90
								
							
						
					
					
						commit
						1aa1487402
					
				
					 5 changed files with 46 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -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
									
								
								src/api/resolver.nim
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/api/resolver.nim
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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()
 | 
			
		||||
| 
						 | 
				
			
			@ -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 & "/")
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
									
								
								src/routes/resolver.nim
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/routes/resolver.nim
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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")
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue