init_load_source.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import asyncio
  2. import json
  3. import time
  4. from settings import HLM_HOST
  5. import aiohttp
  6. import os
  7. from utils.utils_func import get_md5, get_modified_time, compare_two_times, check_path
  8. from utils.common import message_queue
  9. class init_load_source:
  10. async def load_source(self):
  11. await self.down_resouce()
  12. async def down_resouce(self):
  13. response_data = await self.get_update_file()
  14. if response_data:
  15. for relative_file_path, value in response_data.items():
  16. file_path = f"{os.getcwd()}/{relative_file_path}"
  17. if os.path.exists(file_path):
  18. file_md5 = get_md5(file_path)
  19. if file_md5 != value["file_md5"]:
  20. print(f"md5 不同 开始下载:{file_path}")
  21. await self.async_download_file(value["url"], file_path)
  22. else:
  23. pass
  24. else:
  25. print(f"文件不存在 开始下载:{file_path}")
  26. await self.send_message(f"开始下载:{file_path}")
  27. await self.async_download_file(value["url"], file_path)
  28. else:
  29. print("获取更新文件内容失败")
  30. async def send_message(self, msg):
  31. message = {
  32. 'code': 0,
  33. 'msg_code': 'down_source',
  34. 'message': msg
  35. }
  36. await message_queue.put(json.dumps(message))
  37. async def get_update_file(self, type="client_camera", plugins_name="plugins_A"):
  38. """异步获取指定类型的插件文件更新信息
  39. Args:
  40. type (str, optional): 设备类型标识,默认为"client_camera"
  41. plugins_name (str, optional): 需要查询的插件名称,默认为"plugins_A"
  42. Returns:
  43. dict or None: 成功时返回插件文件的JSON数据,失败或未找到时返回None
  44. """
  45. url = HLM_HOST + "/api/openai/query_client_addons"
  46. params = {"type": type}
  47. try:
  48. async with aiohttp.ClientSession() as session:
  49. # 发送初始请求获取插件列表数据
  50. async with session.get(url, params=params, timeout=10) as response:
  51. response.raise_for_status()
  52. raw_data = await response.json()
  53. if not raw_data or not raw_data.get("data"):
  54. return None
  55. # 从插件列表中查找匹配的插件项
  56. item = next(
  57. (item for item in raw_data["data"]["list"] if item["name"] == plugins_name),
  58. None
  59. )
  60. if item:
  61. # 根据插件项中的URL获取具体文件内容
  62. url = item["url"]
  63. async with session.get(url, timeout=10) as item_response:
  64. item_response.raise_for_status()
  65. return await item_response.json()
  66. return None
  67. except Exception as e:
  68. print(f"An error occurred: {e}")
  69. return None
  70. async def async_download_file(self, url: str, file_path: str):
  71. """异步下载文件"""
  72. async with aiohttp.ClientSession() as session:
  73. async with session.get(url) as response:
  74. root_path, file_name = os.path.split(file_path)
  75. check_path(root_path)
  76. with open(file_path, 'wb') as f:
  77. async for chunk in response.content.iter_chunked(1024):
  78. f.write(chunk)