Commit | Line | Data |
---|---|---|
4749f2c5 NR |
1 | package be.nikiroo.fanfix.searchable; |
2 | ||
3 | import java.io.IOException; | |
4 | import java.io.InputStream; | |
5 | import java.net.URL; | |
6 | import java.net.URLEncoder; | |
7 | import java.util.ArrayList; | |
8 | import java.util.Arrays; | |
9 | import java.util.List; | |
10 | ||
11 | import org.jsoup.helper.DataUtil; | |
12 | import org.jsoup.nodes.Document; | |
13 | import org.jsoup.nodes.Element; | |
14 | import org.jsoup.select.Elements; | |
15 | ||
16 | import be.nikiroo.fanfix.Instance; | |
17 | import be.nikiroo.fanfix.bundles.StringId; | |
18 | import be.nikiroo.fanfix.data.MetaData; | |
19 | import be.nikiroo.fanfix.supported.SupportType; | |
20 | import be.nikiroo.utils.Image; | |
21 | import be.nikiroo.utils.StringUtils; | |
22 | ||
23 | class MangaLel extends BasicSearchable { | |
24 | private String BASE_URL = "http://mangas-lecture-en-ligne.fr/index_lel.php"; | |
25 | ||
26 | public MangaLel() { | |
27 | super(SupportType.MANGA_LEL); | |
28 | } | |
29 | ||
30 | @Override | |
31 | public List<SearchableTag> getTags() throws IOException { | |
32 | List<SearchableTag> tags = new ArrayList<SearchableTag>(); | |
33 | ||
34 | String url = BASE_URL + "?page=recherche"; | |
35 | Document doc = load(url, false); | |
36 | ||
37 | Element genre = doc.getElementsByClass("genre").first(); | |
38 | if (genre != null) { | |
39 | for (Element el : genre.getElementsByAttributeValueStarting("for", | |
40 | "genre")) { | |
41 | tags.add(new SearchableTag(el.attr("for"), el.text(), true)); | |
42 | } | |
43 | } | |
44 | ||
45 | return tags; | |
46 | } | |
47 | ||
48 | @Override | |
49 | public void fillTag(SearchableTag tag) throws IOException { | |
50 | // Tags are always complete | |
51 | } | |
52 | ||
53 | @Override | |
54 | public int searchPages(String search) throws IOException { | |
55 | // No pagination | |
56 | return 1; | |
57 | } | |
58 | ||
59 | @Override | |
60 | public List<MetaData> search(String search, int page) throws IOException { | |
61 | String url = BASE_URL + "?nomProjet=" | |
62 | + URLEncoder.encode(search, "utf-8") | |
63 | + "&nomAuteur=&nomTeam=&page=recherche&truc=truc"; | |
64 | ||
65 | // No pagination | |
66 | return getResults(url); | |
67 | } | |
68 | ||
69 | @Override | |
70 | public List<MetaData> search(SearchableTag tag, int page) | |
71 | throws IOException { | |
72 | String url = BASE_URL + "?nomProjet=&nomAuteur=&nomTeam=&" | |
73 | + tag.getId() + "=on&page=recherche&truc=truc"; | |
74 | ||
75 | // No pagination | |
76 | return getResults(url); | |
77 | } | |
78 | ||
79 | private List<MetaData> getResults(String sourceUrl) throws IOException { | |
80 | List<MetaData> metas = new ArrayList<MetaData>(); | |
81 | ||
82 | Document doc = DataUtil.load( | |
83 | Instance.getCache().open(new URL(sourceUrl), getSupport(), | |
84 | false), "UTF-8", sourceUrl); | |
85 | ||
86 | for (Element result : doc.getElementsByClass("rechercheAffichage")) { | |
87 | Element a = result.getElementsByTag("a").first(); | |
88 | if (a != null) { | |
12443642 NR |
89 | int projectId = -1; |
90 | ||
4749f2c5 | 91 | MetaData meta = new MetaData(); |
4749f2c5 | 92 | |
12443642 NR |
93 | // Target: |
94 | // http://mangas-lecture-en-ligne.fr/index_lel.php?page=presentationProjet&idProjet=218 | |
95 | ||
96 | // a.absUrl("href"): | |
97 | // http://mangas-lecture-en-ligne.fr/index_lel?onCommence=oui&idChapitre=2805 | |
98 | ||
99 | // ...but we need the PROJECT id, not the CHAPTER id -> use | |
100 | // <IMG> | |
4749f2c5 NR |
101 | |
102 | Elements infos = result.getElementsByClass("texte"); | |
103 | if (infos != null) { | |
104 | String[] tab = infos.outerHtml().split("<br>"); | |
105 | ||
d16065ec NR |
106 | meta.setLang("fr"); |
107 | meta.setSource(getType().getSourceName()); | |
108 | meta.setPublisher(getType().getSourceName()); | |
109 | meta.setType(getType().toString()); | |
110 | meta.setSubject("manga"); | |
111 | meta.setImageDocument(true); | |
4749f2c5 NR |
112 | meta.setTitle(getVal(tab, 0)); |
113 | meta.setAuthor(getVal(tab, 1)); | |
114 | meta.setTags(Arrays.asList(getVal(tab, 2).split(" "))); | |
115 | ||
116 | meta.setResume(getSupport() | |
117 | .makeChapter( | |
118 | new URL(sourceUrl), | |
119 | 0, | |
120 | Instance.getTrans().getString( | |
121 | StringId.DESCRIPTION), | |
122 | getVal(tab, 5))); | |
123 | } | |
124 | ||
12443642 NR |
125 | Element img = result.getElementsByTag("img").first(); |
126 | if (img != null) { | |
127 | try { | |
128 | String[] tab = img.attr("src").split("/"); | |
129 | String str = tab[tab.length - 1]; | |
130 | tab = str.split("\\."); | |
131 | str = tab[0]; | |
132 | projectId = Integer.parseInt(str); | |
133 | ||
134 | String coverUrl = img.absUrl("src"); | |
135 | try { | |
136 | InputStream in = Instance.getCache().open( | |
137 | new URL(coverUrl), getSupport(), true); | |
138 | try { | |
139 | meta.setCover(new Image(in)); | |
140 | } finally { | |
141 | in.close(); | |
142 | } | |
143 | } catch (Exception e) { | |
144 | // Happen often on MangaLEL... | |
145 | Instance.getTraceHandler().trace( | |
146 | "Cannot download cover for MangaLEL story in search mode: " | |
147 | + meta.getTitle()); | |
148 | } | |
149 | } catch (Exception e) { | |
150 | // no project id... cannot use the story :( | |
151 | Instance.getTraceHandler().error( | |
152 | "Cannot find ProjectId for MangaLEL story in search mode: " | |
153 | + meta.getTitle()); | |
154 | } | |
155 | } | |
156 | ||
157 | if (projectId >= 0) { | |
158 | meta.setUrl("http://mangas-lecture-en-ligne.fr/index_lel.php?page=presentationProjet&idProjet=" | |
159 | + projectId); | |
d16065ec | 160 | meta.setUuid(meta.getUrl()); |
12443642 NR |
161 | metas.add(meta); |
162 | } | |
4749f2c5 NR |
163 | } |
164 | } | |
165 | ||
166 | return metas; | |
167 | } | |
168 | ||
169 | private String getVal(String[] tab, int i) { | |
170 | String val = ""; | |
171 | ||
172 | if (i < tab.length) { | |
173 | val = StringUtils.unhtml(tab[i]); | |
174 | int pos = val.indexOf(":"); | |
175 | if (pos >= 0) { | |
176 | val = val.substring(pos + 1).trim(); | |
177 | } | |
178 | } | |
179 | ||
180 | return val; | |
181 | } | |
182 | } |