Add API endpoint for searching (#303)
* Add API endpoint for searching + use it in frontend * Fix linting warnings * Remove multisearch API call * Avoid 301 and fix up multiline comment
This commit is contained in:
parent
25877cf016
commit
57a9fff82b
|
@ -12,6 +12,7 @@ from api.views import (
|
||||||
PlaylistApiListView,
|
PlaylistApiListView,
|
||||||
PlaylistApiVideoView,
|
PlaylistApiVideoView,
|
||||||
PlaylistApiView,
|
PlaylistApiView,
|
||||||
|
SearchView,
|
||||||
TaskApiView,
|
TaskApiView,
|
||||||
VideoApiListView,
|
VideoApiListView,
|
||||||
VideoApiView,
|
VideoApiView,
|
||||||
|
@ -93,4 +94,9 @@ urlpatterns = [
|
||||||
CookieView.as_view(),
|
CookieView.as_view(),
|
||||||
name="api-cookie",
|
name="api-cookie",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"search/",
|
||||||
|
SearchView.as_view(),
|
||||||
|
name="api-search",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -5,6 +5,7 @@ from api.src.task_processor import TaskHandler
|
||||||
from home.src.download.queue import PendingInteract
|
from home.src.download.queue import PendingInteract
|
||||||
from home.src.download.yt_dlp_base import CookieHandler
|
from home.src.download.yt_dlp_base import CookieHandler
|
||||||
from home.src.es.connect import ElasticWrap
|
from home.src.es.connect import ElasticWrap
|
||||||
|
from home.src.frontend.searching import SearchForm
|
||||||
from home.src.index.generic import Pagination
|
from home.src.index.generic import Pagination
|
||||||
from home.src.index.video import SponsorBlock
|
from home.src.index.video import SponsorBlock
|
||||||
from home.src.ta.config import AppConfig
|
from home.src.ta.config import AppConfig
|
||||||
|
@ -526,3 +527,22 @@ class CookieView(ApiBaseView):
|
||||||
|
|
||||||
message = {"cookie_import": "done", "cookie_validated": validated}
|
message = {"cookie_import": "done", "cookie_validated": validated}
|
||||||
return Response(message)
|
return Response(message)
|
||||||
|
|
||||||
|
|
||||||
|
class SearchView(ApiBaseView):
|
||||||
|
"""resolves to /api/search/
|
||||||
|
GET: run a search with the string in the ?query parameter
|
||||||
|
"""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get(request):
|
||||||
|
"""handle get request
|
||||||
|
search through all indexes"""
|
||||||
|
search_query = request.GET.get("query", None)
|
||||||
|
if search_query is None:
|
||||||
|
return Response(
|
||||||
|
{"message": "no search query specified"}, status=400
|
||||||
|
)
|
||||||
|
print("searching for: " + search_query)
|
||||||
|
search_results = SearchForm().multi_search(search_query)
|
||||||
|
return Response(search_results)
|
||||||
|
|
|
@ -9,7 +9,6 @@ from home.src.download.subscriptions import (
|
||||||
ChannelSubscription,
|
ChannelSubscription,
|
||||||
PlaylistSubscription,
|
PlaylistSubscription,
|
||||||
)
|
)
|
||||||
from home.src.frontend.searching import SearchForm
|
|
||||||
from home.src.frontend.watched import WatchState
|
from home.src.frontend.watched import WatchState
|
||||||
from home.src.index.channel import YoutubeChannel
|
from home.src.index.channel import YoutubeChannel
|
||||||
from home.src.index.playlist import YoutubePlaylist
|
from home.src.index.playlist import YoutubePlaylist
|
||||||
|
@ -74,7 +73,6 @@ class PostData:
|
||||||
"db-backup": self._db_backup,
|
"db-backup": self._db_backup,
|
||||||
"db-restore": self._db_restore,
|
"db-restore": self._db_restore,
|
||||||
"fs-rescan": self._fs_rescan,
|
"fs-rescan": self._fs_rescan,
|
||||||
"multi_search": self._multi_search,
|
|
||||||
"delete-video": self._delete_video,
|
"delete-video": self._delete_video,
|
||||||
"delete-channel": self._delete_channel,
|
"delete-channel": self._delete_channel,
|
||||||
"delete-playlist": self._delete_playlist,
|
"delete-playlist": self._delete_playlist,
|
||||||
|
@ -286,13 +284,6 @@ class PostData:
|
||||||
rescan_filesystem.delay()
|
rescan_filesystem.delay()
|
||||||
return {"success": True}
|
return {"success": True}
|
||||||
|
|
||||||
def _multi_search(self):
|
|
||||||
"""search through all indexes"""
|
|
||||||
search_query = self.exec_val
|
|
||||||
print("searching for: " + search_query)
|
|
||||||
search_results = SearchForm().multi_search(search_query)
|
|
||||||
return search_results
|
|
||||||
|
|
||||||
def _delete_video(self):
|
def _delete_video(self):
|
||||||
"""delete media file, metadata and thumb"""
|
"""delete media file, metadata and thumb"""
|
||||||
youtube_id = self.exec_val
|
youtube_id = self.exec_val
|
||||||
|
|
|
@ -803,7 +803,6 @@ function searchMulti(query) {
|
||||||
clearTimeout(searchTimeout);
|
clearTimeout(searchTimeout);
|
||||||
searchTimeout = setTimeout(function () {
|
searchTimeout = setTimeout(function () {
|
||||||
if (query.length > 1) {
|
if (query.length > 1) {
|
||||||
var payload = JSON.stringify({'multi_search': query});
|
|
||||||
var http = new XMLHttpRequest();
|
var http = new XMLHttpRequest();
|
||||||
http.onreadystatechange = function() {
|
http.onreadystatechange = function() {
|
||||||
if (http.readyState === 4) {
|
if (http.readyState === 4) {
|
||||||
|
@ -811,10 +810,10 @@ function searchMulti(query) {
|
||||||
populateMultiSearchResults(response.results, response.queryType);
|
populateMultiSearchResults(response.results, response.queryType);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
http.open("POST", "/process/", true);
|
http.open("GET", `/api/search/?query=${query}`, true);
|
||||||
http.setRequestHeader("X-CSRFToken", getCookie("csrftoken"));
|
http.setRequestHeader("X-CSRFToken", getCookie("csrftoken"));
|
||||||
http.setRequestHeader("Content-type", "application/json");
|
http.setRequestHeader("Content-type", "application/json");
|
||||||
http.send(payload);
|
http.send();
|
||||||
}
|
}
|
||||||
}, 500);
|
}, 500);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue