diff --git a/src/main/java/org/openaudible/audible/AudibleClient.java b/src/main/java/org/openaudible/audible/AudibleClient.java index c95426c..c059312 100644 --- a/src/main/java/org/openaudible/audible/AudibleClient.java +++ b/src/main/java/org/openaudible/audible/AudibleClient.java @@ -50,8 +50,6 @@ public class AudibleClient extends WebClient { } }); - CookieManager cm = this.getCookieManager(); - this.waitForBackgroundJavaScript(15000); if (!maxDebug) { diff --git a/src/main/java/org/openaudible/audible/AudibleScraper.java b/src/main/java/org/openaudible/audible/AudibleScraper.java index 6d1068c..4dcdfcb 100644 --- a/src/main/java/org/openaudible/audible/AudibleScraper.java +++ b/src/main/java/org/openaudible/audible/AudibleScraper.java @@ -63,27 +63,6 @@ public class AudibleScraper { this.page = page; LOG.info("pageLoaded:" + page.getUrl() + " " + page.getTitleText()); - - if (page != null && debugCust) { - String xml = page.asXml(); - int i1 = xml.indexOf("cust_id"); - - int i2 = xml.indexOf("order_number"); - String s1 = "", s2 = ""; - if (i1 != -1) { - s1 = xml.substring(i1 - 300, i1 + 300); - } - if (i2 != -1) { - s2 = xml.substring(i2 - 300, i2 + 300); - } - if (s1.length() > 0 || s2.length() > 0) { - LOG.info("Found cust_id:s1=" + s1 + "\ns2=" + s2); - } - } - - - // progress.setSubTask("page.getTitleText()); - } public boolean isLoggedIn() { @@ -109,7 +88,7 @@ public class AudibleScraper { } else { if (page != null) { String u = page.getUrl().toString(); - ConnectionNotifier.getInstance().setLastURL(u); + ConnectionNotifier.getInstance().loginFailed(u, page.asXml()); } } @@ -144,7 +123,7 @@ public class AudibleScraper { setLoggedIn(false); } - public void saveCookies() throws IOException { + public void saveCookies() throws IOException { CookieManager cm = getWebClient().getCookieManager(); ArrayList list = new ArrayList<>(); @@ -232,12 +211,24 @@ public class AudibleScraper { if (getProgress() != null) getProgress().setTask("Submitting credentials..."); + HTMLUtil.debugNode(page, "submitting-credentials"); setPage(submit.click()); boolean ok = checkLoggedIn(); if (!ok) - HTMLUtil.debugNode(page, "login submitted"); + { + HTMLUtil.debugNode(page, "login failed"); + LOG.info(page.getUrl()); + + LOG.info("Login failed, see html files at:"+HTMLUtil.debugFile("submitting-credentials").getAbsolutePath()+" and "+HTMLUtil.debugFile("login failed").getAbsolutePath()); + + + } + else + { + HTMLUtil.debugFile("submitting-credentials").delete(); + } return ok; } @@ -455,30 +446,6 @@ public class AudibleScraper { } -/* - private DomDocumentFragment getLibraryFragment(int pageNum, int items) throws IOException, SAXException { - EventTimer evt = new EventTimer(); - String url = getAudibleBase()+"/lib-ajax"; - WebRequest webRequest = new WebRequest(new URL(url), HttpMethod.POST); - webRequest.setRequestBody("progType=all&timeFilter=all&itemsPerPage=" + items + "&searchTerm=&searchType=&sortColumn=&sortType=down&page=" + pageNum + "&mode=normal&subId=&subTitle="); - WebResponse webResponse = getWebClient().getWebConnection().getResponse(webRequest); - String content = webResponse.getContentAsString(); - DomDocumentFragment frag = new DomDocumentFragment(page); - HTMLParser.parseFragment(frag, content); - LOG.info(evt.reportString("get Library Page:" + pageNum)); - return frag; - } - - - public Collection fetchFirstLibraryPage() throws Exception { - if (page == null) - home(); - LOG.info("Accessing audible library..."); - HashSet results = new HashSet<>(); - lib(); - return results; - } -*/ public Collection fetchLibraryQuick(HashMap books) throws Exception { return _fetchLibrary(books); @@ -487,7 +454,7 @@ public class AudibleScraper { public Collection _fetchLibrary(HashMap existingBooks) throws Exception { if (page == null) home(); - LOG.info("Accessing audible library..."); + // LOG.info("Accessing audible library..."); HashSet results = new HashSet<>(); // getWebClient().setJavascriptEnabled(false); progress.setTask("Scanning your library to get your list of books...", ""); @@ -511,21 +478,8 @@ public class AudibleScraper { if (next == null) { assert (pageNum == 1); setURL("/lib", "Reading Library..."); + setPageFilter(); - DomElement purchaseDateFilter = page.getElementByName("purchaseDateFilter"); - if (purchaseDateFilter!=null) - { - DomNodeList nodes = purchaseDateFilter.getChildNodes(); - for (DomNode n:nodes) - { - if (n instanceof HtmlOption) - { - // "all" is first option.. - ((HtmlOption) n).click(); - break ; - } - } - } } else { // getProgress().setTask("Getting a list of your library. ); EventTimer evt = new EventTimer(); @@ -555,7 +509,7 @@ public class AudibleScraper { int newBooks = 0; for (Book b : list) { - LOG.info(b.toString()); + // LOG.info(b.toString()); if (b.partial()) continue; if (results.contains(b)) { @@ -577,12 +531,57 @@ public class AudibleScraper { next = LibraryParser.instance.getNextPage(page); if (next == null) break; + //LOG.info("next page:"+next); } return results; } - public Collection fetchLibrary() throws Exception { + private void setPageFilter() + { + DomElement purchaseDateFilter = page.getElementByName("purchaseDateFilter"); + if (purchaseDateFilter!=null && purchaseDateFilter instanceof HtmlSelect) + { + HtmlSelect h = (HtmlSelect)purchaseDateFilter; + int i = h.getSelectedIndex(); + if (i!=0) + { + HtmlOption all = h.getOption(0); + String url = all.getAttribute("data-url"); + try + { + if (url!=null && !url.isEmpty()) + { + //LOG.info("url: "+ url); + String newURL = url+ "&purchaseDateFilter=all&programFilter=all&sortBy=PURCHASE_DATE.dsc"; + page = (HtmlPage) setURL(newURL, "Setting view filter"); + LOG.info("new URL: "+ page.getUrl()); + } + h = (HtmlSelect) page.getElementByName("purchaseDateFilter"); + i = h.getSelectedIndex(); + if (i!=0) + { + LOG.error("Expected filter to be set to 0, not "+i); + } + + } catch (Exception e) + { + LOG.error("Error setting filter.. update may be required.",e); + } + } + + return; + } else + { + LOG.info("warning: did not find library filter htmlSelect."); + } + + + } + + + + public Collection fetchLibrary() throws Exception { return _fetchLibrary(null); } diff --git a/src/main/java/org/openaudible/audible/ConnectionListener.java b/src/main/java/org/openaudible/audible/ConnectionListener.java index bbacdce..c037813 100644 --- a/src/main/java/org/openaudible/audible/ConnectionListener.java +++ b/src/main/java/org/openaudible/audible/ConnectionListener.java @@ -7,7 +7,6 @@ import org.openaudible.AudibleAccountPrefs; */ public interface ConnectionListener { void connectionChanged(boolean connected); - AudibleAccountPrefs getAccountPrefs(AudibleAccountPrefs in); - + void loginFailed(String url, String html); } diff --git a/src/main/java/org/openaudible/audible/ConnectionNotifier.java b/src/main/java/org/openaudible/audible/ConnectionNotifier.java index 46beca3..c81c72c 100644 --- a/src/main/java/org/openaudible/audible/ConnectionNotifier.java +++ b/src/main/java/org/openaudible/audible/ConnectionNotifier.java @@ -52,11 +52,8 @@ public class ConnectionNotifier extends EventNotifier implem public boolean isDisconnected() { return getState() == State.Disconnected; } - - public void setLastURL(String u) { - - - } + + // not connected is unknown. // connected means in account @@ -64,6 +61,17 @@ public class ConnectionNotifier extends EventNotifier implem enum State { Not_Connected, Connected, Disconnected } + + + + @Override + public void loginFailed(String url, String html) + { + for (ConnectionListener l : getListeners()) { + l.loginFailed(url, html); + } + + } } diff --git a/src/main/java/org/openaudible/audible/LibraryParser.java b/src/main/java/org/openaudible/audible/LibraryParser.java index 2db71b8..c803d89 100644 --- a/src/main/java/org/openaudible/audible/LibraryParser.java +++ b/src/main/java/org/openaudible/audible/LibraryParser.java @@ -247,6 +247,10 @@ public enum LibraryParser { HashMap args = Util.urlGetArgs(url); for (String k : args.keySet()) { + + + + BookElement elem = BookElement.findByName(k); if (elem != null) { b.set(elem, args.get(k)); diff --git a/src/main/java/org/openaudible/books/BookElement.java b/src/main/java/org/openaudible/books/BookElement.java index 85d8b3f..4302912 100644 --- a/src/main/java/org/openaudible/books/BookElement.java +++ b/src/main/java/org/openaudible/books/BookElement.java @@ -10,7 +10,26 @@ public enum BookElement { try { return BookElement.valueOf(s); } catch (Throwable th) { - System.out.println("No BookElement:" + s); + switch(s) + { + case "title": + return shortTitle; + case "DownloadType": + break; + case "domain": + break; + case "awtype": + break; + case "transfer_player": + break; + + default: + // + System.out.println("No BookElement:" + s); + break; + } + + } return null; } diff --git a/src/main/java/org/openaudible/desktop/swt/gui/GUI.java b/src/main/java/org/openaudible/desktop/swt/gui/GUI.java index 584946f..ee7ce15 100644 --- a/src/main/java/org/openaudible/desktop/swt/gui/GUI.java +++ b/src/main/java/org/openaudible/desktop/swt/gui/GUI.java @@ -12,6 +12,10 @@ import org.openaudible.desktop.swt.manager.menu.AppMenu; import org.openaudible.desktop.swt.manager.menu.CommandCenter; import org.openaudible.desktop.swt.util.shop.LayoutShop; import org.openaudible.desktop.swt.util.shop.PaintShop; +import org.openaudible.util.Platform; + +import java.io.File; +import java.io.IOException; public abstract class GUI implements ITranslatable { /** @@ -156,6 +160,39 @@ public abstract class GUI implements ITranslatable { return (isWindows() || isSolaris() || isMac()); } + public static void explore(File m) { + + String mac = "open "; + + + String cmd = null; + switch(Platform.getPlatform()) + { + + case mac: + cmd = "open "; + if (!m.isDirectory()) cmd += "-R "; + break; + case win: + cmd = "Explorer /select, "; + break; + case linux: + cmd = "gnome-open PATH "; + break; + } + + if (cmd != null) { + cmd += "\"" + m.getAbsolutePath() + "\""; + System.err.println(cmd); + try { + Runtime.getRuntime().exec(cmd); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + public abstract String getAppName(); public abstract String getAppNameAndVersion(); diff --git a/src/main/java/org/openaudible/desktop/swt/manager/AudibleGUI.java b/src/main/java/org/openaudible/desktop/swt/manager/AudibleGUI.java index b559d3c..c49082d 100644 --- a/src/main/java/org/openaudible/desktop/swt/manager/AudibleGUI.java +++ b/src/main/java/org/openaudible/desktop/swt/manager/AudibleGUI.java @@ -7,7 +7,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.openaudible.Audible; import org.openaudible.AudibleAccountPrefs; @@ -565,20 +567,8 @@ public class AudibleGUI implements BookListener, ConnectionListener { Book b = onlyOneSelected(); File m = audible.getMP3FileDest(b); if (m.exists()) { - String mac = "open -R "; - String win = "Explorer /select, "; + GUI.explore(m); - String cmd = null; - if (Platform.isMac()) - cmd = mac; - if (Platform.isWindows()) - cmd = win; - // TODO: Support linux. - if (cmd != null) { - cmd += "\"" + m.getAbsolutePath() + "\""; - System.err.println(cmd); - Runtime.getRuntime().exec(cmd); - } // Desktop.getDesktop().open(m.getParentFile()); } @@ -1163,4 +1153,21 @@ public class AudibleGUI implements BookListener, ConnectionListener { } + @Override + public void loginFailed(String url, String html) + { + + SWTAsync.slow(new SWTAsync("Login problem...") { + public void task() { + String message = "There was a problem logging in... Try to view the page in the OpenAudible Browser?"; + boolean ok = MessageBoxFactory.showGeneralYesNo(null, "Trouble logging in", message); + if (ok) + browse(url); + } + }); + + + + } + } \ No newline at end of file diff --git a/src/main/java/org/openaudible/desktop/swt/manager/Version.java b/src/main/java/org/openaudible/desktop/swt/manager/Version.java index 056d159..dd93ca3 100644 --- a/src/main/java/org/openaudible/desktop/swt/manager/Version.java +++ b/src/main/java/org/openaudible/desktop/swt/manager/Version.java @@ -3,7 +3,7 @@ package org.openaudible.desktop.swt.manager; public interface Version { String appName = "OpenAudible"; - String appVersion = "1.1.1"; + String appVersion = "1.1.2"; boolean appDebug = false; String appLink = "http://openaudible.org"; String versionLink = "http://openaudible.org/swt_version.json"; diff --git a/src/main/java/org/openaudible/desktop/swt/manager/views/AudibleBrowser.java b/src/main/java/org/openaudible/desktop/swt/manager/views/AudibleBrowser.java index a1cc91b..f984f70 100644 --- a/src/main/java/org/openaudible/desktop/swt/manager/views/AudibleBrowser.java +++ b/src/main/java/org/openaudible/desktop/swt/manager/views/AudibleBrowser.java @@ -258,18 +258,37 @@ public class AudibleBrowser { new BrowserFunction(browser, "cookieCallback") { @Override public Object function(Object[] objects) { + ArrayList list = new ArrayList<>(); String u = browser.getUrl(); + if (u.contains("audible.")) { + // Get host from url. + // https://www.audible.com/ + String host = "www.audible.com"; + + if (u.startsWith("http")) + { + String[] parts = u.split("/"); + if (parts!=null && parts.length>2) + { + if (parts[2].contains("audible")) + host = parts[2]; + } + } + + Object[] keyValuePairs = (Object[]) objects[0]; for (Object o : keyValuePairs) { Object arr[] = (Object[]) o; - Cookie c = new Cookie("www.audible.com", arr[0].toString(), arr[1].toString()); + Cookie c = new Cookie(host, arr[0].toString(), arr[1].toString()); list.add(c); } cookies = list; } else logger.info("Expected url to include audible, instead: " + u); + + logger.info("cookieCallback: " + list.size()); return null; } @@ -279,8 +298,8 @@ public class AudibleBrowser { new BrowserFunction(browser, "pageInfoCallback") { @Override public Object function(Object[] objects) { - ArrayList list = new ArrayList<>(); - + String u = browser.getUrl(); + logger.info("pageInfoCallback: " + u); return null; } }; diff --git a/src/main/java/org/openaudible/desktop/swt/manager/views/Preferences.java b/src/main/java/org/openaudible/desktop/swt/manager/views/Preferences.java index 3ecc413..630fa18 100644 --- a/src/main/java/org/openaudible/desktop/swt/manager/views/Preferences.java +++ b/src/main/java/org/openaudible/desktop/swt/manager/views/Preferences.java @@ -4,6 +4,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; @@ -12,6 +14,7 @@ import org.openaudible.Audible; import org.openaudible.AudibleAccountPrefs; import org.openaudible.AudibleRegion; import org.openaudible.Directories; +import org.openaudible.desktop.swt.gui.GUI; import org.openaudible.desktop.swt.gui.MessageBoxFactory; import org.openaudible.desktop.swt.manager.AudibleGUI; @@ -179,6 +182,7 @@ public class Preferences extends Dialog { createAccountGroup(c); createDirectoryGroup(c); createAutomationGroup(c); + createPrefsLocation(c); this.getShell().setText("Preferences"); populate(); @@ -186,6 +190,26 @@ public class Preferences extends Dialog { return null; } + private void createPrefsLocation(GridComposite c) { + c = new GridComposite(c, SWT.NONE, 2, false, GridData.FILL_HORIZONTAL); + + String loc = Directories.getDir(Directories.META).getAbsolutePath(); + String name = Directories.META.displayName(); + Label l = new Label(c, SWT.NONE); + l.setText(name+": "+loc); + + GridData gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL); + + Button b = c.newButton(SWT.PUSH, "Show"); + b.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + GUI.explore(Directories.getDir(Directories.META)); + } + }); + + } + private void createAccountGroup(GridComposite c) { Group group = c.newGroup("Audible Account", 3); diff --git a/src/main/java/org/openaudible/desktop/swt/manager/views/StatusPanel.java b/src/main/java/org/openaudible/desktop/swt/manager/views/StatusPanel.java index 5046519..661e530 100644 --- a/src/main/java/org/openaudible/desktop/swt/manager/views/StatusPanel.java +++ b/src/main/java/org/openaudible/desktop/swt/manager/views/StatusPanel.java @@ -144,5 +144,12 @@ public class StatusPanel extends GridComposite implements BookListener, Connecti } } + @Override + public void loginFailed(String url, String html) + { + // TODO Auto-generated method stub + + } + } diff --git a/src/main/java/org/openaudible/util/HTMLUtil.java b/src/main/java/org/openaudible/util/HTMLUtil.java index 0a2beb6..ead2f00 100644 --- a/src/main/java/org/openaudible/util/HTMLUtil.java +++ b/src/main/java/org/openaudible/util/HTMLUtil.java @@ -90,6 +90,11 @@ public class HTMLUtil { return null; } + public static File debugFile(String what) + { + return new File(Directories.getTmpDir(), what); + } + public static String debugNode(DomNode p, String what) { String xml = "";