get_cover.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from app.infra.shared.response import Response
  2. from app.infra.mapper import LongVideoDatabaseMapper, AigcDatabaseMapper
  3. class GetCoverService(Response):
  4. def __init__(self, pool, params):
  5. self.pool = pool
  6. self.params = params
  7. self.aigc_prefix = "http://res.cybertogether.net/"
  8. self.pq_prefix = "https://rescdn.yishihui.com/"
  9. self.suffix = "?x-oss-process=image/resize,m_fill,w_450,h_360/format,jpg"
  10. async def montage_cover(self, oss_key, pool_name):
  11. match pool_name:
  12. case "aigc":
  13. if oss_key.startswith("http"):
  14. return oss_key + self.suffix
  15. return self.aigc_prefix + oss_key + self.suffix
  16. case "long_video":
  17. if oss_key.startswith("http"):
  18. return oss_key + self.suffix
  19. return self.pq_prefix + oss_key + self.suffix
  20. case _:
  21. return None
  22. async def fetch_cover_info(self, pool_name, channel_content_id: str):
  23. match pool_name:
  24. case "aigc":
  25. fetch_response = await AigcDatabaseMapper.fetch_aigc_cover(self.pool, channel_content_id)
  26. if fetch_response:
  27. image_oss = fetch_response[0]["oss_object_key"]
  28. if image_oss:
  29. cover = await self.montage_cover(image_oss, "aigc")
  30. else:
  31. image_url = fetch_response[0]["image_url"]
  32. if not image_url:
  33. return await self.fetch_cover_info(
  34. "long_video", channel_content_id
  35. )
  36. else:
  37. cover = await self.montage_cover(image_url, "aigc")
  38. else:
  39. return await self.fetch_cover_info("long_video", channel_content_id)
  40. case "long_video":
  41. fetch_response = await LongVideoDatabaseMapper.fetch_long_video_cover(
  42. self.pool, channel_content_id
  43. )
  44. if fetch_response:
  45. image_oss = fetch_response[1]["image_path"]
  46. cover = await self.montage_cover(image_oss, "long_video")
  47. else:
  48. return self.error_response(
  49. error_code="402",
  50. error_message="can't find cover in pq",
  51. )
  52. case _:
  53. return self.error_response(
  54. error_code="403",
  55. error_message="pool_name is not supported",
  56. )
  57. return self.success_response(data={"cover": cover})
  58. async def get_cover(self, content_id: str, video_index: int, seed_video_id: str):
  59. if video_index == 2:
  60. return await self.fetch_cover_info("long_video", seed_video_id)
  61. channel_info = await AigcDatabaseMapper.fetch_channel_info(self.pool, content_id)
  62. if not channel_info:
  63. return self.error_response(
  64. error_code="402",
  65. error_message="can't find content info in aigc system",
  66. )
  67. channel_content_id = channel_info[0]["channel_content_id"]
  68. channel_type = channel_info[0]["channel"]
  69. match channel_type:
  70. case 5:
  71. return await self.fetch_cover_info("aigc", channel_content_id)
  72. case 6:
  73. return await self.fetch_cover_info("aigc", channel_content_id)
  74. case 10:
  75. return await self.fetch_cover_info("long_video", channel_content_id)
  76. case _:
  77. return self.error_response(
  78. error_code="403",
  79. error_message="channel_type is not supported",
  80. )
  81. async def deal(self):
  82. content_id = self.params.get("content_id")
  83. video_index = self.params.get("video_index")
  84. seed_video_id = self.params.get("seed_video_id")
  85. if not content_id:
  86. return self.error_response(
  87. error_code="401",
  88. error_message="content_id is required",
  89. )
  90. elif not video_index:
  91. return self.error_response(
  92. error_code="401",
  93. error_message="video_index is required",
  94. )
  95. elif not seed_video_id:
  96. return self.error_response(
  97. error_code="401",
  98. error_message="seed_video_id is required",
  99. )
  100. else:
  101. return await self.get_cover(content_id, int(video_index), seed_video_id)