From 84e53bfa61d55ba082dbb2254deda712a91130b8 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Fri, 22 May 2026 23:56:22 -0400 Subject: [PATCH] more robust metadata_parts parsing Videos that have two or more authors (in collaborations), have their author information in JSON Objects inside metadataParts, alongside with their view count and their published date, therefore, we need to iterate the metadataParts array and do some filtering based on the content of each JSON Object to find the view count and published date for some videos. Example: ```json "metadataParts": [ { "text": { "content": "Veritasium" }, "icon": { "name": "CHECK_CIRCLE_FILLED", "height": 14, "width": 14, "accessibilityLabel": "Verified" } }, { "text": { "content": "and Linus Tech Tips" }, "icon": { "name": "CHECK_CIRCLE_FILLED", "height": 14, "width": 14, "accessibilityLabel": "Verified" } }, { "text": { "content": "10M" }, "accessibilityLabel": "10 million views" }, { "text": { "content": "1y ago" } } ] ``` --- src/invidious/yt_backend/extractors.cr | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/invidious/yt_backend/extractors.cr b/src/invidious/yt_backend/extractors.cr index 2cf8f6e8..e188caa9 100644 --- a/src/invidious/yt_backend/extractors.cr +++ b/src/invidious/yt_backend/extractors.cr @@ -662,7 +662,12 @@ private module Parsers metadata = item_contents.dig("metadata", "lockupMetadataViewModel") title = metadata.dig("title", "content").as_s # Contains the views of the video and the published time of the video. - metadata_parts = metadata.dig("metadata", "contentMetadataViewModel", "metadataRows", 0, "metadataParts") + metadata_parts = metadata.dig("metadata", "contentMetadataViewModel", "metadataRows", 0, "metadataParts").try &.as_a + + view_count_text = metadata_parts.try &.find { |item| item["icon"]?.nil? && item.dig?("text", "content").try &.as_s.includes?("views") } + .try &.dig("text", "content").as_s + published = metadata_parts.try &.find { |item| item["icon"]?.nil? && item.dig?("text", "content").try &.as_s.includes?("ago") } + .try { |item| decode_date(item.dig("text", "content").as_s) } || Time.local view_count = short_text_to_number(view_count_text || "0")