0

Merge branch 'dev'

This commit is contained in:
2016-03-26 19:49:01 +03:00
16 changed files with 286 additions and 64 deletions

View File

@@ -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 "#";
}
}
}

View File

@@ -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<Kino> outList, boolean strong) {
public String getName() {
return NAME;
}
@Override
public String getDomain() {
return DOMAIN;
}
@Override
public List<Kino> 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<Kino> 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

View File

@@ -5,6 +5,8 @@ import kinosearch.core.Kino;
import java.util.List;
public interface KinoWarez {
void search(String nameKino, List<Kino> outList, boolean strong);
String getName();
List<Kino> search(String nameKino, boolean strong);
String player(String page);
String getDomain();
}

View File

@@ -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<Kino> outList, boolean strong) {
public String getName() {
return NAME;
}
@Override
public String getDomain() {
return DOMAIN;
}
@Override
public List<Kino> 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<Kino> 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);
}
}

View File

@@ -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<Kino> kinolist = new ArrayList<>();
public KinoGroup(String name, String url) {
super(name, "");
public KinoGroup(String name, String url, KinoWarez kinoWarez) {
super(name, "", kinoWarez);
}
public List<Kino> getKinolist() {

View File

@@ -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<Kino> 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<Kino> itr2 = list.iterator();
int val = 0;

View File

@@ -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 <mail@dmitriymx.ru>
* 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<String, List<String>> 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();
}
}

View File

@@ -1,4 +1,4 @@
package test.core;
package core;
import com.google.gson.Gson;
import com.google.gson.JsonObject;

View File

@@ -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<Kino> kinoList = new ArrayList<>();
String titleKino = "рик и морти";
kinoWarez.search(titleKino, kinoList, strong);
List<Kino> kinoList = kinoWarez.search(titleKino, strong);
assertTrue(kinoList.size() > 0);

View File

@@ -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<Kino> kinoList = new ArrayList<>();
String titleKino = "рик и морти";
kinoWarez.search(titleKino, kinoList, strong);
List<Kino> kinoList = kinoWarez.search(titleKino, strong);
assertTrue(kinoList.size() > 0);

View File

@@ -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);

View File

@@ -1,26 +1,72 @@
<#include "/header.inc.html">
<#if resultsearch??>
<hr>
<#if resultsearch?has_content>
<ul class="resultlist">
<#list resultsearch as kino>
<li>
<#if kino.getClass().getSimpleName() == "KinoGroup">
<b>${kino.name}</b>
<ul>
<#if resultsearch??>
<script type="text/javascript">
$(function(){
$('a.spoiler').bind('click',function(){
$(this).next().collapse('toggle');
return false;
});
});
</script>
<hr>
<#if resultsearch?has_content>
<#list resultsearch as kino>
<#if kino.getClass().getSimpleName() == "KinoGroup">
<div class="panel panel-default">
<a href="#" class="panel-heading spoiler">
<span class="glyphicon glyphicon-chevron-down">&nbsp;</span><b>${kino.name}</b>
</a>
<div class="panel-collapse collapse out">
<div class="panel-body">
<#list kino.kinolist as kino_groupped>
<li><a href="${kino_groupped.url}" target="_blank">${kino_groupped.name}</a></li>
<div class="panel panel-default">
<div class="panel-heading"><b>${kino_groupped.name}</b></div>
<div class="panel-body">
<div class="row">
<#if kino_groupped.hasPlayer()>
<div class="col-sm-6">
<a class="btn btn-primary btn-block" href="${kino_groupped.url}" target="_blank">на сайте</a>
</div>
<div class="col-sm-6">
<a class="btn btn-danger btn-block" href="${kino_groupped.getPlayerUrl()}" target="_blank">в плеере</a>
</div>
<#else>
<div class="col-sm-12">
<a class="btn btn-primary btn-block" href="${kino_groupped.url}" target="_blank">на сайте</a>
</div>
</#if>
</div>
</div>
</div>
</#list>
</ul>
<#else>
<a href="${kino.url}" target="_blank">${kino.name}</a>
</#if>
</li>
</#list>
</ul>
<#else>
<p>Ничего не найдено =(</p>
</#if>
</div>
</div>
</div>
<#else>
<div class="panel panel-default">
<div class="panel-heading"><b>${kino.name}</b></div>
<div class="panel-body">
<div class="row">
<#if kino.hasPlayer()>
<div class="col-sm-6">
<a class="btn btn-primary btn-block" href="${kino.url}" target="_blank">на сайте</a>
</div>
<div class="col-sm-6">
<a class="btn btn-danger btn-block" href="${kino.getPlayerUrl()}" target="_blank">в плеере</a>
</div>
<#else>
<div class="col-sm-12">
<a class="btn btn-primary btn-block" href="${kino.url}" target="_blank">на сайте</a>
</div>
</#if>
</div>
</div>
</div>
</#if>
</#list>
<#else>
<p>Ничего не найдено =(</p>
</#if>
<#else>
<#include "/news.inc.html">
</#if>

View File

@@ -1,4 +1,14 @@
<div class="news row">
<div class="col-sm-2">
<time datetime="2016-03-26">26.03.2016</time>
</div>
<div class="col-sm-10">
<p><em>Version 2.0.7b</em></p>
<p>Прошлый раз код идеально работал на localhost, а на реальном сервере заглох. Пришлось переделывать.
Зато теперь точно всё должно заработать.</p>
<p>Пришлось отказаться от воспроизведения сериалов. С ними придётся отдельно повозиться.</p>
</div>
<div class="col-sm-2">
<time datetime="2016-03-24">24.03.2016</time>
</div>
@@ -8,6 +18,7 @@
<p>Кхм. Простите.</p>
<p>Вообщем, тестовая вариация плеера запущена для кинотеатра <b>OnlineLife</b>. Если нареканий не будет, то запущу и для остальных.</p>
</div>
<div class="col-sm-2">
<time datetime="2016-03-23">23.03.2016</time>
</div>

View File

@@ -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 + '&nbsp;<span class="caret"></span>');
$('#player').attr('src', this.attributes['data-file'].value);
$('#player').attr('src', '${basedir}'+this.attributes['data-file'].value);
});
$('#pl-serial').removeClass('hide');

View File

@@ -22,6 +22,11 @@
<servlet-class>kinosearch.webapp.servlets.PlayerServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>proxy</servlet-name>
<servlet-class>kinosearch.webapp.servlets.ProxyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>index</servlet-name>
<url-pattern>/</url-pattern>
@@ -38,6 +43,11 @@
<url-pattern>/onlinelife/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>proxy</servlet-name>
<url-pattern>/proxy/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/js/*</url-pattern>

View File

@@ -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 {