Add support for different signature functions

This commit is contained in:
Omar Roth 2018-02-11 22:06:29 -06:00
parent 42df0df5a0
commit 1d301a5055
2 changed files with 59 additions and 17 deletions

View File

@ -175,14 +175,39 @@ def search(query, client)
end
end
def decrypt_signature(a)
a = a.split("")
a.delete_at(0..2)
a = a.reverse
def swap(a, b)
c = a[0]
a[0] = a[49 % a.size]
a[49] = c
return a.join("")
a[0] = a[b % a.size]
a[b % a.size] = c
return a
end
def decrypt_signature(a, base)
if a && base
a = a.split("")
if base == "vflG9lb96"
a = swap(a, 26)
a.reverse!
a = swap(a, 8)
a = swap(a, 61)
elsif base == "vflxuxnEY"
a.delete_at(0..2)
a.reverse!
c = a[0]
a[0] = a[49 % a.size]
a[49] = c
elsif base == "vflAXQwEj"
a = swap(a, 26)
a.reverse!
a = swap(a, 8)
a = swap(a, 61)
else
raise "Could not decrypt signature for player #{base}"
end
return a.join("")
end
end
def rank_videos(db, n)

View File

@ -168,12 +168,32 @@ get "/watch" do |env|
fmt_stream << HTTP::Params.parse(string)
end
if fmt_stream[0]?
if fmt_stream[0]["s"]?
fmt_stream.each do |fmt|
fmt["url"] = "#{fmt["url"]}&signature=#{decrypt_signature(fmt["s"])}"
end
base = nil
if fmt_stream[0]? && fmt_stream[0]["s"]?
base = video.html.xpath_node(%q(//script[@name="player/base"]))
if !base
base = video.html.xpath_node(%q(//script[@name="player_ias/base"]))
end
if base
base = base["src"]
base = base.split("/")[3].split("-")[1]
end
end
begin
fmt_stream.each do |fmt|
if fmt["s"]? && !base
File.write("info/#{id}.html", video.html)
raise "Could not find signature for #{video.id}"
end
fmt["url"] = "#{fmt["url"]}&signature=#{decrypt_signature(fmt["s"]?, base)}"
end
rescue ex
error_message = ex
next templated "error"
end
# We want lowest quality first
@ -186,12 +206,8 @@ get "/watch" do |env|
end
end
if adaptive_fmts[0]?
if adaptive_fmts[0]["s"]?
adaptive_fmts.each do |fmt|
fmt["url"] = "#{fmt["url"]}&signature=#{decrypt_signature(fmt["s"])}"
end
end
fmt["url"] = "#{fmt["url"]}&signature=#{decrypt_signature(fmt["s"]?, base)}"
end
rvs = [] of Hash(String, String)
@ -209,6 +225,7 @@ get "/watch" do |env|
rating = video.info["avg_rating"].to_f64
engagement = ((video.dislikes.to_f + video.likes.to_f)/video.views * 100)
if video.likes > 0 || video.dislikes > 0
calculated_rating = (video.likes.to_f/(video.likes.to_f + video.dislikes.to_f) * 4 + 1)
else