Strip https://pbs.twimg.com from image urls
This commit is contained in:
		
							parent
							
								
									ea7222bc86
								
							
						
					
					
						commit
						47c87f7068
					
				| 
						 | 
					@ -10,7 +10,7 @@ proc parseProfile(js: JsonNode; id=""): Profile =
 | 
				
			||||||
    fullname: js{"name"}.getStr,
 | 
					    fullname: js{"name"}.getStr,
 | 
				
			||||||
    location: js{"location"}.getStr,
 | 
					    location: js{"location"}.getStr,
 | 
				
			||||||
    bio: js{"description"}.getStr,
 | 
					    bio: js{"description"}.getStr,
 | 
				
			||||||
    userpic: js{"profile_image_url_https"}.getStr.replace("_normal", ""),
 | 
					    userpic: js{"profile_image_url_https"}.getImageStr.replace("_normal", ""),
 | 
				
			||||||
    banner: js.getBanner,
 | 
					    banner: js.getBanner,
 | 
				
			||||||
    following: $js{"friends_count"}.getInt,
 | 
					    following: $js{"friends_count"}.getInt,
 | 
				
			||||||
    followers: $js{"followers_count"}.getInt,
 | 
					    followers: $js{"followers_count"}.getInt,
 | 
				
			||||||
| 
						 | 
					@ -62,7 +62,7 @@ proc parseGraphList*(js: JsonNode): List =
 | 
				
			||||||
    userId: list{"user", "legacy", "id_str"}.getStr,
 | 
					    userId: list{"user", "legacy", "id_str"}.getStr,
 | 
				
			||||||
    description: list{"description"}.getStr,
 | 
					    description: list{"description"}.getStr,
 | 
				
			||||||
    members: list{"member_count"}.getInt,
 | 
					    members: list{"member_count"}.getInt,
 | 
				
			||||||
    banner: list{"custom_banner_media", "media_info", "url"}.getStr
 | 
					    banner: list{"custom_banner_media", "media_info", "url"}.getImageStr
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
proc parseListMembers*(js: JsonNode; cursor: string): Result[Profile] =
 | 
					proc parseListMembers*(js: JsonNode; cursor: string): Result[Profile] =
 | 
				
			||||||
| 
						 | 
					@ -100,15 +100,15 @@ proc parsePoll(js: JsonNode): Poll =
 | 
				
			||||||
  result.votes = result.values.sum
 | 
					  result.votes = result.values.sum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
