diff --git a/src/main/java/kinosearch/core/Kino.java b/src/main/java/kinosearch/core/Kino.java index 85bc1c7..247265f 100644 --- a/src/main/java/kinosearch/core/Kino.java +++ b/src/main/java/kinosearch/core/Kino.java @@ -1,19 +1,49 @@ package kinosearch.core; +import kinosearch.core.warez.KinoWarez; + public class Kino { private String name; private String url; + private boolean player = false; + private KinoWarez kinowarez; - public Kino(String name, String url) { + public Kino(String name, String url, KinoWarez kinoWarez) { this.name = name; this.url = url; + this.kinowarez = kinoWarez; } public String getName() { return name; } + public void setName(String name) { + this.name = name; + } + public String getUrl() { return url; } + + public boolean hasPlayer() { + return player; + } + + public void setPlayer(boolean value) { + this.player = value; + } + + public KinoWarez getKinowarez() { + return kinowarez; + } + + public String getPlayerUrl() { + if (player) { + String path = url.substring(kinowarez.getDomain().length()); + return kinowarez.getName().toLowerCase() + path; + } else { + return "#"; + } + } } diff --git a/src/main/java/kinosearch/core/warez/Hdrezka.java b/src/main/java/kinosearch/core/warez/Hdrezka.java index 20ace63..1568f22 100644 --- a/src/main/java/kinosearch/core/warez/Hdrezka.java +++ b/src/main/java/kinosearch/core/warez/Hdrezka.java @@ -8,20 +8,33 @@ import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Hdrezka implements KinoWarez { private static final String DOMAIN = "http://hdrezka.me"; + private static final String NAME = "HDREZKA"; @Override - public void search(String nameKino, List outList, boolean strong) { + public String getName() { + return NAME; + } + + @Override + public String getDomain() { + return DOMAIN; + } + + @Override + public List search(String nameKino, boolean strong) { Browser browser = Tools.createBrowser(); browser.setEncoding("UTF-8"); String html = browser.get(DOMAIN + "/?do=search&subaction=search&q=" + Tools.SafeUrlEncode(nameKino, "UTF-8")); - if (html.isEmpty()) return; + if (html.isEmpty()) return Collections.emptyList(); Document document = Jsoup.parse(html); Pattern pattern = null; @@ -30,6 +43,7 @@ public class Hdrezka implements KinoWarez { pattern = Tools.getStrongPattern(nk); } + List outList = new ArrayList<>(); Elements elements = document.getElementsByClass("b-content__inline_item-cover"); for (Element element : elements) { Element childElement = element.child(0); @@ -45,8 +59,10 @@ public class Hdrezka implements KinoWarez { } } - outList.add(new Kino("[HDREZKA] " + name, url)); + outList.add(new Kino(name, url, this)); } + + return outList; } @Override diff --git a/src/main/java/kinosearch/core/warez/KinoWarez.java b/src/main/java/kinosearch/core/warez/KinoWarez.java index f0a5212..e36a3fd 100644 --- a/src/main/java/kinosearch/core/warez/KinoWarez.java +++ b/src/main/java/kinosearch/core/warez/KinoWarez.java @@ -5,6 +5,8 @@ import kinosearch.core.Kino; import java.util.List; public interface KinoWarez { - void search(String nameKino, List outList, boolean strong); + String getName(); + List search(String nameKino, boolean strong); String player(String page); + String getDomain(); } diff --git a/src/main/java/kinosearch/core/warez/Onlinelife.java b/src/main/java/kinosearch/core/warez/Onlinelife.java index 410432a..f2ef435 100644 --- a/src/main/java/kinosearch/core/warez/Onlinelife.java +++ b/src/main/java/kinosearch/core/warez/Onlinelife.java @@ -1,6 +1,8 @@ package kinosearch.core.warez; import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import kinosearch.core.browser.Browser; import kinosearch.core.Kino; @@ -10,21 +12,34 @@ import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Onlinelife implements KinoWarez { private static final String DOMAIN = "http://www.online-life.cc"; + private static final String NAME = "OnlineLife"; @Override - public void search(String nameKino, List outList, boolean strong) { + public String getName() { + return NAME; + } + + @Override + public String getDomain() { + return DOMAIN; + } + + @Override + public List search(String nameKino, boolean strong) { Browser browser = Tools.createBrowser(); browser.setEncoding("windows-1251"); String postData = "do=search&subaction=search&mode=simple&story=" + Tools.SafeUrlEncode(nameKino, "windows-1251"); String html = browser.post(DOMAIN + "/?do=search", postData); - if (html.isEmpty()) return; + if (html.isEmpty()) return Collections.emptyList(); Document document = Jsoup.parse(html); Pattern pattern = null; @@ -35,13 +50,14 @@ public class Onlinelife implements KinoWarez { // ничего не найдено? Elements elements = document.getElementsByClass("info"); - if (elements.size() > 0) return; + if (elements.size() > 0) return Collections.emptyList(); + List outList = new ArrayList<>(); elements = document.getElementsByClass("custom-poster"); for (Element element : elements) { Element childElement = element.child(0); String name = childElement.text(); - String url = "onlinelife/" + (childElement.attr("href").substring(DOMAIN.length()+1)); + String url = childElement.attr("href"); if (strong) { Matcher matcher = pattern.matcher(name.toLowerCase()); @@ -50,8 +66,25 @@ public class Onlinelife implements KinoWarez { } } + boolean has_player = is_serial(name); + name = name.replaceAll("\\[.+", "").trim(); - outList.add(new Kino("[OnlineLife] "+name, url)); + Kino kino = new Kino(name, url, this); + kino.setPlayer(has_player); + outList.add(kino); + } + + return outList; + } + + private boolean is_serial(String name) { + Pattern pattern = Pattern.compile("\\[(.+)\\]"); + Matcher matcher = pattern.matcher(name); + if (matcher.find()) { + int idx = matcher.group().indexOf("1"); + return !(idx >= 0); + } else { + return false; } } @@ -68,12 +101,30 @@ public class Onlinelife implements KinoWarez { JsonObject jsonObj = new Gson().fromJson(json, JsonObject.class); if (jsonObj.has("file")) { - return "{\"file\":\"" + jsonObj.get("file").getAsString() + "\"}"; + String fileMp4 = jsonObj.get("file").getAsString().substring("http://".length()); + return "{\"file\":\"/proxy/onlinelife/" + fileMp4 + "\"}"; } else if (jsonObj.has("pl")) { browser.setEncoding("utf-8"); - return browser.get(jsonObj.get("pl").getAsString()); + return replaceToProxy(browser.get(jsonObj.get("pl").getAsString())); } else { return "{}"; } } + + private String replaceToProxy(String json) { + JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class); + JsonArray jsonArray = jsonObject.get("playlist").getAsJsonArray(); + + //jsonArray.get(0).getAsJsonObject().get("playlist").getAsJsonArray().get(0).getAsJsonObject().get("file").getAsString(); + + for (JsonElement elm1 : jsonArray) { + JsonArray arr1 = elm1.getAsJsonObject().get("playlist").getAsJsonArray(); + for (JsonElement elm2 : arr1) { + JsonObject obj1 = elm2.getAsJsonObject(); + obj1.addProperty("file", obj1.get("file").getAsString().replace("http://", "/proxy/onlinelife/")); + } + } + + return new Gson().toJson(jsonObject); + } } \ No newline at end of file diff --git a/src/main/java/kinosearch/core/KinoGroup.java b/src/main/java/kinosearch/webapp/KinoGroup.java similarity index 68% rename from src/main/java/kinosearch/core/KinoGroup.java rename to src/main/java/kinosearch/webapp/KinoGroup.java index d00fd8b..1645525 100644 --- a/src/main/java/kinosearch/core/KinoGroup.java +++ b/src/main/java/kinosearch/webapp/KinoGroup.java @@ -1,4 +1,7 @@ -package kinosearch.core; +package kinosearch.webapp; + +import kinosearch.core.Kino; +import kinosearch.core.warez.KinoWarez; import java.util.ArrayList; import java.util.List; @@ -10,8 +13,8 @@ import java.util.List; public class KinoGroup extends Kino { private List kinolist = new ArrayList<>(); - public KinoGroup(String name, String url) { - super(name, ""); + public KinoGroup(String name, String url, KinoWarez kinoWarez) { + super(name, "", kinoWarez); } public List getKinolist() { diff --git a/src/main/java/kinosearch/webapp/servlets/IndexServlet.java b/src/main/java/kinosearch/webapp/servlets/IndexServlet.java index 5f57431..687f04e 100644 --- a/src/main/java/kinosearch/webapp/servlets/IndexServlet.java +++ b/src/main/java/kinosearch/webapp/servlets/IndexServlet.java @@ -1,7 +1,7 @@ package kinosearch.webapp.servlets; import kinosearch.core.Kino; -import kinosearch.core.KinoGroup; +import kinosearch.webapp.KinoGroup; import kinosearch.core.Tools; import kinosearch.webapp.WebApp; import kinosearch.webapp.template.TemplateProcessor; @@ -53,7 +53,12 @@ public class IndexServlet extends HttpServlet { ThreadGroup threadGroup = new ThreadGroup(""); for (KinoWarez kinoWarez : kinoWarezSet) { //TODO на будущее надо ограничить количество одновременных потоков new Thread(threadGroup, () -> { - kinoWarez.search(search, list, strong); + List outList = kinoWarez.search(search, strong); + + for (Kino kino : outList) { + kino.setName("[" + kinoWarez.getName() + "] " + kino.getName()); + } + list.addAll(outList); }).start(); } @@ -84,7 +89,7 @@ public class IndexServlet extends HttpServlet { continue; } - KinoGroup group = new KinoGroup(s1, null); + KinoGroup group = new KinoGroup(s1, null, null); Iterator itr2 = list.iterator(); int val = 0; diff --git a/src/main/java/kinosearch/webapp/servlets/ProxyServlet.java b/src/main/java/kinosearch/webapp/servlets/ProxyServlet.java new file mode 100644 index 0000000..8b6b493 --- /dev/null +++ b/src/main/java/kinosearch/webapp/servlets/ProxyServlet.java @@ -0,0 +1,64 @@ +package kinosearch.webapp.servlets; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.Part; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; + +/** + * Created by DmitriyMX + * 2016 + */ +public class ProxyServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String path = request.getPathInfo().substring("/onlinelife/".length()); + + URL url = new URL("http://" + path); + HttpURLConnection con =(HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + con.setDoOutput(true); + con.setDoInput(true); + con.setUseCaches(true); + + for (Enumeration names = request.getHeaderNames(); names.hasMoreElements();) { + String headerName = names.nextElement().toString(); + if (headerName.equalsIgnoreCase("referer")) continue; + con.setRequestProperty(headerName, request.getHeader(headerName)); + } + + con.connect(); + + int statusCode = con.getResponseCode(); + response.setStatus(statusCode); + + for (Map.Entry> stringListEntry : con.getHeaderFields().entrySet()) { + Map.Entry mapEntry = (Map.Entry) stringListEntry; + if (mapEntry.getKey() != null) { + response.setHeader(mapEntry.getKey().toString(), ((List) mapEntry.getValue()).get(0).toString()); + } + } + + BufferedInputStream webToProxyBuf = new BufferedInputStream(con.getInputStream()); + BufferedOutputStream proxyToClientBuf = new BufferedOutputStream(response.getOutputStream()); + + int oneByte; + while ((oneByte = webToProxyBuf.read()) != -1) { + proxyToClientBuf.write(oneByte); + } + + proxyToClientBuf.flush(); + proxyToClientBuf.close(); + webToProxyBuf.close(); + con.disconnect(); + } +} diff --git a/src/test/java/test/core/TestBrowser.java b/src/test/java/core/TestBrowser.java similarity index 99% rename from src/test/java/test/core/TestBrowser.java rename to src/test/java/core/TestBrowser.java index 2ad3645..274abf9 100644 --- a/src/test/java/test/core/TestBrowser.java +++ b/src/test/java/core/TestBrowser.java @@ -1,4 +1,4 @@ -package test.core; +package core; import com.google.gson.Gson; import com.google.gson.JsonObject; diff --git a/src/test/java/test/core/warez/TestHdrezka.java b/src/test/java/core/warez/TestHdrezka.java similarity index 85% rename from src/test/java/test/core/warez/TestHdrezka.java rename to src/test/java/core/warez/TestHdrezka.java index 6e73a26..0bf9615 100644 --- a/src/test/java/test/core/warez/TestHdrezka.java +++ b/src/test/java/core/warez/TestHdrezka.java @@ -1,4 +1,4 @@ -package test.core.warez; +package core.warez; import kinosearch.core.Kino; import kinosearch.core.warez.Hdrezka; @@ -23,10 +23,9 @@ public class TestHdrezka { private void search(boolean strong) { KinoWarez kinoWarez = new Hdrezka(); - List kinoList = new ArrayList<>(); String titleKino = "рик и морти"; - kinoWarez.search(titleKino, kinoList, strong); + List kinoList = kinoWarez.search(titleKino, strong); assertTrue(kinoList.size() > 0); diff --git a/src/test/java/test/core/warez/TestOnlinelife.java b/src/test/java/core/warez/TestOnlinelife.java similarity index 85% rename from src/test/java/test/core/warez/TestOnlinelife.java rename to src/test/java/core/warez/TestOnlinelife.java index ab92b8b..00bd90c 100644 --- a/src/test/java/test/core/warez/TestOnlinelife.java +++ b/src/test/java/core/warez/TestOnlinelife.java @@ -1,4 +1,4 @@ -package test.core.warez; +package core.warez; import kinosearch.core.Kino; import kinosearch.core.warez.KinoWarez; @@ -23,10 +23,9 @@ public class TestOnlinelife { private void search(boolean strong) { KinoWarez kinoWarez = new Onlinelife(); - List kinoList = new ArrayList<>(); String titleKino = "рик и морти"; - kinoWarez.search(titleKino, kinoList, strong); + List kinoList = kinoWarez.search(titleKino, strong); assertTrue(kinoList.size() > 0); diff --git a/src/test/java/test/webapp/TestTemplateProcessor.java b/src/test/java/webapp/TestTemplateProcessor.java similarity index 93% rename from src/test/java/test/webapp/TestTemplateProcessor.java rename to src/test/java/webapp/TestTemplateProcessor.java index 1689be4..a51bb23 100644 --- a/src/test/java/test/webapp/TestTemplateProcessor.java +++ b/src/test/java/webapp/TestTemplateProcessor.java @@ -1,4 +1,4 @@ -package test.webapp; +package webapp; import kinosearch.webapp.template.FreemakerProcessor; import kinosearch.webapp.template.TemplateProcessor; @@ -6,7 +6,6 @@ import org.junit.Before; import org.junit.Test; import java.io.*; -import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; @@ -37,7 +36,7 @@ public class TestTemplateProcessor { @Test public void test() throws IOException { - System.err.println(System.getProperty("user.dir")); +// System.err.println(System.getProperty("user.dir")); TemplateProcessor templateProcessor = new FreemakerProcessor(); OutputStreamWriter writer = new OutputStreamWriter(baos); diff --git a/webapp/WEB-INF/index.html b/webapp/WEB-INF/index.html index 6dce7a4..7d79639 100644 --- a/webapp/WEB-INF/index.html +++ b/webapp/WEB-INF/index.html @@ -1,26 +1,72 @@ <#include "/header.inc.html"> - <#if resultsearch??> -
- <#if resultsearch?has_content> -
    - <#list resultsearch as kino> -
  • - <#if kino.getClass().getSimpleName() == "KinoGroup"> - ${kino.name} -
      + <#if resultsearch??> + +
      + <#if resultsearch?has_content> + <#list resultsearch as kino> + <#if kino.getClass().getSimpleName() == "KinoGroup"> +
      + +  ${kino.name} + +
      +
      <#list kino.kinolist as kino_groupped> -
    • ${kino_groupped.name}
    • +
      +
      ${kino_groupped.name}
      +
      +
      + <#if kino_groupped.hasPlayer()> + + + <#else> + + +
      +
      +
      -
    - <#else> - ${kino.name} - -
  • - -
- <#else> -

Ничего не найдено =(

- + + + + <#else> +
+
${kino.name}
+
+
+ <#if kino.hasPlayer()> + + + <#else> + + +
+
+
+ + + <#else> +

Ничего не найдено =(

+ <#else> <#include "/news.inc.html"> diff --git a/webapp/WEB-INF/news.inc.html b/webapp/WEB-INF/news.inc.html index 71850fb..8909084 100644 --- a/webapp/WEB-INF/news.inc.html +++ b/webapp/WEB-INF/news.inc.html @@ -1,4 +1,14 @@
+
+ +
+
+

Version 2.0.7b

+

Прошлый раз код идеально работал на localhost, а на реальном сервере заглох. Пришлось переделывать. + Зато теперь точно всё должно заработать.

+

Пришлось отказаться от воспроизведения сериалов. С ними придётся отдельно повозиться.

+
+
@@ -8,6 +18,7 @@

Кхм. Простите.

Вообщем, тестовая вариация плеера запущена для кинотеатра OnlineLife. Если нареканий не будет, то запущу и для остальных.

+
diff --git a/webapp/WEB-INF/player.html b/webapp/WEB-INF/player.html index 536b3cc..ce854de 100644 --- a/webapp/WEB-INF/player.html +++ b/webapp/WEB-INF/player.html @@ -4,7 +4,7 @@ $(function(){ if (typeof(video_data.file) !== 'undefined') { - $('#player').attr('src', video_data.file); + $('#player').attr('src', '${basedir}'+video_data.file); } else if (typeof(video_data.playlist) !== 'undefined') { $('#pl-season').removeClass('hide'); menu = $('#pl-season-menu'); @@ -28,7 +28,7 @@ smenu.find('a').bind('click', function(){ $('#dropdownSerial').html(this.text + ' '); - $('#player').attr('src', this.attributes['data-file'].value); + $('#player').attr('src', '${basedir}'+this.attributes['data-file'].value); }); $('#pl-serial').removeClass('hide'); diff --git a/webapp/WEB-INF/web.xml b/webapp/WEB-INF/web.xml index 12aede8..d619e21 100644 --- a/webapp/WEB-INF/web.xml +++ b/webapp/WEB-INF/web.xml @@ -22,6 +22,11 @@ kinosearch.webapp.servlets.PlayerServlet + + proxy + kinosearch.webapp.servlets.ProxyServlet + + index / @@ -38,6 +43,11 @@ /onlinelife/* + + proxy + /proxy/* + + default /js/* diff --git a/webapp/css/style.css b/webapp/css/style.css index bcc892d..7ebbf37 100644 --- a/webapp/css/style.css +++ b/webapp/css/style.css @@ -33,21 +33,8 @@ input.check-middle { vertical-align: sub; } -.resultlist { - padding-left: 0; -} - -.resultlist li { - list-style: none; -} - -.resultlist a { +a.panel-heading.spoiler { display: block; - padding: 1em; - background-color: #f1f1f1; - margin-bottom: 0.5em; - border-radius: 0.5em; - border: 1px solid #ccc; } .news time {