26 Agustus Tahun Kemarin : Sidang Skripsi

Di tanggal ini, pada tahun yang sama, terjadi pertempuran melelahkan antara mahasiswa lugu yang baru belajar nulis dengan tiga orang dosen penguji. Mahasiswa lugu itu menyerang dengan amunisi utamanya, berupa pemahaman yang ia dapat selama skripsi, hasil penelitian, dan metode penelitian yang dilakukannya. Satu persatu dosen penguji membalas serangan dengan berbagai pertanyaan. Ada yang dapat ditahan dengan mudah, ada pula yang sulit dan menciutkan percaya diri. Keringat dingin mengucur perlahan dan wajah pun memucat. Semua berakhir setelah akhirnya para penguji mengisi map yang berisi form penilaian. Hati tenang, dan fiuuh selesai juga.

8 Jam sebelumnya, di rumah, ibu menyiapkan jas yang telah ia beli khusus untuk sidang hari ini. Sedangkan ayah mencari sepatu yang biasa kupakai lalu menyemirnya. Sedangkan almarhum adik dengan cekatan menyiapkan dasi yang akan dipakai, hanya ia yang bisa menyiapkan dasi, rapi sekali. Saat itu kedekatan dengan keluarga begitu terasa, mereka begitu paham dengan situasi seperti ini. Semua mendoakan, semua menyemangati, menguatkan percaya diri di hati.

Beberapa bulan sebelumnya, tak terhitung berapa kali bolak-balik rumah-kampus-rumah-kampus. Terkadang jauh-jauh datang ke kampus hanya untuk mengedit beberapa paragraf. Terkadang bimbingan hanya berlangsung sejenak, padahal sudah lama-lama menunggu. Pusing dengan bugs yang baru ketahuan. Tidur jam 10 malam untuk bangun jam 1 malam, bug fixing, revisi dokumen, hitung ulang, dan kadang melamun. Gaji sebagai guru honorer pun dihabiskan untuk nge-print draft skripsi yang kalau ditotalkan bisa sampai ribuan halaman.  Tak peduli orang menilai skripsi ini buruk atau baik, yang penting ‘yes, I can do it’.

Rasa lelah, letih, dan segala pengalaman kurang menyenangkan selama mengerjakan skripsi seakan terbayar lunas ketika pengumuman kelulusan. Semua tersenyum bahagia penuh syukur. Bahagia rasanya bisa membuat keluarga bangga dan bahagia akan kelulusan ini. Hal yang istiwema adalah, prestasiku tak pernah seperti ini semenjak TK sampai SMA. ‘Fiuuh, beres juga kuliah, tinggal wisuda’, ujarku dalam hati.

Masa-masa paling indah, masa-masa di sekolah skripsi.

photo from : Danti

Subtitle Trimmer (Atau Apalah Istilahnya)

filmAwal cerita

Saya ada film tapi gak ada subtitlenya. Jadi, saya cari aja via google subtitlenya. Setelah dapat beberapa subtitle saya senang, tapi ada yang mengganjal di hati ini (ciee). Subtitlenya gak pas dengan jalannya si film. Subtitlenya telat muncul. Orang di film udah ngomong, eh subtitlenya baru muncul 10 detik kemudian. Kan gak enak.

Yaudah

Awalnya mau pakai Ulead video editor buat motong file film nya, namun rasanya kurang efisien. Yasudah mending coba pake java aja buat ngedit file subtitlenya. Saya gak tau apakah udah pernah ada yang bikin atau belum. Mau cari di google juga bingung kata kuncinya apa. Jadilah saya mengistilahkannya subtitle trimmer. a very very simple java program dan masih belum rapih.

Untuk kebutuhan sendiri sih, sudah bisa jalan. lumayan. Silahkan kalau mau mencoba. Menjalankannya gampang, langsung compile sendiri saja programnya. Jangan lupa isi parameter di mehtod main, ada tiga parameter : filename(path), leadtime, mode.

hehe :p

the Code

/**
 * Program  : Subtitle Trimmer
 * Author 	: risyana
 * Email  	: risyana[at]gmail[dot]com
 * License	: free to use, free to redistribute, free to develop. Credit please
 * */

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.Writer;
import java.io.BufferedWriter;
import java.io.FileWriter;

public class SubtitleTrimmer {
	String currentSubtitleFile;
	String leadTimeStr;
	String mode;
	String dir;

