Add experimental support for unified_card

Closes #345
This commit is contained in:
Zed
2022-01-13 00:36:30 +01:00
parent 8a6fbe81ab
commit 111927a21c
7 changed files with 185 additions and 17 deletions

View File

@@ -1,8 +1,8 @@
# SPDX-License-Identifier: AGPL-3.0-only
import strutils, options, tables, times, math
import packedjson
import packedjson / deserialiser
import packedjson, packedjson/deserialiser
import types, parserutils, utils
import experimental/parser/unifiedcard
proc parseProfile(js: JsonNode; id=""): Profile =
if js.isNull: return
@@ -102,7 +102,6 @@ proc parseGif(js: JsonNode): Gif =
proc parseVideo(js: JsonNode): Video =
result = Video(
videoId: js{"id_str"}.getStr,
thumb: js{"media_url_https"}.getImageStr,
views: js{"ext", "mediaStats", "r", "ok", "viewCount"}.getStr,
available: js{"ext_media_availability", "status"}.getStr == "available",
@@ -119,7 +118,7 @@ proc parseVideo(js: JsonNode): Video =
for v in js{"video_info", "variants"}:
result.variants.add VideoVariant(
videoType: parseEnum[VideoType](v{"content_type"}.getStr("summary")),
contentType: parseEnum[VideoType](v{"content_type"}.getStr("summary")),
bitrate: v{"bitrate"}.getInt,
url: v{"url"}.getStr
)
@@ -129,19 +128,17 @@ proc parsePromoVideo(js: JsonNode): Video =
thumb: js{"player_image_large"}.getImageVal,
available: true,
durationMs: js{"content_duration_seconds"}.getStrVal("0").parseInt * 1000,
playbackType: vmap,
videoId: js{"player_content_id"}.getStrVal(js{"card_id"}.getStrVal(
js{"amplify_content_id"}.getStrVal())),
playbackType: vmap
)
var variant = VideoVariant(
videoType: vmap,
contentType: vmap,
url: js{"player_hls_url"}.getStrVal(js{"player_stream_url"}.getStrVal(
js{"amplify_url_vmap"}.getStrVal()))
)
if "m3u8" in variant.url:
variant.videoType = m3u8
variant.contentType = m3u8
result.playbackType = m3u8
result.variants.add variant
@@ -154,7 +151,7 @@ proc parseBroadcast(js: JsonNode): Card =
title: js{"broadcaster_display_name"}.getStrVal,
text: js{"broadcast_title"}.getStrVal,
image: image,
video: some Video(videoId: js{"broadcast_media_id"}.getStrVal, thumb: image)
video: some Video(thumb: image)
)
proc parseCard(js: JsonNode; urls: JsonNode): Card =
@@ -166,6 +163,9 @@ proc parseCard(js: JsonNode; urls: JsonNode): Card =
name = js{"name"}.getStr
kind = parseEnum[CardKind](name[(name.find(":") + 1) ..< name.len], unknown)
if kind == unified:
return parseUnifiedCard(vals{"unified_card", "string_value"}.getStr)
result = Card(
kind: kind,
url: vals.getCardUrl(kind),
@@ -190,7 +190,7 @@ proc parseCard(js: JsonNode; urls: JsonNode): Card =
result.url = vals{"player_url"}.getStrVal
if "youtube.com" in result.url:
result.url = result.url.replace("/embed/", "/watch?v=")
of audiospace, unified, unknown:
of audiospace, unknown:
result.title = "This card type is not supported."
else: discard