2023-08-22 21:55:02 +00:00
|
|
|
import asyncio
|
2025-01-20 07:03:56 -05:00
|
|
|
|
|
|
|
from django.core.cache import cache
|
2023-08-10 11:27:31 -04:00
|
|
|
|
2025-01-18 15:53:06 -05:00
|
|
|
from catalog.common import SiteManager
|
2025-01-20 07:03:56 -05:00
|
|
|
from catalog.common.models import ItemCategory
|
2024-12-08 19:33:05 +00:00
|
|
|
from catalog.search.models import ExternalSearchResultItem
|
2025-01-18 15:53:06 -05:00
|
|
|
from catalog.sites.fedi import FediverseInstance
|
2023-01-01 23:50:57 -05:00
|
|
|
|
|
|
|
|
2025-01-18 15:53:06 -05:00
|
|
|
class ExternalSources:
|
2023-08-22 21:55:02 +00:00
|
|
|
@classmethod
|
2025-01-18 15:53:06 -05:00
|
|
|
def search(
|
2025-01-20 07:03:56 -05:00
|
|
|
cls,
|
|
|
|
query: str,
|
|
|
|
page: int = 1,
|
|
|
|
category: str | None = None,
|
|
|
|
visible_categories: list[ItemCategory] = [],
|
2025-01-18 15:53:06 -05:00
|
|
|
) -> list[ExternalSearchResultItem]:
|
2025-01-20 07:03:56 -05:00
|
|
|
if not query or page < 1 or page > 10 or not query or len(query) > 100:
|
2025-01-18 15:53:06 -05:00
|
|
|
return []
|
|
|
|
if category in ["", None]:
|
|
|
|
category = "all"
|
2025-01-20 07:03:56 -05:00
|
|
|
page_size = 5 if category == "all" else 10
|
|
|
|
match category:
|
|
|
|
case "all":
|
|
|
|
cache_key = f"search_{','.join(visible_categories)}_{query}"
|
2025-01-20 07:09:40 -05:00
|
|
|
case "movietv":
|
2025-01-20 07:03:56 -05:00
|
|
|
cache_key = f"search_movie,tv_{query}"
|
|
|
|
case _:
|
|
|
|
cache_key = f"search_{category}_{query}"
|
|
|
|
results = cache.get("ext_" + cache_key, None)
|
|
|
|
if results is None:
|
|
|
|
tasks = FediverseInstance.search_tasks(query, page, category, page_size)
|
|
|
|
for site in SiteManager.get_sites_for_search():
|
|
|
|
tasks.append(site.search_task(query, page, category, page_size))
|
|
|
|
# loop = asyncio.get_event_loop()
|
|
|
|
loop = asyncio.new_event_loop()
|
|
|
|
asyncio.set_event_loop(loop)
|
|
|
|
results = []
|
|
|
|
for r in loop.run_until_complete(asyncio.gather(*tasks)):
|
|
|
|
results.extend(r)
|
|
|
|
cache.set("ext_" + cache_key, results, 300)
|
|
|
|
dedupe_urls = cache.get(cache_key, [])
|
|
|
|
results = [i for i in results if i.source_url not in dedupe_urls]
|
2023-08-22 21:55:02 +00:00
|
|
|
return results
|