Completed
Push — id3-metadata-objects ( 384c4c...c855dc )
by Daniel
02:54
created

FrameMetadata   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 104
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 9
c 1
b 0
f 0
lcom 1
cbo 2
dl 0
loc 104
ccs 0
cts 36
cp 0
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A readName() 0 8 2
A readSize() 0 12 3
B readFlags() 0 26 2
A readDataLength() 0 4 1
1
<?php
2
/**
3
 * This file is part of the Metadata package.
4
 *
5
 * @author Daniel Schröder <[email protected]>
6
 */
7
8
namespace GravityMedia\Metadata\ID3v2\Metadata;
9
10
use GravityMedia\Metadata\ID3v2\Filter\SynchsafeIntegerFilter;
11
use GravityMedia\Metadata\ID3v2\Flag\FrameFlag;
12
use GravityMedia\Metadata\ID3v2\Version;
13
use GravityMedia\Stream\Stream;
14
15
/**
16
 * ID3v2 frame metadata class.
17
 *
18
 * @package GravityMedia\Metadata\ID3v2\Metadata
19
 */
20
class FrameMetadata
21
{
22
    /**
23
     * @var Stream
24
     */
25
    protected $stream;
26
27
    /**
28
     * @var int
29
     */
30
    protected $version;
31
32
    /**
33
     * @var SynchsafeIntegerFilter
34
     */
35
    protected $synchsafeIntegerFilter;
36
37
    /**
38
     * Create ID3v2 frame metadata object.
39
     *
40
     * @param Stream $stream
41
     * @param int    $version
42
     */
43
    public function __construct(Stream $stream, $version)
44
    {
45
        $this->stream = $stream;
46
        $this->version = $version;
47
        $this->synchsafeIntegerFilter = new SynchsafeIntegerFilter();
48
    }
49
50
    /**
51
     * Read ID3v2 frame name.
52
     *
53
     * @return string
54
     */
55
    public function readName()
56
    {
57
        if (Version::VERSION_22 === $this->version) {
58
            return rtrim($this->stream->read(3));
59
        }
60
61
        return rtrim($this->stream->read(4));
62
    }
63
64
    /**
65
     * Read ID3v2 frame size.
66
     *
67
     * @return int
68
     */
69
    public function readSize()
70
    {
71
        if (Version::VERSION_22 === $this->version) {
72
            return $this->stream->readUInt24();
73
        }
74
75
        if (Version::VERSION_23 === $this->version) {
76
            return $this->stream->readUInt32();
77
        }
78
79
        return $this->synchsafeIntegerFilter->decode($this->stream->readUInt32());
80
    }
81
82
    /**
83
     * Read ID3v2 frame flags.
84
     *
85
     * @return array
86
     */
87
    public function readFlags()
88
    {
89
        $flags = $this->stream->readUInt16();
90
91
        if (Version::VERSION_23 === $this->version) {
92
            return [
93
                FrameFlag::FLAG_TAG_ALTER_PRESERVATION => (bool)($flags & 0x8000),
94
                FrameFlag::FLAG_FILE_ALTER_PRESERVATION => (bool)($flags & 0x4000),
95
                FrameFlag::FLAG_READ_ONLY => (bool)($flags & 0x2000),
96
                FrameFlag::FLAG_COMPRESSION => (bool)($flags & 0x0080),
97
                FrameFlag::FLAG_ENCRYPTION => (bool)($flags & 0x0040),
98
                FrameFlag::FLAG_GROUPING_IDENTITY => (bool)($flags & 0x0020),
99
            ];
100
        }
101
102
        return [
103
            FrameFlag::FLAG_TAG_ALTER_PRESERVATION => (bool)($flags & 0x4000),
104
            FrameFlag::FLAG_FILE_ALTER_PRESERVATION => (bool)($flags & 0x2000),
105
            FrameFlag::FLAG_READ_ONLY => (bool)($flags & 0x1000),
106
            FrameFlag::FLAG_GROUPING_IDENTITY => (bool)($flags & 0x0040),
107
            FrameFlag::FLAG_COMPRESSION => (bool)($flags & 0x0008),
108
            FrameFlag::FLAG_ENCRYPTION => (bool)($flags & 0x0004),
109
            FrameFlag::FLAG_UNSYNCHRONISATION => (bool)($flags & 0x0002),
110
            FrameFlag::FLAG_DATA_LENGT_INDICATOR => (bool)($flags & 0x0001),
111
        ];
112
    }
113
114
    /**
115
     * Read ID3v2 frame data length.
116
     *
117
     * @return int
118
     */
119
    public function readDataLength()
120
    {
121
        return $this->synchsafeIntegerFilter->decode($this->stream->readUInt32());
122
    }
123
}
124