mirror of
https://github.com/iv-org/invidious.git
synced 2026-09-07 09:33:04 -05:00
fix: link multi-creator related videos
This commit is contained in:
parent
0460189a92
commit
313bfa15a4
101
spec/invidious/videos/related_videos_extract_spec.cr
Normal file
101
spec/invidious/videos/related_videos_extract_spec.cr
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
require "../../parsers_helper.cr"
|
||||||
|
|
||||||
|
Spectator.describe "parse_related_video" do
|
||||||
|
it "uses a directly linked channel ID" do
|
||||||
|
related = JSON.parse(<<-JSON)
|
||||||
|
{
|
||||||
|
"videoId": "video-id",
|
||||||
|
"title": {"simpleText": "Video title"},
|
||||||
|
"shortBylineText": {
|
||||||
|
"runs": [{
|
||||||
|
"text": "Channel name",
|
||||||
|
"navigationEndpoint": {
|
||||||
|
"browseEndpoint": {"browseId": "UC-direct"}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSON
|
||||||
|
|
||||||
|
video = Invidious::Videos::Parser.parse_related_video(related).not_nil!
|
||||||
|
|
||||||
|
expect(video["author"]).to eq("Channel name")
|
||||||
|
expect(video["ucid"]).to eq("UC-direct")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "links a collaboration byline to the first listed collaborator" do
|
||||||
|
related = JSON.parse(<<-JSON)
|
||||||
|
{
|
||||||
|
"videoId": "collaboration-id",
|
||||||
|
"title": {"simpleText": "Collaboration"},
|
||||||
|
"shortBylineText": {
|
||||||
|
"runs": [{
|
||||||
|
"text": "First Channel and Second Channel",
|
||||||
|
"navigationEndpoint": {
|
||||||
|
"showDialogCommand": {
|
||||||
|
"panelLoadingStrategy": {
|
||||||
|
"inlineContent": {
|
||||||
|
"dialogViewModel": {
|
||||||
|
"customContent": {
|
||||||
|
"listViewModel": {
|
||||||
|
"listItems": [
|
||||||
|
{
|
||||||
|
"listItemViewModel": {
|
||||||
|
"rendererContext": {
|
||||||
|
"commandContext": {
|
||||||
|
"onTap": {
|
||||||
|
"innertubeCommand": {
|
||||||
|
"browseEndpoint": {"browseId": "UC-first"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"listItemViewModel": {
|
||||||
|
"rendererContext": {
|
||||||
|
"commandContext": {
|
||||||
|
"onTap": {
|
||||||
|
"innertubeCommand": {
|
||||||
|
"browseEndpoint": {"browseId": "UC-second"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSON
|
||||||
|
|
||||||
|
video = Invidious::Videos::Parser.parse_related_video(related).not_nil!
|
||||||
|
|
||||||
|
expect(video["author"]).to eq("First Channel and Second Channel")
|
||||||
|
expect(video["ucid"]).to eq("UC-first")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "keeps the channel ID empty when no destination is available" do
|
||||||
|
related = JSON.parse(<<-JSON)
|
||||||
|
{
|
||||||
|
"videoId": "unlinked-id",
|
||||||
|
"title": {"simpleText": "Unlinked video"},
|
||||||
|
"shortBylineText": {"runs": [{"text": "Unlinked author"}]}
|
||||||
|
}
|
||||||
|
JSON
|
||||||
|
|
||||||
|
video = Invidious::Videos::Parser.parse_related_video(related).not_nil!
|
||||||
|
|
||||||
|
expect(video["author"]).to eq("Unlinked author")
|
||||||
|
expect(video["ucid"]).to eq("")
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -28,6 +28,18 @@ module Invidious::Videos::Parser
|
|||||||
|
|
||||||
ucid = channel_info.try { |ci| HelperExtractors.get_browse_id(ci) }
|
ucid = channel_info.try { |ci| HelperExtractors.get_browse_id(ci) }
|
||||||
|
|
||||||
|
# Collaborations use a dialog command instead of linking the combined
|
||||||
|
# byline directly to a channel. Use the first listed collaborator as the
|
||||||
|
# destination while preserving YouTube's combined author label.
|
||||||
|
if ucid.try &.empty?
|
||||||
|
ucid = channel_info.try &.dig?(
|
||||||
|
"navigationEndpoint", "showDialogCommand", "panelLoadingStrategy",
|
||||||
|
"inlineContent", "dialogViewModel", "customContent", "listViewModel",
|
||||||
|
"listItems", 0, "listItemViewModel", "rendererContext", "commandContext",
|
||||||
|
"onTap", "innertubeCommand", "browseEndpoint", "browseId"
|
||||||
|
).try &.as_s
|
||||||
|
end
|
||||||
|
|
||||||
short_view_count = related.try do |r|
|
short_view_count = related.try do |r|
|
||||||
HelperExtractors.get_short_view_count(r).to_s
|
HelperExtractors.get_short_view_count(r).to_s
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user