summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOmar Roth <omarroth@hotmail.com>2017-11-23 22:06:43 -0600
committerOmar Roth <omarroth@hotmail.com>2017-11-23 22:06:43 -0600
commit31a3e1bb3a7f9f753efef68bd76b3a9358b847e9 (patch)
treec3db7c39ed6610b632c99d56abe7e5ba54a90559 /src
parent131b92b381cf66a9c7a3a83e04ce685419abdd3d (diff)
downloadinvidious-31a3e1bb3a7f9f753efef68bd76b3a9358b847e9.tar.gz
invidious-31a3e1bb3a7f9f753efef68bd76b3a9358b847e9.tar.bz2
invidious-31a3e1bb3a7f9f753efef68bd76b3a9358b847e9.zip
Add view counter, likes/dislikes, rating, and HTML parser
Diffstat (limited to 'src')
-rw-r--r--src/proxy.cr0
-rw-r--r--src/visor.cr106
2 files changed, 66 insertions, 40 deletions
diff --git a/src/proxy.cr b/src/proxy.cr
deleted file mode 100644
index e69de29b..00000000
--- a/src/proxy.cr
+++ /dev/null
diff --git a/src/visor.cr b/src/visor.cr
index 76988b29..77e7e170 100644
--- a/src/visor.cr
+++ b/src/visor.cr
@@ -1,25 +1,56 @@
+require "http/client"
+require "json"
require "kemal"
+require "pg"
require "xml"
-require "http/client"
-require "base64"
macro templated(filename)
render "views/#{{{filename}}}.ecr", "views/layout.ecr"
end
-context = OpenSSL::SSL::Context::Client.insecure
-client = HTTP::Client.new("www.youtube.com", 443, context)
+# pg = DB.open("postgres://kemal@visor/dev")
+
+alias Type = String | Hash(String, Type)
+
+def object_to_hash(value)
+ object = {} of String => Type
+ items = value.split("&")
+ items.each do |item|
+ key, value = item.split("=")
+ value = URI.unescape(value)
+ object[key] = parse_uri(value)
+ end
+ return object
+end
-def params_to_hash(params)
- pairs = params.split("&")
- hash = Hash(String, String).new
- pairs.each do |pair|
- key, value = pair.split("=")
- hash[key] = URI.unescape(value)
+def array_to_hash(value)
+ array = {} of String => Type
+ items = value.split(",")
+ count = 0
+ items.each do |item|
+ array[count.to_s] = parse_uri(item)
+ count += 1
end
- return hash
+ return array
end
+def parse_uri(value)
+ if value.starts_with?("http") || value.starts_with?("[")
+ return value
+ else
+ if value.includes?(",")
+ return array_to_hash(value)
+ elsif value.includes?("&")
+ return object_to_hash(value)
+ else
+ return value
+ end
+ end
+end
+
+context = OpenSSL::SSL::Context::Client.insecure
+client = HTTP::Client.new("www.youtube.com", 443, context)
+
get "/" do |env|
templated "index"
end
@@ -27,42 +58,37 @@ end
get "/watch/:video_id" do |env|
video_id = env.params.url["video_id"]
- if File.exists?("video_info/#{video_id}")
- video_info = JSON.parse(File.open("video_info/#{video_id}"))
- else
- video_info_encoded = HTTP::Client.get("https://www.youtube.com/get_video_info?video_id=#{video_id}&el=info&ps=default&eurl=&gl=US&hl=en", nil, nil, tls = context).body
- video_info = params_to_hash(video_info_encoded)
+ video_info_encoded = HTTP::Client.get("https://www.youtube.com/get_video_info?video_id=#{video_id}&el=info&ps=default&eurl=&gl=US&hl=en", nil, nil, tls = context).body
+ video_info = object_to_hash(video_info_encoded)
+ body = client.get("/watch?v=#{video_id}").body
+ doc = XML.parse(body)
- File.write("video_info/#{video_id}", video_info.to_json)
+ likes = doc.xpath_node(%q(//button[@title="I like this"]/span))
+ if likes
+ likes = likes.content
+ else
+ likes = "n/a"
end
-
- fmt_stream_map = video_info["url_encoded_fmt_stream_map"].to_s.split(",")
- fmt_stream = Array(Hash(String, String)).new
- fmt_stream_map.each do |fmt|
- fmt_stream << params_to_hash(fmt.to_s)
+
+ dislikes = doc.xpath_node(%q(//button[@title="I dislike this"]/span))
+ if dislikes
+ dislikes.content
+ else
+ dislikes = "n/a"
end
- fmt_stream.reverse!
+
+ File.write("video_info/#{video_id}", video_info.to_json)
templated "watch"
end
-get "/listen/:video_id" do |env|
- video_id = env.params.url["video_id"]
+# get "/listen/:video_id" do |env|
+# video_id = env.params.url["video_id"]
- if File.exists?("video_info/#{video_id}")
- video_info = JSON.parse(File.open("video_info/#{video_id}"))
- else
- video_info_encoded = HTTP::Client.get("https://www.youtube.com/get_video_info?video_id=#{video_id}&el=info&ps=default&eurl=&gl=US&hl=en", nil, nil, tls = context).body
- video_info = params_to_hash(video_info_encoded)
-
- File.write("video_info/#{video_id}", video_info.to_json)
- end
-
- adaptive_fmt = Array(Hash(String, String)).new
- video_info["adaptive_fmts"].to_s.split(",") do |fmt|
- adaptive_fmt << params_to_hash(video_info["adaptive_fmts"].to_s)
- end
- templated "listen"
-end
+# video_info_encoded = HTTP::Client.get("https://www.youtube.com/get_video_info?video_id=#{video_id}&el=info&ps=default&eurl=&gl=US&hl=en", nil, nil, tls = context).body
+# video_info = object_to_hash(video_info_encoded)
+# File.write("video_info/#{video_id}", video_info.to_json)
+# templated "listen"
+# end
public_folder "assets"