download_video.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import os
  2. from urllib.parse import urlparse
  3. import requests
  4. class DownLoad:
  5. @classmethod
  6. def download_video(cls, video_url, video_path_url, tag_transport_channel, video_id):
  7. video = video_path_url + 'video.mp4'
  8. if tag_transport_channel == "抖音":
  9. headers = {
  10. 'accept': '*/*',
  11. 'accept-encoding': 'identity;q=1, *;q=0',
  12. 'accept-language': 'zh-CN,zh;q=0.9',
  13. 'cache-control': 'no-cache',
  14. 'connection': 'keep-alive',
  15. 'pragma': 'no-cache',
  16. 'range': 'bytes=0-',
  17. 'referer': f'https://www.douyin.com/video/{video_id}',
  18. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
  19. }
  20. payload = {}
  21. for i in range(3):
  22. try:
  23. response = requests.request("GET", video_url, headers=headers, data=payload, timeout=240)
  24. if response.status_code == 206:
  25. # 以二进制写入模式打开文件
  26. with open(f"{video}", "wb") as file:
  27. # 将响应内容写入文件
  28. file.write(response.content)
  29. return video
  30. except Exception:
  31. return video
  32. else:
  33. try:
  34. for i in range(3):
  35. payload = {}
  36. headers = {}
  37. response = requests.request("GET", video_url, headers=headers, data=payload, timeout=240)
  38. if response.status_code == 200:
  39. # 以二进制写入模式打开文件
  40. with open(f"{video}", "wb") as file:
  41. # 将响应内容写入文件
  42. file.write(response.content)
  43. return video
  44. return video
  45. except Exception:
  46. return video
  47. @classmethod
  48. def download_m3u8_video(cls ,url, file_path):
  49. r = requests.get(url)
  50. if r.status_code != 200:
  51. return False
  52. m3u8_list = r.text.split('\n')
  53. m3u8_list = [i for i in m3u8_list if i and i[0] != '#']
  54. ts_list = []
  55. for ts_url in m3u8_list:
  56. ts_url = url.rsplit('/', 1)[0] + '/' + ts_url
  57. ts_list.append(ts_url)
  58. with open(file_path, 'wb') as f:
  59. for ts_url in ts_list:
  60. r = requests.get(ts_url)
  61. if r.status_code == 200:
  62. f.write(r.content)
  63. return True
  64. @classmethod
  65. def convert_ts_to_mp4(cls, ts_file_path, mp4_file_path):
  66. os.system(f'ffmpeg -i {ts_file_path} -c copy {mp4_file_path}')