Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- import asyncio
- import sanic
- app = sanic.Sanic("VOD Downloader")
- STREAM_TPL = "https://vod.nebulabroadcast.com/sport5/{key}/index-f1-v1-f4-a1.m3u8"
- class Rewrapper():
- def __init__(self, vod_key):
- source_url = STREAM_TPL.format(key=vod_key)
- self.args = [
- "-i", source_url,
- "-c:v", "copy",
- "-c:a", "copy",
- "-movflags", "frag_keyframe+empty_moov",
- "-bsf:a", "aac_adtstoasc",
- "-f", "mp4", "-"]
- async def start(self):
- self.proc = await asyncio.create_subprocess_exec("ffmpeg", *self.args, stdout=asyncio.subprocess.PIPE)
- async def read(self):
- return await self.proc.stdout.read(1024*1024)
- async def finish(self):
- await self.proc.wait()
- self.proc = None
- def __del__(self):
- if self.proc:
- print("Terminating rewrapper")
- self.proc.kill()
- asyncio.shield(self.proc.wait())
- @app.route("/download/<vod_key:string>.mp4")
- async def test(request, vod_key):
- async def streaming_fn(response):
- rewrapper = Rewrapper(vod_key)
- await rewrapper.start()
- while True:
- buff = await rewrapper.read()
- if not buff:
- break
- await response.write(buff)
- await rewrapper.finish()
- return sanic.response.stream(streaming_fn, content_type='video/mp4')
- if __name__ == "__main__":
- app.run(host="0.0.0.0", port=8910)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement