45455b610f2a05193746e4e8bffcf0163d10e55a
1 package be
.nikiroo
.fanfix
.supported
;
3 import java
.awt
.image
.BufferedImage
;
4 import java
.io
.IOException
;
5 import java
.io
.InputStream
;
6 import java
.net
.MalformedURLException
;
8 import java
.util
.ArrayList
;
9 import java
.util
.HashMap
;
10 import java
.util
.List
;
12 import java
.util
.Map
.Entry
;
13 import java
.util
.Scanner
;
15 import be
.nikiroo
.fanfix
.Instance
;
16 import be
.nikiroo
.fanfix
.data
.MetaData
;
17 import be
.nikiroo
.utils
.Progress
;
18 import be
.nikiroo
.utils
.StringUtils
;
21 * Support class for <a href="http://www.fimfiction.net/">FimFiction.net</a>
22 * stories, a website dedicated to My Little Pony.
26 class Fimfiction
extends BasicSupport
{
28 protected boolean isHtml() {
33 public String
getSourceName() {
34 return "FimFiction.net";
38 protected MetaData
getMeta(URL source
, InputStream in
) throws IOException
{
39 MetaData meta
= new MetaData();
41 meta
.setTitle(getTitle(reset(in
)));
42 meta
.setAuthor(getAuthor(reset(in
)));
43 meta
.setDate(getDate(reset(in
)));
44 meta
.setTags(getTags(reset(in
)));
45 meta
.setSource(getSourceName());
46 meta
.setUrl(source
.toString());
47 meta
.setPublisher(getSourceName());
48 meta
.setUuid(source
.toString());
51 meta
.setSubject("MLP");
52 meta
.setType(getType().toString());
53 meta
.setImageDocument(false);
54 meta
.setCover(getCover(reset(in
)));
60 public Map
<String
, String
> getCookies() {
61 Map
<String
, String
> cookies
= new HashMap
<String
, String
>();
62 cookies
.put("view_mature", "true");
66 private List
<String
> getTags(InputStream in
) {
67 List
<String
> tags
= new ArrayList
<String
>();
70 @SuppressWarnings("resource")
71 Scanner scan
= new Scanner(in
, "UTF-8");
72 scan
.useDelimiter("\\n");
73 boolean started
= false;
74 while (scan
.hasNext()) {
75 String line
= scan
.next();
78 started
= line
.contains("\"story_container\"");
81 if (started
&& line
.contains("class=\"tag-")) {
82 if (line
.contains("index.php")) {
83 break; // end of *this story* tags
86 String tab
[] = line
.split("<li>");
87 for (String subline
: tab
) {
88 subline
= StringUtils
.unhtml(subline
).trim();
89 if (!subline
.isEmpty() && !tags
.contains(subline
)) {
99 private String
getTitle(InputStream in
) {
100 String line
= getLine(in
, " property=\"og:title\"", 0);
103 for (int i
= 0; i
< 3; i
++) {
104 pos
= line
.indexOf('"', pos
+ 1);
108 line
= line
.substring(pos
+ 1);
109 pos
= line
.indexOf('"');
111 return StringUtils
.unhtml(line
.substring(0, pos
)).trim();
119 private String
getAuthor(InputStream in
) {
120 String line
= getLine(in
, " href=\"/user/", 0);
122 int pos
= line
.indexOf('"');
124 line
= line
.substring(pos
+ 1);
125 pos
= line
.indexOf('"');
127 line
= line
.substring(0, pos
);
128 pos
= line
.lastIndexOf('/');
130 line
= line
.substring(pos
+ 1);
131 return line
.replace('+', ' ');
140 private String
getDate(InputStream in
) {
141 String line
= getLine(in
, "<span class=\"date\">", 0);
144 for (int i
= 0; i
< 3; i
++) {
145 pos
= line
.indexOf('>', pos
+ 1);
149 line
= line
.substring(pos
+ 1);
150 pos
= line
.indexOf('<');
152 return line
.substring(0, pos
).trim();
161 protected String
getDesc(URL source
, InputStream in
) {
162 // the og: meta version is the SHORT resume, this is the LONG resume
163 return getLine(in
, "class=\"description-text bbcode\"", 1);
166 private BufferedImage
getCover(InputStream in
) {
167 // Note: the 'og:image' is the SMALL cover, not the full version
168 String cover
= getLine(in
, "class=\"story_container__story_image\"", 1);
170 int pos
= cover
.indexOf('"');
172 cover
= cover
.substring(pos
+ 1);
173 pos
= cover
.indexOf('"');
175 cover
= cover
.substring(0, pos
);
180 return getImage(this, null, cover
);
184 protected List
<Entry
<String
, URL
>> getChapters(URL source
, InputStream in
,
186 List
<Entry
<String
, URL
>> urls
= new ArrayList
<Entry
<String
, URL
>>();
187 @SuppressWarnings("resource")
188 Scanner scan
= new Scanner(in
, "UTF-8");
189 scan
.useDelimiter("\\n");
190 boolean started
= false;
191 while (scan
.hasNext()) {
192 String line
= scan
.next().trim();
195 started
= line
.equals("<!--Chapters-->");
197 if (line
.equals("</form>")) {
201 if (line
.startsWith("<a href=")) {
204 int pos
= name
.indexOf('>');
206 name
= name
.substring(pos
+ 1);
207 pos
= name
.indexOf('<');
209 name
= name
.substring(0, pos
);
213 pos
= line
.indexOf('/');
215 line
= line
.substring(pos
); // we take the /, not +1
216 pos
= line
.indexOf('"');
218 line
= line
.substring(0, pos
);
223 final String key
= name
;
224 final URL value
= new URL("http://www.fimfiction.net"
226 urls
.add(new Entry
<String
, URL
>() {
227 public URL
setValue(URL value
) {
231 public String
getKey() {
235 public URL
getValue() {
239 } catch (MalformedURLException e
) {
250 protected String
getChapterContent(URL source
, InputStream in
, int number
,
252 return getLine(in
, "<div class=\"bbcode\">", 1);
256 protected boolean supports(URL url
) {
257 return "fimfiction.net".equals(url
.getHost())
258 || "www.fimfiction.net".equals(url
.getHost());