diff --git a/ks.server/src/main/java/ks/server/SpringConfigMVC.java b/ks.server/src/main/java/ks/server/SpringConfigMVC.java index 97459c2..030103b 100644 --- a/ks.server/src/main/java/ks/server/SpringConfigMVC.java +++ b/ks.server/src/main/java/ks/server/SpringConfigMVC.java @@ -11,7 +11,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration -@ComponentScan({ "ks.server.controllers", "ks.server.browser" }) +@ComponentScan({ "ks.server.controllers", "ks.server.browser", "ks.server.cinema" }) @EnableWebMvc public class SpringConfigMVC implements WebMvcConfigurer { @Override diff --git a/ks.server/src/main/java/ks/server/cinema/Animevost.java b/ks.server/src/main/java/ks/server/cinema/Animevost.java new file mode 100644 index 0000000..85120ab --- /dev/null +++ b/ks.server/src/main/java/ks/server/cinema/Animevost.java @@ -0,0 +1,75 @@ +package ks.server.cinema; + +import ks.server.browser.Browser; +import lombok.Getter; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Component("animevost") +@Getter +public class Animevost { + private static final transient String DOMAIN_URI = "http://animevost.org/"; + + private String title; + private String poster; + private Integer year; + private List genre; + private String type; + private String countSeries; + private String director; + private String description; + + public void fillInfo(String uri, Browser browser) { + final Document htmlDocument = Jsoup.parse(browser.get(DOMAIN_URI + uri)); + + // /html/body/section/div/div[1]/div[2]/div[2] + // .infoContent + final Element infoContent = htmlDocument.select(".infoContent").first(); + + // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/h3 + // .infoContent > h3:nth-child(1) + title = infoContent.select("h3:nth-child(1)").first().text(); + + // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/div[1]/img + // .infoContent > div:nth-child(2) > img:nth-child(1) + poster = DOMAIN_URI + infoContent.select("div:nth-child(2) > img:nth-child(1)").first() + .attr("src").substring(1); + + // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[1] + // .infoContent > p:nth-child(3) + year = Integer.parseInt(infoContent.select("p:nth-child(3)").first().childNode(1).toString().trim()); + + // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[2] + // .infoContent > p:nth-child(4) + genre = Stream.of( + infoContent.select("p:nth-child(4)").first().childNode(1).toString().trim() + .split(",")) + .map(String::trim).collect(Collectors.toList()); + + // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[3] + // .infoContent > p:nth-child(5) + type = infoContent.select("p:nth-child(5)").first().childNode(1).toString().trim(); + + // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[4] + // .infoContent > p:nth-child(6) + countSeries = infoContent.select("p:nth-child(6)").first().childNode(1).toString().trim(); + + // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[5]/a + // .infoContent > p:nth-child(7) > a:nth-child(2) + director = infoContent.select("p:nth-child(7) > a:nth-child(2)").first().text(); + + // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[6] + // .infoContent > p:nth-child(8) + description = infoContent.select("p:nth-child(8)").first().childNodes().stream() + .skip(1) + .map(node -> node.toString().trim()) + .filter(text -> !text.isEmpty() && !text.equalsIgnoreCase("
")) + .collect(Collectors.joining(" ")); + } +} diff --git a/ks.server/src/main/java/ks/server/controllers/WebController.java b/ks.server/src/main/java/ks/server/controllers/WebController.java index 3346ad6..66ffa35 100644 --- a/ks.server/src/main/java/ks/server/controllers/WebController.java +++ b/ks.server/src/main/java/ks/server/controllers/WebController.java @@ -1,9 +1,7 @@ package ks.server.controllers; import ks.server.browser.Browser; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; +import ks.server.cinema.Animevost; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMapping; @@ -12,10 +10,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.Collections; -import java.util.HashMap; import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; @RestController @RequestMapping( @@ -36,66 +31,12 @@ public class WebController { } @RequestMapping(path = "/c/animevost/info/**") - public Map animevostInfo(HttpServletRequest request) { - final String domainUri = "http://animevost.org/"; + public Animevost animevostInfo(HttpServletRequest request) { final String path = subpath(request.getRequestURI(), "/info/"); - final String cinemaRequestUri = domainUri + path; - final Map resultMap = new HashMap<>(); - resultMap.put("_uri", cinemaRequestUri); + Animevost animevost = new Animevost(); + animevost.fillInfo(path, browser); - Document htmlDocument = Jsoup.parse(browser.get(cinemaRequestUri)); - - // /html/body/section/div/div[1]/div[2]/div[2] - // .infoContent - Element infoContent = htmlDocument.select(".infoContent").first(); - - // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/h3 - // .infoContent > h3:nth-child(1) - resultMap.put("title", - infoContent.select("h3:nth-child(1)").first().text()); - - // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/div[1]/img - // .infoContent > div:nth-child(2) > img:nth-child(1) - resultMap.put("poster", domainUri + - infoContent.select("div:nth-child(2) > img:nth-child(1)").first().attr("src")); - - // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[1] - // .infoContent > p:nth-child(3) - resultMap.put("year", - Integer.parseInt(infoContent.select("p:nth-child(3)").first().childNode(1).toString().trim())); - - // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[2] - // .infoContent > p:nth-child(4) - resultMap.put("genre", Stream.of( - infoContent.select("p:nth-child(4)").first().childNode(1).toString().trim() - .split(",")) - .map(String::trim).collect(Collectors.toList())); - - // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[3] - // .infoContent > p:nth-child(5) - resultMap.put("type", - infoContent.select("p:nth-child(5)").first().childNode(1).toString().trim()); - - // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[4] - // .infoContent > p:nth-child(6) - resultMap.put("countSeries", - infoContent.select("p:nth-child(6)").first().childNode(1).toString().trim()); - - // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[5]/a - // .infoContent > p:nth-child(7) > a:nth-child(2) - resultMap.put("director", - infoContent.select("p:nth-child(7) > a:nth-child(2)").first().text()); - - // /html/body/section/div/div[1]/div[2]/div[2]/div[1]/p[6] - // .infoContent > p:nth-child(8) - resultMap.put("description", - infoContent.select("p:nth-child(8)").first().childNodes().stream() - .skip(1) - .map(node -> node.toString().trim()) - .filter(text -> !text.isEmpty() && !text.equalsIgnoreCase("
")) - .collect(Collectors.joining(" "))); - - return resultMap; + return animevost; } }