FileDocCategorySizeDatePackage
FSParser.javaAPI DocMyID3 for Android5044Wed Oct 08 18:09:38 BST 2008org.cmc.music.fs

FSParser.java

/**
 * 
 */

/*
 * Modified By Romulus U. Ts'ai
 * On Oct 6, 2008
 * 
 * Removed all Debug executions
 * 
 */

package org.cmc.music.fs;

import java.io.File;

import org.cmc.music.clean.NameRectifier;
import org.cmc.music.metadata.MusicMetadata;
import org.cmc.music.myid3.TagFormat;
import org.cmc.music.util.TextUtils;

public abstract class FSParser
{

	private static final TagFormat utils = new TagFormat();

	private static final NameRectifier nameRectifier = new NameRectifier();

	public static final ParsedFilename parseFolder(File file)
	{
		return parseFolder(file.getName());
	}

	public static final ParsedFilename parseFolder(String s)
	{
		ParsedFilename result = new ParsedFilename(s);

		int hyphen_count = TextUtils.split(s, "-").length - 1;
		if (hyphen_count != 1)
			return result;

		String artist = s.substring(0, s.indexOf('-'));
		String album = s.substring(s.indexOf('-') + 1);

		artist = nameRectifier.rectifyArtist(artist);
		album = nameRectifier.rectifyAlbum(album);

		if (artist == null && album == null)
			return result;

		result.setArtist(artist);
		result.setAlbum(album);

		return result;
	}

	public static final boolean isTrackNumber(String s)
	{
		if (s == null)
			return false;
		s = s.trim();

		if (s.length() < 1 || s.length() > 3)
			return false;

		if (TextUtils.kALPHABET.indexOf(s.charAt(0)) >= 0)
		{
			// first letter can be letter.
			s = s.substring(1);
			if (s.length() < 1)
				return false;
		}
		if (!TextUtils.filter(s, TextUtils.kALPHABET_NUMERALS).equals(s))
			return false;

		return true;
	}

	private static Number getTrackNumber(String s)
	{
		try
		{
			return Integer.valueOf(s);
		}
		catch (Throwable e)
		{

			return null;
		}
	}

	public static final MusicMetadata parseFilename(String fileName,
			String folderName)
	{
		if (fileName == null)
			return null;

		if (!fileName.toLowerCase().endsWith(".mp3"))
			return null;
		fileName = fileName.substring(0, fileName.length() - 4);

		String artist;
		String song_title;
		Number track_number;

		String splits[] = fileName.split("-");

		if (splits.length == 2)
		{
			if (FSParser.isTrackNumber(splits[0]))
			{
				artist = null;
				track_number = getTrackNumber(splits[0].trim());
				song_title = utils.processSongTitle(splits[1]);
			}
			else if (FSParser.isTrackNumber(splits[1]))
			{
				artist = null;
				song_title = utils.processSongTitle(splits[0]);
				track_number = getTrackNumber(splits[1].trim());
			}
			else
			{
				artist = utils.processArtist(splits[0]);
				song_title = utils.processSongTitle(splits[1]);
				track_number = null;
			}
		}
		else if (splits.length == 3)
		{
			if (FSParser.isTrackNumber(splits[0]))
			{
				track_number = getTrackNumber(splits[0].trim());
				artist = utils.processArtist(splits[1]);
				song_title = utils.processSongTitle(splits[2]);
			}
			else if (FSParser.isTrackNumber(splits[1]))
			{
				artist = utils.processArtist(splits[0]);
				track_number = getTrackNumber(splits[1].trim());
				song_title = utils.processSongTitle(splits[2]);
			}
			else
				return null;
		}
		else
			return null;




		if (FSParser.isTrackNumber(artist))
		{

			return null;
		}

		if (FSParser.isTrackNumber(song_title))
		{

			return null;
		}



		if (folderName != null && folderName.endsWith("(!)"))
			folderName = folderName.substring(0, folderName.length() - 3);

		String kVariousArtists = "Various Artists";
		String album = null;
		if (folderName != null && !folderName.startsWith("@"))
		{
			if (artist != null)
			{
				if (folderName.toLowerCase().startsWith(
						kVariousArtists.toLowerCase()))
					folderName = folderName.substring(kVariousArtists.length());
				else if (folderName.toLowerCase().startsWith(
						artist.toLowerCase()))
					folderName = folderName.substring(artist.length());
				else if (folderName.toLowerCase()
						.endsWith(artist.toLowerCase()))
					folderName = folderName.substring(0, folderName.length()
							- artist.length());
				else
				{

					return null;
				}



				album = utils.processAlbum(folderName);
			}
			else
			{
				int first_hyphen = folderName.indexOf('-');
				int last_hyphen = folderName.lastIndexOf('-');
				if (first_hyphen >= 0 && first_hyphen == last_hyphen)
				{
					artist = utils.processArtist(folderName.substring(0,
							first_hyphen));
					album = utils.processAlbum(folderName
							.substring(first_hyphen + 1));
				}
				else
					return null;
			}

		}




		if (artist == null)
			return null;
		if (artist.equalsIgnoreCase(kVariousArtists))
			artist = null;

		MusicMetadata result = new MusicMetadata("filename");

		result.setAlbum(album);
		result.setArtist(artist);
		result.setSongTitle(song_title);
		if (track_number != null)
			result.setTrackNumber(track_number);
		//		result.getTrackNumber()

		return result;
	}
}