JavaScript — добавление или вычитание секунд из .SRT файла

Я искал и не нашел ничего подобного.
Я пытаюсь создать простой скрипт PHP / js / jq, который может добавлять или вычитать секунды из файла .srt. Я не уверен, что регулярное выражение — это то, с чем я должен пойти, чтобы достичь этого или что-то еще.
Пользователь загрузит / скопирует текст файла srt, а затем добавит количество секунд в поле ввода, которое он хочет добавить или вычесть из SRT.

Например, если пользователь добавляет +4 секунды к следующему файлу srt:

0
00:00:04,594 --> 00:00:10,594
this is a subtitle

1
00:00:40,640 --> 00:00:46,942
this is another subtitle

2
00:02:05,592 --> 00:02:08,694
this is one more subtitle

Это должно выглядеть так:

0
00:00:08,594 --> 00:00:14,594
this is a subtitle

1
00:00:44,640 --> 00:00:50,942
this is another subtitle

2
00:02:09,592 --> 00:02:12,694
this is one more subtitle

3

Решение

Вот решение в PHP, которое является одним из указанных вами языков.

Если вы можете представить временной сдвиг, который вы хотите применить в качестве string вы можете использовать DateTime методы DateTime::modify(), DateTime::createFromFormat() а также preg_replace_callback() достичь того, что вы хотите сделать.

SubRip Википедия определяет формат временного кода как:

часы: минуты: секунды, миллисекунды

Таким образом, мы можем написать регулярное выражение, чтобы захватить это; например: /(\d+:\d+:\d+,\d+)/ — хотя вы можете уточнить это.

Учитывая сценарий, где ваш файл .srt читается в строку $srtи вы хотите увеличить время на 5 секунд:

<?php

$srt = <<<EOL

0
00:00:04,594 --> 00:00:10,594 this is a subtitle

1
00:00:40,640 --> 00:00:46,942 this is a subtitle

2
00:02:05,592 --> 00:02:08,694 this is a subtitle
EOL;

$regex  = '/(\d+:\d+:\d+,\d+)/';
$offset = '+5 seconds';

$result = preg_replace_callback($regex, function($match) use ($offset) {
$dt = DateTime::createFromFormat('H:i:s,u', $match[0]);
$dt->modify($offset);
return $dt->format('H:i:s,u');
}, $srt);

echo $result;

На каждой $matchиспользовать DateTime::createFromFormat() преобразовать соответствующий временной код в DateTime объект, который вы можете затем изменить и переформатировать как строку, представляющую время смещения.

Вы можете использовать различные значения смещения с DateTime::modify() в том числе, но не ограничивается: +1 minute, -30 seconds, 1 hour 2 minutes и так далее. Прочитайте связанную документацию для более подробной информации.

Это дает:

0
00:00:09,594000 --> 00:00:15,594000 this is a subtitle

1
00:00:45,640000 --> 00:00:51,942000 this is a subtitle

2
00:02:10,592000 --> 00:02:13,694000 this is a subtitle

Надеюсь это поможет 🙂

1

Другие решения

Если вы хотите поддерживать больше форматов на вашем сайте, вы можете использовать библиотеку:

$user_subtitles = $_POST['user_subtitles'];

$subtitles = Subtitles::load($user_subtitles, 'srt'); // you can load different formats of subtitles
$subtitles->time(4); // +4 seconds

echo $subtitles->content();

https://github.com/mantas-done/subtitles

0

По вопросам рекламы [email protected]