PluginProbe
Tutor LMS – eLearning and online course solution / 1.0.7
Tutor LMS – eLearning and online course solution v1.0.7
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0 3.9.15 3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 All 191 releases
tutor / classes / Video_Stream.php

Video_Stream.php in Tutor LMS – eLearning and online course solution 1.0.7, at classes/Video_Stream.php

131 lines 3.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Created by PhpStorm.
4 * User: mhshohel
5 * Date: 24/9/18
6 * Time: 4:03 PM
7 */
8
9 namespace TUTOR;
10
11 if ( ! defined( 'ABSPATH' ) )
12 exit;
13
14
15 /**
16 * Class Video_Stream
17 * @package TUTOR
18 *
19 * TUTOR Video Stream Class
20 * @since v.1.0.0
21 */
22
23 class Video_Stream {
24
25 private $path = "";
26 private $stream = "";
27 private $buffer = 102400;
28 private $start = -1;
29 private $end = -1;
30 private $size = 0;
31
32 private $videoFormats;
33
34 function __construct($filePath) {
35 $this->videoFormats = apply_filters('tutor_video_types', array("mp4"=>"video/mp4", "webm"=>"video/webm", "ogg"=>"video/ogg")) ;
36 $this->path = $filePath;
37 }
38
39 /**
40 * Open stream
41 */
42 private function open() {
43 if (!($this->stream = fopen($this->path, 'rb'))) {
44 die('Could not open stream for reading');
45 }
46 }
47
48 /**
49 * Set proper header to serve the video content
50 */
51 private function setHeader() {
52 ob_get_clean();
53
54 header("Content-Type: {$this->videoFormats[strtolower(pathinfo($this->path, PATHINFO_EXTENSION))]}");
55 header("Cache-Control: max-age=2592000, public");
56 header("Expires: ".gmdate('D, d M Y H:i:s', time()+2592000) . ' GMT');
57 header("Last-Modified: ".gmdate('D, d M Y H:i:s', @filemtime($this->path)) . ' GMT' );
58 $this->start = 0;
59 $this->size = filesize($this->path);
60 $this->end = $this->size - 1;
61 header("Accept-Ranges: 0-".$this->end);
62
63 if (isset($_SERVER['HTTP_RANGE'])) {
64 $c_end = $this->end;
65 list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
66
67 if ($range == '-') {
68 $c_start = $this->size - substr($range, 1);
69 }else{
70 $range = explode('-', $range);
71 $c_start = $range[0];
72
73 $c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $c_end;
74 }
75 $c_end = ($c_end > $this->end) ? $this->end : $c_end;
76 if ($c_start > $c_end || $c_start > $this->size - 1 || $c_end >= $this->size) {
77 header('HTTP/1.1 416 Requested Range Not Satisfiable');
78 header("Content-Range: bytes $this->start-$this->end/$this->size");
79 exit;
80 }
81 $this->start = $c_start;
82 $this->end = $c_end;
83 $length = $this->end - $this->start + 1;
84 header('HTTP/1.1 206 Partial Content');
85 header("Content-Length: ".$length);
86 header("Content-Range: bytes $this->start-$this->end/".$this->size);
87 header("Accept-Ranges: bytes");
88 }
89 else {
90 header("Content-Length: ".$this->size);
91 }
92
93 }
94
95 /**
96 * close currently opened stream
97 */
98 private function end() {
99 fclose($this->stream);
100 exit;
101 }
102
103 /**
104 * perform the streaming of calculated range
105 */
106 private function stream() {
107 $i = $this->start;
108 set_time_limit(0);
109 while(!feof($this->stream) && $i <= $this->end) {
110 $bytesToRead = $this->buffer;
111 if(($i+$bytesToRead) > $this->end) {
112 $bytesToRead = $this->end - $i + 1;
113 }
114 //$data = fread($this->stream, $bytesToRead);
115 $data = @stream_get_contents($this->stream, $bytesToRead, $i);
116 echo $data;
117 flush();
118 $i += $bytesToRead;
119 }
120 }
121
122 /**
123 * Start streaming tutor video content
124 */
125 function start() {
126 $this->open();
127 $this->setHeader();
128 $this->stream();
129 $this->end();
130 }
131 }