Fixing a broken youtube live video download
Tags: youtube, opensource, tutorial
Published: 2022-11-02 05:29:01

I usually download videos using [Youtube-dl](https://youtube-dl.org). In fact, it's one of my default programs that's install on [any new machine](https://github.com/mohsin/dotfiles/blob/master/brew.sh#L38-L39).

So earlier today, I was downloading a "live" youtube video which was to be live the whole day. I needed a specific part i.e. a single event so I ran youtube-dl on it's live URL at the beginning of the event, ran `caffeinate -dismut 65535`, set my mac brightness to 0 and left for my daily routine.

I came back after an hour when the event ended, and hit Ctrl+C hoping to get the final video but then I got this in my log:
```zsh
^C[ffmpeg] Interrupted by user
[ffmpeg] Downloaded 370933808 bytes
[download] 100% of 353.75MiB in 01:02:40
Mohsin@Mozs-MacBook-Pro Desktop % [https @ 0x12800b800] Opening 'http://SomeLongURL/playlist/index.m3u8' for reading
Error writing trailer of file:SomeEvent.mp4: Immediate exit requested
frame=112801 fps= 21 q=-1.0 Lsize=  362240kB time=01:02:40.08 bitrate= 789.2kbits/s speed=0.717x
video:303393kB audio:59858kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Error closing file file:SomeEvent.mp4: Immediate exit requested
Exiting normally, received signal 2.
```

Now this `Error writing trailer of file:SomeEvent.mp4` was not ideal. This meant that the mp4 file that the mp4 container of the video file that was saved did not have a proper terminating trailer. Videos have a header/trailer and it's specification on how that is, depends on it's format. And this meant that when I opened the video on VLC, it threw an error than playing. I needed to fix this in order to watch the video.

And that's when I found [untrunc](https://github.com/ponchio/untrunc) but that's originally written to work on Linux machines. I run MacOS and that too ARM (M1), so I would have to compile it from source. Fortunately, unlike the initial days since it's release, Docker works great on Apple Silicon machines and I can install this tool inside and use it.

The tool needs a working "reference" to fix the video so I ran youtube-dl again on the live video and took a small clip. This time, it terminated correctly and so I put them both in a `videos` folder with `SomeEvent.mp4` and `reference.mp4`.

Then I cloned the untrunc repo, and ran the docker build using:
```zsh
git clone git@github.com:ponchio/untrunc.git
docker build -t untrunc .
```

And once the docker build was done, I ran the final command to fix the video:
```zsh
docker run -v ~/Desktop/videos:/files untrunc /files/reference.mp4 /files/SomeEvent.mp4
```

It gave an output:
```
Reading: /files/reference.mp4
[mov,mp4,m4a,3gp,3g2,mj2 @ 0xaaaacabcda80] multiple edit list entries, a/v desync might occur, patch welcome
Repair: /files/SomeEvent.mp4
Mdat not found!
Processed: 1%
...
...
Processed: 99%
Found 274677 packets.
Found 112779 chunks for avc1
Found 161898 chunks for mp4a
Saving to: /files/SomeEvent_fixed.mp4
```

And that was how I was able to recover the broken mp4 file. Hope this article helps anyone facing the same issue. Feel free to drop a comment if it does.