diff options
| author | Jules Laplace <julescarbon@gmail.com> | 2020-11-09 16:27:49 +0100 |
|---|---|---|
| committer | Jules Laplace <julescarbon@gmail.com> | 2020-11-09 16:27:49 +0100 |
| commit | 0cffae759496a086eabe7459a8cfd066760f474e (patch) | |
| tree | 6b2d9a89664670b9b57feff55791618c1b865acc /animism-align/frontend/app/views/viewer/player/components.media/video.subtitles.js | |
| parent | 5c669a020e6db1c8095161941d3a62d5564eacd1 (diff) | |
video subtitles in SRT format
Diffstat (limited to 'animism-align/frontend/app/views/viewer/player/components.media/video.subtitles.js')
| -rw-r--r-- | animism-align/frontend/app/views/viewer/player/components.media/video.subtitles.js | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/animism-align/frontend/app/views/viewer/player/components.media/video.subtitles.js b/animism-align/frontend/app/views/viewer/player/components.media/video.subtitles.js new file mode 100644 index 0000000..dfa7a85 --- /dev/null +++ b/animism-align/frontend/app/views/viewer/player/components.media/video.subtitles.js @@ -0,0 +1,61 @@ +import React, { Component } from 'react' +import { connect } from 'react-redux' + +import actions from 'app/actions' +import { timestampToSeconds, floatInRange } from 'app/utils' + +const REGEXP_ALL_COMMAS = new RegExp(',', 'g') + +export default class VideoSubtitles extends Component { + state = { + subtitles: [], + current: null, + } + componentDidMount() { + this.loadSubtitles() + } + componentDidUpdate(prevProps) { + if (this.props.play_ts !== prevProps.play_ts) { + this.updateCurrentSubtitle() + } + } + loadSubtitles() { + if (!this.props.mediaItem || !this.props.mediaItem.settings.subtitles) return; + const groups = this.props.mediaItem.settings.subtitles.split("\n\n") + const subtitles = groups.map((group) => { + if (!group) return + const lines = group.trim().split("\n") + if (!lines.length || !parseInt(lines[0])) { + return null + } + let ts_parts = lines[1].replace(REGEXP_ALL_COMMAS, '.').split(" --> ").map(timestampToSeconds) + return { + id: parseInt(lines[0]), + start_ts: ts_parts[0], + end_ts: ts_parts[1], + lines: lines.slice(2), + } + }).filter(a => !!a) + this.setState({ subtitles, current: null }) + } + updateCurrentSubtitle() { + const { play_ts } = this.props + const current = this.state.subtitles.filter(({ start_ts, end_ts }) => ( + floatInRange(start_ts, play_ts, end_ts ) + )).slice(-1) + if (!current.length) { + this.setState({ current: null }) + } else { + this.setState({ current: current[0] }) + } + } + render() { + const { current } = this.state + if (!current) return <div className="video-subtitles hidden" /> + return ( + <div className="video-subtitles"> + {current.lines.map(line => <span key={line}>{line}</span>)} + </div> + ) + } +} |
