2023-08-22 21:55:02 +00:00
|
|
|
import asyncio
|
2023-08-10 11:27:31 -04:00
|
|
|
import logging
|
|
|
|
|
2025-01-18 15:53:06 -05:00
|
|
|
from catalog.common import SiteManager
|
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
|
|
|
|
|
|
|
SEARCH_PAGE_SIZE = 5 # not all apis support page size
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
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(
|
|
|
|
cls, query: str, page: int = 1, category: str | None = None
|
|
|
|
) -> list[ExternalSearchResultItem]:
|
|
|
|
if not query or page < 1 or page > 10:
|
|
|
|
return []
|
|
|
|
if category in ["", None]:
|
|
|
|
category = "all"
|
|
|
|
tasks = FediverseInstance.search_tasks(query, page, category)
|
|
|
|
for site in SiteManager.get_sites_for_search():
|
|
|
|
tasks.append(site.search_task(query, page, category))
|
2023-08-22 21:55:02 +00:00
|
|
|
# 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)
|
|
|
|
return results
|