X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsearchable%2FFanfiction.java;h=90f25eec473ba3657aac8de15224161b2faace11;hp=362b5433d7d3fc81e163a03a08273e9f2319f03f;hb=8ffc8b73e96e80657545f7d713cd065cf7ede786;hpb=e66c9078be4348bf9c799470973220d9ab2053cd diff --git a/src/be/nikiroo/fanfix/searchable/Fanfiction.java b/src/be/nikiroo/fanfix/searchable/Fanfiction.java index 362b543..90f25ee 100644 --- a/src/be/nikiroo/fanfix/searchable/Fanfiction.java +++ b/src/be/nikiroo/fanfix/searchable/Fanfiction.java @@ -20,6 +20,7 @@ import be.nikiroo.fanfix.bundles.StringId; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.supported.SupportType; import be.nikiroo.utils.Image; +import be.nikiroo.utils.StringUtils; /** * A {@link BasicSearchable} for Fanfiction.NET. @@ -76,7 +77,7 @@ class Fanfiction extends BasicSearchable { if (storiesName != null) { SearchableTag tag = new SearchableTag(null, storiesName, false); for (String id : stories.keySet()) { - tag.add(new SearchableTag(id, stories.get(id), true, false)); + tag.add(new SearchableTag(id, stories.get(id), false, false)); } tags.add(tag); } @@ -93,7 +94,7 @@ class Fanfiction extends BasicSearchable { } @Override - protected void fillTag(SearchableTag tag) throws IOException { + public void fillTag(SearchableTag tag) throws IOException { if (tag.getId() == null || tag.isComplete()) { return; } @@ -126,23 +127,10 @@ class Fanfiction extends BasicSearchable { } nr = nr.trim(); - long count = 0; - try { - if (nr.toLowerCase().endsWith("m")) { - count = Long.parseLong(nr.substring(0, - nr.length() - 1).trim()); - count *= 1000000; - } else if (nr.toLowerCase().endsWith("k")) { - count = Long.parseLong(nr.substring(0, - nr.length() - 1).trim()); - count *= 1000; - } else { - count = Long.parseLong(nr); - } - } catch (NumberFormatException pe) { - } + // TODO: fix toNumber/fromNumber + nr = nr.replaceAll("\\.[0-9]*", ""); - subtag.setCount(count); + subtag.setCount(StringUtils.toNumber(nr)); } } } @@ -153,11 +141,10 @@ class Fanfiction extends BasicSearchable { } @Override - public List search(String search) throws IOException { + public List search(String search, int page) throws IOException { String encoded = URLEncoder.encode(search.toLowerCase(), "utf-8"); - return getStories( - "http://fanfiction.net/search/?ready=1&type=story&keywords=" - + encoded, null, null); + return getStories(BASE_URL + "search/?ready=1&type=story&keywords=" + + encoded + "&ppage=" + page, null, null); } @Override @@ -180,7 +167,7 @@ class Fanfiction extends BasicSearchable { Document doc = load(url, false); // Update the pages number if needed - if (tag.getPages() < 0) { + if (tag.getPages() < 0 && tag.isLeaf()) { tag.setPages(getPages(doc)); } @@ -206,11 +193,8 @@ class Fanfiction extends BasicSearchable { * the document * * @return the number of pages or -1 if unknown - * - * @throws IOException - * in case of I/O errors */ - private int getPages(Document doc) throws IOException { + private int getPages(Document doc) { int pages = -1; if (doc != null) { @@ -266,9 +250,7 @@ class Fanfiction extends BasicSearchable { meta.setImageDocument(false); meta.setSource(getType().getSourceName()); - String subject = mainSubject == null ? "" : mainSubject; - List tagList = new ArrayList(); - + // Title, URL, Cover Element stitle = story.getElementsByClass("stitle").first(); if (stitle != null) { meta.setTitle(stitle.text()); @@ -295,13 +277,15 @@ class Fanfiction extends BasicSearchable { } } + // Author Elements as = story.getElementsByTag("a"); if (as.size() > 1) { meta.setAuthor(as.get(1).text()); } + // Tags (concatenated text), published date, updated date, Resume String tags = ""; - + List tagList = new ArrayList(); Elements divs = story.getElementsByTag("div"); if (divs.size() > 1 && divs.get(1).childNodeSize() > 0) { String resume = divs.get(1).text(); @@ -336,25 +320,24 @@ class Fanfiction extends BasicSearchable { // We have "Rated: xx", then the language, then all other tags // If the subject(s) is/are present, they are before "Rated: xx" - // ///////////// + // //////////// // Examples: // - // ///////////// + // //////////// // Search (Luna) Tags: [Harry Potter, Rated: T, English, Chapters: // 1, Words: 270, Reviews: 2, Published: 2/19/2013, Luna L.] // Normal (MLP) Tags: [Rated: T, Spanish, Drama/Suspense, Chapters: // 2, Words: 8,686, Reviews: 1, Favs: 1, Follows: 1, Updated: 4/7, - // Published: - // 4/2] + // Published: 4/2] // Crossover (MLP/Who) Tags: [Rated: K+, English, Adventure/Romance, // Chapters: 8, Words: 7,788, Reviews: 2, Favs: 2, Follows: 1, - // Published: - // 9/1/2016] + // Published: 9/1/2016] boolean rated = false; boolean isLang = false; + String subject = mainSubject == null ? "" : mainSubject; String[] tab = tags.split(" *- *"); for (int i = 0; i < tab.length; i++) { String tag = tab[i]; @@ -384,6 +367,7 @@ class Fanfiction extends BasicSearchable { tagList.add(tag); } } else { + // Normal tags are "/"-separated for (String t : tag.split("/")) { tagList.add(t); }