diff --git a/assets/css/player.css b/assets/css/player.css
index 50c7a748..415aa272 100644
--- a/assets/css/player.css
+++ b/assets/css/player.css
@@ -262,3 +262,23 @@ video.video-js {
overflow-x: hidden;
}
}
+
+
+.video-js div.channel-watermark-container {
+ background-color: transparent !important;
+}
+
+.channel-watermark-container {
+ margin: 5px;
+ opacity: 0.7;
+ transition: opacity .25s cubic-bezier(0,0,.2,1);
+}
+
+.channel-watermark-container:hover {
+ opacity: 1
+}
+
+.channel-watermark {
+ width: 40px;
+ height: 40px;
+}
diff --git a/assets/js/player.js b/assets/js/player.js
index 16bb2752..6711cc70 100644
--- a/assets/js/player.js
+++ b/assets/js/player.js
@@ -764,6 +764,24 @@ if (location.pathname.startsWith('/embed/')) {
cb.addChild(watch_on_invidious_button);
}
+// Channel watermark
+if (video_data.watermark) {
+ const watermark_html = ``;
+
+ player.overlay({
+ overlays: [
+ {
+ start: Math.round(parseInt(video_data.watermark.startTimeMs) / 1000),
+ content: watermark_html,
+ end: Math.round(parseInt(video_data.watermark.endTimeMs) / 1000),
+ align: 'bottom-right',
+ showBackground: false,
+ class: "channel-watermark-container"
+ },
+ ]
+ });
+};
+
addEventListener('DOMContentLoaded', function () {
// Save time during redirection on another instance
const changeInstanceLink = document.querySelector('#watch-on-another-invidious-instance > a');
diff --git a/src/invidious/routes/images.cr b/src/invidious/routes/images.cr
index b6a2e110..668a9788 100644
--- a/src/invidious/routes/images.cr
+++ b/src/invidious/routes/images.cr
@@ -206,4 +206,44 @@ module Invidious::Routes::Images
rescue ex
end
end
+
+ # i.ytimg.com/an/* used for the thumbnail of channel watermarks
+ def self.yt_an_image(env)
+ id = env.params.url["id"]
+ name = env.params.url["name"]
+
+ url = "https://i.ytimg.com/an/#{id}/#{name}"
+ url += "?#{env.params.query}" if !env.params.query.empty?
+
+ headers = HTTP::Headers.new
+
+ REQUEST_HEADERS_WHITELIST.each do |header|
+ if env.request.headers[header]?
+ headers[header] = env.request.headers[header]
+ end
+ end
+
+ begin
+ # TODO deduplicate repeated image proxy logic
+ HTTP::Client.get(url) do |response|
+ env.response.status_code = response.status_code
+
+ response.headers.each do |key, value|
+ if !RESPONSE_HEADERS_BLACKLIST.includes?(key.downcase)
+ env.response.headers[key] = value
+ end
+ end
+
+ env.response.headers["Access-Control-Allow-Origin"] = "*"
+
+ if response.status_code >= 300
+ env.response.headers.delete("Transfer-Encoding")
+ return
+ end
+
+ return proxy_file(response, env)
+ end
+ rescue ex
+ end
+ end
end
diff --git a/src/invidious/routing.cr b/src/invidious/routing.cr
index d6bd991c..72552d7a 100644
--- a/src/invidious/routing.cr
+++ b/src/invidious/routing.cr
@@ -219,6 +219,7 @@ module Invidious::Routing
get "/s_p/:id/:name", Routes::Images, :s_p_image
get "/yts/img/:name", Routes::Images, :yts_image
get "/vi/:id/:name", Routes::Images, :thumbnails
+ get "/an/:id/:name", Routes::Images, :yt_an_image
end
# -------------------
diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr
index 75f89230..3bb838b1 100644
--- a/src/invidious/videos/parser.cr
+++ b/src/invidious/videos/parser.cr
@@ -383,8 +383,8 @@ def parse_video_info(video_id : String, player_response : Hash(String, JSON::Any
if watermark = player_response.dig?("annotations", 0, "playerAnnotationsExpandedRenderer", "featuredChannel")
watermark_data = {
"startTimeMs" => watermark["startTimeMs"],
- "endTimeMS" => watermark["endTimeMs"],
- "thumbnailURL" => watermark["watermark"]["thumbnails"][0]["url"],
+ "endTimeMs" => watermark["endTimeMs"],
+ "thumbnailURL" => JSON::Any.new(URI.parse(watermark["watermark"]["thumbnails"][0]["url"].as_s).request_target),
}
else
watermark_data = {} of String => JSON::Any
diff --git a/src/invidious/views/components/player.ecr b/src/invidious/views/components/player.ecr
index c3c02df0..89ce4345 100644
--- a/src/invidious/views/components/player.ecr
+++ b/src/invidious/views/components/player.ecr
@@ -15,7 +15,7 @@
if (fmt["mimeType"].as_s.starts_with?("audio/mp4") && bandwidth > best_m4a_stream_bitrate)
best_m4a_stream_bitrate = bandwidth
best_m4a_stream_index = i
- end
+ end
end
audio_streams.each_with_index do |fmt, i|
diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr
index 07474896..b379474e 100644
--- a/src/invidious/views/watch.ecr
+++ b/src/invidious/views/watch.ecr
@@ -28,6 +28,12 @@
<%= rendered "components/player_sources" %>
+
+<% if video.watermark? %>
+
+
+<% end %>
+