support new comments data with onResponseReceivedEndpoints

This commit is contained in:
Emilien Devos 2021-07-15 21:44:26 +02:00 committed by Samantaz Fox
parent 8452a4cd66
commit 80f7b11d76
No known key found for this signature in database
GPG Key ID: F42821059186176E

View File

@ -71,18 +71,38 @@ def fetch_youtube_comments(id, cursor, format, locale, thin_mode, region, sort_b
client_config = YoutubeAPI::ClientConfig.new(region: region)
response = YoutubeAPI.next(continuation: ctoken, client_config: client_config)
if !response["continuationContents"]?
if response["continuationContents"]?
response = response["continuationContents"]
if response["commentRepliesContinuation"]?
body = response["commentRepliesContinuation"]
else
body = response["itemSectionContinuation"]
end
contents = body["contents"]?
header = body["header"]?
if body["continuations"]?
moreRepliesContinuation = body["continuations"][0]["nextContinuationData"]["continuation"].as_s
end
elsif response["onResponseReceivedEndpoints"]?
onResponseReceivedEndpoints = response["onResponseReceivedEndpoints"]
onResponseReceivedEndpoints.as_a.each do |item|
case item["reloadContinuationItemsCommand"]["slot"]
when "RELOAD_CONTINUATION_SLOT_HEADER"
header = item["reloadContinuationItemsCommand"]["continuationItems"][0]
when "RELOAD_CONTINUATION_SLOT_BODY"
contents = item["reloadContinuationItemsCommand"]["continuationItems"]
contents.as_a.reject! do |item|
if item["continuationItemRenderer"]?
moreRepliesContinuation = item["continuationItemRenderer"]["continuationEndpoint"]["continuationCommand"]["token"].as_s
true
end
end
end
end
else
raise InfoException.new("Could not fetch comments")
end
response = response["continuationContents"]
if response["commentRepliesContinuation"]?
body = response["commentRepliesContinuation"]
else
body = response["itemSectionContinuation"]
end
contents = body["contents"]?
if !contents
if format == "json"
return {"comments" => [] of String}.to_json
@ -93,11 +113,10 @@ def fetch_youtube_comments(id, cursor, format, locale, thin_mode, region, sort_b
response = JSON.build do |json|
json.object do
if body["header"]?
count_text = body["header"]["commentsHeaderRenderer"]["countText"]
if header
count_text = header["commentsHeaderRenderer"]["countText"]
comment_count = (count_text["simpleText"]? || count_text["runs"]?.try &.[0]?.try &.["text"]?)
.try &.as_s.gsub(/\D/, "").to_i? || 0
json.field "commentCount", comment_count
end
@ -186,7 +205,11 @@ def fetch_youtube_comments(id, cursor, format, locale, thin_mode, region, sort_b
reply_count = 1
end
continuation = node_replies["continuations"]?.try &.as_a[0]["nextContinuationData"]["continuation"].as_s
if node_replies["continuations"]?
continuation = node_replies["continuations"]?.try &.as_a[0]["nextContinuationData"]["continuation"].as_s
elsif node_replies["contents"]?
continuation = node_replies["contents"]?.try &.as_a[0]["continuationItemRenderer"]["continuationEndpoint"]["continuationCommand"]["token"].as_s
end
continuation ||= ""
json.field "replies" do
@ -201,9 +224,8 @@ def fetch_youtube_comments(id, cursor, format, locale, thin_mode, region, sort_b
end
end
if body["continuations"]?
continuation = body["continuations"][0]["nextContinuationData"]["continuation"].as_s
json.field "continuation", continuation
if moreRepliesContinuation
json.field "continuation", moreRepliesContinuation
end
end
end