# Mp3-Attribute auslesen & beschreiben



## beastofchaos (22. Okt 2011)

Hallo Leute,
Ich möchte gerade eine App für meinen Compi basteln, in der ich einen Ordner auswähle und der Titel umbennant wird nach dem Muster "Künstler" - "Songtitel".

Die Frage ist, wie geh ich am leichtesten an das Problem ran. Hab einige Beiträge gefunden, in dem das thematisiert ist unter dem Namen "IDv3/4". Ich liste jetzt mal Links und meine Problem zu der Herangehensweise auf:

Also als erstes kennt man verbreitet die Freeware "jd3lib". Problem: Was soll ich jetzt mit der runtergeladenen Datei "jd2lib.jar" machen? (in Eclipse einbaun, genauso wie öffnen, geht nich^^)
* Java ID3 Tag Library
* id3v2.3.0 - ID3.org
* jd3Lib - Java ID3/MP3 Library | Free Audio & Video software downloads at SourceForge.net

Per FileInfo und Stream.
Noch nicht ausprobiert, aber klingt leicht:
* MP3-Titelinformationen mit .NET auslesen

Per AudioFileFormat (geht nicht!):
*http://www.java-forum.org/java-basics-anfaenger-themen/90445-mp3-file-attribute-auslesen.html

Per DataInputStream, Buffer und soweiter:
*MP3 IDV3 Tags auslesen @ tutorials.de: Tutorials, Forum & Hilfe (2. Post)


Also ich hab jetzt wegen Problem bei den anderen Sachen das letzte Beispiel genommen und hab es meinen Bedürfnis entsprechend anpassen können. Ich versteh zwar noch nicht 100% alles im Quellcode, aber es funktioniert, so wie ich es will und zählt für die private Anwendung. Mein Quellcode häng ich mal ganz am Ende ins Post-Scriptum.
Zu dem Beispiel, es gibt bei IDV für die einzelnen Attribute jeweils "Schlüssel", die nach Ausprobieren so gehen:

-Titel: "TIT2"
-Jahr: "TYER"
-Lied: "APIC" (unverständliches Gebrabbel)
-Kommentar: "COMM"
-Album: "TALB"
-Albuminterpret: "TPE2"
-Mitwirkender Interpret: "TPE1"

Ich brauche für meine Bedürfnis eigentlich nur Titel, Albuminterpret und Mitw. Interpret. Das auslesen funktioniert in meinem Quellcode auch alles suppi und ich konnte schon Titel, etc. als String speichern, damit alles zu Editierung der Datei bereitsteht. Die Frage ist nun, nachdem ich per DataInputStream nur  auslesen kann, wie ich denn in diesem Buchstabensalat auch was schreiben kann? (DataOutputStram? Und wie?).

Meinetwegen lass ich mich auch zu einer leichteren Lösung bereit schlagen, solange es mir wie einem 1.Klässler erklärt wird )

Gruß und Dankeschön für zukünftige Hilfe (oh ja, ihr werdet mir helfen! ^-^), Thomas

PS: Hier der ganze Quellcode (Layout-Sachen sind teilweise ausgelassen)
 - Wichtig ist die untere Methode "editFile()":

```
package main;

import java.awt.BorderLayout;
[...]
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class ChangerFrame extends JFrame implements ActionListener{
	private JFileChooser chooser;
	private JTextField fieldPath;
	private JButton buttonSearch;
	
	private JButton buttonOk;
	
	
	public ChangerFrame(){
		super();
		setAlwaysOnTop(true);
		Container cont = getContentPane();		
		[...]
		cont.add(panel);
	}


	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == buttonSearch){
			chooser.setDialogTitle("Wo liegen die zu aktualisierenden Lieder?");
			if (fieldPath.getText().length() > 0){
				try{
					chooser.setSelectedFile(new File(fieldPath.getText()));
				}catch(Exception ex){}
			}
			chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
			int result = chooser.showOpenDialog(this);
			switch(result){
			case JFileChooser.APPROVE_OPTION:
				fieldPath.setText(chooser.getSelectedFile().getPath());
				break;
			case JFileChooser.CANCEL_OPTION:
				fieldPath.setText("");
				break;
			}
		}
		else if (e.getSource() == buttonOk){
			editFile(chooser.getSelectedFile());
		}
	}
	
	private void editFile(File file){
		if (file == null){
			return;
		}
		
		File[] fileArray = file.listFiles();
		for (File f: fileArray){
			try {
				String fileInterpret = "";            // Keyword: TPE1
				String fileTitle = "";                // Keyword: TIT2
				String fileAlbumInterpret = "";       // Keyword: TPE2
				
				if (!f.getPath().endsWith(".mp3")){
					continue;
				}
				DataInputStream dis = new DataInputStream(new FileInputStream(f));
	            dis.skipBytes(10);
	            while(true){
	                byte[] b = new byte[4];
	                dis.read(b);
	                String keyword = new String(b);
	                
	                int frameBodySize = dis.readInt();
	                if (frameBodySize == 0)
	                    break;
	                
	                dis.readShort();
	                
	                byte[] textBuffer = new byte[frameBodySize];
	                dis.read(textBuffer);
	 
	                StringBuffer buffer = new StringBuffer();
	                for (int i = 0; i < textBuffer.length; i++) {
	                    if (textBuffer[i] == 0)
	                        continue;
	 
	                    if (keyword.startsWith("T")) {
	                        if (i < 1)
	                            continue;
	                    }
	 
	                    buffer.append((char) textBuffer[i]);
	                }
	                
	                if (keyword.equals("TPE1")){
	                	fileInterpret = buffer.toString();
	                }
	                else if (keyword.equals("TPE2")){
	                	fileAlbumInterpret = buffer.toString();
	                	
	                }
	                else if (keyword.equals("TIT2")){
	                	fileTitle = buffer.toString();
	                }
	                
	                System.out.println("Keyword: " + keyword);
	                System.out.println("Inhalt: " + buffer.toString());
	                System.out.println("_______________________");
	            }
	            
	            actualizeFile(f, fileInterpret, fileAlbumInterpret, fileTitle);
	            
			} catch(Exception e) {}
		}
	}
	
	public void actualizeFile(File f, String interpret, String albumInterpret, String title){
		renameFile(f, interpret + " - " + title);
		// TO DO ???????????
	}
	
	public void renameFile(File source, String name){
		
		File destination = new File(source.getParent() + "\\" + name + ".mp3");
		// Datei wird umbenannt/verschoben
		if(!source.renameTo(destination)){
		    System.err.println("Fehler beim Umbenennen der Datei: " + source.getName());
		}
	}
}
```

