Merge pull request #3533 from alchemy-fr/PHRAS-3116_prod_video-tools-add_subtitle_generation

PHRAS-3116 merge  Prod - video-tools - Front for ask and edit subtitle or transcript generation
This commit is contained in:
Nicolas Maillat
2020-06-19 15:00:23 +02:00
committed by GitHub
13 changed files with 2344 additions and 1838 deletions

View File

@@ -155,6 +155,8 @@ class LanguageController
'description notice' => $translator->trans('prod:mapboxgl: description notice'),
'title-map-dialog' => $translator->trans('prod:mapboxgl: title map dialog'),
'create new user' => $translator->trans('prod:push: create new user'),
'prod:videoeditor:subtitletab:messsage:: error' => $translator->trans('prod:videoeditor:subtitletab:messsage:: error'),
'prod:videoeditor:subtitletab:messsage:: success' => $translator->trans('prod:videoeditor:subtitletab:messsage:: success'),
]);
}
}

View File

@@ -463,6 +463,7 @@ class ToolsController extends Controller
$metadatas = false;
$record = null;
$JSFields = [];
$videoTextTrackFields = [];
if (count($records) == 1) {
/** @var \record_adapter $record */
@@ -480,6 +481,19 @@ class ToolsController extends Controller
'name' => $meta->get_name(),
'_value' => $record->getCaption([$meta->get_name()]),
];
if (preg_match('/^VideoTextTrack(.*)$/iu', $meta->get_name(), $matches) && !empty($matches[1]) && strlen($matches[1]) == 2 ) {
$field['label'] = $matches[1];
$field['meta_struct_id'] = $meta->get_id();
$field['value'] = '';
if ($record->get_caption()->has_field($meta->get_name())) {
$fieldValues = $record->get_caption()->get_field($meta->get_name())->get_values();
$fieldValue = array_pop($fieldValues);
$field['value'] = $fieldValue->getValue();
}
$videoTextTrackFields[] = $field;
unset($field);
}
}
if (!$record->isStory()) {
@@ -489,11 +503,12 @@ class ToolsController extends Controller
$conf = $this->getConf();
return $this->render('prod/actions/Tools/videoEditor.html.twig', [
'records' => $records,
'record' => $record,
'videoEditorConfig' => $conf->get(['video-editor']),
'metadatas' => $metadatas,
'JSonFields' => json_encode($JSFields),
'records' => $records,
'record' => $record,
'videoEditorConfig' => $conf->get(['video-editor']),
'metadatas' => $metadatas,
'JSonFields' => json_encode($JSFields),
'videoTextTrackFields' => $videoTextTrackFields
]);
}
}

View File

