grid row ui improvements, #build

Changed:
- Better styled grid row, hid controlls if not applicable
- Changed subtitle naming convention
- Timeout for search as you type
- move delete queue button to settings page
This commit is contained in:
simon 2022-05-31 16:40:54 +07:00
commit 19d9af821d
No known key found for this signature in database
GPG Key ID: 2C15AA5E89985DD4
13 changed files with 78 additions and 53 deletions

View File

@ -269,9 +269,12 @@ class PendingList(PendingIndex):
"vid_thumb_url": vid["thumbnail"], "vid_thumb_url": vid["thumbnail"],
"title": vid["title"], "title": vid["title"],
"channel_id": vid["channel_id"], "channel_id": vid["channel_id"],
"channel_indexed": vid["channel_id"] in self.all_channels,
"duration": duration_str, "duration": duration_str,
"published": published, "published": published,
"timestamp": int(datetime.now().strftime("%s")), "timestamp": int(datetime.now().strftime("%s")),
} }
if self.all_channels:
youtube_details.update(
{"channel_indexed": vid["channel_id"] in self.all_channels}
)
return youtube_details return youtube_details

View File

@ -30,7 +30,8 @@ class YtWrap:
"""build yt-dlp obs""" """build yt-dlp obs"""
self.obs = self.OBS_BASE.copy() self.obs = self.OBS_BASE.copy()
self.obs.update(self.obs_request) self.obs.update(self.obs_request)
self.add_cookie() if self.config:
self.add_cookie()
def add_cookie(self): def add_cookie(self):
"""add cookie if enabled""" """add cookie if enabled"""

View File

@ -153,6 +153,7 @@ class Reindex:
date_downloaded = video.json_data["date_downloaded"] date_downloaded = video.json_data["date_downloaded"]
channel_dict = video.json_data["channel"] channel_dict = video.json_data["channel"]
playlist = video.json_data.get("playlist") playlist = video.json_data.get("playlist")
subtitles = video.json_data.get("subtitles")
# get new # get new
video.build_json() video.build_json()
@ -160,7 +161,7 @@ class Reindex:
video.deactivate() video.deactivate()
return return
video.delete_subtitles() video.delete_subtitles(subtitles=subtitles)
video.check_subtitles() video.check_subtitles()
# add back # add back

View File

@ -67,7 +67,7 @@ class YoutubeSubtitle:
return False return False
video_media_url = self.video.json_data["media_url"] video_media_url = self.video.json_data["media_url"]
media_url = video_media_url.replace(".mp4", f"-{lang}.vtt") media_url = video_media_url.replace(".mp4", f".{lang}.vtt")
all_formats = all_subtitles.get(lang) all_formats = all_subtitles.get(lang)
if not all_formats: if not all_formats:
return False return False
@ -103,7 +103,7 @@ class YoutubeSubtitle:
return False return False
video_media_url = self.video.json_data["media_url"] video_media_url = self.video.json_data["media_url"]
media_url = video_media_url.replace(".mp4", f"-{lang}.vtt") media_url = video_media_url.replace(".mp4", f".{lang}.vtt")
all_formats = all_subtitles.get(lang) all_formats = all_subtitles.get(lang)
if not all_formats: if not all_formats:
# no user subtitles found # no user subtitles found
@ -152,15 +152,19 @@ class YoutubeSubtitle:
"""send subtitle to es for indexing""" """send subtitle to es for indexing"""
_, _ = ElasticWrap("_bulk").post(data=query_str, ndjson=True) _, _ = ElasticWrap("_bulk").post(data=query_str, ndjson=True)
def delete(self): def delete(self, subtitles=False):
"""delete subtitles from index and filesystem""" """delete subtitles from index and filesystem"""
youtube_id = self.video.youtube_id youtube_id = self.video.youtube_id
# delete files
videos_base = self.video.config["application"]["videos"] videos_base = self.video.config["application"]["videos"]
if not self.video.json_data.get("subtitles"): # delete files
return if subtitles:
files = [i["media_url"] for i in subtitles]
else:
if not self.video.json_data.get("subtitles"):
return
files = [i["media_url"] for i in self.video.json_data["subtitles"]]
files = [i["media_url"] for i in self.video.json_data["subtitles"]]
for file_name in files: for file_name in files:
file_path = os.path.join(videos_base, file_name) file_path = os.path.join(videos_base, file_name)
try: try:
@ -594,10 +598,10 @@ class YoutubeVideo(YouTubeItem, YoutubeSubtitle):
) )
playlist.upload_to_es() playlist.upload_to_es()
def delete_subtitles(self): def delete_subtitles(self, subtitles=False):
"""delete indexed subtitles""" """delete indexed subtitles"""
print(f"{self.youtube_id}: delete subtitles") print(f"{self.youtube_id}: delete subtitles")
YoutubeSubtitle(self).delete() YoutubeSubtitle(self).delete(subtitles=subtitles)
def _get_ryd_stats(self): def _get_ryd_stats(self):
"""get optional stats from returnyoutubedislikeapi.com""" """get optional stats from returnyoutubedislikeapi.com"""

