/*
* RSSFeed - Azureus2 Plugin
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package org.kmallan.azureus.rssfeed;
import org.gudy.azureus2.plugins.download.Download;
import java.io.Serializable;
import java.util.regex.*;
public class FilterBean implements Serializable {
static final long serialVersionUID = -979691945084080240L;
private String name, storeDir, expression, category, type, mode;
private int state, priority, rateUpload, rateDownload, startSeason, startEpisode, endSeason, endEpisode;
private long filtId, urlId = 0;
private boolean isRegex, matchTitle, matchLink, moveTop, customRate, renameFile, renameIncEpisode, disableAfter, cleanFile, enabled;
private boolean smartHistory = true;
private String exprLower;
private Pattern exprPat;
public static Pattern epsnnenn_snnenn = Pattern.compile("(.*?)" + "s([0-9]+)e([0-9]+)[\\-\\+]s([0-9]+)e([0-9]+)" + ".*?");
public static Pattern epsnnenn_enn = Pattern.compile("(.*?)" + "s([0-9]+)e([0-9]+)[\\-\\+]e([0-9]+)" + ".*?");
public static Pattern epsnnenn_nn = Pattern.compile("(.*?)" + "s([0-9]+)e([0-9]+)[\\-\\+]([0-9]+)" + ".*?");
public static Pattern epsnnenn = Pattern.compile("(.*?)" + "s([0-9]+)e([0-9]+)" + ".*?");
public static Pattern epnnxnn_nnxnn = Pattern.compile("(.*?)" + "([0-9]+)x([0-9]+)[\\-\\+]([0-9]+)x([0-9]+)" + ".*?");
public static Pattern epnnxnn_nn = Pattern.compile("(.*?)" + "([0-9]+)x([0-9]+)[\\-\\+]([0-9]+)" + ".*?");
public static Pattern epnnxnn = Pattern.compile("(.*?)" + "([0-9]+)x([0-9]+)" + ".*?");
public static Pattern epnnnn_nn = Pattern.compile("(.*?)" + "([0-9]+)([0-9]{2})[\\-\\+]([0-9]{2})" + ".*?");
public static Pattern epnnnn = Pattern.compile("(.*?)" + "([0-9]+)([0-9]{2})" + ".*?");
public FilterBean() {
filtId = System.currentTimeMillis();
exprLower = "";
exprPat = Pattern.compile(".*" + exprLower + ".*");
}
public long getID() {
return filtId;
}
public void setID(long filtId) {
this.filtId = filtId;
}
public String getName() {
if(name == null) name = "";
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStoreDir() {
if(storeDir == null) storeDir = "";
return storeDir;
}
public void setStoreDir(String storeDir) {
this.storeDir = storeDir;
}
public String getExpression() {
if(expression == null) expression = "";
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
exprLower = expression.toLowerCase();
try {
exprPat = Pattern.compile(".*" + exprLower + ".*");
} catch (PatternSyntaxException e) {
exprPat = null;
}
}
public boolean getIsRegex() {
return isRegex;
}
public void setIsRegex(boolean isRegex) {
this.isRegex = isRegex;
}
public boolean getMatchTitle() {
return matchTitle;
}
public void setMatchTitle(boolean matchTitle) {
this.matchTitle = matchTitle;
}
public boolean getMatchLink() {
return matchLink;
}
public void setMatchLink(boolean matchLink) {
this.matchLink = matchLink;
}
public boolean getMoveTop() {
return moveTop;
}
public void setMoveTop(boolean moveTop) {
this.moveTop = moveTop;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public int getPriority() {
if(priority != Download.PR_HIGH_PRIORITY && priority != Download.PR_LOW_PRIORITY)
priority = Download.PR_HIGH_PRIORITY;
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public boolean getRateUseCustom() {
return customRate;
}
public void setRateUseCustom(boolean customRate) {
this.customRate = customRate;
}
public int getRateUpload() {
return rateUpload;
}
public void setRateUpload(int rateUpload) {
this.rateUpload = rateUpload;
}
public int getRateDownload() {
return rateDownload;
}
public void setRateDownload(int rateDownload) {
this.rateDownload = rateDownload;
}
public String getCategory() {
if(category == null) category = "";
return category;
}
public void setCategory(String category) {
this.category = category;
}
public long getFeed() {
return urlId;
}
public void setFeed(long urlId) {
this.urlId = urlId;
}
public String getType() {
if(type == null) type = "";
return type;
}
public void setType(String type) {
this.type = type;
}
public int getStartSeason() {
return startSeason;
}
public void setStartSeason(int startSeason) {
this.startSeason = startSeason;
}
public int getStartEpisode() {
return startEpisode;
}
public void setStartEpisode(int startEpisode) {
this.startEpisode = startEpisode;
}
public int getEndSeason() {
return endSeason;
}
public void setEndSeason(int endSeason) {
this.endSeason = endSeason;
}
public int getEndEpisode() {
return endEpisode;
}
public void setEndEpisode(int endEpisode) {
this.endEpisode = endEpisode;
}
public boolean getRenameFile() {
return renameFile;
}
public void setRenameFile(boolean renameFile) {
this.renameFile = renameFile;
}
public boolean getRenameIncEpisode() {
return renameIncEpisode;
}
public void setRenameIncEpisode(boolean renameIncEpisode) {
this.renameIncEpisode = renameIncEpisode;
}
public boolean getDisableAfter() {
return disableAfter;
}
public void setDisableAfter(boolean disableAfter) {
this.disableAfter = disableAfter;
}
public boolean getCleanFile() {
return cleanFile;
}
public void setCleanFile(boolean cleanFile) {
this.cleanFile = cleanFile;
}
public String getMode() {
if(mode == null) mode = "";
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public boolean getEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public boolean matches(long urlId, String title, String link) {
if(!getEnabled()) return false;
if(getFeed() != 0 && urlId != getFeed()) return false;
boolean matched = false;
if((getMatchTitle()) && (match(title))) matched = true;
else if((getMatchLink()) && (match(link))) matched = true;
if(!matched) return false;
if(getType().equalsIgnoreCase("TVShow") && getStartSeason() + getEndSeason() > 0) {
Episode e = getSeason(title);
if(e == null) e = getSeason(link);
if(e == null) return false;
if(getStartSeason() > 0 && getEndSeason() > 0) {
if(!e.inRange(getStartSeason(), getStartEpisode(), getEndSeason(), getEndEpisode())) return false;
} else if(getStartSeason() > 0) {
if(!e.isFrom(getStartSeason(), getStartEpisode())) return false;
} else {
if(!e.isUpto(getEndSeason(), getEndEpisode())) return false;
}
}
return true;
}
public static Episode getSeason(String str) {
str = str.toLowerCase();
Pattern lmp = Pattern.compile("(ht|f)tp:.*/(.*?)");
Matcher lmm = lmp.matcher(str);
if(lmm.matches()) str = lmm.group(2); // strip if url
String showTitle = "";
int seasonStart, seasonEnd, episodeStart, episodeEnd;
Episode e = null;
Matcher m = epsnnenn_snnenn.matcher(str);
if(!m.matches()) m = epsnnenn_enn.matcher(str);
if(!m.matches()) m = epsnnenn_nn.matcher(str);
if(!m.matches()) m = epsnnenn.matcher(str);
if(!m.matches()) m = epnnxnn_nnxnn.matcher(str);
if(!m.matches()) m = epnnxnn_nn.matcher(str);
if(!m.matches()) m = epnnxnn.matcher(str);
if(!m.matches()) m = epnnnn_nn.matcher(str);
if(!m.matches()) m = epnnnn.matcher(str);
if(!m.matches()) return null;
showTitle = stringClean(m.group(1));
switch(m.groupCount()) {
case 3:
seasonStart = Integer.parseInt(m.group(2));
episodeStart = Integer.parseInt(m.group(3));
e = new Episode(showTitle, seasonStart, episodeStart);
break;
case 4:
seasonStart = Integer.parseInt(m.group(2));
episodeStart = Integer.parseInt(m.group(3));
seasonEnd = Integer.parseInt(m.group(2));
episodeEnd = Integer.parseInt(m.group(4));
e = new Episode(showTitle, seasonStart, episodeStart, seasonEnd, episodeEnd);
break;
case 5:
seasonStart = Integer.parseInt(m.group(2));
episodeStart = Integer.parseInt(m.group(3));
seasonEnd = Integer.parseInt(m.group(4));
episodeEnd = Integer.parseInt(m.group(5));
e = new Episode(showTitle, seasonStart, episodeStart, seasonEnd, episodeEnd);
break;
}
return e;
}
private static String stringClean(String str) {
str = str.replaceAll("[ \\._\\-]+", " ");
str = str.replaceAll("\\[.*\\]", "");
str = str.trim();
if(!str.equals(str.toLowerCase())) return str;
String[] strp = str.split("[^\\w\\d]+");
for(int iLoop = 0; iLoop < strp.length; iLoop++) {
if(strp[iLoop].length() == 0) continue;
String c = String.valueOf(strp[iLoop].charAt(0));
String nstrp = strp[iLoop].replaceFirst(c, c.toUpperCase());
str = str.replaceAll(strp[iLoop], nstrp);
}
return str;
}
private boolean match(String matchee) {
if(getIsRegex()){
if ( exprPat == null ){
return( false ); // invalid expression, always fail
}
Matcher m = exprPat.matcher(matchee.toLowerCase());
return m.matches();
} else {
if(matchee.toLowerCase().indexOf(exprLower) >= 0) return true;
}
return false;
}
public boolean getUseSmartHistory() {
if("TVShow".equalsIgnoreCase(type)) return smartHistory;
else return true;
}
public void setUseSmartHistory(boolean smartHistory) {
this.smartHistory = smartHistory;
}
}