mirror of
https://github.com/iv-org/invidious.git
synced 2026-09-07 09:33:04 -05:00
Fix channel links for multi-creator related videos
This commit is contained in:
parent
7d93ccbd04
commit
55522a2426
74
spec/invidious/videos/related_video_parser_spec.cr
Normal file
74
spec/invidious/videos/related_video_parser_spec.cr
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
require "../../parsers_helper.cr"
|
||||||
|
|
||||||
|
Spectator.describe "parse_related_video" do
|
||||||
|
it "extracts a channel id from a multi-creator collaborator dialog" do
|
||||||
|
related = JSON.parse(<<-JSON)
|
||||||
|
{
|
||||||
|
"videoId": "dbVdnL6HWOg",
|
||||||
|
"title": {"simpleText": "Example video"},
|
||||||
|
"shortBylineText": {
|
||||||
|
"runs": [{
|
||||||
|
"text": "Piers Morgan Uncensored y ProfSteveKeen",
|
||||||
|
"navigationEndpoint": {
|
||||||
|
"showDialogCommand": {
|
||||||
|
"panelLoadingStrategy": {
|
||||||
|
"inlineContent": {
|
||||||
|
"dialogViewModel": {
|
||||||
|
"customContent": {
|
||||||
|
"listViewModel": {
|
||||||
|
"listItems": [{
|
||||||
|
"listItemViewModel": {
|
||||||
|
"rendererContext": {
|
||||||
|
"commandContext": {
|
||||||
|
"onTap": {
|
||||||
|
"innertubeCommand": {
|
||||||
|
"browseEndpoint": {
|
||||||
|
"browseId": "UCatt7TBjfBkiJWx8khav_Gg"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSON
|
||||||
|
|
||||||
|
parsed = Invidious::Videos::Parser.parse_related_video(related)
|
||||||
|
|
||||||
|
expect(parsed).to_not be_nil
|
||||||
|
expect(parsed.not_nil!["author"]).to eq("Piers Morgan Uncensored y ProfSteveKeen")
|
||||||
|
expect(parsed.not_nil!["ucid"]).to eq("UCatt7TBjfBkiJWx8khav_Gg")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "keeps extracting a direct channel id" do
|
||||||
|
related = JSON.parse(<<-JSON)
|
||||||
|
{
|
||||||
|
"videoId": "example",
|
||||||
|
"title": {"simpleText": "Example video"},
|
||||||
|
"shortBylineText": {
|
||||||
|
"runs": [{
|
||||||
|
"text": "Example channel",
|
||||||
|
"navigationEndpoint": {
|
||||||
|
"browseEndpoint": {"browseId": "UCexample"}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSON
|
||||||
|
|
||||||
|
parsed = Invidious::Videos::Parser.parse_related_video(related)
|
||||||
|
|
||||||
|
expect(parsed).to_not be_nil
|
||||||
|
expect(parsed.not_nil!["ucid"]).to eq("UCexample")
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1141,7 +1141,37 @@ module HelperExtractors
|
|||||||
# Retrieves the ID required for querying the InnerTube browse endpoint.
|
# Retrieves the ID required for querying the InnerTube browse endpoint.
|
||||||
# Returns an empty string when it's unable to do so
|
# Returns an empty string when it's unable to do so
|
||||||
def self.get_browse_id(container)
|
def self.get_browse_id(container)
|
||||||
return container.dig?("navigationEndpoint", "browseEndpoint", "browseId").try &.as_s || ""
|
if browse_id = container.dig?("navigationEndpoint", "browseEndpoint", "browseId").try &.as_s
|
||||||
|
return browse_id
|
||||||
|
end
|
||||||
|
|
||||||
|
find_browse_id(container) || ""
|
||||||
|
end
|
||||||
|
|
||||||
|
# YouTube wraps the channel links for videos with multiple creators in a
|
||||||
|
# collaborator dialog instead of putting a browse endpoint directly on the
|
||||||
|
# byline run. Search nested navigation data so those videos still get a
|
||||||
|
# usable channel link.
|
||||||
|
private def self.find_browse_id(container : JSON::Any) : String?
|
||||||
|
if browse_id = container.dig?("browseEndpoint", "browseId").try &.as_s
|
||||||
|
return browse_id
|
||||||
|
end
|
||||||
|
|
||||||
|
if object = container.as_h?
|
||||||
|
object.each_value do |value|
|
||||||
|
if browse_id = find_browse_id(value)
|
||||||
|
return browse_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elsif array = container.as_a?
|
||||||
|
array.each do |value|
|
||||||
|
if browse_id = find_browse_id(value)
|
||||||
|
return browse_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user