summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOmar Roth <omarroth@hotmail.com>2018-07-31 21:34:00 -0500
committerGitHub <noreply@github.com>2018-07-31 21:34:00 -0500
commitcdd644ded72152ea47babd617c265a1fc351a080 (patch)
tree313c3cad7bd2f1266041cda57070e6d155bc028c /src
parent4acc09f30dd20fcb24bfaaefb6ed3ceccf2de054 (diff)
parentb5bbf1b9f2f724601a7c55dfe2acac4ac9ab93ba (diff)
downloadinvidious-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.cr52
-rw-r--r--src/invidious/helpers.cr18
-rw-r--r--src/invidious/views/embed.ecr78
-rw-r--r--src/invidious/views/watch.ecr42
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('"', "&quot;").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++ ) {