<!DOCTYPE html>
<html>
  <!-- ahhh -->

  <body style="margin: 0; overflow: hidden">
    <canvas
      id="myCanvas"
      width="10"
      height="10"
      style="display: block; box-sizing: border-box"
    >
      Your browser does not support the HTML5 canvas tag.</canvas
    >
    <script src="https://unpkg.com/@ffmpeg/ffmpeg@0.10.0/dist/ffmpeg.min.js"></script>
    <script>
      const { createFFmpeg } = FFmpeg;
      const ffmpeg = createFFmpeg({
        log: true,
      });

      const transcode = async (webcamData) => {
        const message = document.getElementById("message");
        const name = "record.webm";
        await ffmpeg.load();
        message.innerHTML = "Start transcoding";
        await ffmpeg.write(name, webcamData);
        await ffmpeg.transcode(name, "output.mp4");
        message.innerHTML = "Complete transcoding";
        const data = ffmpeg.read("output.mp4");

        const video = document.getElementById("output-video");
        video.src = URL.createObjectURL(
          new Blob([data.buffer], { type: "video/mp4" })
        );
        dl.href = video.src;
        dl.innerHTML = "download mp4";
      };

      fn().then(async ({ url, blob }) => {
        transcode(new Uint8Array(await blob.arrayBuffer()));
      });

      function fn() {
        var recordedChunks = [];

        var time = 0;
        var canvas = document.getElementById("canvas");

        return new Promise(function (res, rej) {
          var stream = canvas.captureStream(60);

          mediaRecorder = new MediaRecorder(stream, {
            mimeType: "video/webm; codecs=vp9",
          });

          mediaRecorder.start(time);

          mediaRecorder.ondataavailable = function (e) {
            recordedChunks.push(event.data);
            // for demo, removed stop() call to capture more than one frame
          };

          mediaRecorder.onstop = function (event) {
            var blob = new Blob(recordedChunks, {
              type: "video/webm",
            });
            var url = URL.createObjectURL(blob);
            res({ url, blob }); // resolve both blob and url in an object

            myVideo.src = url;
            // removed data url conversion for brevity
          };

          // for demo, draw random lines and then stop recording
          var i = 0,
            tid = setInterval(() => {
              if (i++ > 20) {
                // draw 20 lines
                clearInterval(tid);
                mediaRecorder.stop();
              }
              let canvas = document.querySelector("canvas");
              let cx = canvas.getContext("2d");
              cx.beginPath();
              cx.strokeStyle = "green";
              cx.moveTo(Math.random() * 100, Math.random() * 100);
              cx.lineTo(Math.random() * 100, Math.random() * 100);
              cx.stroke();
            }, 200);
        });
      }

      let c = document.getElementById("myCanvas");
      let ctx = c.getContext("2d");
      ctx.canvas.width = window.innerWidth;
      ctx.canvas.height = window.innerHeight;

      let deg_per_sec = 30 / 5000;
      let time = 0.1;
      let fps = 60;

      centerX = ctx.canvas.width / 2;
      centerY = ctx.canvas.height / 2;

      rotation = 0; //was = j = angle
      currentFrame = 0; //was = i

      function render() {
        if (currentFrame < time / (1 / fps)) {
          setTimeout(() => {
            render();
            render_clear();

            // Draw_Phyllotaxis(rotation + 3.1);
            Draw_Phyllotaxis(rotation + 1.5);
            console.log(rotation + 3.1);
            // Draw_Phyllotaxis(rotation/5000);

            // Draw_center(); //Debugging
            // DrawBorder();
          }, 1000 / fps);
          rotation += deg_per_sec / fps; // was = j = angle, now = rotation
          currentFrame += 1; // was = i
        }
      }

      render();

      function Draw_Phyllotaxis(angle) {
        // colour1 = [255, 170, 0];
        // colour2 = [255, 0, 221];
        colour1 = [45, 129, 252];
        colour2 = [252, 3, 98];

        var c = 24; //something to do with width. but not width

        for (let n = 0; n < 300; n += 1) {
          ncolour = LerpRGB(colour1, colour2, Math.cos(rad(n / 2)));
          var a = n * angle; //137.5;
          var r = c * Math.sqrt(n);
          var x = r * Math.cos(a) + centerX;
          var y = r * Math.sin(a) + centerY;

          ctx.beginPath();
          ctx.arc(x, y, 8, 0, 2 * Math.PI);
          ctx.fillStyle = colourToText(ncolour);
          ctx.fill();
        }
      }
      function rad(degrees) {
        var pi = Math.PI;
        return degrees * (pi / 180);
      }

      function LerpRGB(a, b, t) {
        if (t < 0) {
          t *= -1;
        }
        var newColor = [0, 0, 0];
        newColor[0] = a[0] + (b[0] - a[0]) * t;
        newColor[1] = a[1] + (b[1] - a[1]) * t;
        newColor[2] = a[2] + (b[2] - a[2]) * t;
        return newColor;
      }

      function colourToText(colour) {
        return "rgb(" + colour[0] + "," + colour[1] + "," + colour[2] + ")";
      }

      function render_clear() {
        ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
        ctx.fillStyle = "black";
        ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
      }
    </script>
  </body>
</html>