EDIT: Die "renameFile"-Methode funktioniert leider nicht, sprich renameTo() gibt mir false zurück. Wisst ihr wieso?


----------



## pl4gu33 (22. Okt 2011)

beastofchaos hat gesagt.:


> EDIT: Die "renameFile"-Methode funktioniert leider nicht, sprich renameTo() gibt mir false zurück. Wisst ihr wieso?



gibt getParent() vll. Null zurück ? 

hier ne andere Lösung: 


```
File myfile=new File("TEST.mp3");
		try {
			myfile.createNewFile();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
		String path=myfile.getAbsolutePath();
		int stelle=path.lastIndexOf("\\");
		String newPath=path.substring(0, stelle)+"\\hallo.mp3";
		File newFile=new File(newPath);
		myfile.renameTo(newFile);
```

hier auch nen Link mit nem Beispiel dazu:

Getting the Parents of a Filename Path | Example Depot


----------



## beastofchaos (22. Okt 2011)

Also da ich mein File per JFileChooser auswählen lasse, glaub ich das nicht. Ich habs im Compiler durchlaufen lassen und konnte sehen, dass bei beiden ein "realistischer" Pfad ist. Ich hab mal ein Beispiel-Lied einfach a genannt. Mein Programm will nun daran das Shema "Interpret" - "Titel" anwenden. Im Debugger funktioniert alles, Namensgebung und alles ist richtig. Und trotzdem gibt mir renameTo "false" zurück.  Ich glaubs zwar nicht, aber liegt das iwie an Windows7  
Probiert doch einmal bitte den Code bei euch aus.

Gruß, Thomas

Edit: Wo ist eig der Unterschied zwischen getAbsolutPath(), getCanceledPath() und getPath()? Im Debugger kommt bei mir immer das selbe raus.

Edit2: Problem gefunden! Ich muss vorher in "editFile()" den DataInputStream auch wieder closen. Namen werden nun also nach dem Shema geändert. Jetzt frag ich mich nur noch, wie ich jetzt zum Beispiel den AlbumInterpret verändern kann. Vll. wäre hierfür doch so eine Freeware ganz gut, aber ich komm mit denen nicht klar, wie ich schon geschrieben habe :/


----------



## beastofchaos (24. Okt 2011)

Was wären denn noch Alternativen, wo man mit speziellen Klassen eine solche Datei beschreiben kann?

Habs zwar mit dem AudioFileFormat ausprobiert, aber das läuft bei mir iwie nicht... :/

Hab das jetzt mal als eine Art "Weckruf" geschrieben, da das Thema, glaub ich, sehr interessant ist und es sicher genügend Lösungen gibt 

Gruß, Thomas


----------



## FerFemNemBem (24. Okt 2011)

Halloechen,

ich bin mit jaudiotagger sehr zufrieden. Der wird auch noch relativ aktiv weiterentwickelt.

Gruss, FFNB.


----------



## beastofchaos (24. Okt 2011)

Auf der Seite "Download" gibts kein Angebot... (?)


----------



## FerFemNemBem (25. Okt 2011)

Halloechen,

stimmt ja. Das hat der Paul wohl vergessen. 
Ist mir selbst noch nie aufgefallen, da ich das bei mir als eigenes Projekt eingebunden habe. Schaust Du hier unter "trunk" - da findest Du die Sourcen...

Wenn Du das als Repository-URL angibst: "https://svn.java.net/svn/jaudiotagger~svn" kannst Du das Projekt fuer Dich auschecken.

Falls Dir das zuviel Aufwand ist, kann ichs Dir auch compilieren uns als "*.jar" zukommen lassen...

Das ist aber (meiner Meinung nach) die beste und vollstaendigste java-Implementierung in Sachen AudioTags (und ich habe lange gesucht und viele ausprobiert). Von daher lohnt sich der "Aufwand" das aus dem svn zu holen.

Gruss, FFNB.


----------

