mirror of
https://github.com/iv-org/invidious.git
synced 2026-11-13 23:37:17 +00:00
Compare commits
1 Commits
release-v2
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5aa47e902c |
42
CHANGELOG.md
42
CHANGELOG.md
@@ -7,48 +7,6 @@
|
||||
|
||||
|
||||
|
||||
|
||||
## v2.20261113.0
|
||||
|
||||
### Wrap-up
|
||||
|
||||
This release adds an AI-made indicator for videos that carry the AI badge and continues support for custom channel handle URLs with tab paths. It also fixes parsing of premiere timestamps on channel videos, corrects the ggpht route, and resolves parsing of published dates and view counts for collab videos.
|
||||
|
||||
For instance owners, Invidious now displays a friendly message when the config.yml file is missing. Dependency updates include http_proxy 0.17.0 and athena-negotiation 0.2.0, and CI bumps crystal-lang/install-crystal to 1.9.5.
|
||||
|
||||
### New features & important changes
|
||||
|
||||
#### For Users
|
||||
- Added an AI-made indicator for videos that carry the AI badge (#6113)
|
||||
- Support for custom channel handle URLs with tab paths, e.g. `{INSTANCE}/markrober/streams` (#5811)
|
||||
|
||||
#### For instance owners
|
||||
- Display a friendly message when the config.yml file is missing (#6121)
|
||||
- Updated http_proxy to 0.17.0 (#6142)
|
||||
- Updated athena-negotiation to 0.2.0 (#6141)
|
||||
|
||||
#### For developers
|
||||
- Bumped crystal-lang/install-crystal from 1.9.4 to 1.9.5 (#6129)
|
||||
|
||||
### Bugs fixed
|
||||
#### For Users
|
||||
- Fixed parsing of premiere_timestamp on channel videos (#6140)
|
||||
- Fixed the ggpht route (#6143)
|
||||
- Fixed parsing of published date and view count for collab videos (#5812)
|
||||
|
||||
### Full list of pull requests merged since the last release (newest first)
|
||||
|
||||
* fix: fix ggpht route after commit 3df8616 (https://github.com/iv-org/invidious/pull/6143, by @Fijxu)
|
||||
* chore(deps): update http_proxy to 0.17.0 (https://github.com/iv-org/invidious/pull/6142, by @Fijxu)
|
||||
* chore(deps): update athena-negotiation to 0.2.0 (https://github.com/iv-org/invidious/pull/6141, by @Fijxu)
|
||||
* fix: correctly parse premiere_timestamp on channel videos (https://github.com/iv-org/invidious/pull/6140, by @Fijxu)
|
||||
* chore(deps): bump crystal-lang/install-crystal from 1.9.4 to 1.9.5 (https://github.com/iv-org/invidious/pull/6129, by @dependabot[bot])
|
||||
* feat: add AI made indicator for videos that have the AI badge (https://github.com/iv-org/invidious/pull/6113, by @Fijxu)
|
||||
* chore: Display a nice message when the config.yml file is missing (https://github.com/iv-org/invidious/pull/6121, by @Fijxu)
|
||||
* Release v2.20261103.0 (https://github.com/iv-org/invidious/pull/6118, by @github-actions[bot])
|
||||
* 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)
|
||||
|
||||
## v2.20261103.0
|
||||
|
||||
### Wrap-up
|
||||
|
||||
@@ -6,7 +6,7 @@ shards:
|
||||
|
||||
athena-negotiation:
|
||||
git: https://github.com/athena-framework/negotiation.git
|
||||
version: 0.2.0
|
||||
version: 0.1.1
|
||||
|
||||
backtracer:
|
||||
git: https://github.com/sija/backtracer.cr.git
|
||||
@@ -22,7 +22,7 @@ shards:
|
||||
|
||||
http_proxy:
|
||||
git: https://github.com/mamantoha/http_proxy.git
|
||||
version: 0.17.0
|
||||
version: 0.10.3
|
||||
|
||||
kemal:
|
||||
git: https://github.com/kemalcr/kemal.git
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: invidious
|
||||
version: 2.20261113.0
|
||||
version: 2.20261103.0-dev
|
||||
|
||||
authors:
|
||||
- Invidious team <contact@invidious.io>
|
||||
@@ -29,10 +29,10 @@ dependencies:
|
||||
version: ~> 0.1.5
|
||||
athena-negotiation:
|
||||
github: athena-framework/negotiation
|
||||
version: ~> 0.2.0
|
||||
version: ~> 0.1.1
|
||||
http_proxy:
|
||||
github: mamantoha/http_proxy
|
||||
version: ~> 0.17.0
|
||||
version: ~> 0.10.3
|
||||
|
||||
development_dependencies:
|
||||
spectator:
|
||||
|
||||
@@ -94,20 +94,6 @@ def decode_date(string : String)
|
||||
return Time.utc(string.to_i, 1, 1)
|
||||
end
|
||||
|
||||
# Try to parse "Premieres 6/29/27, 9:00 PM"
|
||||
# For some reason, the Innertube response contains a '\u202F'
|
||||
# character in the separation between the time and the period
|
||||
# so the raw string returned by Innertube is something like this:
|
||||
# "Premieres 6/29/27, 9:00\u202FPM". Instead of using a space character
|
||||
# it uses the '\u202F' character.
|
||||
#
|
||||
# Raw: "Premieres 6/29/27, 9:00 PM"
|
||||
begin
|
||||
string2 = string.lchop("Premieres ").gsub('\u202F', " ")
|
||||
return Time.parse(string2, "%m/%d/%y, %l:%M %p", Time::Location.local)
|
||||
rescue
|
||||
end
|
||||
|
||||
# Try to parse as format Jul 10, 2000
|
||||
begin
|
||||
return Time.parse(string, "%b %-d, %Y", Time::Location.local)
|
||||
|
||||
@@ -222,8 +222,7 @@ module Invidious::Routing
|
||||
end
|
||||
|
||||
def register_image_routes
|
||||
get "/ggpht/:id", Routes::Images, :ggpht
|
||||
get "/ggpht/ytc/:id", Routes::Images, :ggpht
|
||||
get "/ggpht/*", Routes::Images, :ggpht
|
||||
options "/sb/:authority/:id/:storyboard/:index", Routes::Images, :options_storyboard
|
||||
get "/sb/:authority/:id/:storyboard/:index", Routes::Images, :get_storyboard
|
||||
get "/s_p/:id/:name", Routes::Images, :s_p_image
|
||||
|
||||
@@ -712,17 +712,9 @@ private module Parsers
|
||||
title = metadata.dig("title", "content").as_s
|
||||
published = nil
|
||||
view_count_text = nil
|
||||
premiere_timestamp = nil
|
||||
# Contains the views of the video and the published time of the video.
|
||||
if (metadata_rows = metadata.dig("metadata", "contentMetadataViewModel", "metadataRows").try &.as_a)
|
||||
metadata_rows.each do |row|
|
||||
# To filter members only videos, they do not have metadataParts available.
|
||||
# This videos are not hidden from the channel videos list.
|
||||
badges = row.dig?("badges").try &.as_a
|
||||
if badges.try &.any? { |item| item.dig?("badgeViewModel", "badgeStyle").try &.as_s == "BADGE_MEMBERS_ONLY" }
|
||||
next
|
||||
end
|
||||
|
||||
metadata_parts = row.dig("metadataParts").try &.as_a
|
||||
|
||||
if view_count_text.nil?
|
||||
@@ -733,12 +725,8 @@ private module Parsers
|
||||
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) }
|
||||
end
|
||||
if premiere_timestamp.nil?
|
||||
premiere_timestamp = metadata_parts.try &.find { |item| item["icon"]?.nil? && item.dig?("text", "content").try &.as_s.includes?("Premieres") }
|
||||
.try { |item| decode_date(item.dig("text", "content").as_s) }
|
||||
end
|
||||
|
||||
break if !view_count_text.nil? && !published.nil? && !premiere_timestamp.nil?
|
||||
break if !view_count_text.nil? && !published.nil?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -757,7 +745,7 @@ private module Parsers
|
||||
views: view_count,
|
||||
description_html: "",
|
||||
length_seconds: length_seconds || 0,
|
||||
premiere_timestamp: premiere_timestamp,
|
||||
premiere_timestamp: Time.unix(0),
|
||||
author_verified: false,
|
||||
author_thumbnail: nil,
|
||||
badges: VideoBadges::None,
|
||||
@@ -813,13 +801,7 @@ private module Parsers
|
||||
.compact_map(&.dig?("thumbnailOverlayBadgeViewModel", "thumbnailBadges").try &.as_a)
|
||||
.flatten
|
||||
.find(nil, &.dig?("thumbnailBadgeViewModel", "text").try do |node|
|
||||
# Playlists that contain MORE THAN ONE video, use "videos" for their video count.
|
||||
# "text" => "8 videos"
|
||||
#
|
||||
# Playlists that contain ONLY ONE video, use "video" for their video count.
|
||||
# "text" => "1 video"
|
||||
#
|
||||
{"episodes", "videos", "video", "lessons"}.any? { |str| node.as_s.ends_with?(str) }
|
||||
{"episodes", "videos", "lessons"}.any? { |str| node.as_s.ends_with?(str) }
|
||||
end)
|
||||
.try &.dig("thumbnailBadgeViewModel", "text").as_s.to_i(strict: false)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user