package org.lodder.subtools.sublibrary.control;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;
import org.lodder.subtools.sublibrary.util.NamedPattern;
import com.mifmif.common.regex.Generex;
public class VideoPatterns {
private List<NamedPattern> compiledPatterns = null;
private List<String> keys = null;
private String qualityRegex = null;
protected static final String[] QUALITYKEYWORDS = new String[] {"hdtv", "dvdrip", "bluray",
"1080p", "ts", "dvdscreener", "r5", "bdrip", "brrip", "720p", "xvid", "cam", "480p", "x264",
"1080i", "pdtv", "divx", "webrip", "h264", "rerip", "webdl"};
protected static final String[] QUALITYREGEXKEYWORDS = new String[] {"web[ .-]dl", "dd5[ .]1"};
public static final String[] EXTENSIONS = new String[] {"avi", "mkv", "wmv", "ts", "mp4", "m4v"};
// order is important!!!!!!
protected final static String[] PATTERNS =
new String[] {
// example:
// Back.to.the.Future.Part.II.1989.720p.BluRay.X264-AMIABLE.mkv
"(?<moviename>[\'\\w\\s:&()!.,_-]+)(?<part>Pt|Part|pt|part|Ep)(?<romanepisode>[I|V|X]+)[. ](?<year>19\\d{2}|20\\d{2})(?<description>[\'\\w\\s:&()!.,_-]+)",
"(?<moviename>[\'\\w\\s:&()!.,_-]+)(?<part>Pt|Part|pt|part|Ep)[.](?<romanepisode>[I|V|X]+)[. ](?<year>19\\d{2}|20\\d{2})(?<description>[\'\\w\\s:&()!.,_-]+)",
//The.Hunger.Games.Mockingjay.Part.1..2014.720p.BluRay.x264-SPARKS.mkv
"(?<moviename>[\'\\w\\s:&()!.,_-]+)(?<part>Pt|Part|pt|part|Ep)(?<partnumber>[\\d]{1})[. ](?<year>19\\d{2}|20\\d{2})(?<description>[\'\\w\\s:&()!.,_-]+)",
"(?<moviename>[\'\\w\\s:&()!.,_-]+)(?<part>Pt|Part|pt|part|Ep)[.](?<partnumber>[\\d]{1})[. ](?<year>19\\d{2}|20\\d{2})(?<description>[\'\\w\\s:&()!.,_-]+)",
// serie
"(?<seriesname>[\'\\w\\s:&()!.,_-]+)[Ss. _](?<seasonnumber>[\\d]{1,2})[XxEe]{1,2}(?<episodenumberstart>[\\d]{1,2})(?<episodebetween>[XxEe][\\d]{1,2})*[XxEe](?<episodenumberend>[\\d]{1,2})(?<description>[\'\\w\\s:&()!.,_-]+)",
"(?<seriesname>[\'\\w\\s:&()!.,_-]+)[Ss. _](?<seasonnumber>[\\d]{1,2})[XxEe]{1,2}(?<episodenumber>[\\d]{1,3})(?<description>[\'\\w\\s:&()!.,_-]+)",
// sXeX - Serienaam - Titel ex: S04E02 - White Collar - Most Wanted.mkv
"[Ss. _](?<seasonnumber>[\\d]{1,2})[XxEe]{1,2}(?<episodenumberstart>[\\d]{1,2})(?<episodebetween>[XxEe][\\d]{1,2})*[XxEe](?<episodenumberend>[\\d]{1,2})\\s?+-?\\s?+(?<seriesname>[\'\\w\\s:&()!.,_]+)\\s?+-?\\s?+(?<description>[\'\\w\\s:&()!.,_]+)",
"[Ss. _](?<seasonnumber>[\\d]{1,2})[XxEe]{1,2}(?<episodenumber>[\\d]{1,2})\\s?+-?\\s?+(?<seriesname>[\'\\w\\s:&()!.,_]+)\\s?+-?\\s?+(?<description>[\'\\w\\s:&()!.,_]+)",
// example: hawaii.five-0.2010.410.hdtv-lol.mp4
// example:
// Spartacus.Gods.of.The.Arena.Pt.I.720p.HDTV.X264-DIMENSION.mkv
"(?<seriesname>[\'\\w\\s:&()!.,_-]+)(?<part>Pt|Part|pt|part|Ep)(?<romanepisode>[I|V|X]+)(?<description>[\'\\w\\s:&()!.,_-]+)",
"(?<seriesname>[\'\\w\\s:&()!.,_-]+)(?<part>Pt|Part|pt|part|Ep)[.](?<romanepisode>[I|V|X]+)(?<description>[\'\\w\\s:&()!.,_-]+)",
"(?<seriesname>[\'\\w\\s:&()!.,_-]+)(?<part>Pt|Part|pt|part|Ep)(?<episodenumber>[\\d]{1,2})(?<description>[\'\\w\\s:&()!.,_-]+)",
"(?<seriesname>[\'\\w\\s:&()!.,_-]+)(?<part>Pt|Part|pt|part|Ep)[.](?<episodenumber>[\\d]{1,2})(?<description>[\'\\w\\s:&()!.,_-]+)",
// example hawaii.five-0.2010.410.hdtv-lol.mp4
"(?<seriesname>[\'\\w\\s:&()!.,_-]+)[. ](?<year>19\\d{2}|20\\d{2})[. ](?<season_episode>[\\d]{3,4})[. ](?<description>[\'\\w\\s:&()!.,_-]+)",
// format movietitle.year
"(?<moviename>[\'\\w\\s:&()!.,_-]+)[\\.|\\[|\\(| ]{1}(?<year>19\\d{2}|20\\d{2})(?<description>[\'\\w\\s:&()!.,_-]+)",
// format episode.0101.title
// format episode.101.title
// exclude format movietitle.720p
"(?<seriesname>[\'\\w\\s:&()!.,_-]+)[. ](?<season_episode>[\\d]{3,4})[. ](?<description>[\'\\w\\s:&()!.,_-]+)",
// format (2-11) Joey and the High School Friend
"[(](?<seasonnumber>[\\d]{1,2})[-](?<episodenumber>[\\d]{1,2})[) ](?<seriesname>[\'\\w\\s:&()!.,_-]+)[ ]and(?<description>[\'\\w\\s:&()!.,_-]+)",
"[(](?<seasonnumber>[\\d]{1,2})[-](?<episodenumber>[\\d]{1,2})[) ](?<seriesname>[\'\\w\\s:&()!.,_-]+)[ ]And(?<description>[\'\\w\\s:&()!.,_-]+)",
// take the rest and treat as movie
"(?<moviename>[\'\\w\\s:&()!.,_-]+)[\\.|\\[|\\(| ]{1}[720P|1080P](?<description>[\'\\w\\s:&()!.,_-]+)"
};
public VideoPatterns() {
buildQualityKeywordsList();
buildCompiledPatternList();
buildQualityKeywordsRegex();
}
public List<NamedPattern> getCompiledPatterns() {
return compiledPatterns;
}
public String getQualityKeysRegex() {
return qualityRegex;
}
public List<String> getQualityKeywords() {
return keys;
}
private void buildQualityKeywordsList() {
keys = new ArrayList<String>();
Collections.addAll(keys, QUALITYKEYWORDS);
keys.addAll(getQualityRegexKeywords());
}
private void buildCompiledPatternList() {
compiledPatterns = new ArrayList<NamedPattern>();
for (String p : PATTERNS) {
compiledPatterns.add(NamedPattern.compile(p, Pattern.CASE_INSENSITIVE));
}
}
private void buildQualityKeywordsRegex() {
StringBuilder sb = new StringBuilder();
String separator = "|";
sb.append("(");
if (VideoPatterns.QUALITYKEYWORDS.length > 0) {
sb.append(VideoPatterns.QUALITYKEYWORDS[0]);
for (int i = 1; i < VideoPatterns.QUALITYKEYWORDS.length; i++) {
sb.append(separator);
sb.append(VideoPatterns.QUALITYKEYWORDS[i]);
}
}
if (VideoPatterns.QUALITYREGEXKEYWORDS.length > 0) {
for (int i = 0; i < VideoPatterns.QUALITYREGEXKEYWORDS.length; i++) {
sb.append(separator);
sb.append(VideoPatterns.QUALITYREGEXKEYWORDS[i]);
}
}
sb.append(")");
qualityRegex = sb.toString();
}
private List<String> getQualityRegexKeywords() {
List<String> keys;
StringBuilder regex = new StringBuilder();
String separator = "|";
if (VideoPatterns.QUALITYREGEXKEYWORDS.length > 0) {
regex.append(VideoPatterns.QUALITYREGEXKEYWORDS[0]);
for (int i = 1; i < VideoPatterns.QUALITYREGEXKEYWORDS.length; i++) {
regex.append(separator);
regex.append(VideoPatterns.QUALITYREGEXKEYWORDS[i]);
}
}
Generex generex = new Generex(regex.toString());
keys = generex.getAllMatchedStrings();
return keys;
}
}