#!/usr/bin/env python3
"""Prepara un "video" para DASH: varias calidades, segmentos cortos y un manifiesto MPD.

El contenido son bytes al azar del tamaño correcto: a la red y al cliente les da igual. El MPD
sí tiene la forma de los reales (Period, AdaptationSet, Representation y SegmentTemplate).

  make_dash.py <carpeta> [--segments 15] [--duration 2]
"""
import argparse
import os

BITRATES = [400_000, 1_000_000, 2_500_000, 5_000_000]

MPD = """<?xml version="1.0"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" type="static" mediaPresentationDuration="PT{total}S"
     minBufferTime="PT{duration}S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <Period>
    <AdaptationSet mimeType="video/mp4" segmentAlignment="true">
      <SegmentTemplate timescale="1" duration="{duration}" startNumber="0"
                       media="$RepresentationID$/seg-$Number$.m4s"/>
{representations}
    </AdaptationSet>
  </Period>
</MPD>
"""


def build(folder, segments, duration, bitrates=None):
    bitrates = bitrates or BITRATES
    os.makedirs(folder, exist_ok=True)
    lines = []
    for bitrate in bitrates:
        name = f"{bitrate // 1000}k"
        lines.append(f'      <Representation id="{name}" bandwidth="{bitrate}"/>')
        os.makedirs(os.path.join(folder, name), exist_ok=True)
        size = bitrate * duration // 8
        for number in range(segments):
            with open(os.path.join(folder, name, f"seg-{number}.m4s"), "wb") as file:
                file.write(os.urandom(size))
    with open(os.path.join(folder, "video.mpd"), "w", encoding="utf-8") as file:
        file.write(MPD.format(total=segments * duration, duration=duration, representations="\n".join(lines)))


def main():
    parser = argparse.ArgumentParser(description="Genera segmentos y un MPD")
    parser.add_argument("folder")
    parser.add_argument("--segments", type=int, default=15)
    parser.add_argument("--duration", type=int, default=2)
    args = parser.parse_args()
    build(args.folder, args.segments, args.duration)


if __name__ == "__main__":
    main()
