Merge branch 'dev'
This commit is contained in:
@@ -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 "#";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
@@ -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;
|
||||
|
||||
64
src/main/java/kinosearch/webapp/servlets/ProxyServlet.java
Normal file
64
src/main/java/kinosearch/webapp/servlets/ProxyServlet.java
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package test.core;
|
||||
package core;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonObject;
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
@@ -1,23 +1,69 @@
|
||||
<#include "/header.inc.html">
|
||||
<#if resultsearch??>
|
||||
<script type="text/javascript">
|
||||
$(function(){
|
||||
$('a.spoiler').bind('click',function(){
|
||||
$(this).next().collapse('toggle');
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<hr>
|
||||
<#if resultsearch?has_content>
|
||||
<ul class="resultlist">
|
||||
<#list resultsearch as kino>
|
||||
<li>
|
||||
<#if kino.getClass().getSimpleName() == "KinoGroup">
|
||||
<b>${kino.name}</b>
|
||||
<ul>
|
||||
<div class="panel panel-default">
|
||||
<a href="#" class="panel-heading spoiler">
|
||||
<span class="glyphicon glyphicon-chevron-down"> </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>
|
||||
</#list>
|
||||
</ul>
|
||||
<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>
|
||||
<a href="${kino.url}" target="_blank">${kino.name}</a>
|
||||
<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>
|
||||
</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>
|
||||
</li>
|
||||
</#list>
|
||||
</ul>
|
||||
<#else>
|
||||
<p>Ничего не найдено =(</p>
|
||||
</#if>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 + ' <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');
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user