|
|
@@ -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
|
|
|
|