diff options
| author | Omar Roth <omarroth@hotmail.com> | 2017-11-29 15:33:46 -0600 |
|---|---|---|
| committer | Omar Roth <omarroth@hotmail.com> | 2017-11-29 15:33:46 -0600 |
| commit | 8ee5423af6276433030fac04eee2627457e08b1d (patch) | |
| tree | 418a736fb1aaa54f718bc3abaacdb94c084e48e7 /src | |
| parent | 7feec0c00dff72378fd80723c16d52803c6d882c (diff) | |
| download | invidious-8ee5423af6276433030fac04eee2627457e08b1d.tar.gz invidious-8ee5423af6276433030fac04eee2627457e08b1d.tar.bz2 invidious-8ee5423af6276433030fac04eee2627457e08b1d.zip | |
Move views to src/ directory
Diffstat (limited to 'src')
| -rw-r--r-- | src/views/index.ecr | 0 | ||||
| -rw-r--r-- | src/views/layout.ecr | 26 | ||||
| -rw-r--r-- | src/views/listen.ecr | 18 | ||||
| -rw-r--r-- | src/views/watch.ecr | 23 | ||||
| -rw-r--r-- | src/visor.cr | 139 |
5 files changed, 195 insertions, 11 deletions
diff --git a/src/views/index.ecr b/src/views/index.ecr new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/views/index.ecr diff --git a/src/views/layout.ecr b/src/views/layout.ecr new file mode 100644 index 00000000..611cf691 --- /dev/null +++ b/src/views/layout.ecr @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Visor</title> + <meta content=""> + <link rel="stylesheet" href="/css/pure-min.css"> + <link rel="stylesheet" href="/css/grids-responsive-min.css"> +</head> + +<body> + <div class="pure-menu pure-menu-horizontal"> + <a href="" class="pure-menu-heading pure-menu-link">VIDEO</a> + </div> + <div class="pure-g"> + <div class="pure-u-1 pure-u-md-1-5"></div> + <div class="pure-u-1 pure-u-md-3-5"> + <%= content %> + </div> + <div class="pure-u-1 pure-u-md-1-5"></div> + </div> +</body> + +</html>
\ No newline at end of file diff --git a/src/views/listen.ecr b/src/views/listen.ecr new file mode 100644 index 00000000..97502fb6 --- /dev/null +++ b/src/views/listen.ecr @@ -0,0 +1,18 @@ +<h1><%= video_info["title"] %></h1> +<video style="width: 100%" poster="<%= video_info.has_key?("iurlhq720") ? video_info["iurlhq720"] : video_info["iurl"] %>" controls> +<% video_info["adaptive_fmts"].as(Hash).each do |key, value| %> + <% url = value["url"] %> + <% type = value["type"].to_s.split(";")[0] %> + <% if type.starts_with?("audio") %> + <source src="<%= url %>" type="<%= type %>"> + <% end %> +<% end %> +</video> +<div class="pure-g"> +<div class="pure-u-1 pure-u-md-1-5"></div> +<div class="pure-u-1 pure-u-md-3-5"></div> +<div class="pure-u-1 pure-u-md-1-5"> + <p>Views : <%= video_info["view_count"] %></p> + <p>Rating : <%= video_info["avg_rating"] %></p> +</div> +</div>
\ No newline at end of file diff --git a/src/views/watch.ecr b/src/views/watch.ecr new file mode 100644 index 00000000..6894bf92 --- /dev/null +++ b/src/views/watch.ecr @@ -0,0 +1,23 @@ +<video style="width: 100%" poster="<%= video_info.has_key?("iurlhq720") ? video_info["iurlhq720"] : video_info["iurlmq"] %>" controls> +<% fmt_stream.each do |fmt| %> + <source src="<%= fmt["url"] %>" type="<%= fmt["type"].split(";")[0] %>"> +<% end %> +</video> +<h1><%= video_info["title"] %></h1> +<div class="pure-g"> + <div class="pure-u-1 pure-u-md-1-5"> + <p>+ <%= likes %></p> + <p>- <%= dislikes %></p> + </div> + <div class="pure-u-1 pure-u-md-3-5"> + <p>Views : <%= video_info["view_count"] %></p> + <p>Rating : <%= video_info["avg_rating"] %></p> + <p>Calculated Rating : <%= calculated_rating %></p> + <p>Engagement : <%= engagement %>%</p> + </div> + <div class="pure-u-1 pure-u-md-1-5"> + <% fmt_stream.each do |fmt| %> + <p><%= fmt["quality"] %></p> + <% end %> + </div> +</div>
\ No newline at end of file diff --git a/src/visor.cr b/src/visor.cr index 1b9a9b2d..1a484c38 100644 --- a/src/visor.cr +++ b/src/visor.cr @@ -3,20 +3,143 @@ require "json" require "kemal" require "pg" require "xml" -require "./url_encoded" + +class AdaptiveFmts + JSON.mapping( + clen: Int32, + url: String, + lmt: Int64, + index: String, + fps: Int32, + itag: Int32, + projection_type: Int32, + size: String, + init: String, + quality_label: String, + bitrate: Int32, + type: String + ) +end + +class URLEncodedFmtStreamMap + JSON.mapping( + url: String, + itag: Int32, + fallback_host: String, + quality: String, + type: String + ) +end + +class CaptionTracks + JSON.mapping( + v: String, + lc: String, + t: String, + u: String + ) +end + +class CaptionTranslationLanguages + JSON.mapping( + lc: String, + n: String + ) +end + +class VideoInfo + JSON.mapping( + cver: String, + length_seconds: Int32, + iurlhq720: String, + vm: String, + ypc_ad_indicator: Int32, + hash_cc: Bool, + dashmpd: String, + iv3_module: Int32, + iurlmq: String, + no_get_video_log: Int32, + cc_font: Int32, + allowed_ads: String, + oid: String, + iv_invideo_url: String, + cc_asr: Int32, + relative_loudness: Float64, + video_verticals: String, + default_audio_track_index: Int32, + loudness: Float64, + ptchn: String, + csn: String, + pltype: String, + author: String, + # caption_audio_tracks: + videostats_playback_base_url: String, + root_ve_type: String, + muted: Int32, + cc3_module: Int32, + adaptive_fmts: AdaptiveFmts, + fmt_list: Array(String), + allow_embed: Int32, + iurlhq: String, + use_cipher_signature: Bool, + status: String, + video_id: String, + idpj: Int32, + iurlhmaxres: String, + short_view_count_text: String, + iv_load_policy: Int32, + plid: String, + vss_host: String, + ttsurl: String, + token: String, + account_playback_token: String, + of: String, + iurl: String, + iurlsd: String, + c: String, + timestamp: Int32, + url_encoded_fmt_stream_map: URLEncodedFmtStreamMap, + allow_ratings: Int32, + view_count: Int64, + title: String, + caption_tracks: CaptionTracks, + fexp: Array(String), + storyboard_spec: String, + keywords: Array(String), + ucid: String, + remarketing_url: String, + caption_translation_languages: CaptionTranslationLanguages, + avg_rating: Float64, + is_listed: Int32, + ptk: String, + cl: Int32, + watermark: Array(String), + ldpj: Int32, + tmi: Int32, + eventid: String, + thumbnail_url: String + ) +end + macro templated(filename) - render "views/#{{{filename}}}.ecr", "views/layout.ecr" + render "src/views/#{{{filename}}}.ecr", "src/views/layout.ecr" end context = OpenSSL::SSL::Context::Client.insecure -fmt_file = File.open("temp/fmt_stream") +client = HTTP::Client.new("www.youtube.com", 443, context) + + +video_id = "Vufba_ZcoR0" +video_info = client.get("/get_video_info?video_id=#{video_id}&el=info&ps=default&eurl=&gl=US&hl=en").body + +p VideoInfo.from_json(video_info) + get "/" do |env| templated "index" end - get "/watch/:video_id" do |env| video_id = env.params.url["video_id"] @@ -31,12 +154,6 @@ get "/watch/:video_id" do |env| fmt_stream << HTTP::Params.parse(string) end - File.write("temp/#{video_id}", video_info) - File.write("temp/#{video_id}_manifest", video_info["dashmpd"]) - File.open("temp/#{video_id}_fmt_stream_0", "a+").puts fmt_stream[0]["url"] - File.open("temp/#{video_id}_fmt_stream_1", "a+").puts fmt_stream[1]["url"] - File.open("temp/#{video_id}_fmt_stream_2", "a+").puts fmt_stream[2]["url"] - File.open("temp/#{video_id}_fmt_stream_3", "a+").puts fmt_stream[3]["url"] fmt_stream.reverse! # We want lowest quality first # css query [title="I like this"] > span likes = doc.xpath_node(%q(//button[@title="I like this"]/span)) @@ -54,7 +171,7 @@ get "/watch/:video_id" do |env| dislikes = 1 end - engagement = ((dislikes.to_f32 + likes.to_f32)*100 / video_info["view_count"].to_i).to_i + engagement = ((dislikes.to_f32 + likes.to_f32)*100 / video_info["view_count"].to_f32).significant(2) calculated_rating = likes.to_f32/(likes.to_f32 + dislikes.to_f32)*4 + 1 templated "watch" |