@@ -65,7 +65,7 @@
"normalize-css": "^2.1.0",
"npm": "^6.0.0",
"npm-modernizr": "^2.8.3",
"phraseanet-production-client": "0.34.236-d",
"phraseanet-production-client": "0.34.237-d",
"requirejs": "^2.3.5",
"tinymce": "^4.0.28",
"underscore": "^1.8.3",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:jms="urn:jms:translation" version="1.2">
<file date="2020-06-11T06:48:12Z" source-language="en" target-language="de" datatype="plaintext" original="not.available">
<file date="2020-06-17T17:33:39Z" source-language="en" target-language="de" datatype="plaintext" original="not.available">
<header>
<tool tool-id="JMSTranslationBundle" tool-name="JMSTranslationBundle" tool-version="1.1.0-DEV"/>
<note>The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.</note>
@@ -9,9 +9,9 @@
<trans-unit id="96f0767cb7ea65a7f86c8c9432e80d16cf9d8680" resname="Please provide the same passwords." approved="yes">
<source>Please provide the same passwords.</source>
<target state="translated">Bitte geben Sie diesselbe Passwörter ein.</target>
<jms:reference-file line="49">Form/Login/PhraseaRegisterForm.php</jms:reference-file>
<jms:reference-file line="36">Form/Login/PhraseaRenewPasswordForm.php</jms:reference-file>
<jms:reference-file line="44">Form/Login/PhraseaRecoverPasswordForm.php</jms:reference-file>
<jms:reference-file line="49">Form/Login/PhraseaRegisterForm.php</jms:reference-file>
</trans-unit>
<trans-unit id="90b8c9717bb7ed061dbf20fe1986c8b8593d43d4" resname="The token provided is not valid anymore" approved="yes">
<source>The token provided is not valid anymore</source>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:jms="urn:jms:translation" version="1.2">
<file date="2020-06-11T06:50:35Z" source-language="en" target-language="en" datatype="plaintext" original="not.available">
<file date="2020-06-17T17:34:06Z" source-language="en" target-language="en" datatype="plaintext" original="not.available">
<header>
<tool tool-id="JMSTranslationBundle" tool-name="JMSTranslationBundle" tool-version="1.1.0-DEV"/>
<note>The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.</note>
@@ -9,9 +9,9 @@
<trans-unit id="96f0767cb7ea65a7f86c8c9432e80d16cf9d8680" resname="Please provide the same passwords." approved="yes">
<source>Please provide the same passwords.</source>
<target state="translated">Please provide the same passwords.</target>
<jms:reference-file line="49">Form/Login/PhraseaRegisterForm.php</jms:reference-file>
<jms:reference-file line="36">Form/Login/PhraseaRenewPasswordForm.php</jms:reference-file>
<jms:reference-file line="44">Form/Login/PhraseaRecoverPasswordForm.php</jms:reference-file>
<jms:reference-file line="49">Form/Login/PhraseaRegisterForm.php</jms:reference-file>
</trans-unit>
<trans-unit id="90b8c9717bb7ed061dbf20fe1986c8b8593d43d4" resname="The token provided is not valid anymore" approved="yes">
<source>The token provided is not valid anymore</source>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:jms="urn:jms:translation" version="1.2">
<file date="2020-06-11T06:53:27Z" source-language="en" target-language="fr" datatype="plaintext" original="not.available">
<file date="2020-06-17T17:34:33Z" source-language="en" target-language="fr" datatype="plaintext" original="not.available">
<header>
<tool tool-id="JMSTranslationBundle" tool-name="JMSTranslationBundle" tool-version="1.1.0-DEV"/>
<note>The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.</note>
@@ -9,9 +9,9 @@
<trans-unit id="96f0767cb7ea65a7f86c8c9432e80d16cf9d8680" resname="Please provide the same passwords." approved="yes">
<source>Please provide the same passwords.</source>
<target state="translated">Veuillez indiquer des mots de passe identiques.</target>
<jms:reference-file line="49">Form/Login/PhraseaRegisterForm.php</jms:reference-file>
<jms:reference-file line="36">Form/Login/PhraseaRenewPasswordForm.php</jms:reference-file>
<jms:reference-file line="44">Form/Login/PhraseaRecoverPasswordForm.php</jms:reference-file>
<jms:reference-file line="49">Form/Login/PhraseaRegisterForm.php</jms:reference-file>
</trans-unit>
<trans-unit id="90b8c9717bb7ed061dbf20fe1986c8b8593d43d4" resname="The token provided is not valid anymore" approved="yes">
<source>The token provided is not valid anymore</source>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:jms="urn:jms:translation" version="1.2">
<file date="2020-06-11T06:55:24Z" source-language="en" target-language="nl" datatype="plaintext" original="not.available">
<file date="2020-06-17T17:35:01Z" source-language="en" target-language="nl" datatype="plaintext" original="not.available">
<header>
<tool tool-id="JMSTranslationBundle" tool-name="JMSTranslationBundle" tool-version="1.1.0-DEV"/>
<note>The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.</note>
@@ -9,9 +9,9 @@
<trans-unit id="96f0767cb7ea65a7f86c8c9432e80d16cf9d8680" resname="Please provide the same passwords.">
<source>Please provide the same passwords.</source>
<target state="new">Please provide the same passwords.</target>
<jms:reference-file line="49">Form/Login/PhraseaRegisterForm.php</jms:reference-file>
<jms:reference-file line="36">Form/Login/PhraseaRenewPasswordForm.php</jms:reference-file>
<jms:reference-file line="44">Form/Login/PhraseaRecoverPasswordForm.php</jms:reference-file>
<jms:reference-file line="49">Form/Login/PhraseaRegisterForm.php</jms:reference-file>
</trans-unit>
<trans-unit id="90b8c9717bb7ed061dbf20fe1986c8b8593d43d4" resname="The token provided is not valid anymore">
<source>The token provided is not valid anymore</source>

