recorder.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import asyncio
  2. from datetime import datetime
  3. from string import Template
  4. from bilibili_api import live
  5. from fake_useragent import UserAgent
  6. import ffmpy3
  7. class Recorder:
  8. def __init__(self,room_display_id):
  9. self.ROOM_DISPLAY_ID=room_display_id
  10. async def __getInfoAndUrl(self,l):
  11. return await l.get_room_info(), await l.get_room_play_url(live.ScreenResolution.FOUR_K)
  12. def start(self, outputNameTemplate: str = '【${qn_desc}】${name} - ${datetime}', log: bool = True):
  13. OUTPUT_NAME_TEMPLATE=Template(outputNameTemplate)
  14. l = live.LiveRoom(room_display_id=self.ROOM_DISPLAY_ID)
  15. info, play_url = asyncio.get_event_loop().run_until_complete(self.__getInfoAndUrl(l))
  16. anchor_info=info["anchor_info"]["base_info"]
  17. current_qn = play_url["current_qn"]
  18. quality_descriptions = play_url["quality_description"]
  19. durl = play_url["durl"]
  20. current_qn_desc = "未知清晰度"
  21. for quality_description in quality_descriptions:
  22. if(current_qn == quality_description["qn"]):
  23. current_qn_desc = quality_description["desc"]
  24. url = durl[len(durl)-1]["url"]
  25. outputName = OUTPUT_NAME_TEMPLATE.safe_substitute({
  26. 'name': anchor_info["uname"],
  27. 'qn_desc': current_qn_desc,
  28. 'datetime': datetime.now().isoformat()
  29. })
  30. f_handler=open("./logs/"+outputName+'.log', 'w') if log else asyncio.subprocess.PIPE
  31. self.ff = ffmpy3.FFmpeg(
  32. inputs={url:" -v debug -user-agent \""+str(UserAgent().random)+"\" -referer \"https://live.bilibili.com/"+str(self.ROOM_DISPLAY_ID)+"\""},
  33. outputs={"./videos/"+outputName+".flv":"-c copy -y"}
  34. )
  35. self.process = self.ff.run_async(stdout=f_handler, stderr=f_handler)
  36. print(self.ff.cmd)
  37. asyncio.get_event_loop().run_until_complete(self.process)
  38. asyncio.get_event_loop().run_until_complete(self.ff.wait())
  39. print(self.process)
  40. def stop(self):
  41. self.process.terminate()