filebot/source/net/sourceforge/filebot/web/MovieFormat.java

97 lines
2.3 KiB
Java

package net.sourceforge.filebot.web;
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParseException;
import java.text.ParsePosition;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MovieFormat extends Format {
public static final MovieFormat NameYear = new MovieFormat(true, true, true);
private final boolean includeYear;
private final boolean includePartIndex;
private final boolean smart;
public MovieFormat(boolean includeYear, boolean includePartIndex, boolean smart) {
this.includeYear = includeYear;
this.includePartIndex = includePartIndex;
this.smart = smart;
}
@Override
public StringBuffer format(Object obj, StringBuffer sb, FieldPosition pos) {
// format episode object, e.g. Avatar (2009), Part 1
Movie movie = (Movie) obj;
sb.append(movie.getName());
if (includeYear) {
if (!smart || movie.getYear() > 0) {
sb.append(' ').append('(').append(movie.getYear()).append(')');
}
}
if (includePartIndex && movie instanceof MoviePart) {
MoviePart part = (MoviePart) movie;
if (!smart || part.partCount > 1) {
sb.append(", Part ").append(part.partIndex);
}
}
return sb;
}
private final Pattern moviePattern = Pattern.compile("([^\\p{Punct}]+?)[\\p{Punct}\\s]+(\\d{4})(?:[\\p{Punct}\\s]+|$)");
private final Pattern partPattern = Pattern.compile("(?:Part|CD)\\D?(\\d)$", Pattern.CASE_INSENSITIVE);
@Override
public Movie parseObject(String source, ParsePosition pos) {
String s = source;
Matcher m;
// extract part information first
int partIndex = -1;
int partCount = -1;
if ((m = partPattern.matcher(s)).find()) {
partIndex = Integer.parseInt(m.group(1));
s = m.replaceFirst("");
}
// parse movie information
if ((m = moviePattern.matcher(s)).matches()) {
String name = m.group(1).trim();
int year = Integer.parseInt(m.group(2));
Movie movie = new Movie(name, year, -1, -1);
if (partIndex >= 0) {
movie = new MoviePart(movie, partIndex, partCount);
}
// did parse input
pos.setIndex(source.length());
return movie;
}
// failed to parse input
pos.setErrorIndex(0);
return null;
}
@Override
public Movie parseObject(String source) throws ParseException {
return (Movie) super.parseObject(source);
}
}