	SubtitleTrimmer(String currentSubtitleFile, String leadTimeStr, String mode){
		this.currentSubtitleFile = currentSubtitleFile;
		this.leadTimeStr = leadTimeStr;
		this.mode = mode;
		this.dir = GetFileDirectory(currentSubtitleFile);
	}

	public String GetFileDirectory(String currentSubtitleFile){
		int lastIndex = currentSubtitleFile.lastIndexOf("/");
		dir = currentSubtitleFile.substring(0, lastIndex);
		return dir;
	}

	public StringBuffer readCurrentSubtitle() throws ParseException{
		Date leadTime;
		String text = null;
		BufferedReader reader = null;

		File file = new File(currentSubtitleFile);
		StringBuffer contents = new StringBuffer();

		DateFormat df = new SimpleDateFormat("HH:mm:ss");
		leadTime = df.parse(leadTimeStr);

		try {
			reader = new BufferedReader (new FileReader(file));

			String start_time_str = null;
			String end_time_str = null;

			Date start_time ;
			Date end_time ;

			long start_time_new ;
			long end_time_new ;

			while ((text = reader.readLine()) != null){
				if (text.contains(" --> ")){
					start_time_str = text.substring(0, 8);
					end_time_str = text.substring(17, 25);

					start_time = df.parse(start_time_str);
					end_time = df.parse(end_time_str);

					int hours, minutes, seconds;

					// new start time
					if(mode == "minus"){
						start_time_new = (start_time.getTime() - leadTime.getTime());
					}else{
						start_time_new = (start_time.getTime() + leadTime.getTime());
					}

					int timeInSeconds = (int) (start_time_new / 1000);
					hours = timeInSeconds / 3600;
					timeInSeconds = timeInSeconds - (hours * 3600);
					minutes = timeInSeconds / 60;
					timeInSeconds = timeInSeconds - (minutes * 60);
					seconds = timeInSeconds;
					String start_time_new_str = Integer.toString(hours)+":"+Integer.toString(minutes)+":"+Integer.toString(seconds);

					// new end time
					if(mode == "minus"){
						end_time_new = end_time.getTime() - leadTime.getTime();
					}else{
						end_time_new = end_time.getTime() + leadTime.getTime();
					}

					timeInSeconds = (int) (end_time_new / 1000);
					hours = timeInSeconds / 3600;
					timeInSeconds = timeInSeconds - (hours * 3600);
					minutes = timeInSeconds / 60;
					timeInSeconds = timeInSeconds - (minutes * 60);
					seconds = timeInSeconds;
					String end_time_new_str = Integer.toString(hours)+":"+Integer.toString(minutes)+":"+Integer.toString(seconds);

					// replace old time with new start time
					text = text.replace(df.format(start_time), start_time_new_str);
					text = text.replace(df.format(end_time), end_time_new_str);
				}

				contents.append(text).append(System.getProperty("line.separator"));

			}
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			try{
				if(reader != null){
					reader.close();
				}
			}catch(IOException e){
				e.printStackTrace();
			}
		}

		return contents ;
	}

	public void writeNewSubtitle(StringBuffer contents){

		Writer writer = null;

		try{
			//String text = "this is a text file..";
			File file2 = new File(dir+"new_subtitle.srt");
			writer = new BufferedWriter(new FileWriter(file2));
			writer.write(contents.toString());
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			try{
				if(writer != null){
					writer.close();
				}
			}catch(IOException e){
				e.printStackTrace();
			}
		}

		System.out.println(contents.toString());
	}

	public static void main(String[]args) throws ParseException{
		// use this constructor to enter needed arguments :
		// arg#1: fill with path and filename current subtitle
		// arg#2: fill with lead time with format HH:mm:ss
		// arg#3: fill with 'minus' to backward subtitle, or fill with any text to forward subtitle

		SubtitleTrimmer st = new SubtitleTrimmer("D://coba SubtitleTrimmer//titanic.srt","00:00:11","minus");

		st.writeNewSubtitle(st.readCurrentSubtitle());
		System.out.println("success");
	}
}

Update Aug 21 2011
Memperbaiki beberapa line untuk kasus jika subtitlenya terlalu cepat.

/**
 * Program  : Subtitle Trimmer
 * Author 	: risyana
 * Email  	: risyana[at]gmail[dot]com
 * License	: free to use, free to redistribute, free to develop. Credit please :D
 * */

package fileAndString;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.Writer;
import java.io.BufferedWriter;
import java.io.FileWriter;

public class SubtitleTrimmer {
	String currentSubtitleFile;
	String leadTimeStr;
	String mode;
	String dir;

