diff --git a/tubearchivist/api/src/__init__.py b/tubearchivist/api/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tubearchivist/api/src/search_processor.py b/tubearchivist/api/src/search_processor.py new file mode 100644 index 0000000..91ccbb5 --- /dev/null +++ b/tubearchivist/api/src/search_processor.py @@ -0,0 +1,87 @@ +""" +Functionality: +- processing search results for frontend +- this is duplicated code from home.src.frontend.searching.SearchHandler +""" + +import urllib.parse + +from home.src.download.thumbnails import ThumbManager +from home.src.ta.helper import date_praser + + +class SearchProcess: + """process search results""" + + def __init__(self, response): + self.response = response + self.processed = False + + def process(self): + """dedect type and process""" + if "_source" in self.response.keys(): + # single + self.processed = self._process_result(self.response) + + elif "hits" in self.response.keys(): + # multiple + self.processed = [] + all_sources = self.response["hits"]["hits"] + for result in all_sources: + self.processed.append(self._process_result(result)) + + return self.processed + + def _process_result(self, result): + """dedect which type of data to process""" + index = result["_index"] + document_id = result["_id"] + processed = False + if index == "ta_video": + # process single video + print(f"{document_id}: processing video") + processed = self._process_video(result["_source"]) + if index == "ta_channel": + # process single channel + print(f"{document_id}: processing channel") + processed = self._process_channel(result["_source"]) + + return processed + + @staticmethod + def _process_channel(channel_dict): + """run on single channel""" + channel_id = channel_dict["channel_id"] + art_base = f"/cache/channels/{channel_id}" + date_str = date_praser(channel_dict["channel_last_refresh"]) + channel_dict.update( + { + "channel_last_refresh": date_str, + "channel_banner_url": f"{art_base}_banner.jpg", + "channel_thumb_url": f"{art_base}_thumb.jpg", + "channel_tvart_url": False, + } + ) + + return dict(sorted(channel_dict.items())) + + def _process_video(self, video_dict): + """run on single video dict""" + video_id = video_dict["youtube_id"] + media_url = urllib.parse.quote(video_dict["media_url"]) + vid_last_refresh = date_praser(video_dict["vid_last_refresh"]) + published = date_praser(video_dict["published"]) + vid_thumb_url = ThumbManager().vid_thumb_path(video_id) + channel = self._process_channel(video_dict["channel"]) + + video_dict.update( + { + "channel": channel, + "media_url": media_url, + "vid_last_refresh": vid_last_refresh, + "published": published, + "vid_thumb_url": vid_thumb_url, + } + ) + + return dict(sorted(video_dict.items())) diff --git a/tubearchivist/api/views.py b/tubearchivist/api/views.py index a01371c..423f591 100644 --- a/tubearchivist/api/views.py +++ b/tubearchivist/api/views.py @@ -1,5 +1,6 @@ """all API views""" +from api.src.search_processor import SearchProcess from home.src.download.thumbnails import ThumbManager from home.src.es.connect import ElasticWrap from home.src.ta.config import AppConfig @@ -36,7 +37,7 @@ class ApiBaseView(APIView): print(path) response, status_code = ElasticWrap(path).get() try: - self.response["data"] = response["_source"] + self.response["data"] = SearchProcess(response).process() except KeyError: print(f"item not found: {document_id}") self.response["data"] = False @@ -69,8 +70,7 @@ class ApiBaseView(APIView): """get a list of results""" print(self.search_base) response, status_code = ElasticWrap(self.search_base).get(data=data) - all_hits = response["hits"]["hits"] - self.response["data"] = [i["_source"] for i in all_hits] + self.response["data"] = SearchProcess(response).process() self.status_code = status_code