⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 srtfile.java

📁 subtitlesync这是我写的一个小程序, 用于将下载的电影的字幕同步,因为很多时候字幕跟声音有不同步现象.现在只能处理SRT.格式的字幕. 开发平台是eclipse,使用方法是运行Main.j
💻 JAVA
字号:
package org.jeasylife.tools.subsync;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class SrtFile {
	private File file;

	private Set<SrtRecord> records = new TreeSet<SrtRecord>();

	public SrtFile(File file) {
		super();
		this.file = file;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		File srtFile = new File("Desperate.Housewives.S02E10.HDTV.XviD-LOL.srt");
		SrtFile srt = new SrtFile(srtFile);
		srt.checkFile();
		srt.backup();
		srt.parse();

		srt.adjust(-3500);
		srt.writeFile();
		


	}

	public void writeFile() {

		try {
			BufferedWriter bw = new BufferedWriter(new FileWriter(file));
			for (SrtRecord r : getRecords()) {
				bw.write(r.toString());
				bw.newLine();
			}
			bw.flush();
			bw.close();

		} catch (IOException e) {

			e.printStackTrace();
		}

	}

	public void adjust(int time) {
		for (SrtRecord sr : getRecords()) {
			Date d = new Date();
			d.setTime(sr.getStartTime().getTime() + time);
			sr.setStartTime(d);
			Date d1 = new Date();// Date is mutable
			d1.setTime(sr.getEndTime().getTime() + time);
			sr.setEndTime(d1);
		}
	}

	public void parse() {
		int iii = 0;
		try {
			Date start = new Date();
			Date end = new Date();
			StringBuilder subtitle = new StringBuilder();
			int flag = 0;
			boolean subFlag = false;
			Scanner sc = new Scanner(file);
			while (sc.hasNextLine()) {
				String s = sc.nextLine();
				if (!"".equals(s)) {
					Scanner sl = new Scanner(s);
					switch (flag) {
					case 0:
						if (sl.hasNextInt())
							iii = sl.nextInt();
						flag = 1;
						break;
					case 1:
						sl.useDelimiter(" --> ");
						if (sl.hasNext()) {
							start = SrtRecord.parseTime(sl.next());

							end = SrtRecord.parseTime(sl.next());

						}
						flag = 2;
						break;
					case 2:
						if (!subFlag) {
							subtitle.append(s);
							subFlag = true;
						} else {
							subtitle.append("\r\n");
							subtitle.append(s);
						}
						break;
					default:
						System.out.println("assert fail");

					}

				} else {
					// Scanner sline = new Scanner(s);
					// while(sline.hasNext()){
					// System.out.println(sline.next());
					// }

					if (sc.hasNextInt()) {
						flag = 0;
						// System.out.println(start + "" + end);

						addRecord(new SrtRecord(iii, start, end, subtitle
								.toString()));
						subtitle.delete(0, subtitle.length());
						subFlag = false;
					} else {
						flag = 0;
						subtitle.append("\r\n");

						addRecord(new SrtRecord(iii, start, end, subtitle
								.toString()));
						subtitle.delete(0, subtitle.length());
						subFlag = false;
						break;
					}

				}

			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public void backup() {
		StringBuilder sb = new StringBuilder(file.getAbsolutePath());
		sb.delete(sb.length() - 4, sb.length());
		sb.append(".srt.bak");
		File backup = new File(sb.toString());
		if (!backup.exists()) {
			FileUtils.copyFiles(file, backup);
		}

	}

	public void checkFile() {

		if (!file.exists()) {
			System.out.println("no such file");
			System.exit(1);
		}
		if (!file.isFile()) {
			System.out.println("not a file");
			System.exit(1);
		}
		if (!file.getName().toUpperCase().endsWith(".SRT")) {
			System.out.println("no a SRT file");
			System.exit(1);
		}

	}

	/**
	 * @return the set
	 */
	public Set<SrtRecord> getRecords() {
		return records;
	}

	/**
	 * add SRT record to Set
	 * 
	 * @param r
	 *            SRT record
	 * 
	 */
	public void addRecord(SrtRecord r) {
		this.records.add(r);
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -