summaryrefslogtreecommitdiffstats
path: root/src/invidious.cr
diff options
context:
space:
mode:
Diffstat (limited to 'src/invidious.cr')
-rw-r--r--src/invidious.cr51
1 files changed, 45 insertions, 6 deletions
diff --git a/src/invidious.cr b/src/invidious.cr
index 59873958..a291a4ca 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -6,10 +6,43 @@ require "time"
require "xml"
PG_DB = DB.open "postgres://kemal:kemal@localhost:5432/invidious"
-CONTEXT = OpenSSL::SSL::Context::Client.insecure
-POOL = [] of HTTP::Client
-10.times do
- POOL << HTTP::Client.new("www.youtube.com", 443, CONTEXT)
+URL = URI.parse("https://www.youtube.com")
+CONTEXT = OpenSSL::SSL::Context::Client.new
+CONTEXT.verify_mode = OpenSSL::SSL::VerifyMode::NONE
+CONTEXT.add_options(
+ OpenSSL::SSL::Options::ALL |
+ OpenSSL::SSL::Options::NO_SSL_V2 |
+ OpenSSL::SSL::Options::NO_SSL_V3
+)
+POOL = Deque.new(30) do
+ HTTP::Client.new(URL, CONTEXT)
+end
+
+# Refresh all the connections in the pool by crawling recommended
+spawn do
+ # Arbitrary start value
+ id = "RoEEDKwzNBw"
+ loop do
+ client = get_client
+ time = Time.now
+
+ begin
+ video = get_video(id)
+ rescue ex
+ id = "RoEEDKwzNBw"
+ next
+ end
+
+ rvs = [] of Hash(String, String)
+ video.info["rvs"].split(",").each do |rv|
+ rvs << HTTP::Params.parse(rv).to_h
+ end
+
+ id = rvs[rand(rvs.size)]["id"]
+
+ puts "#{Time.now} 200 GET #{id} #{elapsed_text(Time.now - time)}"
+ POOL << client
+ end
end
macro templated(filename)
@@ -69,19 +102,25 @@ def ci_lower_bound(pos, n)
return (phat + z*z/(2*n) - z * Math.sqrt((phat*(1 - phat) + z*z/(4*n))/n))/(1 + z*z/n)
end
+def elapsed_text(elapsed)
+ millis = elapsed.total_milliseconds
+ return "#{millis.round(2)}ms" if millis >= 1
+
+ "#{(millis * 1000).round(2)}µs"
+end
+
def get_client
while POOL.empty?
sleep rand(0..10).milliseconds
end
- return POOL.pop
+ return POOL.shift
end
def fetch_video(id)
# Grab connection from pool
client = get_client
- # client = HTTP::Client.new("www.youtube.com", 443, CONTEXT)
info = client.get("/get_video_info?video_id=#{id}&el=detailpage&ps=default&eurl=&gl=US&hl=en").body
info = HTTP::Params.parse(info)