	SubtitleTrimmer(String currentSubtitleFile, String leadTimeStr, String mode){
		this.currentSubtitleFile = currentSubtitleFile;
		this.leadTimeStr = leadTimeStr;
		this.mode = mode;
		this.dir = GetFileDirectory(currentSubtitleFile);
	}

	public String GetFileDirectory(String currentSubtitleFile){
		int lastIndex = currentSubtitleFile.lastIndexOf("/");
		dir = currentSubtitleFile.substring(0, lastIndex);
		return dir;
	}

	public StringBuffer readCurrentSubtitle() throws ParseException{
		Date leadTime;
		String text = null;
		BufferedReader reader = null;

		File file = new File(currentSubtitleFile);
		StringBuffer contents = new StringBuffer();

		DateFormat df = new SimpleDateFormat("HH:mm:ss");
		leadTime = df.parse(leadTimeStr);

		int timeInSeconds = 0;

		try {
			reader = new BufferedReader (new FileReader(file));

			String start_time_str = null;
			String end_time_str = null;

			Date start_time ;
			Date end_time ;
			Date default_time;	// 21 aug 2011

			long start_time_new ;
			long end_time_new ;

			while ((text = reader.readLine()) != null){
				if (text.contains(" --> ")){
					start_time_str = text.substring(0, 8);
					end_time_str = text.substring(17, 25);

					start_time = df.parse(start_time_str);
					end_time = df.parse(end_time_str);
					default_time = df.parse("21:00:00");	// 21 aug 2011

					int hours = 0, minutes = 0, seconds;

					// new start time
					if(mode == "minus"){
						start_time_new = (start_time.getTime() - leadTime.getTime());
					}else{
						start_time_new = start_time.getTime() + (default_time.getTime()+leadTime.getTime()) ;	// 21 aug 2011
					}

					timeInSeconds = (int) (start_time_new / 1000);
					hours = timeInSeconds / 3600;
					timeInSeconds = timeInSeconds - (hours * 3600);
					minutes = timeInSeconds / 60;
					timeInSeconds = timeInSeconds - (minutes * 60);
					seconds = timeInSeconds;

					System.out.println("   | "+start_time.getTime()+"&"+leadTime.getTime()+" = "+start_time_new);

					String start_time_new_str = Integer.toString(hours)+":"+Integer.toString(minutes)+":"+Integer.toString(seconds);

					// new end time
					if(mode == "minus"){
						end_time_new = end_time.getTime() - leadTime.getTime();
					}else{
						end_time_new = end_time.getTime() + (default_time.getTime()+leadTime.getTime()) ;	// 21 aug 2011
					}

					timeInSeconds = (int) (end_time_new / 1000);
					hours = timeInSeconds / 3600;
					timeInSeconds = timeInSeconds - (hours * 3600);
					minutes = timeInSeconds / 60;
					timeInSeconds = timeInSeconds - (minutes * 60);
					seconds = timeInSeconds;
					String end_time_new_str = Integer.toString(hours)+":"+Integer.toString(minutes)+":"+Integer.toString(seconds);

					// replace old time with new start time
					text = text.replace(df.format(start_time), start_time_new_str);
					text = text.replace(df.format(end_time), end_time_new_str);
				}

				contents.append(text).append(System.getProperty("line.separator"));

			}
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			try{
				if(reader != null){
					reader.close();
				}
			}catch(IOException e){
				e.printStackTrace();
			}
		}

		return contents ;
	}

	public void writeNewSubtitle(StringBuffer contents){

		Writer writer = null;

		try{
			//String text = "this is a text file..";
			File file2 = new File(dir+"new_subtitle.srt");
			writer = new BufferedWriter(new FileWriter(file2));
			writer.write(contents.toString());
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			try{
				if(writer != null){
					writer.close();
				}
			}catch(IOException e){
				e.printStackTrace();
			}
		}

		System.out.println(contents.toString());
	}

	public static void main(String[]args) throws ParseException{
		// use this constructor to enter needed arguments :
		// arg#1: fill with path and filename current subtitle
		// arg#2: fill with lead time with format HH:mm:ss
		// arg#3: fill with 'minus' to backward subtitle, or fill with any text to forward subtitle

		SubtitleTrimmer st = new SubtitleTrimmer("D://ceceu//The Chronicles of Narnia-The Voyage of the Dawn Treader.srt","00:00:04","xx");

		st.writeNewSubtitle(st.readCurrentSubtitle());
		System.out.println("success");
	}
}


Ikuti

Get every new post delivered to your Inbox.