search should now be OK (CLI, Fanfiction only)
[nikiroo-utils.git] / src / be / nikiroo / fanfix / supported / MangaLel.java
CommitLineData
af1f506f
NR
1package be.nikiroo.fanfix.supported;
2
3import java.io.IOException;
4import java.io.InputStream;
5import java.net.MalformedURLException;
6import java.net.URL;
7import java.util.AbstractMap;
8import java.util.ArrayList;
9import java.util.Collections;
10import java.util.List;
11import java.util.Map.Entry;
12
13import org.jsoup.helper.DataUtil;
14import org.jsoup.nodes.Element;
15import org.jsoup.select.Elements;
16
17import be.nikiroo.fanfix.Instance;
18import be.nikiroo.fanfix.data.MetaData;
19import be.nikiroo.utils.Image;
20import be.nikiroo.utils.Progress;
21import be.nikiroo.utils.StringUtils;
22
23class MangaLel extends BasicSupport {
24 @Override
25 protected boolean isHtml() {
26 return true;
27 }
28
af1f506f
NR
29 @Override
30 protected MetaData getMeta() throws IOException {
31 MetaData meta = new MetaData();
32
33 String[] authorDateTag = getAuthorDateTag();
34
35 meta.setTitle(getTitle());
36 meta.setAuthor(authorDateTag[0]);
37 meta.setDate(authorDateTag[1]);
38 meta.setTags(explode(authorDateTag[2]));
727108fe 39 meta.setSource(getType().getSourceName());
af1f506f 40 meta.setUrl(getSource().toString());
727108fe 41 meta.setPublisher(getType().getSourceName());
af1f506f
NR
42 meta.setUuid(getSource().toString());
43 meta.setLuid("");
44 meta.setLang("fr");
45 meta.setSubject("manga");
46 meta.setType(getType().toString());
47 meta.setImageDocument(true);
48 meta.setCover(getCover());
49
50 return meta;
51 }
52
53 private String getTitle() {
54 Element doc = getSourceNode();
55 Element h2 = doc.getElementsByClass("widget-title").first();
56 if (h2 != null) {
57 return StringUtils.unhtml(h2.text()).trim();
58 }
59
60 return null;
61 }
62
63 // 0 = author
64 // 1 = date
65 // 2 = tags
66 private String[] getAuthorDateTag() {
67 String[] tab = new String[3];
68
69 Element doc = getSourceNode();
70 Element tabEls = doc.getElementsByClass("dl-horizontal").first();
71 int prevOk = 0;
72 for (Element tabEl : tabEls.children()) {
73 String txt = tabEl.text().trim();
74 if (prevOk > 0) {
75 if (tab[prevOk - 1] == null) {
76 tab[prevOk - 1] = "";
77 } else {
78 tab[prevOk - 1] += ", ";
79 }
80
81 tab[prevOk - 1] += txt;
82 prevOk = 0;
83 } else {
84 if (txt.equals("Auteur(s)") || txt.equals("Artist(s)")) {
85 prevOk = 1;
86 } else if (txt.equals("Date de sortie")) {
87 prevOk = 2;
88 } else if (txt.equals("Type") || txt.equals("Catégories")) {
89 prevOk = 3;
90 } else {
91 prevOk = 0;
92 }
93 }
94 }
95
96 for (int i = 0; i < 3; i++) {
97 String list = "";
98 for (String item : explode(tab[i])) {
99 if (!list.isEmpty()) {
100 list = list + ", ";
101 }
102 list += item;
103 }
104 tab[i] = list;
105 }
106
107 return tab;
108 }
109
110 @Override
111 protected String getDesc() {
112 String desc = null;
113
114 Element doc = getSourceNode();
115 Element title = doc.getElementsByClass("well").first();
116 if (title != null) {
117 desc = StringUtils.unhtml(title.text()).trim();
118 if (desc.startsWith("Résumé")) {
119 desc = desc.substring("Résumé".length()).trim();
120 }
121 }
122
123 return desc;
124 }
125
126 private Image getCover() {
127 Element doc = getSourceNode();
128 Element cover = doc.getElementsByClass("img-responsive").first();
129
130 if (cover != null) {
131 String coverUrl = cover.absUrl("src");
132
133 InputStream coverIn;
134 try {
135 coverIn = Instance.getCache().open(new URL(coverUrl), this,
136 true);
137 try {
138 return new Image(coverIn);
139 } finally {
140 coverIn.close();
141 }
142 } catch (IOException e) {
143 Instance.getTraceHandler().error(e);
144 }
145 }
146
147 return null;
148 }
149
150 @Override
151 protected List<Entry<String, URL>> getChapters(Progress pg) {
152 List<Entry<String, URL>> urls = new ArrayList<Entry<String, URL>>();
153
9e2fad36 154 int i = 0;
af1f506f 155 Element doc = getSourceNode();
9e2fad36
NR
156 Elements chapEls = doc.getElementsByClass("chapters").first()
157 .getElementsByTag("li");
158 for (Element chapEl : chapEls) {
af1f506f
NR
159 Element titleEl = chapEl.getElementsByTag("h5").first();
160 String title = StringUtils.unhtml(titleEl.text()).trim();
9e2fad36
NR
161
162 // because Atril does not support strange file names
163 title = Integer.toString(chapEls.size() - i);
af1f506f
NR
164
165 Element linkEl = chapEl.getElementsByTag("h5").first()
166 .getElementsByTag("a").first();
167 String link = linkEl.absUrl("href");
168
169 try {
170 urls.add(new AbstractMap.SimpleEntry<String, URL>(title,
171 new URL(link)));
172 } catch (MalformedURLException e) {
173 Instance.getTraceHandler().error(e);
174 }
9e2fad36
NR
175
176 i++;
af1f506f
NR
177 }
178
179 Collections.reverse(urls);
180 return urls;
181 }
182
183 @Override
184 protected String getChapterContent(URL chapUrl, int number, Progress pg)
185 throws IOException {
186 if (pg == null) {
187 pg = new Progress();
188 }
189
190 StringBuilder builder = new StringBuilder();
191
192 InputStream in = Instance.getCache().open(chapUrl, this, false);
193 try {
194 Element pageDoc = DataUtil.load(in, "UTF-8", chapUrl.toString());
195 Elements linkEls = pageDoc.getElementsByClass("img-responsive");
196 for (Element linkEl : linkEls) {
197 if (linkEl.hasAttr("data-src")) {
198 builder.append("[");
199 builder.append(linkEl.absUrl("data-src").trim());
200 builder.append("]<br/>");
201 }
202 }
203
204 } finally {
205 in.close();
206 }
207
208 return builder.toString();
209 }
210
211 /**
212 * Explode an HTML comma-separated list of values into a non-duplicate text
213 * {@link List} .
214 *
215 * @param values
216 * the comma-separated values in HTML format
217 *
218 * @return the full list with no duplicate in text format
219 */
220 private List<String> explode(String values) {
221 List<String> list = new ArrayList<String>();
222 if (values != null && !values.isEmpty()) {
223 for (String auth : values.split(",")) {
224 String a = StringUtils.unhtml(auth).trim();
225 if (!a.isEmpty() && !list.contains(a.trim())) {
226 list.add(a);
227 }
228 }
229 }
230
231 return list;
232 }
233
234 @Override
235 protected boolean supports(URL url) {
236 return "manga-lel.com".equals(url.getHost())
237 || "www.manga-lel.com".equals(url.getHost());
238 }
239}