douyin.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """Douyin formal acquisition adapter."""
  2. from __future__ import annotations
  3. from typing import Any
  4. from acquisition.crawler import fetch_post_detail
  5. from acquisition.platforms.base import PlatformCandidate, PlatformItem
  6. from acquisition.search import search_keyword
  7. from core.config import Settings
  8. class DouyinAdapter:
  9. platform = "douyin"
  10. def search(
  11. self,
  12. query: str,
  13. *,
  14. settings: Settings,
  15. limit: int,
  16. rate_limiter: Any,
  17. ) -> list[PlatformCandidate]:
  18. ids = search_keyword(
  19. query,
  20. platform=self.platform,
  21. content_type="视频",
  22. limit=limit,
  23. settings=settings,
  24. rate_limiter=rate_limiter,
  25. )
  26. return [
  27. PlatformCandidate(
  28. rank=i,
  29. platform=self.platform,
  30. source_id=content_id,
  31. raw={"id": content_id},
  32. )
  33. for i, content_id in enumerate(ids, start=1)
  34. ]
  35. def fetch_detail(
  36. self,
  37. candidate: PlatformCandidate,
  38. *,
  39. settings: Settings,
  40. rate_limiter: Any,
  41. ) -> PlatformItem:
  42. post = fetch_post_detail(
  43. candidate.source_id,
  44. settings=settings,
  45. rate_limiter=rate_limiter,
  46. )
  47. return PlatformItem(
  48. platform=self.platform,
  49. source_id=post.content_id or candidate.source_id,
  50. url=post.url or candidate.url,
  51. content_type=post.content_type or "video",
  52. title=post.title or candidate.title,
  53. author=post.author_name or candidate.author,
  54. body_text=post.body_text or "",
  55. image_urls=post.image_urls,
  56. video_urls=post.video_urls,
  57. raw=post.raw if isinstance(post.raw, dict) else {},
  58. )