найти соответствующий текст из субтитров - PullRequest
1 голос
/ 21 марта 2019

У меня есть текстовый файл (субтитр), подобный этому формату:

каждая строка имеет время начала и время окончания текста

45.123 : 55.002 = this_is_subtitle_of_video
58.101 : 64.022 = next_text_and_so_on 
...
...
458.101 : 564.022 = final_text_of_video 

из YouTube API Iможно получить текущее время (секунды), например: 123,06 (с)

Как получить соответствующий текст, когда у меня есть текущее время видео (возможно, с использованием массива или другой структуры данных) ...

алгоритм должен работать быстро (при воспроизведении видео на сайте)

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Вы упоминаете, что он уже работает с использованием простого массива с небольшими видео, поэтому вы можете просто заменить свой массив на Map.

(см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)

0 голосов
/ 21 марта 2019

Вы можете split текст на каждом \n и проходить по каждой строке.Затем используйте регулярные выражения

/(\d+.\d+) : (\d+.\d+) = (.*)/

и match, чтобы указать время начала и окончания и субтитры для разделения групп захвата

function findSubtitle(text, time) {
  let lines = str.split("\n");

  for (let i = 0; i < lines.length; i++) {
    [,start, finish, subtitle] = lines[i].match(/(\d+.\d+) : (\d+.\d+) = (.*)/);
    if (time >= start && finish >= time) {
      return subtitle
    }
  }
}

let str = `45.123 : 55.002 = this_is_subtitle_of_video
58.101 : 64.022 = next_text_and_so_on 
458.101 : 564.022 = final_text_of_video`

console.log(findSubtitle(str, 60.006))
console.log(findSubtitle(str, 48))

Если вы хотите повторно найти субтитры из этого текста, вы можете использовать map для создания массива субтитров.Всякий раз, когда вам нужно find субтитров, вызывайте функцию с массивом и временем.Таким образом, вам не нужно split и match каждый раз, когда вам нужны субтитры

function findSubtitle(array, time) {
  let inner = array.find(a => time >= a[0] && a[1] >= time) || [];
  return inner[2];
}

let str = `45.123 : 55.002 = this_is_subtitle_of_video
58.101 : 64.022 = next_text_and_so_on 
458.101 : 564.022 = final_text_of_video`

let subArray = str.split("\n")
                  .map(a => a.match(/(\d+.\d+) : (\d+.\d+) = (.*)/).slice(1))

console.log(findSubtitle(subArray, 60))
console.log(findSubtitle(subArray, 48))
...