How I can know audio/video duration before uploading?

I need to upload file (audio/video) using default input type='file' and the I should pass duration of the video in api request, how i ca do this?

  const uploadFile = async (event) => {
    let file = await event.target.files[0];
    //here api POST request where i should pass duration
   }:

Solution 1:

You can get the audio duration with HTMLMediaElement.duration:

async function getDuration(file) {
 const url = URL.createObjectURL(file);

 return new Promise((resolve) => {
   const audio = document.createElement("audio");
   audio.muted = true;
   const source = document.createElement("source");
   source.src = url; //--> blob URL
   audio.preload= "metadata";
   audio.appendChild(source);
   audio.onloadedmetadata = function(){
      resolve(audio.duration)
   };
 });
}

Then in your function:

const uploadFile = async (event) => {
   let file = event.target.files[0];
    //here api POST request where i should pass duration
   const duration = await getDuration(file);
 }:

Solution 2:

You just need to create an element based on user input(video/audio) and get the duration property -

const VIDEO = "video",
        AUDIO = "audio";
      const uploadApiCall = (file, data = {}) => {
        // ----- YOUR API CALL CODE HERE -----
        document.querySelector("#duration").innerHTML = `${data.duration}s`;
        document.querySelector("#type").innerHTML = data.type;
      };

      let inputEl = document.querySelector("#fileinput");
      inputEl.addEventListener("change", (e) => {
        let fileType = "";
        let file = inputEl.files[0];
        if (file.type.startsWith("audio/")) {
          fileType = AUDIO;
        } else if (file.type.startsWith("video/")) {
          fileType = VIDEO;
        } else {
          alert("Unsupported file");
          return;
        }

        let dataURL = URL.createObjectURL(file);
        let el = document.createElement(fileType);
        el.src = dataURL;
        el.onloadedmetadata = () => {
          uploadApiCall(file, {
            duration: el.duration,
            type: fileType
          });
        };
      });
 <form>
      <input type="file" accept="video/*,audio/*" id="fileinput" />
      <hr />
      Type:<span id="type"></span>
      <br />
      Duration:<span id="duration"></span>
    </form>