mirror of
https://github.com/iv-org/invidious
synced 2024-11-27 21:43:28 +01:00
Support adding video to playlist from watch page
This commit is contained in:
parent
2e378da922
commit
3f97bebd69
@ -55,6 +55,9 @@
|
|||||||
n2a(document.querySelectorAll('[data-onclick="mark_unwatched"]')).forEach(function (e) {
|
n2a(document.querySelectorAll('[data-onclick="mark_unwatched"]')).forEach(function (e) {
|
||||||
e.onclick = function () { mark_unwatched(e); };
|
e.onclick = function () { mark_unwatched(e); };
|
||||||
});
|
});
|
||||||
|
n2a(document.querySelectorAll('[data-onclick="add_playlist_video"]')).forEach(function (e) {
|
||||||
|
e.onclick = function () { add_playlist_video(e); };
|
||||||
|
});
|
||||||
n2a(document.querySelectorAll('[data-onclick="add_playlist_item"]')).forEach(function (e) {
|
n2a(document.querySelectorAll('[data-onclick="add_playlist_item"]')).forEach(function (e) {
|
||||||
e.onclick = function () { add_playlist_item(e); };
|
e.onclick = function () { add_playlist_item(e); };
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,29 @@
|
|||||||
var playlist_data = JSON.parse(document.getElementById('playlist_data').innerHTML);
|
var playlist_data = JSON.parse(document.getElementById('playlist_data').innerHTML);
|
||||||
|
|
||||||
|
function add_playlist_video(target) {
|
||||||
|
var select = target.parentNode.children[0].children[1];
|
||||||
|
var option = select.children[select.selectedIndex];
|
||||||
|
|
||||||
|
var url = '/playlist_ajax?action_add_video=1&redirect=false' +
|
||||||
|
'&video_id=' + target.getAttribute('data-id') +
|
||||||
|
'&playlist_id=' + option.getAttribute('data-plid');
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
xhr.responseType = 'json';
|
||||||
|
xhr.timeout = 10000;
|
||||||
|
xhr.open('POST', url, true);
|
||||||
|
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
|
||||||
|
xhr.onreadystatechange = function () {
|
||||||
|
if (xhr.readyState == 4) {
|
||||||
|
if (xhr.status == 200) {
|
||||||
|
option.innerText = '✓' + option.innerText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xhr.send('csrf_token=' + playlist_data.csrf_token);
|
||||||
|
}
|
||||||
|
|
||||||
function add_playlist_item(target) {
|
function add_playlist_item(target) {
|
||||||
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||||
tile.style.display = 'none';
|
tile.style.display = 'none';
|
||||||
|
@ -3131,9 +3131,7 @@ get "/feed/channel/:ucid" do |env|
|
|||||||
rss = YT_POOL.client &.get("/feeds/videos.xml?channel_id=#{channel.ucid}").body
|
rss = YT_POOL.client &.get("/feeds/videos.xml?channel_id=#{channel.ucid}").body
|
||||||
rss = XML.parse_html(rss)
|
rss = XML.parse_html(rss)
|
||||||
|
|
||||||
videos = [] of SearchVideo
|
videos = rss.xpath_nodes("//feed/entry").map do |entry|
|
||||||
|
|
||||||
rss.xpath_nodes("//feed/entry").each do |entry|
|
|
||||||
video_id = entry.xpath_node("videoid").not_nil!.content
|
video_id = entry.xpath_node("videoid").not_nil!.content
|
||||||
title = entry.xpath_node("title").not_nil!.content
|
title = entry.xpath_node("title").not_nil!.content
|
||||||
|
|
||||||
@ -3145,7 +3143,7 @@ get "/feed/channel/:ucid" do |env|
|
|||||||
description_html = entry.xpath_node("group/description").not_nil!.to_s
|
description_html = entry.xpath_node("group/description").not_nil!.to_s
|
||||||
views = entry.xpath_node("group/community/statistics").not_nil!.["views"].to_i64
|
views = entry.xpath_node("group/community/statistics").not_nil!.["views"].to_i64
|
||||||
|
|
||||||
videos << SearchVideo.new(
|
SearchVideo.new(
|
||||||
title: title,
|
title: title,
|
||||||
id: video_id,
|
id: video_id,
|
||||||
author: author,
|
author: author,
|
||||||
|
@ -732,9 +732,7 @@ def cache_annotation(db, id, annotations)
|
|||||||
body = XML.parse(annotations)
|
body = XML.parse(annotations)
|
||||||
nodeset = body.xpath_nodes(%q(/document/annotations/annotation))
|
nodeset = body.xpath_nodes(%q(/document/annotations/annotation))
|
||||||
|
|
||||||
if nodeset == 0
|
return if nodeset == 0
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
has_legacy_annotations = false
|
has_legacy_annotations = false
|
||||||
nodeset.each do |node|
|
nodeset.each do |node|
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
}.to_pretty_json
|
}.to_pretty_json
|
||||||
%>
|
%>
|
||||||
</script>
|
</script>
|
||||||
<script src="/js/playlist_widget.js"></script>
|
<script src="/js/playlist_widget.js?v=<%= ASSET_COMMIT %>"></script>
|
||||||
|
|
||||||
<div class="pure-g">
|
<div class="pure-g">
|
||||||
<% videos.each_slice(4) do |slice| %>
|
<% videos.each_slice(4) do |slice| %>
|
||||||
|
@ -76,7 +76,7 @@
|
|||||||
}.to_pretty_json
|
}.to_pretty_json
|
||||||
%>
|
%>
|
||||||
</script>
|
</script>
|
||||||
<script src="/js/playlist_widget.js"></script>
|
<script src="/js/playlist_widget.js?v=<%= ASSET_COMMIT %>"></script>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<div class="pure-g">
|
<div class="pure-g">
|
||||||
|
@ -101,6 +101,31 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<% if user %>
|
||||||
|
<form data-onsubmit="return_false" class="pure-form pure-form-stacked" action="/playlist_ajax" method="post">
|
||||||
|
<div class="pure-control-group">
|
||||||
|
<label for="playlist_id"><%= translate(locale, "Add to playlist: ") %></label>
|
||||||
|
<select style="width:100%" name="playlist_id" id="playlist_id">
|
||||||
|
<% PG_DB.query_all("SELECT id,title FROM playlists WHERE author = $1", user.email, as: {String, String}).each do |plid, title| %>
|
||||||
|
<option data-plid="<%= plid %>" value="<%= plid %>"><%= title %></option>
|
||||||
|
<% end %>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button data-onclick="add_playlist_video" data-id="<%= video.id %>" type="submit" class="pure-button pure-button-primary">
|
||||||
|
<b><%= translate(locale, "Add to playlist") %></b>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
<script id="playlist_data" type="application/json">
|
||||||
|
<%=
|
||||||
|
{
|
||||||
|
"csrf_token" => URI.encode_www_form(env.get?("csrf_token").try &.as(String) || "")
|
||||||
|
}.to_pretty_json
|
||||||
|
%>
|
||||||
|
</script>
|
||||||
|
<script src="/js/playlist_widget.js?v=<%= Time.utc.to_unix_ms %>"></script>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<% if CONFIG.dmca_content.includes?(video.id) || CONFIG.disabled?("downloads") %>
|
<% if CONFIG.dmca_content.includes?(video.id) || CONFIG.disabled?("downloads") %>
|
||||||
<p><%= translate(locale, "Download is disabled.") %></p>
|
<p><%= translate(locale, "Download is disabled.") %></p>
|
||||||
<% else %>
|
<% else %>
|
||||||
|
Loading…
Reference in New Issue
Block a user