@@ -76,6 +76,23 @@
|
|||||||
<version>${jetty.version}</version>
|
<version>${jetty.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- BROWSER -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>2.5</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
<version>4.5.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jsoup</groupId>
|
||||||
|
<artifactId>jsoup</artifactId>
|
||||||
|
<version>1.8.3</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- COMPONENTS -->
|
<!-- COMPONENTS -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
|
|||||||
@@ -4,17 +4,23 @@ import org.springframework.context.annotation.ComponentScan;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.http.converter.HttpMessageConverter;
|
import org.springframework.http.converter.HttpMessageConverter;
|
||||||
import org.springframework.http.converter.json.GsonHttpMessageConverter;
|
import org.springframework.http.converter.json.GsonHttpMessageConverter;
|
||||||
|
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
|
||||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@ComponentScan({ "ks.server.controllers" })
|
@ComponentScan({ "ks.server.controllers", "ks.server.browser" })
|
||||||
@EnableWebMvc
|
@EnableWebMvc
|
||||||
public class SpringConfigMVC implements WebMvcConfigurer {
|
public class SpringConfigMVC implements WebMvcConfigurer {
|
||||||
@Override
|
@Override
|
||||||
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
|
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
|
||||||
converters.add(new GsonHttpMessageConverter());
|
converters.add(new GsonHttpMessageConverter());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
|
||||||
|
configurer.favorPathExtension(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package ks.server;
|
package ks.server;
|
||||||
|
|
||||||
import ks.server.controllers.ErrorPageController;
|
|
||||||
import ks.server.controllers.WebController;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.eclipse.jetty.server.ConnectionFactory;
|
import org.eclipse.jetty.server.ConnectionFactory;
|
||||||
|
|||||||
47
ks.server/src/main/java/ks/server/browser/ApacheBrowser.java
Normal file
47
ks.server/src/main/java/ks/server/browser/ApacheBrowser.java
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package ks.server.browser;
|
||||||
|
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.apache.http.HttpResponse;
|
||||||
|
import org.apache.http.client.HttpClient;
|
||||||
|
import org.apache.http.client.methods.HttpGet;
|
||||||
|
import org.apache.http.impl.client.HttpClients;
|
||||||
|
import org.springframework.context.annotation.Scope;
|
||||||
|
import org.springframework.context.annotation.ScopedProxyMode;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.context.WebApplicationContext;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
|
||||||
|
public class ApacheBrowser implements Browser {
|
||||||
|
@Setter
|
||||||
|
private String encoding = "UTF-8";
|
||||||
|
|
||||||
|
private void setupHeaders(HttpGet request) {
|
||||||
|
request.addHeader("Connection", "close");
|
||||||
|
request.addHeader("Accept-Encoding", "deflate");
|
||||||
|
request.addHeader("User-Agent", "Mozilla/5.0 (Linux; Android 7.0; SM-G892A Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/67.0.3396.87 Mobile Safari/537.36");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String get(String url) {
|
||||||
|
HttpClient client = HttpClients.createDefault();
|
||||||
|
HttpGet request = new HttpGet(url);
|
||||||
|
setupHeaders(request);
|
||||||
|
|
||||||
|
String result = "";
|
||||||
|
try {
|
||||||
|
HttpResponse response = client.execute(request);
|
||||||
|
result = IOUtils.toString(response.getEntity().getContent(), encoding);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.warn("Error i/o from GET url \"{}\": {}", url, e.getMessage());
|
||||||
|
log.debug("", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
6
ks.server/src/main/java/ks/server/browser/Browser.java
Normal file
6
ks.server/src/main/java/ks/server/browser/Browser.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package ks.server.browser;
|
||||||
|
|
||||||
|
public interface Browser {
|
||||||
|
void setEncoding(String encoding);
|
||||||
|
String get(String url);
|
||||||
|
}
|
||||||
@@ -1,21 +1,101 @@
|
|||||||
package ks.server.controllers;
|
package ks.server.controllers;
|
||||||
|
|
||||||
|
import ks.server.browser.Browser;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.stereotype.Controller;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
@Controller
|
@RestController
|
||||||
@RequestMapping(path = "/", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
|
@RequestMapping(
|
||||||
@ResponseBody
|
path = "/",
|
||||||
|
method = RequestMethod.GET,
|
||||||
|
produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
|
||||||
public class WebController {
|
public class WebController {
|
||||||
|
@Autowired
|
||||||
|
private Browser browser;
|
||||||
|
|
||||||
@RequestMapping(method = RequestMethod.GET)
|
private String subpath(String requestUri, String marker) {
|
||||||
|
return requestUri.substring(requestUri.indexOf(marker) + marker.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping
|
||||||
public Map<String, String> index() {
|
public Map<String, String> index() {
|
||||||
return Collections.singletonMap("message", "hello?");
|
return Collections.singletonMap("message", "hello?");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequestMapping(path = "/c/animevost/info/**")
|
||||||
|
public Map<String, Object> animevostInfo(HttpServletRequest request) {
|
||||||
|
final String domainUri = "http://animevost.org/";
|
||||||
|
final String path = subpath(request.getRequestURI(), "/info/");
|
||||||
|
final String cinemaRequestUri = domainUri + path;
|
||||||
|
|
||||||
|
final Map<String, Object> resultMap = new HashMap<>();
|
||||||
|
resultMap.put("_uri", cinemaRequestUri);
|
||||||
|
|
||||||
|
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("<br>"))
|
||||||
|
.collect(Collectors.joining(" ")));
|
||||||
|
|
||||||
|
return resultMap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user