Newer
Older

Yassine Doghri
committed
<?php
declare(strict_types=1);
/**
* Generates and renders a breadcrumb based on the current url segments
*
* @copyright 2022 Podlibre
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/
*/
namespace App\Libraries;
use stdClass;
class TranscriptParser
{
protected string $transcriptContent;
public function loadString(string $content): self
{
$this->transcriptContent = $content;
return $this;
}
/**
* Adapted from: https://stackoverflow.com/a/11659306
*/
public function parseSrt(): string | false
{

Yassine Doghri
committed
if (! defined('SRT_STATE_SUBNUMBER')) {
define('SRT_STATE_SUBNUMBER', 0);
}
if (! defined('SRT_STATE_TIME')) {
define('SRT_STATE_TIME', 1);
}
if (! defined('SRT_STATE_TEXT')) {
define('SRT_STATE_TEXT', 2);
}
if (! defined('SRT_STATE_BLANK')) {
define('SRT_STATE_BLANK', 3);
}

Yassine Doghri
committed
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
$subs = [];
$state = SRT_STATE_SUBNUMBER;
$subNum = 0;
$subText = '';
$subTime = '';
$lines = explode(PHP_EOL, $this->transcriptContent);
foreach ($lines as $line) {
// @phpstan-ignore-next-line
switch ($state) {
case SRT_STATE_SUBNUMBER:
$subNum = trim($line);
$state = SRT_STATE_TIME;
break;
case SRT_STATE_TIME:
$subTime = trim($line);
$state = SRT_STATE_TEXT;
break;
case SRT_STATE_TEXT:
if (trim($line) === '') {
$sub = new stdClass();
$sub->number = (int) $subNum;
[$startTime, $endTime] = explode(' --> ', $subTime);
$sub->startTime = $this->getSecondsFromTimeString($startTime);
$sub->endTime = $this->getSecondsFromTimeString($endTime);
$sub->text = trim($subText);
$subText = '';
$state = SRT_STATE_SUBNUMBER;
$subs[] = $sub;
} else {
if ($subText !== '') {
$subText .= PHP_EOL . $line;
}

Yassine Doghri
committed
$subText .= $line;
}
break;
}
}
if ($state === SRT_STATE_TEXT) {
// if file was missing the trailing newlines, we'll be in this
// state here. Append the last read text and add the last sub.
// @phpstan-ignore-next-line
$sub->text = $subText;
// @phpstan-ignore-next-line
$subs[] = $sub;
}
return json_encode($subs, JSON_PRETTY_PRINT);
}
private function getSecondsFromTimeString(string $timeString): float
{
$timeString = explode(',', $timeString);
return (strtotime($timeString[0]) - strtotime('TODAY')) + (float) "0.{$timeString[1]}";
}
}