Package io.lumify.storm.video

Source Code of io.lumify.storm.video.SubRip

package io.lumify.storm.video;

import io.lumify.core.ingest.video.VideoTranscript;
import io.lumify.core.util.LumifyLogger;
import io.lumify.core.util.LumifyLoggerFactory;

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SubRip {
    private static final Pattern TIME_PATTERN = Pattern.compile("([0-9]*):([0-9]*):([0-9]*),([0-9]*)");
    private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(SubRip.class);

    private enum ReadState {
        Frame,
        Time,
        Text
    }

    public static VideoTranscript read(File f) throws IOException {
        FileInputStream in = new FileInputStream(f);
        try {
            return read(in);
        } finally {
            in.close();
        }
    }

    public static VideoTranscript read(InputStream in) throws IOException {
        VideoTranscript result = new VideoTranscript();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
        ReadState readState = ReadState.Frame;
        VideoTranscript.Time time = null;
        String line;
        StringBuilder text = new StringBuilder();
        int frame;
        while ((line = reader.readLine()) != null) {
            switch (readState) {
                case Frame:
                    try {
                        frame = Integer.parseInt(line);
                        readState = ReadState.Time;
                    } catch (NumberFormatException e) {
                        LOGGER.warn("%s is not a number.", line);
                    }
                    break;
                case Time:
                    time = parseTimeLine(line);
                    readState = ReadState.Text;
                    break;
                case Text:
                    if (line.trim().length() == 0) {
                        readState = ReadState.Frame;
                        result.add(time, text.toString().trim());
                        time = null;
                        text = new StringBuilder();
                        continue;
                    }
                    text.append(line.trim());
                    text.append(" ");
                    break;
            }
        }
        return result;
    }

    private static VideoTranscript.Time parseTimeLine(String line) {
        String start = line.substring(0, 12);
        String end = line.substring(line.length() - 12, line.length());
        return new VideoTranscript.Time(parseTime(start), parseTime(end));
    }

    private static long parseTime(String str) {
        Matcher m = TIME_PATTERN.matcher(str);
        if (!m.matches()) {
            throw new RuntimeException("Could not parse time: " + str);
        }
        return (Long.parseLong(m.group(1)) * 60 * 60 * 1000)
                + (Long.parseLong(m.group(2)) * 60 * 1000)
                + (Long.parseLong(m.group(3)) * 1000)
                + Long.parseLong(m.group(4));
    }
}
TOP

Related Classes of io.lumify.storm.video.SubRip

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.