diff --git a/Audiobook Maker 2.7 src.zip b/Audiobook Maker 2.7 src.zip new file mode 100755 index 0000000..cb28951 Binary files /dev/null and b/Audiobook Maker 2.7 src.zip differ diff --git a/Podcast.POD b/Podcast.POD deleted file mode 100755 index 175a435..0000000 --- a/Podcast.POD +++ /dev/null @@ -1,30 +0,0 @@ -[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/Profile/Album Interpret Tag.txt b/Profile/Album Interpret Tag.txt new file mode 100755 index 0000000..54dfb0f --- /dev/null +++ b/Profile/Album Interpret Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Album Interpret" verwenden +<%tag> \ No newline at end of file diff --git a/Profile/Album Tag.txt b/Profile/Album Tag.txt new file mode 100755 index 0000000..7f16c33 --- /dev/null +++ b/Profile/Album Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Album" verwenden +<%tag> \ No newline at end of file diff --git a/Profile/Dateiname.txt b/Profile/Dateiname.txt new file mode 100755 index 0000000..efa1fc5 --- /dev/null +++ b/Profile/Dateiname.txt @@ -0,0 +1,2 @@ +#Dateinamen ohne Endung verwenden +<%fileName> \ No newline at end of file diff --git a/Profile/Interpret Tag.txt b/Profile/Interpret Tag.txt new file mode 100755 index 0000000..d5f1019 --- /dev/null +++ b/Profile/Interpret Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Interpret" verwenden +<%tag> \ No newline at end of file diff --git a/Profile/Komponist Tag.txt b/Profile/Komponist Tag.txt new file mode 100755 index 0000000..7d86f9c --- /dev/null +++ b/Profile/Komponist Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Komponist" verwenden +<%tag> \ No newline at end of file diff --git a/Profile/Nummer+Titel Tag.txt b/Profile/Nummer+Titel Tag.txt new file mode 100755 index 0000000..442ab62 --- /dev/null +++ b/Profile/Nummer+Titel Tag.txt @@ -0,0 +1,6 @@ +#Beispiel: +#Dateiname: "1 01-BspDatei.m4a" +#Titel Tag: "BspTitel" +#Kapitelnummer im Hörbuch: "3" +#wird zu "003 - BspTitel" +<%number> - <%tag> \ No newline at end of file diff --git a/Profile/Nummerierung.txt b/Profile/Nummerierung.txt new file mode 100755 index 0000000..a79950a --- /dev/null +++ b/Profile/Nummerierung.txt @@ -0,0 +1,2 @@ +#Kapitel 001, Kapitel 002, ... +Kapitel <%number> \ No newline at end of file diff --git a/Profile/Tag b/Profile/Tag new file mode 100755 index 0000000..91b4904 --- /dev/null +++ b/Profile/Tag @@ -0,0 +1 @@ +<%tag> \ No newline at end of file diff --git a/Profile/Tag.txt b/Profile/Tag.txt new file mode 100755 index 0000000..0ae3991 --- /dev/null +++ b/Profile/Tag.txt @@ -0,0 +1 @@ +<%number> \ No newline at end of file diff --git a/Profile/Titel Tag.txt b/Profile/Titel Tag.txt new file mode 100755 index 0000000..a0a2226 --- /dev/null +++ b/Profile/Titel Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Titel" verwenden +<%tag> \ No newline at end of file diff --git a/Profile/Tracknummer Tag.txt b/Profile/Tracknummer Tag.txt new file mode 100755 index 0000000..39dcaa0 --- /dev/null +++ b/Profile/Tracknummer Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Tracknummer" verwenden +<%tag> \ No newline at end of file diff --git a/Profile/iTunes Standard.txt b/Profile/iTunes Standard.txt new file mode 100755 index 0000000..3a5bbf8 --- /dev/null +++ b/Profile/iTunes Standard.txt @@ -0,0 +1,4 @@ +#Beispiel: +#Dateiname: "01 BspDatei.m4a" +#wird zu "BspDatei" +<%advancedFileName> \ No newline at end of file diff --git a/Profile/iTunes mit Bindestrich.txt b/Profile/iTunes mit Bindestrich.txt new file mode 100755 index 0000000..ace245e --- /dev/null +++ b/Profile/iTunes mit Bindestrich.txt @@ -0,0 +1,4 @@ +#Beispiel: +#Dateiname: "01 - BspDatei.m4a" +#wird zu "BspDatei" +<%advancedFileName> \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 04e840a..0000000 --- a/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Audiobook Maker 1.0 - -The first version of the infamous Audiobook Maker - one of my first projects. -The Audiobook Maker takes a folder of MP3 files as well as some metadata and -creates a .POD file from those. The .POD file can then be processed by the -Slideshow Assembler in order to generate a mp4 audiobook. diff --git a/Settings.xml b/Settings.xml new file mode 100755 index 0000000..f636522 --- /dev/null +++ b/Settings.xml @@ -0,0 +1,28 @@ + + + + + + + + true + Move + true + [Artist][Album][Title] + [Title] + diff --git a/audiobook Maker Frank.rar b/audiobook Maker Frank.rar deleted file mode 100755 index 09b8890..0000000 Binary files a/audiobook Maker Frank.rar and /dev/null differ diff --git a/audiobook Maker.rar b/audiobook Maker.rar deleted file mode 100755 index cfe64f8..0000000 Binary files a/audiobook Maker.rar and /dev/null differ diff --git a/dist/Audiobook_Maker.jar b/dist/Audiobook_Maker.jar new file mode 100755 index 0000000..13cdf9f Binary files /dev/null and b/dist/Audiobook_Maker.jar differ diff --git a/dist/README.TXT b/dist/README.TXT new file mode 100755 index 0000000..0a8ce83 --- /dev/null +++ b/dist/README.TXT @@ -0,0 +1,32 @@ +======================== +BUILD OUTPUT DESCRIPTION +======================== + +When you build an Java application project that has a main class, the IDE +automatically copies all of the JAR +files on the projects classpath to your projects dist/lib folder. The IDE +also adds each of the JAR files to the Class-Path element in the application +JAR files manifest file (MANIFEST.MF). + +To run the project from the command line, go to the dist folder and +type the following: + +java -jar "Audiobook_Maker.jar" + +To distribute this project, zip up the dist folder (including the lib folder) +and distribute the ZIP file. + +Notes: + +* If two JAR files on the project classpath have the same name, only the first +JAR file is copied to the lib folder. +* Only JAR files are copied to the lib folder. +If the classpath contains other types of files or folders, these files (folders) +are not copied. +* If a library on the projects classpath also has a Class-Path element +specified in the manifest,the content of the Class-Path element has to be on +the projects runtime path. +* To set a main class in a standard Java project, right-click the project node +in the Projects window and choose Properties. Then click Run and enter the +class name in the Main Class field. Alternatively, you can manually type the +class name in the manifest Main-Class element. diff --git a/dist/lib/jaudiotagger-2.0.1.jar b/dist/lib/jaudiotagger-2.0.1.jar new file mode 100755 index 0000000..20c82a5 Binary files /dev/null and b/dist/lib/jaudiotagger-2.0.1.jar differ diff --git a/dist/lib/myLibrary.jar b/dist/lib/myLibrary.jar new file mode 100755 index 0000000..fdbed2d Binary files /dev/null and b/dist/lib/myLibrary.jar differ diff --git a/dist/lib/swing-layout-1.0.4.jar b/dist/lib/swing-layout-1.0.4.jar new file mode 100755 index 0000000..46fe3a2 Binary files /dev/null and b/dist/lib/swing-layout-1.0.4.jar differ diff --git a/exec/Audiobook Maker Installation.exe b/exec/Audiobook Maker Installation.exe new file mode 100755 index 0000000..1f349e7 Binary files /dev/null and b/exec/Audiobook Maker Installation.exe differ diff --git a/exec/Audiobook Maker.exe b/exec/Audiobook Maker.exe new file mode 100755 index 0000000..5575d2f Binary files /dev/null and b/exec/Audiobook Maker.exe differ diff --git a/exec/Audiobook Maker.jar b/exec/Audiobook Maker.jar new file mode 100755 index 0000000..4dcc804 Binary files /dev/null and b/exec/Audiobook Maker.jar differ diff --git a/exec/Audiobook Maker.nsi b/exec/Audiobook Maker.nsi new file mode 100755 index 0000000..3d83eb8 --- /dev/null +++ b/exec/Audiobook Maker.nsi @@ -0,0 +1,89 @@ +!include "MUI.nsh" +!include "LogicLib.nsh" + +Name "Audiobook Maker" +OutFile "Audiobook Maker Installation.exe" + +!define INSTALLATIONNAME "Audiobook Maker" +!define thisPath "C:\Documents and Settings\Kim\Desktop\Java\Audiobook Maker\exec" + +InstallDir "$PROGRAMFILES\Audiobook Maker" + +!define MUI_PAGE_HEADER_TEXT "Changelog" +!define MUI_PAGE_HEADER_SUBTEXT "Audiobook Maker 2.8 Beta Changelog" +!define MUI_LICENSEPAGE_TEXT_TOP "Audiobook Maker 2.8 Beta Changelog" +!define MUI_LICENSEPAGE_TEXT_BOTTOM "Klicken Sie auf Weiter um mit der Installation fortzufahren" +!define MUI_LICENSEPAGE_BUTTON "Weiter" +!insertmacro MUI_PAGE_LICENSE "changelog.rtf" + +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES + +!define MUI_FINISHPAGE_RUN "$INSTDIR\Audiobook Maker.exe" +!define MUI_FINISHPAGE_RUN_TEXT "Audiobook Maker starten" +!define MUI_FINISHPAGE_SHOWREADME "${thisPath}\Readme\Readme+Guide.html" +!define MUI_FINISHPAGE_SHOWREADME_TEXT "Readme zeigen" +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_LANGUAGE "German" + +Section "" + SetOutPath $INSTDIR + File "${thisPath}\Audiobook Maker.exe" + File "${thisPath}\Audiobook Maker.jar" + SetOutPath "$INSTDIR\lib" + File "${thisPath}\lib\" + WriteUninstaller $INSTDIR\Uninstall.exe + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "DisplayName" "Forth Installer" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "UninstallString" '"$INSTDIR\uninstall.exe"' + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "NoModify" 1 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "NoRepair" 1 + SetOutPath $INSTDIR +SectionEnd + +Section "Profile" Profile + SetOutPath "$INSTDIR\Profile\" + File "${thisPath}\Profile\" + SetOutPath $INSTDIR +SectionEnd + +Section "Start Menu Eintrag" Start + CreateDirectory "$SMPROGRAMS\${INSTALLATIONNAME}" + CreateShortCut "$SMPROGRAMS\${INSTALLATIONNAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" + CreateShortCut "$SMPROGRAMS\${INSTALLATIONNAME}\Audiobook Maker.lnk" "$INSTDIR\Audiobook Maker.exe" + SetOutPath $INSTDIR +SectionEnd + +Section "Desktopverknüpfung" Desktop + SetOutPath "$INSTDIR" + CreateShortcut "$DESKTOP\Audiobook Maker.lnk" "$INSTDIR\Audiobook Maker.exe" + SetOutPath $INSTDIR +SectionEnd + +Section "Zusätzliche Dateien" addFiles + SetOutPath $INSTDIR + File "${thisPath}\changelog.txt" + SetOutPath "$INSTDIR\Readme\" + File "${thisPath}\Readme\" + SetOutPath $INSTDIR +SectionEnd + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${Profile} "Installiert die Standard Profile" + !insertmacro MUI_DESCRIPTION_TEXT ${Start} "Erstellt einen Ordner im Startmenu" + !insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "Verknüpfung auf Desktop erstellen" + !insertmacro MUI_DESCRIPTION_TEXT ${addFiles} "Zusätzliche Dateien Extrahieren: Readme und changelog" +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +Section "Uninstall" + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" + RMDir /r "$INSTDIR\lib\" + RMDir /r "$INSTDIR\Profile\" + RMDir /r "$INSTDIR\Readme\" + RMDir /r "$INSTDIR\" + RMDir /r "$SMPROGRAMS\${INSTALLATIONNAME}\" + Delete "$DESKTOP\Audiobook Maker.lnk" +SectionEnd \ No newline at end of file diff --git a/exec/Audiobook Maker.zip b/exec/Audiobook Maker.zip new file mode 100755 index 0000000..60b6253 Binary files /dev/null and b/exec/Audiobook Maker.zip differ diff --git a/exec/Profile/Album Interpret Tag.txt b/exec/Profile/Album Interpret Tag.txt new file mode 100755 index 0000000..54dfb0f --- /dev/null +++ b/exec/Profile/Album Interpret Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Album Interpret" verwenden +<%tag> \ No newline at end of file diff --git a/exec/Profile/Album Tag.txt b/exec/Profile/Album Tag.txt new file mode 100755 index 0000000..7f16c33 --- /dev/null +++ b/exec/Profile/Album Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Album" verwenden +<%tag> \ No newline at end of file diff --git a/exec/Profile/Dateiname.txt b/exec/Profile/Dateiname.txt new file mode 100755 index 0000000..efa1fc5 --- /dev/null +++ b/exec/Profile/Dateiname.txt @@ -0,0 +1,2 @@ +#Dateinamen ohne Endung verwenden +<%fileName> \ No newline at end of file diff --git a/exec/Profile/Interpret Tag.txt b/exec/Profile/Interpret Tag.txt new file mode 100755 index 0000000..d5f1019 --- /dev/null +++ b/exec/Profile/Interpret Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Interpret" verwenden +<%tag> \ No newline at end of file diff --git a/exec/Profile/Komponist Tag.txt b/exec/Profile/Komponist Tag.txt new file mode 100755 index 0000000..7d86f9c --- /dev/null +++ b/exec/Profile/Komponist Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Komponist" verwenden +<%tag> \ No newline at end of file diff --git a/exec/Profile/Nummer+Titel Tag.txt b/exec/Profile/Nummer+Titel Tag.txt new file mode 100755 index 0000000..442ab62 --- /dev/null +++ b/exec/Profile/Nummer+Titel Tag.txt @@ -0,0 +1,6 @@ +#Beispiel: +#Dateiname: "1 01-BspDatei.m4a" +#Titel Tag: "BspTitel" +#Kapitelnummer im Hörbuch: "3" +#wird zu "003 - BspTitel" +<%number> - <%tag> \ No newline at end of file diff --git a/exec/Profile/Nummerierung.txt b/exec/Profile/Nummerierung.txt new file mode 100755 index 0000000..a79950a --- /dev/null +++ b/exec/Profile/Nummerierung.txt @@ -0,0 +1,2 @@ +#Kapitel 001, Kapitel 002, ... +Kapitel <%number> \ No newline at end of file diff --git a/exec/Profile/Titel Tag.txt b/exec/Profile/Titel Tag.txt new file mode 100755 index 0000000..a0a2226 --- /dev/null +++ b/exec/Profile/Titel Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Titel" verwenden +<%tag> \ No newline at end of file diff --git a/exec/Profile/Tracknummer Tag.txt b/exec/Profile/Tracknummer Tag.txt new file mode 100755 index 0000000..39dcaa0 --- /dev/null +++ b/exec/Profile/Tracknummer Tag.txt @@ -0,0 +1,2 @@ +#iTunes Tag "Tracknummer" verwenden +<%tag> \ No newline at end of file diff --git a/exec/Profile/iTunes Standard.txt b/exec/Profile/iTunes Standard.txt new file mode 100755 index 0000000..3a5bbf8 --- /dev/null +++ b/exec/Profile/iTunes Standard.txt @@ -0,0 +1,4 @@ +#Beispiel: +#Dateiname: "01 BspDatei.m4a" +#wird zu "BspDatei" +<%advancedFileName> \ No newline at end of file diff --git a/exec/Profile/iTunes mit Bindestrich.txt b/exec/Profile/iTunes mit Bindestrich.txt new file mode 100755 index 0000000..ace245e --- /dev/null +++ b/exec/Profile/iTunes mit Bindestrich.txt @@ -0,0 +1,4 @@ +#Beispiel: +#Dateiname: "01 - BspDatei.m4a" +#wird zu "BspDatei" +<%advancedFileName> \ No newline at end of file diff --git a/exec/Readme/Image.png b/exec/Readme/Image.png new file mode 100755 index 0000000..fa8ddd0 Binary files /dev/null and b/exec/Readme/Image.png differ diff --git a/exec/Readme/Profile.html b/exec/Readme/Profile.html new file mode 100755 index 0000000..baeaa11 --- /dev/null +++ b/exec/Readme/Profile.html @@ -0,0 +1,21 @@ + + + Profile erstellen + + +

Kapitelprofile

+ Kapitelprofile sind Textdateien. Im Prinzip wird der Text darin genauso in jedes Kapitel als Name eingesetzt, allerdings besteht die Möglichkeit variable Textblöcke einzusetzten. + Diese haben folgende Formatierung: <%Name> bzw. <%Name<Parametername='Wert' Parameter2='Wert2'>>

+ Alle Zeilen vor dem eigentlichen Profil müssen mit "#" anfangen und werden als Information bei der Kapitelprofil Auswahl angezeigt. Die erste Zeile, die nicht mit "#" beginnt, ist das Profil. Weitere Zeilen werden nicht übernommen + Mögliche Blöcke: +

    +
  • <%filePath> - Dateipfad des Kapitels
  • +
  • <%fileName<showExtention='true|false'>> - Der Dateiname mit oder ohne Endung
  • +
  • <%number<formatted='true|false'>> - Tracknummer im Hörbuch. Wenn formatted='true', dann werden die Nummern formatiert: 001, 002...
  • +
  • <%tag<id='title|album|artist|album_artist|track|composer'>> - Ein Tag aus der Datei (title: Titel, album: Albumname, artist: Interpret, album_artist: Albuminterpret, track: Tracknummer, composer: Komponist)
  • +
  • <%advancedFileName<sepText='' index=''>> - Ein Teil des Dateinamens. Die Teile werden durch sepText getrennt und der benutzte Teil im index angegebn. Wenn der index mit "#" endet werden alle Teile ab dort übernommen
  • +
+ + Im Ordner Profile finden Sie fertige Profile. + + \ No newline at end of file diff --git a/exec/Readme/Readme+Guide.html b/exec/Readme/Readme+Guide.html new file mode 100755 index 0000000..f6a8b19 --- /dev/null +++ b/exec/Readme/Readme+Guide.html @@ -0,0 +1,68 @@ + + + + Audiobook Maker + + + Bitte komplett lesen! +

Readme

+

Installation

+ Wichtig: Dieses Programm ist nur auf Windows-Betriebssystemen vollständig nutzbar.
+ Um den Audiobook Maker benuzen zu können, muss der Slideshow Assembler von JR Learns Media installiert sein. Um diesen zu installieren führen Sie die ssa_setup105a.exe mit einem Doppelklick aus und folgen Sie den Anweisungen. + Es ist wichtig, dass der Slideshow Assembler in der PATH Umgebungsvariable eingetragen wurde. Überprüfen Sie dies, indem Sie zu den Umgebungsvariablen navigieren (Systemsteuerung --> System --> Erweitert --> Umgebungsvariablen) und bei + der PATH Variable auf bearbeiten klicken. Suchen Sie in dem unteren Textfeld nach Dem Verzeichnis, in das Sie den Slideshow Assembler installiert haben(z.B. C:\Programme\Slideshow Assembler\). Wenn dieser Eintrag nicht vorhanden ist, fügen + Sie am Ende des Variablenwertes ";C:\Programme\Slideshow Assambler\"(bzw. Das Verzeichnis, in welches der Slideshow Assambler installiert wurde) ohne Anführungszeichen hinzu.
+ Nach der Installation müssen Sie ihren Computer neu starten.

+ + Da der Audiobook Maker Java benutzt müssen Sie Java installieren(Das JRE)

+ + Um den Audiobook Maker zu installieren führen Sie die Audiobook Maker Installationsdatei aus.

+ + Getestet auf Windows XP Professional 32bit mit und Java 7

+ +

Guide

+ Der Guide gibt ein Beispiel, wie ein Hörbuch erstellt werden kann. Bei vielen Schritten ist Drag-and-Drop unterstützt. Mit [] gekennzeichnete Schritte sind optional. + + Image.png + +
    +
  1. Dateien auswählen (3) (Es werden Alle Dateien in ausgewählten Ordnern und Unterordnern hinzugefügt)
  2. +
  3. [Die Kapitel automatisch umbenennen (-->Kapitelprofile) oder sortieren lassen (2)]
  4. +
  5. [Die Kapitel manuell sortieren (4) / manuell umbenennen (5) (Wird automatisch übernommen)]
  6. +
  7. [Eine Coverdatei für das Hörbuch angeben (7)]
  8. +
  9. Den Ordner für Die Dateien auswählen (7)
  10. +
  11. Angeben, ob die ausgewählten Dateien (1) in den Zielordner (7) kopiert oder verschoben werden sollen
  12. +
  13. [Tags für das Hörbuch angeben (9) (Es kann sein, dass die Tags nicht übernommen werden)]
  14. +
  15. Einen Namen für das Hörbuch auswählen und die .POD Datei erstellen. Im Anschluss daran kann das Hörbuch erstellt werden
  16. +
+

+ +

Geplantes

+
    +
  • Automatisches Konvertieren vom anderen Formaten
  • +
  • Fehler von SSA abfangen
  • +
  • SSA Ausgabe anzeigen
  • +
+ +

Bekannte Bugs

+
    +
  • Wenn bei SSA ein Fehler auftritt, wird trotzdem der Dialog "Prozess erfolgreich abgeschlossen" angezeigt
  • +
+ +

Version 3

+
    +
  • Möglichkeit aus einer langen Datei ein Hörbuch zu erstellen
  • +
  • Dateiunabhängige Zeiten
  • +
+ + +

Links

+ + + diff --git a/exec/Start.bat b/exec/Start.bat new file mode 100755 index 0000000..0ca711a --- /dev/null +++ b/exec/Start.bat @@ -0,0 +1 @@ +@Java -jar "Audiobook Maker.jar" \ No newline at end of file diff --git a/exec/audiobook_icon.ico b/exec/audiobook_icon.ico new file mode 100755 index 0000000..0540246 Binary files /dev/null and b/exec/audiobook_icon.ico differ diff --git a/exec/audiobook_icon.png b/exec/audiobook_icon.png new file mode 100755 index 0000000..5a1289a Binary files /dev/null and b/exec/audiobook_icon.png differ diff --git a/exec/changelog.rtf b/exec/changelog.rtf new file mode 100755 index 0000000..86b85df --- /dev/null +++ b/exec/changelog.rtf @@ -0,0 +1,66 @@ +{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f36\froman\fcharset238\fprq2 Times New Roman CE;} +{\f37\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f39\froman\fcharset161\fprq2 Times New Roman Greek;}{\f40\froman\fcharset162\fprq2 Times New Roman Tur;}{\f41\froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\f42\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f43\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f44\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255; +\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0; +\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden +Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}}{\*\rsidtbl \rsid2246780}{\*\generator Microsoft Word 10.0.6866;}{\info +{\title Audiobook Maker - Changelog}{\author Kim}{\operator Kim}{\creatim\yr2011\mo9\dy23\hr22\min51}{\revtim\yr2011\mo9\dy23\hr22\min53}{\version1}{\edmins2}{\nofpages2}{\nofwords350}{\nofchars2000}{\*\company Deutsches Elektronen-Synchrotron DESY} +{\nofcharsws2346}{\vern16393}{\*\password 00000000}}{\*\xmlnstbl }\paperw12240\paperh15840\margl1800\margr1800\margt1440\margb1440\gutter0 +\widowctrl\ftnbj\aenddoc\grfdocevents0\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot2246780 \fet0 +{\*\wgrffmtfilter 013f}\sectd \linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3 +\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} +{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2246780 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\fs28\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 +Audiobook Maker - Changelog +\par }{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 +\par }{\b\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 Version 2.0 Beta +\par }{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 -Das Layout wurde komplett \'dcberarbeitet +\par -Der Audiobook Maker kopiert nun selbstst\'e4ndig die Dateien in einen Ordner +\par -Einzelne Kapitel k\'f6nnen nun umbenannt werden +\par +\par }{\b\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 Version 2.1 Beta +\par }{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 -Kapitelprofile k\'f6nnen nun angewendet werden um die Kapitel gleichzeitig umzubenennen +\par -Die Menuleiste wurde hinzugef\'fcgt +\par -Der "H\'f6rbuch erstellen" Button ist nun nur verf\'fcgbar, wenn im Zielordner eine .POD Datei mit eingegebenem Namen vorhanden ist +\par +\par }{\b\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 Version 2.2 Beta +\par }{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 -Ein integrierter Editor f\'fcr Kapitelprofile wurde hinzugef\'fcgt +\par +\par }{\b\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 Version 2.3 Beta +\par }{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 -Die Geschwindigkeit zum Kopieren der Dateien wurde stark erh\'f6ht +\par -Die Tags des H\'f6rbuches k\'f6nnen bearbeitet werden +\par -Das Cover muss nicht mehr angegeben werden +\par +\par }{\b\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 Version 2.4 Beta +\par }{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 -Die Kapitel k\'f6nnen nun automatisch sortiert werden +\par -Beim Hinzuf\'fcgen von Dateien wird der zuletzt aufgerufene Ordner beim folgenden Mal als Startordner benutzt +\par -Beim Hinzuf\'fcgen von Dateien k\'f6nnen nun sowohl Dateien als auch Ordner ausgew\'e4hlt werden +\par -Wenn ein Verzeichnis hinzugef\'fcgt wird, werden nun alle passenden Dateien im Ordner und allen Unterordnern hinzugef\'fcgt +\par -Es besteht die M\'f6glichkeit, einige der Tags aus den Kapiteldateien auszulesen und als Kapitelnamen zu verwenden +\par +\par }{\b\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 Version 2.5 Beta +\par }{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 -Beim manuellen umbenennen der Kapitel muss nun nicht mehr best\'e4tigt werden +\par -Beim Anwenden eines Kapitelprofils wurde der Startordner ge\'e4ndert +\par -Beim Anwenden eines Kapitelprofils werden nun alle Kapitel ver\'e4ndert, wenn keins ausgew\'e4hlt ist +\par +\par }{\b\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 Version 2.6 Beta +\par }{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 -Vorschau f\'fcr Kapitelprofile hinzugef\'fcgt +\par -Kapitelprofil Editor hat einige neue Funktionen +\par -Kapitelprofil Editor wurde verbessert +\par -Dateien k\'f6nnen nun automatisch nach Erstellen des H\'f6rbuchs gel\'f6scht werden +\par -Einige neue Profile wurden hinzugef\'fcgt +\par -Drag-and-Drop Unterst\'fctzung wurde hinzugef\'fcgt +\par -Sonderzeichen werden aus Dateinamen entfernt, da SSA diese Zeichen nicht unterst\'fctzt +\par +\par }{\b\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 Version 2.7 Beta +\par }{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 -POD Dateien k\'f6nnen jetzt geladen werden +\par -Es wir jetzt beim Verlassen nach dem Erstellen einer POD Datei gefragt +\par -Dateien, die nur aus Sonderzeichen bestehen, werden nun nicht mehr gel\'f6scht +\par -Die Metadata in der POD Datei wird nun nur in die Datei geschrieben, wenn mindestens ein Eintrag genutzt wird +\par +\par }{\b\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 Version 2.8 Beta +\par }{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 -Es k\'f6nnen nun mehrere Dateien in der Liste gleichzeitig verschoben werden +\par -Drag-and-Drop Unterst\'fctzung f\'fcr POD Dateien hinzugef\'fcgt}{\lang1031\langfe1033\langnp1031\insrsid2246780\charrsid2246780 +\par }} \ No newline at end of file diff --git a/exec/changelog.txt b/exec/changelog.txt new file mode 100755 index 0000000..7c9e4ac --- /dev/null +++ b/exec/changelog.txt @@ -0,0 +1,50 @@ +Audiobook Maker - Changelog + +Version 2.0 Beta +-Das Layout wurde komplett Überarbeitet +-Der Audiobook Maker kopiert nun selbstständig die Dateien in einen Ordner +-Einzelne Kapitel können nun umbenannt werden + +Version 2.1 Beta +-Kapitelprofile können nun angewendet werden um die Kapitel gleichzeitig umzubenennen +-Die Menuleiste wurde hinzugefügt +-Der "Hörbuch erstellen" Button ist nun nur verfügbar, wenn im Zielordner eine .POD Datei mit eingegebenem Namen vorhanden ist + +Version 2.2 Beta +-Ein integrierter Editor für Kapitelprofile wurde hinzugefügt + +Version 2.3 Beta +-Die Geschwindigkeit zum Kopieren der Dateien wurde stark erhöht +-Die Tags des Hörbuches können bearbeitet werden +-Das Cover muss nicht mehr angegeben werden + +Version 2.4 Beta +-Die Kapitel können nun automatisch sortiert werden +-Beim Hinzufügen von Dateien wird der zuletzt aufgerufene Ordner beim folgenden Mal als Startordner benutzt +-Beim Hinzufügen von Dateien können nun sowohl Dateien als auch Ordner ausgewählt werden +-Wenn ein Verzeichnis hinzugefügt wird, werden nun alle passenden Dateien im Ordner und allen Unterordnern hinzugefügt +-Es besteht die Möglichkeit, einige der Tags aus den Kapiteldateien auszulesen und als Kapitelnamen zu verwenden + +Version 2.5 Beta +-Beim manuellen umbenennen der Kapitel muss nun nicht mehr bestätigt werden +-Beim Anwenden eines Kapitelprofils wurde der Startordner geändert +-Beim Anwenden eines Kapitelprofils werden nun alle Kapitel verändert, wenn keins ausgewählt ist + +Version 2.6 Beta +-Vorschau für Kapitelprofile hinzugefügt +-Kapitelprofil Editor hat einige neue Funktionen +-Kapitelprofil Editor wurde verbessert +-Dateien können nun automatisch nach Erstellen des Hörbuchs gelöscht werden +-Einige neue Profile wurden hinzugefügt +-Drag-and-Drop Unterstützung wurde hinzugefügt +-Sonderzeichen werden aus Dateinamen entfernt, da SSA diese Zeichen nicht unterstützt + +Version 2.7 Beta +-POD Dateien können jetzt geladen werden +-Es wir jetzt beim Verlassen nach dem Erstellen einer POD Datei gefragt +-Dateien, die nur aus Sonderzeichen bestehen, werden nun nicht mehr gelöscht +-Die Metadata in der POD Datei wird nun nur in die Datei geschrieben, wenn mindestens ein Eintrag genutzt wird + +Version 2.8 Beta +-Es können nun mehrere Dateien in der Liste gleichzeitig verschoben werden +-Drag-and-Drop Unterstützung für POD Dateien hinzugefügt \ No newline at end of file diff --git a/exec/lib/jaudiotagger-2.0.1.jar b/exec/lib/jaudiotagger-2.0.1.jar new file mode 100755 index 0000000..20c82a5 Binary files /dev/null and b/exec/lib/jaudiotagger-2.0.1.jar differ diff --git a/exec/lib/myLibrary.jar b/exec/lib/myLibrary.jar new file mode 100755 index 0000000..3194502 Binary files /dev/null and b/exec/lib/myLibrary.jar differ diff --git a/exec/lib/swing-layout-1.0.4.jar b/exec/lib/swing-layout-1.0.4.jar new file mode 100755 index 0000000..46fe3a2 Binary files /dev/null and b/exec/lib/swing-layout-1.0.4.jar differ diff --git a/src/Data/SSA.exe.jpg b/src/Data/SSA.exe.jpg deleted file mode 100755 index 9759019..0000000 Binary files a/src/Data/SSA.exe.jpg and /dev/null differ diff --git a/src/Data/Set_Win.jpg b/src/Data/Set_Win.jpg deleted file mode 100755 index ff24a58..0000000 Binary files a/src/Data/Set_Win.jpg and /dev/null differ diff --git a/src/Data/Settings.jpg b/src/Data/Settings.jpg deleted file mode 100755 index af004c3..0000000 Binary files a/src/Data/Settings.jpg and /dev/null differ diff --git a/src/Data/Tab_Adv.jpg b/src/Data/Tab_Adv.jpg deleted file mode 100755 index a0f6c2f..0000000 Binary files a/src/Data/Tab_Adv.jpg and /dev/null differ diff --git a/src/Data/Vollidiot.txt b/src/Data/Vollidiot.txt deleted file mode 100755 index fa6bbd2..0000000 --- a/src/Data/Vollidiot.txt +++ /dev/null @@ -1,170 +0,0 @@ -[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 deleted file mode 100755 index c8ef879..0000000 Binary files a/src/Data/change.jpg and /dev/null differ diff --git a/src/Data/drag-and-drop.jpg b/src/Data/drag-and-drop.jpg deleted file mode 100755 index 9282339..0000000 Binary files a/src/Data/drag-and-drop.jpg and /dev/null differ diff --git a/src/Data/iTunes Data.html b/src/Data/iTunes Data.html deleted file mode 100755 index 5dc220d..0000000 --- a/src/Data/iTunes Data.html +++ /dev/null @@ -1,19 +0,0 @@ -

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 deleted file mode 100755 index 2d189ca..0000000 Binary files a/src/Data/import.jpg and /dev/null differ diff --git a/src/Data/importSettings.jpg b/src/Data/importSettings.jpg deleted file mode 100755 index 197ae3b..0000000 Binary files a/src/Data/importSettings.jpg and /dev/null differ diff --git a/src/Data/importSettings2.jpg b/src/Data/importSettings2.jpg deleted file mode 100755 index 439f745..0000000 Binary files a/src/Data/importSettings2.jpg and /dev/null differ diff --git a/src/Data/list.jpg b/src/Data/list.jpg deleted file mode 100755 index ce3d3d7..0000000 Binary files a/src/Data/list.jpg and /dev/null differ diff --git a/src/Data/main.jpg b/src/Data/main.jpg deleted file mode 100755 index bdda992..0000000 Binary files a/src/Data/main.jpg and /dev/null differ diff --git a/src/Data/names.jpg b/src/Data/names.jpg deleted file mode 100755 index db55b82..0000000 Binary files a/src/Data/names.jpg and /dev/null differ diff --git a/src/Data/output.jpg b/src/Data/output.jpg deleted file mode 100755 index 27569f3..0000000 Binary files a/src/Data/output.jpg and /dev/null differ diff --git a/src/Data/pod.jpg b/src/Data/pod.jpg deleted file mode 100755 index b38aae9..0000000 Binary files a/src/Data/pod.jpg and /dev/null differ diff --git a/src/Data/search.jpg b/src/Data/search.jpg deleted file mode 100755 index 58a7d40..0000000 Binary files a/src/Data/search.jpg and /dev/null differ diff --git a/src/Data/source.jpg b/src/Data/source.jpg deleted file mode 100755 index 144e01a..0000000 Binary files a/src/Data/source.jpg and /dev/null differ diff --git a/src/Dating/Time.java b/src/Dating/Time.java deleted file mode 100755 index bb786fd..0000000 --- a/src/Dating/Time.java +++ /dev/null @@ -1,106 +0,0 @@ -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 deleted file mode 100755 index f3b706c..0000000 --- a/src/Exceptions/EndingException.java +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100755 index 30cbf64..0000000 --- a/src/Exceptions/FolderException.java +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100755 index dd61b2f..0000000 --- a/src/Exceptions/NoFilesSelectedException.java +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100755 index f3f74a5..0000000 --- a/src/Exceptions/NoFolderSelectedException.java +++ /dev/null @@ -1,12 +0,0 @@ -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 deleted file mode 100755 index 5d319f9..0000000 --- a/src/Exceptions/NotSelectedException.java +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100755 index 41901b8..0000000 --- a/src/LAF/LAF.java +++ /dev/null @@ -1,81 +0,0 @@ -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 deleted file mode 100755 index 0ef6213..0000000 --- a/src/audiobook.java +++ /dev/null @@ -1,356 +0,0 @@ -//~--- 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/audiobook/Book.java b/src/audiobook/Book.java new file mode 100755 index 0000000..fdd01ca --- /dev/null +++ b/src/audiobook/Book.java @@ -0,0 +1,131 @@ + +/* +* To change this template, choose Tools | Templates +* and open the template in the editor. + */ +package audiobook; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class represents an audiobook + * @author Kim + */ +public class Book extends ArrayList { + private String album; + private String artist; + private File imageFile; + private String name; + private File targetFolder; + + /** + * Creates a new empty audiobook + */ + public Book() { + name = ""; + album = ""; + artist = ""; + } + + /** + * Creates a new Audiobook with a specified image File + * @param imageFile + */ + public Book(File imageFile) { + setImageFile(imageFile); + } + + /** + * Returns a File containing the cover of this audiobook. + * Returns null if no cover was selected. + */ + public File getImageFile() { + return imageFile; + } + + /** + * Sets the image of this audiobook. Images have to be in jpeg or png format + * @param imageFile a file containing an Image + * @throws IllegalArgumentException If the image is not a jpg, jpeg or png Image + */ + public void setImageFile(File imageFile) throws IllegalArgumentException { + if (!Files.FileActions.hasExtention(imageFile, ".jpg", ".jpeg", ".png")) { + throw new IllegalArgumentException("Illegal Image format"); + } + + this.imageFile = imageFile; + } + + /** + * Returns the folder the audiobook is to be stored in. + * @return a Folder + */ + public File getTargetFolder() { + return targetFolder; + } + + /** + * Sets the folder the audiobook is to be stored in + * @param folder a Folder + */ + public void setTargetFolder(File folder) throws IllegalArgumentException { + if (!folder.isDirectory()) { + throw new IllegalArgumentException("Not a Folder"); + } + + this.targetFolder = folder; + } + + /** + * Sets the album-tag information + * @param album a String + */ + public void setAlbum(String album) { + this.album = album; + } + + /** + * Sets the artist-tag information + * @param artist aString + */ + public void setArtist(String artist) { + this.artist = artist; + } + + /** + * Sets the name of the audiobook + * @param name a String + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the album-tag information + */ + public String getAlbum() { + return album; + } + + /** + * Returns the artist-tag information + */ + public String getArtist() { + return artist; + } + + /** + * Returns the name of this audiobook + */ + public String getName() { + return name; + } +} + + +//~ Formatted by Jindent --- http://www.jindent.com diff --git a/src/audiobook/Chapter.java b/src/audiobook/Chapter.java new file mode 100755 index 0000000..d78e7a0 --- /dev/null +++ b/src/audiobook/Chapter.java @@ -0,0 +1,145 @@ +package audiobook; + +//~--- non-JDK imports -------------------------------------------------------- + +/* +* To change this template, choose Tools | Templates +* and open the template in the editor. + */ +import Dating.Time; + +import org.jaudiotagger.audio.AudioFile; +import org.jaudiotagger.audio.AudioFileIO; +import org.jaudiotagger.audio.exceptions.CannotReadException; +import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; +import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; +import org.jaudiotagger.tag.TagException; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; +import java.io.IOException; + +import javax.swing.JOptionPane; + +/** + * This class represents a chapter in a audiobook + * @author Kim + */ +public class Chapter implements Comparable { + private File file; + private Dating.Time time; + private String title; + + /** + * Creates a new empty Chapter + */ + public Chapter() {} + + /** + * Creates a new Chapter with the specified Values + * @param time the Duration of this track + * @param title the name of this chapter + * @param file the audiofile this chapter represents + */ + public Chapter(Time time, String title, File file) { + this.time = time; + this.title = title; + this.file = file; + } + + @Override + public String toString() { + return title; + } + + /** + * Returns the audiofile of this chapter + */ + public File getFile() { + return file; + } + + /** + * Returns a Time Object containing the information about the duration of this chapter + */ + public Time getTime() { + return time; + } + + /** + * Returns the title of this chapter + */ + public String getTitle() { + return title; + } + + /** + * Sets the audiofile of this chapter + * @param file a file. + * @param calc wether the time should be calculated after setting the file. + * @throws IllegalArgumentException If the file is not a m4a file. + * + * @see #calculateTime() Chapter.calculateTime() + * @see File + */ + public void setFile(File file, boolean calc) throws IllegalArgumentException, CannotReadException, IOException, TagException, ReadOnlyFileException, InvalidAudioFrameException { + if(!file.getName().endsWith(".m4a")){ + throw new IllegalArgumentException("Not a m4a File"); + } + this.file = file; + if(calc){ + calculateTime(); + } + } + + /** + * Sets the audiofile of this chapter. The Time will NOT be calculated automatically + * @param f a File + * @throws IllegalArgumentException If the file is not a m4a file. + * + * @see File + */ + public void setFile(File f) throws IllegalArgumentException{ + try{ + setFile(f, false); + } catch(CannotReadException | IOException | TagException | ReadOnlyFileException | InvalidAudioFrameException ex){} + } + + /** + * Sets the duration of this chapter. Should be calculated using {@link calculateTime()}. + * + * @see #calculateTime() Chapter.calculateTime(); + * @see Time + */ + public void setTime(Time time) { + this.time = time; + } + + /** + * Sets the title of this chapter + * @param title + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * Automatically calculates the audiofile's Duration and sets it for this chapter + * @see org.jaudiotagger.audio.AudioFile + * @see org.jaudiotagger.audio.AudioFileIO#read(java.io.File f); + */ + public void calculateTime() + throws CannotReadException, IOException, TagException, ReadOnlyFileException, InvalidAudioFrameException { + AudioFile aFile = AudioFileIO.read(file); + setTime(new Time(0, 0, aFile.getAudioHeader().getTrackLength())); + } + + @Override + public int compareTo(Chapter o) { + return getTitle().compareTo(o.getTitle()); + } +} + + +//~ Formatted by Jindent --- http://www.jindent.com diff --git a/src/audiobook/ChapterProfileCreator.form b/src/audiobook/ChapterProfileCreator.form new file mode 100755 index 0000000..9861638 --- /dev/null +++ b/src/audiobook/ChapterProfileCreator.form @@ -0,0 +1,212 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/audiobook/ChapterProfileCreator.java b/src/audiobook/ChapterProfileCreator.java new file mode 100755 index 0000000..ce8db84 --- /dev/null +++ b/src/audiobook/ChapterProfileCreator.java @@ -0,0 +1,523 @@ +package audiobook; + +import java.awt.event.ActionEvent; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.StringReader; +import javax.swing.AbstractAction; +import javax.swing.JFileChooser; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPopupMenu; +import javax.swing.JTextArea; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import other.Strings.QuoteProcessor; +import swing.Beans.MultipleInputPane; + +/** + * A class providing a JFrame to display a simple {@link javax.swing.JTextArea} to edit text. + * @author Kim + * @see JTextArea + * @see NumberQuoteProcessor + * @see M4aTagQuoteProcessor + * @see FileNameQuoteProcessor + * @see AdvancedFileNameQuoteProcessor + * @see FilepathQuoteProcessor + * @see QuoteProcessor + */ +public class ChapterProfileCreator extends javax.swing.JFrame { + + /** Creates new form ChapterProfileCreator */ + public ChapterProfileCreator() { + initComponents(); + textArea.getDocument().addDocumentListener(new DocumentListener() { + + @Override + public void insertUpdate(DocumentEvent e) { + if ((!textArea.getText().equals(lastText))) { + isSaved = false; + } + if (textArea.getText() == null || textArea.getText() == "") { + isSaved = true; + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + if (!textArea.getText().equals(lastText)) { + isSaved = false; + } + if (textArea.getText() == null || textArea.getText() == "") { + isSaved = true; + } + } + + @Override + public void changedUpdate(DocumentEvent e) { + if (!textArea.getText().equals(lastText)) { + isSaved = false; + } + if (textArea.getText() == null || textArea.getText() == "") { + isSaved = true; + } + } + }); + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + addPanel = new javax.swing.JPanel(); + NumberButton = new javax.swing.JButton(); + FileNameButton = new javax.swing.JButton(); + FilePathButton = new javax.swing.JButton(); + TagButton = new javax.swing.JButton(); + CommentButton = new javax.swing.JButton(); + jScrollPane1 = new javax.swing.JScrollPane(); + textArea = new javax.swing.JTextArea(); + jMenuBar1 = new javax.swing.JMenuBar(); + jMenu1 = new javax.swing.JMenu(); + UseNowMenuItem = new javax.swing.JMenuItem(); + jSeparator2 = new javax.swing.JPopupMenu.Separator(); + SaveMenuItem = new javax.swing.JMenuItem(); + OpenMenuItem = new javax.swing.JMenuItem(); + SaveAsMenuItem = new javax.swing.JMenuItem(); + jSeparator1 = new javax.swing.JPopupMenu.Separator(); + CloseMenuItem = new javax.swing.JMenuItem(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); + setTitle("Kapitelprofil Editor"); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + }); + + addPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Hinzufügen")); + + NumberButton.setText("Kapitelnummer"); + NumberButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NumberButtonActionPerformed(evt); + } + }); + + FileNameButton.setText("Dateinamen"); + FileNameButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + FileNameButtonActionPerformed(evt); + } + }); + + FilePathButton.setText("Dateipfad"); + FilePathButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + FilePathButtonActionPerformed(evt); + } + }); + + TagButton.setText("Tag"); + TagButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + TagButtonActionPerformed(evt); + } + }); + + CommentButton.setText("Vorschau Kommentar"); + CommentButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CommentButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout addPanelLayout = new javax.swing.GroupLayout(addPanel); + addPanel.setLayout(addPanelLayout); + addPanelLayout.setHorizontalGroup( + addPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(addPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(addPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(NumberButton, javax.swing.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE) + .addComponent(FileNameButton, javax.swing.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE) + .addComponent(FilePathButton, javax.swing.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE) + .addComponent(TagButton, javax.swing.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE) + .addComponent(CommentButton, javax.swing.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE))) + ); + addPanelLayout.setVerticalGroup( + addPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(addPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(NumberButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(FileNameButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(FilePathButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(TagButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(CommentButton) + .addGap(53, 53, 53)) + ); + + textArea.setColumns(20); + textArea.setRows(5); + textArea.setDragEnabled(true); + jScrollPane1.setViewportView(textArea); + + jMenu1.setText("Datei"); + + UseNowMenuItem.setText("In Hörbuch übernehmen"); + UseNowMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + UseNowMenuItemActionPerformed(evt); + } + }); + jMenu1.add(UseNowMenuItem); + jMenu1.add(jSeparator2); + + SaveMenuItem.setText("Speichern"); + SaveMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SaveMenuItemActionPerformed(evt); + } + }); + jMenu1.add(SaveMenuItem); + + OpenMenuItem.setText("Öffnen"); + OpenMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + OpenMenuItemActionPerformed(evt); + } + }); + jMenu1.add(OpenMenuItem); + + SaveAsMenuItem.setText("Speichern unter..."); + SaveAsMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SaveAsMenuItemActionPerformed(evt); + } + }); + jMenu1.add(SaveAsMenuItem); + jMenu1.add(jSeparator1); + + CloseMenuItem.setText("Schließen"); + CloseMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CloseMenuItemActionPerformed(evt); + } + }); + jMenu1.add(CloseMenuItem); + + jMenuBar1.add(jMenu1); + + setJMenuBar(jMenuBar1); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(addPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 232, Short.MAX_VALUE) + .addComponent(addPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 232, Short.MAX_VALUE)) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + /** + * Adds text to the TextArea to use the chapter number + * @param evt Auto generated event; Not used + */ +private void NumberButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NumberButtonActionPerformed + JPopupMenu menu = new JPopupMenu(); + JMenuItem normal = new JMenuItem(new AbstractAction("Normal") { + + @Override + public void actionPerformed(ActionEvent e) { + textArea.append("<%number>"); + } + }); + JMenuItem formatted = new JMenuItem(new AbstractAction("Formatiert") { + + @Override + public void actionPerformed(ActionEvent e) { + textArea.append("<%number>"); + } + }); + normal.setToolTipText("Kapitelnummer(1, 2, ...)"); + formatted.setToolTipText("Formatierte Kapitelnummer(001, 002, ...)"); + menu.add(normal); + menu.add(formatted); + menu.show(this, getMousePosition().x, getMousePosition().y); +}//GEN-LAST:event_NumberButtonActionPerformed + + /** + * Adds text to the TextArea to use the filepath + * @param evt Auto generated event; Not used + */ +private void FilePathButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_FilePathButtonActionPerformed + textArea.append("<%filepath>"); +}//GEN-LAST:event_FilePathButtonActionPerformed + + /** + * Adds text to the TextArea to use the Filename + * @param evt Auto generated event; Not used + */ +private void FileNameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_FileNameButtonActionPerformed + JPopupMenu menu = new JPopupMenu(); + JMenuItem withExt = new JMenuItem(new AbstractAction("Mit Endung") { + + @Override + public void actionPerformed(ActionEvent e) { + textArea.append("<%fileName>"); + } + }); + JMenuItem withoutExt = new JMenuItem(new AbstractAction("Ohne Endung") { + + @Override + public void actionPerformed(ActionEvent e) { + textArea.append("<%fileName>"); + } + }); + JMenuItem advanced = new JMenuItem(new AbstractAction("Teil des Dateinamens") { + + @Override + public void actionPerformed(ActionEvent e) { + MultipleInputPane pane = new MultipleInputPane("Trennungstext", "Index"); + pane.setToolTipText(0, "Bsp: Datei: \"01-Test.m4a\" - Trennungstext: \"-\""); + pane.setToolTipText(1, "Der Index zwischen den Trennungstexten im Dateinamen. Muss eine Zahl sein(kann mit '#' enden; dann werden alle Teile ab dem Index übernommen)!"); + if (pane.showDialog(null, "Eingabe", JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION) { + textArea.append("<%advancedFileName>"); + } + } + }); + menu.add(withExt); + menu.add(withoutExt); + menu.add(advanced); + menu.show(this, getMousePosition().x, getMousePosition().y); +}//GEN-LAST:event_FileNameButtonActionPerformed + + /** + * Checks if the file was saved and exits + * @param evt Auto generated event; Not used + */ +private void CloseMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CloseMenuItemActionPerformed + if (!isSaved) { + if (JOptionPane.showConfirmDialog(this, "Die Datei wurde nicht gespeichert. Fenster trotzdem schließen?", "Schließen?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION) { + return; + } + } + dispose(); +}//GEN-LAST:event_CloseMenuItemActionPerformed + + /** + * Opens a JFileChooser Dialog to let the user save the text + * @param evt + */ +private void SaveAsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveAsMenuItemActionPerformed + File userDir = new File(System.getProperty("user.dir")); + File profileFolder = new File(userDir.getPath() + "/Profile"); + JFileChooser chooser = new JFileChooser(profileFolder.exists() ? profileFolder : userDir); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + chooser.setMultiSelectionEnabled(false); + + if (chooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { + if (chooser.getSelectedFile().exists() && JOptionPane.showConfirmDialog(this, "Die Datei " + chooser.getSelectedFile().getPath() + " existiert bereits. Überschreiben?", "Überschreiben?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION) { + return; + } + try { + saveFile = chooser.getSelectedFile(); + lastText = textArea.getText(); + FileWriter FWriter = new FileWriter(saveFile); + BufferedWriter writer = new BufferedWriter(FWriter); + + writer.write(textArea.getText()); + writer.close(); + FWriter.close(); + isSaved = true; + } catch (IOException ex) { + JOptionPane.showMessageDialog(this, "Beim Speichern ist ein Fehler aufgetreten.", "Fehler", JOptionPane.ERROR_MESSAGE); + } + } +}//GEN-LAST:event_SaveAsMenuItemActionPerformed + + /** + * Automatically saves the file at the last given file location. If there is no last location this method calls {@link #SaveAsMenuItemActionPerformed(java.awt.event.ActionEvent) SaveAsMenuItemActionPerformed()} + * @param evt Auto generated event; Not used + */ +private void SaveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveMenuItemActionPerformed + if (saveFile == null) { + SaveAsMenuItemActionPerformed(evt); + } else { + try { + lastText = textArea.getText(); + FileWriter FWriter = new FileWriter(saveFile); + BufferedWriter writer = new BufferedWriter(FWriter); + + writer.write(textArea.getText()); + writer.close(); + FWriter.close(); + isSaved = true; + } catch (IOException ex) { + JOptionPane.showMessageDialog(this, "Beim Speichern ist ein Fehler aufgetreten.", "Fehler", JOptionPane.ERROR_MESSAGE); + } + } +}//GEN-LAST:event_SaveMenuItemActionPerformed + + /** + * Checks if the file was saved and exits + * @param evt Auto generated event; Not used + */ +private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + CloseMenuItemActionPerformed(null); +}//GEN-LAST:event_formWindowClosing + + /** + * Adds text to the TextArea to use tags inside the files + * @param evt Auto generated event; Not used + */ +private void TagButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_TagButtonActionPerformed + JPopupMenu menu = new JPopupMenu(); + menu.add(new AbstractAction("Titel") { + + @Override + public void actionPerformed(ActionEvent e) { + textArea.append("<%tag>"); + } + }); + menu.add(new AbstractAction("Album") { + + @Override + public void actionPerformed(ActionEvent e) { + textArea.append("<%tag>"); + } + }); + menu.add(new AbstractAction("Interpret") { + + @Override + public void actionPerformed(ActionEvent e) { + textArea.append("<%tag>"); + } + }); + menu.add(new AbstractAction("Albumsinterpret") { + + @Override + public void actionPerformed(ActionEvent e) { + textArea.append("<%tag>"); + } + }); + menu.add(new AbstractAction("Tracknummer") { + + @Override + public void actionPerformed(ActionEvent e) { + textArea.append("<%tag>"); + } + }); + menu.add(new AbstractAction("Komponist") { + + @Override + public void actionPerformed(ActionEvent e) { + textArea.append("<%tag>"); + } + }); + menu.show(this, getMousePosition().x, getMousePosition().y); +}//GEN-LAST:event_TagButtonActionPerformed + + /** + * Adds text to the TextArea to use preview text + * @param evt Auto generated event; Not used + */ + private void CommentButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CommentButtonActionPerformed + textArea.insert("#\n", 0); + }//GEN-LAST:event_CommentButtonActionPerformed + + /** + * Lets the user use the typed profile right now in the active project + * @param evt Auto generated event; Not used + */ + private void UseNowMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UseNowMenuItemActionPerformed + try { + BufferedReader reader = new BufferedReader(new StringReader(textArea.getText())); + String profile = ""; + while ((profile = reader.readLine()).startsWith("#")) { + } + Main.window.useChapterProfile(profile); + } catch (IOException ex) { + ex.printStackTrace(); + } + }//GEN-LAST:event_UseNowMenuItemActionPerformed + + /** + * Lets the user choose a text file to display and edit + * @param evt + */ + private void OpenMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OpenMenuItemActionPerformed + if (!isSaved) { + if (JOptionPane.showConfirmDialog(this, "Die Datei wurde nicht gespeichert. Fortfahren?", "Öffnen?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION) { + return; + } + } + File userDir = new File(System.getProperty("user.dir")); + File profileFolder = new File(userDir.getPath() + "/Profile"); + JFileChooser chooser = new JFileChooser(profileFolder.exists() ? profileFolder : userDir); + chooser.setMultiSelectionEnabled(false); + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + try { + textArea.setText(""); + BufferedReader reader = new BufferedReader(new FileReader(chooser.getSelectedFile())); + String line = ""; + while ((line = reader.readLine()) != null) { + textArea.append((textArea.getText().length() < 1 ? "" : "\n") + line); + } + isSaved = true; + saveFile = chooser.getSelectedFile(); + lastText = textArea.getText(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + }//GEN-LAST:event_OpenMenuItemActionPerformed + + // + private boolean isSaved = false; + private File saveFile; + private String lastText; + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JMenuItem CloseMenuItem; + private javax.swing.JButton CommentButton; + private javax.swing.JButton FileNameButton; + private javax.swing.JButton FilePathButton; + private javax.swing.JButton NumberButton; + private javax.swing.JMenuItem OpenMenuItem; + private javax.swing.JMenuItem SaveAsMenuItem; + private javax.swing.JMenuItem SaveMenuItem; + private javax.swing.JButton TagButton; + private javax.swing.JMenuItem UseNowMenuItem; + private javax.swing.JPanel addPanel; + private javax.swing.JMenu jMenu1; + private javax.swing.JMenuBar jMenuBar1; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JPopupMenu.Separator jSeparator1; + private javax.swing.JPopupMenu.Separator jSeparator2; + private javax.swing.JTextArea textArea; + // End of variables declaration//GEN-END:variables + // +} diff --git a/src/audiobook/Main.java b/src/audiobook/Main.java new file mode 100755 index 0000000..9b3a4c0 --- /dev/null +++ b/src/audiobook/Main.java @@ -0,0 +1,107 @@ +package audiobook; + +//~--- non-JDK imports -------------------------------------------------------- + +/* +* To change this template, choose Tools | Templates +* and open the template in the editor. + */ +import Applications.Application; + +import java.awt.Desktop; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.net.URISyntaxException; +import swing.LAF.LAF; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; + +import java.io.IOException; +import java.net.URI; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JOptionPane; + +/** + * + * @author Kim + */ +public class Main extends Applications.Application { + + /** The book which is currently edited */ + public static Book currBook; + + /** Variable used as default directory in JFileChooser. Represents the last selected directory. */ + public static File lastDir; + + /** An Object representing the non-static methods of this class */ + public static Main mainObj; + + /** An Instance of {@link MainWindow} which provides methods to create an audiobook */ + public static MainWindow window; + + /** + * Main method called on start + */ + public static void main(String[] args) { + mainObj = new Main(); + lastDir = new File(System.getProperty("user.home")); + LAF.setLAF(LAF.SystemLAF); + mainObj.createAboutBox(new ImageIcon(Main.class.getResource("audiobook.png")).getImage(), + new String[] { "Version", + "Autor" }, new String[] { "2.8 Beta", "Kim" }); + + if (!System.getProperty("os.name").startsWith("Windows")) { + if (JOptionPane.showConfirmDialog( + null, + "Dieses Programm ist nur auf Windows Betriebssystemen vollständig nutzbar und wurde nicht auf anderen Systemen getestet.\n\n Möchten Sie das Programm beenden?", + "Warnung", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { + System.exit(1); + } + } + + if (!(Float.parseFloat(System.getProperty("java.specification.version")) >= 1.7)) { + JOptionPane.showMessageDialog(null, + "Dieses Programm benötigt Java Version 1.7 oder höher.\nBitte Laden Sie die Version von oracle.com", + "Fehler", JOptionPane.WARNING_MESSAGE); + try { + Desktop.getDesktop().browse(new URI("http://www.oracle.com/technetwork/java/javase/downloads/java-se-jre-7-download-432155.html")); + } catch (URISyntaxException | IOException ex) { + ex.printStackTrace(); + } + System.exit(1); + } + + currBook = new Book(); + window = new MainWindow(); + window.setLocation(Application.getScreenCenterFor(window)); + window.setVisible(true); + } + + @Override + public String getInfo() { + return "Ein Programm zum Erstellen von iTunes Hörbüchern"; + } + + public String getName() { + return "Audiobook Maker"; + } + + public void exit() { + int result = JOptionPane.showConfirmDialog(null, + "Achtung: Die Eingaben werden nicht gespeichert. Vorher noch eine POD Datei erstellen?", + "Beenden?", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); + + if (result == JOptionPane.NO_OPTION) { + super.exit(); + } else if (result == JOptionPane.YES_OPTION) { + window.createPODFile(); + super.exit(); + } + } +} + + +//~ Formatted by Jindent --- http://www.jindent.com diff --git a/src/audiobook/MainWindow.form b/src/audiobook/MainWindow.form new file mode 100755 index 0000000..6f62023 --- /dev/null +++ b/src/audiobook/MainWindow.form @@ -0,0 +1,572 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/audiobook/MainWindow.java b/src/audiobook/MainWindow.java new file mode 100755 index 0000000..6961efe --- /dev/null +++ b/src/audiobook/MainWindow.java @@ -0,0 +1,1668 @@ +package audiobook; + +import java.awt.dnd.DropTargetDropEvent; +import java.beans.PropertyChangeEvent; +import java.util.concurrent.ExecutionException; +import other.Strings.AdvancedFileNameQuoteProcessor; +import other.Strings.M4aTagQuoteProcessor; +import Applications.Application; +import Dating.Time; +import Files.FileActions; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.dnd.DropTarget; +import java.awt.dnd.DropTargetAdapter; +import java.awt.dnd.DropTargetListener; +import java.awt.event.KeyEvent; +import java.beans.PropertyChangeListener; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileFilter; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.DefaultListModel; +import javax.swing.ImageIcon; +import javax.swing.JFileChooser; +import javax.swing.JOptionPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileNameExtensionFilter; +import other.Strings.FileNameQuoteProcessor; +import other.Strings.FilepathQuoteProcessor; +import other.Strings.NumberQuoteProcessor; +import other.Strings.QuoteProcessor; +import swing.Beans.MultipleInputPane; + +/** + * This class extends all methods to create an audiobook. It Also contains information about the Main Window shown on startup. + * @author Kim + */ +public class MainWindow extends javax.swing.JFrame { + + /** Creates new form MainWindow + */ + public MainWindow() { + initComponents(); + initDragAndDrop(); + } + + /** + * Initializes the DropTargetAdapter and the DropTargets to enable special drag and drop features + * @see DropTargetAdapter + * @see DropTarget + */ + private void initDragAndDrop() { + coverFieldDrop = new DropTargetAdapter() { + + @Override + public void drop(DropTargetDropEvent dtde) { + try { + Transferable tr = dtde.getTransferable(); + DataFlavor[] flavors = tr.getTransferDataFlavors(); + //Checking Dragged Objects for their Flavour Type + //Only accept Files + for (int i = 0; i < flavors.length; i++) { + if (flavors[i].isFlavorJavaFileListType()) { + dtde.acceptDrop(dtde.getDropAction()); + List files = (List) tr.getTransferData(flavors[i]); + File imageFile = (File) files.get(0); + if (imageFile.isDirectory()) { + dtde.rejectDrop(); + return; + } + //Setting dropped File as active Cover + if (imageFile.getName().toLowerCase().endsWith(".jpg".toLowerCase()) || imageFile.getName().toLowerCase().endsWith(".png".toLowerCase())) { + Main.currBook.setImageFile(imageFile); + CoverField.setText(imageFile.getPath()); + dtde.dropComplete(true); + CoverField.repaint(); + } else { + JOptionPane.showMessageDialog(null, "Die Datei kann nicht als Cover verwendet werden. Die Formate .jpg und .png werden unterstützt.", "Fehler", JOptionPane.ERROR_MESSAGE); + dtde.rejectDrop(); + } + return; + } + } + } catch (Throwable t) { + } + dtde.rejectDrop(); + } + }; + listDrop = new DropTargetAdapter() { + + @Override + public void drop(DropTargetDropEvent dtde) { + try { + Transferable tr = dtde.getTransferable(); + DataFlavor[] flavors = tr.getTransferDataFlavors(); + //Only accept dropped *.m4a Files or Filders + for (int i = 0; i < flavors.length; i++) { + if (flavors[i].isFlavorJavaFileListType()) { + dtde.acceptDrop(dtde.getDropAction()); + List files = (List) tr.getTransferData(flavors[i]); + boolean unsupportedFile = false; + //Import useable files to audiobook data + for (File file : files) { + if (file.isDirectory() || file.getName().endsWith(".m4a")) { + load(file); + } else { + unsupportedFile = true; + } + } + if (unsupportedFile) { + JOptionPane.showMessageDialog(null, "Es werden nur *.m4a Dateien unterstützt. Konvertieren Sie diese z.B. über iTunes", "Achtung", JOptionPane.WARNING_MESSAGE); + } + updateChaptersList(); + dtde.dropComplete(true); + return; + } + } + } catch (Exception ex) { + } + dtde.rejectDrop(); + } + }; + targetDirDrop = new DropTargetAdapter() { + + @Override + public void drop(DropTargetDropEvent dtde) { + try { + Transferable tr = dtde.getTransferable(); + DataFlavor[] flavors = tr.getTransferDataFlavors(); + //Accepting only directories + for (int i = 0; i < flavors.length; i++) { + if (flavors[i].isFlavorJavaFileListType()) { + dtde.acceptDrop(dtde.getDropAction()); + List files = (List) tr.getTransferData(flavors[i]); + File dir = (File) files.get(0); + if (!dir.isDirectory()) { + dtde.rejectDrop(); + return; + } + //Set dropped Folder as active target foleder + Main.currBook.setTargetFolder(dir); + FolderField.setText(dir.getPath()); + dtde.dropComplete(true); + FolderField.repaint(); + checkPOD(); + return; + } + } + } catch (Throwable t) { + t.printStackTrace(); + } + dtde.rejectDrop(); + } + }; + mainDrop = new DropTargetAdapter() { + + @Override + public void drop(DropTargetDropEvent dtde) { + try { + Transferable tr = dtde.getTransferable(); + DataFlavor[] flavors = tr.getTransferDataFlavors(); + //Checking Dragged Objects for their Flavour Type + //Only accept POD Files + for (int i = 0; i < flavors.length; i++) { + if (flavors[i].isFlavorJavaFileListType()) { + dtde.acceptDrop(dtde.getDropAction()); + List files = (List) tr.getTransferData(flavors[i]); + File file = (File) files.get(0); + if (!file.getName().toLowerCase().endsWith("POD".toLowerCase()) || file.isDirectory()) { + dtde.rejectDrop(); + return; + } + //Load dropped File + loadPODFile(file); + return; + } + } + } catch (Throwable t) { + } + dtde.rejectDrop(); + } + }; + //Activating drag-and-drop + DropTarget listTarget = new DropTarget(ChaptersList, listDrop); + DropTarget coverFieldTarget = new DropTarget(CoverField, coverFieldDrop); + DropTarget targetDirTarget = new DropTarget(FolderField, targetDirDrop); + DropTarget mainTarget = new DropTarget(this, mainDrop); + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup = new javax.swing.ButtonGroup(); + openFilesButton = new javax.swing.JButton(); + FilesScrollPane = new javax.swing.JScrollPane(); + ChaptersList = new javax.swing.JList(); + upButton = new javax.swing.JButton(); + downButton = new javax.swing.JButton(); + removeButton = new javax.swing.JButton(); + ChapterPropPanel = new javax.swing.JPanel(); + TitleLabel = new javax.swing.JLabel(); + titleField = new javax.swing.JTextField(); + FileLabel = new javax.swing.JLabel(); + fileField = new javax.swing.JTextField(); + BookPropPanel = new javax.swing.JPanel(); + CoverLabel = new javax.swing.JLabel(); + CoverField = new javax.swing.JTextField(); + SearchCoverButton = new javax.swing.JButton(); + createAudiobookButton = new javax.swing.JButton(); + TargetDirLabel = new javax.swing.JLabel(); + FolderField = new javax.swing.JTextField(); + SearchFolderButton = new javax.swing.JButton(); + CopyRadioButton = new javax.swing.JRadioButton(); + moveRadioButton = new javax.swing.JRadioButton(); + createPodFileButton = new javax.swing.JButton(); + NameField = new javax.swing.JTextField(); + editTagsButton = new javax.swing.JButton(); + RemoveCoverButton = new javax.swing.JButton(); + NameTagLabel = new javax.swing.JLabel(); + NameTag = new javax.swing.JLabel(); + ArtistTagLabel = new javax.swing.JLabel(); + ArtistTag = new javax.swing.JLabel(); + AlbumTagLabel = new javax.swing.JLabel(); + AlbumTag = new javax.swing.JLabel(); + DeleteFiles = new javax.swing.JCheckBox(); + useProfile = new javax.swing.JButton(); + SortButton = new javax.swing.JButton(); + menuBar = new javax.swing.JMenuBar(); + FileMenu = new javax.swing.JMenu(); + openFilesMenuItem = new javax.swing.JMenuItem(); + loadPODFileMenuItem = new javax.swing.JMenuItem(); + jSeparator1 = new javax.swing.JPopupMenu.Separator(); + ExitMenuItem = new javax.swing.JMenuItem(); + SpecialMenu = new javax.swing.JMenu(); + createChapterProfileMenuItem = new javax.swing.JMenuItem(); + HelpMenu = new javax.swing.JMenu(); + AboutMenuItem = new javax.swing.JMenuItem(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); + setTitle("Audiobook Maker"); + setIconImage(new ImageIcon(Main.class.getResource("audiobook_icon.png")).getImage()); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + }); + + openFilesButton.setText("Dateien öffnen"); + openFilesButton.setToolTipText("Dateien zum Hörbuch hinzufügen"); + openFilesButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + openFilesButtonActionPerformed(evt); + } + }); + + ChaptersList.setModel(new DefaultListModel()); + ChaptersList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + public void valueChanged(javax.swing.event.ListSelectionEvent evt) { + ChaptersListValueChanged(evt); + } + }); + ChaptersList.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyPressed(java.awt.event.KeyEvent evt) { + ChaptersListKeyPressed(evt); + } + }); + FilesScrollPane.setViewportView(ChaptersList); + + upButton.setText("nach oben"); + upButton.setToolTipText("Ausgewähltes Kapitel nach oben bewegen"); + upButton.setEnabled(false); + upButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + upButtonActionPerformed(evt); + } + }); + + downButton.setText("nach unten"); + downButton.setToolTipText("Ausgewähltes Kapitel nach unten bewegen"); + downButton.setEnabled(false); + downButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + downButtonActionPerformed(evt); + } + }); + + removeButton.setText("Entfernen"); + removeButton.setToolTipText("Ausgewähltes Kapitel entfernen"); + removeButton.setEnabled(false); + removeButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + removeButtonActionPerformed(evt); + } + }); + + ChapterPropPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Kapitel-Eigenschaften")); + + TitleLabel.setText("Titel:"); + + titleField.setEditable(false); + titleField.setToolTipText("Namen für ausgewähltes Kapitel angeben"); + titleField.setDragEnabled(true); + titleField.getDocument().addDocumentListener(new DocumentListener() { + public void changedUpdate(DocumentEvent e){ + renameChapter(); + } + + public void removeUpdate(DocumentEvent e){ + renameChapter(); + } + + public void insertUpdate(DocumentEvent e){ + renameChapter(); + } + }); + titleField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + titleFieldActionPerformed(evt); + } + }); + + FileLabel.setText("Datei:"); + + fileField.setEditable(false); + + javax.swing.GroupLayout ChapterPropPanelLayout = new javax.swing.GroupLayout(ChapterPropPanel); + ChapterPropPanel.setLayout(ChapterPropPanelLayout); + ChapterPropPanelLayout.setHorizontalGroup( + ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ChapterPropPanelLayout.createSequentialGroup() + .addGroup(ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(TitleLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(FileLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(fileField, javax.swing.GroupLayout.DEFAULT_SIZE, 565, Short.MAX_VALUE) + .addComponent(titleField, javax.swing.GroupLayout.DEFAULT_SIZE, 565, Short.MAX_VALUE))) + ); + ChapterPropPanelLayout.setVerticalGroup( + ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ChapterPropPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(FileLabel) + .addComponent(fileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(6, 6, 6) + .addGroup(ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(TitleLabel) + .addComponent(titleField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(127, Short.MAX_VALUE)) + ); + + BookPropPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Hörbuch-Eigenschaften")); + + CoverLabel.setText("Cover:"); + + CoverField.setEditable(false); + + SearchCoverButton.setText("..."); + SearchCoverButton.setToolTipText("Cover-Datei suchen"); + SearchCoverButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SearchCoverButtonActionPerformed(evt); + } + }); + + createAudiobookButton.setText("Hörbuch erstellen"); + createAudiobookButton.setToolTipText(".m4b Datei erstellen (vorher muss eine .POD Datei erstellt werden)"); + createAudiobookButton.setEnabled(false); + createAudiobookButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + createAudiobookButtonActionPerformed(evt); + } + }); + + TargetDirLabel.setText("Ordner:"); + + FolderField.setEditable(false); + + SearchFolderButton.setText("Suchen..."); + SearchFolderButton.setToolTipText("Zielordner für die Dateien auswählen"); + SearchFolderButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SearchFolderButtonActionPerformed(evt); + } + }); + + buttonGroup.add(CopyRadioButton); + CopyRadioButton.setSelected(true); + CopyRadioButton.setText("Dateien kopieren"); + CopyRadioButton.setToolTipText("Audiodateien in den Zielordner kopieren"); + + buttonGroup.add(moveRadioButton); + moveRadioButton.setText("Dateien verschieben"); + moveRadioButton.setToolTipText("Audiodateien in den Zielordner verschieben"); + + createPodFileButton.setText(".POD Datei erstellen"); + createPodFileButton.setToolTipText(""); + createPodFileButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + createPodFileButtonActionPerformed(evt); + } + }); + + NameField.setText("Name"); + NameField.setToolTipText("Namen für das Hörbuch auswählen"); + NameField.getDocument().addDocumentListener(new DocumentListener() { + public void changedUpdate(DocumentEvent e){ + checkPOD(); + } + + public void removeUpdate(DocumentEvent e){ + checkPOD(); + } + + public void insertUpdate(DocumentEvent e){ + checkPOD(); + } + }); + + editTagsButton.setText("Tags bearbeiten"); + editTagsButton.setToolTipText("Tags für das Hörbuch eingeben. ACHTUNG: funktioniert noch nicht unbedingt bei iTunes"); + editTagsButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + editTagsButtonActionPerformed(evt); + } + }); + + RemoveCoverButton.setText("Löschen"); + RemoveCoverButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + RemoveCoverButtonActionPerformed(evt); + } + }); + + NameTagLabel.setText("Name: "); + + NameTag.setText("..."); + + ArtistTagLabel.setText("Interpret: "); + + ArtistTag.setText("..."); + + AlbumTagLabel.setText("Album: "); + + AlbumTag.setText("..."); + + DeleteFiles.setText("Dateien löschen"); + DeleteFiles.setToolTipText("Dateien nach erstellen des Hörbuches aus Zielordner löschen (Sie werden nicht mehr benötigt)"); + + javax.swing.GroupLayout BookPropPanelLayout = new javax.swing.GroupLayout(BookPropPanel); + BookPropPanel.setLayout(BookPropPanelLayout); + BookPropPanelLayout.setHorizontalGroup( + BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(BookPropPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, BookPropPanelLayout.createSequentialGroup() + .addComponent(NameField, javax.swing.GroupLayout.DEFAULT_SIZE, 225, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(createPodFileButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(createAudiobookButton)) + .addGroup(BookPropPanelLayout.createSequentialGroup() + .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(TargetDirLabel) + .addComponent(CoverLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, BookPropPanelLayout.createSequentialGroup() + .addComponent(CoverField, javax.swing.GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(SearchCoverButton)) + .addComponent(FolderField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 356, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(RemoveCoverButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(SearchFolderButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(BookPropPanelLayout.createSequentialGroup() + .addComponent(CopyRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(moveRadioButton) + .addGap(18, 18, 18) + .addComponent(DeleteFiles) + .addContainerGap(132, Short.MAX_VALUE)) + .addGroup(BookPropPanelLayout.createSequentialGroup() + .addComponent(editTagsButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NameTagLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NameTag) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(ArtistTagLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(ArtistTag) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(AlbumTagLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(AlbumTag) + .addGap(165, 165, 165)))) + ); + BookPropPanelLayout.setVerticalGroup( + BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(BookPropPanelLayout.createSequentialGroup() + .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(CoverLabel) + .addComponent(CoverField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(RemoveCoverButton) + .addComponent(SearchCoverButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(TargetDirLabel) + .addComponent(FolderField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(SearchFolderButton)) + .addGap(18, 18, 18) + .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(CopyRadioButton) + .addComponent(moveRadioButton) + .addComponent(DeleteFiles)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(editTagsButton) + .addComponent(NameTagLabel) + .addComponent(NameTag) + .addComponent(ArtistTagLabel) + .addComponent(ArtistTag) + .addComponent(AlbumTagLabel) + .addComponent(AlbumTag)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(createAudiobookButton) + .addComponent(createPodFileButton) + .addComponent(NameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + ); + + useProfile.setText("Kapitelprofil anwenden"); + useProfile.setToolTipText("Namen der ausgewählten Kapitel automatisch bearbeiten"); + useProfile.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + useProfileActionPerformed(evt); + } + }); + + SortButton.setText("Sortieren"); + SortButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SortButtonActionPerformed(evt); + } + }); + + FileMenu.setText("Datei"); + FileMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + openFilesButtonActionPerformed(evt); + } + }); + + openFilesMenuItem.setText("Dateien öffnen"); + FileMenu.add(openFilesMenuItem); + + loadPODFileMenuItem.setText("POD Datei laden"); + loadPODFileMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + loadPODFileMenuItemActionPerformed(evt); + } + }); + FileMenu.add(loadPODFileMenuItem); + FileMenu.add(jSeparator1); + + ExitMenuItem.setText("Beenden"); + ExitMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ExitMenuItemActionPerformed(evt); + } + }); + FileMenu.add(ExitMenuItem); + + menuBar.add(FileMenu); + + SpecialMenu.setText("Spezial"); + + createChapterProfileMenuItem.setText("Kapitelprofil Editor"); + createChapterProfileMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + createChapterProfileMenuItemActionPerformed(evt); + } + }); + SpecialMenu.add(createChapterProfileMenuItem); + + menuBar.add(SpecialMenu); + + HelpMenu.setText("Hilfe"); + HelpMenu.setToolTipText(""); + + AboutMenuItem.setText("Über"); + AboutMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + AboutMenuItemActionPerformed(evt); + } + }); + HelpMenu.add(AboutMenuItem); + + menuBar.add(HelpMenu); + + setJMenuBar(menuBar); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(useProfile, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(SortButton)) + .addComponent(FilesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 224, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(removeButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(downButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(upButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(openFilesButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(BookPropPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(ChapterPropPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(FilesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 371, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(useProfile) + .addComponent(SortButton))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(openFilesButton) + .addGap(47, 47, 47) + .addComponent(upButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(downButton) + .addGap(18, 18, 18) + .addComponent(removeButton)) + .addComponent(BookPropPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ChapterPropPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + /** + * Opens a Filechooser dialog to choose a Folder or Files to load. + * @param evt Auto Generated Event; not used + */ + private void openFilesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openFilesButtonActionPerformed + JFileChooser chooser = new JFileChooser(Main.lastDir); + chooser.addChoosableFileFilter(new FileNameExtensionFilter("Mpeg 4 audio files(*.m4a)", "m4a")); + chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + chooser.setAcceptAllFileFilterUsed(false); + chooser.setMultiSelectionEnabled(true); + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + Main.lastDir = chooser.getCurrentDirectory(); + //Load all selected files and foders + for (File file : chooser.getSelectedFiles()) { + load(file); + } + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + updateChaptersList(); + }//GEN-LAST:event_openFilesButtonActionPerformed + + /** + * loads an audiofile to this active project. If the file is a folder every subfolder's audiofile and subfolder will be loaded + * @param f a file + */ + private void load(File f) { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + if (f.isDirectory()) { + //load all subfolder's *.m4a files and folders + FileFilter filter = new FileFilter() { + + @Override + public boolean accept(File pathname) { + return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".m4a".toLowerCase()); + } + }; + for (File file : f.listFiles(filter)) { + load(file); + } + } else { + //add a new chapter with an audiofile + Chapter c = new Chapter(); + c.setFile(f); + c.setTitle(f.getName()); + //Read the audiofile's length + boolean error = false; + try { + c.calculateTime(); + } catch (Exception ex) { + JOptionPane.showMessageDialog(this, "Beim Laden der Datei\"" + f.getPath() + "\" ist ein Fehler aufgetreten. Diese Datei wurde NICHT geladen", "Fehler", JOptionPane.ERROR_MESSAGE); + error = true; + } + if (!error) { + Main.currBook.add(c); + } + } + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + + /** + * Moves the selected chapter up + * @param evt Auto Generated Event; not used + */ + private void upButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_upButtonActionPerformed + if (ChaptersList.getSelectedIndices()[0] <= 0) { + return; + } + List tmpChapters = new ArrayList<>(); + int[] indices = ChaptersList.getSelectedIndices(); + for (int i = indices.length - 1; i >= 0; i--) { + tmpChapters.add(Main.currBook.remove(indices[i])); + } + List chapters = new ArrayList<>(); + for (int i = tmpChapters.size() - 1; i >= 0; i--) { + chapters.add(tmpChapters.get(i)); + + } + for (int i = 0; i < chapters.size(); i++) { + Chapter chapter = chapters.get(i); + Main.currBook.add(indices[i] - 1, chapter); + } + updateChaptersList(); + int[] select = new int[indices.length]; + for (int i = 0; i < indices.length; i++) { + int j = indices[i]; + select[i] = j - 1; + } + ChaptersList.setSelectedIndices(select); + }//GEN-LAST:event_upButtonActionPerformed + + /** + * Moves the selected chapter down + * @param evt Auto Generated Event; not used + */ + private void downButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downButtonActionPerformed + if (ChaptersList.getSelectedIndices()[ChaptersList.getSelectedIndices().length - 1] >= Main.currBook.size() - 1) { + return; + } + List tmpChapters = new ArrayList<>(); + int[] indices = ChaptersList.getSelectedIndices(); + for (int i = indices.length - 1; i >= 0; i--) { + tmpChapters.add(Main.currBook.remove(indices[i])); + } + List chapters = new ArrayList<>(); + for (int i = tmpChapters.size() - 1; i >= 0; i--) { + chapters.add(tmpChapters.get(i)); + + } + for (int i = 0; i < chapters.size(); i++) { + Chapter chapter = chapters.get(i); + Main.currBook.add(indices[i] + 1, chapter); + } + updateChaptersList(); + int[] select = new int[indices.length]; + for (int i = 0; i < indices.length; i++) { + int j = indices[i]; + select[i] = j + 1; + } + ChaptersList.setSelectedIndices(select); + }//GEN-LAST:event_downButtonActionPerformed + + /** + * Called when the List's selection was changed. Enables/disables the buttons + * @param evt Auto Generated Event; not used + */ + private void ChaptersListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_ChaptersListValueChanged + if (ChaptersList.getSelectedIndex() == -1 || ChaptersList.getSelectedIndices().length > 1) { + upButton.setEnabled(false); + downButton.setEnabled(false); + removeButton.setEnabled(false); + titleField.setEditable(false); + } else { + upButton.setEnabled(true); + downButton.setEnabled(true); + removeButton.setEnabled(true); + titleField.setEditable(true); + try { + fileField.setText(Main.currBook.get(ChaptersList.getSelectedIndex()).getFile().getPath()); + } catch (NullPointerException ex) { + fileField.setText(""); + } + try { + titleField.setText(Main.currBook.get(ChaptersList.getSelectedIndex()).getTitle()); + } catch (NullPointerException ex) { + titleField.setText(""); + } + } + }//GEN-LAST:event_ChaptersListValueChanged + + /** + * Removes the selected chapter + * @param evt Auto Generated Event; not used + */ + private void removeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeButtonActionPerformed + int index; + for (int i = ChaptersList.getSelectedIndices().length - 1; i >= 0; i--) { + index = ChaptersList.getSelectedIndices()[i]; + Main.currBook.remove(index); + } + updateChaptersList(); + }//GEN-LAST:event_removeButtonActionPerformed + + /** + * Opens a filechooser dialog to select a imagefile to use as cover + * @param evt Auto Generated Event; not used + */ + private void SearchCoverButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SearchCoverButtonActionPerformed + JFileChooser chooser = new JFileChooser(Main.lastDir); + chooser.setMultiSelectionEnabled(false); + chooser.setAcceptAllFileFilterUsed(false); + chooser.addChoosableFileFilter(new FileNameExtensionFilter("Image Files(*.jpg, *.png)", "jpg", "jpeg", "png")); + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + Main.lastDir = chooser.getCurrentDirectory(); + Main.currBook.setImageFile(chooser.getSelectedFile()); + CoverField.setText(chooser.getSelectedFile().getPath()); + } + }//GEN-LAST:event_SearchCoverButtonActionPerformed + + /** + * Opens a filechooser dialog to select a target folder for the files + * @param evt Auto Generated Event; not used + */ + private void SearchFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SearchFolderButtonActionPerformed + JFileChooser chooser = new JFileChooser(); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + chooser.setAcceptAllFileFilterUsed(false); + chooser.setMultiSelectionEnabled(false); + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + Main.currBook.setTargetFolder(chooser.getSelectedFile()); + FolderField.setText(chooser.getSelectedFile().getPath()); + } + checkPOD(); + }//GEN-LAST:event_SearchFolderButtonActionPerformed + + /** + * Creates the .POD File + * @param evt Auto Generated Event; not used + */ + private void createPodFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createPodFileButtonActionPerformed + createPODFile(); + }//GEN-LAST:event_createPodFileButtonActionPerformed + + public void createPODFile() { + // + boolean isError = false; + String errorText = "Beim Erstellen der .POD Datei sind folgende Fehler aufgetreten;
    "; + //No target folder selected + if (FolderField.getText().equals("")) { + errorText = errorText.concat("
  • Es wurde kein Ordner angegeben
  • "); + isError = true; + } + //No name typed + if (NameField.getText().equals("")) { + errorText = errorText.concat("
  • Es wurde kein Dateiname angegeben
  • "); + isError = true; + } + //No files loaded + if (!(Main.currBook.size() > 0)) { + errorText = errorText.concat("
  • Es wurden keine Dateien ausgewählt
  • "); + isError = true; + } + if (isError) { + errorText = errorText.concat("
Der Prozess konnte nicht abgeschlossen werden"); + JOptionPane.showMessageDialog(this, errorText, "Fehler", JOptionPane.ERROR_MESSAGE); + return; + } + //
+ //If no cover is selected let the user confirm to proceed + if (CoverField.getText().equals("") && JOptionPane.showConfirmDialog(this, "Es wurde kein Cover ausgewählt. Fortfahren?", "Fortfahren?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION) { + return; + } + + SwingWorker worker = new SwingWorker() { + + @Override + protected Boolean doInBackground() throws Exception { + // + /*if (CopyRadioButton.isSelected()) { + //Copy Files + dialog.ActionLabel.setText("Dateien kopieren..."); + for (Chapter chapter : Main.currBook) { + dialog.MessageLabel.setText("Datei: " + chapter.getFile().getPath()); + dialog.validate(); + dialog.repaint(); + boolean success = true; + if (!Files.FileActions.isInside(Main.currBook.getTargetFolder(), chapter.getFile())) { + File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + chapter.getFile().getName()); + success = Files.FileActions.fastCopy(chapter.getFile(), newFile); + chapter.setFile(newFile); + } + dialog.progressBar.setValue(dialog.progressBar.getValue() + 1); + dialog.validate(); + dialog.repaint(); + if (!success) { + if (JOptionPane.showConfirmDialog(null, "Beim Kopieren der Datei \"" + chapter.getFile().getPath() + "\" ist ein Fehler aufgetreten.\n\nTrotzdem fortfahren?", "Fortfahren?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION) { + dialog.dispose(); + return; + } + } + } + //Copy Cover + if (Main.currBook.getImageFile() != null) { + dialog.MessageLabel.setText("Datei: " + Main.currBook.getImageFile().getPath()); + dialog.validate(); + dialog.repaint(); + boolean success = true; + if (!Files.FileActions.isInside(Main.currBook.getTargetFolder(), Main.currBook.getImageFile())) { + File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + Main.currBook.getImageFile().getName()); + success = Files.FileActions.fastCopy(Main.currBook.getImageFile(), newFile); + Main.currBook.setImageFile(newFile); + } + dialog.progressBar.setValue(dialog.progressBar.getValue() + 1); + dialog.validate(); + dialog.repaint(); + if (!success) { + JOptionPane.showMessageDialog(null, "Beim Kopieren des Covers ist ein Fehler aufgetreten. Der Prozess kann nicht fortgeführt werden", "Fehler", JOptionPane.ERROR_MESSAGE); + dialog.dispose(); + return; + + } + } + + } else if (moveRadioButton.isSelected()) { + //Move Files + dialog.ActionLabel.setText("Dateien verschieben..."); + for (Chapter chapter : Main.currBook) { + dialog.MessageLabel.setText("Datei: " + chapter.getFile()); + File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + chapter.getFile().getName()); + boolean success = chapter.getFile().renameTo(newFile); + chapter.setFile(newFile); + dialog.progressBar.setValue(dialog.progressBar.getValue() + 1); + if (!success) { + if (JOptionPane.showConfirmDialog(null, "Beim Verschieben der Datei \"" + chapter.getFile().getPath() + "\" ist ein Fehler aufgetreten.\n\nTrotzdem fortfahren?", "Fortfahren?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION) { + dialog.dispose(); + return; + } + } + } + //Move Cover + if (Main.currBook.getImageFile() != null) { + dialog.MessageLabel.setText("Datei: " + Main.currBook.getImageFile().getPath()); + File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + Main.currBook.getImageFile().getName()); + boolean success = Main.currBook.getImageFile().renameTo(newFile); + Main.currBook.setImageFile(newFile); + dialog.progressBar.setValue(dialog.progressBar.getValue() + 1); + if (!success) { + JOptionPane.showMessageDialog(null, "Beim Verschieben des Covers ist ein Fehler aufgetreten. Der Prozess kann nicht forgeführt werden.", "Fehler", JOptionPane.ERROR_MESSAGE); + dialog.dispose(); + return; + } + } + + }*/ + // + + int max = Main.currBook.size(); + if (Main.currBook.getImageFile() != null) { + max++; + } + firePropertyChange("Maximum", 0, max); + + // + if (CopyRadioButton.isSelected()) { + firePropertyChange("ActionLabel", null, "Dateien Kopieren..."); + } else if (moveRadioButton.isSelected()) { + firePropertyChange("ActionLabel", null, "Dateien verschieben..."); + } else { + return Boolean.FALSE; + } + + for (int i = 0; i < Main.currBook.size(); i++) { + Chapter chapter = Main.currBook.get(i); + firePropertyChange("MessageLabel", null, "Datei: " + chapter.getFile().getPath()); + File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + chapter.getFile().getName()); + boolean success; + if (CopyRadioButton.isSelected()) { + success = FileActions.fastCopy(chapter.getFile(), newFile); + } else { + success = chapter.getFile().renameTo(newFile); + } + chapter.setFile(newFile); + firePropertyChange("ProgressValue", 0, i + 1); + if (!success) { + firePropertyChange("Error", null, "Beim Kopieren/Verschieben der Datei \"" + chapter.getFile().getPath() + "\" ist ein Fehler aufgetreten."); + return Boolean.FALSE; + } + } + if (Main.currBook.getImageFile() != null) { + firePropertyChange("MessageLabel", null, "Datei: " + Main.currBook.getImageFile().getPath()); + File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + Main.currBook.getImageFile().getName()); + boolean success; + if (CopyRadioButton.isSelected()) { + success = FileActions.fastCopy(Main.currBook.getImageFile(), newFile); + } else { + success = Main.currBook.getImageFile().renameTo(newFile); + } + Main.currBook.setImageFile(newFile); + firePropertyChange("ProgressValue", 0, max); + if (!success) { + firePropertyChange("Error", null, "Beim Kopieren/Verschieben der Datei \"" + Main.currBook.getImageFile().getPath() + "\" ist ein Fehler aufgetreten."); + return Boolean.FALSE; + } + } + // + + // + firePropertyChange("ProgressValue", 0, 0); + firePropertyChange("ActionLabel", null, "Sonderzeichen entfernen..."); + for (int i = 0; i < Main.currBook.size(); i++) { + Chapter chapter = Main.currBook.get(i); + firePropertyChange("MessageLabel", null, "Datei: " + chapter.getFile().getPath()); + File newFile = new File(chapter.getFile().getParent() + "/" + chapter.getFile().getName().replaceAll("[^A-Z^a-z^0-9^_^-^.^ ]", "")); + if (newFile.getName().equalsIgnoreCase(".m4a")) { + newFile = new File(newFile.getParent() + "/Kapitel" + (i + 1) + ".m4a"); + } + if (!chapter.getFile().renameTo(newFile)) { + firePropertyChange("Error", null, "Die Datei " + chapter.getFile().getPath() + " enthält nicht zulässige Zeichen."); + //JOptionPane.showMessageDialog(null, "Die Datei " + chapter.getFile().getPath() + " enthält nicht zulässige Zeichen.", "Fehler", JOptionPane.ERROR_MESSAGE); + return Boolean.FALSE; + } + chapter.setFile(newFile); + firePropertyChange("ProgressValue", 0, i + 1); + } + if (Main.currBook.getImageFile() != null) { + File newFile = new File(Main.currBook.getImageFile().getParent() + "/" + Main.currBook.getImageFile().getName().replaceAll("[^A-Z^a-z^0-9^_^-^.^ ]", "")); + if (newFile.getName().equalsIgnoreCase(Files.FileActions.getExtention(newFile))) { + newFile = new File(newFile.getParent() + "/Cover" + Files.FileActions.getExtention(newFile)); + } + if (!Main.currBook.getImageFile().renameTo(newFile)) { + firePropertyChange("Error", null, "Die Datei " + Main.currBook.getImageFile().getPath() + " enthält nicht zulässige Zeichen."); + //JOptionPane.showMessageDialog(null, "Die Coverdatei enthält nicht zulässige Zeichen.", "Fehler", JOptionPane.ERROR_MESSAGE); + return Boolean.FALSE; + } + Main.currBook.setImageFile(newFile); + firePropertyChange("ProgressValue", 0, max); + } + // + + // + firePropertyChange("ProgressValue", 0, 0); + firePropertyChange("ActionLabel", "", "Script erstellen..."); + FileWriter FWriter = null; + File PODfile = new File(Main.currBook.getTargetFolder().getPath() + "/" + NameField.getText() + ".POD"); + try { + FWriter = new FileWriter(PODfile); + BufferedWriter writer = new BufferedWriter(FWriter); + + //Write head + writer.write("[Podcast]\n\n"); + writer.write("altfolder1=" + Main.currBook.getTargetFolder().getName() + "\n"); + writer.write("basename=" + NameField.getText() + "\n"); + writer.write("audiobook=true\n"); + if (Main.currBook.getImageFile() != null) { + writer.write("artwork=" + Main.currBook.getImageFile().getName() + "\n"); + ImageIcon icon = new ImageIcon(Main.currBook.getImageFile().getPath()); + writer.write("imgwidth=" + icon.getIconWidth() + "\n"); + writer.write("imgheight=" + icon.getIconHeight() + "\n"); + } + writer.write("editpointcount=" + Main.currBook.size() + "\n"); + firePropertyChange("ProgressValue", null, 1); + + //Write a block for each chapter + Time startTime = new Time(false); + for (int i = 1; i <= Main.currBook.size(); i++) { + Chapter chapter = Main.currBook.get(i - 1); + writer.write("\n\n[Editpoint_" + i + "]\n"); + if (Main.currBook.getImageFile() != null) { + writer.write("image=" + Main.currBook.getImageFile().getName() + "\n"); + } + writer.write("audiofile=" + chapter.getFile().getName() + "\n"); + writer.write("chapter=" + chapter.getTitle() + "\n"); + writer.write("start=" + startTime.toString() + ".00\n"); + startTime.add(chapter.getTime()); + firePropertyChange("ProgressValue", 0, i + 1); + } + + //Write Metadata (not neccessary) + if (Main.currBook.getAlbum() != null || Main.currBook.getName() != null || Main.currBook.getArtist() != null) { + writer.write("\n[metadata]\n"); + } + if (Main.currBook.getName() != null) { + writer.write("©nam=" + Main.currBook.getName() + "\n"); + } + if (Main.currBook.getArtist() != null) { + writer.write("©ART=" + Main.currBook.getArtist() + "\n"); + } + if (Main.currBook.getAlbum() != null) { + writer.write("©alb=" + Main.currBook.getAlbum()); + } + + writer.close(); + FWriter.close(); + } catch (IOException ex) { + //JOptionPane.showMessageDialog(null, "Beim Erstellen der .POD Datei ist ein Fehler aufgetreten. Der Prozess konnte nicht abgeschlossen werden.", "Fehler", JOptionPane.ERROR_MESSAGE); + firePropertyChange("Error", null, "Beim Erstellen des Skriptes ist ein Fehler aufgetreten."); + try { + //remove POD file on error to not let create the user an impossible audiobook + PODfile.delete(); + } catch (Exception exc) { + } + return Boolean.FALSE; + } + // + + return Boolean.TRUE; + } + + @Override + protected void done() { + try { + firePropertyChange("Finish", null, get()); + } catch (InterruptedException | ExecutionException ex) { + ex.printStackTrace(); + } + } + }; + + final ProgressDialog dialog = new ProgressDialog(this, true); + worker.addPropertyChangeListener(dialog); + dialog.progressBar.setValue(0); + dialog.ActionLabel.setText(""); + dialog.MessageLabel.setText(""); + + worker.execute(); + + dialog.setVisible(true); + } + + /** + * Lets SSA create the audiobook file + * @param evt Auto Generated Event; not used + */ + private void createAudiobookButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createAudiobookButtonActionPerformed + // + boolean isError = false; + String errorText = "Beim Erstellen des Hörbuchs sind folgende Fehler aufgetreten;
    "; + //No target folder + if (FolderField.getText().equals("")) { + errorText = errorText.concat("
  • Es wurde kein Ordner angegeben
  • "); + isError = true; + } + //No name typed + if (NameField.getText().equals("")) { + errorText = errorText.concat("
  • Es wurde kein Dateiname angegeben
  • "); + isError = true; + } + if (isError) { + errorText = errorText.concat("
Der Prozess konnte nicht abgeschlossen werden"); + JOptionPane.showMessageDialog(this, errorText, "Fehler", JOptionPane.ERROR_MESSAGE); + return; + } + //Check if the POD file exists; should already be done --> checkPOD(); + final File PODfile = new File(Main.currBook.getTargetFolder().getPath() + "/" + NameField.getText() + ".POD"); + if (!PODfile.exists()) { + JOptionPane.showMessageDialog(this, "Die .POD Datei \"" + PODfile.getPath() + "\" wurde nicht gefunden", "Fehler", JOptionPane.ERROR_MESSAGE); + return; + } + //
+ + SwingWorker worker = new SwingWorker() { + + @Override + protected Object doInBackground() throws Exception { + ProcessBuilder builder = new ProcessBuilder("SSA", PODfile.getName()).redirectErrorStream(true); + builder.directory(Main.currBook.getTargetFolder()); + builder.redirectErrorStream(true); + final Process p = builder.start(); +// new Thread() { +// +// public void run() { + try { + //BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); + //String line; + int i; + while ((i = p.getInputStream().read()) != -1) { + + System.out.println(i); + } + } catch (IOException ex) { + ex.printStackTrace(); + } +// } +// }.start(); + return p.exitValue(); + } + + @Override + protected void done() { + System.out.println("done"); + } + }; + worker.execute(); + + /*// + File logFile = new File(Main.currBook.getTargetFolder().getPath() + "/SSA Log.txt"); + if (logFile.exists()) { + logFile.delete(); + } + + logFile.createNewFile(); + BufferedWriter writer = new BufferedWriter(new FileWriter(logFile)); + //Writing the SSA output to the logfile + writer.write("SSA Output: " + "\n"); + BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + writer.write("\n" + line); + } + writer.write("\n\n\nErgebnis=" + p.exitValue()); + reader.close(); + writer.close(); + //*/ + + /* // + //Create new ProcessBuilder to use SSA + ProcessBuilder builder = new ProcessBuilder("SSA", PODfile.getName()).redirectErrorStream(true); + builder.directory(Main.currBook.getTargetFolder()); + try { + Process p = builder.start(); + p.waitFor(); + + // + if (DeleteFiles.isSelected()) { + dialog.setTitle("Aufräumen"); + dialog.ActionLabel.setText("Dateien löschen: "); + dialog.MessageLabel.setText(""); + dialog.progressBar.setIndeterminate(false); + dialog.progressBar.setMaximum(Main.currBook.size()); + dialog.progressBar.setValue(0); + for (Chapter chapter : Main.currBook) { + dialog.MessageLabel.setText("Datei: " + chapter.getFile().getPath()); + if (!chapter.getFile().delete()) { + JOptionPane.showMessageDialog(null, "Beim löschen der Datei " + chapter.getFile().getPath() + " ist ein Fehler aufgetreten", "Fehler", JOptionPane.ERROR_MESSAGE); + } + dialog.progressBar.setValue(dialog.progressBar.getValue() + 1); + dialog.validate(); + dialog.repaint(); + } + } + // + + JOptionPane.showMessageDialog(null, "Das Hörbuch wurde erfolgreich im Ordner \"" + PODfile.getParent() + "\" erstellt", "Beendet", JOptionPane.INFORMATION_MESSAGE); + } catch (IOException ex) { + JOptionPane.showMessageDialog(null, "Beim Erstellen des Hörbuches ist ein Fehler aufgetreten. Der Prozess konnte nicht abgeschlossen werden.", "Fehler", JOptionPane.ERROR_MESSAGE); + } catch (InterruptedException ex) { + JOptionPane.showMessageDialog(null, "Der Prozess wurde abgebrochen.", "Fehler", JOptionPane.ERROR_MESSAGE); + } + //*/ + }//GEN-LAST:event_createAudiobookButtonActionPerformed + + /** + * Lets the user choose a text file to auto rename every selected chapter + * @param evt Auto Generated Event; not used + */ +private void useProfileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useProfileActionPerformed + //Creating preview component + final JTextArea preview = new JTextArea(); + preview.setEditable(false); + preview.setLineWrap(true); + preview.setWrapStyleWord(true); + preview.setPreferredSize(new Dimension(250, 100)); + File userDir = new File(System.getProperty("user.dir")); + File profileFolder = new File(userDir.getPath() + "/Profile"); + JFileChooser chooser = new JFileChooser(profileFolder.exists() ? profileFolder : userDir); + chooser.setMultiSelectionEnabled(false); + chooser.setAccessory(preview); + chooser.addPropertyChangeListener(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + try { + BufferedReader reader = new BufferedReader(new FileReader((File) evt.getNewValue())); + preview.setText(""); + String line = ""; + while ((line = reader.readLine()) != null) { + if (line.startsWith("#")) { + preview.append(line.replaceFirst("#", "") + "\n"); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + try { + FileReader FReader = new FileReader(chooser.getSelectedFile()); + BufferedReader reader = new BufferedReader(FReader); + + String profile = ""; + while ((profile = reader.readLine()).startsWith("#")) { + } + //Using profile + useChapterProfile(profile); + FReader.close(); + reader.close(); + } catch (FileNotFoundException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } catch (IOException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + } +}//GEN-LAST:event_useProfileActionPerformed + + /** + * Renames every loaded Chapter by a single-line String containing QuoteProcessor compatible code. + * @param profile a single Line String + * @see NumberQuoteProcessor + * @see M4aTagQuoteProcessor + * @see FileNameQuoteProcessor + * @see AdvancedFileNameQuoteProcessor + * @see FilepathQuoteProcessor + * @see QuoteProcessor + */ + public void useChapterProfile(String profile) { + if (profile == null || profile == "") { + return; + } + //Creating QuoteProcessor instances + NumberQuoteProcessor numbQuote = new NumberQuoteProcessor(); + FileNameQuoteProcessor fileNameQuote = new FileNameQuoteProcessor(); + FilepathQuoteProcessor filePathQuote = new FilepathQuoteProcessor(); + AdvancedFileNameQuoteProcessor advancedQuote = new AdvancedFileNameQuoteProcessor(); + M4aTagQuoteProcessor m4aQuote = new M4aTagQuoteProcessor(); + + //if no chapter is selected, select all + if (ChaptersList.getSelectedIndex() == -1) { + ChaptersList.setSelectionInterval(0, Main.currBook.size() - 1); + } + //Applying profile to each loaded and selected chapter + for (int i : ChaptersList.getSelectedIndices()) { + Chapter chapter = Main.currBook.get(i); + numbQuote.setNumber(i + 1); + fileNameQuote.setFile(chapter.getFile()); + advancedQuote.setFile(chapter.getFile()); + filePathQuote.setFile(chapter.getFile()); + m4aQuote.setFile(chapter.getFile()); + String newTitle = profile; + newTitle = numbQuote.replaceAll(newTitle); + newTitle = fileNameQuote.replaceAll(newTitle); + newTitle = advancedQuote.replaceAll(newTitle); + newTitle = filePathQuote.replaceAll(newTitle); + newTitle = m4aQuote.replaceAll(newTitle); + chapter.setTitle(newTitle); + } + + updateChaptersList(); + } + + /** + * Calls the exit method + * @param evt Auto Generated Event; not used + */ +private void ExitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ExitMenuItemActionPerformed + Main.mainObj.exit(); +}//GEN-LAST:event_ExitMenuItemActionPerformed + + /** + * Calls the exit method + * @param evt Auto Generated Event; not used + */ +private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + Main.mainObj.exit(); +}//GEN-LAST:event_formWindowClosing + + /** + * Opens the a new Chapter editor window + * @param evt Auto Generated Event; not used + */ +private void createChapterProfileMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createChapterProfileMenuItemActionPerformed + ChapterProfileCreator window = new ChapterProfileCreator(); + window.setLocation(Application.getScreenCenterFor(window)); + window.setVisible(true); +}//GEN-LAST:event_createChapterProfileMenuItemActionPerformed + + /** + * Removes the loaded cover + * @param evt Auto Generated Event; not used + */ +private void RemoveCoverButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RemoveCoverButtonActionPerformed + Main.currBook.setImageFile(null); + CoverField.setText(""); +}//GEN-LAST:event_RemoveCoverButtonActionPerformed + + /** + * Opens a MultipleInputPane to edit tags + * @param evt Auto Generated Event; not used + * @see MultipleInputPane + */ +private void editTagsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editTagsButtonActionPerformed + MultipleInputPane pane = new MultipleInputPane("Name: ", "Interpret: ", "Album: "); + pane.setText(0, Main.currBook.getName()); + pane.setText(1, Main.currBook.getArtist()); + pane.setText(2, Main.currBook.getAlbum()); + pane.showDialog(this, "Eingabe", JOptionPane.PLAIN_MESSAGE); + Main.currBook.setName(pane.getText(0)); + Main.currBook.setArtist(pane.getText(1)); + Main.currBook.setAlbum(pane.getText(2)); + NameTag.setText(Main.currBook.getName().equals("") ? "..." : Main.currBook.getName()); + AlbumTag.setText(Main.currBook.getAlbum().equals("") ? "..." : Main.currBook.getAlbum()); + ArtistTag.setText(Main.currBook.getArtist().equals("") ? "..." : Main.currBook.getArtist()); + pack(); +}//GEN-LAST:event_editTagsButtonActionPerformed + + /** + * Shows an about box + * @param evt Auto Generated Event; not used + */ +private void AboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AboutMenuItemActionPerformed + Main.mainObj.showAboutBox(); +}//GEN-LAST:event_AboutMenuItemActionPerformed + + /** + * Sorts all chapters alphabetical + * @param evt Auto Generated Event; not used + */ +private void SortButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SortButtonActionPerformed + Collections.sort(Main.currBook); + updateChaptersList(); +}//GEN-LAST:event_SortButtonActionPerformed + + /** + * Called when the user presses the [Enter] Key after typing in titleField + * @param evt Auto Generated Event; not used + */ + private void titleFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_titleFieldActionPerformed + ChaptersList.removeSelectionInterval(ChaptersList.getSelectedIndex(), ChaptersList.getSelectedIndex()); + }//GEN-LAST:event_titleFieldActionPerformed + + /** + * Provides methods to react on Key actions inside the List + * @param evt a Key Event + */ + private void ChaptersListKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_ChaptersListKeyPressed + //Delete + if (evt.getKeyCode() == KeyEvent.VK_DELETE) { + removeButtonActionPerformed(null); + } + }//GEN-LAST:event_ChaptersListKeyPressed + + /** + * Loads all available information of a POD file and sets them active + * @param evt Auto Generated Event; not used + */ + private void loadPODFileMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadPODFileMenuItemActionPerformed + //Open filechooser dialog + JFileChooser chooser = new JFileChooser(Main.lastDir); + chooser.addChoosableFileFilter(new FileNameExtensionFilter("*.POD Files", "POD")); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + chooser.setAcceptAllFileFilterUsed(false); + chooser.setMultiSelectionEnabled(false); + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + Main.lastDir = chooser.getCurrentDirectory(); + loadPODFile(chooser.getSelectedFile()); + } + }//GEN-LAST:event_loadPODFileMenuItemActionPerformed + + public void loadPODFile(File podFile) { + try { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + //setting targetFolder + Main.currBook.setTargetFolder(podFile.getParentFile()); + BufferedReader reader = new BufferedReader(new FileReader(podFile)); + String line = ""; + String errorText = "Beim Laden folgender Dateien sind Fehler aufgetreten, sodass sie nicht geladen wurden:
    "; + boolean error = false; + // + while (line != null) { + if (line.startsWith("basename=")) { + //seting Name + NameField.setText(line.substring(line.indexOf("=") + 1)); + line = reader.readLine(); + } else if (line.startsWith("[Editpoint")) { + //Creating a new chapter + Chapter newChapter = new Chapter(); + boolean wasError = error; + while (!(line = reader.readLine()).startsWith("[")) { + if (line.startsWith("audiofile")) { + //Setting the chapter's file + File audiofile = new File(podFile.getParent() + "/" + line.substring(line.indexOf("=") + 1)); + newChapter.setFile(audiofile); + //Reading the audiotrack's length + try { + newChapter.calculateTime(); + error = false; + } catch (Exception ex) { + errorText = errorText.concat("
  • " + newChapter.getFile().getPath() + "
  • "); + error = true; + } + } else if (line.startsWith("chapter")) { + //Setting the title of the chapter + newChapter.setTitle(line.substring(line.indexOf("=") + 1)); + } + } + if (!error) { + //If there is no error add chapter to active audiobook + Main.currBook.add(newChapter); + error = wasError; + } + + //Reading tag information + } else if (line.startsWith("©nam")) { + Main.currBook.setName(line.substring(line.indexOf("=") + 1)); + line = reader.readLine(); + } else if (line.startsWith("©ART")) { + Main.currBook.setArtist(line.substring(line.indexOf("=") + 1)); + line = reader.readLine(); + } else if (line.startsWith("©alb")) { + Main.currBook.setAlbum(line.substring(line.indexOf("=") + 1)); + line = reader.readLine(); + } else { + line = reader.readLine(); + } + } + //
    + if (error) { + //Show error log + errorText = errorText.concat("
Prüfen Sie, ob die Dateien funktionsfähige *.m4a Dateien und im Ordner der POD Datei vorhanden sind."); + JOptionPane.showMessageDialog(this, errorText, "Fehler", JOptionPane.ERROR_MESSAGE); + } + + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } catch (IOException ex) { + ex.printStackTrace(); + } + repaintAll(); + } + + /** + * Auto called. Checks wether a POD file in the target folder exists + */ + public void checkPOD() { + try { + if (new File(Main.currBook.getTargetFolder().getPath() + "/" + NameField.getText() + ".POD").exists()) { + createAudiobookButton.setEnabled(true); + } else { + createAudiobookButton.setEnabled(false); + } + } catch (Exception ex) { + createAudiobookButton.setEnabled(false); + } + } + + /** + * Auto called. Updates the Chapters List. + */ + public void renameChapter() { + Chapter c = Main.currBook.get(ChaptersList.getSelectedIndex()); + c.setTitle(titleField.getText()); + } + + /** + * Creates a new TreeModel with all loaded chapters and sets it as active model + */ + public void updateChaptersList() { + DefaultListModel model = new DefaultListModel(); + for (Object chapter : Main.currBook) { + model.addElement(chapter); + } + ChaptersList.setModel(model); + ChaptersList.repaint(); + } + + /** + * Sets data of all components by their related variables + */ + public void repaintAll() { + updateChaptersList(); + CoverField.setText(Main.currBook.getImageFile() == null ? "" : Main.currBook.getImageFile().getPath()); + NameTag.setText(Main.currBook.getName().equals("") ? "..." : Main.currBook.getName()); + AlbumTag.setText(Main.currBook.getAlbum().equals("") ? "..." : Main.currBook.getAlbum()); + ArtistTag.setText(Main.currBook.getArtist().equals("") ? "..." : Main.currBook.getArtist()); + FolderField.setText(Main.currBook.getTargetFolder().getPath()); + checkPOD(); + } + // + DropTargetListener listDrop; + DropTargetListener coverFieldDrop; + DropTargetListener targetDirDrop; + DropTargetListener mainDrop; + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JMenuItem AboutMenuItem; + private javax.swing.JLabel AlbumTag; + private javax.swing.JLabel AlbumTagLabel; + private javax.swing.JLabel ArtistTag; + private javax.swing.JLabel ArtistTagLabel; + private javax.swing.JPanel BookPropPanel; + private javax.swing.JPanel ChapterPropPanel; + private javax.swing.JList ChaptersList; + private javax.swing.JRadioButton CopyRadioButton; + private javax.swing.JTextField CoverField; + private javax.swing.JLabel CoverLabel; + private javax.swing.JCheckBox DeleteFiles; + private javax.swing.JMenuItem ExitMenuItem; + private javax.swing.JLabel FileLabel; + private javax.swing.JMenu FileMenu; + private javax.swing.JScrollPane FilesScrollPane; + private javax.swing.JTextField FolderField; + private javax.swing.JMenu HelpMenu; + private javax.swing.JTextField NameField; + private javax.swing.JLabel NameTag; + private javax.swing.JLabel NameTagLabel; + private javax.swing.JButton RemoveCoverButton; + private javax.swing.JButton SearchCoverButton; + private javax.swing.JButton SearchFolderButton; + private javax.swing.JButton SortButton; + private javax.swing.JMenu SpecialMenu; + private javax.swing.JLabel TargetDirLabel; + private javax.swing.JLabel TitleLabel; + private javax.swing.ButtonGroup buttonGroup; + private javax.swing.JButton createAudiobookButton; + private javax.swing.JMenuItem createChapterProfileMenuItem; + private javax.swing.JButton createPodFileButton; + private javax.swing.JButton downButton; + private javax.swing.JButton editTagsButton; + private javax.swing.JTextField fileField; + private javax.swing.JPopupMenu.Separator jSeparator1; + private javax.swing.JMenuItem loadPODFileMenuItem; + private javax.swing.JMenuBar menuBar; + private javax.swing.JRadioButton moveRadioButton; + private javax.swing.JButton openFilesButton; + private javax.swing.JMenuItem openFilesMenuItem; + private javax.swing.JButton removeButton; + private javax.swing.JTextField titleField; + private javax.swing.JButton upButton; + private javax.swing.JButton useProfile; + // End of variables declaration//GEN-END:variables + // +} diff --git a/src/audiobook/ProgressDialog.form b/src/audiobook/ProgressDialog.form new file mode 100755 index 0000000..1e01692 --- /dev/null +++ b/src/audiobook/ProgressDialog.form @@ -0,0 +1,74 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/audiobook/ProgressDialog.java b/src/audiobook/ProgressDialog.java new file mode 100755 index 0000000..f7389ff --- /dev/null +++ b/src/audiobook/ProgressDialog.java @@ -0,0 +1,102 @@ +package audiobook; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JProgressBar; + +/** + * This class represents a simple dialog containing a progress bar and two labels + * @author Kim + * @see JProgressBar + * @see JLabel + */ +public class ProgressDialog extends javax.swing.JDialog implements PropertyChangeListener { + + /** Creates new form ProgressDialog */ + public ProgressDialog(java.awt.Frame parent, boolean modal) { + super(parent, modal); + setLocationRelativeTo(parent); + initComponents(); + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + progressBar = new javax.swing.JProgressBar(); + ActionLabel = new javax.swing.JLabel(); + MessageLabel = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); + setTitle(".POD Datei erstellen"); + + ActionLabel.setText("ActionLabel"); + + MessageLabel.setText("MessageLabel"); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, 424, Short.MAX_VALUE) + .addComponent(ActionLabel) + .addComponent(MessageLabel)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(ActionLabel) + .addGap(18, 18, 18) + .addComponent(MessageLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + @Override + public void propertyChange(PropertyChangeEvent evt) { + switch(evt.getPropertyName()){ + case "ActionLabel": + ActionLabel.setText(evt.getNewValue().toString()); + break; + case "MessageLabel": + MessageLabel.setText(evt.getNewValue().toString()); + break; + case "Maximum": + progressBar.setMaximum(Integer.parseInt(evt.getNewValue().toString())); + break; + case "ProgressValue": + progressBar.setValue(Integer.parseInt(evt.getNewValue().toString())); + break; + case "Error": + JOptionPane.showMessageDialog(this, evt.getNewValue(), "Fehler", JOptionPane.ERROR_MESSAGE); + break; + case "Finish": + if(Boolean.parseBoolean(evt.getNewValue().toString())){ + JOptionPane.showMessageDialog(this, "Prozess erfolgreich abgeschlossen", "Fertig", JOptionPane.INFORMATION_MESSAGE); + } else{ + JOptionPane.showMessageDialog(this, "Der Prozess konnte nicht abgeschlossen werden.", "Fehler", JOptionPane.INFORMATION_MESSAGE); + } + setVisible(false); + dispose(); + break; + } + } + // + // Variables declaration - do not modify//GEN-BEGIN:variables + public javax.swing.JLabel ActionLabel; + public javax.swing.JLabel MessageLabel; + public javax.swing.JProgressBar progressBar; + // End of variables declaration//GEN-END:variables + // +} diff --git a/src/audiobook/audiobook.png b/src/audiobook/audiobook.png new file mode 100755 index 0000000..bbd575d Binary files /dev/null and b/src/audiobook/audiobook.png differ diff --git a/src/audiobook/audiobook_icon.png b/src/audiobook/audiobook_icon.png new file mode 100755 index 0000000..5a1289a Binary files /dev/null and b/src/audiobook/audiobook_icon.png differ diff --git a/src/audiobook/audiobook_icon2.png b/src/audiobook/audiobook_icon2.png new file mode 100755 index 0000000..21a2634 Binary files /dev/null and b/src/audiobook/audiobook_icon2.png differ diff --git a/src/audiobookMaker.java b/src/audiobookMaker.java deleted file mode 100755 index 1449ca9..0000000 --- a/src/audiobookMaker.java +++ /dev/null @@ -1,319 +0,0 @@ -//~--- 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 deleted file mode 100755 index a8c8f97..0000000 --- a/src/audiobookMakerPro.java +++ /dev/null @@ -1,385 +0,0 @@ -//~--- 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 deleted file mode 100755 index 837af33..0000000 --- a/src/frame/JHyperLink.java +++ /dev/null @@ -1,150 +0,0 @@ -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 deleted file mode 100755 index 1933fb0..0000000 --- a/src/frame/JLink.java +++ /dev/null @@ -1,180 +0,0 @@ -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 deleted file mode 100755 index e9d8a2f..0000000 --- a/src/frame/JScreenLine.java +++ /dev/null @@ -1,65 +0,0 @@ -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 diff --git a/ssa_setup105a.exe b/ssa_setup105a.exe new file mode 100755 index 0000000..f48cab3 Binary files /dev/null and b/ssa_setup105a.exe differ diff --git a/test/Image.bmp b/test/Image.bmp new file mode 100755 index 0000000..210fb66 Binary files /dev/null and b/test/Image.bmp differ diff --git a/test/Image.jpg b/test/Image.jpg new file mode 100755 index 0000000..8c815ff Binary files /dev/null and b/test/Image.jpg differ diff --git a/test/Image.png b/test/Image.png new file mode 100755 index 0000000..fa8ddd0 Binary files /dev/null and b/test/Image.png differ diff --git a/test/Profile.html b/test/Profile.html new file mode 100755 index 0000000..baeaa11 --- /dev/null +++ b/test/Profile.html @@ -0,0 +1,21 @@ + + + Profile erstellen + + +

Kapitelprofile

+ Kapitelprofile sind Textdateien. Im Prinzip wird der Text darin genauso in jedes Kapitel als Name eingesetzt, allerdings besteht die Möglichkeit variable Textblöcke einzusetzten. + Diese haben folgende Formatierung: <%Name> bzw. <%Name<Parametername='Wert' Parameter2='Wert2'>>

+ Alle Zeilen vor dem eigentlichen Profil müssen mit "#" anfangen und werden als Information bei der Kapitelprofil Auswahl angezeigt. Die erste Zeile, die nicht mit "#" beginnt, ist das Profil. Weitere Zeilen werden nicht übernommen + Mögliche Blöcke: +

    +
  • <%filePath> - Dateipfad des Kapitels
  • +
  • <%fileName<showExtention='true|false'>> - Der Dateiname mit oder ohne Endung
  • +
  • <%number<formatted='true|false'>> - Tracknummer im Hörbuch. Wenn formatted='true', dann werden die Nummern formatiert: 001, 002...
  • +
  • <%tag<id='title|album|artist|album_artist|track|composer'>> - Ein Tag aus der Datei (title: Titel, album: Albumname, artist: Interpret, album_artist: Albuminterpret, track: Tracknummer, composer: Komponist)
  • +
  • <%advancedFileName<sepText='' index=''>> - Ein Teil des Dateinamens. Die Teile werden durch sepText getrennt und der benutzte Teil im index angegebn. Wenn der index mit "#" endet werden alle Teile ab dort übernommen
  • +
+ + Im Ordner Profile finden Sie fertige Profile. + + \ No newline at end of file diff --git a/test/Readme+Guide.html b/test/Readme+Guide.html new file mode 100755 index 0000000..f6a8b19 --- /dev/null +++ b/test/Readme+Guide.html @@ -0,0 +1,68 @@ + + + + Audiobook Maker + + + Bitte komplett lesen! +

Readme

+

Installation

+ Wichtig: Dieses Programm ist nur auf Windows-Betriebssystemen vollständig nutzbar.
+ Um den Audiobook Maker benuzen zu können, muss der Slideshow Assembler von JR Learns Media installiert sein. Um diesen zu installieren führen Sie die ssa_setup105a.exe mit einem Doppelklick aus und folgen Sie den Anweisungen. + Es ist wichtig, dass der Slideshow Assembler in der PATH Umgebungsvariable eingetragen wurde. Überprüfen Sie dies, indem Sie zu den Umgebungsvariablen navigieren (Systemsteuerung --> System --> Erweitert --> Umgebungsvariablen) und bei + der PATH Variable auf bearbeiten klicken. Suchen Sie in dem unteren Textfeld nach Dem Verzeichnis, in das Sie den Slideshow Assembler installiert haben(z.B. C:\Programme\Slideshow Assembler\). Wenn dieser Eintrag nicht vorhanden ist, fügen + Sie am Ende des Variablenwertes ";C:\Programme\Slideshow Assambler\"(bzw. Das Verzeichnis, in welches der Slideshow Assambler installiert wurde) ohne Anführungszeichen hinzu.
+ Nach der Installation müssen Sie ihren Computer neu starten.

+ + Da der Audiobook Maker Java benutzt müssen Sie Java installieren(Das JRE)

+ + Um den Audiobook Maker zu installieren führen Sie die Audiobook Maker Installationsdatei aus.

+ + Getestet auf Windows XP Professional 32bit mit und Java 7

+ +

Guide

+ Der Guide gibt ein Beispiel, wie ein Hörbuch erstellt werden kann. Bei vielen Schritten ist Drag-and-Drop unterstützt. Mit [] gekennzeichnete Schritte sind optional. + + Image.png + +
    +
  1. Dateien auswählen (3) (Es werden Alle Dateien in ausgewählten Ordnern und Unterordnern hinzugefügt)
  2. +
  3. [Die Kapitel automatisch umbenennen (-->Kapitelprofile) oder sortieren lassen (2)]
  4. +
  5. [Die Kapitel manuell sortieren (4) / manuell umbenennen (5) (Wird automatisch übernommen)]
  6. +
  7. [Eine Coverdatei für das Hörbuch angeben (7)]
  8. +
  9. Den Ordner für Die Dateien auswählen (7)
  10. +
  11. Angeben, ob die ausgewählten Dateien (1) in den Zielordner (7) kopiert oder verschoben werden sollen
  12. +
  13. [Tags für das Hörbuch angeben (9) (Es kann sein, dass die Tags nicht übernommen werden)]
  14. +
  15. Einen Namen für das Hörbuch auswählen und die .POD Datei erstellen. Im Anschluss daran kann das Hörbuch erstellt werden
  16. +
+

+ +

Geplantes

+
    +
  • Automatisches Konvertieren vom anderen Formaten
  • +
  • Fehler von SSA abfangen
  • +
  • SSA Ausgabe anzeigen
  • +
+ +

Bekannte Bugs

+
    +
  • Wenn bei SSA ein Fehler auftritt, wird trotzdem der Dialog "Prozess erfolgreich abgeschlossen" angezeigt
  • +
+ +

Version 3

+
    +
  • Möglichkeit aus einer langen Datei ein Hörbuch zu erstellen
  • +
  • Dateiunabhängige Zeiten
  • +
+ + +

Links

+ + + diff --git a/test/Readme.html b/test/Readme.html new file mode 100755 index 0000000..d0872f5 --- /dev/null +++ b/test/Readme.html @@ -0,0 +1,92 @@ + + + Readme/Tutorial + + + Bitte komplett lesen! +

Readme

+

Installation

+ Wichtig: Dieses Programm ist nur auf Windows-Betriebssystemen vollständig nutzbar.
+ Um den Audiobook Maker benuzen zu können, muss der Slideshow Assembler von JR Learns Media installiert sein. Um diesen zu installieren führen Sie die ssa_setup105a.exe mit einem Doppelklick aus und folgen Sie den Anweisungen. + Es ist wichtig, dass der Slideshow Assembler in der PATH Umgebungsvariable eingetragen wurde. Überprüfen Sie dies, indem Sie zu den Umgebungsvariablen navigieren (Systemsteuerung --> System --> Erweitert --> Umgebungsvariablen) und bei + der PATH Variable auf bearbeiten klicken. Suchen Sie in dem unteren Bereich nach Dem Verzeichnis, in das Sie den Slideshow Assembler installiert haben(z.B. C:\Programme\Slideshow Assembler\). Wenn dieser Eintrag nicht vorhanden ist, fügen + Sie am Ende des Variablenwertes ";C:\Programme\Slideshow Assambler\"(bzw. Das Verzeichnis, in welches der Slideshow Assambler installiert wurde) ohne Anführungszeichen hinzu.
+ Nach der Installation müssen Sie ihren Computer neu starten.

+ + Da der Audiobook Maker Java benutzt müssen Sie Java installieren(Das JRE)

+ + Nachdem Sie den Slideshow Assembler und Java installiert haben, entpacken Sie die Datei "Audiobook Maker.jar" und den Ordner "lib" an einen beliebigen Ort. Wenn der Ordner lib nicht existiert, erstellen Sie einen neuen Ordner im Verzeichnis der Audiobook Maker.jar und nennen Sie ihn lib. Extrahieren Sie nun alle Dateien, die auf .jar enden (Außer Audiobook Maker.jar) in den lib Ordner. Nun ist Die Intallation abgeschlossen.

+ + Getestet auf Windows XP Professional 32bit mit Java 6 und Java 7 + +

Allgemeines

+ Der Audiobook Maker benutzt den Slideshow Assembler von JR Learns Media um iTunes Hörbücher (*.m4b) aus .m4a Dateien zu erstellen. + +

Tutorial

+ Der Audiobook Maker benutzt Java. Um ihn mit einem einfachen Doppelklick zu starten müssen Sie im Kontextmenu (Rechtsklick) unter "Öffnen mit" Das Programm "javaw" aus dem bin Ordner von Java auswählen (Standartmäßig C:\Programme\Java\jre7\bin\javaw.exe). + Image.png + +

Das Fenster

+

1

+ Hier werden Die Dateien angezeigt, die zu einem Hörbuch zusammengefügt werden Sollen. + +

2

+ Hier können Sie eine Textdatei auswählen, die als Kapitelprofil verwendet werden soll. Es werden nur die Namen der Kapitel verändert, die schon geladen wurden[1]. + +

3

+ Hier können weitere Dateien hinzugefügt werden. Diese werden entweder einzeln ausgewählt, oder es werden Alle .m4a Dateien eines Ordners hinzugefügt. + +

4

+ Mit dieses Buttons können Sie die Dateien (und somit Kapitel) sortieren und bei Bedarf wieder entfernen. + +

5

+ Wenn in der Liste [1] ein Kapitel ausgewählt ist kann hier unter "Titel" der Angezeigte Kapitelname bearbeitet werden. + +

6

+ Wenn Sie den Kapitelnamen [5] bearbeitet haben müssen Sie die mit dem OK Button bestätigen. + +

7

+ Hier können das Cover für das Hörbuch, sowie der Zielordner, in den das Hörbuch und die einzelnen Dateien kommen sollen, ausgewählt werden. + +

8

+ Hier können Sie auswählen, ob die Dateien in der Liste [1] in den Zielordner [7] kopiert oder verschoben werden sollen. Wenn sich alle Dateien im Zielordner [7] befinden, ist es egal, welcher Punkt selektiert ist. + +

9

+ Hier können Sie über den Button die Tags des Hörbuches editieren. Es kann sein, dass die Tags nicht übernommen werden. Wenn dies der Fall ist, editieren Sie die Tags bei iTunes einfach manuell. + +

10

+ In dem "Name"-Feld wird der Name des Hörbuches eingetragen. Dieser Name wird auch für die .POD Datei und die Hörbuch Datei benutzt. Mit den Buttons werden die .POD Datei, bzw. das Hörbuch aus einer .POD Datei erstellt. +
Wichtig: Um ein Hörbuch zu erstellen, muss erst eine .POD Datei erstellt worden sein +

+ +

Die Menuleiste

+ +

Datei

+ Dateien hinzufügen[3]/Beenden + +

Spezial

+ Der Menupunkt in diesem Menu öffnet einen einfachen Texteditor, welcher die Moglichkeit bietet, entsprechende Formatierungen für Kapitelprofile hinzuzufügen. Natürlich kann auch ein normaler Texteditor verwendet werden. (--> Kapitelprofile) +

+ +

Tipps

+ Die Dateien müssen im AAC Format (Dateiendung *.m4a) vorliegen. Tun Sie das nicht können Sie in den Importeinstellungen von iTunes den Codierer umstellun und die CD importieren. Wenn die Dateien bereits auf dem PC vorhanden sind, können Sie sie auswählen und über das iTunes-Menu "Erweitert" eine "AAC-Version erstellen".

+ Der Audiobook Maker benutzt die kopier-möglichkeiten von Java, welche ein ganzes Stück langsamer sind, als die Windows eigenen. Daher ist es ratsam die Dateien schon vorher in den Zielordner [7] zu legen und von dort hinzuzufügen [3]. + Sollten Sie die kopier- bzw. verschiebe-methode des Audiobook Makers verwenden, sollten Sie wissen, dass der Fortschrittsbalken nur komplette Dateien vermerkt. Um einen detaillierteren Fortschritt zu sehen, navigieren Sie in das Zielverzeichnis [7]. + Hier kann man nun ca. alle 0.7 MByte einen Fortschritt an der Dateigröße sehen(Angaben stimmen nicht unbedingt).

+ Es ist auch möglich den Audiobook Maker als grafische Oberfläche zum erstellen eines Hörbuches aus einer .POD Datei mit dem Slideshow Assembler zu nutzen. Dazu reicht es den Zielordner [7] auszuwählen (dort muss sich die .POD Datei befinden) und den Dateinamen, der .POD Datei (ohne Endung) im "Name"-Feld [9] einzutragen. + Um dann das tatsächliche Hörbuch zu erstellen muss man nur noch auf den "Hörbuch erstellen"-Button [9] klicken. () +

+ +

Geplantes

+
    +
  • Eigeben von Tags (Interpret, Album, ...) im Programm ermöglichen
  • +
+ +

Links

+ + + diff --git a/test/changelog.txt b/test/changelog.txt new file mode 100755 index 0000000..7c9e4ac --- /dev/null +++ b/test/changelog.txt @@ -0,0 +1,50 @@ +Audiobook Maker - Changelog + +Version 2.0 Beta +-Das Layout wurde komplett Überarbeitet +-Der Audiobook Maker kopiert nun selbstständig die Dateien in einen Ordner +-Einzelne Kapitel können nun umbenannt werden + +Version 2.1 Beta +-Kapitelprofile können nun angewendet werden um die Kapitel gleichzeitig umzubenennen +-Die Menuleiste wurde hinzugefügt +-Der "Hörbuch erstellen" Button ist nun nur verfügbar, wenn im Zielordner eine .POD Datei mit eingegebenem Namen vorhanden ist + +Version 2.2 Beta +-Ein integrierter Editor für Kapitelprofile wurde hinzugefügt + +Version 2.3 Beta +-Die Geschwindigkeit zum Kopieren der Dateien wurde stark erhöht +-Die Tags des Hörbuches können bearbeitet werden +-Das Cover muss nicht mehr angegeben werden + +Version 2.4 Beta +-Die Kapitel können nun automatisch sortiert werden +-Beim Hinzufügen von Dateien wird der zuletzt aufgerufene Ordner beim folgenden Mal als Startordner benutzt +-Beim Hinzufügen von Dateien können nun sowohl Dateien als auch Ordner ausgewählt werden +-Wenn ein Verzeichnis hinzugefügt wird, werden nun alle passenden Dateien im Ordner und allen Unterordnern hinzugefügt +-Es besteht die Möglichkeit, einige der Tags aus den Kapiteldateien auszulesen und als Kapitelnamen zu verwenden + +Version 2.5 Beta +-Beim manuellen umbenennen der Kapitel muss nun nicht mehr bestätigt werden +-Beim Anwenden eines Kapitelprofils wurde der Startordner geändert +-Beim Anwenden eines Kapitelprofils werden nun alle Kapitel verändert, wenn keins ausgewählt ist + +Version 2.6 Beta +-Vorschau für Kapitelprofile hinzugefügt +-Kapitelprofil Editor hat einige neue Funktionen +-Kapitelprofil Editor wurde verbessert +-Dateien können nun automatisch nach Erstellen des Hörbuchs gelöscht werden +-Einige neue Profile wurden hinzugefügt +-Drag-and-Drop Unterstützung wurde hinzugefügt +-Sonderzeichen werden aus Dateinamen entfernt, da SSA diese Zeichen nicht unterstützt + +Version 2.7 Beta +-POD Dateien können jetzt geladen werden +-Es wir jetzt beim Verlassen nach dem Erstellen einer POD Datei gefragt +-Dateien, die nur aus Sonderzeichen bestehen, werden nun nicht mehr gelöscht +-Die Metadata in der POD Datei wird nun nur in die Datei geschrieben, wenn mindestens ein Eintrag genutzt wird + +Version 2.8 Beta +-Es können nun mehrere Dateien in der Liste gleichzeitig verschoben werden +-Drag-and-Drop Unterstützung für POD Dateien hinzugefügt \ No newline at end of file