wapmorgan / Mp3Info

The fastest PHP library to extract mp3 meta information (duration, bitrate, samplerate and so on) and tags (id3v1, id3v2).
https://wapmorgan.github.io/Mp3Info/
GNU Lesser General Public License v3.0
139 stars 41 forks source link

fix: generate exception if codec/layer versions or channel headers are unrecognized #36

Open joshtrichards opened 5 months ago

joshtrichards commented 5 months ago

Thanks (once again) for the useful library we use over at the Nextcloud project!

While looking into nextcloud/server#44573, I noted we might as well throw an informative exception if the codecVersion, layerVersion, or channel headers are unrecognized.

We're going to error out anyway when we try to use empty values for the array key. Instead of generating generic PHP errors when we go to set the bitRate and sampleRate or vbr_offset we can leave the user a bit less confused about the underlying cause.

I don't even know what MP3s might cause this, but seems reasonable to handle this situation cleanly if possible. :)

jeremitu commented 4 months ago

This is not sufficient, we need to consider CODEC_UNDEFINED, which is not covered by the tables:

        if ($this->codecVersion == self::CODEC_UNDEFINED) {
            throw new \Exception('Codec undefined');
        }
kesselb commented 3 months ago

@joshtrichards mind to update your pr with jeremitu's suggestion?

I will patch the copy in nextcloud/3rdparty then.

joshtrichards commented 2 months ago

Done.

Rather than add a check for it, I dropped CODEC_UNDEFINED outright in the parser. It's "documented" only as reserved from all the mp3 header docs I can find online, including the one referenced from this repo @ http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm

It got added as part of the fix for #14, but that was for MPEG_25 and I think CODEC_UNDEFINED just got tossed in there for completeness at the time. We're not bothering to parse the the "reserved" ones elsewhere (e.g. for the layerVersion) so I don't see why it makes sense to do it for the codecVersion (particularly given all we can do is fail on it later anyhow).