View File

@ -145,9 +145,12 @@
<img src="{% static 'img/icon-sort.svg' %}" alt="sort-icon" onclick="showForm()" id="animate-icon"> <img src="{% static 'img/icon-sort.svg' %}" alt="sort-icon" onclick="showForm()" id="animate-icon">
{% if view_style == "grid" %} {% if view_style == "grid" %}
<div class="grid-count"> <div class="grid-count">
<span>{{ grid_items }}</span> {% if grid_items < 7 %}
<img src="{% static 'img/icon-add.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"1"}}" alt="grid plus row"> <img src="{% static 'img/icon-add.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"1"}}" alt="grid plus row">
<img src="{% static 'img/icon-substract.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"-1"}}" alt="grid minus row"> {% endif %}
{% if grid_items > 3 %}
<img src="{% static 'img/icon-substract.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"-1"}}" alt="grid minus row">
{% endif %}
</div> </div>
{% endif %} {% endif %}
<img src="{% static 'img/icon-gridview.svg' %}" onclick="changeView(this)" data-origin="home" data-value="grid" alt="grid view"> <img src="{% static 'img/icon-gridview.svg' %}" onclick="changeView(this)" data-origin="home" data-value="grid" alt="grid view">

View File

@ -45,15 +45,6 @@
<img src="{% static 'img/icon-listview.svg' %}" onclick="changeView(this)" data-origin="downloads" data-value="list" alt="list view"> <img src="{% static 'img/icon-listview.svg' %}" onclick="changeView(this)" data-origin="downloads" data-value="list" alt="list view">
</div> </div>
</div> </div>
<div class="title-split">
{% if show_ignored_only %}
<h2>Ignored from download</h2>
<button onclick="deleteQueue(this)" data-id="ignore" title="Delete all previously ignored videos from the queue">Delete all ignored</button>
{% else %}
<h2>Download queue</h2>
<button onclick="deleteQueue(this)" data-id="pending" title="Delete all pending videos from the queue">Delete all queued</button>
{% endif %}
</div>
<h3>Total videos: {{ max_hits }}{% if max_hits == 10000 %}+{% endif %}</h3> <h3>Total videos: {{ max_hits }}{% if max_hits == 10000 %}+{% endif %}</h3>
<div class="dl-list {{ view_style }}"> <div class="dl-list {{ view_style }}">
{% if results %} {% if results %}

View File

@ -76,9 +76,12 @@
<img src="{% static 'img/icon-sort.svg' %}" alt="sort-icon" onclick="showForm()" id="animate-icon"> <img src="{% static 'img/icon-sort.svg' %}" alt="sort-icon" onclick="showForm()" id="animate-icon">
{% if view_style == "grid" %} {% if view_style == "grid" %}
<div class="grid-count"> <div class="grid-count">
<span>{{ grid_items }}</span> {% if grid_items < 7 %}
<img src="{% static 'img/icon-add.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"1"}}" alt="grid plus row"> <img src="{% static 'img/icon-add.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"1"}}" alt="grid plus row">
<img src="{% static 'img/icon-substract.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"-1"}}" alt="grid minus row"> {% endif %}
{% if grid_items > 3 %}
<img src="{% static 'img/icon-substract.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"-1"}}" alt="grid minus row">
{% endif %}
</div> </div>
{% endif %} {% endif %}
<img src="{% static 'img/icon-gridview.svg' %}" onclick="changeView(this)" data-origin="home" data-value="grid" alt="grid view"> <img src="{% static 'img/icon-gridview.svg' %}" onclick="changeView(this)" data-origin="home" data-value="grid" alt="grid view">

View File

@ -80,9 +80,12 @@
<div class="view-icons"> <div class="view-icons">
{% if view_style == "grid" %} {% if view_style == "grid" %}
<div class="grid-count"> <div class="grid-count">
<span>{{ grid_items }}</span> {% if grid_items < 7 %}
<img src="{% static 'img/icon-add.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"1"}}" alt="grid plus row"> <img src="{% static 'img/icon-add.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"1"}}" alt="grid plus row">
<img src="{% static 'img/icon-substract.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"-1"}}" alt="grid minus row"> {% endif %}
{% if grid_items > 3 %}
<img src="{% static 'img/icon-substract.svg' %}" onclick="changeGridItems(this)" data-value="{{ grid_items|add:"-1"}}" alt="grid minus row">
{% endif %}
</div> </div>
{% endif %} {% endif %}
<img src="{% static 'img/icon-gridview.svg' %}" onclick="changeView(this)" data-origin="home" data-value="grid" alt="grid view"> <img src="{% static 'img/icon-gridview.svg' %}" onclick="changeView(this)" data-origin="home" data-value="grid" alt="grid view">

View File

