commit ab5386e17c3765de732a1739f8d658fab75a495c Author: Kim Wittenburg Date: Sun Jul 23 23:37:35 2017 +0200 Archive Audiobook Maker diff --git a/Podcast.POD b/Podcast.POD new file mode 100755 index 0000000..175a435 --- /dev/null +++ b/Podcast.POD @@ -0,0 +1,30 @@ +[Podcast] + +altfolder1=Test +basename=Test +audiobook=true +artwork=Bild.jpg +imgwidth=50 +imgheight=50 +editpointcount=3 + + +[Editpoint_1] +image=Bild.jpg +audiofile=02 Take On Me.m4a +chapter=1 +start=00:00:00.00 + + +[Editpoint_2] +image=Bild.jpg +audiofile=08 - Nie wieder Krieg, nie mehr Las Vegas.m4a +chapter=2 +start=00:02:59.00 + + +[Editpoint_3] +image=Bild.jpg +audiofile=16 - Trick 17 m. s..m4a +chapter=3 +start=00:05:37.00 \ No newline at end of file diff --git a/audiobook Maker Frank.rar b/audiobook Maker Frank.rar new file mode 100755 index 0000000..09b8890 Binary files /dev/null and b/audiobook Maker Frank.rar differ diff --git a/audiobook Maker.rar b/audiobook Maker.rar new file mode 100755 index 0000000..cfe64f8 Binary files /dev/null and b/audiobook Maker.rar differ diff --git a/build.xml b/build.xml new file mode 100755 index 0000000..f310fad --- /dev/null +++ b/build.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + Builds, tests, and runs the project Audiobook Maker 1.0. + + + diff --git a/manifest.mf b/manifest.mf new file mode 100755 index 0000000..1574df4 --- /dev/null +++ b/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/src/Data/SSA.exe.jpg b/src/Data/SSA.exe.jpg new file mode 100755 index 0000000..9759019 Binary files /dev/null and b/src/Data/SSA.exe.jpg differ diff --git a/src/Data/Set_Win.jpg b/src/Data/Set_Win.jpg new file mode 100755 index 0000000..ff24a58 Binary files /dev/null and b/src/Data/Set_Win.jpg differ diff --git a/src/Data/Settings.jpg b/src/Data/Settings.jpg new file mode 100755 index 0000000..af004c3 Binary files /dev/null and b/src/Data/Settings.jpg differ diff --git a/src/Data/Tab_Adv.jpg b/src/Data/Tab_Adv.jpg new file mode 100755 index 0000000..a0f6c2f Binary files /dev/null and b/src/Data/Tab_Adv.jpg differ diff --git a/src/Data/Vollidiot.txt b/src/Data/Vollidiot.txt new file mode 100755 index 0000000..fa6bbd2 --- /dev/null +++ b/src/Data/Vollidiot.txt @@ -0,0 +1,170 @@ +[Podcast] + +altfolder1=Vollidiot +basename=Vollidiot +audiobook=true +artwork=Vollidiot.png +imgwidth=300 +imgheight=300 +editpointcount=22 + + +[Editpoint_1] +image=Vollidiot.png +audiofile=1-01 Intro.m4a +chapter=001 +start=00:00:00.00 + + +[Editpoint_2] +image=Vollidiot.png +audiofile=1-02 Macadamia Nudge Matsch.m4a +chapter=002 +start=00:00:45.00 + + +[Editpoint_3] +image=Vollidiot.png +audiofile=1-03 Der Saftschubser-Gentleman.m4a +chapter=003 +start=00:18:36.00 + + +[Editpoint_4] +image=Vollidiot.png +audiofile=1-04 Danke, WMF!.m4a +chapter=004 +start=00:38:37.00 + + +[Editpoint_5] +image=Vollidiot.png +audiofile=1-05 Lala.m4a +chapter=005 +start=00:55:59.00 + + +[Editpoint_6] +image=Vollidiot.png +audiofile=1-06 Die Halslose Killerschwuchtel.m4a +chapter=006 +start=01:03:31.00 + + +[Editpoint_7] +image=Vollidiot.png +audiofile=1-07 Josef-Stalin-Charme-Schule.m4a +chapter=007 +start=01:09:38.00 + + + +[Editpoint_8] +image=Vollidiot.png +chapter=008 +audiofile=2-01 Die Rote Eule Fraktion.m4a +start=01:19:38.00 + + +[Editpoint_9] +image=Vollidiot.png +chapter=009 +audiofile=2-02 Schicklgruber.m4a +start=01:30:52.00 + + +[Editpoint_10] +image=Vollidiot.png +chapter=010 +audiofile=2-03 Tall Latte Macchiato Armagheddo.m4a +start=01:41:11.00 + + +[Editpoint_11] +image=Vollidiot.png +chapter=011 +audiofile=2-04 Paula.m4a +start=01:52:12.00 + + +[Editpoint_12] +image=Vollidiot.png +chapter=012 +audiofile=2-05 Der Shrimpsdöner.m4a +start=02:00:34.00 + + +[Editpoint_13] +image=Vollidiot.png +chapter=013 +audiofile=2-06 Tag Am Meer.m4a +start=02:09:56.00 + + +[Editpoint_14] +image=Vollidiot.png +chapter=014 +audiofile=2-07 Der Paula-Plan.m4a +start=02:19:47.00 + + +[Editpoint_15] +image=Vollidiot.png +chapter=015 +audiofile=2-08 _Soy JulianComotellamas_.m4a +start=02:26:06.00 + + +[Editpoint_16] +image=Vollidiot.png +chapter=016 +audiofile=3-01 Krebsrote Flachpfeife.m4a +start=02:39:00.00 + + + +[Editpoint_17] +image=Vollidiot.png +chapter=017 +audiofile=3-02 Nacht Am Meer.m4a +start=02:53:40.00 + + + +[Editpoint_18] +image=Vollidiot.png +chapter=018 +audiofile=3-03 Im Separee Der Horizontalen Ver.m4a +start=03:10:38.00 + + + +[Editpoint_19] +image=Vollidiot.png +chapter=019 +audiofile=3-04 Wenn Sie Eine Zitrone Haben.m4a +start=03:22:42.00 + + + +[Editpoint_20] +image=Vollidiot.png +chapter=020 +audiofile=3-05 Die Glühwürmchenseilbahn.m4a +start=03:34:06.00 + + + +[Editpoint_21] +image=Vollidiot.png +chapter=021 +audiofile=3-06 Vollidiot.m4a +start=03:43:37.00 + + + +[Editpoint_22] +image=Vollidiot.png +chapter=022 +audiofile=3-07 Das Gurkenrennen.m4a +start=03:48:03.00 \ No newline at end of file diff --git a/src/Data/change.jpg b/src/Data/change.jpg new file mode 100755 index 0000000..c8ef879 Binary files /dev/null and b/src/Data/change.jpg differ diff --git a/src/Data/drag-and-drop.jpg b/src/Data/drag-and-drop.jpg new file mode 100755 index 0000000..9282339 Binary files /dev/null and b/src/Data/drag-and-drop.jpg differ diff --git a/src/Data/iTunes Data.html b/src/Data/iTunes Data.html new file mode 100755 index 0000000..5dc220d --- /dev/null +++ b/src/Data/iTunes Data.html @@ -0,0 +1,19 @@ +

Wo speichert iTunes meine Songs???

+ +Wenn sie sich diese Frage schon öfters gestellt haben, ist dies genau die richtige Anleitung.

+Wenn sie iTunes geöffnet haben, klicken sie auf Bearbeiten >> Einstellungen:
+Settings.jpg

+ +Es sollte sich dieses Fenster öffnen(Die Haken können auch anders gesetzt sein):
+Set_Win.jpg

+ +Dort klicken sie jetzt auf den Tab Erweitert:
+Tab_Adv.jpg

+ +Dort gibt es nun oben ein Feld, in dem der Pfad des iTunes Medienordners steht. Mit dem Button Ändern kann dieser beliebig geändert werden.(rote Rahmen)
+change.jpg

+ +Wenn sie den dort angegebenen Pfad im Windows-Explorer öffnen, finden sie dort standartmässig Ordner, die nach den Interpreten benannt sind(und ein paar standart iTunes-Ordner wie z.B. Mobile Applications). Unter dem gewünschten Interpretennamen finden sie seine Alben als Ordner vor, in welchen wiederum die Titel liegen.
+Es kann sein, dass sie ihren gewünschten Interpreten nicht finden:

  1. Falls es ein Interpret sein sollte, den sie nicht über den iTunes store oder eine CD importiert haben, sollten sie gucken, ob der Haken "beim Hinzufügen in den Medienordner kopieren" angewählt ist(letztes Bild, blauer Rahmen). Ist er das nicht, so liegen die Dateien in dem Ordner auf den Sie sie(z.B. vom USB-Stick)kopiert haben. Falls doch siehe 2. +
  2. Sehen sie in den Unterordnern Music, Compilations und Music/Compilations(fragen Sie mich nicht nach dem Ordnungssystem )des iTunes Medienordners nach, ob die Interpreten(evtl. gleich die Alben) dort als Ordner vorliegen. +
