Skip to content

Commit 1de2054

Browse files
committed
add ability for invidious companion to check request from invidious
1 parent ab72bba commit 1de2054

File tree

4 files changed

+29
-3
lines changed

4 files changed

+29
-3
lines changed

config/config.example.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ db:
8383

8484
##
8585
## API key for Invidious companion
86+
## The size of the key needs to be more or equal to 16.
8687
##
8788
## Needed when invidious_companion is configured
8889
##

src/invidious/config.cr

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,9 @@ class Config
250250
elsif config.invidious_companion_key == "CHANGE_ME!!"
251251
puts "Config: The value of 'invidious_companion_key' needs to be changed!!"
252252
exit(1)
253+
elsif config.invidious_companion_key.size < 16
254+
puts "Config: The value of 'invidious_companion_key' needs to be a size of 16 or more."
255+
exit(1)
253256
end
254257
end
255258

src/invidious/helpers/utils.cr

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,3 +383,22 @@ def parse_link_endpoint(endpoint : JSON::Any, text : String, video_id : String)
383383
end
384384
return text
385385
end
386+
387+
def encrypt_ecb_without_salt(data, key)
388+
cipher = OpenSSL::Cipher.new("aes-128-ecb")
389+
cipher.encrypt
390+
cipher.key = key
391+
392+
io = IO::Memory.new
393+
io.write(cipher.update(data))
394+
io.write(cipher.final)
395+
io.rewind
396+
397+
return io
398+
end
399+
400+
def invidious_companion_encrypt(data)
401+
timestamp = Time.utc.to_unix
402+
encrypted_data = encrypt_ecb_without_salt("#{timestamp}|#{data}", CONFIG.invidious_companion_key)
403+
return Base64.urlsafe_encode(encrypted_data)
404+
end

src/invidious/views/components/player.ecr

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
audio_streams.each_with_index do |fmt, i|
2323
src_url = "/latest_version?id=#{video.id}&itag=#{fmt["itag"]}"
2424
src_url += "&local=true" if params.local
25-
src_url = video.invidious_companion["baseUrl"].as_s + src_url if (!CONFIG.invidious_companion.empty?)
25+
src_url = video.invidious_companion["baseUrl"].as_s + src_url +
26+
"&check=#{invidious_companion_encrypt(video.id)}" if (!CONFIG.invidious_companion.empty?)
2627
2728
bitrate = fmt["bitrate"]
2829
mimetype = HTML.escape(fmt["mimeType"].as_s)
@@ -37,7 +38,8 @@
3738
<% else %>
3839
<% if params.quality == "dash"
3940
src_url = "/api/manifest/dash/id/" + video.id + "?local=true&unique_res=1"
40-
src_url = video.invidious_companion["baseUrl"].as_s + src_url if (!CONFIG.invidious_companion.empty?)
41+
src_url = video.invidious_companion["baseUrl"].as_s + src_url +
42+
"&check=#{invidious_companion_encrypt(video.id)}" if (!CONFIG.invidious_companion.empty?)
4143
%>
4244
<source src="<%= src_url %>" type='application/dash+xml' label="dash">
4345
<% end %>
@@ -48,7 +50,8 @@
4850
fmt_stream.each_with_index do |fmt, i|
4951
src_url = "/latest_version?id=#{video.id}&itag=#{fmt["itag"]}"
5052
src_url += "&local=true" if params.local
51-
src_url = video.invidious_companion["baseUrl"].as_s + src_url if (!CONFIG.invidious_companion.empty?)
53+
src_url = video.invidious_companion["baseUrl"].as_s + src_url +
54+
"&check=#{invidious_companion_encrypt(video.id)}" if (!CONFIG.invidious_companion.empty?)
5255
5356
quality = fmt["quality"]
5457
mimetype = HTML.escape(fmt["mimeType"].as_s)

0 commit comments

Comments
 (0)