Chocobozzz/PeerTube

View on GitHub
packages/core-utils/src/string/chapters.ts

Summary

Maintainability
A
45 mins
Test Coverage
import { timeToInt, timecodeRegexString } from '../common/date.js'

const timecodeRegex = new RegExp(`^(${timecodeRegexString})\\s`)

export function parseChapters (text: string, maxTitleLength: number) {
  if (!text) return []

  const lines = text.split(/\r?\n|\r|\n/g)
  let foundChapters = false

  const chapters: { timecode: number, title: string }[] = []

  for (const line of lines) {
    const matched = line.match(timecodeRegex)
    if (!matched) {
      // Stop chapters parsing
      if (foundChapters) break

      continue
    }

    foundChapters = true

    const timecodeText = matched[1]
    const timecode = timeToInt(timecodeText)
    const title = line.replace(matched[0], '')

    chapters.push({ timecode, title: title.slice(0, maxTitleLength) })
  }

  // Only consider chapters if there are more than one
  if (chapters.length > 1) return chapters

  return []
}