From 81bf7d2b0747cd9e4a87a848356807b376ba1caa Mon Sep 17 00:00:00 2001 From: Mischa Spelt Date: Fri, 1 Sep 2017 22:29:32 +0200 Subject: [PATCH] Kerkdienst terugluisteren --- .../Http/Controllers/KerkdienstController.php | 101 ++++++++++++++++++ .../Http/Controllers/PodcastController.php | 21 +--- api/routes/web.php | 3 + common/classes/Podcast.php | 2 +- 4 files changed, 107 insertions(+), 20 deletions(-) create mode 100644 api/app/Http/Controllers/KerkdienstController.php diff --git a/api/app/Http/Controllers/KerkdienstController.php b/api/app/Http/Controllers/KerkdienstController.php new file mode 100644 index 0000000..9d2172c --- /dev/null +++ b/api/app/Http/Controllers/KerkdienstController.php @@ -0,0 +1,101 @@ + DATE_SUB("2017-09-02", INTERVAL 7 DAY) + ORDER BY `zondagdienst`.`datum` ASC + LIMIT 2 +QUERY; + + /** + * Create a new controller instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Gegevens over laatste en huidige dienst + */ + public function get() { + + $isAvailable = ((date('N') % 7) != 0) || (time() > strtotime('today noon')); + $lastNext = app('db')->select(self::$BASE_SQL); + return response()->json([ + 'available' => $isAvailable, + 'lastNext' => $lastNext]); + } + + /** + * Podcast van de laatste kerkdienst + */ + public function podcast() { + $file = '/var/audio/podcast/6fm-kerkdienst.mp3'; + $size = filesize($file); + + $headers = [ + 'Pragma' => 'public', + 'Expires' => '-1', + 'Cache-Control' => 'public,must-revalidate,post-check=0,pre-check=0', + 'Content-Type' => 'audio/mpeg', + 'Content-Length' => $size, + 'Accept-Ranges' => 'bytes' + ]; + + $range = []; + if(isset($_SERVER['HTTP_RANGE'])) { + list($unit, $rangestr) = explode('=', $_SERVER['HTTP_RANGE'], 2); + if($unit == "bytes") { + $range = explode('-', $rangestr); + $range[1] = (empty($range[1])) ? ($size - 1) : min(abs(intval($range[1])), ($size - 1)); + $range[0] = (empty($range[0]) || $range[1] < abs(intval($range[0]))) ? 0 : max(abs(intval($range[0])), 0); + $range[2] = ($range[1] - $range[0] + 1); + + $headers['Content-Range'] = 'bytes ' . $range[0] . '-' . $range[1] . '/' . $size; + $headers['Content-Length'] = $range[2]; + } + } + + if($range === null) { + response()->abort(416); // Requested Range Not Satisfiable + return; + } + + return new StreamedResponse(function() use($file, $range) { + $output = fopen('php://output', 'w'); + + $fp = fopen($file, 'rb'); + if(count($range) && $range[0]) { + fseek($fp, $range[0]); + $range[0] = 0; + } + + $maxToRead = count($range) ? min(1024, $range[2]) : 1024; + while ($buf = fread($fp, $maxToRead)) { + fwrite($output, $buf); + if(count($range)) { + $maxToRead = min(1024, $range[2]); + $bufSize = mb_strlen($buf, '8bit'); + if(($range[2] -= $bufSize) == 0) { + break; + } + } + + } + + fclose($fp); + fclose($output); + }, count($range) ? 206 : 200, $headers); + } +} diff --git a/api/app/Http/Controllers/PodcastController.php b/api/app/Http/Controllers/PodcastController.php index b037faa..186590a 100644 --- a/api/app/Http/Controllers/PodcastController.php +++ b/api/app/Http/Controllers/PodcastController.php @@ -185,36 +185,23 @@ QUERY; $range[0] = (empty($range[0]) || $range[1] < abs(intval($range[0]))) ? 0 : max(abs(intval($range[0])), 0); $range[2] = ($range[1] - $range[0] + 1); - //if($range[0] > 0 || $range[1] < ($size - 1)) { - $headers['Content-Range'] = 'bytes ' . $range[0] . '-' . $range[1] . '/' . $size; - $headers['Content-Length'] = $range[2]; - //} + $headers['Content-Range'] = 'bytes ' . $range[0] . '-' . $range[1] . '/' . $size; + $headers['Content-Length'] = $range[2]; } } if($range === null) { - // $log = fopen('/tmp/rq.log', 'a'); - // fwrite($log, "Aborting (416)!\n\n"); - // fclose($log); response()->abort(416); // Requested Range Not Satisfiable return; } return new StreamedResponse(function() use($files, $range) { - // $log = fopen('/tmp/rq.log', 'a'); - // if(!count($range)) { - // fwrite($log, "Writing everything.\n"); - // } else { - // fwrite($log, "Writing {$range[2]} bytes ({$range[0]} - {$range[1]})\n"); - //} $output = fopen('php://output', 'w'); foreach($files as $file) { if(count($range) && $range[0] >= $file[1]) { // We have a range and can skip the whole file - // fwrite($log, "Skipping all of {$file[0]}.\n"); continue; } - // else fwrite($log, "File {$file[0]} is {$file[1]} bytes (starting from {$range[0]}).\n"); $fp = fopen($file[0], 'rb'); if(count($range) && $range[0]) { @@ -228,15 +215,12 @@ QUERY; if(count($range)) { $maxToRead = min(1024, $range[2]); $bufSize = mb_strlen($buf, '8bit'); - // $bytes += $bufSize; if(($range[2] -= $bufSize) == 0) { - // fwrite($log, "Stopping reading from {$file[0]} because end of range reached.\n"); break; } } } - // fwrite($log, "Wrote $bytes bytes.\n"); fclose($fp); if(count($range) && $range[2] == 0) { @@ -245,7 +229,6 @@ QUERY; } fclose($output); - // fclose($log); }, count($range) ? 206 : 200, $headers); } diff --git a/api/routes/web.php b/api/routes/web.php index cdbac58..0faf50b 100644 --- a/api/routes/web.php +++ b/api/routes/web.php @@ -36,5 +36,8 @@ $app->get('programma/details/{id:\d+}', 'ProgramController@details' ); $app->get('programma/schema/test/{from}/{to}', 'ProgramController@testSchedule' ); $app->get('programma/download/{year:20\d\d}/{month:\d\d?}/{day:\d\d?}/{hour:\d\d?}/{duration:\d\d?}', 'PodcastController@complete'); +$app->get('kerkdienst', 'KerkdienstController@get'); +$app->get('kerkdienst/download', 'KerkdienstController@podcast'); + // live/onair // live/stream diff --git a/common/classes/Podcast.php b/common/classes/Podcast.php index bdd499f..7c5a520 100644 --- a/common/classes/Podcast.php +++ b/common/classes/Podcast.php @@ -27,7 +27,7 @@ class Podcast extends Model { $this->auth = $this->key; } - if($data->program) { + if(isset($data->program) && $data->program) { if(is_object($data->program)) { $this->program = new \Model\Program($data->program); } else {