GUI search, step 2
[fanfix.git] / src / be / nikiroo / fanfix / searchable / MangaLel.java
CommitLineData
4749f2c5
NR
1package be.nikiroo.fanfix.searchable;
2
3import java.io.IOException;
4import java.io.InputStream;
5import java.net.URL;
6import java.net.URLEncoder;
7import java.util.ArrayList;
8import java.util.Arrays;
9import java.util.List;
10
11import org.jsoup.helper.DataUtil;
12import org.jsoup.nodes.Document;
13import org.jsoup.nodes.Element;
14import org.jsoup.select.Elements;
15
16import be.nikiroo.fanfix.Instance;
17import be.nikiroo.fanfix.bundles.StringId;
18import be.nikiroo.fanfix.data.MetaData;
19import be.nikiroo.fanfix.supported.SupportType;
20import be.nikiroo.utils.Image;
21import be.nikiroo.utils.StringUtils;
22
23class 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}