FROM python:3.12-slim ENV PYTHONUNBUFFERED=1 RUN pip install playwright xvfbwrapper RUN playwright install firefox --with-deps RUN apt-get update && apt-get install -y \ ffmpeg \ && rm -rf /var/lib/apt/lists/* RUN tee main.py <<'EOF' from playwright.async_api import async_playwright as aP from urllib.parse import *; from os.path import * import os, sys, asyncio, subprocess, tempfile, shutil, xvfbwrapper async def Page(headless=True): page = None async def save(response): if not response.ok: return url, body = response.url, await response.body() print(f'\x1b[93m{len(body)/1e6 + .05:.1f} MB\x1b[0m {url}') if response.headers.get('content-type', '') \ == 'application/vnd.apple.mpegurl': parse_m3u8(body.decode()) if url in page.chunks: open(join(page.dir, split(url)[1]), 'wb').write(body) page.chunks.remove(url) def parse_m3u8(m3u8): page.chunks = [] with open(join(page.dir, 'recipe.m3u8'), 'w') as f: for line in m3u8.splitlines(): if 'https' in line: page.chunks.append(quote(line, safe=":/")) line = split(line)[1] f.write(line + '\n') if headless: xvfbwrapper.Xvfb().start() else: os.environ['DISPLAY'] = ':0' playwright = await aP().start() browser = await playwright.firefox.launch(headless=False) context = await browser.new_context() context.on('response', save) context.set_default_timeout(0) page = await context.new_page() page.dir = tempfile.mkdtemp() page.chunks = [None] return page async def main(url): page = await Page() await page.goto(url) iframe = page.frame_locator('iframe') await iframe.locator('.video-js').evaluate(''' (element) => { element.player.play(); element.player.playbackRate(64); } ''') while len(page.chunks): await asyncio.sleep(1) print('\x1b[94m') subprocess.run([ 'ffmpeg', '-y', '-allowed_extensions', 'ALL', '-i', join(page.dir, 'recipe.m3u8'), '-c', 'copy', 'baked.mp4' ]) print('\x1b[92;1m') os.system('ls -alh ./baked.mp4') print('\x1b[0m') os._exit(0) asyncio.run(main(sys.argv[1])) EOF ENTRYPOINT ["python", "main.py"] CMD ["https://yauk.tv/282"]