From 54b27e69b7de3192720e9b6459b00d36b6351f48 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Sun, 4 Jan 2009 18:28:28 +0000 Subject: [PATCH] Changes: * added TheTVDB support * added ehcache to libs (now used in TheTVDBClient and TVRageClient) * Season spinner will remember unlocked value Refactoring: * renamed HtmlUtil to WebRequest * added getDocument() convenience methods to WebRequest * added lots of static imports (XPathUtil, WebRequest, FileBotUtil, ...) * TheTVDBClient and TVRageClient will throw SeasonOutOfBoundsException if for illegal season numbers * XPathUtil will wrap NodeList with NodeListDecorator instead of creating a new ArrayList * added DOM convenience methods to XPathUtil for performance reasons * formatting of episode number in EpisodeListClient, EpisodeListRequestProcesser will take care of this * added initial size to some StringBuilders --- build.xml | 1 + lib/ehcache.jar | Bin 0 -> 239715 bytes source/ehcache.xml | 136 +++++++ .../net/sourceforge/filebot/FileBotUtil.java | 6 +- source/net/sourceforge/filebot/Main.java | 9 +- .../filebot/resources/search.thetvdb.png | Bin 0 -> 1075 bytes .../sourceforge/filebot/torrent/Torrent.java | 2 +- .../filebot/ui/AbstractSearchPanel.java | 273 +++++++------ .../sourceforge/filebot/ui/FileBotWindow.java | 5 +- .../ui/NotificationLoggingHandler.java | 5 +- .../sourceforge/filebot/ui/SelectDialog.java | 2 +- .../panel/episodelist/EpisodeListPanel.java | 65 ++- .../panel/episodelist/SeasonSpinnerModel.java | 32 +- .../rename/NamesListTransferablePolicy.java | 4 +- .../ui/panel/rename/ValidateNamesDialog.java | 9 +- .../ui/panel/subtitle/SubtitlePanel.java | 18 +- .../filebot/ui/transfer/FileTransferable.java | 2 +- .../ui/transfer/LazyTextFileTransferable.java | 8 +- .../sourceforge/filebot/web/AnidbClient.java | 69 ++-- .../net/sourceforge/filebot/web/Episode.java | 61 ++- .../filebot/web/EpisodeListClient.java | 2 +- .../web/OpenSubtitlesSubtitleClient.java | 12 +- .../web/SeasonOutOfBoundsException.java | 39 ++ .../filebot/web/SubsceneSubtitleClient.java | 55 ++- .../filebot/web/SubtitleClient.java | 2 +- .../filebot/web/TVDotComClient.java | 53 ++- .../sourceforge/filebot/web/TVRageClient.java | 165 ++++---- .../filebot/web/TheTVDBClient.java | 373 ++++++++++++++++++ .../web/{HtmlUtil.java => WebRequest.java} | 74 ++-- source/net/sourceforge/tuned/XPathUtil.java | 84 ++-- .../filebot/web/AnidbClientTest.java | 8 +- .../filebot/web/TVDotComClientTest.java | 22 +- .../filebot/web/TVRageClientTest.java | 10 +- .../filebot/web/TheTVDBClientTest.java | 126 ++++++ .../sourceforge/filebot/web/WebTestSuite.java | 2 +- 35 files changed, 1268 insertions(+), 466 deletions(-) create mode 100644 lib/ehcache.jar create mode 100644 source/ehcache.xml create mode 100644 source/net/sourceforge/filebot/resources/search.thetvdb.png create mode 100644 source/net/sourceforge/filebot/web/SeasonOutOfBoundsException.java create mode 100644 source/net/sourceforge/filebot/web/TheTVDBClient.java rename source/net/sourceforge/filebot/web/{HtmlUtil.java => WebRequest.java} (73%) create mode 100644 test/net/sourceforge/filebot/web/TheTVDBClientTest.java diff --git a/build.xml b/build.xml index d3cbef28..19f338cb 100644 --- a/build.xml +++ b/build.xml @@ -111,6 +111,7 @@ + diff --git a/lib/ehcache.jar b/lib/ehcache.jar new file mode 100644 index 0000000000000000000000000000000000000000..0ddab5beb968a9795a1fab0d5ec05ea3b3a8e2f5 GIT binary patch literal 239715 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 + + + + + + + + + + + + + + + diff --git a/source/net/sourceforge/filebot/FileBotUtil.java b/source/net/sourceforge/filebot/FileBotUtil.java index fbef0680..f78cd352 100644 --- a/source/net/sourceforge/filebot/FileBotUtil.java +++ b/source/net/sourceforge/filebot/FileBotUtil.java @@ -14,12 +14,12 @@ import net.sourceforge.tuned.FileUtil; public final class FileBotUtil { - public static final String getApplicationName() { + public static String getApplicationName() { return "FileBot"; }; - public static final String getApplicationVersion() { + public static String getApplicationVersion() { return "1.9"; }; @@ -55,7 +55,7 @@ public final class FileBotUtil { public static String getEmbeddedChecksum(String string) { - Matcher matcher = FileBotUtil.EMBEDDED_CHECKSUM_PATTERN.matcher(string); + Matcher matcher = EMBEDDED_CHECKSUM_PATTERN.matcher(string); String embeddedChecksum = null; // get last match diff --git a/source/net/sourceforge/filebot/Main.java b/source/net/sourceforge/filebot/Main.java index 46a84be7..d14fd32c 100644 --- a/source/net/sourceforge/filebot/Main.java +++ b/source/net/sourceforge/filebot/Main.java @@ -1,4 +1,7 @@ + package net.sourceforge.filebot; + + import java.util.logging.Level; import java.util.logging.Logger; import java.util.prefs.BackingStoreException; @@ -21,10 +24,10 @@ public class Main { */ public static void main(String... args) { - setupLogging(); - final ArgumentBean argumentBean = handleArguments(args); + setupLogging(); + try { // UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); // UIManager.setLookAndFeel("a03.swing.plaf.A03LookAndFeel"); @@ -82,7 +85,7 @@ public class Main { if (argumentBean.isClear()) { // clear preferences try { - Preferences.userNodeForPackage(FileBotUtil.class).removeNode(); + Preferences.userNodeForPackage(Main.class).removeNode(); } catch (BackingStoreException e) { Logger.getLogger("global").log(Level.SEVERE, e.toString(), e); } diff --git a/source/net/sourceforge/filebot/resources/search.thetvdb.png b/source/net/sourceforge/filebot/resources/search.thetvdb.png new file mode 100644 index 0000000000000000000000000000000000000000..e662966fe493e000d9376c227b3619404a315eed GIT binary patch literal 1075 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJdx@v7EBg%|E)i9Q0JlRdKq2uG z*NBqf{Irtt#G+INcOMs^F$!g=MGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1 z$iT3%pZiZDD+2>FLx4|+tAMsuL*KLuS8sgy^m)SEB?S$g=bwZbc!btWaSKSvPbjKc ze=I;y*Py7|g-KqwV}S?1w!zWcA=2hXF7eixO-^m|JQS>rJ(H~ivTRS>4Q-k2zV@)c zWst8^jMalDPZccP7p&fR;P`2Wu%!S0|1-$yf}Ar7MnhoGgn(!tB{gC`(1UT!u|g}TW2rqv^V*Y80oO*N`?5sOR~4W8E(1F`r-M5zpu3v z{L<9K-{)tYoKg2T&tmR;rlel2^mB##6YJ8|*w^w+^ fileMap = (Map) fileMapObject; List pathList = (List) fileMap.get("path"); - StringBuilder pathBuilder = new StringBuilder(); + StringBuilder pathBuilder = new StringBuilder(80); String entryName = null; Iterator iterator = pathList.iterator(); diff --git a/source/net/sourceforge/filebot/ui/AbstractSearchPanel.java b/source/net/sourceforge/filebot/ui/AbstractSearchPanel.java index ef93fd90..8a64f4bf 100644 --- a/source/net/sourceforge/filebot/ui/AbstractSearchPanel.java +++ b/source/net/sourceforge/filebot/ui/AbstractSearchPanel.java @@ -2,7 +2,7 @@ package net.sourceforge.filebot.ui; -import static javax.swing.JTabbedPane.WRAP_TAB_LAYOUT; +import static javax.swing.JTabbedPane.SCROLL_TAB_LAYOUT; import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER; import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED; import static javax.swing.SwingConstants.TOP; @@ -43,7 +43,7 @@ public abstract class AbstractSearchPanel extends FileBotPanel { protected final JPanel tabbedPaneGroup = new JPanel(new MigLayout("nogrid, fill, insets 0")); - protected final JTabbedPane tabbedPane = new JTabbedPane(TOP, WRAP_TAB_LAYOUT); + protected final JTabbedPane tabbedPane = new JTabbedPane(TOP, SCROLL_TAB_LAYOUT); protected final HistoryPanel historyPanel = new HistoryPanel(); @@ -96,7 +96,7 @@ public abstract class AbstractSearchPanel extends FileBotPanel { protected abstract LabelProvider createSearchEngineLabelProvider(); - protected abstract RequestProcessor createRequestProcessor(); + protected abstract RequestProcessor createRequestProcessor(); public EventList getSearchHistory() { @@ -104,13 +104,12 @@ public abstract class AbstractSearchPanel extends FileBotPanel { } - private void search(RequestProcessor requestProcessor) { + private void search(RequestProcessor requestProcessor) { FileBotTab tab = requestProcessor.tab; - Request request = requestProcessor.request; tab.setTitle(requestProcessor.getTitle()); tab.setLoading(true); - tab.setIcon(searchTextField.getSelectButton().getLabelProvider().getIcon(request.getClient())); + tab.setIcon(requestProcessor.getIcon()); tab.addTo(tabbedPane); @@ -133,141 +132,18 @@ public abstract class AbstractSearchPanel extends FileBotPanel { }; - protected class Request { + private class SearchTask extends SwingWorker, Void> { - private final S client; - private final String searchText; + private final RequestProcessor requestProcessor; - public Request(S client, String searchText) { - this.client = client; - this.searchText = searchText; - } - - - public S getClient() { - return client; - } - - - public String getSearchText() { - return searchText; - } - - } - - - protected abstract class RequestProcessor { - - protected final R request; - - private FileBotTab tab; - - private SearchResult searchResult = null; - - private long duration = 0; - - - public RequestProcessor(R request, JComponent component) { - this.request = request; - this.tab = new FileBotTab(component); - } - - - public abstract Collection search() throws Exception; - - - public abstract Collection fetch() throws Exception; - - - public abstract void process(Collection elements); - - - public abstract URI getLink(); - - - public JComponent getComponent() { - return tab.getComponent(); - } - - - public SearchResult getSearchResult() { - return searchResult; - } - - - private void setSearchResult(SearchResult searchResult) { - this.searchResult = searchResult; - } - - - public String getStatusMessage(Collection result) { - return String.format("%d elements found", result.size()); - } - - - public String getTitle() { - if (searchResult != null) - return searchResult.getName(); - - return request.getSearchText(); - } - - - protected SearchResult chooseSearchResult(Collection searchResults) throws Exception { - - switch (searchResults.size()) { - case 0: - Logger.getLogger("ui").warning(String.format("\"%s\" has not been found.", request.getSearchText())); - return null; - case 1: - return searchResults.iterator().next(); - } - - // check if an exact match has been found - for (SearchResult searchResult : searchResults) { - if (request.getSearchText().equalsIgnoreCase(searchResult.getName())) - return searchResult; - } - - // multiple results have been found, user must select one - Window window = SwingUtilities.getWindowAncestor(AbstractSearchPanel.this); - - SelectDialog selectDialog = new SelectDialog(window, searchResults); - - configureSelectDialog(selectDialog); - - selectDialog.setVisible(true); - - // selected value or null if the dialog was canceled by the user - return selectDialog.getSelectedValue(); - } - - - protected void configureSelectDialog(SelectDialog selectDialog) { - selectDialog.setIconImage(TunedUtil.getImage(searchTextField.getSelectButton().getLabelProvider().getIcon(request.getClient()))); - } - - - public long getDuration() { - return duration; - } - - } - - - private class SearchTask extends SwingWorker, Void> { - - private final RequestProcessor requestProcessor; - - - public SearchTask(RequestProcessor requestProcessor) { + public SearchTask(RequestProcessor requestProcessor) { this.requestProcessor = requestProcessor; } @Override - protected Collection doInBackground() throws Exception { + protected Collection doInBackground() throws Exception { long start = System.currentTimeMillis(); try { @@ -288,7 +164,7 @@ public abstract class AbstractSearchPanel extends FileBotPanel { try { // choose search result - requestProcessor.setSearchResult(requestProcessor.chooseSearchResult(get())); + requestProcessor.setSearchResult(requestProcessor.chooseSearchResult(get(), SwingUtilities.getWindowAncestor(AbstractSearchPanel.this))); if (requestProcessor.getSearchResult() == null) { tab.close(); @@ -313,16 +189,15 @@ public abstract class AbstractSearchPanel extends FileBotPanel { } } - } private class FetchTask extends SwingWorker, Void> { - private final RequestProcessor requestProcessor; + private final RequestProcessor requestProcessor; - public FetchTask(RequestProcessor requestProcessor) { + public FetchTask(RequestProcessor requestProcessor) { this.requestProcessor = requestProcessor; } @@ -342,7 +217,6 @@ public abstract class AbstractSearchPanel extends FileBotPanel { @Override public void done() { FileBotTab tab = requestProcessor.tab; - Request request = requestProcessor.request; if (tab.isClosed()) return; @@ -353,8 +227,8 @@ public abstract class AbstractSearchPanel extends FileBotPanel { requestProcessor.process(elements); - String title = requestProcessor.getSearchResult().toString(); - Icon icon = searchTextField.getSelectButton().getLabelProvider().getIcon(request.getClient()); + String title = requestProcessor.getTitle(); + Icon icon = requestProcessor.getIcon(); String statusMessage = requestProcessor.getStatusMessage(elements); historyPanel.add(title, requestProcessor.getLink(), icon, statusMessage, String.format("%,d ms", requestProcessor.getDuration())); @@ -375,4 +249,123 @@ public abstract class AbstractSearchPanel extends FileBotPanel { } } + + protected static class Request { + + private final String searchText; + + + public Request(String searchText) { + this.searchText = searchText; + } + + + public String getSearchText() { + return searchText; + } + + } + + + protected abstract static class RequestProcessor { + + protected final R request; + + private FileBotTab tab; + + private SearchResult searchResult; + + private long duration = 0; + + + public RequestProcessor(R request, JComponent component) { + this.request = request; + this.tab = new FileBotTab(component); + } + + + public abstract Collection search() throws Exception; + + + public abstract Collection fetch() throws Exception; + + + public abstract void process(Collection elements); + + + public abstract URI getLink(); + + + public JComponent getComponent() { + return tab.getComponent(); + } + + + public SearchResult getSearchResult() { + return searchResult; + } + + + public void setSearchResult(SearchResult searchResult) { + this.searchResult = searchResult; + } + + + public String getStatusMessage(Collection result) { + return String.format("%d elements found", result.size()); + } + + + public String getTitle() { + if (searchResult != null) + return searchResult.getName(); + + return request.getSearchText(); + } + + + public Icon getIcon() { + return null; + } + + + protected SearchResult chooseSearchResult(Collection searchResults, Window window) throws Exception { + + switch (searchResults.size()) { + case 0: + Logger.getLogger("ui").warning(String.format("\"%s\" has not been found.", request.getSearchText())); + return null; + case 1: + return searchResults.iterator().next(); + } + + // check if an exact match has been found + for (SearchResult searchResult : searchResults) { + if (request.getSearchText().equalsIgnoreCase(searchResult.getName())) + return searchResult; + } + + // multiple results have been found, user must select one + SelectDialog selectDialog = new SelectDialog(window, searchResults); + + configureSelectDialog(selectDialog); + + selectDialog.setVisible(true); + + // selected value or null if the dialog was canceled by the user + return selectDialog.getSelectedValue(); + } + + + protected void configureSelectDialog(SelectDialog selectDialog) { + selectDialog.setIconImage(TunedUtil.getImage(getIcon())); + } + + + public long getDuration() { + return duration; + } + + } + } diff --git a/source/net/sourceforge/filebot/ui/FileBotWindow.java b/source/net/sourceforge/filebot/ui/FileBotWindow.java index e0043a85..51558a1e 100644 --- a/source/net/sourceforge/filebot/ui/FileBotWindow.java +++ b/source/net/sourceforge/filebot/ui/FileBotWindow.java @@ -2,6 +2,8 @@ package net.sourceforge.filebot.ui; +import static net.sourceforge.filebot.FileBotUtil.getApplicationName; + import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Image; @@ -19,7 +21,6 @@ import javax.swing.border.EmptyBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import net.sourceforge.filebot.FileBotUtil; import net.sourceforge.filebot.ResourceManager; import net.sourceforge.filebot.ui.panel.analyze.AnalyzePanel; import net.sourceforge.filebot.ui.panel.episodelist.EpisodeListPanel; @@ -42,7 +43,7 @@ public class FileBotWindow extends JFrame implements ListSelectionListener { public FileBotWindow() { - super(FileBotUtil.getApplicationName()); + super(getApplicationName()); setLocationByPlatform(true); setDefaultCloseOperation(EXIT_ON_CLOSE); diff --git a/source/net/sourceforge/filebot/ui/NotificationLoggingHandler.java b/source/net/sourceforge/filebot/ui/NotificationLoggingHandler.java index 686653f9..3e039bf7 100644 --- a/source/net/sourceforge/filebot/ui/NotificationLoggingHandler.java +++ b/source/net/sourceforge/filebot/ui/NotificationLoggingHandler.java @@ -2,6 +2,8 @@ package net.sourceforge.filebot.ui; +import static net.sourceforge.filebot.FileBotUtil.getApplicationName; + import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; @@ -10,7 +12,6 @@ import javax.swing.Icon; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; -import net.sourceforge.filebot.FileBotUtil; import net.sourceforge.filebot.ResourceManager; import net.sourceforge.tuned.ui.notification.MessageNotification; import net.sourceforge.tuned.ui.notification.NotificationManager; @@ -54,7 +55,7 @@ public class NotificationLoggingHandler extends Handler { private void show(String message, Icon icon, int timeout) { - notificationManager.show(new MessageNotification(FileBotUtil.getApplicationName(), message, icon, timeout)); + notificationManager.show(new MessageNotification(getApplicationName(), message, icon, timeout)); } diff --git a/source/net/sourceforge/filebot/ui/SelectDialog.java b/source/net/sourceforge/filebot/ui/SelectDialog.java index e4ddcdfd..74a8d73d 100644 --- a/source/net/sourceforge/filebot/ui/SelectDialog.java +++ b/source/net/sourceforge/filebot/ui/SelectDialog.java @@ -35,7 +35,7 @@ public class SelectDialog extends JDialog { private boolean valueSelected = false; - public SelectDialog(Window owner, Collection options) { + public SelectDialog(Window owner, Collection options) { super(owner, "Select", ModalityType.DOCUMENT_MODAL); setDefaultCloseOperation(DISPOSE_ON_CLOSE); diff --git a/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java b/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java index 127e8752..6b9d9dca 100644 --- a/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java +++ b/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java @@ -15,6 +15,7 @@ import java.util.Collection; import java.util.List; import javax.swing.AbstractAction; +import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JSpinner; import javax.swing.KeyStroke; @@ -33,6 +34,7 @@ import net.sourceforge.filebot.web.EpisodeListClient; import net.sourceforge.filebot.web.SearchResult; import net.sourceforge.filebot.web.TVDotComClient; import net.sourceforge.filebot.web.TVRageClient; +import net.sourceforge.filebot.web.TheTVDBClient; import net.sourceforge.tuned.ui.LabelProvider; import net.sourceforge.tuned.ui.SelectButton; import net.sourceforge.tuned.ui.SimpleLabelProvider; @@ -74,6 +76,7 @@ public class EpisodeListPanel extends AbstractSearchPanel { + protected static class EpisodeListRequestProcessor extends RequestProcessor { public EpisodeListRequestProcessor(EpisodeListRequest request) { super(request, new EpisodeListTab()); @@ -194,10 +208,37 @@ public class EpisodeListPanel extends AbstractSearchPanel fetch() throws Exception { - if (request.getSeason() != ALL_SEASONS) - return request.getClient().getEpisodeList(getSearchResult(), request.getSeason()); - else - return request.getClient().getEpisodeList(getSearchResult()); + Collection episodes; + + if (request.getSeason() != ALL_SEASONS) { + episodes = request.getClient().getEpisodeList(getSearchResult(), request.getSeason()); + } else { + episodes = request.getClient().getEpisodeList(getSearchResult()); + } + + // find max. episode number string length + int maxLength = 1; + + for (Episode episode : episodes) { + String num = episode.getEpisodeNumber(); + + if (num.matches("\\d+") && num.length() > maxLength) { + maxLength = num.length(); + } + } + + // pad episode numbers with zeros (e.g. %02d) so all episode numbers have the same number of digits + String format = "%0" + maxLength + "d"; + for (Episode episode : episodes) { + + try { + episode.setEpisodeNumber(String.format(format, Integer.parseInt(episode.getEpisodeNumber()))); + } catch (NumberFormatException e) { + // ignore + } + } + + return episodes; } @@ -241,6 +282,12 @@ public class EpisodeListPanel extends AbstractSearchPanel selectDialog) { super.configureSelectDialog(selectDialog); @@ -250,7 +297,7 @@ public class EpisodeListPanel extends AbstractSearchPanel { + protected static class EpisodeListTab extends FileBotList { public EpisodeListTab() { // set export handler for episode list diff --git a/source/net/sourceforge/filebot/ui/panel/episodelist/SeasonSpinnerModel.java b/source/net/sourceforge/filebot/ui/panel/episodelist/SeasonSpinnerModel.java index c6a87368..b59b5ce0 100644 --- a/source/net/sourceforge/filebot/ui/panel/episodelist/SeasonSpinnerModel.java +++ b/source/net/sourceforge/filebot/ui/panel/episodelist/SeasonSpinnerModel.java @@ -9,13 +9,17 @@ public class SeasonSpinnerModel extends SpinnerNumberModel { public static final int ALL_SEASONS = 0; + public static final int MAX_VALUE = 99; + + private Number valueBeforeLock = null; + public SeasonSpinnerModel() { - super(ALL_SEASONS, ALL_SEASONS, Integer.MAX_VALUE, 1); + super(ALL_SEASONS, ALL_SEASONS, MAX_VALUE, 1); } - public Integer getSeason() { + public int getSeason() { return getNumber().intValue(); } @@ -25,18 +29,28 @@ public class SeasonSpinnerModel extends SpinnerNumberModel { if (next < ALL_SEASONS) next = ALL_SEASONS; + else if (next > MAX_VALUE) + next = MAX_VALUE; setValue(next); } - public void lock(boolean lock) { - if (lock) { - setValue(ALL_SEASONS); - setMaximum(ALL_SEASONS); - } else { - setMaximum(Integer.MAX_VALUE); - } + public void lock(int value) { + valueBeforeLock = getNumber(); + setMinimum(value); + setMaximum(value); + setValue(value); } + + public void unlock() { + setMinimum(ALL_SEASONS); + setMaximum(MAX_VALUE); + + if (valueBeforeLock != null) { + setValue(valueBeforeLock); + valueBeforeLock = null; + } + } } diff --git a/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java b/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java index 9ab068e7..7eb7da14 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java @@ -5,6 +5,7 @@ package net.sourceforge.filebot.ui.panel.rename; import static net.sourceforge.filebot.FileBotUtil.LIST_FILE_EXTENSIONS; import static net.sourceforge.filebot.FileBotUtil.TORRENT_FILE_EXTENSIONS; import static net.sourceforge.filebot.FileBotUtil.containsOnly; +import static net.sourceforge.filebot.FileBotUtil.isInvalidFileName; import java.awt.datatransfer.Transferable; import java.io.BufferedReader; @@ -19,7 +20,6 @@ import java.util.logging.Logger; import javax.swing.SwingUtilities; -import net.sourceforge.filebot.FileBotUtil; import net.sourceforge.filebot.torrent.Torrent; import net.sourceforge.filebot.ui.panel.rename.entry.ListEntry; import net.sourceforge.filebot.ui.panel.rename.entry.StringEntry; @@ -60,7 +60,7 @@ class NamesListTransferablePolicy extends FilesListTransferablePolicy { List invalidEntries = new ArrayList(); for (ListEntry entry : entries) { - if (FileBotUtil.isInvalidFileName(entry.getName())) + if (isInvalidFileName(entry.getName())) invalidEntries.add(entry); } diff --git a/source/net/sourceforge/filebot/ui/panel/rename/ValidateNamesDialog.java b/source/net/sourceforge/filebot/ui/panel/rename/ValidateNamesDialog.java index a9e5f7c9..df8d4e41 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/ValidateNamesDialog.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/ValidateNamesDialog.java @@ -2,6 +2,9 @@ package net.sourceforge.filebot.ui.panel.rename; +import static net.sourceforge.filebot.FileBotUtil.INVALID_CHARACTERS_PATTERN; +import static net.sourceforge.filebot.FileBotUtil.validateFileName; + import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Graphics; @@ -21,7 +24,6 @@ import javax.swing.JScrollPane; import javax.swing.KeyStroke; import net.miginfocom.swing.MigLayout; -import net.sourceforge.filebot.FileBotUtil; import net.sourceforge.filebot.ResourceManager; import net.sourceforge.filebot.ui.panel.rename.entry.ListEntry; import net.sourceforge.tuned.ui.ArrayListModel; @@ -49,7 +51,7 @@ public class ValidateNamesDialog extends JDialog { JList list = new JList(new ArrayListModel(entries)); list.setEnabled(false); - list.setCellRenderer(new HighlightListCellRenderer(FileBotUtil.INVALID_CHARACTERS_PATTERN, new CharacterHighlightPainter(new Color(0xFF4200), new Color(0xFF1200)), 4)); + list.setCellRenderer(new HighlightListCellRenderer(INVALID_CHARACTERS_PATTERN, new CharacterHighlightPainter(new Color(0xFF4200), new Color(0xFF1200)), 4)); JLabel label = new JLabel("Some names contain invalid characters:"); @@ -94,8 +96,7 @@ public class ValidateNamesDialog extends JDialog { @Override public void actionPerformed(ActionEvent e) { for (ListEntry entry : entries) { - String validatedName = FileBotUtil.validateFileName(entry.getName()); - entry.setName(validatedName); + entry.setName(validateFileName(entry.getName())); } setEnabled(false); diff --git a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanel.java b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanel.java index 95fb6a21..fd4a3ef5 100644 --- a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanel.java +++ b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanel.java @@ -2,6 +2,9 @@ package net.sourceforge.filebot.ui.panel.subtitle; +import static net.sourceforge.filebot.FileBotUtil.getApplicationName; +import static net.sourceforge.filebot.FileBotUtil.getApplicationVersion; + import java.net.URI; import java.util.ArrayList; import java.util.Collection; @@ -49,7 +52,7 @@ public class SubtitlePanel extends AbstractSearchPanel createSearchEngines() { List engines = new ArrayList(2); - engines.add(new OpenSubtitlesSubtitleClient()); + engines.add(new OpenSubtitlesSubtitleClient(String.format("%s v%s", getApplicationName(), getApplicationVersion()))); engines.add(new SubsceneSubtitleClient()); return engines; @@ -74,17 +77,24 @@ public class SubtitlePanel extends AbstractSearchPanel { + protected static class SubtitleRequestProcessor extends RequestProcessor { public SubtitleRequestProcessor(SubtitleRequest request) { super(request, new SubtitleDownloadPanel()); diff --git a/source/net/sourceforge/filebot/ui/transfer/FileTransferable.java b/source/net/sourceforge/filebot/ui/transfer/FileTransferable.java index 58324938..e18d725d 100644 --- a/source/net/sourceforge/filebot/ui/transfer/FileTransferable.java +++ b/source/net/sourceforge/filebot/ui/transfer/FileTransferable.java @@ -57,7 +57,7 @@ public class FileTransferable implements Transferable { * @return line separated list of file URIs */ private String getUriList() { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(80 * files.size()); for (File file : files) { sb.append("file://" + file.toURI().getPath()); diff --git a/source/net/sourceforge/filebot/ui/transfer/LazyTextFileTransferable.java b/source/net/sourceforge/filebot/ui/transfer/LazyTextFileTransferable.java index 4e56aff7..5c961626 100644 --- a/source/net/sourceforge/filebot/ui/transfer/LazyTextFileTransferable.java +++ b/source/net/sourceforge/filebot/ui/transfer/LazyTextFileTransferable.java @@ -2,6 +2,9 @@ package net.sourceforge.filebot.ui.transfer; +import static net.sourceforge.filebot.FileBotUtil.getApplicationName; +import static net.sourceforge.filebot.FileBotUtil.validateFileName; + import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; @@ -11,7 +14,6 @@ import java.io.IOException; import java.nio.channels.FileChannel; import java.nio.charset.Charset; -import net.sourceforge.filebot.FileBotUtil; import net.sourceforge.tuned.TemporaryFolder; @@ -52,10 +54,10 @@ public class LazyTextFileTransferable implements Transferable { private FileTransferable createFileTransferable() throws IOException { // remove invalid characters from file name - String validFileName = FileBotUtil.validateFileName(defaultFileName); + String validFileName = validateFileName(defaultFileName); // create new temporary file in TEMP/APP_NAME [UUID]/dnd - File temporaryFile = TemporaryFolder.getFolder(FileBotUtil.getApplicationName()).subFolder("dnd").createFile(validFileName); + File temporaryFile = TemporaryFolder.getFolder(getApplicationName()).subFolder("dnd").createFile(validFileName); // write text to file FileChannel fileChannel = new FileOutputStream(temporaryFile).getChannel(); diff --git a/source/net/sourceforge/filebot/web/AnidbClient.java b/source/net/sourceforge/filebot/web/AnidbClient.java index 93c46f2e..338021f0 100644 --- a/source/net/sourceforge/filebot/web/AnidbClient.java +++ b/source/net/sourceforge/filebot/web/AnidbClient.java @@ -2,24 +2,26 @@ package net.sourceforge.filebot.web; +import static net.sourceforge.filebot.web.WebRequest.getHtmlDocument; +import static net.sourceforge.tuned.XPathUtil.exists; +import static net.sourceforge.tuned.XPathUtil.selectNode; +import static net.sourceforge.tuned.XPathUtil.selectNodes; +import static net.sourceforge.tuned.XPathUtil.selectString; + import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.net.URLEncoder; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.Icon; import net.sourceforge.filebot.ResourceManager; -import net.sourceforge.tuned.XPathUtil; import org.w3c.dom.Document; import org.w3c.dom.Node; @@ -44,19 +46,22 @@ public class AnidbClient implements EpisodeListClient { @Override - public List search(String searchterm) throws IOException, SAXException { + public List search(String query) throws IOException, SAXException { - Document dom = HtmlUtil.getHtmlDocument(getSearchUrl(searchterm)); + // type=2 -> only TV Series + URL searchUrl = new URL("http", host, "/perl-bin/animedb.pl?type=2&show=animelist&orderby.name=0.1&orderbar=0&noalias=1&do.search=Search&adb.search=" + URLEncoder.encode(query, "UTF-8")); - List nodes = XPathUtil.selectNodes("//TABLE[@class='animelist']//TR/TD/ancestor::TR", dom); + Document dom = getHtmlDocument(searchUrl); + + List nodes = selectNodes("//TABLE[@class='animelist']//TR/TD/ancestor::TR", dom); List searchResults = new ArrayList(nodes.size()); for (Node node : nodes) { - Node titleNode = XPathUtil.selectNode("./TD[@class='name']/A", node); + Node titleNode = selectNode("./TD[@class='name']/A", node); - String title = XPathUtil.selectString(".", titleNode); - String href = XPathUtil.selectString("@href", titleNode); + String title = selectString(".", titleNode); + String href = selectString("@href", titleNode); String path = "/perl-bin/" + href; @@ -70,12 +75,12 @@ public class AnidbClient implements EpisodeListClient { // we might have been redirected to the episode list page if (searchResults.isEmpty()) { // check if current page contains an episode list - if (XPathUtil.exists("//TABLE[@class='eplist']", dom)) { + if (exists("//TABLE[@class='eplist']", dom)) { // get show's name from the document - String header = XPathUtil.selectString("id('layout-content')//H1[1]", dom); + String header = selectString("id('layout-content')//H1[1]", dom); String name = header.replaceFirst("Anime:\\s*", ""); - String episodeListUrl = XPathUtil.selectString("id('layout-main')//DIV[@class='data']//A[@class='short_link']/@href", dom); + String episodeListUrl = selectString("id('layout-main')//DIV[@class='data']//A[@class='short_link']/@href", dom); try { searchResults.add(new HyperLink(name, new URL(episodeListUrl))); @@ -92,33 +97,25 @@ public class AnidbClient implements EpisodeListClient { @Override public List getEpisodeList(SearchResult searchResult) throws IOException, SAXException { - Document dom = HtmlUtil.getHtmlDocument(getEpisodeListLink(searchResult)); + Document dom = getHtmlDocument(getEpisodeListLink(searchResult).toURL()); - List nodes = XPathUtil.selectNodes("id('eplist')//TR/TD/SPAN/ancestor::TR", dom); - - NumberFormat numberFormat = NumberFormat.getInstance(Locale.ENGLISH); - numberFormat.setMinimumIntegerDigits(Math.max(Integer.toString(nodes.size()).length(), 2)); - numberFormat.setGroupingUsed(false); + List nodes = selectNodes("id('eplist')//TR/TD/SPAN/ancestor::TR", dom); ArrayList episodes = new ArrayList(nodes.size()); for (Node node : nodes) { - String number = XPathUtil.selectString("./TD[contains(@class,'id')]/A", node); - String title = XPathUtil.selectString("./TD[@class='title']/LABEL/text()", node); + String number = selectString("./TD[contains(@class,'id')]/A", node); + String title = selectString("./TD[@class='title']/LABEL/text()", node); - if (title.startsWith("recap")) + if (title.startsWith("recap")) { title = title.replaceFirst("recap", ""); - - try { - // try to format number of episode - number = numberFormat.format(Integer.parseInt(number)); - - // no seasons for anime - episodes.add(new Episode(searchResult.getName(), number, title)); - } catch (NumberFormatException ex) { - // ignore node, episode is probably some kind of special (S1, S2, ...) } + // if number does not match, episode is probably some kind of special (S1, S2, ...) + if (number.matches("\\d+")) { + // no seasons for anime + episodes.add(new Episode(searchResult.getName(), number, title)); + } } return episodes; @@ -148,14 +145,4 @@ public class AnidbClient implements EpisodeListClient { throw new UnsupportedOperationException(); } - - private URL getSearchUrl(String searchterm) throws UnsupportedEncodingException, MalformedURLException { - String qs = URLEncoder.encode(searchterm, "UTF-8"); - - // type=2 -> only TV Series - String path = "/perl-bin/animedb.pl?type=2&show=animelist&orderby.name=0.1&orderbar=0&noalias=1&do.search=Search&adb.search=" + qs; - - return new URL("http", host, path); - } - } diff --git a/source/net/sourceforge/filebot/web/Episode.java b/source/net/sourceforge/filebot/web/Episode.java index 4f32d72d..9da5bc52 100644 --- a/source/net/sourceforge/filebot/web/Episode.java +++ b/source/net/sourceforge/filebot/web/Episode.java @@ -2,34 +2,37 @@ package net.sourceforge.filebot.web; -public class Episode { +import java.io.Serializable; + + +public class Episode implements Serializable { - private final String showName; - private final String numberOfSeason; - private final String numberOfEpisode; - private final String title; + private String showName; + private String seasonNumber; + private String episodeNumber; + private String title; - public Episode(String showname, String numberOfSeason, String numberOfEpisode, String title) { - this.showName = showname; - this.numberOfSeason = numberOfSeason; - this.numberOfEpisode = numberOfEpisode; + public Episode(String showName, String seasonNumber, String episodeNumber, String title) { + this.showName = showName; + this.seasonNumber = seasonNumber; + this.episodeNumber = episodeNumber; this.title = title; } - public Episode(String showname, String numberOfEpisode, String title) { - this(showname, null, numberOfEpisode, title); + public Episode(String showName, String episodeNumber, String title) { + this(showName, null, episodeNumber, title); } - public String getNumberOfEpisode() { - return numberOfEpisode; + public String getEpisodeNumber() { + return episodeNumber; } - public String getNumberOfSeason() { - return numberOfSeason; + public String getSeasonNumber() { + return seasonNumber; } @@ -43,16 +46,36 @@ public class Episode { } + public void setShowName(String seriesName) { + this.showName = seriesName; + } + + + public void setSeasonNumber(String seasonNumber) { + this.seasonNumber = seasonNumber; + } + + + public void setEpisodeNumber(String episodeNumber) { + this.episodeNumber = episodeNumber; + } + + + public void setTitle(String episodeName) { + this.title = episodeName; + } + + @Override public String toString() { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(40); sb.append(showName + " - "); - if (numberOfSeason != null) - sb.append(numberOfSeason + "x"); + if (seasonNumber != null) + sb.append(seasonNumber + "x"); - sb.append(numberOfEpisode); + sb.append(episodeNumber); sb.append(" - " + title); diff --git a/source/net/sourceforge/filebot/web/EpisodeListClient.java b/source/net/sourceforge/filebot/web/EpisodeListClient.java index 3f132dc0..a81671cd 100644 --- a/source/net/sourceforge/filebot/web/EpisodeListClient.java +++ b/source/net/sourceforge/filebot/web/EpisodeListClient.java @@ -10,7 +10,7 @@ import javax.swing.Icon; public interface EpisodeListClient { - public Collection search(String searchterm) throws Exception; + public Collection search(String query) throws Exception; public boolean hasSingleSeasonSupport(); diff --git a/source/net/sourceforge/filebot/web/OpenSubtitlesSubtitleClient.java b/source/net/sourceforge/filebot/web/OpenSubtitlesSubtitleClient.java index ba27dd74..c8e6e1a6 100644 --- a/source/net/sourceforge/filebot/web/OpenSubtitlesSubtitleClient.java +++ b/source/net/sourceforge/filebot/web/OpenSubtitlesSubtitleClient.java @@ -11,7 +11,6 @@ import java.util.logging.Logger; import javax.swing.Icon; -import net.sourceforge.filebot.FileBotUtil; import net.sourceforge.filebot.ResourceManager; import net.sourceforge.tuned.Timer; @@ -21,9 +20,14 @@ import net.sourceforge.tuned.Timer; */ public class OpenSubtitlesSubtitleClient implements SubtitleClient { - private final OpenSubtitlesClient client = new OpenSubtitlesClient(String.format("%s v%s", FileBotUtil.getApplicationName(), FileBotUtil.getApplicationVersion())); + private final OpenSubtitlesClient client; + public OpenSubtitlesSubtitleClient(String useragent) { + this.client = new OpenSubtitlesClient(useragent); + } + + @Override public String getName() { return "OpenSubtitles"; @@ -38,10 +42,10 @@ public class OpenSubtitlesSubtitleClient implements SubtitleClient { @SuppressWarnings("unchecked") @Override - public List search(String searchterm) throws Exception { + public List search(String query) throws Exception { login(); - return (List) client.searchMoviesOnIMDB(searchterm); + return (List) client.searchMoviesOnIMDB(query); } diff --git a/source/net/sourceforge/filebot/web/SeasonOutOfBoundsException.java b/source/net/sourceforge/filebot/web/SeasonOutOfBoundsException.java new file mode 100644 index 00000000..4822f50c --- /dev/null +++ b/source/net/sourceforge/filebot/web/SeasonOutOfBoundsException.java @@ -0,0 +1,39 @@ + +package net.sourceforge.filebot.web; + + +public class SeasonOutOfBoundsException extends IndexOutOfBoundsException { + + private final String showName; + private final int season; + private final int maxSeason; + + + public SeasonOutOfBoundsException(String showName, int season, int maxSeason) { + this.showName = showName; + this.season = season; + this.maxSeason = maxSeason; + } + + + @Override + public String getMessage() { + return String.format("%s has only %d season%s.", showName, maxSeason, maxSeason != 1 ? "s" : ""); + } + + + public String getShowName() { + return showName; + } + + + public int getSeason() { + return season; + } + + + public int getMaxSeason() { + return maxSeason; + } + +} diff --git a/source/net/sourceforge/filebot/web/SubsceneSubtitleClient.java b/source/net/sourceforge/filebot/web/SubsceneSubtitleClient.java index 34b4588f..f63b5b6f 100644 --- a/source/net/sourceforge/filebot/web/SubsceneSubtitleClient.java +++ b/source/net/sourceforge/filebot/web/SubsceneSubtitleClient.java @@ -2,8 +2,12 @@ package net.sourceforge.filebot.web; +import static net.sourceforge.filebot.web.WebRequest.getHtmlDocument; +import static net.sourceforge.tuned.XPathUtil.selectNode; +import static net.sourceforge.tuned.XPathUtil.selectNodes; +import static net.sourceforge.tuned.XPathUtil.selectString; + import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; @@ -24,7 +28,6 @@ import javax.swing.Icon; import net.sourceforge.filebot.ResourceManager; import net.sourceforge.tuned.FileUtil; -import net.sourceforge.tuned.XPathUtil; import org.w3c.dom.Document; import org.w3c.dom.Node; @@ -51,18 +54,20 @@ public class SubsceneSubtitleClient implements SubtitleClient { @Override - public List search(String searchterm) throws IOException, SAXException { + public List search(String query) throws IOException, SAXException { - Document dom = HtmlUtil.getHtmlDocument(getSearchUrl(searchterm)); + URL searchUrl = new URL("http", host, "/filmsearch.aspx?q=" + URLEncoder.encode(query, "UTF-8")); - List nodes = XPathUtil.selectNodes("id('filmSearch')/A", dom); + Document dom = getHtmlDocument(searchUrl); + + List nodes = selectNodes("id('filmSearch')/A", dom); List searchResults = new ArrayList(nodes.size()); for (Node node : nodes) { - String title = XPathUtil.selectString("text()", node); - String href = XPathUtil.selectString("@href", node); - String count = XPathUtil.selectString("./DFN", node).replaceAll("\\D+", ""); + String title = selectString("text()", node); + String href = selectString("@href", node); + String count = selectString("./DFN", node).replaceAll("\\D+", ""); try { URL subtitleListUrl = new URL("http", host, href); @@ -82,10 +87,10 @@ public class SubsceneSubtitleClient implements SubtitleClient { if (subtitleNodeCount > 0) { // get name of current search result - String name = XPathUtil.selectString("id('leftWrapperWide')//H1/text()", dom); + String name = selectString("id('leftWrapperWide')//H1/text()", dom); // get current location - String file = XPathUtil.selectString("id('aspnetForm')/@action", dom); + String file = selectString("id('aspnetForm')/@action", dom); try { URL url = new URL("http", host, file); @@ -103,15 +108,15 @@ public class SubsceneSubtitleClient implements SubtitleClient { private void updateLanguageFilterMap(Document subtitleListDocument) { - List nodes = XPathUtil.selectNodes("//DIV[@class='languageList']/DIV", subtitleListDocument); + List nodes = selectNodes("//DIV[@class='languageList']/DIV", subtitleListDocument); for (Node node : nodes) { - String onClick = XPathUtil.selectString("./INPUT/@onclick", node); + String onClick = selectString("./INPUT/@onclick", node); String filter = new Scanner(onClick).findInLine("\\d+"); if (filter != null) { - String name = XPathUtil.selectString("./LABEL/text()", node); + String name = selectString("./LABEL/text()", node); languageFilterMap.put(name.toLowerCase(), Integer.valueOf(filter)); } @@ -175,8 +180,7 @@ public class SubsceneSubtitleClient implements SubtitleClient { private boolean useFilteredDocument(SearchResult searchResult) { - SubsceneSearchResult sr = (SubsceneSearchResult) searchResult; - return sr.getSubtitleCount() > 50; + return ((SubsceneSearchResult) searchResult).getSubtitleCount() > 50; } @@ -187,12 +191,12 @@ public class SubsceneSubtitleClient implements SubtitleClient { connection.addRequestProperty("Cookie", "subscene_sLanguageIds=" + languageFilter); } - return HtmlUtil.getHtmlDocument(connection); + return getHtmlDocument(connection); } private List getSubtitleNodes(Document subtitleListDocument) { - return XPathUtil.selectNodes("//TABLE[@class='filmSubtitleList']//A[@id]//ancestor::TR", subtitleListDocument); + return selectNodes("//TABLE[@class='filmSubtitleList']//A[@id]//ancestor::TR", subtitleListDocument); } @@ -204,14 +208,14 @@ public class SubsceneSubtitleClient implements SubtitleClient { for (Node node : subtitleNodes) { try { - Node linkNode = XPathUtil.selectFirstNode("./TD[1]/A", node); - String lang = XPathUtil.selectString("./SPAN[1]", linkNode); + Node linkNode = selectNode("./TD[1]/A", node); + String lang = selectString("./SPAN[1]", linkNode); if (languageName == null || languageName.equalsIgnoreCase(lang)) { - String href = XPathUtil.selectString("@href", linkNode); - String name = XPathUtil.selectString("./SPAN[2]", linkNode); - String author = XPathUtil.selectString("./TD[4]", node); + String href = selectString("@href", linkNode); + String name = selectString("./SPAN[2]", linkNode); + String author = selectString("./TD[4]", node); Matcher matcher = hrefPattern.matcher(href); @@ -247,13 +251,6 @@ public class SubsceneSubtitleClient implements SubtitleClient { return ((HyperLink) searchResult).toURI(); } - - private URL getSearchUrl(String searchterm) throws UnsupportedEncodingException, MalformedURLException { - String qs = URLEncoder.encode(searchterm, "UTF-8"); - String file = "/filmsearch.aspx?q=" + qs; - return new URL("http", host, file); - } - protected static class SubsceneSearchResult extends HyperLink { diff --git a/source/net/sourceforge/filebot/web/SubtitleClient.java b/source/net/sourceforge/filebot/web/SubtitleClient.java index 0c6e1231..1cba315a 100644 --- a/source/net/sourceforge/filebot/web/SubtitleClient.java +++ b/source/net/sourceforge/filebot/web/SubtitleClient.java @@ -11,7 +11,7 @@ import javax.swing.Icon; public interface SubtitleClient { - public Collection search(String searchterm) throws Exception; + public Collection search(String query) throws Exception; public Collection getSubtitleList(SearchResult searchResult, Locale language) throws Exception; diff --git a/source/net/sourceforge/filebot/web/TVDotComClient.java b/source/net/sourceforge/filebot/web/TVDotComClient.java index 76ec42d8..1f9dbebb 100644 --- a/source/net/sourceforge/filebot/web/TVDotComClient.java +++ b/source/net/sourceforge/filebot/web/TVDotComClient.java @@ -2,17 +2,17 @@ package net.sourceforge.filebot.web; +import static net.sourceforge.filebot.web.WebRequest.getHtmlDocument; +import static net.sourceforge.tuned.XPathUtil.selectNodes; +import static net.sourceforge.tuned.XPathUtil.selectString; + import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.net.URLEncoder; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Locale; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -23,7 +23,6 @@ import java.util.logging.Logger; import javax.swing.Icon; import net.sourceforge.filebot.ResourceManager; -import net.sourceforge.tuned.XPathUtil; import org.w3c.dom.Document; import org.w3c.dom.Node; @@ -54,17 +53,20 @@ public class TVDotComClient implements EpisodeListClient { @Override - public List search(String searchterm) throws IOException, SAXException { + public List search(String query) throws IOException, SAXException { - Document dom = HtmlUtil.getHtmlDocument(getSearchUrl(searchterm)); + // use ajax search request, because we don't need the whole search result page + URL searchUrl = new URL("http", host, "/search.php?type=Search&stype=ajax_search&search_type=program&qs=" + URLEncoder.encode(query, "UTF-8")); - List nodes = XPathUtil.selectNodes("//H3[@class='title']/A", dom); + Document dom = getHtmlDocument(searchUrl); + + List nodes = selectNodes("//H3[@class='title']/A", dom); List searchResults = new ArrayList(nodes.size()); for (Node node : nodes) { String title = node.getTextContent(); - String href = XPathUtil.selectString("@href", node); + String href = selectString("@href", node); try { URL episodeListingUrl = new URL(href.replaceFirst("summary.html\\?.*", "episode_listings.html")); @@ -83,10 +85,10 @@ public class TVDotComClient implements EpisodeListClient { public List getEpisodeList(SearchResult searchResult) throws Exception { // get document for season 1 - Document dom = HtmlUtil.getHtmlDocument(getEpisodeListLink(searchResult, 1)); + Document dom = getHtmlDocument(getEpisodeListLink(searchResult, 1).toURL()); // seasons are ordered in reverse, first element is latest season - String latestSeasonString = XPathUtil.selectString("id('eps_table')//*[starts-with(text(),'Season:')]/*[1]/text()", dom); + String latestSeasonString = selectString("id('eps_table')//*[starts-with(text(),'Season:')]/*[1]/text()", dom); if (latestSeasonString.isEmpty()) { // assume single season series @@ -129,7 +131,7 @@ public class TVDotComClient implements EpisodeListClient { @Override public List getEpisodeList(SearchResult searchResult, int season) throws IOException, SAXException { - Document dom = HtmlUtil.getHtmlDocument(getEpisodeListLink(searchResult, season)); + Document dom = getHtmlDocument(getEpisodeListLink(searchResult, season).toURL()); return getEpisodeList(searchResult, season, dom); } @@ -137,32 +139,31 @@ public class TVDotComClient implements EpisodeListClient { private List getEpisodeList(SearchResult searchResult, int seasonNumber, Document dom) { - List nodes = XPathUtil.selectNodes("id('eps_table')//TD[@class='ep_title']/parent::TR", dom); + List nodes = selectNodes("id('eps_table')//TD[@class='ep_title']/parent::TR", dom); + + // create mutable list from nodes so we can reverse the list + nodes = new ArrayList(nodes); // episodes are ordered in reverse ... we definitely don't want that! Collections.reverse(nodes); - NumberFormat numberFormat = NumberFormat.getInstance(Locale.ENGLISH); - numberFormat.setMinimumIntegerDigits(Math.max(Integer.toString(nodes.size()).length(), 2)); - numberFormat.setGroupingUsed(false); - Integer episodeOffset = null; ArrayList episodes = new ArrayList(nodes.size()); for (Node node : nodes) { - String episode = XPathUtil.selectString("./TD[1]", node); - String title = XPathUtil.selectString("./TD[2]//A", node); - String season = Integer.toString(seasonNumber); + String episode = selectString("./TD[1]", node); + String title = selectString("./TD[2]//A", node); + String season = String.valueOf(seasonNumber); try { - // format number of episode + // convert the absolute episode number to the season episode number int n = Integer.parseInt(episode); if (episodeOffset == null) episodeOffset = n - 1; - episode = numberFormat.format(n - episodeOffset); + episode = String.valueOf(n - episodeOffset); } catch (NumberFormatException e) { // episode may be "Pilot", "Special", "TV Movie" ... season = null; @@ -188,14 +189,6 @@ public class TVDotComClient implements EpisodeListClient { return URI.create(episodeListingUrl + "?season=" + season); } - - private URL getSearchUrl(String searchterm) throws UnsupportedEncodingException, MalformedURLException { - String qs = URLEncoder.encode(searchterm, "UTF-8"); - String file = "/search.php?type=Search&stype=ajax_search&search_type=program&qs=" + qs; - - return new URL("http", host, file); - } - private class GetEpisodeList implements Callable> { diff --git a/source/net/sourceforge/filebot/web/TVRageClient.java b/source/net/sourceforge/filebot/web/TVRageClient.java index 1a96bb9a..69d2ef19 100644 --- a/source/net/sourceforge/filebot/web/TVRageClient.java +++ b/source/net/sourceforge/filebot/web/TVRageClient.java @@ -2,18 +2,28 @@ package net.sourceforge.filebot.web; +import static net.sourceforge.filebot.web.WebRequest.getDocument; +import static net.sourceforge.tuned.XPathUtil.getTextContent; +import static net.sourceforge.tuned.XPathUtil.selectInteger; +import static net.sourceforge.tuned.XPathUtil.selectNodes; +import static net.sourceforge.tuned.XPathUtil.selectString; + import java.io.IOException; import java.net.URI; +import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.Icon; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import net.sf.ehcache.Cache; +import net.sf.ehcache.CacheManager; +import net.sf.ehcache.Element; import net.sourceforge.filebot.ResourceManager; -import net.sourceforge.tuned.XPathUtil; import org.w3c.dom.Document; import org.w3c.dom.Node; @@ -24,6 +34,8 @@ public class TVRageClient implements EpisodeListClient { private static final String host = "www.tvrage.com"; + private final Cache cache = CacheManager.getInstance().getCache("web"); + @Override public String getName() { @@ -44,20 +56,20 @@ public class TVRageClient implements EpisodeListClient { @Override - public List search(String searchterm) throws SAXException, IOException, ParserConfigurationException { + public List search(String query) throws SAXException, IOException, ParserConfigurationException { - String searchUri = String.format("http://" + host + "/feeds/search.php?show=" + URLEncoder.encode(searchterm, "UTF-8")); + URL searchUrl = new URL("http", host, "/feeds/full_search.php?show=" + URLEncoder.encode(query, "UTF-8")); - Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(searchUri); + Document dom = getDocument(searchUrl); - List nodes = XPathUtil.selectNodes("Results/show", dom); + List nodes = selectNodes("Results/show", dom); List searchResults = new ArrayList(nodes.size()); for (Node node : nodes) { - int showid = XPathUtil.selectInteger("showid", node); - String name = XPathUtil.selectString("name", node); - String link = XPathUtil.selectString("link", node); + int showid = selectInteger("showid", node); + String name = selectString("name", node); + String link = selectString("link", node); searchResults.add(new TVRageSearchResult(name, showid, link)); } @@ -66,25 +78,71 @@ public class TVRageClient implements EpisodeListClient { } - private EpisodeListFeed getEpisodeListFeed(SearchResult searchResult) throws SAXException, IOException, ParserConfigurationException { - int showId = ((TVRageSearchResult) searchResult).getShowId(); - String episodeListUri = String.format("http://" + host + "/feeds/episode_list.php?sid=" + showId); - - Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(episodeListUri); - - return new EpisodeListFeed(dom); - } - - + @SuppressWarnings("unchecked") @Override - public List getEpisodeList(SearchResult searchResult) throws Exception { - return getEpisodeListFeed(searchResult).getEpisodeList(); + public List getEpisodeList(SearchResult searchResult) throws IOException, SAXException, ParserConfigurationException { + int showId = ((TVRageSearchResult) searchResult).getShowId(); + + URL episodeListUrl = new URL("http", host, "/feeds/episode_list.php?sid=" + showId); + + // try to load from cache + Element cacheEntry = cache.get(episodeListUrl.toString()); + + if (cacheEntry != null) { + return (List) cacheEntry.getValue(); + } + + Document dom = getDocument(episodeListUrl); + + String showName = selectString("Show/name", dom); + List nodes = selectNodes("Show/Episodelist/Season/episode", dom); + + List episodes = new ArrayList(nodes.size()); + + for (Node node : nodes) { + String title = getTextContent("title", node); + String episodeNumber = getTextContent("seasonnum", node); + String seasonNumber = node.getParentNode().getAttributes().getNamedItem("no").getTextContent(); + + episodes.add(new Episode(showName, seasonNumber, episodeNumber, title)); + } + + // populate cache + cache.put(new Element(episodeListUrl.toString(), episodes)); + + return episodes; } @Override public List getEpisodeList(SearchResult searchResult, int season) throws IOException, SAXException, ParserConfigurationException { - return getEpisodeListFeed(searchResult).getEpisodeList(season); + + List episodes = new ArrayList(25); + + // remember max. season, so we can throw a proper exception, in case an illegal season number was requested + int maxSeason = 0; + + // filter given season from all seasons + for (Episode episode : getEpisodeList(searchResult)) { + try { + int seasonNumber = Integer.parseInt(episode.getSeasonNumber()); + + if (season == seasonNumber) { + episodes.add(episode); + } + + if (seasonNumber > maxSeason) { + maxSeason = seasonNumber; + } + } catch (NumberFormatException e) { + Logger.getLogger("global").log(Level.WARNING, "Illegal season number", e); + } + } + + if (episodes.isEmpty()) + throw new SeasonOutOfBoundsException(searchResult.getName(), season, maxSeason); + + return episodes; } @@ -96,7 +154,7 @@ public class TVRageClient implements EpisodeListClient { @Override public URI getEpisodeListLink(SearchResult searchResult, int season) { - return getEpisodeListLink(searchResult, Integer.toString(season)); + return getEpisodeListLink(searchResult, String.valueOf(season)); } @@ -107,7 +165,7 @@ public class TVRageClient implements EpisodeListClient { } - protected static class TVRageSearchResult extends SearchResult { + public static class TVRageSearchResult extends SearchResult { private final int showId; private final String link; @@ -131,63 +189,4 @@ public class TVRageClient implements EpisodeListClient { } - - private static class EpisodeListFeed { - - private final String name; - - private final int totalSeasons; - - private final Document feed; - - - public EpisodeListFeed(Document feed) { - name = XPathUtil.selectString("Show/name", feed); - totalSeasons = XPathUtil.selectInteger("Show/totalseasons", feed); - - this.feed = feed; - } - - - public String getName() { - return name; - } - - - public int getTotalSeasons() { - return totalSeasons; - } - - - public List getEpisodeList() { - List episodes = new ArrayList(150); - - for (int i = 0; i <= getTotalSeasons(); i++) { - episodes.addAll(getEpisodeList(i)); - } - - return episodes; - } - - - public List getEpisodeList(int season) { - if (season > getTotalSeasons() || season < 0) - throw new IndexOutOfBoundsException(String.format("%s has only %d season%s.", getName(), getTotalSeasons(), getTotalSeasons() != 1 ? "s" : "")); - - List nodes = XPathUtil.selectNodes("//Season[@no='" + season + "']/episode", feed); - - List episodes = new ArrayList(nodes.size()); - String numberOfSeason = Integer.toString(season); - - for (Node node : nodes) { - String title = XPathUtil.selectString("title", node); - String episodeNumber = XPathUtil.selectString("seasonnum", node); - - episodes.add(new Episode(getName(), numberOfSeason, episodeNumber, title)); - } - - return episodes; - } - } - } diff --git a/source/net/sourceforge/filebot/web/TheTVDBClient.java b/source/net/sourceforge/filebot/web/TheTVDBClient.java new file mode 100644 index 00000000..1e2de3a5 --- /dev/null +++ b/source/net/sourceforge/filebot/web/TheTVDBClient.java @@ -0,0 +1,373 @@ + +package net.sourceforge.filebot.web; + + +import static net.sourceforge.filebot.web.WebRequest.getDocument; +import static net.sourceforge.tuned.XPathUtil.getTextContent; +import static net.sourceforge.tuned.XPathUtil.selectInteger; +import static net.sourceforge.tuned.XPathUtil.selectNodes; +import static net.sourceforge.tuned.XPathUtil.selectString; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.net.URL; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumMap; +import java.util.EnumSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Random; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import javax.swing.Icon; +import javax.xml.parsers.ParserConfigurationException; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.CacheManager; +import net.sf.ehcache.Element; +import net.sourceforge.filebot.ResourceManager; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.xml.sax.SAXException; + + +public class TheTVDBClient implements EpisodeListClient { + + private static final String host = "www.thetvdb.com"; + + private final String apikey; + + private final Map mirrors = new EnumMap(MirrorType.class); + + private final TheTVDBCache cache = new TheTVDBCache(CacheManager.getInstance().getCache("web")); + + + public TheTVDBClient(String apikey) { + this.apikey = apikey; + } + + + @Override + public String getName() { + return "TheTVDB"; + } + + + @Override + public Icon getIcon() { + return ResourceManager.getIcon("search.thetvdb"); + } + + + @Override + public boolean hasSingleSeasonSupport() { + return true; + } + + + @Override + public List search(String query) throws Exception { + return search(query, Locale.ENGLISH); + } + + + public List search(String query, Locale language) throws Exception { + + URL searchUrl = new URL("http", host, "/api/GetSeries.php?seriesname=" + URLEncoder.encode(query, "UTF-8") + "&language=" + language.getLanguage()); + + Document dom = getDocument(searchUrl); + + List nodes = selectNodes("Data/Series", dom); + + List searchResults = new ArrayList(nodes.size()); + + for (Node node : nodes) { + int seriesId = selectInteger("seriesid", node); + String seriesName = selectString("SeriesName", node); + + searchResults.add(new TheTVDBSearchResult(seriesName, seriesId)); + } + + return searchResults; + } + + + @Override + public List getEpisodeList(SearchResult searchResult) throws Exception { + return getEpisodeList((TheTVDBSearchResult) searchResult, Locale.ENGLISH); + } + + + @Override + public List getEpisodeList(SearchResult searchResult, int season) throws Exception { + + List episodes = new ArrayList(25); + + // remember max. season, so we can throw a proper exception, in case an illegal season number was requested + int maxSeason = 0; + + // filter given season from all seasons + for (Episode episode : getEpisodeList(searchResult)) { + try { + int seasonNumber = Integer.parseInt(episode.getSeasonNumber()); + + if (season == seasonNumber) { + episodes.add(episode); + } + + if (seasonNumber > maxSeason) { + maxSeason = seasonNumber; + } + } catch (NumberFormatException e) { + Logger.getLogger("global").log(Level.WARNING, "Illegal season number", e); + } + } + + if (episodes.isEmpty()) + throw new SeasonOutOfBoundsException(searchResult.getName(), season, maxSeason); + + return episodes; + } + + + public List getEpisodeList(TheTVDBSearchResult searchResult, Locale language) throws Exception { + + List episodes = cache.getEpisodeList(searchResult.getSeriesId(), language); + + if (episodes != null) + return episodes; + + Document seriesRecord = getSeriesRecord(searchResult, language); + + // we could get the series name from the search result, but the language may not match the given parameter + String seriesName = selectString("Data/Series/SeriesName", seriesRecord); + + List nodes = selectNodes("Data/Episode", seriesRecord); + + episodes = new ArrayList(nodes.size()); + + for (Node node : nodes) { + String episodeName = getTextContent("EpisodeName", node); + String episodeNumber = getTextContent("EpisodeNumber", node); + String seasonNumber = getTextContent("SeasonNumber", node); + + episodes.add(new Episode(seriesName, seasonNumber, episodeNumber, episodeName)); + + if (episodeNumber.equals("1")) { + // cache seasonId for each season (always when we are at the first episode) + // because it might be required by getEpisodeListLink + cache.putSeasonId(searchResult.getSeriesId(), Integer.parseInt(seasonNumber), Integer.parseInt(getTextContent("seasonid", node))); + } + } + + cache.putEpisodeList(searchResult.getSeriesId(), language, episodes); + return episodes; + } + + + public Document getSeriesRecord(TheTVDBSearchResult searchResult, Locale language) throws IOException, SAXException, ParserConfigurationException { + + URL seriesRecordUrl = new URL(getMirror(MirrorType.ZIP) + "/api/" + apikey + "/series/" + searchResult.getSeriesId() + "/all/" + language.getLanguage() + ".zip"); + + ZipInputStream zipInputStream = new ZipInputStream(seriesRecordUrl.openStream()); + ZipEntry zipEntry; + + try { + String seriesRecordName = language.getLanguage() + ".xml"; + + while ((zipEntry = zipInputStream.getNextEntry()) != null) { + if (seriesRecordName.equals(zipEntry.getName())) { + return getDocument(zipInputStream); + } + } + + // zip file must contain the series record + throw new FileNotFoundException(String.format("Archive must contain %s: %s", seriesRecordName, seriesRecordUrl)); + } finally { + zipInputStream.close(); + } + } + + + @Override + public URI getEpisodeListLink(SearchResult searchResult) { + int seriesId = ((TheTVDBSearchResult) searchResult).getSeriesId(); + + return URI.create("http://www.thetvdb.com/?tab=seasonall&id=" + seriesId); + } + + + @Override + public URI getEpisodeListLink(SearchResult searchResult, int season) { + int seriesId = ((TheTVDBSearchResult) searchResult).getSeriesId(); + + try { + Integer seasonId = cache.getSeasonId(seriesId, season); + + if (seasonId == null) { + // get episode xml from first episode of given season + Document dom = getDocument(new URL("http", host, "/api/" + apikey + "/series/" + seriesId + "/default/" + season + "/1/en.xml")); + + seasonId = selectInteger("Data/Episode/seasonid", dom); + + cache.putSeasonId(seriesId, season, seasonId); + } + + return new URI("http://www.thetvdb.com/?tab=season&seriesid=" + seriesId + "&seasonid=" + seasonId); + } catch (Exception e) { + Logger.getLogger("global").log(Level.WARNING, "Failed to retrieve season id", e); + } + + return null; + } + + + protected String getMirror(MirrorType mirrorType) throws IOException, SAXException, ParserConfigurationException { + synchronized (mirrors) { + if (mirrors.isEmpty()) { + // initialize mirrors + URL mirrorUrl = new URL("http", host, "/api/" + apikey + "/mirrors.xml"); + + Document dom = getDocument(mirrorUrl); + + // all mirrors by type + Map> mirrorListMap = new EnumMap>(MirrorType.class); + + // initialize mirror list per type + for (MirrorType type : MirrorType.values()) { + mirrorListMap.put(type, new ArrayList(5)); + } + + // traverse all mirrors + for (Node node : selectNodes("Mirrors/Mirror", dom)) { + // mirror data + String mirror = selectString("mirrorpath", node); + int typeMask = selectInteger("typemask", node); + + // add mirror to the according type lists + for (MirrorType type : MirrorType.fromTypeMask(typeMask)) { + mirrorListMap.get(type).add(mirror); + } + } + + // put random entry from each type list into mirrors + Random random = new Random(); + + for (MirrorType type : MirrorType.values()) { + List list = mirrorListMap.get(type); + + if (!list.isEmpty()) { + mirrors.put(type, list.get(random.nextInt(list.size()))); + } + } + } + + return mirrors.get(mirrorType); + } + } + + + public static class TheTVDBSearchResult extends SearchResult { + + private final int seriesId; + + + public TheTVDBSearchResult(String seriesName, int seriesId) { + super(seriesName); + this.seriesId = seriesId; + } + + + public int getSeriesId() { + return seriesId; + } + + } + + + protected static enum MirrorType { + XML(1), + BANNER(2), + ZIP(4); + + private final int bitMask; + + + private MirrorType(int bitMask) { + this.bitMask = bitMask; + } + + + public static EnumSet fromTypeMask(int typeMask) { + // initialize enum set with all types + EnumSet enumSet = EnumSet.allOf(MirrorType.class); + + for (MirrorType type : values()) { + if ((typeMask & type.bitMask) == 0) { + // remove types that are not set + enumSet.remove(type); + } + } + + return enumSet; + }; + + } + + + private static class TheTVDBCache { + + private final Cache cache; + + + public TheTVDBCache(Cache cache) { + this.cache = cache; + } + + + public void putSeasonId(int seriesId, int seasonNumber, int seasonId) { + cache.put(new Element(key(host, seriesId, seasonNumber, "SeasonId"), seasonId)); + } + + + public Integer getSeasonId(int seriesId, int seasonNumber) { + Element element = cache.get(key(host, seriesId, seasonNumber, "SeasonId")); + + if (element != null) + return (Integer) element.getValue(); + + return null; + } + + + public void putEpisodeList(int seriesId, Locale language, List episodes) { + cache.put(new Element(key(host, seriesId, language, "EpisodeList"), episodes)); + } + + + @SuppressWarnings("unchecked") + public List getEpisodeList(int seriesId, Locale language) { + Element element = cache.get(key(host, seriesId, language.getLanguage(), "EpisodeList")); + + if (element != null) + return (List) element.getValue(); + + return null; + } + + + private String key(Object... key) { + return Arrays.toString(key); + } + + } + +} diff --git a/source/net/sourceforge/filebot/web/HtmlUtil.java b/source/net/sourceforge/filebot/web/WebRequest.java similarity index 73% rename from source/net/sourceforge/filebot/web/HtmlUtil.java rename to source/net/sourceforge/filebot/web/WebRequest.java index e657605b..8325f672 100644 --- a/source/net/sourceforge/filebot/web/HtmlUtil.java +++ b/source/net/sourceforge/filebot/web/WebRequest.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; -import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.nio.charset.Charset; @@ -16,41 +15,17 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + import org.cyberneko.html.parsers.DOMParser; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -public class HtmlUtil { +public final class WebRequest { - private static Charset getCharset(String contentType) { - if (contentType != null) { - // e.g. Content-Type: text/html; charset=iso-8859-1 - Pattern pattern = Pattern.compile(".*;\\s*charset=(\\S+).*", Pattern.CASE_INSENSITIVE); - Matcher matcher = pattern.matcher(contentType); - - if (matcher.matches()) { - String charsetName = matcher.group(1); - - try { - return Charset.forName(charsetName); - } catch (Exception e) { - Logger.getLogger("global").log(Level.WARNING, e.getMessage()); - } - } - } - - // use UTF-8 if charset cannot be determined - return Charset.forName("UTF-8"); - } - - - public static Document getHtmlDocument(URI uri) throws IOException, SAXException { - return getHtmlDocument(uri.toURL()); - } - - public static Document getHtmlDocument(URL url) throws IOException, SAXException { return getHtmlDocument(url.openConnection()); } @@ -81,4 +56,45 @@ public class HtmlUtil { return parser.getDocument(); } + + public static Document getDocument(URL url) throws SAXException, IOException, ParserConfigurationException { + return getDocument(url.toString()); + } + + + public static Document getDocument(String url) throws SAXException, IOException, ParserConfigurationException { + return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(url); + } + + + public static Document getDocument(InputStream inputStream) throws SAXException, IOException, ParserConfigurationException { + return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream); + } + + + private static Charset getCharset(String contentType) { + if (contentType != null) { + // e.g. Content-Type: text/html; charset=iso-8859-1 + Pattern pattern = Pattern.compile(".*;\\s*charset=(\\S+).*", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(contentType); + + if (matcher.matches()) { + String charsetName = matcher.group(1); + + try { + return Charset.forName(charsetName); + } catch (Exception e) { + Logger.getLogger("global").log(Level.WARNING, e.getMessage()); + } + } + } + + // use UTF-8 if charset cannot be determined + return Charset.forName("UTF-8"); + } + + + private WebRequest() { + throw new UnsupportedOperationException(); + } } diff --git a/source/net/sourceforge/tuned/XPathUtil.java b/source/net/sourceforge/tuned/XPathUtil.java index d397d865..0a5bbfb4 100644 --- a/source/net/sourceforge/tuned/XPathUtil.java +++ b/source/net/sourceforge/tuned/XPathUtil.java @@ -2,7 +2,7 @@ package net.sourceforge.tuned; -import java.util.ArrayList; +import java.util.AbstractList; import java.util.List; import javax.xml.xpath.XPathConstants; @@ -25,31 +25,9 @@ public final class XPathUtil { } - public static Node selectFirstNode(String xpath, Object node) { - try { - NodeList nodeList = (NodeList) getXPath(xpath).evaluate(node, XPathConstants.NODESET); - - if (nodeList.getLength() <= 0) - return null; - - return nodeList.item(0); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public static List selectNodes(String xpath, Object node) { try { - NodeList nodeList = (NodeList) getXPath(xpath).evaluate(node, XPathConstants.NODESET); - - ArrayList nodes = new ArrayList(nodeList.getLength()); - - for (int i = 0; i < nodeList.getLength(); i++) { - nodes.add(nodeList.item(i)); - } - - return nodes; + return new NodeListDecorator((NodeList) getXPath(xpath).evaluate(node, XPathConstants.NODESET)); } catch (Exception e) { throw new RuntimeException(e); } @@ -65,6 +43,40 @@ public final class XPathUtil { } + /** + * @param nodeName search for nodes with this name + * @param parentNode search in the child nodes of this nodes + * @return text content of the child node or null if no child with the given name was found + */ + public static Node getChild(String nodeName, Node parentNode) { + for (Node child : new NodeListDecorator(parentNode.getChildNodes())) { + if (nodeName.equals(child.getNodeName())) + return child; + } + + return null; + } + + + /** + * Get text content of the first child node matching the given node name. Use this method + * instead of {@link #selectString(String, Object)} whenever xpath support is not required, + * because it is much faster, especially for large documents. + * + * @param nodeName search for nodes with this name + * @param parentNode search in the child nodes of this nodes + * @return text content of the child node or null if no child with the given name was found + */ + public static String getTextContent(String nodeName, Node parentNode) { + Node child = getChild(nodeName, parentNode); + + if (child == null) + return null; + + return child.getTextContent(); + } + + public static int selectInteger(String xpath, Object node) { return Integer.parseInt(selectString(xpath, node)); } @@ -87,4 +99,28 @@ public final class XPathUtil { throw new UnsupportedOperationException(); } + + protected static class NodeListDecorator extends AbstractList { + + private final NodeList nodes; + + + public NodeListDecorator(NodeList nodes) { + this.nodes = nodes; + } + + + @Override + public Node get(int index) { + return nodes.item(index); + } + + + @Override + public int size() { + return nodes.getLength(); + } + + } + } diff --git a/test/net/sourceforge/filebot/web/AnidbClientTest.java b/test/net/sourceforge/filebot/web/AnidbClientTest.java index 412e44db..8fb1468f 100644 --- a/test/net/sourceforge/filebot/web/AnidbClientTest.java +++ b/test/net/sourceforge/filebot/web/AnidbClientTest.java @@ -67,8 +67,8 @@ public class AnidbClientTest { assertEquals("Monster", first.getShowName()); assertEquals("Herr Dr. Tenma", first.getTitle()); - assertEquals("01", first.getNumberOfEpisode()); - assertEquals(null, first.getNumberOfSeason()); + assertEquals("1", first.getEpisodeNumber()); + assertEquals(null, first.getSeasonNumber()); } @@ -82,8 +82,8 @@ public class AnidbClientTest { assertEquals("Juuni Kokuki", first.getShowName()); assertEquals("Shadow of the Moon, The Sea of Shadow - Chapter 1", first.getTitle()); - assertEquals("01", first.getNumberOfEpisode()); - assertEquals(null, first.getNumberOfSeason()); + assertEquals("1", first.getEpisodeNumber()); + assertEquals(null, first.getSeasonNumber()); } diff --git a/test/net/sourceforge/filebot/web/TVDotComClientTest.java b/test/net/sourceforge/filebot/web/TVDotComClientTest.java index 038d901b..97ade34b 100644 --- a/test/net/sourceforge/filebot/web/TVDotComClientTest.java +++ b/test/net/sourceforge/filebot/web/TVDotComClientTest.java @@ -56,16 +56,16 @@ public class TVDotComClientTest { @Test public void getEpisodeList() throws Exception { - List results = tvdotcom.getEpisodeList(buffySearchResult, 7); + List list = tvdotcom.getEpisodeList(buffySearchResult, 7); - assertEquals(22, results.size()); + assertEquals(22, list.size()); - Episode chosen = results.get(21); + Episode chosen = list.get(21); assertEquals("Buffy the Vampire Slayer", chosen.getShowName()); assertEquals("Chosen", chosen.getTitle()); - assertEquals("22", chosen.getNumberOfEpisode()); - assertEquals("7", chosen.getNumberOfSeason()); + assertEquals("22", chosen.getEpisodeNumber()); + assertEquals("7", chosen.getSeasonNumber()); } @@ -79,8 +79,8 @@ public class TVDotComClientTest { assertEquals("Buffy the Vampire Slayer", first.getShowName()); assertEquals("Unaired Pilot", first.getTitle()); - assertEquals("Pilot", first.getNumberOfEpisode()); - assertEquals(null, first.getNumberOfSeason()); + assertEquals("Pilot", first.getEpisodeNumber()); + assertEquals(null, first.getSeasonNumber()); } @@ -94,8 +94,8 @@ public class TVDotComClientTest { assertEquals("Firefly", fourth.getShowName()); assertEquals("Jaynestown", fourth.getTitle()); - assertEquals("04", fourth.getNumberOfEpisode()); - assertEquals("1", fourth.getNumberOfSeason()); + assertEquals("4", fourth.getEpisodeNumber()); + assertEquals("1", fourth.getSeasonNumber()); } @@ -118,8 +118,8 @@ public class TVDotComClientTest { assertEquals("Lost", episode.getShowName()); assertEquals("Exposé", episode.getTitle()); - assertEquals("14", episode.getNumberOfEpisode()); - assertEquals("3", episode.getNumberOfSeason()); + assertEquals("14", episode.getEpisodeNumber()); + assertEquals("3", episode.getSeasonNumber()); } diff --git a/test/net/sourceforge/filebot/web/TVRageClientTest.java b/test/net/sourceforge/filebot/web/TVRageClientTest.java index 79c8891e..14069080 100644 --- a/test/net/sourceforge/filebot/web/TVRageClientTest.java +++ b/test/net/sourceforge/filebot/web/TVRageClientTest.java @@ -43,8 +43,8 @@ public class TVRageClientTest { assertEquals("Buffy the Vampire Slayer", chosen.getShowName()); assertEquals("Chosen", chosen.getTitle()); - assertEquals("22", chosen.getNumberOfEpisode()); - assertEquals("7", chosen.getNumberOfSeason()); + assertEquals("22", chosen.getEpisodeNumber()); + assertEquals("7", chosen.getSeasonNumber()); } @@ -58,12 +58,12 @@ public class TVRageClientTest { assertEquals("Buffy the Vampire Slayer", first.getShowName()); assertEquals("Unaired Pilot", first.getTitle()); - assertEquals("00", first.getNumberOfEpisode()); - assertEquals("0", first.getNumberOfSeason()); + assertEquals("00", first.getEpisodeNumber()); + assertEquals("0", first.getSeasonNumber()); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = SeasonOutOfBoundsException.class) public void getEpisodeListIllegalSeason() throws Exception { tvrage.getEpisodeList(buffySearchResult, 42); } diff --git a/test/net/sourceforge/filebot/web/TheTVDBClientTest.java b/test/net/sourceforge/filebot/web/TheTVDBClientTest.java new file mode 100644 index 00000000..adf6a669 --- /dev/null +++ b/test/net/sourceforge/filebot/web/TheTVDBClientTest.java @@ -0,0 +1,126 @@ + +package net.sourceforge.filebot.web; + + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.EnumSet; +import java.util.List; +import java.util.Locale; + +import net.sf.ehcache.CacheManager; +import net.sourceforge.filebot.web.TheTVDBClient.MirrorType; +import net.sourceforge.filebot.web.TheTVDBClient.TheTVDBSearchResult; + +import org.junit.After; +import org.junit.Test; + + +public class TheTVDBClientTest { + + private TheTVDBClient thetvdb = new TheTVDBClient("BA864DEE427E384A"); + + + @After + public void clearCache() { + CacheManager.getInstance().clearAll(); + } + + + @Test + public void search() throws Exception { + // test default language and query escaping (blanks) + List results = thetvdb.search("babylon 5"); + + assertEquals(2, results.size()); + + TheTVDBSearchResult first = (TheTVDBSearchResult) results.get(0); + + assertEquals("Babylon 5", first.getName()); + assertEquals(70726, first.getSeriesId()); + } + + + @Test + public void searchGerman() throws Exception { + List results = thetvdb.search("buffy", Locale.GERMAN); + + assertEquals(3, results.size()); + + TheTVDBSearchResult first = (TheTVDBSearchResult) results.get(0); + + // test encoding (umlauts) + assertEquals("Buffy - Im Bann der Dämonen", first.getName()); + assertEquals(70327, first.getSeriesId()); + + TheTVDBSearchResult second = (TheTVDBSearchResult) results.get(1); + + assertEquals("Buffy the Vampire Slayer", second.getName()); + assertEquals(70327, second.getSeriesId()); + } + + + @Test + public void getEpisodeListAll() throws Exception { + List list = thetvdb.getEpisodeList(new TheTVDBSearchResult("Buffy the Vampire Slayer", 70327)); + + assertEquals(147, list.size()); + + Episode first = list.get(0); + + assertEquals("Buffy the Vampire Slayer", first.getShowName()); + assertEquals("Unaired Pilot", first.getTitle()); + assertEquals("1", first.getEpisodeNumber()); + assertEquals("0", first.getSeasonNumber()); + } + + + @Test + public void getEpisodeListSingleSeason() throws Exception { + List list = thetvdb.getEpisodeList(new TheTVDBSearchResult("Buffy the Vampire Slayer", 70327), 7); + + assertEquals(22, list.size()); + + Episode chosen = list.get(21); + + assertEquals("Buffy the Vampire Slayer", chosen.getShowName()); + assertEquals("Chosen", chosen.getTitle()); + assertEquals("22", chosen.getEpisodeNumber()); + assertEquals("7", chosen.getSeasonNumber()); + } + + + @Test + public void getEpisodeListLink() { + assertEquals("http://www.thetvdb.com/?tab=seasonall&id=78874", thetvdb.getEpisodeListLink(new TheTVDBSearchResult("Firefly", 78874)).toString()); + } + + + @Test + public void getEpisodeListLinkSingleSeason() { + assertEquals("http://www.thetvdb.com/?tab=season&seriesid=73965&seasonid=6749", thetvdb.getEpisodeListLink(new TheTVDBSearchResult("Roswell", 73965), 3).toString()); + } + + + @Test + public void getMirror() throws Exception { + assertNotNull(thetvdb.getMirror(MirrorType.XML)); + assertNotNull(thetvdb.getMirror(MirrorType.BANNER)); + assertNotNull(thetvdb.getMirror(MirrorType.ZIP)); + } + + + @Test + public void resolveTypeMask() { + // no flags set + assertEquals(EnumSet.noneOf(MirrorType.class), MirrorType.fromTypeMask(0)); + + // xml and zip flags set + assertEquals(EnumSet.of(MirrorType.ZIP, MirrorType.XML), MirrorType.fromTypeMask(5)); + + // all flags set + assertEquals(EnumSet.allOf(MirrorType.class), MirrorType.fromTypeMask(7)); + } + +} diff --git a/test/net/sourceforge/filebot/web/WebTestSuite.java b/test/net/sourceforge/filebot/web/WebTestSuite.java index 6c2b7174..6dc88543 100644 --- a/test/net/sourceforge/filebot/web/WebTestSuite.java +++ b/test/net/sourceforge/filebot/web/WebTestSuite.java @@ -8,7 +8,7 @@ import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) -@SuiteClasses( { TVDotComClientTest.class, AnidbClientTest.class, TVRageClientTest.class, SubsceneSubtitleClientTest.class, OpenSubtitlesHasherTest.class }) +@SuiteClasses( { TVDotComClientTest.class, AnidbClientTest.class, TVRageClientTest.class, TheTVDBClientTest.class, SubsceneSubtitleClientTest.class, OpenSubtitlesHasherTest.class }) public class WebTestSuite { }