Skip to content
Snippets Groups Projects
TranscriptParser.php 3.04 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    declare(strict_types=1);
    
    /**
     * Generates and renders a breadcrumb based on the current url segments
     *
    
     * @copyright  2022 Ad Aures
    
     * @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
        {
    
            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);
            }
    
    
            $subs = [];
            $state = SRT_STATE_SUBNUMBER;
            $subNum = 0;
            $subText = '';
            $subTime = '';
    
            $lines = explode(PHP_EOL, $this->transcriptContent);
            foreach ($lines as $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;
                            }
    
                        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]}";
        }
    }