package org.cmc.music.myid3.examples; import java.io.File; import java.io.IOException; import java.util.Vector; import org.cmc.music.common.ID3ReadException; import org.cmc.music.metadata.IMusicMetadata; import org.cmc.music.metadata.MusicMetadata; import org.cmc.music.metadata.MusicMetadataSet; import org.cmc.music.myid3.MyID3; import org.cmc.music.myid3.id3v2.MyID3v2Frame; import org.cmc.music.util.Debug; import org.cmc.music.util.MyFileSystem; public class SampleUsage { /* * Example of how to use the simple interface to ID3 data. * * The simple interface hides the differences between version 1 and 2 tags, * and presents values as simple Java values. */ public void readID3Simple(File mp3File) throws IOException, ID3ReadException { if (!mp3File.getName().toLowerCase().endsWith(".mp3")) return; Debug.debug(); Debug.debug("file", mp3File); MusicMetadataSet src_set = new MyID3().read(mp3File); if (src_set == null) { Debug.debug("No id3 metadata found."); return; } /* * MusicMetadataSet aggregates the metadata parsed from ID3v1 and ID3v2 * tags, each whose data is represented by a MusicMetadata object. * * It also contains the "merged" MusicMetadata object, which tries to * cherrypick the "best" values from each source. * * The "merged" MusicMetadata's values are also "cleaned," ie. bad * values are discarded. */ Debug.debug("src_set", src_set); // dump all info. String artist = src_set.merged.getArtist(); Debug.debug("artist", artist); String album = src_set.merged.getAlbum(); Debug.debug("album", album); String songTitle = src_set.merged.getSongTitle(); Debug.debug("songTitle", songTitle); } /* * Example of how to specifically look at ID3v2 tag frames. * * This is not recommended; the "simple" interface is much easier to use. */ public void readID3v2Frames(File mp3File) throws IOException, ID3ReadException { if (!mp3File.getName().toLowerCase().endsWith(".mp3")) return; Debug.debug(); Debug.debug("file", mp3File); MusicMetadataSet src_set = new MyID3().read(mp3File); if (src_set == null) { Debug.debug("No id3 metadata found."); return; } Vector id3v2_frames = src_set.id3v2Raw.frames; // if (id3v2_frames.size() > 1) { MyID3v2Frame first_frame = (MyID3v2Frame) id3v2_frames.get(0); String frame_frame_id = first_frame.frameID; byte frame_frame_bytes[] = first_frame.dataBytes; Debug.debug("\t" + "frame_frame_id", frame_frame_id); Debug.debug("\t" + "frame_frame_bytes", frame_frame_bytes); } } public void readMP3Metadata(File mp3File) throws IOException, ID3ReadException { if (!mp3File.getName().toLowerCase().endsWith(".mp3")) return; Debug.debug(); Debug.debug("file", mp3File); MusicMetadataSet src_set = new MyID3().read(mp3File); if (src_set == null) { Debug.debug("No id3 metadata found."); return; } /* * MusicMetadataSet aggregates the metadata parsed from ID3v1 and ID3v2 * tags, each whose data is represented by a MusicMetadata object. * * It also contains the "merged" MusicMetadata object, which tries to * cherrypick the "best" values from each source. */ Debug.debug("src_set", src_set); // dump all info. Debug.debug("src_set", src_set.merged.getArtist()); Debug.debug("src_set", src_set.merged.getAlbum()); Debug.debug("src_set", src_set.merged.getSongTitle()); /* * Although the "merged" MusicMetadata is usually best, you can also * directly access the metadata from each tag. * * This includes the "raw" and "clean" versions. */ String id3v1_artist = src_set.id3v1Raw.values.getArtist(); String id3v1_artist_clean = src_set.id3v1Clean.getArtist(); String id3v2_artist = src_set.id3v2Raw.values.getArtist(); String id3v2_artist_clean = src_set.id3v2Clean.getArtist(); byte id3v1_tag_bytes[] = src_set.id3v1Raw.bytes; // tag bytes byte id3v2_tag_bytes[] = src_set.id3v2Raw.bytes; // tag bytes Vector id3v2_frames = src_set.id3v2Raw.frames; // if (id3v2_frames.size() > 1) { MyID3v2Frame first_frame = (MyID3v2Frame) id3v2_frames.get(0); String frame_frame_id = first_frame.frameID; byte frame_frame_bytes[] = first_frame.dataBytes; } } public static void fixMP3Files(File srcFolder, File dstFolder) throws Exception { Vector srcs = new MyFileSystem().getChildrenFiles(srcFolder); for (int i = 0; i < srcs.size(); i++) { File src = (File) srcs.get(i); if (!src.getName().toLowerCase().endsWith(".mp3")) continue; Debug.debug(); Debug.debug("file", src); File dst = new File(dstFolder, src.getName()); MusicMetadataSet src_set = new MyID3().read(src); if (src_set == null) { System.out.println("No id3 metadata found."); continue; } Debug.debug("src_set", src_set); // dump all info. Debug.debug("src_set", src_set.merged.getArtist()); Debug.debug("src_set", src_set.merged.getAlbum()); Debug.debug("src_set", src_set.merged.getSongTitle()); String id3v1_artist = src_set.id3v1Raw.values.getArtist(); String id3v2_artist = src_set.id3v2Raw.values.getArtist(); byte id3v1_tag_bytes[] = src_set.id3v1Raw.bytes; // tag bytes byte id3v2_tag_bytes[] = src_set.id3v2Raw.bytes; // tag bytes Vector id3v2_frames = src_set.id3v2Raw.frames; // if (id3v2_frames.size() > 1) { MyID3v2Frame first_frame = (MyID3v2Frame) id3v2_frames.get(0); String frame_frame_id = first_frame.frameID; byte frame_frame_bytes[] = first_frame.dataBytes; } new MyID3().write(src, dst, src_set, src_set.merged); if (dst.exists()) { MusicMetadataSet dst_set = new MyID3().read(dst); Debug.debug("dst_set", dst_set); String src_s = src_set.merged.toString(); String dst_s = dst_set.merged.toString(); if (!src_s.equals(dst_s)) { Debug.debug("mismatch src", src_s); Debug.debug("mismatch dst", dst_s); Debug.dumpStack(); } } } } /* * Example of how to set a field value (artist, in this case) to an mp3's * ID3 tags. * * This will add tags if they don't already exist. * * If the DO already exist, other field values are kept. * * Note that you must have a src and dst file. If you wish to update the * file, use a temporary file as your dst, and replace the src file with the * temp. */ public static void setFieldExample(File srcFile, File dstFile, String artist) throws Exception { // Since this is an example, I do no checking of parameters. MusicMetadataSet src_set = new MyID3().read(srcFile); IMusicMetadata metadataToWrite; if (src_set != null) { // The source file DID have an ID3v1 or ID3v2 tag (or both). // We'll update those values. metadataToWrite = src_set.merged; } else { // The file did not have an ID3v1 or ID3v2 tag, so // we need to add new tag(s). metadataToWrite = MusicMetadata.createEmptyMetadata(); } // here we set or update the artist field. metadataToWrite.setArtist(artist); new MyID3().write(srcFile, dstFile, src_set, metadataToWrite); } }