diff --git a/locales/en-US.json b/locales/en-US.json index 9a7ac3cf..93c99e81 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -503,5 +503,6 @@ "carousel_skip": "Skip the Carousel", "carousel_go_to": "Go to slide `x`", "video_badges_members_only": "Members only", + "video_badges_members_first": "Members first", "preferences_exclude_members_only_videos_label": "Hide channel member-only videos" } diff --git a/src/invidious/helpers/serialized_yt_data.cr b/src/invidious/helpers/serialized_yt_data.cr index 69dc91d6..0cdbcd1b 100644 --- a/src/invidious/helpers/serialized_yt_data.cr +++ b/src/invidious/helpers/serialized_yt_data.cr @@ -10,6 +10,7 @@ enum VideoBadges VR360 ClosedCaptions MembersOnly + MembersFirst end struct SearchVideo @@ -152,6 +153,13 @@ struct SearchVideo def upcoming? premiere_timestamp ? true : false end + + # Shorthand to check whether the video is restricted to only channel members + # + # Whether as an early access video ("members first") or only for members ("members only") + def restricted_to_members? + return badges.members_only? || badges.members_first? + end end struct SearchPlaylistVideo diff --git a/src/invidious/views/components/item.ecr b/src/invidious/views/components/item.ecr index 59282165..91154af7 100644 --- a/src/invidious/views/components/item.ecr +++ b/src/invidious/views/components/item.ecr @@ -208,6 +208,9 @@ <% if item.badges.members_only? %> <%=translate(locale, "video_badges_members_only")%> <% end %> + <% if item.badges.members_first? %> + <%=translate(locale, "video_badges_members_first")%> + <% end %> <%end%> <% end %> diff --git a/src/invidious/views/components/items_paginated.ecr b/src/invidious/views/components/items_paginated.ecr index 1863b7d4..02b47be1 100644 --- a/src/invidious/views/components/items_paginated.ecr +++ b/src/invidious/views/components/items_paginated.ecr @@ -3,8 +3,7 @@
<%- items.each do |item| -%> - <% next if exclude_members_only_videos && item.responds_to?(:badges) && - item.is_a? SearchVideo && item.badges.members_only? %> + <% next if exclude_members_only_videos && item.responds_to?(:restricted_to_members?) && item.restricted_to_members? %> <%= rendered "components/item" %> <%- end -%>
diff --git a/src/invidious/yt_backend/extractors.cr b/src/invidious/yt_backend/extractors.cr index c0994ffb..76b5a8ad 100644 --- a/src/invidious/yt_backend/extractors.cr +++ b/src/invidious/yt_backend/extractors.cr @@ -136,9 +136,9 @@ private module Parsers # TODO: Potentially available as item_contents["topStandaloneBadge"]["metadataBadgeRenderer"] badges |= VideoBadges::Premium when "Members only" - # TODO: Identify based on style attribute instead of label - # It should be more resistant to Youtube changes. badges |= VideoBadges::MembersOnly + when "Members first" + badges |= VideoBadges::MembersFirst else nil # Ignore end end