package dnb.analyze.nfo;
import static dnb.analyze.nfo.NfoLyzer.ARTIST;
import static dnb.analyze.nfo.NfoLyzer.GENRE;
import static dnb.analyze.nfo.NfoLyzer.LINE_BEGIN;
import static dnb.analyze.nfo.NfoLyzer.LINE_END;
import static dnb.analyze.nfo.NfoLyzer.PATTERN_FLAGS;
import static dnb.analyze.nfo.NfoLyzer.TITLE;
import static dnb.analyze.nfo.NfoLyzer.WS;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import dnb.analyze.MatchResult;
public class SourNfoParser extends AbstractNfoParser {
private static final String LBRACE = Pattern.quote("(");
private static final String RBRACE = Pattern.quote(")");
private static final String BRACED_GROUP = LBRACE + WS + "(.*?)" + WS + RBRACE;
private static final String DBRACED_GROUP = LBRACE + WS + "(.*?)" + WS + BRACED_GROUP + WS + RBRACE;
private static final String RELEASE_DATE = "release date";
private static final String STREET_DATE = "street date";
private static final String MEDIA_TYPE = "media type";
private static final String RECORD_LABEL = "record label";
private static Pattern createSourPattern(String entry) {
return Pattern.compile(LINE_BEGIN + entry + WS + BRACED_GROUP
+ "(?!.*?" + RBRACE + ")" + LINE_END,
PATTERN_FLAGS);
}
private static String option(String name) {
return WS + name + WS + BRACED_GROUP;
}
private static final Pattern PATTERN_ARTIST = createSourPattern(ARTIST);
private static final Pattern PATTERN_TITLE = createSourPattern(TITLE);
private static final Pattern PATTERN_GENRE = createSourPattern(GENRE);
private static final Pattern PATTERN_RLS_DATE = createSourPattern(RELEASE_DATE);
private static final Pattern PATTERN_STREET_DATE = createSourPattern(STREET_DATE);
private static final Pattern PATTERN_MEDIATYPE = Pattern.compile(LINE_BEGIN + MEDIA_TYPE
+ option("vinyl") + option("tape") + option("cd") + option("radio") + LINE_END,
PATTERN_FLAGS);
private static final Pattern PATTERN_LABEL = Pattern.compile(
LINE_BEGIN + RECORD_LABEL + WS + DBRACED_GROUP + LINE_END,
PATTERN_FLAGS);
@Override protected Pattern getArtistPattern() { return PATTERN_ARTIST; }
@Override protected Pattern getTitlePattern() { return PATTERN_TITLE; }
@Override protected Pattern getGenrePattern() { return PATTERN_GENRE; }
@Override protected Pattern getReleaseDatePattern() { return PATTERN_RLS_DATE; }
@Override protected Pattern getStreetDatePattern() { return PATTERN_STREET_DATE; }
/* (non-Javadoc)
* @see dnb.analyze.nfo.NfoParser#parse(java.lang.String)
*/
public void parse(String nfo, Map<NfoField, MatchResult> result) {
// general, easy stuff
super.parse(nfo, result);
// sour specialties
Matcher m = PATTERN_LABEL.matcher(nfo);
if(m.find()) {
result.put(NfoField.RECORD_LABEL, new MatchResult(m.start(1), m.end(1), m.group(1),
MatchResult.Source.NFO));
parseLabelcode(m.group(2), m.start(2), result);
}
m = PATTERN_MEDIATYPE.matcher(nfo);
if(m.find()) { // find the whole option record => store groups as separate & KNOWN fields
result.put(NfoField.MEDIA_TYPE_VINYL, new MatchResult(m.start(1), m.end(1), m.group(1), MatchResult.Status.KNOWN,
MatchResult.Source.NFO));
result.put(NfoField.MEDIA_TYPE_TAPE, new MatchResult(m.start(2), m.end(2), m.group(2), MatchResult.Status.KNOWN,
MatchResult.Source.NFO));
result.put(NfoField.MEDIA_TYPE_CD, new MatchResult(m.start(3), m.end(3), m.group(3), MatchResult.Status.KNOWN,
MatchResult.Source.NFO));
result.put(NfoField.MEDIA_TYPE_RADIO, new MatchResult(m.start(4), m.end(4), m.group(4), MatchResult.Status.KNOWN,
MatchResult.Source.NFO));
}
}
}