Изменение внутренних алгоритмов построения плейлиста
Теперь генерируется вначале обобщенный KinoPlay объект, сочетающий в себе все прелести обычного фильма, сериала и сезонных сериалов. Из недоделок, сейчас коряво работает возобновение просмотра.
This commit is contained in:
31
src/main/java/kinosearch/core/KinoItem.java
Normal file
31
src/main/java/kinosearch/core/KinoItem.java
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <mail@dmitriymx.ru>
|
||||||
|
* 2017-01-05
|
||||||
|
*/
|
||||||
|
package kinosearch.core;
|
||||||
|
|
||||||
|
public class KinoItem {
|
||||||
|
private String title;
|
||||||
|
private String fileMp4;
|
||||||
|
|
||||||
|
public KinoItem(String title, String file) {
|
||||||
|
this.title = title;
|
||||||
|
this.fileMp4 = file;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFile() {
|
||||||
|
return fileMp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFile(String fileMp4) {
|
||||||
|
this.fileMp4 = fileMp4;
|
||||||
|
}
|
||||||
|
}
|
||||||
60
src/main/java/kinosearch/core/KinoPlay.java
Normal file
60
src/main/java/kinosearch/core/KinoPlay.java
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <mail@dmitriymx.ru>
|
||||||
|
* 2017-01-05
|
||||||
|
*/
|
||||||
|
package kinosearch.core;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class KinoPlay {
|
||||||
|
private String title;
|
||||||
|
private KinoType type = KinoType.UNKNOW;
|
||||||
|
private KinoItem oneFilm;
|
||||||
|
private ArrayList<KinoItem> serials;
|
||||||
|
private Map<String, ArrayList<KinoItem>> seasons;
|
||||||
|
|
||||||
|
public enum KinoType {
|
||||||
|
UNKNOW, ONE_FILM, SIMPLE_SERIAL, SEASONS_SERIAL
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KinoType getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(KinoType type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KinoItem getOneFilm() {
|
||||||
|
return oneFilm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOneFilm(KinoItem oneFilm) {
|
||||||
|
this.oneFilm = oneFilm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<KinoItem> getSerials() {
|
||||||
|
return serials;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSerials(ArrayList<KinoItem> serials) {
|
||||||
|
this.serials = serials;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, ArrayList<KinoItem>> getSeasons() {
|
||||||
|
return seasons;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSeasons(Map<String, ArrayList<KinoItem>> seasons) {
|
||||||
|
this.seasons = seasons;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,8 +4,11 @@
|
|||||||
*/
|
*/
|
||||||
package kinosearch.core;
|
package kinosearch.core;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
import kinosearch.core.browser.ApacheHttpBrowser;
|
import kinosearch.core.browser.ApacheHttpBrowser;
|
||||||
import kinosearch.core.browser.Browser;
|
import kinosearch.core.browser.Browser;
|
||||||
|
import kinosearch.webapp.KinoPlaySerializer;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
@@ -19,4 +22,10 @@ public class SpringConfig {
|
|||||||
public Browser browser() {
|
public Browser browser() {
|
||||||
return new ApacheHttpBrowser();
|
return new ApacheHttpBrowser();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Scope("singleton")
|
||||||
|
public Gson gson() {
|
||||||
|
return new GsonBuilder().registerTypeAdapter(KinoPlay.class, new KinoPlaySerializer()).create();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
package kinosearch.core.warez;
|
package kinosearch.core.warez;
|
||||||
|
|
||||||
import kinosearch.core.Kino;
|
import kinosearch.core.Kino;
|
||||||
|
import kinosearch.core.KinoPlay;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface KinoWarez {
|
public interface KinoWarez {
|
||||||
String getName();
|
String getName();
|
||||||
List<Kino> search(String nameKino, boolean strong);
|
List<Kino> search(String nameKino, boolean strong);
|
||||||
String player(String page);
|
KinoPlay player(String page);
|
||||||
String getDomain();
|
String getDomain();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import com.google.gson.JsonArray;
|
|||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import kinosearch.core.Kino;
|
import kinosearch.core.Kino;
|
||||||
|
import kinosearch.core.KinoItem;
|
||||||
|
import kinosearch.core.KinoPlay;
|
||||||
import kinosearch.core.Tools;
|
import kinosearch.core.Tools;
|
||||||
import kinosearch.core.browser.Browser;
|
import kinosearch.core.browser.Browser;
|
||||||
import org.jsoup.Jsoup;
|
import org.jsoup.Jsoup;
|
||||||
@@ -14,9 +16,7 @@ import org.jsoup.select.Elements;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -26,6 +26,8 @@ public class Onlinelife implements KinoWarez {
|
|||||||
private static final String NAME = "OnlineLife";
|
private static final String NAME = "OnlineLife";
|
||||||
@Autowired
|
@Autowired
|
||||||
private Browser browser;
|
private Browser browser;
|
||||||
|
@Autowired
|
||||||
|
private Gson gson;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
@@ -80,26 +82,76 @@ public class Onlinelife implements KinoWarez {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String player(String page) {
|
public KinoPlay player(String page) {
|
||||||
|
// получаем id фильма
|
||||||
String movie_id = page.substring(1,page.indexOf("-"));
|
String movie_id = page.substring(1,page.indexOf("-"));
|
||||||
|
|
||||||
|
// делаем запрос на получение json данных
|
||||||
browser.setEncoding("windows-1251");
|
browser.setEncoding("windows-1251");
|
||||||
browser.setHeader("Referer", "http://dterod.com/player.php?newsid=" + movie_id);
|
browser.setHeader("Referer", "http://dterod.com/player.php?newsid=" + movie_id);
|
||||||
String html = browser.get("http://dterod.com/js.php?id=" + movie_id);
|
String html = browser.get("http://dterod.com/js.php?id=" + movie_id);
|
||||||
html = html.substring(0, html.indexOf('\n')).trim();
|
html = html.substring(0, html.indexOf('\n')).trim();
|
||||||
String json = html.substring(html.indexOf('{'), html.indexOf("};")+1);
|
String json = html.substring(html.indexOf('{'), html.indexOf("};")+1);
|
||||||
JsonObject jsonObj = new Gson().fromJson(json, JsonObject.class);
|
JsonObject jsonObj = gson.fromJson(json, JsonObject.class);
|
||||||
|
|
||||||
|
// формируем результат
|
||||||
|
KinoPlay kinoPlay = new KinoPlay();
|
||||||
if (jsonObj.has("file")) {
|
if (jsonObj.has("file")) {
|
||||||
String fileMp4 = jsonObj.get("file").getAsString().substring("http://".length());
|
// одиночный фильм
|
||||||
|
kinoPlay.setType(KinoPlay.KinoType.ONE_FILM);
|
||||||
|
|
||||||
String title = jsonObj.get("comment").getAsString();
|
String title = jsonObj.get("comment").getAsString();
|
||||||
return "{\"file\":\"/proxy/onlinelife/" + fileMp4 + "\",\"title\":\"" + title + "\"}";
|
kinoPlay.setTitle(title);
|
||||||
|
kinoPlay.setOneFilm(new KinoItem(
|
||||||
|
title,
|
||||||
|
"/proxy/onlinelife/" + jsonObj.get("file").getAsString().substring("http://".length())
|
||||||
|
));
|
||||||
} else if (jsonObj.has("pl")) {
|
} else if (jsonObj.has("pl")) {
|
||||||
browser.setEncoding("utf-8");
|
browser.setEncoding("utf-8");
|
||||||
return replaceToProxy(browser.get(jsonObj.get("pl").getAsString()));
|
json = browser.get(jsonObj.get("pl").getAsString());
|
||||||
} else {
|
jsonObj = gson.fromJson(json, JsonObject.class);
|
||||||
return "{}";
|
JsonArray jsonArray = jsonObj.get("playlist").getAsJsonArray();
|
||||||
|
|
||||||
|
JsonObject jsonTestObj = jsonArray.get(0).getAsJsonObject();
|
||||||
|
if (jsonTestObj.has("playlist")) {
|
||||||
|
// сезонный сериал
|
||||||
|
kinoPlay.setType(KinoPlay.KinoType.SEASONS_SERIAL);
|
||||||
|
|
||||||
|
Map<String, ArrayList<KinoItem>> seasons = new HashMap<>();
|
||||||
|
for (JsonElement element : jsonArray) {
|
||||||
|
jsonObj = element.getAsJsonObject();
|
||||||
|
String titleSeason = jsonObj.get("comment").getAsString();
|
||||||
|
|
||||||
|
ArrayList<KinoItem> serials = new ArrayList<>();
|
||||||
|
JsonArray jsonSerials = jsonObj.get("playlist").getAsJsonArray();
|
||||||
|
for (JsonElement elm1 : jsonSerials) {
|
||||||
|
jsonObj = elm1.getAsJsonObject();
|
||||||
|
serials.add(new KinoItem(
|
||||||
|
jsonObj.get("comment").getAsString(),
|
||||||
|
jsonObj.get("file").getAsString().replace("http://", "/proxy/onlinelife/")
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
seasons.put(titleSeason, serials);
|
||||||
|
}
|
||||||
|
|
||||||
|
kinoPlay.setSeasons(seasons);
|
||||||
|
} else {
|
||||||
|
// простой сериал
|
||||||
|
kinoPlay.setType(KinoPlay.KinoType.SIMPLE_SERIAL);
|
||||||
|
|
||||||
|
ArrayList<KinoItem> serials = new ArrayList<>();
|
||||||
|
for (JsonElement element : jsonArray) {
|
||||||
|
jsonObj = element.getAsJsonObject();
|
||||||
|
serials.add(new KinoItem(
|
||||||
|
jsonObj.get("comment").getAsString(),
|
||||||
|
jsonObj.get("file").getAsString().replace("http://", "/proxy/onlinelife/")
|
||||||
|
));
|
||||||
|
}
|
||||||
|
kinoPlay.setSerials(serials);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return kinoPlay;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String replaceToProxy(String json) {
|
private String replaceToProxy(String json) {
|
||||||
|
|||||||
92
src/main/java/kinosearch/webapp/KinoPlaySerializer.java
Normal file
92
src/main/java/kinosearch/webapp/KinoPlaySerializer.java
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <mail@dmitriymx.ru>
|
||||||
|
* 2017-01-05
|
||||||
|
*/
|
||||||
|
package kinosearch.webapp;
|
||||||
|
|
||||||
|
import com.google.gson.*;
|
||||||
|
import kinosearch.core.KinoItem;
|
||||||
|
import kinosearch.core.KinoPlay;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class KinoPlaySerializer implements JsonSerializer<KinoPlay> {
|
||||||
|
@Override
|
||||||
|
public JsonElement serialize(KinoPlay kinoPlay, Type type, JsonSerializationContext jsonSerializationContext) {
|
||||||
|
JsonObject outJson = new JsonObject();
|
||||||
|
|
||||||
|
outJson.addProperty("title", kinoPlay.getTitle());
|
||||||
|
outJson.addProperty("type", kinoPlay.getType().name().toLowerCase());
|
||||||
|
|
||||||
|
if (kinoPlay.getType().equals(KinoPlay.KinoType.ONE_FILM)) {
|
||||||
|
outJson.addProperty("file", kinoPlay.getOneFilm().getFile());
|
||||||
|
} else if (kinoPlay.getType().equals(KinoPlay.KinoType.SIMPLE_SERIAL)) {
|
||||||
|
JsonArray jsonArray = new JsonArray();
|
||||||
|
for (KinoItem kinoItem : kinoPlay.getSerials()) {
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
jsonObject.addProperty("title", kinoItem.getTitle());
|
||||||
|
jsonObject.addProperty("file", kinoItem.getFile());
|
||||||
|
jsonArray.add(jsonObject);
|
||||||
|
}
|
||||||
|
outJson.add("serials", jsonArray);
|
||||||
|
} else if (kinoPlay.getType().equals(KinoPlay.KinoType.SEASONS_SERIAL)) {
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
title: 'Title',
|
||||||
|
type: 'seasons',
|
||||||
|
seasons: [
|
||||||
|
{
|
||||||
|
title: 'seasonName'
|
||||||
|
serials: [
|
||||||
|
{
|
||||||
|
title: 'title',
|
||||||
|
file: 'fileMp4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'title',
|
||||||
|
file: 'fileMp4'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'seasonName'
|
||||||
|
serials: [
|
||||||
|
{
|
||||||
|
title: 'title',
|
||||||
|
file: 'fileMp4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'title',
|
||||||
|
file: 'fileMp4'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
JsonArray jsonSeasons = new JsonArray();
|
||||||
|
|
||||||
|
for (Map.Entry<String, ArrayList<KinoItem>> entry : kinoPlay.getSeasons().entrySet()) {
|
||||||
|
JsonObject jsonSeason = new JsonObject();
|
||||||
|
jsonSeason.addProperty("title", entry.getKey());
|
||||||
|
|
||||||
|
JsonArray jsonSerials = new JsonArray();
|
||||||
|
for (KinoItem kinoItem : entry.getValue()) {
|
||||||
|
JsonObject jsonItem = new JsonObject();
|
||||||
|
jsonItem.addProperty("title", kinoItem.getTitle());
|
||||||
|
jsonItem.addProperty("file", kinoItem.getFile());
|
||||||
|
jsonSerials.add(jsonItem);
|
||||||
|
}
|
||||||
|
jsonSeason.add("serials", jsonSerials);
|
||||||
|
|
||||||
|
jsonSeasons.add(jsonSeason);
|
||||||
|
}
|
||||||
|
|
||||||
|
outJson.add("seasons", jsonSeasons);
|
||||||
|
}
|
||||||
|
|
||||||
|
return outJson;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,11 +4,11 @@
|
|||||||
*/
|
*/
|
||||||
package kinosearch.webapp;
|
package kinosearch.webapp;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import kinosearch.core.KinoPlay;
|
||||||
import kinosearch.core.SpringConfig;
|
import kinosearch.core.SpringConfig;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.*;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.context.annotation.Import;
|
|
||||||
import org.springframework.web.servlet.ViewResolver;
|
import org.springframework.web.servlet.ViewResolver;
|
||||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||||
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||||
@@ -36,6 +36,12 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter {
|
|||||||
return freeMarkerConfigurer;
|
return freeMarkerConfigurer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Scope("singleton")
|
||||||
|
public Gson gson() {
|
||||||
|
return new GsonBuilder().registerTypeAdapter(KinoPlay.class, new KinoPlaySerializer()).create();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||||
registry.addResourceHandler("/css/**")
|
registry.addResourceHandler("/css/**")
|
||||||
|
|||||||
@@ -4,7 +4,9 @@
|
|||||||
*/
|
*/
|
||||||
package kinosearch.webapp;
|
package kinosearch.webapp;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
import kinosearch.core.Kino;
|
import kinosearch.core.Kino;
|
||||||
|
import kinosearch.core.KinoPlay;
|
||||||
import kinosearch.core.Tools;
|
import kinosearch.core.Tools;
|
||||||
import kinosearch.core.warez.KinoWarez;
|
import kinosearch.core.warez.KinoWarez;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -152,8 +154,9 @@ public class WebAppController {
|
|||||||
if (kinoWarez == null) {
|
if (kinoWarez == null) {
|
||||||
return "redirect:/";
|
return "redirect:/";
|
||||||
}
|
}
|
||||||
String json = kinoWarez.player(request.getServletPath().substring(("/player/"+warez).length()));
|
KinoPlay kinoPlay = kinoWarez.player(request.getServletPath().substring(("/player/"+warez).length()));
|
||||||
model.put("json", json);
|
Gson gson = coreContext.getBean(Gson.class);
|
||||||
|
model.put("json", gson.toJson(kinoPlay));
|
||||||
|
|
||||||
return "player";
|
return "player";
|
||||||
}
|
}
|
||||||
@@ -177,7 +180,7 @@ public class WebAppController {
|
|||||||
|
|
||||||
con.connect();
|
con.connect();
|
||||||
|
|
||||||
int statusCode = con.getResponseCode();
|
int statusCode = con.getResponseCode(); //FIXME bug #20
|
||||||
response.setStatus(statusCode);
|
response.setStatus(statusCode);
|
||||||
|
|
||||||
for (Map.Entry<String, List<String>> stringListEntry : con.getHeaderFields().entrySet()) {
|
for (Map.Entry<String, List<String>> stringListEntry : con.getHeaderFields().entrySet()) {
|
||||||
|
|||||||
@@ -1,137 +1,64 @@
|
|||||||
<#include "/header.inc.html">
|
<#include "/header.inc.html">
|
||||||
<script type="text/javascript" src="${basedir}/js/js.cookie-2.1.0.min.js"></script>
|
<script type="text/javascript" src="${basedir}/js/js.cookie-2.1.0.min.js"></script>
|
||||||
|
<script type="text/javascript" src="${basedir}/js/player.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var video_data = ${json};
|
var playerCore;
|
||||||
var player;
|
var data;
|
||||||
var origDocTitle;
|
var plSeason;
|
||||||
var isSerial = false;
|
var plSerial;
|
||||||
|
var playerObj;
|
||||||
function msToTime(ms) {
|
|
||||||
function addZ(n) { return (n<10? '0':'') + n; }
|
|
||||||
|
|
||||||
var _ms = ms % 1000;
|
|
||||||
ms = (ms - _ms) / 1000;
|
|
||||||
var _sec = ms % 60;
|
|
||||||
ms = (ms - _sec) / 60;
|
|
||||||
var _min = ms % 60;
|
|
||||||
var _hr = (ms - _min) / 60;
|
|
||||||
|
|
||||||
return {
|
|
||||||
's': addZ(_sec),
|
|
||||||
'm': addZ(_min),
|
|
||||||
'h': addZ(_hr)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function setTitle(text) {
|
|
||||||
document.title = text + " :: " + origDocTitle;
|
|
||||||
$('#title').text(text);
|
|
||||||
$('#title').show();
|
|
||||||
}
|
|
||||||
|
|
||||||
function setSeason(idx) {
|
|
||||||
var season_title = video_data.playlist[idx].comment;
|
|
||||||
$('#dropdownSeason').html(season_title + ' <span class="caret"></span>');
|
|
||||||
$('#dropdownSerial').html('Serials <span class="caret"></span>');
|
|
||||||
|
|
||||||
var serial_menu = $('#pl-serial-menu');
|
|
||||||
serial_menu.html('');
|
|
||||||
video_data.playlist[idx].playlist.forEach(function(item, i){
|
|
||||||
serial_menu.append('<li><a data-file="' + item.file + '" data-season="' + idx + '" href="#" onclick="setSerial('+ idx + ',' + i + ');return false;">' + item.comment + '</a></li>');
|
|
||||||
});
|
|
||||||
|
|
||||||
/*
|
|
||||||
serial_menu.find('a').bind('click', function(){
|
|
||||||
$('#dropdownSerial').html(this.text + ' <span class="caret"></span>');
|
|
||||||
player.attr('src', '${basedir}'+this.attributes['data-file'].value);
|
|
||||||
player.attr('data-season', this.attributes['data-season'].value);
|
|
||||||
player.attr('data-serial', this.attributes['data-serial'].value);
|
|
||||||
setTitle(this.text);
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
$('#pl-serial').removeClass('hide');
|
|
||||||
}
|
|
||||||
|
|
||||||
function setSerial(idx, sidx) {
|
|
||||||
var serial_title = video_data.playlist[idx].playlist[sidx].comment;
|
|
||||||
$('#dropdownSerial').html(serial_title + ' <span class="caret"></span>');
|
|
||||||
|
|
||||||
var serial_file = video_data.playlist[idx].playlist[sidx].file;
|
|
||||||
player.attr('src', '${basedir}' + serial_file);
|
|
||||||
player.attr('data-season', idx);
|
|
||||||
player.attr('data-serial', sidx);
|
|
||||||
setTitle(serial_title);
|
|
||||||
}
|
|
||||||
|
|
||||||
$(function(){
|
$(function(){
|
||||||
player = $('#player');
|
var video_data = ${json};
|
||||||
origDocTitle = document.title;
|
var titleObj = $('#title');
|
||||||
if (typeof(video_data.title) !== 'undefined') {
|
|
||||||
setTitle(video_data.title);
|
|
||||||
} else {
|
|
||||||
$('#title').hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
// set video
|
plSeason = $('#pl-season');
|
||||||
if (typeof(video_data.file) !== 'undefined') {
|
plSerial = $('#pl-serial');
|
||||||
player.attr('src', '${basedir}'+video_data.file);
|
playerObj = $('#player');
|
||||||
$('#plbr').hide();
|
|
||||||
} else if (typeof(video_data.playlist) !== 'undefined') {
|
|
||||||
isSerial = true;
|
|
||||||
$('#pl-season').removeClass('hide');
|
|
||||||
menu = $('#pl-season-menu');
|
|
||||||
|
|
||||||
menu.html('');
|
playerCore = new PlayerCore('${basedir}', playerObj, titleObj, video_data);
|
||||||
video_data.playlist.forEach(function(item, i){
|
playerCore.setupPlayer();
|
||||||
menu.append('<li><a data-tag="' + i + '" href="#" onclick="setSeason(' + i + ');return false;">' + item.comment + '</a></li>');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// load video time
|
// загрузка ранее сохранённых данных
|
||||||
var path = window.location.pathname.substr("${basedir}".length);
|
data = Cookies.getJSON(playerCore.path);
|
||||||
data = Cookies.getJSON(path);
|
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
var fulltime = msToTime(data.time * 1000);
|
var fulltime = playerCore.msToTime(data.time * 1000);
|
||||||
$('#mdl-vtime').text(fulltime.h + ':' + fulltime.m + ':' + fulltime.s);
|
$('#mdl-vtime').text(fulltime.h + ':' + fulltime.m + ':' + fulltime.s);
|
||||||
if (isSerial) {
|
if (playerCore.getType() == 'simple_serial') {
|
||||||
$('#mdl-season').text(data.season + 1);
|
$('#mdl-serial').find('span').text(data.serial + 1);
|
||||||
$('#mdl-serial').text(data.serial + 1);
|
$('#mdl-serial').removeClass('hide');
|
||||||
|
} else if (playerCore.getType() == 'seasons_serial') {
|
||||||
|
$('#mdl-season').find('span').text(data.season + 1);
|
||||||
|
$('#mdl-season').removeClass('hide');
|
||||||
|
$('#mdl-serial').find('span').text(data.serial + 1);
|
||||||
|
$('#mdl-serial').removeClass('hide');
|
||||||
}
|
}
|
||||||
$('#modal').modal('show');
|
$('#modal').modal('show');
|
||||||
} else {
|
|
||||||
player.load();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// save video time
|
if (playerCore.getType() == 'one_film') {
|
||||||
var tl;
|
playerCore.setTitle();
|
||||||
player.bind('play', function(){
|
playerCore.setupPlayerForOneFilm();
|
||||||
tl = $.now();
|
} else if (playerCore.getType() == 'simple_serial') {
|
||||||
});
|
playerCore.setupPlayerForSimpleSerial($('#pl-serial'));
|
||||||
player.bind('timeupdate', function(){
|
titleObj.hide();
|
||||||
var tc = $.now();
|
} else if (playerCore.getType() == 'seasons_serial') {
|
||||||
var sec = Math.floor((tc-tl)/1000);
|
playerCore.setupPlayerForSeasonSerial($('#pl-season'), $('#pl-serial'));
|
||||||
if (sec >= 5) {
|
titleObj.hide();
|
||||||
if (Math.floor(player[0].currentTime) <= 10) return;
|
} else {
|
||||||
save_data = {time:player[0].currentTime};
|
console.debug(playerCore.videoData);
|
||||||
if (isSerial) {
|
|
||||||
save_data.season = parseInt(player.attr('data-season'), 10);
|
|
||||||
save_data.serial = parseInt(player.attr('data-serial'), 10);
|
|
||||||
}
|
}
|
||||||
Cookies.set(path, save_data, { expires: 365 });
|
|
||||||
tl = tc;
|
|
||||||
console.debug(save_data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function continueVideo() {
|
function continueVideo() {
|
||||||
if (isSerial) {
|
if (playerCore.getType() == 'simple_serial') {
|
||||||
setSeason(data.season);
|
playerCore.setSerial(data.serial, plSerial);
|
||||||
setSerial(data.season, data.serial);
|
} else if (playerCore.getType() == 'seasons_serial') {
|
||||||
|
playerCore.setSeason(data.season, plSeason);
|
||||||
|
playerCore.setSerial(data.serial, plSerial, data.season);
|
||||||
}
|
}
|
||||||
player[0].currentTime = data.time;
|
playerObj[0].currentTime = data.time;
|
||||||
player[0].load();
|
playerObj.load();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -144,13 +71,13 @@
|
|||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<b>Время:</b> <span id="mdl-vtime"></span>
|
<b>Время:</b> <span id="mdl-vtime"></span>
|
||||||
<div id="mdl-blk-serial">
|
<div id="mdl-blk-serial">
|
||||||
<b>Сезон:</b> <span id="mdl-season"></span><br>
|
<div id="mdl-season" class="hide"><b>Сезон:</b> <span></span></div>
|
||||||
<b>Серия:</b> <span id="mdl-serial"></span>
|
<div id="mdl-serial" class="hide"><b>Серия:</b> <span></span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-primary" data-dismiss="modal" onclick="continueVideo()">Да</button>
|
<button type="button" class="btn btn-primary" data-dismiss="modal" onclick="continueVideo()">Да</button>
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal" onclick="player[0].load()">Нет</button>
|
<button type="button" class="btn btn-default" data-dismiss="modal" onclick="playerObj.load()">Нет</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
134
src/main/webapp/js/player.js
Normal file
134
src/main/webapp/js/player.js
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
function PlayerCore(baseDir, playerObj, titleObj, videoData) {
|
||||||
|
this.baseDir = baseDir;
|
||||||
|
this.playerObj = playerObj;
|
||||||
|
this.titleObj = titleObj;
|
||||||
|
this.videoData = videoData;
|
||||||
|
this.origDocTitle = document.title;
|
||||||
|
|
||||||
|
this.path = window.location.pathname.substr(baseDir.length);
|
||||||
|
this.timeLast = 0;
|
||||||
|
|
||||||
|
this.msToTime = function(ms) {
|
||||||
|
function addZ(n) { return (n<10? '0':'') + n; }
|
||||||
|
|
||||||
|
var _ms = ms % 1000;
|
||||||
|
ms = (ms - _ms) / 1000;
|
||||||
|
var _sec = ms % 60;
|
||||||
|
ms = (ms - _sec) / 60;
|
||||||
|
var _min = ms % 60;
|
||||||
|
var _hr = (ms - _min) / 60;
|
||||||
|
|
||||||
|
return {
|
||||||
|
's': addZ(_sec),
|
||||||
|
'm': addZ(_min),
|
||||||
|
'h': addZ(_hr)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setTitle = function(title = videoData.title) {
|
||||||
|
document.title = title + " :: " + this.origDocTitle;
|
||||||
|
titleObj.text(title);
|
||||||
|
titleObj.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getType = function() {
|
||||||
|
return this.videoData.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setupPlayerForOneFilm = function() {
|
||||||
|
playerObj.attr('src', this.baseDir + videoData.file);
|
||||||
|
playerObj.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setupPlayerForSimpleSerial = function(serialBlock) {
|
||||||
|
var menu = serialBlock.find('.dropdown-menu');
|
||||||
|
menu.html('');
|
||||||
|
var _self = this;
|
||||||
|
this.videoData.serials.forEach(function(item, i) {
|
||||||
|
var aTag = $('<a/>', {'href':'#', 'text':item.title});
|
||||||
|
aTag.click(function(){_self.setSerial(i, serialBlock)});
|
||||||
|
var liTag = $('<li/>')
|
||||||
|
liTag.append(aTag);
|
||||||
|
menu.append(liTag);
|
||||||
|
});
|
||||||
|
|
||||||
|
serialBlock.removeClass('hide');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setupPlayerForSeasonSerial = function(seasonBlock, serialBlock) {
|
||||||
|
var menu = seasonBlock.find('.dropdown-menu');
|
||||||
|
menu.html('');
|
||||||
|
var _self = this;
|
||||||
|
this.videoData.seasons.forEach(function(item, i) {
|
||||||
|
var aTag = $('<a/>', {'href':'#', 'text':item.title});
|
||||||
|
aTag.click(function(){_self.setSeason(i, seasonBlock, serialBlock)});
|
||||||
|
var liTag = $('<li/>')
|
||||||
|
liTag.append(aTag);
|
||||||
|
menu.append(liTag);
|
||||||
|
});
|
||||||
|
|
||||||
|
seasonBlock.removeClass('hide');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setupPlayer = function() {
|
||||||
|
var _self = this;
|
||||||
|
// сохранение времени просмотра
|
||||||
|
playerObj.bind('play', function(){
|
||||||
|
_self.timeLast = $.now();
|
||||||
|
});
|
||||||
|
|
||||||
|
playerObj.bind('timeupdate', function(){
|
||||||
|
var timeCurrent = $.now();
|
||||||
|
var sec = Math.floor((timeCurrent - _self.timeLast)/1000);
|
||||||
|
if (sec >= 5) {
|
||||||
|
playerCurrentTime = playerObj[0].currentTime;
|
||||||
|
if (Math.floor(playerCurrentTime) <= 10) return;
|
||||||
|
|
||||||
|
var save_data = {'time':playerCurrentTime};
|
||||||
|
Cookies.set(_self.path, save_data, {'expires':30});
|
||||||
|
_self.timeLast = timeCurrent;
|
||||||
|
console.debug({'path': _self.path, 'saveTime': save_data});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setSerial = function(idx, serialBlock, sidx = 0) {
|
||||||
|
var title;
|
||||||
|
var playerSrc;
|
||||||
|
if (this.getType() == 'seasons_serial') {
|
||||||
|
title = videoData.seasons[sidx].serials[idx].title;
|
||||||
|
playerSrc = this.baseDir + videoData.seasons[sidx].serials[idx].file;
|
||||||
|
} else {
|
||||||
|
title = videoData.serials[idx].title;
|
||||||
|
playerSrc = this.baseDir + videoData.serials[idx].file;
|
||||||
|
}
|
||||||
|
this.setTitle(title);
|
||||||
|
|
||||||
|
var menuBtn = serialBlock.find('#dropdownSerial');
|
||||||
|
menuBtn.html(title + ' <span class="caret"></span>');
|
||||||
|
|
||||||
|
playerObj.attr('src', playerSrc);
|
||||||
|
playerObj.attr('data-serial', idx);
|
||||||
|
playerObj.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setSeason = function(idx, seasonBlock, serialBlock) {
|
||||||
|
var title = videoData.seasons[idx].title;
|
||||||
|
|
||||||
|
var menuBtn = seasonBlock.find('#dropdownSeason');
|
||||||
|
menuBtn.html(title + ' <span class="caret"></span>');
|
||||||
|
|
||||||
|
var menu = serialBlock.find('.dropdown-menu');
|
||||||
|
menu.html('');
|
||||||
|
var _self = this;
|
||||||
|
this.videoData.seasons[idx].serials.forEach(function(item, i) {
|
||||||
|
var aTag = $('<a/>', {'href':'#', 'text':item.title});
|
||||||
|
aTag.click(function(){_self.setSerial(i, serialBlock, idx)});
|
||||||
|
var liTag = $('<li/>')
|
||||||
|
liTag.append(aTag);
|
||||||
|
menu.append(liTag);
|
||||||
|
});
|
||||||
|
|
||||||
|
serialBlock.removeClass('hide');
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user