\ No newline at end of file diff --git a/src/Data/import.jpg b/src/Data/import.jpg new file mode 100755 index 0000000..2d189ca Binary files /dev/null and b/src/Data/import.jpg differ diff --git a/src/Data/importSettings.jpg b/src/Data/importSettings.jpg new file mode 100755 index 0000000..197ae3b Binary files /dev/null and b/src/Data/importSettings.jpg differ diff --git a/src/Data/importSettings2.jpg b/src/Data/importSettings2.jpg new file mode 100755 index 0000000..439f745 Binary files /dev/null and b/src/Data/importSettings2.jpg differ diff --git a/src/Data/list.jpg b/src/Data/list.jpg new file mode 100755 index 0000000..ce3d3d7 Binary files /dev/null and b/src/Data/list.jpg differ diff --git a/src/Data/main.jpg b/src/Data/main.jpg new file mode 100755 index 0000000..bdda992 Binary files /dev/null and b/src/Data/main.jpg differ diff --git a/src/Data/names.jpg b/src/Data/names.jpg new file mode 100755 index 0000000..db55b82 Binary files /dev/null and b/src/Data/names.jpg differ diff --git a/src/Data/output.jpg b/src/Data/output.jpg new file mode 100755 index 0000000..27569f3 Binary files /dev/null and b/src/Data/output.jpg differ diff --git a/src/Data/pod.jpg b/src/Data/pod.jpg new file mode 100755 index 0000000..b38aae9 Binary files /dev/null and b/src/Data/pod.jpg differ diff --git a/src/Data/search.jpg b/src/Data/search.jpg new file mode 100755 index 0000000..58a7d40 Binary files /dev/null and b/src/Data/search.jpg differ diff --git a/src/Data/source.jpg b/src/Data/source.jpg new file mode 100755 index 0000000..144e01a Binary files /dev/null and b/src/Data/source.jpg differ diff --git a/src/Dating/Time.java b/src/Dating/Time.java new file mode 100755 index 0000000..bb786fd --- /dev/null +++ b/src/Dating/Time.java @@ -0,0 +1,106 @@ +package Dating; + +//~--- JDK imports ------------------------------------------------------------ + +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; + +public class Time { + private int hours = 0; + private int minutes = 0; + private int seconds = 0; + + public Time() {} + + public Time(int hours, int minutes, int seconds) { + this.add(hours, minutes, seconds); + + + /*this.hours = hours; + this.minutes = minutes; + this.seconds = seconds;*/ + } + + public void add(Time t) { + add(t.getHours(), t.getMinutes(), t.getSeconds()); + } + + public void add(int hours, int minutes, int seconds) { + this.seconds = this.seconds + seconds; + this.minutes = this.minutes + minutes; + this.hours = this.hours + hours; + + for (;;) { + + if (this.seconds >= 60) { + this.minutes++; + this.seconds = this.seconds - 60; + } else { + break; + } + } + + for (;;) { + + if (this.minutes >= 60) { + this.hours++; + this.minutes = this.minutes - 60; + } else { + break; + } + } + } + + public String asString() { + String returnS; + + if (hours < 10) { + returnS = "0" + hours; + } else { + returnS = "" + hours; + } + + if (minutes < 10) { + returnS = returnS + ":0" + minutes; + } else { + returnS = returnS + ":" + minutes; + } + + if (seconds < 10) { + returnS = returnS + ":0" + seconds; + } else { + returnS = returnS + ":" + seconds; + } + + return returnS; + } + + public int getHours() { + return hours; + } + + public int getMinutes() { + return minutes; + } + + public int getSeconds() { + return seconds; + } + + public void setHours(int hours) { + this.hours = hours; + } + + public void setMinutes(int minutes) { + this.minutes = minutes; + } + + public void setSeconds(int seconds) { + this.seconds = seconds; + } +} + + +//~ Formatted by Jindent --- http://www.jindent.com diff --git a/src/Exceptions/EndingException.java b/src/Exceptions/EndingException.java new file mode 100755 index 0000000..f3b706c --- /dev/null +++ b/src/Exceptions/EndingException.java @@ -0,0 +1,14 @@ +package Exceptions; + +public class EndingException extends Exception { + public EndingException() { + super(); + } + + public EndingException(String s) { + super(s); + } +} + + +//~ Formatted by Jindent --- http://www.jindent.com diff --git a/src/Exceptions/FolderException.java b/src/Exceptions/FolderException.java new file mode 100755 index 0000000..30cbf64 --- /dev/null +++ b/src/Exceptions/FolderException.java @@ -0,0 +1,11 @@ +package Exceptions; + +public class FolderException extends Throwable { + public FolderException() { + super(); + } + + public FolderException(String s) { + super(s); + } +} diff --git a/src/Exceptions/NoFilesSelectedException.java b/src/Exceptions/NoFilesSelectedException.java new file mode 100755 index 0000000..dd61b2f --- /dev/null +++ b/src/Exceptions/NoFilesSelectedException.java @@ -0,0 +1,11 @@ +package Exceptions; + +public class NoFilesSelectedException extends NotSelectedException { + + public NoFilesSelectedException(){ + super(); + } + public NoFilesSelectedException(String message){ + super(message); + } +} diff --git a/src/Exceptions/NoFolderSelectedException.java b/src/Exceptions/NoFolderSelectedException.java new file mode 100755 index 0000000..f3f74a5 --- /dev/null +++ b/src/Exceptions/NoFolderSelectedException.java @@ -0,0 +1,12 @@ +package Exceptions; + + +public class NoFolderSelectedException extends NotSelectedException { + + public NoFolderSelectedException() { + super(); + } + public NoFolderSelectedException(String message) { + super(message); + } +} diff --git a/src/Exceptions/NotSelectedException.java b/src/Exceptions/NotSelectedException.java new file mode 100755 index 0000000..5d319f9 --- /dev/null +++ b/src/Exceptions/NotSelectedException.java @@ -0,0 +1,11 @@ +package Exceptions; + +public class NotSelectedException extends Exception { + + public NotSelectedException(){ + super(); + } + public NotSelectedException(String message){ + super(message); + } +} diff --git a/src/LAF/LAF.java b/src/LAF/LAF.java new file mode 100755 index 0000000..41901b8 --- /dev/null +++ b/src/LAF/LAF.java @@ -0,0 +1,81 @@ +package LAF; + + +public class LAF { + public static final String Windows = "Windows"; + public static final String Mac = "Nimbus"; + public static final String Nimbus = "Nimbus"; + public static final String Motif = "Motif"; + public static final String Metal = "Metal"; + public static void LAFUpdate(java.awt.Component[] components){ + int NumberOfComponents = components.length; + int i; + for (i = 0; i + + audiobook Maker Tutorial + Der Ordner Data entält die Bilddateien der Readme. + + +

Achtung:

