Добавление или вычитание секунд из файла .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

person Amit    schedule 07.09.2015    source источник
comment
То, как вы формулируете вопрос, звучит слишком широко. Пожалуйста, сузьте задачу и поделитесь тем, что вы пробовали до сих пор.   -  person Wiktor Stribiżew    schedule 08.09.2015
comment
чтение в массив, цикл построчно, извлечение времени, добавление секунд, запись нового файла - по крайней мере, начните   -  person    schedule 08.09.2015
comment
запись в Википедии о файлах .srt предполагает, что заголовок номер появляется в строке перед временем/субтитрами. Просто интересно, является ли это жестким требованием, поскольку это может повлиять на ответ.   -  person Darragh Enright    schedule 08.09.2015
comment
Я согласен ... я бы не стал повторять это. Существует четко определенный простой формат... напишите синтаксический анализатор, который анализирует строки.   -  person prodigitalson    schedule 08.09.2015


Ответы (2)


Вот решение на 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

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

person Darragh Enright    schedule 07.09.2015
comment
Спасибо, Дарраг..! Извините, было немного поздно ответить и признать это. это, безусловно, поможет мне начать свой день с чего-то. Я протестировал его, и он отлично работает. Спасибо Upvote - это все, что я могу сделать. - person Amit; 09.09.2015
comment
Не проблема. Рад помочь! - person Darragh Enright; 10.09.2015
comment
Работал из коробки. Очень полезное решение! - person Avatar; 19.11.2017

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

$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

person Mantas D    schedule 15.01.2017
comment
Я пытался заставить вашу многообещающую библиотеку работать, однако не вышло. Я пробовал require_once("Subtitles.php"), потом use \Done\Subtitles\Subtitles; и запускал. Результат: Fatal error: Uncaught Error: Class 'Done\Subtitles\Helpers' not found. Затем включил файлы Helpers.php и php в папку конвертера, следующая ошибка: Interface 'Done\Subtitles\ConverterContract' not found - Не могли бы вы завершить свой сценарий выше? - person Avatar; 19.11.2017
comment
Привет, вам нужно загрузить его с помощью composer. Или просто загрузите все файлы, как вы сделали с required_once. Их не так много. - person Mantas D; 21.11.2017