Compare commits

...

4 Commits

Author SHA1 Message Date
Fijxu
79761abc94 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
2026-11-04 21:29:37 -03:00
Fijxu
863a07b14a chore: Display a nice message when the config.yml file is missing (#6121) 2026-11-04 21:28:55 -03:00
Fijxu
44f4604af8 Prepare for next release 2026-11-03 04:16:16 -03:00
github-actions[bot]
619529aefd Release v2.20261103.0 2026-11-03 04:15:04 -03:00
8 changed files with 99 additions and 4 deletions

View File

@@ -6,6 +6,79 @@
## v2.20261103.0
### Wrap-up
This release brings several user-facing improvements: custom channel handle URLs with tab paths, a minute badge on the watch page, automatic video start when clicking timestamps, support for the shows tab on channels, and a new subscription export for NewPipe. It also fixes parsing of published dates and view counts for collab videos and corrects the OPML export for FreeTube. On the breaking side, the hd720 quality option has been removed and Reddit integration has been completely dropped.
For instance owners, Invidious now checks domain configuration before starting, allows adding custom text at the bottom of pages, and improves companion proxying. The toolchain has been updated to Crystal 1.22.2, and Nix packaging has been refreshed with multiple nixpkgs bumps.
Developers will find improved spec handling with a `-v` flag, removal of unused functions, better module encapsulation, and fixes for deprecation warnings across Crystal versions. CI dependencies were also updated.
### New features & important changes
#### For Users
- Support for custom channel handle URLs with tab paths, e.g. `{INSTANCE}/markrober/streams` (#5811)
- Added a minute badge next to the video title on the watch page (#6112)
- Clicking a timestamp now automatically starts the video and scrolls to it (#6111)
- Added support for the shows tab on channels (#6033)
- New subscription export in JSON format for NewPipe (#5826)
- Removed the hd720 quality option (#6098)
- Removed all Reddit integration (#6087)
#### For instance owners
- Invidious now checks domain configuration before starting (#5352)
- Added ability to display custom text at the bottom of pages, e.g. for contacting a maintainer (#3826)
- Improved companion proxying (#5809)
- Updated to Crystal 1.22.2 (#6106, #6099)
- Nix packaging bumps: nixpkgs and flake-utils updates (#6102, #6086, #6097)
#### For developers
- Specs now support a `-v` flag for verbose output (#6115)
- Removed unused functions `.ci_lower_bound()` and `.elapsed_text()` (#6110)
- Moved FreeTube OPML export to the Export module (#6107)
- Encapsulated more functions into modules and improved spec files (#6046)
- Fixed deprecation warnings across Crystal versions (#6100)
- Updated CI dependency `crystal-lang/install-crystal` (#6096)
### Bugs fixed
#### For Users
- Fixed parsing of published date and view count for collab videos (#5812)
- Fixed OPML export for FreeTube (#6109)
#### For developers
- Fixed deprecation warnings that appeared across different Crystal versions (#6100)
### Full list of pull requests merged since the last release (newest first)
* fix(parser): parse published date and view count for collab videos (https://github.com/iv-org/invidious/pull/5812, by @radmorecameron)
* feat: Adds support for custom channel handle urls with tab paths (ex: `{INSTANCE}/markrober/streams`) (https://github.com/iv-org/invidious/pull/5811, by @radmorecameron)
* chore: improve invidious companion proxying (https://github.com/iv-org/invidious/pull/5809, by @Fijxu)
* check domain configuration before starting Invidious (https://github.com/iv-org/invidious/pull/5352, by @Fijxu)
* chore: use `-v` cmdline argument for verbose output of the specs (https://github.com/iv-org/invidious/pull/6115, by @Fijxu)
* feat: add minute badge to the watch page, right next to the title of the video (https://github.com/iv-org/invidious/pull/6112, by @Fijxu)
* Add custom text at the bottom - contact a maintainer (https://github.com/iv-org/invidious/pull/3826, by @auralglow)
* feat: automatically start video and scroll to it if clicking timestam… (https://github.com/iv-org/invidious/pull/6111, by @Fijxu)
* chore: remove unused functions .ci_lower_bound() and .elapsed_text() (https://github.com/iv-org/invidious/pull/6110, by @Fijxu)
* fix: fix the OPML export for FreeTube (https://github.com/iv-org/invidious/pull/6109, by @Fijxu)
* chore: move FreeTube OPML export to Export module (https://github.com/iv-org/invidious/pull/6107, by @Fijxu)
* Translations update from Hosted Weblate (https://github.com/iv-org/invidious/pull/5949, by @weblate)
* chore: update to Crystal 1.22.2 (https://github.com/iv-org/invidious/pull/6106, by @Fijxu)
* Add subscription JSON export for NewPipe (https://github.com/iv-org/invidious/pull/5826, by @unrealtournament)
* chore: Encapsulate more functions into their own modules and improve spec files (https://github.com/iv-org/invidious/pull/6046, by @Fijxu)
* chore(deps): bump nixpkgs from `02c087f` to `3ec6363` in /nix (https://github.com/iv-org/invidious/pull/6102, by @dependabot[bot])
* chore(deps): bump flake-utils from `11707dc` to `b7a79d3` in /nix (https://github.com/iv-org/invidious/pull/6086, by @dependabot[bot])
* chore: remove hd720 quality (https://github.com/iv-org/invidious/pull/6098, by @Fijxu)
* feat(channel): add support for shows tab (https://github.com/iv-org/invidious/pull/6033, by @radmorecameron)
* fix: fix warnings from deprecations across Crystal versions (https://github.com/iv-org/invidious/pull/6100, by @Fijxu)
* chore: Completely remove Reddit from Invidious (https://github.com/iv-org/invidious/pull/6087, by @Fijxu)
* chore: update to Crystal 1.22.1 (https://github.com/iv-org/invidious/pull/6099, by @Fijxu)
* chore(deps): bump nixpkgs from `151fa4e` to `02c087f` in /nix (https://github.com/iv-org/invidious/pull/6097, by @dependabot[bot])
* chore(deps): bump crystal-lang/install-crystal from 1.9.3 to 1.9.4 (https://github.com/iv-org/invidious/pull/6096, by @dependabot[bot])
* Release v2.20261022.0 (https://github.com/iv-org/invidious/pull/6093, by @github-actions[bot])
## v2.20261022.0
### Wrap-up

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

@@ -1,5 +1,5 @@
name: invidious
version: 2.20261022.0-dev
version: 2.20261103.0-dev
authors:
- Invidious team <contact@invidious.io>

View File

@@ -228,7 +228,16 @@ class Config
env_config_yaml = "INVIDIOUS_CONFIG"
config_file = ENV.has_key?(env_config_file) ? ENV.fetch(env_config_file) : "config/config.yml"
config_yaml = ENV.has_key?(env_config_yaml) ? ENV.fetch(env_config_yaml) : File.read(config_file)
config_yaml = if ENV.has_key?(env_config_yaml)
ENV.fetch(env_config_yaml)
else
begin
File.read(config_file)
rescue ex
puts "Config: Failed to load configuration file: #{ex.message}"
exit(1)
end
end
config = Config.from_yaml(config_yaml)

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 %>