|
@@ -0,0 +1,46 @@
|
|
|
+import asyncio
|
|
|
+from datetime import datetime
|
|
|
+from string import Template
|
|
|
+
|
|
|
+from bilibili_api import live
|
|
|
+import ffmpy3
|
|
|
+
|
|
|
+class Recorder:
|
|
|
+ def __init__(self,room_display_id):
|
|
|
+ self.ROOM_DISPLAY_ID=room_display_id
|
|
|
+
|
|
|
+ async def __getInfoAndUrl(self,l):
|
|
|
+ return await l.get_room_info(), await l.get_room_play_url(live.ScreenResolution.FOUR_K)
|
|
|
+
|
|
|
+ def start(self, outputNameTemplate: str = '【${qn_desc}】${name} - ${datetime}', log: bool = True):
|
|
|
+ OUTPUT_NAME_TEMPLATE=Template(outputNameTemplate)
|
|
|
+ l = live.LiveRoom(room_display_id=self.ROOM_DISPLAY_ID)
|
|
|
+ info, play_url = asyncio.get_event_loop().run_until_complete(self.__getInfoAndUrl(l))
|
|
|
+ anchor_info=info["anchor_info"]["base_info"]
|
|
|
+ current_qn = play_url["current_qn"]
|
|
|
+ quality_descriptions = play_url["quality_description"]
|
|
|
+ durl = play_url["durl"]
|
|
|
+ current_qn_desc = "未知清晰度"
|
|
|
+ for quality_description in quality_descriptions:
|
|
|
+ if(current_qn == quality_description["qn"]):
|
|
|
+ current_qn_desc = quality_description["desc"]
|
|
|
+ url = durl[len(durl)-1]["url"]
|
|
|
+ outputName = OUTPUT_NAME_TEMPLATE.safe_substitute({
|
|
|
+ 'name': anchor_info["uname"],
|
|
|
+ 'qn_desc': current_qn_desc,
|
|
|
+ 'datetime': datetime.now().isoformat()
|
|
|
+ })
|
|
|
+ f_handler=open(outputName+'.log', 'w') if log else asyncio.subprocess.PIPE
|
|
|
+ self.ff = ffmpy3.FFmpeg(
|
|
|
+ inputs={url:" -v debug"},
|
|
|
+ outputs={outputName+".flv":"-c copy -y"}
|
|
|
+ )
|
|
|
+ self.process = self.ff.run_async(stdout=f_handler, stderr=f_handler)
|
|
|
+ print(self.ff.cmd)
|
|
|
+ asyncio.get_event_loop().run_until_complete(self.process)
|
|
|
+ asyncio.get_event_loop().run_until_complete(self.ff.wait())
|
|
|
+ print(self.process)
|
|
|
+
|
|
|
+
|
|
|
+ def stop(self):
|
|
|
+ self.process.terminate()
|