Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP - Check if audio file is not corrupted

Tags:

php

audio

This is method for creating song object

public function getSong() {
        return new Song($this->rackDir, $this->getLoadedDisc()->getName(), $this->song);
    }

There is Song class

class Song extends CD {
    private $id;

    public function __construct($rack, $name, $id)
    {
        $this->id = $id;
        parent::__construct($rack, $name);

    }

    public function getSelectedSongId() {
        return $this->id;
    }

    public function getSelectedSongPath() {
        $list = $this->getSongsList();

        return $list[$this->id];
        }
    }

    public function getSongInfo () {
        $data = [
            'name' => $this->getName(),
            'size' => $this->getSize(),
        ];

        return $data;
    }

    public function getSize() {
        $path = $this->getPath() . '/' . $this->getName();

        return filesize($path);
    }

    public function getName() {
        return $this->getSelectedSongPath();
    }

}

And there is CD Class where I check if file has audio extension.

class CD {
    private $path;
    private $name;
    private $rack;
    private $validExtensions;

    public function __construct($rack, $name)
    {
        $this->rack = $rack . '/';
        $this->name = $name;
        $this->path = $this->rack . $this->name;
        $this->validExtensions = ['mp3', 'mp4', 'wav'];
    }

    public function getPath() {
        return $this->path;
    }

    public function getName() {
        return $this->name;
    }

    public function getSongsList () {
        $path = $this->rack . $this->name;
        $songsList = [];

        if (!is_dir($path)) {
            return false;
        }
        if ($handle = opendir($path)) {
            while (false !== ($file = readdir($handle)))
            {
                if ($file != "." && $file != ".." && in_array(strtolower(substr($file, strrpos($file, '.') + 1)), $this->validExtensions))
                {
                    array_push($songsList, $file);
                }
            }
            closedir($handle);
        }

        return $songsList;
    }
}

I want to check if File is real audio file and not just file with an audio extension? Is there is method to do that in PHP?

like image 469
Stevan Tosic Avatar asked Sep 06 '25 03:09

Stevan Tosic


1 Answers

Karlos was in right. I was found a solution with this code bellow.

public function validateFile (Song $song) {
    $allowed = array(
        'audio/mp4', 'audio/mp3', 'audio/mpeg3', 'audio/x-mpeg-3', 'audio/mpeg', 'audio/*'
    );

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $info = finfo_file($finfo, $song->getSelectedSongPath());

    if (!in_array($info, $allowed)) {
        die( 'file is empty / corrupted');
    }
    return $song;
}
like image 79
Stevan Tosic Avatar answered Sep 09 '25 18:09

Stevan Tosic