support new config and playlist format

This commit is contained in:
Jonathan Baecker 2019-08-15 13:51:27 +02:00
parent 7499ed9ae2
commit f9a1828bb7
3 changed files with 91 additions and 177 deletions

View File

@ -52,12 +52,16 @@ function modal(btOK, btCan, video, title, content, x, y, callback) {
} }
//get date //get date
function get_date(hour, seek_day) { function get_date(t, seek_day) {
var raw_date = moment(); var datetime = moment();
if (raw_date.format("H") < parseInt(hour) && seek_day) { var l_time = t.split(":");
return raw_date.add(-1, 'days'); l_stamp = parseInt(l_time[0]) * 3600 + parseInt(l_time[1]) * 60 + parseInt(l_time[2]);
t_stamp = moment.duration(datetime.format("H:M:S")).asSeconds();
if (l_stamp > 0 && l_stamp > t_stamp && seek_day) {
return datetime.add(-1, 'days');
} else { } else {
return raw_date; return datetime;
} }
} }
@ -137,12 +141,12 @@ function init_browse_click() {
} }
// call php script to navigatge to the selected folder on the server // call php script to navigatge to the selected folder on the server
function browse(current_data) { function browse(c_data) {
$.get("functions.php" + current_data + "&head=get", function(data) { $.get("functions.php" + c_data + "&head=get", function(data) {
$('#browserHead').html(data); $('#browserHead').html(data);
}); });
$.get("functions.php" + current_data + "&ul=get", function(data) { $.get("functions.php" + c_data + "&ul=get", function(data) {
$('#rootDirectory').html(data); $('#rootDirectory').html(data);
init_browse_click(); init_browse_click();
}); });
@ -151,13 +155,17 @@ function browse(current_data) {
// first page load will open the media directory // first page load will open the media directory
window.onload = function() { window.onload = function() {
$.get("resources/list_op.php?clips_root=get", function(result) { $.get("resources/list_op.php?clips_root=get", function(result) {
browse("?dir=" + result); browse("?dir=" + result.replace(/^\//g, ''));
}); });
$.get("resources/list_op.php?list_start=get", function(result) { $.get("resources/list_op.php?list_start=get", function(result) {
var l_time = result.split(":");
var l_stamp = parseInt(l_time[0]) * 3600 + parseInt(l_time[1]) * 60 + parseInt(l_time[2]);
var list_date = get_date(result, true); var list_date = get_date(result, true);
// write playlist date to list attribute, for later use // write playlist date to list attribute, for later use
$('#playlistBody').attr('listday', list_date.format("YYYY-MM-DD")); $('#playlistBody').attr('listday', list_date.format("YYYY-MM-DD"));
$('#playlistBody').attr('liststart', l_stamp);
// read playlist from current day // read playlist from current day
get_json(list_date.format("YYYY-MM-DD"), true); get_json(list_date.format("YYYY-MM-DD"), true);
}); });
@ -252,7 +260,8 @@ function reorder_playlist() {
// get start time from: /etc/ffplayout/ffplayout.conf // get start time from: /etc/ffplayout/ffplayout.conf
$.get("resources/list_op.php?list_start=get", function(result) { $.get("resources/list_op.php?list_start=get", function(result) {
var reorder = document.getElementById("playlistBody").getElementsByClassName("list-item"); var reorder = document.getElementById("playlistBody").getElementsByClassName("list-item");
var start_time = parseFloat(result * 3600); var l_time = result.split(":");
var start_time = parseFloat(l_time[0]) * 3600 + parseFloat(l_time[1]) * 60 + parseFloat(l_time[2]);
var time_format, cur_in, cur_out; var time_format, cur_in, cur_out;
for (var i = 0; i < reorder.length; i++) { for (var i = 0; i < reorder.length; i++) {
@ -281,39 +290,37 @@ function jump_and_colorize_title(jump) {
var play_begin, play_dur; var play_begin, play_dur;
$.get("resources/list_op.php?list_start=get", function(result) { $.get("resources/list_op.php?list_start=get", function(result) {
list_date = get_date(result, true); var list_date = get_date(result, true);
if (list_date.format("H") < parseInt(result)) { if (list_date.format("H") < parseInt(result)) {
time_in_seconds += 86400 time_in_seconds += 86400
} }
$.get("resources/list_op.php?time_shift=get", function(shift) { if ($('#playlistBody').attr('listday') === list_date.format("YYYY-MM-DD")) {
if ($('#playlistBody').attr('listday') === list_date.format("YYYY-MM-DD")) { for (var i = 0; i < play_items.length; i++) {
for (var i = 0; i < play_items.length; i++) { play_begin = parseFloat($(play_items[i]).attr('begin'));
play_begin = parseFloat($(play_items[i]).attr('begin')) - parseFloat(shift); play_dur = parseFloat($(play_items[i]).attr('dur'));
play_dur = parseFloat($(play_items[i]).attr('dur')); if (play_begin + play_dur >= time_in_seconds) {
if (play_begin + play_dur >= time_in_seconds) { // jump to position only after page load
// jump to position only after page load if (jump) {
if (jump) { $('#list-container').animate({
$('#list-container').animate({ scrollTop: $('#playlistBody li:nth-child(' + (i-1) + ')').position().top
scrollTop: $('#playlistBody li:nth-child(' + (i-1) + ')').position().top }, 500, "easeOutQuint");
}, 500, "easeOutQuint");
}
// colorize items
$(play_items[i]).addClass('current_item');
$(play_items[i+1]).addClass('next_item');
$('.list-item:gt('+(i+1)+')').addClass('last_items');
break;
} }
}
} else { // colorize items
// scroll to playlist top $(play_items[i]).addClass('current_item');
if (jump) { $(play_items[i+1]).addClass('next_item');
$('#list-container').animate({scrollTop: 0}, 500, "easeOutQuint"); $('.list-item:gt('+(i+1)+')').addClass('last_items');
break;
} }
} }
}); } else {
// scroll to playlist top
if (jump) {
$('#list-container').animate({scrollTop: 0}, 500, "easeOutQuint");
}
}
}); });
} }
@ -355,24 +362,24 @@ header functions
var intervalId = null; var intervalId = null;
function get_track_list(interval) { function get_track_list(interval) {
var begin, src, dur, seek, out, time_left; var begin, seek, out, time_left;
$.get("resources/player.php?track=get", function(result) { $.get("resources/player.php?track=get", function(result) {
function get_track() { function get_track() {
var moment_time = moment().format('HH:mm:ss'); var moment_time = moment().format('HH:mm:ss');
var time_in_seconds = parseFloat(moment.duration(moment_time).asSeconds()); var time_in_seconds = parseFloat(moment.duration(moment_time).asSeconds());
var json = $.parseJSON(result); var json = $.parseJSON(result);
var playlist_start = parseFloat(json[0]['start'][0]); var playlist_start = parseFloat($('#playlistBody').attr('liststart'));
if (0.0 <= time_in_seconds && time_in_seconds < playlist_start * 3600.0) { if (0.0 <= time_in_seconds && time_in_seconds < playlist_start) {
time_in_seconds += 86400.0; time_in_seconds += 86400.0;
} }
$.each(json, function (index, value) { begin = playlist_start;
begin = parseFloat(value['begin'][0]);
dur = parseFloat(value['dur'][0]); $.each(json, function (_index, value) {
seek = parseFloat(value['in'][0]); seek = parseFloat(value['in']);
out = parseFloat(value['out'][0]); out = parseFloat(value['out']);
if (time_in_seconds < begin + out - seek ) { if (time_in_seconds < begin + out - seek ) {
time_left = begin + out - seek - time_in_seconds; time_left = begin + out - seek - time_in_seconds;
@ -380,6 +387,8 @@ function get_track_list(interval) {
$('#title').html((value['src'])); $('#title').html((value['src']));
return false; return false;
} }
begin += out - seek;
}); });
} }
if (interval) { if (interval) {
@ -387,7 +396,6 @@ function get_track_list(interval) {
} else { } else {
clearInterval(refreshIntervalId); clearInterval(refreshIntervalId);
} }
}); });
} }
@ -521,7 +529,6 @@ $(document).ready(function() {
var save_list = []; var save_list = [];
$('#playlistBody li.list-item').each(function(){ $('#playlistBody li.list-item').each(function(){
save_list.push({ save_list.push({
begin:$(this).attr('begin'),
src:$(this).attr('src'), src:$(this).attr('src'),
dur:$(this).attr('dur'), dur:$(this).attr('dur'),
in:$(this).attr('in'), in:$(this).attr('in'),
@ -562,7 +569,6 @@ $(document).ready(function() {
var save_list = []; var save_list = [];
$('#playlistBody li.list-item').each(function(){ $('#playlistBody li.list-item').each(function(){
save_list.push({ save_list.push({
begin:$(this).attr('begin'),
src:$(this).attr('src'), src:$(this).attr('src'),
dur:$(this).attr('dur'), dur:$(this).attr('dur'),
in:$(this).attr('in'), in:$(this).attr('in'),
@ -581,7 +587,6 @@ $(document).ready(function() {
modal(null, null, null, "Fill Playlist", "Filling Playlist in progress...", 'auto', 'auto', function(result) {}); modal(null, null, null, "Fill Playlist", "Filling Playlist in progress...", 'auto', 'auto', function(result) {});
}, },
success: function(result) { success: function(result) {
// console.log(result);
$('#dialog-confirm').dialog("close"); $('#dialog-confirm').dialog("close");
modal(true, null, null, "Fill Playlist", result + "<br/><b>Filled Time:</b> " + moment.utc(Math.abs(missed_length) * 1000).format('HH:mm:ss'), 'auto', 'auto', function(result) {}); modal(true, null, null, "Fill Playlist", result + "<br/><b>Filled Time:</b> " + moment.utc(Math.abs(missed_length) * 1000).format('HH:mm:ss'), 'auto', 'auto', function(result) {});
get_json(date, false); get_json(date, false);

View File

@ -5,43 +5,22 @@ read values from ffplayout config file
------------------------------------------------------------------------------*/ ------------------------------------------------------------------------------*/
// get config file // get config file
function get_config() { function get_ini() {
return file_get_contents("/etc/ffplayout/ffplayout.conf"); return parse_ini_file("/etc/ffplayout/ffplayout.conf", TRUE, INI_SCANNER_RAW);
} }
// get start time // get start time
if(!empty($_GET['list_start'])) { if(!empty($_GET['list_start'])) {
$get_ini = get_config(); $ini = get_ini();
$get_start = "/^day_start.*\$/m"; echo $ini['PLAYLIST']['day_start'];
preg_match_all($get_start, $get_ini, $matches);
$line = implode("\n", $matches[0]);
echo explode("= ", $line)[1];
} }
// get clips root directory // get clips root directory
if(!empty($_GET['clips_root'])) { if(!empty($_GET['clips_root'])) {
$get_ini = get_config(); $ini = get_ini();
$get_root = "/^clips_root.*\$/m"; echo $ini['STORAGE']['path'];
preg_match_all($get_root, $get_ini, $matches);
$line = implode("\n", $matches[0]);
$root = substr(explode("= ", $line)[1], 1);
echo $root;
} }
// get time_shift
if (!empty($_GET['time_shift'])) {
$get_ini = get_config();
$get_shift = "/^time_shift.*\$/m";
preg_match_all($get_shift, $get_ini, $shift_arr);
$line_shift = implode("\n", $shift_arr[0]);
$time_shift = explode("= ", $line_shift)[1];
if(empty($time_shift)) {
echo 0;
} else {
echo $time_shift;
}
}
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
json playlist operations json playlist operations
@ -65,19 +44,16 @@ $ext = implode('|', $except);
if(!empty($_GET['json_path'])) { if(!empty($_GET['json_path'])) {
$json_date = $_GET['json_path']; $json_date = $_GET['json_path'];
$date_str = explode('-', $json_date); $date_str = explode('-', $json_date);
$get_ini = get_config(); $ini = get_ini();
$get_dir = "/^playlist_path.*\$/m"; $dir = $ini['PLAYLIST']['path'];
preg_match_all($get_dir, $get_ini, $matches);
$line = implode("\n", $matches[0]);
$path_root = explode("= ", $line)[1];
$json_path = $path_root . "/" . $date_str[0] . "/" . $date_str[1] . "/" . $json_date . ".json"; $json_path = $dir . "/" . $date_str[0] . "/" . $date_str[1] . "/" . $json_date . ".json";
if (file_exists($json_path)) { if (file_exists($json_path)) {
$content = file_get_contents($json_path) or die("Error: Cannot create object"); $content = file_get_contents($json_path) or die("Error: Cannot create object");
$json = json_decode($content, true); $json = json_decode($content, true);
list($hh, $mm, $ss) = explode(":", $json["begin"]); list($hh, $mm, $ss) = explode(":", $ini['PLAYLIST']['day_start']);
list($l_hh, $l_mm, $l_ss) = explode(":", $json["length"]); list($l_hh, $l_mm, $l_ss) = explode(":", $json["length"]);
$start = $hh * 3600 + $mm * 60 + $ss; $start = $hh * 3600 + $mm * 60 + $ss;
@ -185,22 +161,15 @@ if(!empty($_POST['save'])) {
$date = $_POST['date']; $date = $_POST['date'];
$date_str = explode('-', $date); $date_str = explode('-', $date);
// get save path // get save path
$get_ini = get_config(); $ini = get_ini();
$get_dir = "/^playlist_path.*\$/m"; $dir = $ini['PLAYLIST']['path'];
preg_match_all($get_dir, $get_ini, $matches); $json_path = $dir . "/" . $date_str[0] . "/" . $date_str[1];
$line = implode("\n", $matches[0]);
$path_root = explode("= ", $line)[1];
$json_path = $path_root . "/" . $date_str[0] . "/" . $date_str[1];
$json_output = $json_path . "/" . $date . ".json"; $json_output = $json_path . "/" . $date . ".json";
$beginRaw = round($raw_arr[0]->begin);
$start = sprintf('%02d:%02d:%02d', ($beginRaw/3600),($beginRaw/60%60), $beginRaw%60);
// prepare header // prepare header
$list = array( $list = array(
"channel" => "Test 1", "channel" => "Test 1",
"date" => $date, "date" => $date,
"begin" => $start,
"length" => "24:00:00.000", "length" => "24:00:00.000",
"program" => [] "program" => []
); );
@ -232,69 +201,4 @@ if(!empty($_POST['save'])) {
printf('Save playlist "%s.json" done...', $date); printf('Save playlist "%s.json" done...', $date);
} }
// fill playlist to 24 hours
if(!empty($_POST['fill_playlist'])) {
$list_date = $_POST['fill_playlist'];
$diff_len = $_POST['diff_len'];
$start_time = $_POST['start_time'];
$raw_arr = json_decode(urldecode($_POST['old_list']));
$get_ini = get_config();
$date_str = explode('-', $list_date);
$get_dir = "/^playlist_path.*\$/m";
preg_match_all($get_dir, $get_ini, $matches);
$line = implode("\n", $matches[0]);
$path_root = explode("= ", $line)[1];
$json_path = $path_root . "/" . $date_str[0] . "/" . $date_str[1];
$json_output = $json_path . "/" . $list_date . ".json";
$fill = shell_exec("./sh/fill.sh '".$diff_len."'");
$beginRaw = round($raw_arr[0]->begin);
$start = sprintf('%02d:%02d:%02d', ($beginRaw/3600),($beginRaw/60%60), $beginRaw%60);
// prepare header
$list = array(
"channel" => "Test 1",
"date" => $list_date,
"begin" => $start,
"length" => "24:00:00.000",
"program" => []
);
// create json video element
foreach($raw_arr as $rawline) {
$clipItem = array(
"in" => floatval($rawline->in),
"out" => floatval($rawline->out),
"duration" => floatval($rawline->dur),
"source" => $rawline->src
);
$list["program"][] = $clipItem;
}
foreach(preg_split("/((\r?\n)|(\r\n?))/", $fill) as $line){
$line_arr = explode('|', $line);
$clipItem = array(
"in" => floatval($line_arr[0]),
"out" => floatval($line_arr[1]),
"duration" => floatval($line_arr[2]),
"source" => $line_arr[3]
);
if ($line_arr[3]) {
$list["program"][] = $clipItem;
}
}
if (!is_dir($json_path)) {
mkdir($json_path, 0777, true);
}
file_put_contents($json_output, json_encode(
$list, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT));
printf('Filled and save playlist "%s.json" done...', $list_date);
}
?> ?>

View File

@ -1,8 +1,8 @@
<?php <?php
// get config file // get config file
function get_config() { function get_ini() {
return file_get_contents("/etc/ffplayout/ffplayout.conf"); return parse_ini_file("/etc/ffplayout/ffplayout.conf", TRUE, INI_SCANNER_RAW);
} }
// file extension to filter // file extension to filter
@ -20,31 +20,34 @@ $ext = implode('|', $except);
// get current track // get current track
if(!empty($_GET['track'])) { if(!empty($_GET['track'])) {
$get_ini = get_config(); $ini = get_ini();
$get_dir = "/^playlist_path.*\$/m"; $dir = $ini['PLAYLIST']['path'];
preg_match_all($get_dir, $get_ini, $match_dir);
$line = implode("\n", $match_dir[0]);
$path_root = explode("= ", $line)[1];
// list start // list start
$get_start = "/^day_start.*\$/m"; $start = $ini['PLAYLIST']['day_start'];
preg_match_all($get_start, $get_ini, $match_start); $st = date_parse($start);
$start_line = implode("\n", $match_start[0]); $start_time = $st['hour'] * 3600 + $st['minute'] * 60 + $st['second'];
$start_hour = explode("= ", $start_line)[1];
$time = date("H"); $t = date_parse(date("H:i:s"));
$time = $t['hour'] * 3600 + $t['minute'] * 60 + $t['second'];
if ($time < $start_hour) { if ($time < $start_time) {
$date = date("Y-m-d", strtotime( '-1 days' ) ); $date = date("Y-m-d", strtotime( '-1 days' ) );
} else { } else {
$date = date("Y-m-d"); $date = date("Y-m-d");
} }
$date_str = explode('-', $date); $date_str = explode('-', $date);
$xml_path = $path_root . "/" . $date_str[0] . "/" . $date_str[1] . "/" . $date . ".xml"; $json_path = $dir . "/" . $date_str[0] . "/" . $date_str[1] . "/" . $date . ".json";
if (file_exists($xml_path)) { if (file_exists($json_path)) {
$xml = simplexml_load_file($xml_path) or die("Error: Cannot create object"); $content = file_get_contents($json_path) or die("Error: Cannot create object");
$json = json_decode($content, true);
list($hh, $mm, $ss) = explode(":", $json["begin"]);
list($l_hh, $l_mm, $l_ss) = explode(":", $json["length"]);
$begin = $hh * 3600 + $mm * 60 + $ss;
$length = $l_hh * 3600 + $l_mm * 60 + $l_ss;
$src_re = array(); $src_re = array();
$src_re[0] = '/# [0-9-]+.('.$ext.')$/'; $src_re[0] = '/# [0-9-]+.('.$ext.')$/';
@ -54,17 +57,19 @@ if(!empty($_GET['track'])) {
$videos = array(); $videos = array();
foreach($xml->body[0]->video as $video) { foreach($json["program"] as $video) {
$src = preg_replace('/^\//', '', $video['src']); $src = preg_replace('/^\//', '', $video['source']);
$src_arr = explode('/', $src); $src_arr = explode('/', $src);
$name = preg_replace($src_re, '', end($src_arr)); $name = preg_replace($src_re, '', end($src_arr));
$name = str_replace('§', '?', $name); $name = str_replace('§', '?', $name);
$begin = $video['begin']; $dur = $video['duration'];
$dur = $video['dur'];
$in = $video['in']; $in = $video['in'];
$out = $video['out']; $out = $video['out'];
$videos[] = array('start' => $start_hour, 'begin'=> $begin, 'src' => $name, 'dur' => $dur, 'in' => $in, 'out' => $out); $videos[] = array('start' => $start_time, 'begin'=> $begin, 'src' => $name, 'dur' => $dur, 'in' => $in, 'out' => $out);
$begin += $out - $in;
} }
echo json_encode($videos); echo json_encode($videos);