From 429a4b2deca8b94b04f73fbaf0f50f26c93bac39 Mon Sep 17 00:00:00 2001 From: Omar Roth Date: Fri, 14 Sep 2018 21:24:28 -0500 Subject: [PATCH] Proxy thumbnails --- assets/css/default.css | 12 +++++- src/invidious.cr | 50 +++++++++++++++++++++--- src/invidious/videos.cr | 8 ++-- src/invidious/views/components/video.ecr | 2 +- src/invidious/views/watch.ecr | 2 +- 5 files changed, 61 insertions(+), 13 deletions(-) diff --git a/assets/css/default.css b/assets/css/default.css index baba0ffa..997ce757 100644 --- a/assets/css/default.css +++ b/assets/css/default.css @@ -173,7 +173,7 @@ div { /* ProgressBar marker */ .vjs-marker { - background-color: rgba(255, 255, 255, 1); + background-color: rgba(255, 255, 255, 1); } /* Big "Play" Button */ @@ -196,3 +196,13 @@ div { padding-left: 0px; padding-right: 0px; } + +video[poster] { + object-fit: cover; + background-color: transparent; +} + +.vjs-poster { + background-size: cover !important; + object-fit: cover !important; +} diff --git a/src/invidious.cr b/src/invidious.cr index f1ce53a3..df0ea978 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -264,8 +264,7 @@ get "/watch" do |env| hlsvp = hlsvp.gsub("https://manifest.googlevideo.com", host_url) end - # TODO: Find highest resolution thumbnail automatically - thumbnail = "https://i.ytimg.com/vi/#{video.id}/mqdefault.jpg" + thumbnail = "/vi/#{video.id}/maxres.jpg" if params[:raw] url = fmt_stream[0]["url"] @@ -364,8 +363,7 @@ get "/embed/:id" do |env| hlsvp = hlsvp.gsub("https://manifest.googlevideo.com", host_url) end - # TODO: Find highest resolution thumbnail automatically - thumbnail = "https://i.ytimg.com/vi/#{video.id}/mqdefault.jpg" + thumbnail = "/vi/#{video.id}/maxres.jpg" if params[:raw] url = fmt_stream[0]["url"] @@ -1478,7 +1476,7 @@ get "/feed/channel/:ucid" do |env| xml.element("media:group") do xml.element("media:title") { xml.text video.title } - xml.element("media:thumbnail", url: "https://i.ytimg.com/vi/#{video.id}/mqdefault.jpg", + xml.element("media:thumbnail", url: "/vi/#{video.id}/mqdefault.jpg", width: "320", height: "180") xml.element("media:description") { xml.text video.description } end @@ -1583,7 +1581,7 @@ get "/feed/private" do |env| xml.element("media:group") do xml.element("media:title") { xml.text video.title } - xml.element("media:thumbnail", url: "https://i.ytimg.com/vi/#{video.id}/mqdefault.jpg", + xml.element("media:thumbnail", url: "/vi/#{video.id}/mqdefault.jpg", width: "320", height: "180") end end @@ -2969,6 +2967,46 @@ get "/videoplayback" do |env| end end +get "/vi/:id/:name" do |env| + id = env.params.url["id"] + name = env.params.url["name"] + + host = "https://i.ytimg.com" + client = make_client(URI.parse(host)) + + if name == "maxres.jpg" + VIDEO_THUMBNAILS.each do |thumb| + if client.head("/vi/#{id}/#{thumb[:url]}.jpg").status_code == 200 + name = thumb[:url] + ".jpg" + break + end + end + end + url = "/vi/#{id}/#{name}" + + client.get(url) do |response| + env.response.status_code = response.status_code + + response.headers.each do |key, value| + env.response.headers[key] = value + end + + env.response.headers["Access-Control-Allow-Origin"] = "*" + + begin + chunk_size = 4096 + size = 1 + while size > 0 + size = IO.copy(response.body_io, env.response.output, chunk_size) + env.response.flush + Fiber.yield + end + rescue ex + break + end + end +end + error 404 do |env| error_message = "404 Page not found" templated "error" diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index ab67004c..1359a999 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -112,11 +112,11 @@ REGIONS = {"AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "A BYPASS_REGIONS = {"CA", "DE", "FR", "JP", "RU", "UK"} VIDEO_THUMBNAILS = { - {name: "default", url: "default", height: 90, width: 120}, - {name: "medium", url: "mqdefault", height: 180, width: 320}, - {name: "high", url: "hqdefault", height: 360, width: 480}, + {name: "maxresdefault", url: "maxresdefault", height: 720, width: 1280}, {name: "sddefault", url: "sddefault", height: 480, width: 640}, - {name: "maxresdefault", url: "maxresdefault", height: 1280, width: 720}, + {name: "high", url: "hqdefault", height: 360, width: 480}, + {name: "medium", url: "mqdefault", height: 180, width: 320}, + {name: "default", url: "default", height: 90, width: 120}, {name: "start", url: "1", height: 90, width: 120}, {name: "middle", url: "2", height: 90, width: 120}, {name: "end", url: "3", height: 90, width: 120}, diff --git a/src/invidious/views/components/video.ecr b/src/invidious/views/components/video.ecr index cbd3e106..275f4335 100644 --- a/src/invidious/views/components/video.ecr +++ b/src/invidious/views/components/video.ecr @@ -8,7 +8,7 @@ <% if env.get?("user") && env.get("user").as(User).preferences.thin_mode %> <% else %> - + <% end %>

<%= video.title %>

diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index 64a8d51e..9b279dad 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -5,7 +5,7 @@ - +