View File

@@ -29,6 +29,16 @@
{{ "video range extractor" | trans }}
</a>
</li>
<li>
<a href="#subtitleEditor" class="subtitleEditortoggle">
{{ "prod:videoeditor:subtitleTab:: title" | trans }}
</a>
</li>
<li>
<a href="#subtitleRequest" class="subtitleEditortoggle">
{{ "prod:videoeditor:subtitleRequestTab:: title" | trans }}
</a>
</li>
</ul>
</div>
@@ -158,6 +168,113 @@
<div id="rangeExtractor" class="">
<div class="video-range-editor-container"></div>
</div>
<div id="subtitleEditor" class="subtitleEditor video-subtitle-editor-container">
<input type="hidden" id="defaultStartValue" value="00:00:00.000">
<input type="hidden" id="defaultEndValue" value="00:00:02.000">
<div id="default-item" class="default-item hide">
<fieldset class='video-subtitle-item'><span class='number'>0</span>
<div class='item-field start-time' ><label>{{ "prod:videoeditor:subtitletab:: Start time" | trans }}</label><input class='time startTime' type='text' name='startTime' size='12' value="00:00:00.000"/></div>
<div class='item-field end-time'><label>{{ "prod:videoeditor:subtitletab:: End time" | trans }}</label><input class='time endTime' type='text' name='endTime' size='12'value="00:00:02.000" /></div>
<div class='item-field show-for-time'><label>{{ "prod:videoeditor:subtitletab:: Show for" | trans }}</label><input class='showForTime' readonly type='text' size='12' value="00:00:02.000"/></div>
<div class='item-field caption-text'><textarea class="captionText" name='captionText' placeholder='{{ "prod:videoeditor:subtitletab:: Caption placeholder" | trans }}' rows='2' ></textarea></div>
<div class='remove-item'><i class='fa fa-times-circle'></i></div>
</fieldset>
</div>
<form name="video_subtitle_data" id="video-subtitle-data">
<div class="video-subtitle-top">
<label>{{ "prod:videoeditor:subtitletab:: work on" | trans }}</label>
<select name="meta_struct_id" id="metaStructId">
{% for videoTextTrackField in videoTextTrackFields %}
<option value="{{ videoTextTrackField.meta_struct_id}}">{{ videoTextTrackField.label}}</option>
{% endfor %}
</select>
{% for videoTextTrackField in videoTextTrackFields %}
<input type="hidden" id="caption_{{ videoTextTrackField.meta_struct_id}}" value='{{ videoTextTrackField.value}}' name='databox_id'>
{% endfor %}
<input type="text" id="record-vtt">
<input type="hidden" value='{{ record.get_sbas_id() }}' name='databox_id'>
<input type="hidden" value='{{ record.get_record_id() }}' name='record_id'>
<input type="hidden" id="no_caption" value='{{ "prod:videoeditor:subtitletab:: No caption message" | trans }}'>
</div>
</form>
<form name="video_subtitle_list" id="video-subtitle-list">
<div class="video-subtitle-bottom">
<div class="video-subtitle-left">
<div class="video-subtitle-left-inner">
<div class="fields-wrapper">
</div>
</div>
<div class="video-subtitle-left-button">
<button type="button" id="submit-subtitle" class="btn submit-subtitle btn-blue">{{ "prod:videoeditor:subtitletab:: save" | trans }}</button>
<button type="button" id="copy-subtitle" class="btn copy-subtitle btn-blue">{{ "prod:videoeditor:subtitletab:: copy to clipboard" | trans }}</button>
<button class="add-subtitle-vtt" tabindex="0" type="button" aria-label="Add VTT" title = {{ "prod:videoeditor:subtitletab:: add caption" | trans }}>
<i class="fa fa-plus"></i>
</button>
</div>
</div>
<div class="video-subtitle-right">
<div class="video-subtitle-wrapper">
</div>
</div>
</div>
</form>
</div>
<div id ="subtitleRequest" class="subtitleRequest">
<div class="video-subtitle-bottom">
<div class="video-subtitle-left">
<div class="video-request-left-inner">
<form id="video-subtitle-request" class="video-subtitle-request">
<p class="item">
<label>{{ "prod:videoeditor:subtitleRequestTab:label:: Provider" | trans }}</label>
<select name="subtitleProvider" id="subtitle_provider">
<option value="Ginger">Ginger</option>
</select>
</p>
<p class="item">
<label>{{ "prod:videoeditor:subtitleRequestTab:label:: Kind" | trans }}</label>
<select name="subtitle_kindr" id="subtitle_kindr">
<option value="fr">Fr</option>
<option value="en">En</option>
<option value="de">De</option>
</select>
</p>
<p class="item">
<label>{{ "prod:videoeditor:subtitleRequestTab:label:: Source Audio language" | trans }}</label>
<select name="subtitle_language_source" id="subtitle_language_source">
<option value="fr">Fr</option>
<option value="en">En</option>
<option value="de">De</option>
</select>
</p>
<p class="item">
<label>{{ "prod:videoeditor:subtitleRequestTab:label:: Language destination" | trans }}</label>
<select name="subtitle_language_destination" id="subtitle_language_destination">
<option value="fr">Fr</option>
<option value="en">En</option>
<option value="de">De</option>
</select>
</p>
<div class="video-subtitle-center-button">
<button type="button" id="submit-subtitle-request" class="btn submit-subtitle btn-blue">{{ "prod:videoeditor:subtitleRequestTab:: submit" | trans }}</button>
</div>
<input type="hidden" value='{{ record.get_sbas_id() }}' name='record_sbas_id'>
<input type="hidden" value='{{ record.get_record_id() }}' name='record_record_id'>
</form>
</div>
</div>
<div class="video-subtitle-right">
<div class="video-subtitle-wrapper">
<video class="thumb_video" controls="" preload="auto" data-ratio="{{ prevRatio }}">
{% for subdef in previewHtml5 %}
<source type="{{ subdef.get_mime() }}" src="{{ subdef.get_url() }}"/>
{% endfor %}
{{ 'No preview available' | trans }}
</video>
</div>
</div>
</div>
</div>
{% endif %}
{% endfor %}
{% endif %}
@@ -173,7 +290,14 @@
>
</iframe>
</div>
<style>
.video-subtitle-editor-container .number {
float: none;
}
.video-subtitle-editor-container .editing .number {
float: left;
}
</style>
<script type="text/javascript">
var toolsConfig = {
selectionLength: {{ selectionLength }},
@@ -217,6 +341,8 @@
{% for subdef in previewHtml5 %}
{
ratio: '{{ ratio }}',
width: '{{ width }}',
height: '{{ height }}',
framerate: {{ record.exif[constant('media_subdef::TC_DATA_FRAMERATE')] | round(2) }},
type: "{{ subdef.get_mime() }}",
src: "{{ subdef.get_url() }}"
@@ -231,6 +357,5 @@
preferences: {
overlapChapters: {% if overlapChapters != NULL %}{{ overlapChapters }}{% else %}1{% endif %},
}
};
</script>

View File

@@ -7578,10 +7578,10 @@ phraseanet-common@^0.4.5-d:
js-cookie "^2.1.0"
pym.js "^1.3.1"
phraseanet-production-client@0.34.236-d:
version "0.34.236-d"
resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.236-d.tgz#083120cc1ff02893b62058ff875742d45975e3ee"
integrity sha512-mOT8S2V2FlhOVZmIo2cWQuXOTQ9D4h7t0jquhLboz2zN4Uo0iLFAEkM0P9GmizYSixh1MYLbU0vFLJUPzvz2Wg==
phraseanet-production-client@0.34.237-d:
version "0.34.237-d"
resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.237-d.tgz#0ec3bf5d6b1260e15148a794e43a7a3b2a7adbcf"
integrity sha512-jttbZLvKiWg7FaTzhN7RT3viVbS7CUO77cu4LNycWD7ZUsycwPUWPomGDGMT9a8uRtJ7X0uHJXnAhGTDtBDvEg==
dependencies:
"@mapbox/mapbox-gl-language" "^0.9.2"
"@turf/turf" "^5.1.6"