video_get.py 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import json
  2. import os
  3. import re
  4. import httpx
  5. import base64
  6. import os
  7. import sys
  8. sys.path.append(os.path.dirname(os.path.dirname(__file__)))
  9. from douyin.video_get_iframe_by_item import get_iframe_by_item_id
  10. from config import logger,ASR_EXE,ASR_ADDRESS,TEMP_DIR
  11. '''
  12. url = "4.30 03/30 bNJ:/ L@w.FH 踩中风口真的可以翻身吗?从一穷二白到AI逆袭,他怎么做到的? # 东方对话 # 人工智能 # ai https://v.douyin.com/i8Df1CC/ 复制此链接,打开Dou音搜索,直接观看视频!"
  13. ret = {
  14. "code": 0,
  15. "msg": "",
  16. "data": [
  17. "https://v26-web.douyinvod.com/b96458639649189a611ac504a98ab1a2/65f2e8f7/video/tos/cn/tos-cn-ve-15/oMP2rHcp5Qffk5bH3QI29eZ02DRMIsAlfugfAE/?a=6383&ch=5&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=1307&bt=1307&cs=0&ds=3&ft=bvTKJbQQqUYSfJ.ZPo0OqY8hFgpis3kQejKJ4cbTYG0P3-I&mime_type=video_mp4&qs=0&rc=OTY1aDQzPDg4aTo4PDs8N0Bpand4ZWU6ZmZ5cTMzNGkzM0A2Mi81LzYxNWAxNTE1YDM1YSNtLmpmcjRncmNgLS1kLS9zcw%3D%3D&btag=e00008000&cquery=100a&dy_q=1710414563&feature_id=f0150a16a324336cda5d6dd0b69ed299&l=20240314190922833D1C0045FB7109049F",
  18. "https://v3-web.douyinvod.com/fe13b075a0f1596fd800244131f91107/65f2e8f7/video/tos/cn/tos-cn-ve-15/oMP2rHcp5Qffk5bH3QI29eZ02DRMIsAlfugfAE/?a=6383&ch=5&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=1307&bt=1307&cs=0&ds=3&ft=bvTKJbQQqUYSfJ.ZPo0OqY8hFgpis3kQejKJ4cbTYG0P3-I&mime_type=video_mp4&qs=0&rc=OTY1aDQzPDg4aTo4PDs8N0Bpand4ZWU6ZmZ5cTMzNGkzM0A2Mi81LzYxNWAxNTE1YDM1YSNtLmpmcjRncmNgLS1kLS9zcw%3D%3D&btag=e00008000&cquery=100a&dy_q=1710414563&feature_id=f0150a16a324336cda5d6dd0b69ed299&l=20240314190922833D1C0045FB7109049F",
  19. "https://www.douyin.com/aweme/v1/play/?video_id=v0200fg10000cnfvucjc77ubibmu1tpg&line=0&file_id=8469c88945874fc5854990218e225396&sign=f5a2d2c7a6e4cb83ce41a254a73f27a2&is_play_url=1&source=PackSourceEnum_FEED&aid=6383"
  20. ]
  21. }
  22. '''
  23. async def get_video_download_urls(url, video_type="", platform="", server_addr="http://10.0.0.12:9082/video-get"):
  24. payload = {
  25. "url": url,
  26. "type": video_type,
  27. "platform": platform
  28. }
  29. async with httpx.AsyncClient() as client:
  30. logger.debug(f"{json.dumps(payload) }")
  31. response = await client.post(
  32. server_addr,
  33. headers={"Content-Type": "application/json"},
  34. content=json.dumps(payload)
  35. )
  36. res_json = response.json()
  37. # 假设响应中包含'err_no'和可能的'err_msg'字段来表示错误
  38. # err_no = res_json.get("code")
  39. return res_json
  40. async def download_video(url, save_file_path) ->str:
  41. if type(url) is list:
  42. urls = url
  43. else:
  44. urls = [url]
  45. async with httpx.AsyncClient() as client:
  46. for url in urls:
  47. response = await client.get(url)
  48. # 检查是否成功获取响应
  49. if response.status_code == 200:
  50. # 以二进制写模式打开一个文件
  51. with open(save_file_path, 'wb') as file:
  52. # 异步迭代响应的内容块并写入文件
  53. async for chunk in response.aiter_bytes():
  54. file.write(chunk)
  55. return save_file_path
  56. else:
  57. logger.info(f"try to download video faild,status: {response.status_code},url: {url}")
  58. continue
  59. # raise Exception(f"遍历所有 urls 都无法下载 {urls}")
  60. async def download_video_by_item_id(item_id, save_file_path):
  61. response = await get_iframe_by_item_id(item_id)
  62. # # iframe = '<iframe width="1080" height="1920" frameborder="0" src="https://open.douyin.com/player/video?vid=7259290547288870144&autoplay=0" referrerpolicy="unsafe-url" allowfullscreen></iframe>',
  63. iframe = response.get("data").get("iframe_code")
  64. urls = await get_video_download_urls(iframe)
  65. return await download_video(urls, save_file_path)
  66. async def download_video_by_share_link(share_str, save_file_path) ->str:
  67. urls = await get_video_download_urls(share_str)
  68. return await download_video(urls, save_file_path)