Skip to content

Commit

Permalink
use largest resolution mp4 video available
Browse files Browse the repository at this point in the history
  • Loading branch information
girst committed May 18, 2022
1 parent 0633ec2 commit e2b8e17
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 5 deletions.
9 changes: 7 additions & 2 deletions src/parser.nim
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,15 @@ proc parseVideo(js: JsonNode): Video =
result.description = description.getStr

for v in js{"video_info", "variants"}:
let
contentType = parseEnum[VideoType](v{"content_type"}.getStr("summary"))
url = v{"url"}.getStr
resolution = getMp4Resolution(url) # only available if contentType == mp4
result.variants.add VideoVariant(
contentType: parseEnum[VideoType](v{"content_type"}.getStr("summary")),
contentType: contentType,
bitrate: v{"bitrate"}.getInt,
url: v{"url"}.getStr
url: url,
resolution: resolution
)

proc parsePromoVideo(js: JsonNode): Video =
Expand Down
15 changes: 15 additions & 0 deletions src/parserutils.nim
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,21 @@ proc getSource*(js: JsonNode): string =
let src = js{"source"}.getStr
result = src.substr(src.find('>') + 1, src.rfind('<') - 1)

proc getMp4Resolution*(url: string): int =
# parses the height out of a URL like this one:
# https://video.twimg.com/ext_tw_video/<tweet-id>/pu/vid/720x1280/<random>.mp4
const vidSep = "/vid/"
let
vidIdx = url.find(vidSep) + vidSep.len
resIdx = url.find('x', vidIdx) + 1
res = url[resIdx ..< url.find("/", resIdx)]

try:
return parseInt(res)
except ValueError:
# cannot determine resolution (e.g. m3u8/non-mp4 video)
return 0

proc extractSlice(js: JsonNode): Slice[int] =
result = js["indices"][0].getInt ..< js["indices"][1].getInt

Expand Down
1 change: 1 addition & 0 deletions src/types.nim
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ type
contentType*: VideoType
url*: string
bitrate*: int
resolution*: int

Video* = object
durationMs*: int
Expand Down
9 changes: 6 additions & 3 deletions src/views/tweet.nim
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# SPDX-License-Identifier: AGPL-3.0-only
import strutils, sequtils, strformat, options
import strutils, sequtils, strformat, options, algorithm
import karax/[karaxdsl, vdom, vstyles]
from jester import Request

Expand Down Expand Up @@ -105,8 +105,11 @@ proc renderVideo*(video: Video; prefs: Prefs; path: string): VNode =
img(src=thumb)
renderVideoDisabled(video, path)
else:
let vid = video.variants.filterIt(it.contentType == playbackType)
let source = if prefs.proxyVideos: getVidUrl(vid[0].url) else: vid[0].url
let
vars = video.variants.filterIt(it.contentType == playbackType)
vidUrl = vars.sortedByIt(it.resolution)[^1].url
source = if prefs.proxyVideos: getVidUrl(vidUrl)
else: vidUrl
case playbackType
of mp4:
if prefs.muteVideos:
Expand Down

0 comments on commit e2b8e17

Please sign in to comment.