@ -1,7 +1,7 @@
{% extends "home/base.html" %} {% extends "home/base.html" %}
{% block content %} {% block content %}
<div id="player" class="player-wrapper"></div> <div id="player" class="player-wrapper"></div>
<div class="boxed-content"> <div class="boxed-content {% if all_styles.home == "grid" %}boxed-{{ grid_items }}{% endif %}">
<div class="title-bar"> <div class="title-bar">
<h1>Search your Archive</h1> <h1>Search your Archive</h1>
</div> </div>
@ -10,7 +10,7 @@
</div> </div>
<div class="multi-search-result"> <div class="multi-search-result">
<h2>Video Results</h2> <h2>Video Results</h2>
<div id="video-results" class="video-list {{ all_styles.home }}"> <div id="video-results" class="video-list {{ all_styles.home }} {% if all_styles.home == "grid" %}grid-{{ grid_items }}{% endif %}">
<p>No videos found.</p> <p>No videos found.</p>
</div> </div>
</div> </div>

View File

@ -269,6 +269,12 @@
<div class="title-bar"> <div class="title-bar">
<h1>Actions</h1> <h1>Actions</h1>
</div> </div>
<div class="settings-group">
<h2>Delete download queue</h2>
<p>Delete your pending or previously ignored videos from your download queue.<p>
<button onclick="deleteQueue(this)" id="ignore-button" data-id="ignore" title="Delete all previously ignored videos from the queue">Delete all ignored</button>
<button onclick="deleteQueue(this)" id="pending-button" data-id="pending" title="Delete all pending videos from the queue">Delete all queued</button>
</div>
<div class="settings-group"> <div class="settings-group">
<h2>Manual media files import.</h2> <h2>Manual media files import.</h2>
<p>Add files to the <span class="settings-current">cache/import</span> folder. Make sure to follow the instructions in the Github <a href="https://github.com/tubearchivist/tubearchivist/wiki/Settings" target="_blank">Wiki</a>.</p> <p>Add files to the <span class="settings-current">cache/import</span> folder. Make sure to follow the instructions in the Github <a href="https://github.com/tubearchivist/tubearchivist/wiki/Settings" target="_blank">Wiki</a>.</p>

View File

@ -1,5 +1,5 @@
beautifulsoup4==4.11.1 beautifulsoup4==4.11.1
celery==5.2.6 celery==5.2.7
Django==4.0.4 Django==4.0.4
django-cors-headers==3.12.0 django-cors-headers==3.12.0
djangorestframework==3.13.1 djangorestframework==3.13.1

View File

@ -346,14 +346,20 @@ button:hover {
justify-content: end; justify-content: end;
} }
.view-icons img, .view-icons img {
.grid-count img {
width: 30px; width: 30px;
margin: 5px 10px; margin: 5px 10px;
cursor: pointer; cursor: pointer;
filter: var(--img-filter); filter: var(--img-filter);
} }
.grid-count img {
width: 15px;
margin: 5px;
cursor: pointer;
filter: var(--img-filter);
}
#hidden-form { #hidden-form {
display: none; display: none;
} }

View File

@ -203,10 +203,10 @@ function deleteQueue(button) {
var to_delete = button.getAttribute('data-id'); var to_delete = button.getAttribute('data-id');
var payload = JSON.stringify({'deleteQueue': to_delete}); var payload = JSON.stringify({'deleteQueue': to_delete});
sendPost(payload); sendPost(payload);
setTimeout(function(){ // clear button
location.reload(); var message = document.createElement('p');
return false; message.innerText = 'deleting download queue: ' + to_delete;
}, 1000); document.getElementById(button.id).replaceWith(message);
} }
function stopQueue() { function stopQueue() {
@ -785,21 +785,25 @@ function setProgressBar(videoId, currentTime, duration) {
} }
// multi search form // multi search form
let searchTimeout = null;
function searchMulti(query) { function searchMulti(query) {
if (query.length > 1) { clearTimeout(searchTimeout);
var payload = JSON.stringify({'multi_search': query}); searchTimeout = setTimeout(function () {
var http = new XMLHttpRequest(); if (query.length > 1) {
http.onreadystatechange = function() { var payload = JSON.stringify({'multi_search': query});
if (http.readyState === 4) { var http = new XMLHttpRequest();
allResults = JSON.parse(http.response).results; http.onreadystatechange = function() {
populateMultiSearchResults(allResults); if (http.readyState === 4) {
} allResults = JSON.parse(http.response).results;
}; populateMultiSearchResults(allResults);
http.open("POST", "/process/", true); }
http.setRequestHeader("X-CSRFToken", getCookie("csrftoken")); };
http.setRequestHeader("Content-type", "application/json"); http.open("POST", "/process/", true);
http.send(payload); http.setRequestHeader("X-CSRFToken", getCookie("csrftoken"));
} http.setRequestHeader("Content-type", "application/json");
http.send(payload);
}
}, 500);
} }
function getViewDefaults(view) { function getViewDefaults(view) {