playout improvements
* show playout attributes as tabs * mouseover for durations * show only audio uploads for selected project and studio
This commit is contained in:
@@ -11,10 +11,11 @@ sub durationToSeconds($) {
|
||||
return $duration;
|
||||
}
|
||||
|
||||
sub formatDuration($$$) {
|
||||
sub formatDuration($$$;$) {
|
||||
my $audioDuration = shift;
|
||||
my $eventDuration = shift;
|
||||
my $value = shift;
|
||||
my $mouseOver = shift;
|
||||
|
||||
return '' unless $audioDuration;
|
||||
return '' unless $eventDuration;
|
||||
@@ -23,28 +24,31 @@ sub formatDuration($$$) {
|
||||
$audioDuration = durationToSeconds($audioDuration);
|
||||
$eventDuration = durationToSeconds($eventDuration);
|
||||
|
||||
my $delta = 100 * $audioDuration / $eventDuration;
|
||||
my $class = "ok";
|
||||
my $title = '';
|
||||
my $title = $mouseOver;
|
||||
|
||||
my $delta = 100 * $audioDuration / $eventDuration;
|
||||
|
||||
if ( $delta > 101 ) {
|
||||
$class = "warn";
|
||||
$title = sprintf(
|
||||
qq{ title="file is too long! It should be %d minutes, but is %d"},
|
||||
$eventDuration / 60,
|
||||
$audioDuration / 60
|
||||
qq{file is too long! It should be %d minutes, but is %d},
|
||||
($eventDuration+0.5) / 60,
|
||||
($audioDuration+0.5) / 60
|
||||
);
|
||||
}
|
||||
|
||||
if ( $delta < 99.99 ) {
|
||||
$class = "error";
|
||||
$title = sprintf(
|
||||
qq{ title="file is too short! should be %d minutes, but is %d"},
|
||||
$eventDuration / 60,
|
||||
$audioDuration / 60
|
||||
qq{file is too short! should be %d minutes, but is %d},
|
||||
($eventDuration+0.5) / 60,
|
||||
($audioDuration+0.5) / 60
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
return sprintf( qq{<div class="%s"%s>%s</div>}, $class, $title, $value );
|
||||
return sprintf( qq{<div class="%s" title="%s">%s</div>}, $class, $title, $value );
|
||||
}
|
||||
|
||||
sub formatChannels($) {
|
||||
@@ -60,7 +64,7 @@ sub formatSamplingRate($) {
|
||||
return '' unless $samplingRate;
|
||||
my $class = "ok";
|
||||
$class = "error" if $samplingRate != 44100;
|
||||
return sprintf( qq{<div class="%s">%s</div>}, $class, $samplingRate );
|
||||
return sprintf( qq{<div class="%s">%s Hz</div>}, $class, $samplingRate );
|
||||
}
|
||||
|
||||
sub formatBitrate($) {
|
||||
@@ -82,16 +86,18 @@ sub formatBitrateMode($) {
|
||||
|
||||
sub formatLoudness {
|
||||
my $value = shift;
|
||||
my $prefix = shift || '';
|
||||
return '' unless $value;
|
||||
|
||||
$value = sprintf( "%.1f", $value );
|
||||
|
||||
my $class = 'ok';
|
||||
$class = 'warn' if $value > -18.5;
|
||||
$class = 'error' if $value > -16.0;
|
||||
$class = 'warn' if $value < -24.0;
|
||||
$class = 'error' if $value < -27.0;
|
||||
|
||||
return qq{<div class="$class">$value dB</div>};
|
||||
return qq{<div class="$class">$prefix$value dB</div>};
|
||||
}
|
||||
|
||||
# do not delete this line
|
||||
|
||||
@@ -86,9 +86,9 @@ sub get_scheduled($$) {
|
||||
}
|
||||
|
||||
my $conditions = '';
|
||||
$conditions = " where " . join( " and ", @conditions ) if scalar @conditions > 0;
|
||||
$conditions = " and " . join( " and ", @conditions ) if scalar @conditions > 0;
|
||||
|
||||
my $order = 'start';
|
||||
my $order = 'p.start';
|
||||
$order = $condition->{order} if ( defined $condition->{order} ) && ( $condition->{order} ne '' );
|
||||
|
||||
my $query = qq{
|
||||
@@ -119,8 +119,11 @@ sub get_scheduled($$) {
|
||||
, p.modified_at
|
||||
, p.updated_at
|
||||
, TIMESTAMPDIFF(SECOND,e.start,e.end) "event_duration"
|
||||
from calcms_playout p left join calcms_events e
|
||||
on p.start = e.start
|
||||
from calcms_playout p, calcms_events e, calcms_series_events se
|
||||
where p.start=e.start
|
||||
and e.id=se.event_id
|
||||
and p.studio_id=se.studio_id
|
||||
and p.project_id=se.project_id
|
||||
$conditions
|
||||
order by $order
|
||||
$limit
|
||||
|
||||
@@ -99,7 +99,8 @@ sub show_events {
|
||||
my $project = $projects->[0];
|
||||
return unless scalar @$projects == 1;
|
||||
|
||||
my $studios = studios::get( $config, { project_id => $params->{project_id}, studio_id => $params->{studio_id} } );
|
||||
my $studios = studios::get( $config,
|
||||
{ project_id => $params->{project_id}, studio_id => $params->{studio_id} } );
|
||||
my $studio = $studios->[0];
|
||||
return unless scalar @$studios == 1;
|
||||
|
||||
|
||||
@@ -310,8 +310,8 @@ sub showAudioRecordings {
|
||||
getDuration( $recording->{audioDuration} )
|
||||
);
|
||||
|
||||
$recording->{rmsLeft} = audio::formatLoudness( $recording->{rmsLeft} );
|
||||
$recording->{rmsRight} = audio::formatLoudness( $recording->{rmsRight} );
|
||||
$recording->{rmsLeft} = audio::formatLoudness( $recording->{rmsLeft}, 'L:' );
|
||||
$recording->{rmsRight} = audio::formatLoudness( $recording->{rmsRight}, 'R:' );
|
||||
}
|
||||
|
||||
my $now = time();
|
||||
|
||||
@@ -396,11 +396,12 @@ sub showCalendar {
|
||||
$date->{title} .= audio::formatDuration(
|
||||
$date->{duration},
|
||||
$date->{event_duration},
|
||||
sprintf( "duration: %.1g h", $date->{duration} / 3600 ) . "<br>"
|
||||
sprintf( "duration: %.1g h", $date->{duration} / 3600 ) . "<br>",
|
||||
sprintf( "%d s", $date->{duration} )
|
||||
) if defined $date->{duration};
|
||||
$date->{title} .= "L:" . audio::formatLoudness( $date->{rms_left} ) . ', '
|
||||
$date->{title} .= audio::formatLoudness( $date->{rms_left}, 'L: ' ) . ', '
|
||||
if defined $date->{rms_left};
|
||||
$date->{title} .= "R:" . audio::formatLoudness( $date->{rms_right} ) . '<br>'
|
||||
$date->{title} .= audio::formatLoudness( $date->{rms_right}, 'R: ' ) . '<br>'
|
||||
if defined $date->{rms_right};
|
||||
$date->{title} .= audio::formatBitrate( $date->{bitrate} ) if defined $date->{bitrate};
|
||||
$date->{title} .= ' ' . audio::formatBitrateMode( $date->{bitrate_mode} ) . '<br>'
|
||||
@@ -447,8 +448,9 @@ sub showCalendar {
|
||||
for my $date (@$playout_dates) {
|
||||
$date = events::calc_dates( $config, $date );
|
||||
if ( defined $events_by_start->{ $date->{start} } ) {
|
||||
$events_by_start->{ $date->{start} }->{duration} = $date->{duration} || 0;
|
||||
$events_by_start->{ $date->{start} }->{event_duration} = $date->{event_duration} || 0;
|
||||
$events_by_start->{ $date->{start} }->{duration} = $date->{duration} || 0;
|
||||
$events_by_start->{ $date->{start} }->{event_duration} =
|
||||
$date->{event_duration} || 0;
|
||||
$events_by_start->{ $date->{start} }->{rms_left} = $date->{rms_left} || 0;
|
||||
$events_by_start->{ $date->{start} }->{rms_right} = $date->{rms_right} || 0;
|
||||
$events_by_start->{ $date->{start} }->{playout_modified_at} = $date->{modified_at};
|
||||
@@ -1143,15 +1145,17 @@ sub printTableBody {
|
||||
|
||||
if ( $event->{class} eq 'event' ) {
|
||||
$event->{content} .= '<br><span class="weak">';
|
||||
$event->{content} .=
|
||||
audio::formatDuration( $event->{duration}, $event->{event_duration},
|
||||
sprintf("%d min", (($event->{duration}+0.5)/60)) )
|
||||
$event->{content} .= audio::formatDuration(
|
||||
$event->{duration},
|
||||
$event->{event_duration},
|
||||
sprintf( "%d min", ( $event->{duration} + 0.5 ) / 60 ),
|
||||
sprintf( "%d s", $event->{duration} )
|
||||
)
|
||||
. ' '
|
||||
if defined $event->{duration};
|
||||
$event->{content} .= 'L' . audio::formatLoudness( $event->{rms_left} ) . ' '
|
||||
$event->{content} .= audio::formatLoudness( $event->{rms_left}, 'L: ' ) . ' '
|
||||
if defined $event->{rms_left};
|
||||
$event->{content} .=
|
||||
'R' . audio::formatLoudness( $event->{rms_right} )
|
||||
$event->{content} .= audio::formatLoudness( $event->{rms_right}, 'R: ' )
|
||||
if defined $event->{rms_right};
|
||||
|
||||
#$event->{content} .= formatBitrate( $event->{bitrate} ) if defined $event->{bitrate};
|
||||
@@ -1981,43 +1985,3 @@ sub check_params {
|
||||
return $checked;
|
||||
}
|
||||
|
||||
__DATA__
|
||||
sub formatLoudness {
|
||||
my $label = shift;
|
||||
my $value = shift;
|
||||
return '' unless defined $value;
|
||||
return '' if $value == 0;
|
||||
return '' if $value eq '';
|
||||
|
||||
#print STDERR "'$value'\n";
|
||||
$value = sprintf( "%d", $value + 0.5 );
|
||||
my $class = 'ok';
|
||||
$class = 'warn' if $value > -18.5;
|
||||
$class = 'error' if $value > -16.0;
|
||||
$class = 'warn' if $value < -24.0;
|
||||
$class = 'error' if $value < -27.0;
|
||||
return qq{<span class="$class">$label} . $value . qq{dB</span>};
|
||||
}
|
||||
|
||||
sub formatDuration {
|
||||
my $duration = shift;
|
||||
return '' unless defined $duration;
|
||||
return '' if $duration eq '';
|
||||
my $result = int( ( $duration + 30.5 ) % 60 ) - 30;
|
||||
my $class = "ok";
|
||||
$class = "warn" if abs($result) > 1;
|
||||
$class = "error" if abs($result) > 2;
|
||||
return sprintf( qq{<span class="%s">%ds</span>}, $class, $duration );
|
||||
}
|
||||
|
||||
sub formatBitrate {
|
||||
my $bitrate = shift;
|
||||
return '' if $bitrate eq '';
|
||||
if ( $bitrate >= 200 ) {
|
||||
return qq{<span class="warn">$bitrate</span>};
|
||||
} elsif ( $bitrate < 190 ) {
|
||||
return qq{<span class="error">$bitrate</span>};
|
||||
} else {
|
||||
return qq{<span class="ok">$bitrate</span>};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,16 @@ table{
|
||||
border-top:1px solid #666;
|
||||
}
|
||||
|
||||
#content #playout-table td.path{
|
||||
width:15rem;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
#content #playout-table td div{
|
||||
float:left;
|
||||
margin:3px;
|
||||
}
|
||||
|
||||
#content tr.past{
|
||||
background:#ccc;
|
||||
}
|
||||
@@ -36,15 +46,14 @@ table{
|
||||
}
|
||||
|
||||
#content img{
|
||||
width:100%;
|
||||
width:60%;
|
||||
height:100%;
|
||||
}
|
||||
|
||||
#content div.ok,
|
||||
#content div.warn,
|
||||
#content div.error{
|
||||
padding-top:3px;
|
||||
padding-bottom:3px;
|
||||
padding:3px;
|
||||
margin:1px;
|
||||
border-radius:4px;
|
||||
text-align:center;
|
||||
|
||||
@@ -98,7 +98,7 @@ sub showPlayout {
|
||||
{
|
||||
project_id => $params->{project_id},
|
||||
studio_id => $params->{studio_id},
|
||||
order => 'modified_at asc, start asc',
|
||||
order => 'p.modified_at asc, p.start asc',
|
||||
from => $startDate
|
||||
}
|
||||
);
|
||||
@@ -114,8 +114,8 @@ sub showPlayout {
|
||||
$event->{stream_size} =~ s/(\d)(\d\d\d\.\d\d\d)$/$1\.$2/g;
|
||||
$event->{duration} =~ s/(\d\.\d)(\d+)$/$1/g;
|
||||
$event->{duration} =~ s/(\d)\.0/$1/g;
|
||||
$event->{rms_left} = audio::formatLoudness( $event->{rms_left} );
|
||||
$event->{rms_right} = audio::formatLoudness( $event->{rms_right} );
|
||||
$event->{rms_left} = audio::formatLoudness( $event->{rms_left}, 'L:' );
|
||||
$event->{rms_right} = audio::formatLoudness( $event->{rms_right}, 'R:' );
|
||||
$event->{bitrate} = audio::formatBitrate( $event->{bitrate} );
|
||||
$event->{bitrate_mode} = audio::formatBitrateMode( $event->{bitrate_mode} );
|
||||
$event->{sampling_rate} = audio::formatSamplingRate( $event->{sampling_rate} );
|
||||
@@ -125,10 +125,7 @@ sub showPlayout {
|
||||
sprintf( "%.1g h", $event->{duration} / 3600)
|
||||
);
|
||||
$event->{channels} = audio::formatChannels( $event->{channels} );
|
||||
|
||||
if ( $event->{start} lt $today ) {
|
||||
$event->{class} = "past";
|
||||
}
|
||||
$event->{class} = "past" if $event->{start} lt $today;
|
||||
}
|
||||
|
||||
$params->{events} = $events;
|
||||
|
||||
@@ -10,19 +10,15 @@
|
||||
|
||||
<script src="js/image.js" type="text/javascript"></script>
|
||||
|
||||
|
||||
<table id="playout-table" class="table">
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th>start</th>
|
||||
<th>playout path</th>
|
||||
<th>seconds</th>
|
||||
<th>loudness</th>
|
||||
<th>format</th>
|
||||
<th>path</th>
|
||||
<th>more</th>
|
||||
<th>image</th>
|
||||
<th>bytes</th>
|
||||
<th>modified at</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
@@ -30,13 +26,18 @@
|
||||
<TMPL_LOOP events>
|
||||
<tr class="<TMPL_VAR class>">
|
||||
<td><TMPL_VAR start></td>
|
||||
<td><TMPL_VAR file></td>
|
||||
<td><TMPL_VAR duration escape="text"></td>
|
||||
<td><TMPL_VAR rms_left escape="text"> <TMPL_VAR rms_right escape="text"></td>
|
||||
<td><TMPL_VAR bitrate escape="text"> <TMPL_VAR bitrate_mode escape="text"> <TMPL_VAR sampling_rate escape="text"> <TMPL_VAR channels escape="text"></td>
|
||||
<td class="path"><TMPL_VAR file></td>
|
||||
<td>
|
||||
<TMPL_VAR duration escape="text">
|
||||
<TMPL_VAR rms_left escape="text">
|
||||
<TMPL_VAR rms_right escape="text">
|
||||
<TMPL_VAR bitrate escape="text">
|
||||
<TMPL_VAR bitrate_mode escape="text">
|
||||
<TMPL_VAR sampling_rate escape="text">
|
||||
<TMPL_VAR channels escape="text">
|
||||
</td>
|
||||
<td><TMPL_IF rms_image><a href="/agenda_files/playout/<TMPL_VAR rms_image>"><img src="/agenda_files/playout/<TMPL_VAR rms_image>"></a></TMPL_IF></td>
|
||||
<td><TMPL_VAR stream_size></td>
|
||||
<td><TMPL_VAR modified_at></td>
|
||||
</tr>
|
||||
</TMPL_LOOP>
|
||||
</tbody>
|
||||
|
||||
Reference in New Issue
Block a user