/* This file is part of DrFTPD, Distributed FTP Daemon. * * Auteur : k2r * Email : k2r.contact@gmail.com * */ package net.k2rmods.plugins.irc.imdb; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sf.drftpd.FileExistsException; import net.sf.drftpd.event.Event; import net.sf.drftpd.util.ReplacerUtils; import org.apache.log4j.Logger; import org.drftpd.plugins.SiteBot; import org.drftpd.remotefile.LinkedRemoteFile; import org.drftpd.remotefile.LinkedRemoteFileInterface; import org.tanesha.replacer.ReplacerEnvironment; public class INFOParsing extends Thread { private static final Logger logger = Logger.getLogger(INFOParsing.class); private String _INFOurl; private LinkedRemoteFileInterface _link; private SiteBot _irc; private String _channel; private String _title = "N/A"; private String _director = "N/A"; private String _genre = "N/A"; private String _plot = "N/A"; private String _votes = "N/A"; private String _rating = "N/A"; private String _year = "N/A"; private String _url = "N/A"; public INFOParsing(LinkedRemoteFile link, NFOFile nfo, SiteBot bot, String channel) { _link = link; _irc = bot; _INFOurl = nfo.getURL(); _channel = channel; } public void run() { boolean isFind = false; if (_INFOurl != null && _INFOurl.indexOf("imdb") != -1) { getInfoIMDB(_INFOurl); isFind = true; } if (isFind == false) getInfoSIMPLE(_INFOurl); } public String getGenre() { return _genre; } public String getPlot() { return _plot; } public String getRating() { return _rating; } public String getTitle() { return _title; } public String getVotes() { return _votes; } public String getYear() { return _year; } public String getURL() { return _url; } public String getDirector() { return _director; } private void getInfoIMDB(String urlString) { try { URL url = new URL(urlString); URLConnection urlConn = url.openConnection(); if (!(urlConn.getContent() instanceof InputStream)) return; String data = ""; BufferedReader in = null; String line; try { in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); while ((line = in.readLine()) != null) data = data + line + "\n"; } finally { in.close(); } _url = urlString; _director = parseData(data, ">Directed by", ""); _title = parseData(data, "

", ""); _genre = parseData(data, "Genre:", "

"); _genre = _genre.replaceAll("\\(more\\)", "").trim(); _plot = parseData(data, "Plot Outline:", "Plot summary:", "User Rating:", ""); _rating = _rating.equals("N/A") || _rating.indexOf("/") < 0 ? "N/A" : _rating.substring(0, _rating.indexOf("/")); _votes = parseData(data, "User Rating:", "

"); _votes = _votes.indexOf("(") < 0 || _votes.indexOf("votes") < 0 ? "N/A" : _votes.substring(_votes.indexOf("(") + 1, _votes.indexOf("votes")).trim(); _year = parseData(data, "
") .substring(6); } catch (MalformedURLException e) { logger.error("IMDB malformed URL Exception"); } catch (IOException e) { logger.error("IMDB Exception : "+e.getMessage()); } String RepInfos = "[IMDB]-" + _genre + "_Score_" + _rating + "_With_" + _votes + "_Screens-[IMDB]"; if (RepInfos.indexOf(" / ") != -1) RepInfos = RepInfos.replaceAll(" / ", "."); try { _link.createDirectory("IMDB", "IMDB", RepInfos); } catch (FileExistsException e) {} _irc.say(_channel, ReplacerUtils.jprintf("imdb.announce.1", getEnv(), INFOParsing.class)); _irc.say(_channel, ReplacerUtils.jprintf("imdb.announce.2", getEnv(), INFOParsing.class)); _irc.say(_channel, ReplacerUtils.jprintf("imdb.announce.3", getEnv(), INFOParsing.class)); } private void getInfoSIMPLE(String urlString) { _url = urlString; _irc.say(_channel, ReplacerUtils.jprintf("simple.announce", getEnv(), INFOParsing.class)); } public ReplacerEnvironment getEnv() { ReplacerEnvironment env = new ReplacerEnvironment(SiteBot.GLOBAL_ENV); env.add("rlz", _link.getName()); env.add("director", getDirector()); env.add("title", getTitle()); env.add("genre", getGenre()); env.add("plot", getPlot()); env.add("rating", getRating()); env.add("votes", getVotes()); env.add("year", getYear()); env.add("url", getURL()); return env; } private String parseData(String data, String startText, String endText) { int start, end; start = data.indexOf(startText); if (start > 0) { start = start + startText.length(); end = data.indexOf(endText, start); return htmlToString(data.substring(start, end)).trim(); } return "N/A"; } private String htmlToString(String input) { String str = input.replaceAll("\n", ""); while (str.indexOf("<") != -1) { int startPos = str.indexOf("<"); int endPos = str.indexOf(">", startPos); if (endPos > startPos) { String beforeTag = str.substring(0, startPos); String afterTag = str.substring(endPos + 1); str = beforeTag + afterTag; } } String mbChar; String mbs = "&#(\\d+);"; StringBuffer sb = new StringBuffer(); Pattern pat = Pattern.compile(mbs); Matcher mat = pat.matcher(str); while (mat.find()) { mbChar = getMbCharStr(mat.group(1)); mat.appendReplacement(sb, mbChar); } mat.appendTail(sb); return new String(sb); } private String getMbCharStr(String digits) { char[] cha = new char[1]; try { int val = Integer.parseInt(digits); char ch = (char) val; cha[0] = ch; } catch (Exception e) { System.err.println("Error from getMbCharStr:"); e.printStackTrace(System.err); } return new String(cha); } public void actionPerformed(Event event) { if ("RELOAD".equals(event.getCommand())) { return; } } }