Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/tutor/classes/Video_Stream.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 + /**
3 + * Video Stream
4 + *
5 + * @package Tutor\VideoStream
6 + * @author Themeum <support@themeum.com>
7 + * @link https://themeum.com
8 + * @since 1.0.0
9 + */
10 +
11 + namespace TUTOR;
12 +
13 + if ( ! defined( 'ABSPATH' ) ) {
14 + exit;
15 + }
16 +
17 +
18 + /**
19 + * Class Video_Stream
20 + *
21 + * @since 1.0.0
22 + */
23 + class Video_Stream {
24 +
25 + /**
26 + * Path
27 + *
28 + * @since 1.0.0
29 + *
30 + * @var string
31 + */
32 + private $path = '';
33 +
34 + /**
35 + * Stream
36 + *
37 + * @since 1.0.0
38 + *
39 + * @var string
40 + */
41 + private $stream = '';
42 +
43 + /**
44 + * Buffer time
45 + *
46 + * @since 1.0.0
47 + *
48 + * @var string
49 + */
50 + private $buffer = 102400;
51 +
52 + /**
53 + * Start
54 + *
55 + * @since 1.0.0
56 + *
57 + * @var int
58 + */
59 + private $start = -1;
60 +
61 + /**
62 + * End
63 + *
64 + * @since 1.0.0
65 + *
66 + * @var int
67 + */
68 + private $end = -1;
69 +
70 + /**
71 + * Size
72 + *
73 + * @since 1.0.0
74 + *
75 + * @var int
76 + */
77 + private $size = 0;
78 +
79 + /**
80 + * Video format
81 + *
82 + * @since 1.0.0
83 + *
84 + * @var string
85 + */
86 + private $video_format;
87 +
88 + /**
89 + * Resolve dependencies
90 + *
91 + * @since 1.0.0
92 + *
93 + * @param string $file_path file path.
94 + */
95 + public function __construct( $file_path ) {
96 + $this->video_format = apply_filters(
97 + 'tutor_video_types',
98 + array(
99 + 'mp4' => 'video/mp4',
100 + 'webm' => 'video/webm',
101 + 'ogg' => 'video/ogg',
102 + )
103 + );
104 + $this->path = $file_path;
105 + }
106 +
107 + /**
108 + * Open stream
109 + *
110 + * @since 1.0.0
111 + *
112 + * @return void
113 + */
114 + private function open() {
115 + $this->stream = fopen( $this->path, 'rb' );
116 + if ( ! ( $this->stream ) ) {
117 + die( 'Could not open stream for reading' );
118 + }
119 + }
120 +
121 + /**
122 + * Set proper header to serve the video content
123 + *
124 + * @since 1.0.0
125 + *
126 + * @return void
127 + */
128 + private function set_header() {
129 + ob_get_clean();
130 +
131 + header( 'Content-Type: ' . $this->video_format[ strtolower( pathinfo( $this->path, PATHINFO_EXTENSION ) ) ] );
132 + header( 'Cache-Control: max-age=2592000, public' );
133 + header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', tutor_time() + 2592000 ) . ' GMT' );
134 + header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s', @filemtime( $this->path ) ) . ' GMT' );
135 + $this->start = 0;
136 + $this->size = filesize( $this->path );
137 + $this->end = $this->size - 1;
138 + header( 'Accept-Ranges: 0-' . $this->end );
139 +
140 + if ( isset( $_SERVER['HTTP_RANGE'] ) ) {
141 + $c_end = $this->end;
142 + list(, $range) = explode( '=', sanitize_text_field( wp_unslash( $_SERVER['HTTP_RANGE'] ) ), 2 );
143 +
144 + if ( '-' == $range ) {
145 + $c_start = $this->size - substr( $range, 1 );
146 + } else {
147 + $range = explode( '-', $range );
148 + $c_start = $range[0];
149 +
150 + $c_end = ( isset( $range[1] ) && is_numeric( $range[1] ) ) ? $range[1] : $c_end;
151 + }
152 + $c_end = ( $c_end > $this->end ) ? $this->end : $c_end;
153 + if ( $c_start > $c_end || $c_start > $this->size - 1 || $c_end >= $this->size ) {
154 + header( 'HTTP/1.1 416 Requested Range Not Satisfiable' );
155 + header( "Content-Range: bytes $this->start-$this->end/$this->size" );
156 + exit;
157 + }
158 + $this->start = $c_start;
159 + $this->end = $c_end;
160 + $length = $this->end - $this->start + 1;
161 + header( 'HTTP/1.1 206 Partial Content' );
162 + header( 'Content-Length: ' . $length );
163 + header( "Content-Range: bytes $this->start-$this->end/" . $this->size );
164 + header( 'Accept-Ranges: bytes' );
165 + } else {
166 + header( 'Content-Length: ' . $this->size );
167 + }
168 +
169 + }
170 +
171 + /**
172 + * Close currently opened stream
173 + *
174 + * @since 1.0.0
175 + *
176 + * @return void
177 + */
178 + private function end() {
179 + fclose( $this->stream );
180 + exit;
181 + }
182 +
183 + /**
184 + * Perform the streaming of calculated range
185 + *
186 + * @since 1.0.0
187 + *
188 + * @return void
189 + */
190 + private function stream() {
191 + $i = $this->start;
192 + set_time_limit( 0 );
193 + while ( ! feof( $this->stream ) && $i <= $this->end ) {
194 + $bytes_to_read = $this->buffer;
195 + if ( ( $i + $bytes_to_read ) > $this->end ) {
196 + $bytes_to_read = $this->end - $i + 1;
197 + }
198 + $data = @stream_get_contents( $this->stream, $bytes_to_read, $i );
199 + echo wp_kses_post( $data );
200 + flush();
201 + $i += $bytes_to_read;
202 + }
203 + }
204 +
205 + /**
206 + * Start streaming tutor video content
207 + *
208 + * @since 1.0.0
209 + *
210 + * @return void
211 + */
212 + public function start() {
213 + $this->open();
214 + $this->set_header();
215 + $this->stream();
216 + $this->end();
217 + }
218 + }
219 +