+ Gegebenenfalls muss man Administrator sein um alle Teile des Tutorials befolgen zu können, da z.B. SSA standartmäßig in das Programmverzeichnis(bei mir "C:\Programme\", oder "C:\Program Files\") installiert wird.

+ +

iPod Audiobook Maker Tutorial

+

Inhalt

+

    +
  1. Installation
  2. +
  3. Allgemeines
  4. +
  5. Tutorial
  6. +
  7. Aufbau einer .POD Datei
  8. +
  9. Quellen
  10. +
+

1. Installation

+
    +
  1. Da der iPod audiobook Maker in Java geschrieben ist, ist es notwendig Java zu installieren(download) +
  2. Um den iPod audiobook Maker zu benutzen müssen sie zuerst den Slideshow Assembler(kurz: SSA) installieren.(Warum) +
  3. Führen sie dazu die ssa_setup105a.exe aus und befolgen sie die Anweisungen.(Alternativ auch der originale Download von Jr Learns Media(Sie brauchen SSA und nicht SSAFront)) +
  4. Verschieben sie nun die audiobook Maker.jar in das Programmverzeichnis von SSA(Bei mir ist das C:\Programme\Slideshow Assambler\)Bild +
+ +

2. Allgemeines

+ Haben Sie schon mal ein Hörbuch vom iTunes-Sore mit einer gerippten Hörbuch-CD verglichen? Der Unterschied dürfte sofort auffallen: + Das iTunes-Hörbuch besteht aus einer Datei mit schön gesetzten Kapiteln, während das CD-Hörbuch aus vielen einzelnen Dateien besteht. + Aber es gibt Möglichkeiten Diese Dateien zu einem iTunes-Hörbuch zu machen. Und um das zu erleichtern habe ich den iPod audiobook Maker geschrieben. + Der Name audiobook Maker ist eigentlich nicht ganz richtig, da das Programm nur eine .POD Datei erstellt, und keine .m4b(iTunes Hörbuch) Datei. + Diese .POD Datei kann nun allerdings durch SSA ausgewertetwerden, wodurch eine m4b Datei erstellt wird.

+ Generell ist der iPod audiobook Maker dafür gedacht das mühsame Schreiben der Startzeiten in der .POD Datei + zu erleichtern, allerdings soll das Programm noch komfortabler werden und auch das Hörbuch direkt erstellen.
+ Das Programm ist in Java geschrieben, was bedeutet, dass es auch auf anderen Plattformen laufen sollte. Allerdings weiß ich dort nichts über die Handhabung von iTunes und glaube nicht, dass SSA für andere Systeme verfügbar ist. Deshalb ist dieses Tutorial vor allem für Windows-Benutzer

+ Start

+ + +

3. Tutorial(Beispiel: Tommy Jaud-Vollidiot)

+
    +
  1. Schritt 1: Rippen der CD
  2. +
  3. Schritt 2: Vorbereiten der Dateien
  4. +
  5. Schritt 3: Benutzung des iPod audiobook Makers
  6. +
  7. Schritt 4: SSA Benutzen
  8. +
  9. Schritt 5: Aufräumen
  10. +
+ Hier ein ausführliches Tutorial wie dieses Programm benutzt wird:

+ + +

Schritt 1: Rippen der CD

+ Als erstes müssen sie die Audiodateien(am besten über iTunes) auf den PC rippen. Allerdings sollten sie vorher sicher stellen, dass die Dateien dann auch als m4a Dateien vorliegen und nicht als mp3s oder anderes. + Das tun sie, indem sie auf Importeinstellungen klicken:
+ Data/importSettings.jpg

+ Dann sollte sich so ein Fenster öffnen. Dabei sollte vor allem die markierte Einstellung auf AAC stehen. Den Rest müssen sie selber + je nach PC einstellen:
+ Data/importSettings2.jpg

+ Danach können sie CD importieren.
+ Tutorial
+ Start

+ + +

Schritt 2: Vorbereiten der Dateien

+ Jetzt sollen die Hörbuch Dateien in einen Unterordner des Programm-Verzeichnises von SSA verschoben werden(Namen merken). Das können Sie, indem sie die entsprechenden Dateien in iTunes markieren und per drag-and-drop in das Verzeichnis kopieren:
+ Data/drag-and-drop.jpg

+ Alternativ dazu, können die Dateien auch diereckt über den Windows-Explorer kopiert oder verschoben werden.
+ Wie sie den\die Ordner finden, wo iTunes die Dateien abspeichert können sie hier sehen(Link); + Falls Sie noch ein CD-Cover hinzufügen wollen, kopieren oder verschieben sie die Bilddatei in den selben Unterordner von SSA, wie die Musikdateien.
+ Tutorial
+ Start

+ + +

Schritt 3: Benutzung des iPod audiobook Makers

+ der audiobook Maker erstellt in einem anzugebenden Verzeichnis die Datei Podcast.POD. Sie können diese Datei nach belieben umbenennen(die Endung .POD muss erhalten bleiben)

+ + Als erstes führen sie die Datei audiobook Maker.jar aus(Doppelklick oder manuell mit Konsole(Zum Verzeichnis navigieren und den Befehl "java -jar [meineJarDatei.jar]" eingeben). Es sollte sich dieses Fenster öffnen(Falls .jar-Dateien mit eienem externen Programm(z.B. WinRAR) geöffnet werden sollten, müssen sie in den jeweiligen Programmeinstellungen die Dateiendung *.jar für das Programm deaktivieren.):
+ Data/main.jpg

+ + Der Button Ordner fordert sie dazu auf den Namen des Ordners anzugeben in den sie die Dateien aus Schritt 2 anzugeben.

+ Der Button Cover auswählen fordert sie dazu auf den Namen der Bilddatei(Schritt 2) die das Cover werden soll und im angegebenen Ordner sollte anzugeben.

+ Der Button .POD Datei erstellen erstellt logischerweise die .POD Datei im angegebenen Ordner.

+ Die drei Ausahlknöpfe lassen sie wählen, wie die einzelnen Kapitel genannt werden sollen(Bild zu Kapitel durchnummerieren).

+ Die Dateien werden in Alphabetischer Reihnfolge zum Hörbuch zusammengefasst.

+ + +

Schritt 4: SSA benutzen

+ Jetzt kommt der letzte Schritt zum Hörbuch. Dazu müssen sie nur die erstellte .POD Datei auf SSA.exe ziehen. Es sollte sich ein Fenster öffnen:
+ Data/SSA.exe.jpg

+ + Danach sollte eine Auflistung der Dateien kommen, die in den Editpoints angegeben sind.
+ Data/list.jpg

+ + Als letztes werden sie zum Warten aufgefordert, während die m4b Datei erstellt wird(bei mir hat sich das Fenster automatisch geschlosen, als dei !-Zeichen in der Mitte der zweiten Zeile waren.).
+ Data/output.jpg
+ Tutorial
+ Start

+ + +

Schritt 5: Aufräumen(optional)

+ Als letzten Schritt empfehle ich, die CD-Dateien aus der iTunes-Mediathek zu löschen, da sie diese nun in einem Hörbuch haban. + Dieses importieren sie in iTunes , indem sie es per drag-and-drop in die iTunes-Mediathek ziehen(falls sie im folgenden die importierte .m4b datei verschieben/löschen gibt iTunes beim Abspielen eine Fehlermeldung aus, dass die Originaldatei nicht gefunden wurde. Über den Button Suchen können sie den Pfad zur Datei neu belegen.Bild).
+ Data/import.jpg
+ Sie können nun über den Windows-Explorer auch die Quelldateien, die Sie von der CD importiert haben löschen, da diese nun nicht mehr gebraucht werden.(Wo speichert iTunes mein Dateien) + Tutorial
+ Start

+ +

4. Aufbau einer .POD Datei

+ + Hier Noch mal eine kurze Erklärung, wie eine .POD Datei aufgebaut ist, damit sie auch nachträglich Änderungen vornehmen können.
+ Wenn Sie eine .POD Datei in einem Editor (Notepad(++), Editor, ...) öffnen, können sie folgendes finden(hinter den =Zeichen sollte irgentetwas stehen, was den entsprechenden Punkt belegt):
+ Data/pod.jpg

+ + [Podcast]
+ dies ist die Startzeile (Da SSA eigentlich nicht für Hörbücher gemacht wurde, sondern für Podcasts, tricksen wir einfach ein bisschen.)

+ + altfolder1
+ ist der Name des Ordners, in dem sich die Audiodateien und evtl. das Cover befinden(von SSA.exe aus gesehen).

+ + basename
+ ist der Name des Ausgabeordners(von SSA.exe aus gesehen).

+ + artwork
+ ist der Name der Bilddatei, die als Cover verwendet werden soll(im angegebenen Ordner)

+ + imgwidth und imgheight
+ sind die Maße des Bildes(imgwidth=Breite, imgheight=Höhe)

+ + editpointcount
+ ist eine Angabe der Anzahl der Editpoints


+ + + [Editpoint_[Zahl]]
+ ist eine angabe, bei welchem Editpoint man sich befindet(ein Editpoint gibt Auskunft über eine Datei)

+ + image
+ ist der Name der Bilddatei für das Kapitel dieses Editpoints(Jedes Kapitel kann also ein eigenes Cover haben)

+ + audiofile
+ ist der Name der Datei des Editpoints

+ + chapter
+ ist der Name, der bei der Kapitelauswahl angezeigt wird(Bild)

+ + start
+ ist eine Angabe, wann das Kapitel beginnt(Format: hh:mm:ss,ff (h=Stunden, m=Minuten, s=Sekunden, f=Frames)), wobei die Frames sowieso ignoriert werden.

+ Ein komplettes Beispiel
+ Start

+ +

5. Quellen

+ Slideshow Assembler von Jr Learns Media
+ m4a-codec (JThink's JAudiotagger)
+ + diff --git a/src/audiobook.java b/src/audiobook.java new file mode 100755 index 0000000..0ef6213 --- /dev/null +++ b/src/audiobook.java @@ -0,0 +1,356 @@ +//~--- non-JDK imports -------------------------------------------------------- + +import Dating.Time; + +import Exceptions.*; + +import LAF.LAF; + +//Imports für m4a-Codec +import org.jaudiotagger.audio.*; +import org.jaudiotagger.audio.exceptions.*; +import org.jaudiotagger.tag.*; + +//~--- JDK imports ------------------------------------------------------------ + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.*; + +import java.io.*; + +import javax.imageio.*; + +import javax.swing.*; + +public class audiobook extends JFrame implements ActionListener { + + // Componenten deklarieren + private static Dimension ScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); + static audiobook maker; + private boolean hasImage = false; + private Time time = new Time(0, 0, 0); + private BufferedImage Cover; + private String CoverName; + private JPanel buttonPanel; + private ButtonGroup chapterGroup; + private JButton chooseImage; + private JButton create; + private File[] files; + private JButton output; + private String outputFolder; + private JLabel selectedFolder; + private JLabel selectedImage; + private JRadioButton typeSelf; + private JRadioButton useFilenames; + private JRadioButton useNumbers; + + // Konstruktor + public audiobook() { + this("iPod Audiobook Maker"); + } + + public audiobook(String s) { + super(s); + initComponents(); + } + + public void initComponents() { + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setIconImage(new ImageIcon(this.getClass().getResource("/Data\\icon.gif")).getImage()); + setLayout(new FlowLayout()); + +// labelPanel zeigt ausgewählten Ordner und Cover an + JPanel labelPanel = new JPanel(new FlowLayout()); + + selectedFolder = new JLabel("Ordner: -"); + selectedImage = new JLabel("Cover: "); + labelPanel.add(selectedFolder); + labelPanel.add(selectedImage); + +// Das buttonPanel ist das Panel in dem alle Komponenten angezeigt werden + buttonPanel = new JPanel(new GridLayout(0, 1)); + chooseImage = new JButton("Cover auswählen"); + output = new JButton("Ordner"); + create = new JButton(".POD Datei erstellen"); + chapterGroup = new ButtonGroup(); + +// Die Radiobuttons um die Art der Kapitelbezeichnung zu wählen + useNumbers = new JRadioButton("Kapitel durchnummerieren", true); + useFilenames = new JRadioButton("Dateinamen als Kapitelnamen verwenden", false); + typeSelf = new JRadioButton("Kapitel selber benennen", false); + +// Tooltips der Radiobuttons + output.setToolTipText( + "Der Name des Unterordners im Slideshow Assembler-Verzeichnis, in dem die Audiodateien liegen
" + + "und in dem die .POD Datei und die .m4b Datei gespeichert werden sollen"); + chooseImage.setToolTipText("Der Name der Bilddatei im \"Ordner\", die als Cover verwendet werden soll"); + useNumbers.setToolTipText("Die Namen der Kapitel werden \"001, 002, ...\" genannt"); + useFilenames.setToolTipText( + "Die Namen der Kapitel werden nach den Namen der dazugehörigen Dateien benannt.
" + + "Oft werden die Namen dadurch besonders lang."); + typeSelf.setToolTipText("Kapitelnamen selber angeben"); + +// Den Buttons ActionListener registrieren + chooseImage.addActionListener(this); + output.addActionListener(this); + create.addActionListener(this); + +// Hinzufügen zur Radiobutton group + chapterGroup.add(useNumbers); + chapterGroup.add(useFilenames); + chapterGroup.add(typeSelf); + +// Hinzufügen zum Buttonpanel + buttonPanel.add(labelPanel); + buttonPanel.add(output); + buttonPanel.add(chooseImage); + buttonPanel.add(create); + buttonPanel.add(useNumbers); + buttonPanel.add(useFilenames); + buttonPanel.add(typeSelf); + +// Buttonpanel zum Hauptfenster hinzufügen + add(buttonPanel); + +// Größe, Position, ... des Fensters einstellen + pack(); + setLocation((ScreenSize.width - getWidth()) / 2, (ScreenSize.height - getHeight()) / 2); + setResizable(true); + setVisible(true); + } + + public static void main(String[] args) { + +// Auswählen des Look-and-Feels + LAF.setLAF(LAF.Mac); + +// Neues audiobook-Fenster erzeugen + maker = new audiobook(); + } + + public void actionPerformed(ActionEvent e) { + +// ActionListener um den Ordner auszuwählen + if (e.getActionCommand().equals("Ordner")) { + +// Input-Dialog anzeigen um den Namen einzugeben + outputFolder = JOptionPane.showInputDialog(null, "Bitte Namen des Ordners angeben", "Eingabe", + JOptionPane.PLAIN_MESSAGE); + +// Überprüfen ob der Ordner existiert + try { + File f = new File(outputFolder); + + if (!f.exists() ||!f.isDirectory()) { + +// Exception falls der Ordner nicht existiert + throw new FolderException(); + } + +// Alle passenden Dateien zum files-Array hinzufügen + files = f.listFiles(new FileFilter() { + public boolean accept(File pathname) { + return pathname.getName().endsWith(".m4a"); + } + }); + selectedFolder.setText("Ordner: " + outputFolder + " -"); + selectedFolder.repaint(); + +// Abfangen der Exception falls der Ordner nicht existiert + } catch (FolderException exc) { + JOptionPane.showMessageDialog(null, "Ordner wurde nicht gefunden", "Fehler", JOptionPane.ERROR_MESSAGE); + outputFolder = null; + } + } + +// ActionListener um das Cover auszuwählen + if (e.getActionCommand().equals("Cover auswählen")) { + +// Ausgabeordner auf Existenz überprüfen + if (outputFolder != null) { + +// Input-Dialog um Dateinamen anzugeben + String s = JOptionPane.showInputDialog(null, "Bitte Namen der Bilddatei eingeben", "Eingabe", + JOptionPane.PLAIN_MESSAGE); + + try { + if (s == null) { + +// Abbruchbefehl des Dialogs behandeln + throw new IOException("go"); + } + +// Auf falsche Dateiendungen reagieren + if (!s.toLowerCase().endsWith(".jpg")) { + if (!s.toLowerCase().endsWith(".png")) { + throw new EndingException(); + } + } + + Cover = ImageIO.read(new File(outputFolder + "\\" + s)); + this.hasImage = true; + selectedImage.setText("Cover: " + s); + } + +// Behandeln möglicher Fehler (falsche Dateiendung, Bilddatei existiert nicht) +// Falls Abbruchbefehl gewählt wurde, keine Reaktion + catch (IOException exc) { + if (!exc.getMessage().equals("go")) { + Cover = null; + JOptionPane.showMessageDialog(null, "Bilddatei wurde nicht gefunden", "Fehler", + JOptionPane.WARNING_MESSAGE); + this.hasImage = false; + } + } catch (EndingException exc) { + JOptionPane.showMessageDialog(null, "Das Cover muss eine .jpg oder .png Datei sein", "Fehler", + JOptionPane.ERROR_MESSAGE); + Cover = null; + this.hasImage = false; + } + + if (Cover != null) { + this.hasImage = true; + this.CoverName = s; + } + } else { + JOptionPane.showMessageDialog(null, "Bitte geben sie zuerst einen Ausgabeordner an", "Fehler", + JOptionPane.ERROR_MESSAGE); + } + } + +// Funktion um .POD Datei zu erstellen + if (e.getActionCommand().equals(".POD Datei erstellen")) { + +// Cursor auf Arbeitscursor stellen + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + +// Ordner, Cover überprüfen + try { + if (outputFolder == null) { + throw new NoFolderSelectedException(); + } + + if (!hasImage) { + if (JOptionPane.showConfirmDialog(null, + "Es wurde kein Cover ausgewählt.\nDatei trotzdem erstellen?", + "Kein Cover", JOptionPane.YES_OPTION) == JOptionPane.NO_OPTION) { + throw new EndingException(); + } + } + +// Zählvariable + int i = 0; + + try { + FileWriter fWriter = new FileWriter(outputFolder + "\\Podcast.POD"); + BufferedWriter writer = new BufferedWriter(fWriter); + +// angegebene Informationen (Ordnername, Bild, Bildmaße, Dateianzahl) in die Datei schreiben + writer.write("[Podcast]\n"); + writer.write("altfolder1=" + outputFolder + "\n"); + writer.write("basename=" + outputFolder + "\n"); + writer.write("audiobook=true" + "\n"); + + if (this.hasImage) { + writer.write("artwork=" + CoverName + "\n"); + writer.write("imgwidth=" + Cover.getWidth() + "\n"); + writer.write("imgheight=" + Cover.getHeight() + "\n"); + } + + writer.write("editpointcount=" + files.length + "\n\n\n"); + +// "Editpoint" für jede Musikdatei in .POD Datei schreiben + for (i = 0; i < files.length; i++) { + writer.write("[Editpoint_" + (i + 1) + "]\n"); + + if (this.hasImage) { + writer.write("image=" + CoverName + "\n"); + } + + writer.write("audiofile=" + files[i].getName() + "\n"); + +// Kapitelnamen durchnummerieren + if (useNumbers.isSelected()) { + writer.write("chapter="); + + if ((i + 1) < 100) { + writer.write("0"); + + if ((i + 1) < 10) { + writer.write("0"); + } + } + + writer.write((i + 1) + "\n"); + +// Dateinamen als Kapitelnamen + } else if (useFilenames.isSelected()) { + writer.write("chapter=" + files[i].getName() + "\n"); + +// Kapitelnamen selber angeben + } else if (typeSelf.isSelected()) { + String s = JOptionPane.showInputDialog(null, + "Kapitelname der Datei " + files[i].getName() + " angeben (" + (i + 1) + + " von " + files.length + ")", "Kapitelnamen eingeben", + JOptionPane.PLAIN_MESSAGE); + + if (s == null) { + throw new EndingException(); + } + + writer.write("chapter=" + s + "\n"); + } + +// Startzeit des Kapitels schreiben + writer.write("start=" + time.asString() + ".00\n\n"); + +// Dauer der Datei zur gesammtzeit addieren + AudioFile af = AudioFileIO.read(files[i]); + + time.add(0, 0, af.getAudioHeader().getTrackLength()); + } + + writer.close(); + JOptionPane.showMessageDialog(null, "Fertig!\nDas Program schließt automatisch", "Fertig", + JOptionPane.INFORMATION_MESSAGE); + System.exit(0); + +// Reagieren auf Fehler(Datei nicht lesbar, fehlender Ausgabeordner, anderes) + } catch (CannotReadException exc) { + JOptionPane.showMessageDialog(null, + "Die Datei
" + files[i] + + "
konnte nicht gelesen werden", "Fehler", + JOptionPane.ERROR_MESSAGE); + } catch (TagException exc) { + JOptionPane.showMessageDialog( + null, + "Es ist ein unbekannter Fehler bei der Datei
" + files[i] + + "
aufgetreten", "Fehler", JOptionPane.ERROR_MESSAGE); + } catch (ReadOnlyFileException exc) { + JOptionPane.showMessageDialog(null, + "Die Datei
" + files[i] + + "
ist eine Read-Only Datei", "Fehler", + JOptionPane.ERROR_MESSAGE); + } catch (InvalidAudioFrameException exc) { + JOptionPane.showMessageDialog( + null, + "Es ist ein unbekannter Fehler bei der Datei
" + files[i] + + "
aufgetreten", "Fehler", JOptionPane.ERROR_MESSAGE); + } catch (IOException exc) { + JOptionPane.showMessageDialog(null, "Es ist ein unbekannter Fehler aufgetreten", "Fehler", + JOptionPane.ERROR_MESSAGE); + } + } catch (NoFolderSelectedException exc) { + JOptionPane.showMessageDialog(null, "Bitte wählen sie einen Ausgabeordner an", "Fehler", + JOptionPane.ERROR_MESSAGE); + } catch (EndingException exc) {} + +// Cursor auf Std setzen + this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } +} + + +//~ Formatted by Jindent --- http://www.jindent.com diff --git a/src/audiobookMaker.java b/src/audiobookMaker.java new file mode 100755 index 0000000..1449ca9 --- /dev/null +++ b/src/audiobookMaker.java @@ -0,0 +1,319 @@ +//~--- non-JDK imports -------------------------------------------------------- + +import org.jaudiotagger.audio.*; +import org.jaudiotagger.audio.exceptions.*; +import org.jaudiotagger.tag.*; + +import Dating.Time; + +//~--- JDK imports ------------------------------------------------------------ + +import java.awt.event.*; +import java.awt.image.*; + +import java.io.*; + +import javax.imageio.*; + +import javax.swing.*; + +class adapter extends WindowAdapter { + @Override + public void windowClosing(WindowEvent e) { + System.exit(0); + } +} + + +public class audiobookMaker extends JFrame { + static Time time = new Time(0, 0, 0); + String de[] = { + "Ordnername", "Covername", "Anzahl der Editpoints", ".POD Datei erstellen", "1 Titel, 2 Titel, ...", + "1-1 Titel, 1-2 Titel...3-7 Titel, ...", "Dateinamen selber angeben", "Dateinamen angeben. Datei Nr.", + "Erfolgreich!\nDas Programm wird beendet...", "Unbekannter Fehler!", "Anzahl der CDs", + "Anzahl der Titel auf CD ", "Bilddatei wurde nicht gefunden!\nDie Datei wird ohne Cover erstellt!" + }; + String en[] = { + "Foldername", "Covername", "Number of Editpoints", "Create .POD file", "1 Title, 2 Title, ...", + "1-1 Title, 1-2 Title...3-7 Title, ...", "Type in Filenames by yourself", "Type in Filenames. File no.", + "Build Succesful!\nProgram will exit...", "Unknown error!", "Type in number of CDs", "Number of Tracks on CD ", + "Image was not found!\nFile will created without Cover!" + }; + String[] selectedLanguage = de; + public JLabel editpointLabel = new JLabel(selectedLanguage[2]); + public JSpinner editpointField = new JSpinner(new SpinnerNumberModel(1, 0, 1000, 1)); + public JLabel createFileStdLabel = new JLabel(selectedLanguage[4]); + public JButton createFileStd = new JButton(selectedLanguage[3]); + public JLabel createFileSelfLabel = new JLabel(selectedLanguage[6]); + public JButton createFileSelf = new JButton(selectedLanguage[3]); + public JLabel createFileMultiCDLabel = new JLabel(selectedLanguage[5]); + public JButton createFileMultiCD = new JButton(selectedLanguage[3]); + +// Objekte inizialisieren + public JLabel FolderLabel = new JLabel(selectedLanguage[0]); + public JTextField Folder = new JTextField(); + public JLabel CoverLabel = new JLabel(selectedLanguage[1]); + public JTextField CoverField = new JTextField(); + BufferedImage CoverImage; + +// \Objekte + public audiobookMaker() { + super("iPod audiobook Maker"); + addWindowListener(new adapter()); + this.setSize(600, 300); + setLayout(null); + +// Objekte einstellen + FolderLabel.setBounds(55, 22, 100, 20); + Folder.setBounds(135, 20, 400, 25); + CoverLabel.setBounds(50, 62, 100, 20); + CoverField.setBounds(135, 60, 400, 25); + editpointLabel.setBounds(5, 102, 130, 20); + editpointField.setBounds(135, 100, 100, 25); + createFileStdLabel.setBounds(210, 222, 180, 20); + createFileStd.setBounds(210, 180, 150, 30); + createFileStd.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + createStd(); + } + }); + createFileSelfLabel.setBounds(400, 222, 180, 20); + createFileSelf.setBounds(400, 180, 150, 30); + createFileSelf.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + createSelf(); + } + }); + createFileMultiCDLabel.setBounds(20, 222, 180, 20); + createFileMultiCD.setBounds(20, 180, 150, 30); + createFileMultiCD.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + createMultiCD(); + } + }); + +// \Objekte + add(FolderLabel); + add(Folder); + add(CoverLabel); + add(CoverField); + add(editpointLabel); + add(editpointField); + add(createFileStd); + add(createFileStdLabel); + add(createFileSelf); + add(createFileSelfLabel); + add(createFileMultiCD); + add(createFileMultiCDLabel); + this.setVisible(true); + } + + public void createStd() { + try { + FileWriter creator = new FileWriter("Podcast.POD"); + BufferedWriter writer = new BufferedWriter(creator); + int Editpoints = (int) Double.parseDouble(editpointField.getValue().toString()); + boolean isCover; + + writer.write("[Podcast]\n"); + writer.write("altfolder1=" + Folder.getText() + "\n"); + writer.write("basename=" + Folder.getText() + "\n"); + + try { + File CoverFile = new File(Folder.getText() + "\\" + CoverField.getText()); + + CoverImage = ImageIO.read(CoverFile); + writer.write("artwork=" + CoverField.getText() + "\n"); + writer.write("imgwidth=" + CoverImage.getWidth() + "\n"); + writer.write("imgheight=" + CoverImage.getHeight() + "\n"); + isCover = true; + } catch (IOException e) { + JOptionPane.showMessageDialog(this, selectedLanguage[12]); + isCover = false; + } + + writer.write("editpointcount=" + Editpoints + "\n\n\n\n\n\n"); + + int i; + + for (i = 1; i <= Editpoints; i++) { + writer.write("[Editpoint_" + i + "]\n"); + + if (isCover == true) { + writer.write("image=" + CoverField.getText() + "\n"); + } + + writer.write("audiofile=" + i + " " + Folder.getText() + ".m4a\n"); + writer.write("chapter=" + i + "\n"); + writer.write("start=" + "\n\n\n"); + } + + writer.close(); + JOptionPane.showMessageDialog(null, selectedLanguage[8]); + System.exit(0); + } catch (Exception e) { + JOptionPane.showMessageDialog(null, selectedLanguage[9]); + } + } + + public void createSelf() { + try { + FileWriter creator = new FileWriter("Podcast.POD"); + BufferedWriter writer = new BufferedWriter(creator); + int Editpoints = (int) Double.parseDouble(editpointField.getValue().toString()); + boolean isCover; + + writer.write("[Podcast]\n"); + writer.write("altfolder1=" + Folder.getText() + "\n"); + writer.write("basename=" + Folder.getText() + "\n"); + writer.write("audiobook=true" + "\n"); + + try { + File CoverFile = new File(Folder.getText() + "\\" + CoverField.getText()); + + CoverImage = ImageIO.read(CoverFile); + writer.write("artwork=" + CoverField.getText() + "\n"); + writer.write("imgwidth=" + CoverImage.getWidth() + "\n"); + writer.write("imgheight=" + CoverImage.getHeight() + "\n"); + isCover = true; + } catch (IOException e) { + JOptionPane.showMessageDialog(this, selectedLanguage[12]); + isCover = false; + } + + writer.write("editpointcount=" + Editpoints + "\n\n\n"); + + int i; + + for (i = 1; i <= Editpoints; i++) { + String Title = JOptionPane.showInputDialog(this, selectedLanguage[7] + i); + + if (Title == null) { + throw new Exception("go"); + } + + writer.write("[Editpoint_" + i + "]\n"); + + if (isCover == true) { + writer.write("image=" + CoverField.getText() + "\n"); + } + + File audioFile = new File(Folder.getText() + "\\" + Title + ".m4a"); + + try { + AudioFile af = AudioFileIO.read(audioFile); + + System.out.println(af.getAudioHeader().getTrackLength() + "\n" + af.getFile().getName()); + System.out.println("||"); + writer.write("audiofile=" + Title + ".m4a\n"); + writer.write("chapter=" + i + "\n"); + writer.write("start="+time.asString()+".00" + "\n\n\n"); + + time.add(0, 0, af.getAudioHeader().getTrackLength()); + + } catch (CannotReadException exc) { + System.out.println("CannotReadException\n" + audioFile.exists()); + } catch (IOException exc) { + System.out.println("IOException"); + } catch (TagException exc) { + System.out.println("TagException"); + } catch (ReadOnlyFileException exc) { + System.out.println("ReadOnlyFileException"); + } catch (InvalidAudioFrameException exc) { + System.out.println("InvalidAudioFrameException"); + } + } + + writer.close(); + JOptionPane.showMessageDialog(null, selectedLanguage[8]); + System.exit(0); + } catch (Exception e) { + if (!e.getMessage().equals("go")) { + JOptionPane.showMessageDialog(null, selectedLanguage[9]); + } + } + } + + public void createMultiCD() { + try { + FileWriter creator = new FileWriter("Podcast.POD"); + BufferedWriter writer = new BufferedWriter(creator); + int Editpoints = (int) Double.parseDouble(editpointField.getValue().toString()); + boolean isCover; + + writer.write("[Podcast]\n"); + writer.write("altfolder1=" + Folder.getText() + "\n"); + writer.write("basename=" + Folder.getText() + "\n"); + + try { + File CoverFile = new File(Folder.getText() + "\\" + CoverField.getText()); + + CoverImage = ImageIO.read(CoverFile); + writer.write("artwork=" + CoverField.getText() + "\n"); + writer.write("imgwidth=" + CoverImage.getWidth() + "\n"); + writer.write("imgheight=" + CoverImage.getHeight() + "\n"); + isCover = true; + } catch (IOException e) { + JOptionPane.showMessageDialog(this, selectedLanguage[12]); + isCover = false; + } + + writer.write("editpointcount=" + Editpoints + "\n\n\n\n\n\n"); + + String CDs = JOptionPane.showInputDialog(this, selectedLanguage[10]); + + if (CDs == null) { + throw new Exception("go"); + } + + int CDNumber = (int) Double.parseDouble(CDs); + int i; + int allTracks[] = new int[1000]; + + for (i = 1; i <= CDNumber; i++) { + String Tracks = JOptionPane.showInputDialog(this, selectedLanguage[11] + i); + + if (Tracks == null) { + throw new Exception("go"); + } + + allTracks[i - 1] = (int) Double.parseDouble(Tracks); + } + + int i1; + int i2; + int i3 = 0; + + for (i1 = 1; i1 <= CDNumber; i1++) { + for (i2 = 1; i2 <= allTracks[i1 - 1]; i2++) { + i3++; + writer.write("[Editpoint_" + i3 + "]\n"); + + if (isCover == true) { + writer.write("image=" + CoverField.getText() + "\n"); + } + + writer.write("audiofile=" + i1 + "-" + i2 + " " + Folder.getText() + ".m4a\n"); + writer.write("chapter=" + i + "\n"); + writer.write("start=" + "\n\n\n"); + } + } + + writer.close(); + JOptionPane.showMessageDialog(null, selectedLanguage[8]); + System.exit(0); + } catch (Exception e) { + if (!e.getMessage().equals("go")) { + JOptionPane.showMessageDialog(null, selectedLanguage[9]); + } + } + } + + public static void main(String[] args) { + LAF.LAF.setLAF(LAF.LAF.Windows); + new audiobookMaker(); + } +} + + +//~ Formatted by Jindent --- http://www.jindent.com diff --git a/src/audiobookMakerPro.java b/src/audiobookMakerPro.java new file mode 100755 index 0000000..a8c8f97 --- /dev/null +++ b/src/audiobookMakerPro.java @@ -0,0 +1,385 @@ +//~--- non-JDK imports -------------------------------------------------------- + +import Dating.Time; + +import Exceptions.*; + +import LAF.LAF; + +import org.jaudiotagger.audio.*; +import org.jaudiotagger.audio.exceptions.*; +import org.jaudiotagger.tag.*; + +//~--- JDK imports ------------------------------------------------------------ + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.*; + +import java.io.*; + +import java.net.*; + +import javax.imageio.*; + +import javax.swing.*; +import javax.swing.event.*; + +public class audiobookMakerPro extends JFrame implements ListSelectionListener, ActionListener { + private static Dimension ScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); + static audiobookMakerPro maker; + private boolean hasImage = false; + private Time time = new Time(0, 0, 0); + + // private JButton remove; + // private JButton up; + private BufferedImage Cover; + private String CoverName; + private JPanel buttonPanel; + private ButtonGroup chapterGroup; + private JButton chooseImage; + private JButton create; + private File[] files; + + // private JButton down; + // private JList list; + // private DefaultListModel mod; + private int numberOfFiles; + + // private JButton openFiles; + private JButton output; + private String outputFolder; + private JLabel selectedFolder; + private JLabel selectedImage; + private JRadioButton typeSelf; + private JRadioButton useFilenames; + private JRadioButton useNumbers; + + public audiobookMakerPro() { + this("iPod Audiobook Maker"); + } + + public audiobookMakerPro(String s) { + super(s); + } + + public void initComponents() { + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setIconImage(new ImageIcon(this.getClass().getResource("/Data\\icon.gif")).getImage()); + setLayout(new FlowLayout()); + + // mod = new DefaultListModel(); + // list = new JList(mod); + // list.addListSelectionListener(this); + // list.setVisibleRowCount(20); + JPanel labelPanel = new JPanel(new FlowLayout()); + + selectedFolder = new JLabel("Ordner: -"); + selectedImage = new JLabel("Cover: "); + labelPanel.add(selectedFolder); + labelPanel.add(selectedImage); + buttonPanel = new JPanel(new GridLayout(0, 1)); + + // openFiles = new JButton("Öffnen"); + // up = new JButton("Hoch"); + // down = new JButton("Runter"); + // remove = new JButton("Entfernen"); + chooseImage = new JButton("Cover auswählen"); + output = new JButton("Ordner"); + create = new JButton(".POD Datei erstellen"); + chapterGroup = new ButtonGroup(); + useNumbers = new JRadioButton("Kapitel durchnummerieren", true); + useFilenames = new JRadioButton("Dateinamen als Kapitelnamen verwenden", false); + typeSelf = new JRadioButton("Kapitel selber benennen", false); + output.setToolTipText( + "Der Name des Unterordners im Slideshow Assembler-Verzeichnis, in dem die Audiodateien liegen
und in dem die .POD Datei und die .m4b Datei gespeichert werden sollen"); + chooseImage.setToolTipText("Der Name der Bilddatei im \"Ordner\", die als Cover verwendet werden soll"); + useNumbers.setToolTipText("Die Namen der Kapitel werden \"001, 002, ...\" genannt"); + useFilenames.setToolTipText( + "Die Namen der Kapitel werden nach den Namen der dazugehörigen Dateien benannt.
" + + "Oft werden die Namen dadurch besonders lang."); + typeSelf.setToolTipText("Kapitelnamen selber angeben"); + + // openFiles.addActionListener(this); + // remove.addActionListener(this); + chooseImage.addActionListener(this); + output.addActionListener(this); + create.addActionListener(this); + chapterGroup.add(useNumbers); + chapterGroup.add(useFilenames); + chapterGroup.add(typeSelf); + + // buttonPanel.add(openFiles); + // buttonPanel.add(up); + // buttonPanel.add(down); + // buttonPanel.add(remove); + buttonPanel.add(labelPanel); + buttonPanel.add(output); + buttonPanel.add(chooseImage); + buttonPanel.add(create); + buttonPanel.add(useNumbers); + buttonPanel.add(useFilenames); + buttonPanel.add(typeSelf); + + try { + String file = this.getClass().getResource("/Readme.html").getPath(); + + file = file.replaceAll("%20", " "); + file = file.replaceFirst("/", " "); + System.out.println(file); + + if (new File(file).exists()) { + try{ + buttonPanel.add(new frame.JLink(new File(file), "Readme und Tutorial öffnen", Color.BLUE)); + } + catch(IOException exc){ + JOptionPane.showMessageDialog(null, "IO"); + throw new FileNotFoundException(); + } + } + + /* + * if(new File(this.getClass().getResource("/Test/Bild.jpg").getFile()).exists()){ + * / buttonPanel.add(new frame.JLink(new File(this.getClass().getResource("/Test/Bild.jpg").getFile()), "Readme öffnen", Color.BLUE)); + * buttonPanel.add(new frame.JLink(new File("C:/Documents and Settings/Kim/Desktop/Java/Audiobook Maker/build/classes/Test/Bild.jpg"), "Readme öffnen", Color.BLUE)); + * } + */ + else { + throw new FileNotFoundException(); + } + } catch (FileNotFoundException exc) { + JOptionPane.showMessageDialog(null, "Readme wech"); + } + + // add(new JScrollPane(list)); + add(buttonPanel); + pack(); + setLocation((ScreenSize.width - getWidth()) / 2, (ScreenSize.height - getHeight()) / 2); + setResizable(true); + setVisible(true); + } + + public static String castFileToListEntry(File f) { + String s = "" + f.getName() + "
|->" + f.getAbsolutePath() + + ""; + + return s; + } + + /* + * public void addFilesToList(File[] files) { + * for (int i = 0; i < files.length; i++) { + * addFileToList(files[i]); + * } + * } + * + * public void addFileToList(File f) { + * this.mod.add(this.numberOfFiles, castFileToListEntry(f)); + * files[numberOfFiles] = f; + * numberOfFiles++; + * this.list.repaint(); + * } + */ + public static void main(String[] args) { + LAF.setLAF(LAF.Mac); + maker = new audiobookMakerPro(); + maker.initComponents(); + } + + public void valueChanged(ListSelectionEvent evt) {} + + public void actionPerformed(ActionEvent e) { + + + if (e.getActionCommand().equals("Ordner")) { + outputFolder = JOptionPane.showInputDialog(null, "Bitte Namen des Ordners angeben", "Eingabe", + JOptionPane.PLAIN_MESSAGE); + + try { + File f = new File(outputFolder); + + if (!f.exists() ||!f.isDirectory()) { + throw new FolderException(); + } + + files = f.listFiles(new FileFilter() { + public boolean accept(File pathname) { + return pathname.getName().endsWith(".m4a"); + } + }); + selectedFolder.setText("Ordner: " + outputFolder + " -"); + selectedFolder.repaint(); + } catch (FolderException exc) { + JOptionPane.showMessageDialog(null, "Ordner wurde nicht gefunden", "Fehler", JOptionPane.ERROR_MESSAGE); + outputFolder = null; + } + } + + if (e.getActionCommand().equals("Cover auswählen")) { + if (outputFolder != null) { + String s = JOptionPane.showInputDialog(null, "Bitte Namen der Bilddatei eingeben", "Eingabe", + JOptionPane.PLAIN_MESSAGE); + + try { + if (s == null) { + throw new IOException("go"); + } + + if (!s.toLowerCase().endsWith(".jpg")) { + if (!s.toLowerCase().endsWith(".png")) { + throw new EndingException(); + } + } + + Cover = ImageIO.read(new File(outputFolder + "\\" + s)); + this.hasImage = true; + selectedImage.setText("Cover: " + s); + } catch (IOException exc) { + if (!exc.getMessage().equals("go")) { + Cover = null; + JOptionPane.showMessageDialog(null, "Bilddatei wurde nicht gefunden", "Fehler", + JOptionPane.WARNING_MESSAGE); + this.hasImage = false; + } + } catch (EndingException exc) { + JOptionPane.showMessageDialog(null, "Das Cover muss eine .jpg oder .png Datei sein", "Fehler", + JOptionPane.ERROR_MESSAGE); + Cover = null; + this.hasImage = false; + } + + if (Cover != null) { + this.hasImage = true; + this.CoverName = s; + } + } else { + JOptionPane.showMessageDialog(null, "Bitte geben sie zuerst einen Ausgabeordner an", "Fehler", + JOptionPane.ERROR_MESSAGE); + } + } + + if (e.getActionCommand().equals(".POD Datei erstellen")) { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + try { + if (outputFolder == null) { + throw new NoFolderSelectedException(); + } + + if (files == null) { + throw new NoFilesSelectedException(); + } + + if (!hasImage) { + if (JOptionPane.showConfirmDialog(null, + "Es wurde kein Cover ausgewählt.\nDatei trotzdem erstellen?", + "Kein Cover", JOptionPane.YES_OPTION) == JOptionPane.NO_OPTION) { + throw new EndingException(); + } + } + + int i = 0; + + try { + FileWriter fWriter = new FileWriter(outputFolder + "\\Podcast.POD"); + BufferedWriter writer = new BufferedWriter(fWriter); + + writer.write("[Podcast]\n"); + writer.write("altfolder1=" + outputFolder + "\n"); + writer.write("basename=" + outputFolder + "\n"); + writer.write("audiobook=true" + "\n"); + + if (this.hasImage) { + writer.write("artwork=" + CoverName + "\n"); + writer.write("imgwidth=" + Cover.getWidth() + "\n"); + writer.write("imgheight=" + Cover.getHeight() + "\n"); + } + + writer.write("editpointcount=" + files.length + "\n\n\n"); + + for (i = 0; i < files.length; i++) { + writer.write("[Editpoint_" + (i + 1) + "]\n"); + + if (this.hasImage) { + writer.write("image=" + CoverName + "\n"); + } + + writer.write("audiofile=" + files[i].getName() + "\n"); + + if (useNumbers.isSelected()) { + writer.write("chapter="); + + if ((i + 1) < 100) { + writer.write("0"); + + if ((i + 1) < 10) { + writer.write("0"); + } + } + + writer.write((i + 1) + "\n"); + } else if (useFilenames.isSelected()) { + writer.write("chapter=" + files[i].getName() + "\n"); + } else if (typeSelf.isSelected()) { + String s = JOptionPane.showInputDialog(null, + "Kapitelname der Datei " + files[i].getName() + " angeben (" + (i + 1) + + " von " + files.length + ")", "Kapitelnamen eingeben", + JOptionPane.PLAIN_MESSAGE); + + if (s == null) { + throw new EndingException(); + } + + writer.write("chapter=" + s + "\n"); + } + + writer.write("start=" + time.asString() + ".00\n\n"); + + AudioFile af = AudioFileIO.read(files[i]); + + time.add(0, 0, af.getAudioHeader().getTrackLength()); + } + + writer.close(); + JOptionPane.showMessageDialog(null, "Fertig!\nDas Program schließt automatisch", "Fertig", + JOptionPane.INFORMATION_MESSAGE); + System.exit(0); + } catch (CannotReadException exc) { + JOptionPane.showMessageDialog(null, + "Die Datei
" + files[i] + + "
konnte nicht gelesen werden", "Fehler", + JOptionPane.ERROR_MESSAGE); + } catch (TagException exc) { + JOptionPane.showMessageDialog( + null, + "Es ist ein unbekannter Fehler bei der Datei
" + files[i] + + "
aufgetreten", "Fehler", JOptionPane.ERROR_MESSAGE); + } catch (ReadOnlyFileException exc) { + JOptionPane.showMessageDialog(null, + "Die Datei
" + files[i] + + "
ist eine Read-Only Datei", "Fehler", + JOptionPane.ERROR_MESSAGE); + } catch (InvalidAudioFrameException exc) { + JOptionPane.showMessageDialog( + null, + "Es ist ein unbekannter Fehler bei der Datei
" + files[i] + + "
aufgetreten", "Fehler", JOptionPane.ERROR_MESSAGE); + } catch (IOException exc) { + JOptionPane.showMessageDialog(null, "Es ist ein unbekannter Fehler aufgetreten", "Fehler", + JOptionPane.ERROR_MESSAGE); + } + } catch (NoFolderSelectedException exc) { + JOptionPane.showMessageDialog(null, "Bitte wählen sie einen Ausgabeordner an", "Fehler", + JOptionPane.ERROR_MESSAGE); + } catch (NoFilesSelectedException exc) { + JOptionPane.showMessageDialog(null, "Es wurden keine Dateien ausgewählt", "Fehler", + JOptionPane.ERROR_MESSAGE); + } catch (EndingException exc) {} + + this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } +} + + +//~ Formatted by Jindent --- http://www.jindent.com diff --git a/src/frame/JHyperLink.java b/src/frame/JHyperLink.java new file mode 100755 index 0000000..837af33 --- /dev/null +++ b/src/frame/JHyperLink.java @@ -0,0 +1,150 @@ +package frame; + +//~--- JDK imports ------------------------------------------------------------ + +import java.awt.*; +import java.awt.event.*; + +import java.net.*; + +import javax.swing.*; + +public class JHyperLink extends JLabel implements MouseListener { + public Cursor Rollover_Cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); + public Color LINK_COLOR; + public URI uri; + + public JHyperLink() {} + + public JHyperLink(String url) throws URISyntaxException { + super(url); + LINK_COLOR = Color.BLUE; + this.setForeground(LINK_COLOR); + uri = new URI(url); + this.addMouseListener(this); + } + + public JHyperLink(String url, Color color) throws URISyntaxException { + super(url); + LINK_COLOR = color; + this.setForeground(LINK_COLOR); + uri = new URI(url); + this.addMouseListener(this); + } + + public JHyperLink(String url, String title) throws URISyntaxException { + super(title); + this.LINK_COLOR = Color.BLUE; + this.setForeground(LINK_COLOR); + uri = new URI(url); + this.addMouseListener(this); + } + + public JHyperLink(String url, String title, Color color) throws URISyntaxException { + super(title); + LINK_COLOR = color; + this.setForeground(LINK_COLOR); + uri = new URI(url); + this.addMouseListener(this); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + + if (enabled == true) { + MouseListener[] listeners = this.getMouseListeners(); + + try { + MouseListener listener = listeners[0]; + } catch (Exception exc) { + this.addMouseListener(new JHyperLink()); + } + } + + if (enabled == false) { + MouseListener[] listeners = this.getMouseListeners(); + + for (int i = 0; ; i++) { + try { + MouseListener listener = listeners[i]; + + this.removeMouseListener(listener); + } catch (Exception exc) { + break; + } + } + } + } + + public void setColor(Color color) { + this.LINK_COLOR = color; + super.setForeground(color); + } + + public void setColor(int r, int g, int b) { + Color color = new Color(r, g, b); + + this.setColor(color); + } + + public void setColor(int r, int g, int b, int a) { + Color color = new Color(r, g, b, a); + + this.setColor(color); + } + + public Color getColor() { + return this.LINK_COLOR; + } + + public void setURI(URI uri) { + this.uri = uri; + } + + public void setURI(String uri) throws URISyntaxException { + this.uri = new URI(uri); + } + + public URI getURI() { + return this.uri; + } + + public void setText(String text, Color color) { + super.setText(text); + this.setColor(color); + } + + public void setText(String text, int r, int g, int b) { + super.setText(text); + this.setColor(r, g, b); + } + + public void setText(String text, int r, int g, int b, int a) { + super.setText(text); + this.setColor(r, g, b, a); + } + + public void mouseClicked(MouseEvent e) { + JHyperLink link = (JHyperLink) e.getComponent(); + + try { + Desktop.getDesktop().browse(link.uri); + } catch (java.io.IOException exc) {} + } + + public void mousePressed(MouseEvent e) {} + + public void mouseReleased(MouseEvent e) {} + + public void mouseEntered(MouseEvent e) { + JHyperLink link = (JHyperLink) e.getComponent(); + + link.setCursor(link.Rollover_Cursor); + } + + public void mouseExited(MouseEvent e) {} +} + + +//~ Formatted by Jindent --- http://www.jindent.com diff --git a/src/frame/JLink.java b/src/frame/JLink.java new file mode 100755 index 0000000..1933fb0 --- /dev/null +++ b/src/frame/JLink.java @@ -0,0 +1,180 @@ +package frame; + +import java.awt.event.*; +import javax.swing.*; +import java.io.*; +import java.awt.*; + + +public class JLink extends JLabel{ + + public File file; + public Color LINK_COLOR; + public Cursor Rollover_Cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); + + + + public JLink(){ + this(Color.RED); + } + public JLink(Color color){ + super(); + this.LINK_COLOR = color; + this.setForeground(LINK_COLOR); + this.file = null; + } + public JLink(String file)throws FileNotFoundException{ + this(new File(file), file, Color.RED); + } + public JLink(String file, Color color)throws FileNotFoundException{ + this(new File(file), file, color); + } + public JLink(String file, String title)throws FileNotFoundException{ + this(new File(file), title, Color.RED); + } + public JLink(String file, String title, Color color)throws FileNotFoundException{ + this(new File(file), title, color); + } + public JLink(File file)throws FileNotFoundException{ + this(file, file.getAbsolutePath(), Color.RED); + } + public JLink(File file, Color color)throws FileNotFoundException{ + this(file, file.getAbsolutePath(), color); + } + public JLink(File file, String title)throws FileNotFoundException{ + this(file, title, Color.RED); + } + public JLink(File file, String title, Color color)throws FileNotFoundException{ + super(title); + this.LINK_COLOR = color; + this.setForeground(LINK_COLOR); + this.file = file; + this.addMouseListener(new Linklistener()); + if(this.file.exists() == false){throw new FileNotFoundException();} + } + public void setCursor(Cursor cursor){ + this.Rollover_Cursor = cursor; + super.setCursor(cursor); + } + public File getFile(){ + return this.file; + } + public void setFile(File file)throws IOException{ + if(file.exists()){this.file = file;} + else { + this.file = null; + throw new IOException(); + } + if(this.isEnabled() == true){ + MouseListener[] listeners = this.getMouseListeners(); + try{ + MouseListener listener = listeners[0]; + } + catch(Exception exc){ + this.addMouseListener(new Linklistener()); + } + } + } + public void setFile(String file)throws IOException{ + if(new File(file).exists()){this.file = new File(file);} + else { + this.file = null; + throw new IOException(); + } + if(this.isEnabled() == true){ + MouseListener[] listeners = this.getMouseListeners(); + try{ + MouseListener listener = listeners[0]; + } + catch(Exception exc){ + this.addMouseListener(new Linklistener()); + } + } + } + public void setColor(Color color){ + this.LINK_COLOR = color; + super.setForeground(color); + } + public void setColor(int r, int g, int b){ + Color color = new Color(r, g, b); + this.setColor(color); + } + public void setColor(int r, int g, int b, int a){ + Color color = new Color(r, g, b, a); + this.setColor(color); + } + public Color getColor(){ + return this.LINK_COLOR; + } + @Override + public void setEnabled(boolean enabled){ + super.setEnabled(enabled); + if(enabled == true){ + MouseListener[] listeners = this.getMouseListeners(); + try{ + MouseListener listener = listeners[0]; + } + catch(Exception exc){ + this.addMouseListener(new Linklistener()); + } + } + if(enabled == false){ + MouseListener[] listeners = this.getMouseListeners(); + for(int i = 0;; i++){ + try{ + MouseListener listener = listeners[i]; + this.removeMouseListener(listener); + } + catch(Exception exc){ + break; + } + } + } + } + public void setText(String text, Color color){ + super.setText(text); + this.setColor(color); + } + public void setText(String text, int r, int g, int b){ + super.setText(text); + this.setColor(r, g, b); + } + public void setText(String text, int r, int g, int b, int a){ + super.setText(text); + this.setColor(r, g, b, a); + } + protected void click(MouseEvent e){ + JLink link = (JLink)e.getComponent(); + try{ + Desktop.getDesktop().open(link.file); + } + catch(java.io.IOException exc){} + } + +} + +class Linklistener implements MouseListener{ + + public void mouseClicked(MouseEvent e) { + JLink temp = (JLink)e.getComponent(); + temp.click(e); + } + + public void mousePressed(MouseEvent e) { + + } + + public void mouseReleased(MouseEvent e) { + + } + + public void mouseEntered(MouseEvent e) { + JLink link = (JLink)e.getComponent(); + link.setCursor(link.Rollover_Cursor); + } + + public void mouseExited(MouseEvent e) { + + } + +} \ No newline at end of file diff --git a/src/frame/JScreenLine.java b/src/frame/JScreenLine.java new file mode 100755 index 0000000..e9d8a2f --- /dev/null +++ b/src/frame/JScreenLine.java @@ -0,0 +1,65 @@ +package frame; + +//~--- JDK imports ------------------------------------------------------------ + +import java.awt.*; + +import javax.swing.*; + +public class JScreenLine extends Component { + private JSeparator sep = new JSeparator(JSeparator.HORIZONTAL); + private Component leftComp; + private JProgressBar progressBar; + private JFrame superFrame; + + public JScreenLine(boolean withProgressBar) { + if (withProgressBar) { + this.progressBar = new JProgressBar(); + } else {} + } + + public JProgressBar getProgressBar() { + return progressBar; + } + + public void setProgressBarWidth(int width) { + this.progressBar.setSize(width, 19); + } + + public void setLeftComp(Component c) { + leftComp = c; + } + + public Component getLeftComp() { + return leftComp; + } + + public void removeProgressBar() { + this.progressBar = null; + } + + public void removeLeftComp() { + this.leftComp = null; + } + + public void paint(Graphics g) { + sep.setBounds(0, this.getParent().getHeight() - 22, this.getParent().getWidth(), 10); + this.getParent().add(sep); + + if (this.progressBar != null) { + this.progressBar.setBounds(this.getParent().getWidth() - this.progressBar.getWidth(), + this.getParent().getHeight() - this.progressBar.getHeight(), 150, 19); + this.getParent().add(this.progressBar); + } + + if (leftComp != null) { + int w = leftComp.getWidth(); + + leftComp.setBounds(0, this.getParent().getHeight() - 22, w, 22); + this.getParent().add(leftComp); + } + } +} + + +//~ Formatted by Jindent --- http://www.jindent.com