diff --git a/videobundler/main.py b/videobundler/main.py index 173193a..339734c 100644 --- a/videobundler/main.py +++ b/videobundler/main.py @@ -11,51 +11,67 @@ app = web.Application() app.router._frozen = False def get_random_string(length): - # choose from all lowercase letter - letters = string.ascii_lowercase - result_str = "".join(random.choice(letters) for i in range(length)) - return result_str + # choose from all lowercase letter + letters = string.ascii_lowercase + result_str = "".join(random.choice(letters) for i in range(length)) + return result_str + +async def run_command(cmd): + # Create subprocess + process = await asyncio.create_subprocess_shell( + cmd, + stdout=asyncio.subprocess.PIPE, + ) + # Wait for the subprocess to finish + stdout, stderr = await process.communicate() + # Check for errors + if process.returncode!= 0: + # Log or handle the error + print(f"Command '{args}' failed with return code {process.returncode}") + return None + # Decode stdout and return + return stdout async def merge(request): - # register params - job_id = request.rel_url.query["id"] - video_id: str = request.rel_url.query["id"] - audio_itag: str = request.rel_url.query["audio_itag"] - video_itag: str = request.rel_url.query["video_itag"] - # validate - if " " in video_id or len(video_id) > 11: - print(f"Video {video_id} flagged as invalid, dropping request") - return - if not audio_itag.isdigit(): - print(f"Audio itag {audio_itag} flagged as invalid, dropping request") - return - if not video_itag.isdigit(): - print(f"Video itag {video_itag} flagged as invalid, dropping request") - return - if os.path.isfile(f"{job_id}.mp4"): - return web.FileResponse( - path=f"{job_id}.mp4" - ) - cmdline = f"ffmpeg -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={audio_itag}&local=true\" -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={video_itag}&local=true\" -c copy -f mp4 -movflags frag_keyframe+empty_moov {video_id}.mp4" - proc_ffmpeg = await asyncio.create_subprocess_shell( - cmdline, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE - ) - print(f"ffmpeg -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={audio_itag}&local=true\" -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={video_itag}&local=true\" -c copy -f mp4 -movflags frag_keyframe+empty_moov -") - stdout, stderr = await proc_ffmpeg.communicate() - response = FileResponse(f"{video_id}.mp4") - return response + # register params + job_id = request.rel_url.query["id"] + video_id: str = request.rel_url.query["id"] + audio_itag: str = request.rel_url.query["audio_itag"] + video_itag: str = request.rel_url.query["video_itag"] + # validate + if " " in video_id or len(video_id) > 11: + print(f"Video {video_id} flagged as invalid, dropping request") + return + if not audio_itag.isdigit(): + print(f"Audio itag {audio_itag} flagged as invalid, dropping request") + return + if not video_itag.isdigit(): + print(f"Video itag {video_itag} flagged as invalid, dropping request") + return + if os.path.isfile(f"{job_id}.mp4"): + return web.FileResponse( + path=f"{job_id}.mp4" + ) + cmdline = f"ffmpeg -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={audio_itag}&local=true\" -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={video_itag}&local=true\" -c copy -f mp4 -movflags frag_keyframe+empty_moov -" + #proc_ffmpeg = await asyncio.create_subprocess_shell( + # cmdline, + # stdout=asyncio.subprocess.PIPE + #) + #print(f"ffmpeg -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={audio_itag}&local=true\" -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={video_itag}&local=true\" -c copy -f mp4 -movflags frag_keyframe+empty_moov -") + #stdout, _ = await proc_ffmpeg.communicate() + iwannakillmyself = await run_command(cmdline) + response = Response(body=iwannakillmyself, content_type="video/mp4", headers="") + return response async def ping(request): - return web.Response(body='{"success": true}', content_type="application/json") + return web.Response(body='{"success": true}', content_type="application/json") async def init_app(): - app.router.add_get("/{id:.+}", merge) - app.router.add_get("/", ping) - return app + app.router.add_get("/{id:.+}", merge) + app.router.add_get("/", ping) + return app if __name__ == '__main__': - loop = asyncio.get_event_loop() - app = loop.run_until_complete(init_app()) - web.run_app(app, port=3030) \ No newline at end of file + loop = asyncio.get_event_loop() + app = loop.run_until_complete(init_app()) + web.run_app(app, port=3030)