package com.javaeasy.cuefileprocessor; import java.io.DataOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; import java.nio.charset.UnsupportedCharsetException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.javaeasy.fileiterator.FileSysIteratorUtils; import com.javaeasy.fileiterator.ProcessFileSysItemIF; public class CueFileProcessor implements ProcessFileSysItemIF { public static CueFileProcessor createInstance() { return new CueFileProcessor(); } private CueFileProcessor() { } public void initProcessor(File root) { Charset targetCharset = null; try { targetCharset = Charset.forName("UTF-8"); targetEncoder = targetCharset.newEncoder(); } catch (UnsupportedCharsetException ex) { ex.printStackTrace(); } } public String[] getProcessFileExtentions() { return new String[] { "ape", "flac", "wav", "wv" }; } @Override public String[] getProcessFileNames() { return null; } public void preProcessFolder(File folder) { if (findExistingCueFile(folder)) { return; } if (!hasMusicFiles(folder)) { return; } String cueFileName = folder.getName(); m_curCueFile = new File(folder, cueFileName + CUE); try { m_curCueFile.createNewFile(); cueFileCreated.add(m_curCueFile.getPath()); m_curFileContent.append(CUE_TITLE.replace(PERFORMER, cueFileName) .replace(ALBUM, cueFileName)); } catch (IOException e) { e.printStackTrace(); return; } trackNo = 1; System.out.println("Processing Folder:" + folder.getPath()); } public boolean findExistingCueFile(File folder) { File[] cueFile = FileSysIteratorUtils.findAllFilesInFolder(folder, new String[] { "cue" }, null); return cueFile != null && cueFile.length > 0; } public boolean hasMusicFiles(File folder) { File[] musicFile = FileSysIteratorUtils.findAllFilesInFolder(folder, getProcessFileExtentions(), null); return musicFile != null && musicFile.length > 0; } public void postProcessFolder(File folder) { if (m_curCueFile == null) { return; } try { DataOutputStream cueFileOutput = new DataOutputStream( new FileOutputStream(m_curCueFile)); CharBuffer sourceBuf = CharBuffer.wrap(m_curFileContent); ByteBuffer targetBytesBuf = targetEncoder.encode(sourceBuf); cueFileOutput.write(BOM_FOR_UTF8, 0, 3); cueFileOutput.write(targetBytesBuf.array(), 0, targetBytesBuf.limit()); cueFileOutput.flush(); cueFileOutput.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (CharacterCodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } m_curFileContent = new StringBuilder(); m_curCueFile = null; System.out.println("Processed Folder:" + folder.getPath()); } public void preProcessFile(File file) { System.out.println("Processing File:" + file.getPath()); } public void processFile(File musicFile) { if (m_curCueFile == null) { return; } StringBuilder curItem = new StringBuilder(); String fileName = musicFile.getName(); String[] trackMsg = this.getTrackMsgFromFileName(fileName); curItem.append(MUSIC_ITEM.replace(SOURCE_FILE, fileName) .replace(TRACK_Number, trackMsg[0]) .replace(TRACK_TITLE, trackMsg[1])); m_curFileContent.append(curItem); } private String[] getTrackMsgFromFileName(String fileName) { String[] trackMsg = new String[2]; StringBuilder number = new StringBuilder(); int curCharIdx = 0; char curChar = 0; while (Character.isDigit((curChar = fileName.charAt(curCharIdx)))) { number.append(curChar); curCharIdx++; } if (number.length() > 0) { trackMsg[0] = number.toString(); } else { trackMsg[0] = String.valueOf(trackNo); trackNo++; } while (UNWANTED_CHARS_IN_TITLE.indexOf(fileName.charAt(curCharIdx)) != -1) { curCharIdx++; } int lastDot = fileName.lastIndexOf('.'); trackMsg[1] = fileName.substring(curCharIdx, lastDot); return trackMsg; } public void postProcessFile(File file) { System.out.println("Processed File:" + file.getPath()); processedFiles.add(file.getPath()); } public void done() { int count = processedFiles.size(); System.out.println("File Processed\t:" + count); for (Iterator<String> it = processedFiles.iterator(); it.hasNext();) { System.out.println(it.next()); } count = cueFileCreated.size(); System.out.println("Cue File Created\t:" + count); for (Iterator<String> it = cueFileCreated.iterator(); it.hasNext();) { System.out.println(it.next()); } } private int trackNo = 1; private List<String> processedFiles = new ArrayList<String>(); public static List<String> cueFileCreated = new ArrayList<String>(); CharsetEncoder targetEncoder = null; private static final String UNWANTED_CHARS_IN_TITLE = " .-_()"; private File m_curCueFile = null; private StringBuilder m_curFileContent = new StringBuilder(); private static final byte[] BOM_FOR_UTF8 = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }; private static final String CUE = ".cue"; private static final String DUMMY = "**??"; private static final String PERFORMER = DUMMY + "PERFORMER" + DUMMY; private static final String ALBUM = DUMMY + "ALBUM" + DUMMY; private static final String SOURCE_FILE = DUMMY + "SOURCEFILE" + DUMMY; private static final String TRACK_Number = DUMMY + "TRACKNO" + DUMMY; private static final String TRACK_TITLE = DUMMY + "TRACKTITLE" + DUMMY; private static final String CUE_TITLE = "PERFORMER \"" + PERFORMER + "\"\nTITLE \"" + ALBUM + "\"" + "\n"; private static final String MUSIC_ITEM = "FILE \"" + SOURCE_FILE + "\" WAVE\n" + " TRACK " + TRACK_Number + " AUDIO\n" + " TITLE \"" + TRACK_TITLE + "\"\n INDEX 01 00:00:00\n"; }