šŸšø Only fail a comic state if there are no strips
[rhynodge.git] / src / main / java / net / pterodactylus / rhynodge / filters / ComicSiteFilter.java
index fec856c..818f711 100644 (file)
 
 package net.pterodactylus.rhynodge.filters;
 
-import static com.google.common.base.Preconditions.*;
+import static com.google.common.base.Preconditions.checkArgument;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.List;
 
 import net.pterodactylus.rhynodge.Filter;
 import net.pterodactylus.rhynodge.State;
 import net.pterodactylus.rhynodge.states.ComicState;
 import net.pterodactylus.rhynodge.states.ComicState.Comic;
+import net.pterodactylus.rhynodge.states.ComicState.Strip;
+import net.pterodactylus.rhynodge.states.FailedState;
 import net.pterodactylus.rhynodge.states.HtmlState;
 
 import com.google.common.base.Optional;
+import org.jetbrains.annotations.NotNull;
 import org.jsoup.nodes.Document;
 
 /**
@@ -38,26 +43,39 @@ import org.jsoup.nodes.Document;
  */
 public abstract class ComicSiteFilter implements Filter {
 
+       @NotNull
        @Override
-       public State filter(State state) {
+       public State filter(@NotNull State state) {
                checkArgument(state instanceof HtmlState, "state must be an HTML state");
 
                /* initialize states: */
                HtmlState htmlState = (HtmlState) state;
-               ComicState comicState = new ComicState();
 
                /* extract comics. */
                Optional<String> title = extractTitle(htmlState.document());
                List<String> imageUrls = extractImageUrls(htmlState.document());
+               List<String> imageComments = extractImageComments(htmlState.document());
 
                /* store comic, if found, into state. */
-               if (title.isPresent() && !imageUrls.isEmpty()) {
-                       Comic comic = new Comic(title.get());
-                       for (String imageUrl : imageUrls) {
-                               comic.addImageUrl(imageUrl);
+               if (imageUrls.isEmpty()) {
+                       return new FailedState();
+               }
+
+               ComicState comicState = new ComicState();
+               Comic comic = new Comic(title.or(""));
+               int imageCounter = 0;
+               for (String imageUrl : imageUrls) {
+                       String imageComment = (imageCounter < imageComments.size()) ? imageComments.get(imageCounter) : "";
+                       try {
+                               URI stripUri = new URI(htmlState.uri()).resolve(imageUrl.replaceAll(" ", "%20"));
+                               Strip strip = new Strip(stripUri.toString(), imageComment);
+                               imageCounter++;
+                               comic.add(strip);
+                       } catch (URISyntaxException use1) {
+                               throw new IllegalStateException(String.format("Could not resolve image URL ā€œ%sā€ against base URL ā€œ%sā€.", imageUrl, htmlState.uri()), use1);
                        }
-                       comicState.add(comic);
                }
+               comicState.add(comic);
 
                return comicState;
        }