PhpMp3Info   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 61
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 3
dl 0
loc 61
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A extractId3Tags() 0 10 2
A setFilePath() 0 6 1
A parse() 0 15 1
A executeCommand() 0 12 2
1
<?php
2
3
namespace Mhor\PhpMp3Info;
4
5
use Symfony\Component\Filesystem\Filesystem;
6
use Symfony\Component\Process\Process;
7
8
/**
9
 * Execute mp3info command line tool and parse the output.
10
 *
11
 * @package Mhor\PhpMp3Info
12
 */
13
class PhpMp3Info
14
{
15
    protected $filePath;
16
17
    protected $command;
18
19
    protected $arguments;
20
21
    public function __construct(string $command = 'mp3info', string $arguments = "-p'%a|%t|%n|%l|%m:%s|%r'")
22
    {
23
        $this->command   = $command;
24
        $this->arguments = $arguments;
25
    }
26
27
    public function extractId3Tags(string $filePath): Mp3Tags
28
    {
29
        $this->setFilePath($filePath);
30
        $fileSystem = new Filesystem();
31
        if (!$fileSystem->exists($this->filePath)) {
32
            throw new \Exception('File doesn\'t exist');
33
        }
34
35
        return $this->parse($this->executeCommand());
36
    }
37
38
    protected function setFilePath(string $filePath): self
39
    {
40
        $this->filePath = $filePath;
41
42
        return $this;
43
    }
44
45
    protected function parse(string $output): Mp3Tags
46
    {
47
        $result = explode('|', trim($output));
48
49
        $mp3Tags = new Mp3Tags();
50
        $mp3Tags->setArtist($result[0])
51
                ->setTitle($result[1])
52
                ->setTrack((int)$result[2])
53
                ->setAlbum($result[3])
54
                ->setLength($result[4])
55
                ->setBitrate($result[5])
56
                ->setFilePath($this->filePath);
57
58
        return $mp3Tags;
59
    }
60
61
    protected function executeCommand(): string
62
    {
63
        $process = new Process($this->command.' '.$this->arguments. ' '.$this->filePath);
64
        $process->run();
65
66
        if (!$process->isSuccessful()) {
67
68
            throw new \RuntimeException($process->getErrorOutput());
69
        }
70
71
        return $process->getOutput();
72
    }
73
}
74