aliyun_oss.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. # -*- coding: utf-8 -*-
  2. # @Time: 2023/12/26
  3. import time
  4. import uuid
  5. from datetime import datetime
  6. from typing import Dict, Any, Optional
  7. import oss2
  8. from oss2 import Auth, Bucket, exceptions
  9. from loguru import logger
  10. from utils.config import OssConfig
  11. import requests
  12. OSS_ACCESS_KEY_ID = "LTAIP6x1l3DXfSxm"
  13. OSS_ACCESS_KEY_SECRET = "KbTaM9ars4OX3PMS6Xm7rtxGr1FLon"
  14. # OSS_BUCKET_ENDPOINT = "oss-cn-hangzhou-internal.aliyuncs.com"# 内网地址
  15. OSS_BUCKET_ENDPOINT = "oss-cn-hangzhou.aliyuncs.com" # 外网地址
  16. OSS_BUCKET_NAME = "art-crawler"
  17. class Oss():
  18. @classmethod
  19. def channel_upload_oss(cls, src_url: str,
  20. video_id: str,
  21. referer: Optional[str] = None) -> Dict[str, Any]:
  22. headers = {
  23. 'Accept': '*/*',
  24. 'Accept-Language': 'zh-CN,zh;q=0.9',
  25. 'Cache-Control': 'no-cache',
  26. 'Pragma': 'no-cache',
  27. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) '
  28. 'Chrome/117.0.0.0 Safari/537.36',
  29. }
  30. if referer:
  31. headers.update({'Referer': referer})
  32. response = requests.request(url=src_url, method='GET', headers=headers, timeout=30)
  33. file_content = response.content
  34. content_type = response.headers.get('Content-Type', 'application/octet-stream')
  35. oss_object_key = f'carry/video/{video_id}'
  36. auth = oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)
  37. bucket = oss2.Bucket(auth, OSS_BUCKET_ENDPOINT, OSS_BUCKET_NAME)
  38. response = bucket.put_object(oss_object_key, file_content, headers={'Content-Type': content_type})
  39. if 'Content-Length' in response.headers:
  40. return {
  41. 'status': response.status,
  42. 'oss_object_key': oss_object_key}
  43. raise AssertionError(f'OSS上传失败,请求ID: \n{response.headers["x-oss-request-id"]}')
  44. """
  45. 视频发送到art-pubbucket
  46. """
  47. @classmethod
  48. def stitching_sync_upload_oss(cls, src_url: str,
  49. video_id: str) -> Dict[str, Any]:
  50. oss_object_key = f'carry/video/{video_id}'
  51. auth = oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)
  52. bucket = oss2.Bucket(auth, OSS_BUCKET_ENDPOINT, "art-pubbucket")
  53. response = bucket.put_object_from_file(oss_object_key, src_url)
  54. if 'Content-Length' in response.headers:
  55. return {
  56. 'status': response.status,
  57. 'oss_object_key': oss_object_key,
  58. 'save_oss_timestamp': int(datetime.now().timestamp() * 1000),
  59. }
  60. raise AssertionError(f'OSS上传失败,请求ID: \n{response.headers["x-oss-request-id"]}')
  61. """
  62. 封面发送到art-pubbucket
  63. """
  64. @classmethod
  65. def stitching_fm_upload_oss(cls, src_url: str,
  66. video_id: str) -> Dict[str, Any]:
  67. oss_object_key = f'jq_oss/jpg/{video_id}.jpg'
  68. auth = oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)
  69. bucket = oss2.Bucket(auth, OSS_BUCKET_ENDPOINT, "art-pubbucket")
  70. response = bucket.put_object_from_file(oss_object_key, src_url)
  71. if 'Content-Length' in response.headers:
  72. return {
  73. 'status': response.status,
  74. 'oss_object_key': oss_object_key,
  75. 'save_oss_timestamp': int(datetime.now().timestamp() * 1000),
  76. }
  77. raise AssertionError(f'OSS上传失败,请求ID: \n{response.headers["x-oss-request-id"]}')
  78. """
  79. 封面发送到art-pubbucket
  80. """
  81. @classmethod
  82. def mp3_upload_oss(cls, src_url: str,
  83. video_id: str) -> Dict[str, Any]:
  84. oss_object_key = f'jq_audio/audio/{video_id}.mp3'
  85. auth = oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)
  86. bucket = oss2.Bucket(auth, OSS_BUCKET_ENDPOINT, "art-crawler")
  87. response = bucket.put_object_from_file(oss_object_key, src_url)
  88. if 'Content-Length' in response.headers:
  89. return {
  90. 'status': response.status,
  91. 'oss_object_key': oss_object_key,
  92. 'save_oss_timestamp': int(datetime.now().timestamp() * 1000),
  93. }
  94. raise AssertionError(f'OSS上传失败,请求ID: \n{response.headers["x-oss-request-id"]}')
  95. @classmethod
  96. def download_video_oss(cls, url, file_path):
  97. video_path = file_path + 'video.mp4'
  98. oss_object_key = cls.channel_upload_oss(url, str(uuid.uuid4()))
  99. time.sleep(2)
  100. oss_object = oss_object_key.get("oss_object_key")
  101. if oss_object:
  102. auth = oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)
  103. bucket = oss2.Bucket(auth, OSS_BUCKET_ENDPOINT, OSS_BUCKET_NAME)
  104. # 获取指定路径下的对象列表
  105. bucket.get_object_to_file(oss_object, video_path)
  106. time.sleep(5)
  107. return video_path
  108. else:
  109. return video_path
  110. @classmethod
  111. def download_sph_ls(cls, video_url, video_path_url, v_id):
  112. if "jpg" in video_url:
  113. video_path = video_path_url + str(v_id) + '.jpg'
  114. else:
  115. video_path = video_path_url + str(v_id) + '.mp4'
  116. auth = oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)
  117. bucket = oss2.Bucket(auth, OSS_BUCKET_ENDPOINT, OSS_BUCKET_NAME)
  118. # 获取指定路径下的对象列表
  119. bucket.get_object_to_file(video_url, video_path)
  120. time.sleep(5)
  121. return video_path
  122. @classmethod
  123. def upload_to_aliyun(cls,local_path):
  124. """
  125. 上传文件到阿里云 OSS
  126. 参数:
  127. local_path (str): 本地文件路径
  128. oss_path (str): OSS 目标路径
  129. 返回:
  130. bool: 上传成功返回 True,失败返回 False
  131. """
  132. try:
  133. oss_path = generate_oss_path()
  134. logger.info(f"开始上传到阿里云 OSS: {oss_path}")
  135. # 初始化认证和存储空间
  136. auth = Auth(OssConfig["OSS_ACCESS_KEY_ID"], OssConfig["OSS_ACCESS_KEY_SECRET"])
  137. bucket = Bucket(auth, OssConfig["ENDPOINT"], OssConfig["BUCKETNAME"])
  138. # 上传文件
  139. result = bucket.put_object_from_file(oss_path, local_path)
  140. # 检查上传结果
  141. if result.status == 200:
  142. logger.info(f"上传成功,OSS 路径: {oss_path}")
  143. return OssConfig["BUCKETNAME_HOST"]+oss_path
  144. else:
  145. logger.error(f"上传失败,状态码: {result.status}")
  146. return False
  147. except exceptions.OssError as e:
  148. logger.error(f"阿里云 OSS 错误: {e}")
  149. return False
  150. except Exception as e:
  151. logger.error(f"上传异常: {e}")
  152. return
  153. def generate_oss_path():
  154. """生成唯一OSS路径(日期+UUID)"""
  155. # 生成日期目录(格式:YYYYMMDD)
  156. date_dir = datetime.now().strftime("%Y%m%d")
  157. # 生成随机文件名(使用 UUID)
  158. random_filename = f"{uuid.uuid4().hex}.mp3"
  159. # 构建完整的 OSS 路径
  160. oss_base_dir = OssConfig["OSS_BASE_DIR"]
  161. oss_path = f"{oss_base_dir}/{date_dir}/{random_filename}"
  162. return f"{oss_path}"
  163. if __name__ == '__main__':
  164. Oss.download_sph_ls('channel/video/sph/14374775553517295881.jpg','asa','1')