download_video.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import html
  2. import os
  3. import requests
  4. class DownLoad:
  5. @classmethod
  6. def download_video(cls, video_url, video_path_url):
  7. video = video_path_url + 'video.mp4'
  8. url_type = html.unescape(video_url).split('?')[0]
  9. if ".m3u8" in url_type:
  10. ts_video = video_path_url + 'video.ts'
  11. status_code = cls.download_m3u8_video(video_url, ts_video)
  12. if status_code == False:
  13. return video
  14. cls.convert_ts_to_mp4(ts_video, video)
  15. return video
  16. else:
  17. try:
  18. for i in range(3):
  19. payload = {}
  20. headers = {}
  21. response = requests.request("GET", video_url, headers=headers, data=payload, timeout=240)
  22. if response.status_code == 200:
  23. # 以二进制写入模式打开文件
  24. with open(f"{video}", "wb") as file:
  25. # 将响应内容写入文件
  26. file.write(response.content)
  27. return video
  28. return video
  29. except Exception:
  30. return video
  31. @classmethod
  32. def download_m3u8_video(cls ,url, file_path):
  33. r = requests.get(url)
  34. if r.status_code != 200:
  35. return False
  36. m3u8_list = r.text.split('\n')
  37. m3u8_list = [i for i in m3u8_list if i and i[0] != '#']
  38. ts_list = []
  39. for ts_url in m3u8_list:
  40. ts_url = url.rsplit('/', 1)[0] + '/' + ts_url
  41. ts_list.append(ts_url)
  42. with open(file_path, 'wb') as f:
  43. for ts_url in ts_list:
  44. r = requests.get(ts_url)
  45. if r.status_code == 200:
  46. f.write(r.content)
  47. return True
  48. @classmethod
  49. def convert_ts_to_mp4(cls, ts_file_path, mp4_file_path):
  50. os.system(f'ffmpeg -i {ts_file_path} -c copy {mp4_file_path}')