Passed
Push — master ( bc6590...e618e7 )
by Amin
05:42 queued 11s
created

HLSKeyInfo::getSegments()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * This file is part of the PHP-FFmpeg-video-streaming package.
5
 *
6
 * (c) Amin Yazdanpanah <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
13
namespace Streaming;
14
15
16
use FFMpeg\Driver\FFMpegDriver;
17
use Streaming\Exception\RuntimeException;
18
19
class HLSKeyInfo
20
{
21
    /** @var string */
22
    private $path;
23
24
    /** @var string */
25
    private $c_path;
26
27
    /** @var string */
28
    private $url;
29
30
    /** @var string */
31
    private $c_url;
32
33
    /** @var string */
34
    private $key_info_path;
35
36
    /** @var string */
37
    private $suffix = "";
38
39
    /** @var int */
40
    private $length = 16;
41
42
    /** @var array */
43
    private $segments = [];
44
45
    /**
46
     * HLSKeyInfo constructor.
47
     * @param string $path
48
     * @param string $url
49
     */
50
    public function __construct(string $path, string $url)
51
    {
52
        $this->path = $this->c_path = $path;
53
        $this->url = $this->c_url = $url;
54
        File::makeDir(dirname($path));
55
        $this->key_info_path = File::tmp();
56
    }
57
58
    /**
59
     * @param string $path
60
     * @param string $url
61
     * @return HLSKeyInfo
62
     */
63
    public static function create(string $path, string $url): HLSKeyInfo
64
    {
65
        return new static($path, $url);
66
    }
67
68
    /**
69
     * Generate a encryption key
70
     */
71
    public function createKey(): void
72
    {
73
        if (!extension_loaded('openssl')) {
74
            throw new RuntimeException('OpenSSL is not installed.');
75
        }
76
77
        File::put($this->path, openssl_random_pseudo_bytes($this->length));
78
    }
79
80
    /**
81
     * update or generate a key info file
82
     */
83
    public function createKeyInfo(): void
84
    {
85
        $content = implode(
86
            PHP_EOL,
87
            [
88
                $this->url,
89
                $this->path,
90
                bin2hex(openssl_random_pseudo_bytes($this->length))
91
            ]
92
        );
93
        File::put($this->key_info_path, $content);
94
    }
95
96
    /**
97
     * @param FFMpegDriver $driver
98
     * @param int $period
99
     * @param string $needle
100
     */
101
    public function rotateKey(FFMpegDriver $driver, int $period, string $needle): void
102
    {
103
        call_user_func_array([$driver->listen(new FFMpegListener), 'on'], ['listen', $this->call($needle, $period)]);
104
    }
105
106
    /**
107
     * @return void
108
     */
109
    public function generate(): void
110
    {
111
        $this->createKey();
112
        $this->createKeyInfo();
113
    }
114
115
    /**
116
     * @return string
117
     */
118
    public function __toString()
119
    {
120
        $this->generate();
121
        return $this->key_info_path;
122
    }
123
124
    /**
125
     * @param string $key_info_path
126
     * @return HLSKeyInfo
127
     */
128
    public function setKeyInfoPath(string $key_info_path): HLSKeyInfo
129
    {
130
        $this->key_info_path = $key_info_path;
131
        return $this;
132
    }
133
134
    /**
135
     * @param int $length
136
     * @return HLSKeyInfo
137
     */
138
    public function setLength(int $length): HLSKeyInfo
139
    {
140
        $this->length = $length;
141
        return $this;
142
    }
143
144
    /**
145
     * @param string $suffix
146
     * @return HLSKeyInfo
147
     */
148
    public function setSuffix(string $suffix): HLSKeyInfo
149
    {
150
        $this->suffix = $suffix;
151
        return $this;
152
    }
153
154
    /**
155
     * update the suffix of paths
156
     */
157
    public function updateSuffix(): void
158
    {
159
        $suffix = uniqid("_") . $this->suffix;
160
161
        $this->path = $this->c_path . $suffix;
162
        $this->url = $this->c_url . $suffix;
163
    }
164
165
    /**
166
     * check if a new segment is created or not
167
     * @param string $needle
168
     * @param int $period
169
     * @return callable
170
     */
171
    private function call(string $needle, int $period): callable
172
    {
173
        return function ($line) use ($needle, $period) {
174
            if (false !== strpos($line, $needle) && !in_array($line, $this->segments)) {
175
                array_push($this->segments, $line);
176
                if (0 === count($this->segments) % $period) {
177
                    $this->updateSuffix();
178
                    $this->generate();
179
                }
180
            }
181
        };
182
    }
183
184
    /**
185
     * @return array
186
     */
187
    public function getSegments(): array
188
    {
189
        return $this->segments;
190
    }
191
192
    /**
193
     * @return string
194
     */
195
    public function getKeyInfoPath(): string
196
    {
197
        return $this->key_info_path;
198
    }
199
}
200