proc parseGif(js: JsonNode): Gif =
 | 
					proc parseGif(js: JsonNode): Gif =
 | 
				
			||||||
  Gif(
 | 
					  result = Gif(
 | 
				
			||||||
    url: js{"video_info", "variants"}[0]{"url"}.getStr,
 | 
					    url: js{"video_info", "variants"}[0]{"url"}.getImageStr,
 | 
				
			||||||
    thumb: js{"media_url_https"}.getStr
 | 
					    thumb: js{"media_url_https"}.getImageStr
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
proc parseVideo(js: JsonNode): Video =
 | 
					proc parseVideo(js: JsonNode): Video =
 | 
				
			||||||
  result = Video(
 | 
					  result = Video(
 | 
				
			||||||
    videoId: js{"id_str"}.getStr,
 | 
					    videoId: js{"id_str"}.getStr,
 | 
				
			||||||
    thumb: js{"media_url_https"}.getStr,
 | 
					    thumb: js{"media_url_https"}.getImageStr,
 | 
				
			||||||
    views: js{"ext", "mediaStats", "r", "ok", "viewCount"}.getStr,
 | 
					    views: js{"ext", "mediaStats", "r", "ok", "viewCount"}.getStr,
 | 
				
			||||||
    available: js{"ext_media_availability", "status"}.getStr == "available",
 | 
					    available: js{"ext_media_availability", "status"}.getStr == "available",
 | 
				
			||||||
    title: js{"ext_alt_text"}.getStr,
 | 
					    title: js{"ext_alt_text"}.getStr,
 | 
				
			||||||
| 
						 | 
					@ -249,7 +249,7 @@ proc parseTweet(js: JsonNode): Tweet =
 | 
				
			||||||
    for m in jsMedia:
 | 
					    for m in jsMedia:
 | 
				
			||||||
      case m{"type"}.getStr
 | 
					      case m{"type"}.getStr
 | 
				
			||||||
      of "photo":
 | 
					      of "photo":
 | 
				
			||||||
        result.photos.add m{"media_url_https"}.getStr
 | 
					        result.photos.add m{"media_url_https"}.getImageStr
 | 
				
			||||||
      of "video":
 | 
					      of "video":
 | 
				
			||||||
        result.video = some(parseVideo(m))
 | 
					        result.video = some(parseVideo(m))
 | 
				
			||||||
      of "animated_gif":
 | 
					      of "animated_gif":
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
import strutils, times, macros, htmlgen, uri, unicode, options
 | 
					import strutils, times, macros, htmlgen, unicode, options
 | 
				
			||||||
import regex, packedjson
 | 
					import regex, packedjson
 | 
				
			||||||
import types, utils, formatters
 | 
					import types, utils, formatters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,8 +58,13 @@ proc getId*(js: JsonNode): int64 {.inline.} =
 | 
				
			||||||
template getStrVal*(js: JsonNode; default=""): string =
 | 
					template getStrVal*(js: JsonNode; default=""): string =
 | 
				
			||||||
  js{"string_value"}.getStr(default)
 | 
					  js{"string_value"}.getStr(default)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template getImageVal*(js: JsonNode; default=""): string =
 | 
					proc getImageStr*(js: JsonNode): string =
 | 
				
			||||||
  js{"image_value", "url"}.getStr(default)
 | 
					  result = js.getStr
 | 
				
			||||||
 | 
					  result.removePrefix(https)
 | 
				
			||||||
 | 
					  result.removePrefix(twimg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template getImageVal*(js: JsonNode): string =
 | 
				
			||||||
 | 
					  js{"image_value", "url"}.getImageStr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
proc getCardUrl*(js: JsonNode; kind: CardKind): string =
 | 
					proc getCardUrl*(js: JsonNode; kind: CardKind): string =
 | 
				
			||||||
  result = js{"website_url"}.getStrVal
 | 
					  result = js{"website_url"}.getStrVal
 | 
				
			||||||
| 
						 | 
					@ -81,7 +86,7 @@ proc getCardTitle*(js: JsonNode; kind: CardKind): string =
 | 
				
			||||||
    result = js{"event_category"}.getStrVal
 | 
					    result = js{"event_category"}.getStrVal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
proc getBanner*(js: JsonNode): string =
 | 
					proc getBanner*(js: JsonNode): string =
 | 
				
			||||||
  let url = js{"profile_banner_url"}.getStr
 | 
					  let url = js{"profile_banner_url"}.getImageStr
 | 
				
			||||||
  if url.len > 0:
 | 
					  if url.len > 0:
 | 
				
			||||||
    return url & "/1500x500"
 | 
					    return url & "/1500x500"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ import asynchttpserver, asyncstreams, asyncfile, asyncnet
 | 
				
			||||||
import jester, regex
 | 
					import jester, regex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import router_utils
 | 
					import router_utils
 | 
				
			||||||
import ".."/[types, formatters, agents]
 | 
					import ".."/[types, formatters, agents, utils]
 | 
				
			||||||
import ../views/general
 | 
					import ../views/general
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export asynchttpserver, asyncstreams, asyncfile, asyncnet
 | 
					export asynchttpserver, asyncstreams, asyncfile, asyncnet
 | 
				
			||||||
| 
						 | 
					@ -66,11 +66,14 @@ proc createMediaRouter*(cfg: Config) =
 | 
				
			||||||
      resp Http404
 | 
					      resp Http404
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    get "/pic/@url":
 | 
					    get "/pic/@url":
 | 
				
			||||||
      cond "http" in @"url"
 | 
					      var url = decodeUrl(@"url")
 | 
				
			||||||
      cond "twimg" in @"url"
 | 
					      if "twimg.com" notin url:
 | 
				
			||||||
 | 
					        url.insert(twimg)
 | 
				
			||||||
 | 
					      if not url.startsWith(https):
 | 
				
			||||||
 | 
					        url.insert(https)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      let uri = parseUri(decodeUrl(@"url"))
 | 
					      let uri = parseUri(url)
 | 
				
			||||||
      cond isTwitterUrl($uri) == true
 | 
					      cond isTwitterUrl(uri) == true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      enableRawMode()
 | 
					      enableRawMode()
 | 
				
			||||||
      let code = await proxyMedia(request, $uri)
 | 
					      let code = await proxyMedia(request, $uri)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,8 @@ import nimcrypto, regex
 | 
				
			||||||
var hmacKey = "secretkey"
 | 
					var hmacKey = "secretkey"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const
 | 
					const
 | 
				
			||||||
 | 
					  https* = "https://"
 | 
				
			||||||
 | 
					  twimg* = "pbs.twimg.com/"
 | 
				
			||||||
  badJpgExts = @["1500x500", "jpgn", "jpg:", "jpg_", "_jpg"]
 | 
					  badJpgExts = @["1500x500", "jpgn", "jpg:", "jpg_", "_jpg"]
 | 
				
			||||||
  badPngExts = @["pngn", "png:", "png_", "_png"]
 | 
					  badPngExts = @["pngn", "png:", "png_", "_png"]
 | 
				
			||||||
  twitterDomains = @[
 | 
					  twitterDomains = @[
 | 
				
			||||||
| 
						 | 
					@ -43,5 +45,8 @@ proc filterParams*(params: Table): seq[(string, string)] =
 | 
				
			||||||
  let filter = ["name", "id", "list", "referer", "scroll"]
 | 
					  let filter = ["name", "id", "list", "referer", "scroll"]
 | 
				
			||||||
  toSeq(params.pairs()).filterIt(it[0] notin filter and it[1].len > 0)
 | 
					  toSeq(params.pairs()).filterIt(it[0] notin filter and it[1].len > 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					proc isTwitterUrl*(uri: Uri): bool =
 | 
				
			||||||
 | 
					  uri.hostname in twitterDomains
 | 
				
			||||||
 | 
					
 | 
				
			||||||
proc isTwitterUrl*(url: string): bool =
 | 
					proc isTwitterUrl*(url: string): bool =
 | 
				
			||||||
  parseUri(url).hostname in twitterDomains
 | 
					  parseUri(url).hostname in twitterDomains
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,7 +107,7 @@ class CardTest(BaseTestCase):
 | 
				
			||||||
        card = Card(Conversation.main + " ")
 | 
					        card = Card(Conversation.main + " ")
 | 
				
			||||||
        self.assert_text(title, card.title)
 | 
					        self.assert_text(title, card.title)
 | 
				
			||||||
        self.assert_text(destination, card.destination)
 | 
					        self.assert_text(destination, card.destination)
 | 
				
			||||||
        self.assertIn('twimg', self.get_image_url(card.image + ' img'))
 | 
					        self.assertIn('_img', self.get_image_url(card.image + ' img'))
 | 
				
			||||||
        if len(description) > 0:
 | 
					        if len(description) > 0:
 | 
				
			||||||
            self.assert_text(description, card.description)
 | 
					            self.assert_text(description, card.description)
 | 
				
			||||||
        if large:
 | 
					        if large:
 | 
				
			||||||
| 
						 | 
					@ -130,7 +130,7 @@ class CardTest(BaseTestCase):
 | 
				
			||||||
        card = Card(Conversation.main + " ")
 | 
					        card = Card(Conversation.main + " ")
 | 
				
			||||||
        self.assert_text(title, card.title)
 | 
					        self.assert_text(title, card.title)
 | 
				
			||||||
        self.assert_text(destination, card.destination)
 | 
					        self.assert_text(destination, card.destination)
 | 
				
			||||||
        self.assertIn('twimg', self.get_image_url(card.image + ' img'))
 | 
					        self.assertIn('_img', self.get_image_url(card.image + ' img'))
 | 
				
			||||||
        self.assert_element_visible('.card-overlay')
 | 
					        self.assert_element_visible('.card-overlay')
 | 
				
			||||||
        if len(description) > 0:
 | 
					        if len(description) > 0:
 | 
				
			||||||
            self.assert_text(description, card.description)
 | 
					            self.assert_text(description, card.description)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue