diff options
| author | Omar Roth <omarroth@hotmail.com> | 2018-07-31 21:34:00 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-31 21:34:00 -0500 |
| commit | cdd644ded72152ea47babd617c265a1fc351a080 (patch) | |
| tree | 313c3cad7bd2f1266041cda57070e6d155bc028c /src | |
| parent | 4acc09f30dd20fcb24bfaaefb6ed3ceccf2de054 (diff) | |
| parent | b5bbf1b9f2f724601a7c55dfe2acac4ac9ab93ba (diff) | |
| download | invidious-cdd644ded72152ea47babd617c265a1fc351a080.tar.gz invidious-cdd644ded72152ea47babd617c265a1fc351a080.tar.bz2 invidious-cdd644ded72152ea47babd617c265a1fc351a080.zip | |
Merge pull request #55 from omarroth/share-button
Add share button and markers
Diffstat (limited to 'src')
| -rw-r--r-- | src/invidious.cr | 52 | ||||
| -rw-r--r-- | src/invidious/helpers.cr | 18 | ||||
| -rw-r--r-- | src/invidious/views/embed.ecr | 78 | ||||
| -rw-r--r-- | src/invidious/views/watch.ecr | 42 |
4 files changed, 158 insertions, 32 deletions
diff --git a/src/invidious.cr b/src/invidious.cr index 7e181bd9..4b18f681 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -287,7 +287,7 @@ get "/watch" do |env| subscriptions ||= [] of String autoplay = env.params.query["autoplay"]?.try &.to_i - video_loop = env.params.query["video_loop"]?.try &.to_i + video_loop = env.params.query["loop"]?.try &.to_i if preferences autoplay ||= preferences.autoplay.to_unsafe @@ -430,6 +430,16 @@ get "/watch" do |env| description = " " end + if Kemal.config.ssl || CONFIG.https_only + scheme = "https://" + else + scheme = "http://" + end + host = env.request.headers["Host"] + host_url = "#{scheme}#{host}" + host_params = env.request.query_params + host_params.delete_all("v") + thumbnail = "https://i.ytimg.com/vi/#{id}/mqdefault.jpg" templated "watch" @@ -1287,6 +1297,10 @@ get "/embed/:id" do |env| video_loop = env.params.query["loop"]?.try &.to_i video_loop ||= 0 + autoplay = autoplay == 1 + video_loop = video_loop == 1 + controls = controls == 1 + begin video = get_video(id, PG_DB) rescue ex @@ -1294,6 +1308,20 @@ get "/embed/:id" do |env| next templated "error" end + if video.info["hlsvp"]? + hlsvp = video.info["hlsvp"] + + if Kemal.config.ssl || CONFIG.https_only + scheme = "https://" + else + scheme = "http://" + end + host = env.request.headers["Host"] + url = "#{scheme}#{host}" + + hlsvp = hlsvp.gsub("https://manifest.googlevideo.com", url) + end + fmt_stream = [] of HTTP::Params video.info["url_encoded_fmt_stream_map"].split(",") do |string| if !string.empty? @@ -1339,6 +1367,26 @@ get "/embed/:id" do |env| next env.redirect url end + video.description = fill_links(video.description, "https", "www.youtube.com") + video.description = add_alt_links(video.description) + + description = video.description.gsub("<br>", " ") + description = description.gsub("<br/>", " ") + description = XML.parse_html(description).content[0..200].gsub('"', """).gsub("\n", " ").strip(" ") + if description.empty? + description = " " + end + + if Kemal.config.ssl || CONFIG.https_only + scheme = "https://" + else + scheme = "http://" + end + host = env.request.headers["Host"] + host_url = "#{scheme}#{host}" + host_params = env.request.query_params + host_params.delete_all("v") + thumbnail = "https://i.ytimg.com/vi/#{id}/mqdefault.jpg" rendered "embed" @@ -2792,7 +2840,7 @@ get "/:id" do |env| params = params.join("&") url = "/watch?v=#{id}" - if params + if !params.empty? url += "&#{params}" end diff --git a/src/invidious/helpers.cr b/src/invidious/helpers.cr index 40eeb52f..3cae652e 100644 --- a/src/invidious/helpers.cr +++ b/src/invidious/helpers.cr @@ -891,16 +891,16 @@ def decode_time(string) time = string.try &.to_f? if !time - hours = /(?<hours>\d+)h/.match(string).try &.["hours"].try &.to_i + hours = /(?<hours>\d+)h/.match(string).try &.["hours"].try &.to_f hours ||= 0 - minutes = /(?<minutes>\d+)m(?!s)/.match(string).try &.["minutes"].try &.to_i + minutes = /(?<minutes>\d+)m(?!s)/.match(string).try &.["minutes"].try &.to_f minutes ||= 0 - seconds = /(?<seconds>\d+)s/.match(string).try &.["seconds"].try &.to_i + seconds = /(?<seconds>\d+)s/.match(string).try &.["seconds"].try &.to_f seconds ||= 0 - millis = /(?<millis>\d+)ms/.match(string).try &.["millis"].try &.to_i + millis = /(?<millis>\d+)ms/.match(string).try &.["millis"].try &.to_f millis ||= 0 time = hours * 3600 + minutes * 60 + seconds + millis / 1000 @@ -909,10 +909,12 @@ def decode_time(string) return time end -def decode_date(date : String) +def decode_date(string : String) # Time matches format "20 hours ago", "40 minutes ago"... - delta = date.split(" ")[0].to_i - case date + date = string.split(" ")[-3, 3] + delta = date[0].to_i + + case date[1] when .includes? "minute" delta = delta.minutes when .includes? "hour" @@ -926,7 +928,7 @@ def decode_date(date : String) when .includes? "year" delta = delta.years else - raise "Could not parse #{date}" + raise "Could not parse #{string}" end return Time.now - delta diff --git a/src/invidious/views/embed.ecr b/src/invidious/views/embed.ecr index e8df67fe..f3613247 100644 --- a/src/invidious/views/embed.ecr +++ b/src/invidious/views/embed.ecr @@ -7,10 +7,13 @@ <meta name="thumbnail" content="<%= thumbnail %>"> <link rel="stylesheet" href="https://unpkg.com/video.js@6.10.3/dist/video-js.min.css"> <link rel="stylesheet" href="https://unpkg.com/silvermine-videojs-quality-selector@1.1.2/dist/css/quality-selector.css"> +<link rel="stylesheet" href="https://unpkg.com/videojs-markers@1.0.1/dist/videojs.markers.min.css"> +<link rel="stylesheet" href="https://unpkg.com/videojs-share@1.1.0/dist/videojs-share.css"> <script src="https://unpkg.com/video.js@6.10.3/dist/video.min.js"></script> <script src="https://unpkg.com/videojs-hotkeys@0.2.21/videojs.hotkeys.min.js"></script> <script src="https://unpkg.com/silvermine-videojs-quality-selector@1.1.2/dist/js/silvermine-videojs-quality-selector.min.js"></script> -<script src="https://unpkg.com/videojs-offset@2.0.0-beta.2/dist/videojs-offset.min.js"></script> +<script src="https://unpkg.com/videojs-markers@1.0.1/dist/videojs-markers.min.js"></script> +<script src="https://unpkg.com/videojs-share@1.1.0/dist/videojs-share.min.js"></script> <title><%= video.title %> - Invidious</title> </head> @@ -29,23 +32,31 @@ video, #my_video, .video-js, .vjs-default-skin } </style> +<% if hlsvp %> +<script src="https://unpkg.com/videojs-contrib-hls@5.14.1/dist/videojs-contrib-hls.min.js"></script> +<% end %> + <video playsinline poster="<%= thumbnail %>" title="<%= HTML.escape(video.title) %>" id="player" - <% if autoplay == 1 %>autoplay<% end %> - <% if controls == 1 %>controls<% end %> - <% if video_loop == 1 %>loop<% end %> + <% if autoplay %>autoplay<% end %> + <% if controls %>controls<% end %> + <% if video_loop %>loop<% end %> class="video-js vjs-default-skin"> - <% if listen %> - <% audio_streams.each_with_index do |fmt, i| %> - <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["bitrate"] %>k" selected="<%= i == 0 ? true : false %>"> - <% end %> + <% if hlsvp %> + <source src="<%= hlsvp %>" type="application/x-mpegURL"> <% else %> - <% fmt_stream.each_with_index do |fmt, i| %> - <% if quality != "hd720" %> - <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["label"] %>" selected="<%= quality == fmt["label"].split(" - ")[0] %>"> - <% else %> - <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["label"] %>" selected="<%= i == 0 ? true : false %>"> + <% if listen %> + <% audio_streams.each_with_index do |fmt, i| %> + <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["bitrate"] %>k" selected="<%= i == 0 ? true : false %>"> <% end %> - <% end %> + <% else %> + <% fmt_stream.each_with_index do |fmt, i| %> + <% if quality != "hd720" %> + <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["label"] %>" selected="<%= quality == fmt["label"].split(" - ")[0] %>"> + <% else %> + <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["label"] %>" selected="<%= i == 0 ? true : false %>"> + <% end %> + <% end %> + <% end %> <% end %> </video> @@ -59,18 +70,28 @@ var options = { 'volumePanel', 'progressControl', 'remainingTimeDisplay', + 'captionsButton', 'qualitySelector', 'playbackRateMenuButton', 'fullscreenToggle', ], }, }; + +var shareOptions = { + socials: ["fb", "tw", "reddit", "mail"], + + url: "<%= host_url %>/<%= video.id %>?<%= host_params %>", + title: "<%= video.title %>", + description: "<%= description %>", + image: '<%= thumbnail %>' +}; + var player = videojs('player', options, function() { this.hotkeys({ volumeStep: 0.1, seekStep: 5, enableModifiersForNumbers: false, - enableVolumeScroll: false, customKeys: { play: { key: function(e) { @@ -107,11 +128,32 @@ var player = videojs('player', options, function() { }); }); -player.offset({ - start: <%= video_start %>, - end: <%= video_end %> +player.share(shareOptions); + +<% if video_start > 0 || video_end > 0 %> +player.markers({ + onMarkerReached: function(marker) { + if (marker.text === 'End') { + if (player.loop()) { + player.markers.prev('Start'); + } else { + player.pause(); + } + } + }, + markers: [ + {time: <%= video_start %>, text: 'Start'}, + <% if video_end < 0 %> + {time: <%= video.info["length_seconds"].to_f - 0.5 %>, text: 'End'} + <% else %> + {time: <%= video_end %>, text: 'End'} + <% end %> + ] }); +player.currentTime(<%= video_start %>); +<% end %> + <% if !listen %> var currentSources = player.currentSources(); for ( var i = 0; i < currentSources.length; i++ ) { diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index dfb94f9b..6cbcb19f 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -24,10 +24,13 @@ <meta name="twitter:player:height" content="720"> <link rel="stylesheet" href="https://unpkg.com/video.js@6.10.3/dist/video-js.min.css"> <link rel="stylesheet" href="https://unpkg.com/silvermine-videojs-quality-selector@1.1.2/dist/css/quality-selector.css"> +<link rel="stylesheet" href="https://unpkg.com/videojs-markers@1.0.1/dist/videojs.markers.min.css"> +<link rel="stylesheet" href="https://unpkg.com/videojs-share@1.1.0/dist/videojs-share.css"> <script src="https://unpkg.com/video.js@6.10.3/dist/video.min.js"></script> <script src="https://unpkg.com/videojs-hotkeys@0.2.21/videojs.hotkeys.min.js"></script> <script src="https://unpkg.com/silvermine-videojs-quality-selector@1.1.2/dist/js/silvermine-videojs-quality-selector.min.js"></script> -<script src="https://unpkg.com/videojs-offset@2.0.0-beta.2/dist/videojs-offset.min.js"></script> +<script src="https://unpkg.com/videojs-markers@1.0.1/dist/videojs-markers.min.js"></script> +<script src="https://unpkg.com/videojs-share@1.1.0/dist/videojs-share.min.js"></script> <title><%= video.title %> - Invidious</title> <% end %> @@ -85,6 +88,15 @@ var options = { }, }; +var shareOptions = { + socials: ["fb", "tw", "reddit", "mail"], + + url: "<%= host_url %>/<%= video.id %>?<%= host_params %>", + title: "<%= video.title %>", + description: "<%= description %>", + image: '<%= thumbnail %>' +}; + var player = videojs('player', options, function() { this.hotkeys({ volumeStep: 0.1, @@ -126,15 +138,37 @@ var player = videojs('player', options, function() { }); }); +player.share(shareOptions); + <% if preferences %> player.volume(<%= preferences.volume.to_f / 100 %>); player.playbackRate(<%= preferences.speed %>); <% end %> -player.offset({ - start: <%= video_start %>, - end: <%= video_end %> + +<% if video_start > 0 || video_end > 0 %> +player.markers({ + onMarkerReached: function(marker) { + if (marker.text === 'End') { + if (player.loop()) { + player.markers.prev('Start'); + } else { + player.pause(); + } + } + }, + markers: [ + {time: <%= video_start %>, text: 'Start'}, + <% if video_end < 0 %> + {time: <%= video.info["length_seconds"].to_f - 0.5 %>, text: 'End'} + <% else %> + {time: <%= video_end %>, text: 'End'} + <% end %> + ] }); +player.currentTime(<%= video_start %>); +<% end %> + <% if !listen %> var currentSources = player.currentSources(); for ( var i = 0; i < currentSources.length; i++ ) { |
