feat: add AI made indicator for videos that have the AI badge (#6113)

* feat: add AI made indicator for videos that have the AI badge

* forgot to add the api endpoint!

* bump schema version, since aiMade was added
This commit is contained in:
Fijxu
2026-11-04 21:29:37 -03:00
committed by GitHub
parent 863a07b14a
commit 79761abc94
5 changed files with 15 additions and 2 deletions

View File

@@ -507,5 +507,6 @@
"timeline_parse_error_placeholder_heading": "Unable to parse item",
"timeline_parse_error_placeholder_message": "Invidious encountered an error while trying to parse this item. For more information see below:",
"timeline_parse_error_show_technical_details": "Show technical details",
"dmca_content": "This video cannot be downloaded on this instance due to a DMCA/copyright infringement letter sent to the instance administrator."
"dmca_content": "This video cannot be downloaded on this instance due to a DMCA/copyright infringement letter sent to the instance administrator.",
"video_details_ai_made": "AI Made video?:"
}

View File

@@ -64,6 +64,7 @@ module Invidious::JSONify::APIv1
json.field "liveNow", video.live_now
json.field "isPostLiveDvr", video.post_live_dvr
json.field "isUpcoming", video.upcoming?
json.field "aiMade", video.ai_made
if video.premiere_timestamp
json.field "premiereTimestamp", video.premiere_timestamp.try &.to_unix

View File

@@ -234,6 +234,10 @@ module Invidious::Videos::Parser
keywords = video_details["keywords"]?
.try &.as_a.map &.as_s || [] of String
ai_made = video_primary_renderer
.try &.dig?("badges")
.try { |badges| badges.as_a.any? { |badge| badge.dig?("metadataBadgeRenderer", "label").try(&.as_s) == "AI" } } || false
# Related videos
LOGGER.debug("extract_video_info: parsing related videos...")
@@ -454,6 +458,7 @@ module Invidious::Videos::Parser
"authorThumbnail" => JSON::Any.new(author_thumbnail.try &.as_s || ""),
"authorVerified" => JSON::Any.new(author_verified || false),
"subCountText" => JSON::Any.new(subs_text || "-"),
"aiMade" => JSON::Any.new(ai_made),
}
return params

View File

@@ -15,7 +15,7 @@ struct Video
# NOTE: don't forget to bump this number if any change is made to
# the `params` structure in videos/parser.cr!!!
#
SCHEMA_VERSION = 3
SCHEMA_VERSION = 4
property id : String
@@ -297,6 +297,7 @@ struct Video
getset_bool authorVerified
getset_bool isFamilyFriendly
getset_bool isListed
getset_bool aiMade
predicate_bool upcoming, isUpcoming
end

View File

@@ -202,6 +202,11 @@ we're going to need to do it here in order to allow for translations.
<p id="views"><i class="icon ion-ios-eye"></i> <%= number_with_separator(video.views) %></p>
<p id="likes"><i class="icon ion-ios-thumbs-up"></i> <%= number_with_separator(video.likes) %></p>
<p id="dislikes" style="display: none; visibility: hidden;"></p>
<% if video.ai_made %>
<p id="ai_made"><%= I18n.translate(locale, "video_details_ai_made") %>
<%= I18n.translate_bool(locale, video.ai_made) %>
</p>
<% end %>
<p id="genre"><%= I18n.translate(locale, "Genre: ") %>
<% if !video.genre_url %>
<%= video.genre %>