From 81d436dcf5ae06553cb5fdfd7d5005f35f63cc0b Mon Sep 17 00:00:00 2001 From: Matt Jenkins Date: Sat, 6 Apr 2024 14:13:42 +0100 Subject: [PATCH] Improved filename tokens and added LibriVox export option --- .../audiobookrecorder/AudiobookRecorder.java | 44 ++++++++-- src/uk/co/majenko/audiobookrecorder/Book.java | 2 +- .../co/majenko/audiobookrecorder/Chapter.java | 88 ++++--------------- .../co/majenko/audiobookrecorder/Options.java | 10 +++ 4 files changed, 67 insertions(+), 77 deletions(-) diff --git a/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java b/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java index e8e683e..448f787 100644 --- a/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java +++ b/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java @@ -1645,7 +1645,7 @@ public class AudiobookRecorder extends JFrame implements DocumentListener { ProgressDialog ed = new ProgressDialog("Exporting " + chap.getName()); - ExportThread t = new ExportThread(chap, ed, "%t - %02n"); + ExportThread t = new ExportThread(chap, ed, "{book.title} - {chapter.number}"); Thread nt = new Thread(t); nt.start(); ed.setVisible(true); @@ -1660,7 +1660,22 @@ public class AudiobookRecorder extends JFrame implements DocumentListener { ProgressDialog ed = new ProgressDialog("Exporting " + chap.getName()); - ExportThread t = new ExportThread(chap, ed, "%I_%03i"); + ExportThread t = new ExportThread(chap, ed, "{book.isbn}_{chapter.number}"); + Thread nt = new Thread(t); + nt.start(); + ed.setVisible(true); + } + }); + + JMenuObject exportChapterLibri = new JMenuObject("For LibriVox.org", c, new ActionListener() { + public void actionPerformed(ActionEvent e) { + Debug.trace(); + JMenuObject o = (JMenuObject)e.getSource(); + Chapter chap = (Chapter)o.getObject(); + + ProgressDialog ed = new ProgressDialog("Exporting " + chap.getName()); + + ExportThread t = new ExportThread(chap, ed, "{chapter.name:lower}_{book.author:lower}_{narrator.initials:lower}_{file.bitrate.kb}kb"); Thread nt = new Thread(t); nt.start(); ed.setVisible(true); @@ -1772,6 +1787,7 @@ public class AudiobookRecorder extends JFrame implements DocumentListener { menu.add(exportChapter); exportChapter.add(exportChapterACX); exportChapter.add(exportChapterABU); + exportChapter.add(exportChapterLibri); menu.addSeparator(); menu.add(deleteChapter); menu.addSeparator(); @@ -1833,7 +1849,7 @@ public class AudiobookRecorder extends JFrame implements DocumentListener { Debug.trace(); JMenuObject src = (JMenuObject)(e.getSource()); Book thisBook = (Book)(src.getObject()); - exportAudio(thisBook, "%t - %n"); + exportAudio(thisBook, "{book.title} - {chapter.number}"); } })); @@ -1842,7 +1858,16 @@ public class AudiobookRecorder extends JFrame implements DocumentListener { Debug.trace(); JMenuObject src = (JMenuObject)(e.getSource()); Book thisBook = (Book)(src.getObject()); - exportAudio(thisBook, "%I_%03i"); + exportAudio(thisBook, "{book.isbn}_{chapter.number}"); + } + })); + + exportAll.add(new JMenuObject("For LibriVox.org", book, new ActionListener() { + public void actionPerformed(ActionEvent e) { + Debug.trace(); + JMenuObject src = (JMenuObject)(e.getSource()); + Book thisBook = (Book)(src.getObject()); + exportAudio(thisBook, "{chapter.name:lower}_{book.author:lower}_{narrator.initials:lower}_{file.bitrate.kb}kb"); } })); @@ -2462,13 +2487,15 @@ public class AudiobookRecorder extends JFrame implements DocumentListener { sampleWaveform.setPlayMarker(pos / format.getFrameSize()); int l = data.length - pos; if (l > blockSize) l = blockSize; - play.write(data, pos, l); + System.out.println(play.write(data, pos, l)); } + System.out.println("Closing..."); play.drain(); play.stop(); play.close(); play = null; + System.out.println("Closed"); playing = null; } catch (Exception e) { e.printStackTrace(); @@ -2718,8 +2745,10 @@ public class AudiobookRecorder extends JFrame implements DocumentListener { public void stopPlaying() { Debug.trace(); if (play != null) { + System.out.println("Forcing close"); play.close(); play = null; + System.out.println("Closed!!!"); } playing = null; } @@ -3623,8 +3652,9 @@ public class AudiobookRecorder extends JFrame implements DocumentListener { i = defEff.getSelectedIndex(); KVPair de = defEff.getItemAt(i); - book.setDefaultEffect(de.getKey()); - + if (de != null) { + book.setDefaultEffect(de.getKey()); + } book.setTitle(tit); book.setAuthor(aut); book.setGenre(gen); diff --git a/src/uk/co/majenko/audiobookrecorder/Book.java b/src/uk/co/majenko/audiobookrecorder/Book.java index b926384..86328fb 100644 --- a/src/uk/co/majenko/audiobookrecorder/Book.java +++ b/src/uk/co/majenko/audiobookrecorder/Book.java @@ -592,7 +592,7 @@ public class Book extends BookTreeNode { Debug.trace(); roomNoise.stopRecording(); } - }, 5000); // 5 seconds of recording + }, 10000); // 10 seconds of recording } } diff --git a/src/uk/co/majenko/audiobookrecorder/Chapter.java b/src/uk/co/majenko/audiobookrecorder/Chapter.java index 08002e8..cc4d941 100644 --- a/src/uk/co/majenko/audiobookrecorder/Chapter.java +++ b/src/uk/co/majenko/audiobookrecorder/Chapter.java @@ -6,6 +6,8 @@ import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import java.util.Enumeration; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.DefaultMutableTreeNode; @@ -190,77 +192,25 @@ public class Chapter extends BookTreeNode { Book book = getBook(); - for (char c : chars) { - switch (mode) { - case 0: - switch (c) { - case '%': { - mode = 1; - len = 0; - zeros = false; - first = true; - } - break; - default: out += c; break; - } - break; + HashMap tokens = new HashMap(); - case 1: - switch (c) { - case '0': len = len * 10; first = false; break; - case '1': len = len * 10 + 1; first = false; break; - case '2': len = len * 10 + 2; first = false; break; - case '3': len = len * 10 + 3; first = false; break; - case '4': len = len * 10 + 4; first = false; break; - case '5': len = len * 10 + 5; first = false; break; - case '6': len = len * 10 + 6; first = false; break; - case '7': len = len * 10 + 7; first = false; break; - case '8': len = len * 10 + 8; first = false; break; - case '9': len = len * 10 + 9; first = false; break; - case 't': - if (len > 0) - out += String.format("%" + len + "s", book.getTitle()); - else - out += book.getTitle(); - mode = 0; - break; - case 'n': - if (len > 0) - out += String.format("%" + len + "s", name); - else - out += name; - mode = 0; - break; + tokens.put("chapter.name", name); + tokens.put("chapter.number", Integer.toString(getSequenceNumber())); + tokens.put("chapter.id", getId()); + tokens.put("book.title", book.getTitle()); + tokens.put("book.author", book.getAuthor()); + tokens.put("book.isbn", book.getISBN()); + tokens.put("book.acx", book.getACX()); + tokens.put("narrator.name", Options.get("narrator.name")); + tokens.put("narrator.initials", Options.get("narrator.initials")); + tokens.put("file.bitrate", Integer.toString(Options.getInteger("audio.export.bitrate"))); + tokens.put("file.bitrate.kb", Integer.toString(Options.getInteger("audio.export.bitrate") / 1000)); - case '%': - out += '%'; - mode = 0; - break; - case 'I': - if (len > 0) - out += String.format("%" + len + "s", book.getISBN()); - else - out += book.getISBN(); - mode = 0; - break; - case 'A': - if (len > 0) - out += String.format("%" + len + "s", book.getACX()); - else - out += book.getACX(); - mode = 0; - break; - case 'i': - if (len > 0) - out += String.format("%0" + len + "d", getSequenceNumber()); - else - out += getId(); - mode = 0; - break; - } - } - } - return out; + for(Map.Entry entry : tokens.entrySet()) { + format = format.replace("{" + entry.getKey() + ":lower}", entry.getValue().toLowerCase()); + format = format.replace("{" + entry.getKey() + "}", entry.getValue()); + } + return format; } @SuppressWarnings("unchecked") diff --git a/src/uk/co/majenko/audiobookrecorder/Options.java b/src/uk/co/majenko/audiobookrecorder/Options.java index 40a6e2b..e693900 100644 --- a/src/uk/co/majenko/audiobookrecorder/Options.java +++ b/src/uk/co/majenko/audiobookrecorder/Options.java @@ -85,6 +85,9 @@ public class Options extends JDialog { ArrayList processorList; + JTextField narratorName; + JTextField narratorInitials; + static HashMap defaultPrefs; static Preferences prefs = null; @@ -387,6 +390,11 @@ public class Options extends JDialog { bitRate = addDropdown(optionsPanel, "Export bitrate:", getBitrates(), get("audio.export.bitrate"), "The MP3 bitrate to produce"); channels = addDropdown(optionsPanel, "Export channels:", getChannelCountList(), get("audio.export.channels"), "Mono or stereo MP3 production"); exportRate = addDropdown(optionsPanel, "Export sample rate:", getSampleRateList(), get("audio.export.samplerate"), "Sample frequency of the produced MP3"); + + addSeparator(optionsPanel); + + narratorName = addTextField(optionsPanel, "Narrator Name:", get("narrator.name"), "The name of the narrator for use in the exported file tags"); + narratorInitials = addTextField(optionsPanel, "Narrator Initials:", get("narrator.initials"), "The initials of the narrator"); addSeparator(optionsPanel); @@ -736,6 +744,8 @@ public class Options extends JDialog { if (bitRate.getSelectedItem() != null) set("audio.export.bitrate", ((KVPair)bitRate.getSelectedItem()).key); if (channels.getSelectedItem() != null) set("audio.export.channels", ((KVPair)channels.getSelectedItem()).key); if (exportRate.getSelectedItem() != null) set("audio.export.samplerate", ((KVPair)exportRate.getSelectedItem()).key); + set("narrator.name", narratorName.getText()); + set("narrator.initials", narratorInitials.getText()); set("process.sphinx", enableParsing.isSelected()); set("process.command", speechCommand.getText()); set("process.threads", workerThreads.getValue());