0

Изменение внутренних алгоритмов построения плейлиста

Теперь генерируется вначале обобщенный KinoPlay объект, сочетающий в себе
все прелести обычного фильма, сериала и сезонных сериалов.

Из недоделок, сейчас коряво работает возобновение просмотра.
This commit is contained in:
2017-01-06 02:59:38 +03:00
parent 2b41f7282d
commit 2a48fc9a7d
10 changed files with 452 additions and 137 deletions

View 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;
}
}

View 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;
}
}

View File

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

View File

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

View File

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

View 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;
}
}

View File

@@ -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/**")

View File

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

View File

@@ -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 + '&nbsp;<span class="caret"></span>');
$('#dropdownSerial').html('Serials&nbsp;<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 + '&nbsp;<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 + '&nbsp;<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>

View 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 + '&nbsp;<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 + '&nbsp;<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');
}
}