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
pull/314/head
PrivateGER 2 years ago committed by GitHub
parent 25877cf016
commit 57a9fff82b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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…
Cancel
Save