com.moviejukebox.plugin.FilmwebPlugin Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of yamj Show documentation
Show all versions of yamj Show documentation
Static analysis of MovieJukebox project
/*
* Copyright (c) 2004-2012 YAMJ Members
* http://code.google.com/p/moviejukebox/people/list
*
* Web: http://code.google.com/p/moviejukebox/
*
* This software is licensed under a Creative Commons License
* See this page: http://code.google.com/p/moviejukebox/wiki/License
*
* For any reuse or distribution, you must make clear to others the
* license terms of this work.
*/
package com.moviejukebox.plugin;
import com.moviejukebox.model.Library;
import com.moviejukebox.model.Movie;
import com.moviejukebox.model.MovieFile;
import com.moviejukebox.tools.HTMLTools;
import com.moviejukebox.tools.PropertiesUtil;
import com.moviejukebox.tools.StringTools;
import com.moviejukebox.tools.SystemTools;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
public class FilmwebPlugin extends ImdbPlugin {
private static final Logger logger = Logger.getLogger(FilmwebPlugin.class);
private static final String logMessage = "FilmwebPlugin: ";
public static String FILMWEB_PLUGIN_ID = "filmweb";
// private static Pattern googlePattern = Pattern.compile(">(http://[^\"/?&]*filmweb.pl[^<\\s]*)");
private static Pattern googlePattern = Pattern.compile("(http://[^\"/?&]*filmweb.pl[^\"&<\\s]*)");
private static Pattern yahooPattern = Pattern.compile("http%3a(//[^\"/?&]*filmweb.pl[^\"]*)\"");
private static Pattern filmwebPattern = Pattern.compile("searchResultTitle\"? href=\"([^\"]*)\"");
private static Pattern nfoPattern = Pattern.compile("http://[^\"/?&]*filmweb.pl[^\\s<>`\"\\[\\]]*");
private String filmwebPreferredSearchEngine;
private int preferredPlotLength = PropertiesUtil.getIntProperty("plugin.plot.maxlength", "500");
private int preferredOutlineLength = PropertiesUtil.getIntProperty("plugin.outline.maxlength", "300");
public FilmwebPlugin() {
super(); // use IMDB if filmweb doesn't know movie
init();
}
@Override
public String getPluginID() {
return FILMWEB_PLUGIN_ID;
}
public String getFilmwebPreferredSearchEngine() {
return filmwebPreferredSearchEngine;
}
public void setFilmwebPreferredSearchEngine(String filmwebPreferredSearchEngine) {
this.filmwebPreferredSearchEngine = filmwebPreferredSearchEngine;
}
public int getPreferredOutlineLength() {
return preferredOutlineLength;
}
public void setPreferredOutlineLength(int preferredOutlineLength) {
this.preferredOutlineLength = preferredOutlineLength;
}
public int getPreferredPlotLength() {
return preferredPlotLength;
}
public void setPreferredPlotLength(int preferredPlotLength) {
this.preferredPlotLength = preferredPlotLength;
}
public void init() {
filmwebPreferredSearchEngine = PropertiesUtil.getProperty("filmweb.id.search", "filmweb");
try {
// first request to filmweb site to skip welcome screen with ad banner
webBrowser.request("http://www.filmweb.pl");
} catch (IOException error) {
logger.error(logMessage + "Error : " + error.getMessage());
}
}
@Override
public boolean scan(Movie mediaFile) {
String filmwebUrl = mediaFile.getId(FILMWEB_PLUGIN_ID);
if (StringTools.isNotValidString(filmwebUrl)) {
filmwebUrl = getFilmwebUrl(mediaFile.getTitle(), mediaFile.getYear());
mediaFile.setId(FILMWEB_PLUGIN_ID, filmwebUrl);
}
boolean retval;
if (StringTools.isValidString(filmwebUrl)) {
retval = updateMediaInfo(mediaFile);
} else {
// use IMDB if filmweb doesn't know movie
retval = super.scan(mediaFile);
}
return retval;
}
/**
* retrieve the filmweb url matching the specified movie name and year.
*/
public String getFilmwebUrl(String movieName, String year) {
if ("google".equalsIgnoreCase(filmwebPreferredSearchEngine)) {
return getFilmwebUrlFromGoogle(movieName, year);
} else if ("yahoo".equalsIgnoreCase(filmwebPreferredSearchEngine)) {
return getFilmwebUrlFromYahoo(movieName, year);
} else if ("none".equalsIgnoreCase(filmwebPreferredSearchEngine)) {
return Movie.UNKNOWN;
} else {
return getFilmwebUrlFromFilmweb(movieName, year);
}
}
/**
* retrieve the filmweb url matching the specified movie name and year. This routine is base on a yahoo request.
*/
private String getFilmwebUrlFromYahoo(String movieName, String year) {
try {
StringBuilder sb = new StringBuilder("http://search.yahoo.com/search?p=");
sb.append(URLEncoder.encode(movieName, "UTF-8"));
if (StringTools.isValidString(year)) {
sb.append("+%28").append(year).append("%29");
}
sb.append("+site%3Afilmweb.pl&ei=UTF-8");
String xml = webBrowser.request(sb.toString());
Matcher m = yahooPattern.matcher(xml);
if (m.find()) {
String id = "http:" + m.group(1);
if (id.endsWith("/cast")) {
return id.substring(0, id.length() - 5);
}
return id;
} else {
return Movie.UNKNOWN;
}
} catch (Exception error) {
logger.error(logMessage + "Failed retreiving filmweb url for movie : " + movieName);
logger.error(logMessage + "Error : " + error.getMessage());
return Movie.UNKNOWN;
}
}
/**
* retrieve the filmweb url matching the specified movie name and year. This routine is base on a google request.
*/
private String getFilmwebUrlFromGoogle(String movieName, String year) {
try {
StringBuilder sb = new StringBuilder("http://www.google.pl/search?hl=pl&q=");
sb.append(URLEncoder.encode(movieName, "UTF-8"));
if (StringTools.isValidString(year)) {
sb.append("+%28").append(year).append("%29");
}
sb.append("+site%3Afilmweb.pl");
String xml = webBrowser.request(sb.toString());
Matcher m = googlePattern.matcher(xml);
if (m.find()) {
return m.group(1);
} else {
return Movie.UNKNOWN;
}
} catch (Exception error) {
logger.error(logMessage + "Failed retreiving filmweb url for movie : " + movieName);
logger.error(logMessage + "Error : " + error.getMessage());
return Movie.UNKNOWN;
}
}
/**
* retrieve the filmweb url matching the specified movie name and year. This routine is base on a filmweb request.
*/
private String getFilmwebUrlFromFilmweb(String movieName, String year) {
try {
StringBuilder sb = new StringBuilder("http://www.filmweb.pl/search?q=");
sb.append(URLEncoder.encode(movieName, "UTF-8"));
if (StringTools.isValidString(year)) {
sb.append("&startYear=").append(year).append("&endYear=").append(year);
}
String xml = webBrowser.request(sb.toString());
Matcher m = filmwebPattern.matcher(xml);
if (m.find()) {
return "http://www.filmweb.pl" + m.group(1).trim();
} else {
return Movie.UNKNOWN;
}
} catch (Exception error) {
logger.error(logMessage + "Failed retreiving filmweb url for movie : " + movieName);
logger.error(logMessage + "Error : " + error.getMessage());
return Movie.UNKNOWN;
}
}
/**
* Scan web page for the specified movie
*/
protected boolean updateMediaInfo(Movie movie) {
try {
String xml = webBrowser.request(movie.getId(FilmwebPlugin.FILMWEB_PLUGIN_ID));
if (HTMLTools.extractTag(xml, "").contains("Serial") && !movie.isTVShow()) {
movie.setMovieType(Movie.TYPE_TVSHOW);
return Boolean.FALSE;
}
if (!movie.isOverrideTitle()) {
movie.setTitle(HTMLTools.extractTag(xml, "", 0, "()>"));
String metaTitle = HTMLTools.extractTag(xml, "og:title", "\">");
if (metaTitle.contains("/")) {
String originalTitle = HTMLTools.extractTag(metaTitle, "/", 0, "()><");
if (originalTitle.endsWith(", The")) {
originalTitle = "The " + originalTitle.substring(0, originalTitle.length() - 5);
}
movie.setOriginalTitle(originalTitle);
}
}
if (movie.getRating() == -1) {
movie.addRating(FILMWEB_PLUGIN_ID, parseRating(HTMLTools.getTextAfterElem(xml, "average")));
}
if (movie.getTop250() == -1) {
try {
movie.setTop250(Integer.parseInt(HTMLTools.extractTag(xml, "worldRanking", 0, ">.")));
} catch (NumberFormatException error) {
movie.setTop250(-1);
}
}
if (Movie.UNKNOWN.equals(movie.getDirector())) {
movie.addDirector(HTMLTools.getTextAfterElem(xml, "yseria:"));
}
if (Movie.UNKNOWN.equals(movie.getReleaseDate())) {
movie.setReleaseDate(HTMLTools.getTextAfterElem(xml, "filmPremiereWorld"));
}
if (Movie.UNKNOWN.equals(movie.getRuntime())) {
String runtime = HTMLTools.getTextAfterElem(xml, "czas trwania:");
movie.setRuntime(String.valueOf(StringTools.processRuntime(runtime)));
}
if (Movie.UNKNOWN.equals(movie.getCountry())) {
String country = StringUtils.join(HTMLTools.extractTags(xml, "produkcja:", ""), ", ");
if (country.endsWith(", ")) {
movie.setCountry(country.substring(0, country.length() - 2));
} else {
movie.setCountry(country);
}
}
if (movie.getGenres().isEmpty()) {
for (String genre : HTMLTools.extractTags(xml, "gatunek:", "premiera:", "")) {
if (!genre.isEmpty()) {
movie.addGenre(Library.getIndexingGenre(genre));
}
}
}
String plot = HTMLTools.removeHtmlTags(HTMLTools.extractTag(xml, "v:summary\">", ""));
if (StringTools.isValidString(plot)) {
if (Movie.UNKNOWN.equals(movie.getPlot())) {
movie.setPlot(StringTools.trimToLength(plot, preferredPlotLength));
}
if (Movie.UNKNOWN.equals(movie.getOutline())) {
movie.setOutline(StringTools.trimToLength(plot, preferredOutlineLength));
}
}
if (!movie.isOverrideYear()) {
String year = HTMLTools.getTextAfterElem(xml, "filmYear");
if (!Movie.UNKNOWN.equals(year)) {
year = year.replaceAll("[^0-9]", "");
}
movie.setYear(year);
}
if (movie.getCast().isEmpty()) {
List cast = HTMLTools.extractTags(xml, "castListWrapper", "", "v:starring", " ");
for (int i = 0; i < cast.size(); i++) {
cast.set(i, HTMLTools.removeHtmlTags(cast.get(i)).trim());
}
movie.setCast(cast);
}
if (movie.isTVShow()) {
updateTVShowInfo(movie, xml);
}
if (downloadFanart && StringTools.isNotValidString(movie.getFanartURL())) {
movie.setFanartURL(getFanartURL(movie));
if (StringTools.isValidString(movie.getFanartURL())) {
movie.setFanartFilename(movie.getBaseName() + fanartToken + ".jpg");
}
}
} catch (Exception error) {
logger.error(logMessage + "Failed retreiving filmweb informations for movie : " + movie.getId(FilmwebPlugin.FILMWEB_PLUGIN_ID));
logger.error(SystemTools.getStackTrace(error));
}
return Boolean.TRUE;
}
private int parseRating(String rating) {
try {
return Math.round(Float.parseFloat(rating.replace(",", ".")) * 10);
} catch (Exception error) {
return -1;
}
}
private String updateImdbId(Movie movie) {
String imdbId = movie.getId(IMDB_PLUGIN_ID);
if (StringTools.isNotValidString(imdbId)) {
imdbId = imdbInfo.getImdbId(movie.getTitle(), movie.getYear());
movie.setId(IMDB_PLUGIN_ID, imdbId);
}
return imdbId;
}
@Override
public void scanTVShowTitles(Movie movie) {
scanTVShowTitles(movie, null);
}
public void scanTVShowTitles(Movie movie, String mainXML) {
if (!movie.isTVShow() || !movie.hasNewMovieFiles()) {
return;
}
String filmwebUrl = movie.getId(FILMWEB_PLUGIN_ID);
if (StringTools.isNotValidString(filmwebUrl)) {
// use IMDB if filmweb doesn't know episodes titles
super.scanTVShowTitles(movie);
return;
}
try {
String xml = webBrowser.request(filmwebUrl + "/episodes");
boolean found = Boolean.FALSE;
boolean wasSeraching = Boolean.FALSE;
for (MovieFile file : movie.getMovieFiles()) {
if (!file.isNewFile() || file.hasTitle()) {
// don't scan episode title if it exists in XML data
continue;
}
int fromIndex = xml.indexOf("sezon " + movie.getSeason() + "<");
StringBuilder titleBuilder = new StringBuilder();
for (int part = file.getFirstPart(); part <= file.getLastPart(); ++part) {
wasSeraching = Boolean.TRUE;
String episodeName = HTMLTools.getTextAfterElem(xml, "odcinek " + part, 2, fromIndex);
if (!episodeName.equals(Movie.UNKNOWN)) {
if (titleBuilder.length() > 0) {
titleBuilder.append(Movie.SPACE_SLASH_SPACE);
}
titleBuilder.append(episodeName);
}
}
String title = titleBuilder.toString();
if (StringUtils.isNotBlank(title)) {
found = Boolean.TRUE;
file.setTitle(title);
}
}
if (wasSeraching && !found) {
// use IMDB if filmweb doesn't know episodes titles
updateImdbId(movie);
super.scanTVShowTitles(movie);
}
} catch (IOException error) {
logger.error(logMessage + "Failed retreiving episodes titles for movie : " + movie.getTitle());
logger.error(logMessage + "Error : " + error.getMessage());
}
}
protected void updateTVShowInfo(Movie movie, String mainXML) throws IOException {
scanTVShowTitles(movie, mainXML);
}
@Override
public boolean scanNFO(String nfo, Movie movie) {
super.scanNFO(nfo, movie); // use IMDB if filmweb doesn't know movie
logger.debug(logMessage + "Scanning NFO for filmweb url");
Matcher m = nfoPattern.matcher(nfo);
boolean found = Boolean.FALSE;
while (m.find()) {
String url = m.group();
if (!url.endsWith(".jpg") && !url.endsWith(".jpeg") && !url.endsWith(".gif") && !url.endsWith(".png") && !url.endsWith(".bmp")) {
found = Boolean.TRUE;
movie.setId(FILMWEB_PLUGIN_ID, url);
}
}
if (found) {
logger.debug(logMessage + "Filmweb url found in NFO = " + movie.getId(FILMWEB_PLUGIN_ID));
} else {
logger.debug(logMessage + "No filmweb url found in NFO !");
}
return found;
}
}