Exercise
MP3 reader
Objetive
ID3 specifications apply to any file or audiovisual container, but they are primarily used with audio containers. There are three compatible versions of the specification. For example, a file may contain both version 1.1 and version 2.0 tags simultaneously, and in this case, the media player must determine which tags are relevant.
ID3 version 1 is a very simple specification. It involves appending a fixed block size of 128 bytes to the end of the file in question. This block contains the following tags:
A header that identifies the presence of the ID3 block and its version. Specifically, this header comprises the characters "TAG".
Title: 30 characters.
Artist: 30 characters.
Album: 30 characters.
Year: 4 characters.
Comment: 30 characters.
Genre (music): 1 character.
All tags use ASCII characters, except for genre, which is an integer stored within a single byte. The musical genre associated with each byte is predefined in the standard definitions and includes 80 genres numbered from 0 to 79. Some tagging programs have expanded the predefined genres beyond 79.
Example Code
import java.util.*;
public class Main
{
public static void main(String[] args)
{
final int SIZE = 128;
byte[] data;
System.out.print("Enter name: ");
String name = new Scanner(System.in).nextLine();
if (!(new java.io.File(name)).isFile())
{
System.out.println("Not exists");
return;
}
try
{
java.io.FileInputStream file = File.OpenRead(name);
data = new byte[SIZE];
file.Seek(-128, SeekOrigin.End);
file.read(data, 0, SIZE);
file.close();
byte b1 = data[0];
byte b2 = data[1];
byte b3 = data[2];
if ((char)b1 != 'T' || (char)b2 != 'A' || (char)b3 != 'G')
{
System.out.println("not mp3 valid");
return;
}
int i = 3;
String title = "";
for (; i < 33; i++)
{
if (data[i] != 0)
{
title += (char)data[i];
}
}
String author = "";
for (i = 33; i < 63; i++)
{
if (data[i] != 0)
{
author += (char)data[i];
}
}
String album = "";
for (i = 63; i < 93; i++)
{
if (data[i] != 0)
{
album += (char)data[i];
}
}
String year = "";
for (i = 93; i < 97; i++)
{
if (data[i] != 0)
{
year += (char)data[i];
}
}
String comments = "";
for (i = 97; i < 127; i++)
{
if (data[i] != 0)
{
comments += (char)data[i];
}
}
System.out.println("Data of MP3:");
System.out.println("----------------------------");
System.out.println();
System.out.println("Title: " + title);
System.out.println("Author: " + author);
System.out.println("Album: " + album);
System.out.println("Year: " + year);
System.out.println("Comments: " + comments);
System.out.println("Genre: " + data[127]);
}
catch (RuntimeException e)
{
System.out.println("Error");
}
}
}