summaryrefslogtreecommitdiff
path: root/web
diff options
context:
space:
mode:
authorthlo <t.lohmar@gmx.de>2013-03-17 09:41:35 +0100
committerthlo <t.lohmar@gmx.de>2013-03-17 09:41:35 +0100
commit39ace9529514706019367fd11ca5c767dc890319 (patch)
tree7c32b63c7f5c175005186e68ff55edafc1ac36e3 /web
parent09f233d4c92c73dfa0456c7c87bcc758b68259ff (diff)
downloadvdr-plugin-smarttvweb-39ace9529514706019367fd11ca5c767dc890319.tar.gz
vdr-plugin-smarttvweb-39ace9529514706019367fd11ca5c767dc890319.tar.bz2
First step of repo restructuring
Diffstat (limited to 'web')
-rwxr-xr-xweb/Data.js296
-rwxr-xr-xweb/Server.js180
-rwxr-xr-xweb/favicon.icobin0 -> 1502 bytes
-rwxr-xr-xweb/index.html104
4 files changed, 580 insertions, 0 deletions
diff --git a/web/Data.js b/web/Data.js
new file mode 100755
index 0000000..49e9026
--- /dev/null
+++ b/web/Data.js
@@ -0,0 +1,296 @@
+//Diff:
+// getNumString
+// createJQMDomTree
+
+var Data =
+{
+ assets : new Item,
+ folderList : [],
+};
+
+Array.prototype.remove = function(from, to) {
+ var rest = this.slice((to || from) + 1 || this.length);
+ this.length = from < 0 ? this.length + from : from;
+ return this.push.apply(this, rest);
+};
+
+Data.reset = function() {
+ this.assets = null;
+ this.assets = new Item;
+
+ this.folderList = [];
+
+// this.folderList.push({item : this.assets, id: 0});
+// Main.log("Data.reset: folderList.push. this.folderList.length= " + this.folderList.length);
+};
+
+Data.completed= function(sort) {
+ if (sort == true)
+ this.assets.sortPayload();
+
+ this.folderList.push({item : this.assets, id: 0});
+// Main.log("Data.completed: folderList.push. this.folderList.length= " + this.folderList.length);
+// Main.log ("Data.completed()= " +this.folderList.length);
+
+};
+
+Data.selectFolder = function (idx, first_idx) {
+ this.folderList.push({item : this.getCurrentItem().childs[idx], id: idx, first:first_idx});
+// Main.log("Data.selectFolder: folderList.push. this.folderList.length= " + this.folderList.length);
+};
+
+Data.folderUp = function () {
+ itm = this.folderList.pop();
+// Main.log("Data.folderUp: folderList.pop. this.folderList.length= " + this.folderList.length);
+ return itm;
+// return itm.id;
+};
+
+Data.isRootFolder = function() {
+// Main.log("Data.isRootFolder: this.folderList.length= " + this.folderList.length);
+ if (this.folderList.length == 1)
+ return true;
+ else
+ return false;
+};
+
+Data.addItem = function(t_list, pyld) {
+ this.assets.addChild(t_list, pyld, 0);
+};
+
+Data.dumpFolderStruct = function(){
+ Main.log("---------- dumpFolderStruct ------------");
+ this.assets.print(0);
+ Main.log("---------- dumpFolderStruct Done -------");
+};
+
+Data.createJQMDomTree = function () {
+ return this.assets.createJQMDomTree(0);
+};
+
+Data.findEpgUpdateTime = function() {
+ return this.assets.findEpgUpdateTime(Display.GetEpochTime() + 10000, "", 0);
+ // min, guid, level
+};
+
+Data.updateEpg = function (guid, entry) {
+ this.assets.updateEpgEntry(guid, entry, 0);
+};
+
+Data.getCurrentItem = function () {
+ return this.folderList[this.folderList.length-1].item;
+};
+
+Data.getVideoCount = function() {
+ return this.folderList[this.folderList.length-1].item.childs.length;
+};
+
+Data.getNumString =function(num, fmt) {
+ var res = "";
+
+ if (num < 10) {
+ for (var i = 1; i < fmt; i ++) {
+ res += "0";
+ };
+ } else if (num < 100) {
+ for (var i = 2; i < fmt; i ++) {
+ res += "0";
+ };
+ }
+
+ res = res + num;
+
+ return res;
+};
+
+Data.deleteElm = function (pos) {
+ Data.getCurrentItem().childs.remove(pos);
+};
+//-----------------------------------------
+function Item() {
+ this.title = "root";
+ this.isFolder = true;
+ this.childs = [];
+ this.payload = ""; // only set, if (isFolder == false)
+}
+
+Item.prototype.isFolder = function() {
+ return this.isFolder;
+};
+
+Item.prototype.getTitle = function () {
+ return this.title;
+};
+
+Item.prototype.getPayload = function () {
+ if (this.isFolder == true) {
+ Main.log("WARNING: getting payload on a folder title=" +this.title);
+ }
+ return this.payload;
+};
+
+Item.prototype.getItem = function (title) {
+ for (var i = 0; i < this.childs.length; i++) {
+ if (this.childs[i].title == title) {
+ return this.childs[i];
+ }
+ }
+ return 0;
+};
+
+Item.prototype.addChild = function (key, pyld, level) {
+ if (key.length == 1) {
+ var folder = new Item;
+// folder.title = pyld.startstr + " - " + key;
+ folder.title = key[0];
+ folder.payload = pyld;
+ folder.isFolder = false;
+ this.childs.push(folder);
+// this.titles.push({title: pyld.startstr + " - " + key , pyld : pyld});
+ }
+ else {
+ if (level > 10) {
+ Main.log(" too many levels");
+ return;
+ }
+ var t = key.shift();
+ var found = false;
+ for (var i = 0; i < this.childs.length; i++) {
+ if (this.childs[i].title == t) {
+ this.childs[i].addChild(key, pyld, level +1);
+ found = true;
+ break;
+ }
+ }
+ if (found == false) {
+ var folder = new Item;
+ folder.title = t;
+ folder.addChild(key, pyld, level+1);
+ this.childs.push(folder);
+ }
+ }
+};
+
+Item.prototype.findEpgUpdateTime = function (min, guid, level) {
+ var prefix= "";
+ for (var i = 0; i < level; i++)
+ prefix += "-";
+
+ for (var i = 0; i < this.childs.length; i++) {
+ if (this.childs[i].isFolder == true) {
+ var res = this.childs[i].findEpgUpdateTime(min, guid, level+1);
+ min = res.min;
+ guid = res.guid;
+ }
+ else {
+ var digi =new Date(this.childs[i].payload['start'] * 1000);
+ var str = digi.getHours() + ":" + digi.getMinutes();
+
+// Main.log(prefix + "min= " + min+ " start= " + this.childs[i].payload['start'] + " (" + str+ ") title= " + this.childs[i].title);
+
+ if ((this.childs[i].payload['start'] != 0) && ((this.childs[i].payload['start'] + this.childs[i].payload['dur']) < min)) {
+ min = this.childs[i].payload['start'] + this.childs[i].payload['dur'];
+ guid = this.childs[i].payload['guid'] ;
+// Main.log(prefix + "New Min= " + min + " new id= " + guid + " title= " + this.childs[i].title);
+// Main.logToServer(prefix + "New Min= " + min + " new id= " + guid + " title= " + this.childs[i].title);
+ }
+ }
+ }
+
+ return { "min": min, "guid" : guid};
+};
+
+Item.prototype.updateEpgEntry = function (guid, entry, level) {
+ var prefix= "";
+ for (var i = 0; i < level; i++)
+ prefix += "-";
+ for (var i = 0; i < this.childs.length; i++) {
+ if (this.childs[i].isFolder == true) {
+ var res = this.childs[i].updateEpgEntry(guid, entry, level+1);
+ if (res == true)
+ return true;
+ }
+ else {
+ if (this.childs[i].payload['guid'] == guid) {
+ Main.log("updateEpgEntry: Found " + this.childs[i].title);
+ this.childs[i].payload.prog = entry.prog;
+ this.childs[i].payload.desc = entry.desc;
+ this.childs[i].payload.start = entry.start;
+ this.childs[i].payload.dur = entry.dur;
+ return true;
+ }
+ }
+ }
+ return false;
+};
+
+Item.prototype.print = function(level) {
+ var prefix= "";
+ for (var i = 0; i < level; i++)
+ prefix += " ";
+
+ for (var i = 0; i < this.childs.length; i++) {
+ Main.log(prefix + this.childs[i].title);
+ if (this.childs[i].isFolder == true) {
+ Main.log(prefix+"Childs:");
+ this.childs[i].print(level +1);
+ }
+ }
+};
+
+Item.prototype.createJQMDomTree = function(level) {
+ var mydiv = $('<ul />');
+// if (level == 0) {
+ mydiv.attr('data-role', 'listview');
+ mydiv.attr('data-inset', 'true');
+// };
+//, id:'dyncreated'
+ for (var i = 0; i < this.childs.length; i++) {
+ if (this.childs[i].isFolder == true) {
+ var myh = $('<div>', {text: this.childs[i].title});
+ var myli = $('<li>');
+ myli.append(myh);
+ var mycount = $('<p>', {class: 'ui-li-count', text: this.childs[i].childs.length});
+ myli.append(mycount);
+ myli.append(this.childs[i].createJQMDomTree(level+1));
+ mydiv.append(myli);
+ }
+ else {
+ // Links
+ var digi = new Date(this.childs[i].payload['start'] *1000);
+ var mon = Data.getNumString ((digi.getMonth()+1), 2);
+ var day = Data.getNumString (digi.getDate(), 2);
+ var hour = Data.getNumString (digi.getHours(), 2);
+ var min = Data.getNumString (digi.getMinutes(), 2);
+
+ var d_str = mon + "/" + day + " " + hour + ":" + min;
+ var mya = $('<a>', { text: d_str + " - " + this.childs[i].title,
+ href: this.childs[i].payload['link'],
+ rel: 'external'} );
+ var myli = $('<li class="item"/>');
+ myli.attr('data-icon', 'false');
+ myli.attr('data-theme', 'c');
+
+ myli.append(mya);
+ mydiv.append(myli);
+ }
+ }
+ return mydiv;
+};
+
+Item.prototype.sortPayload = function() {
+ for (var i = 0; i < this.childs.length; i++) {
+ if (this.childs[i].isFolder == true) {
+ this.childs[i].sortPayload();
+ }
+ }
+ this.childs.sort(function(a,b) {
+ if (a.title == b.title) {
+ return (b.payload.start - a.payload.start);
+ }
+ else {
+ return ((a.title < b.title) ? -1 : 1);
+ }
+ });
+};
+
diff --git a/web/Server.js b/web/Server.js
new file mode 100755
index 0000000..1ab6d0a
--- /dev/null
+++ b/web/Server.js
@@ -0,0 +1,180 @@
+var Server = {
+ dataReceivedCallback : null,
+ errorCallback : null,
+ doSort : false,
+ retries : 0,
+
+ XHRObj : null
+};
+
+Server.init = function()
+{
+ var success = true;
+
+ if (this.XHRObj) {
+ this.XHRObj.destroy();
+ this.XHRObj = null;
+ }
+
+ return success;
+};
+
+Server.setSort = function (val) {
+ this.doSort = val;
+};
+//---------------------------------------------
+Server.fetchVideoList = function(url) {
+
+ $.ajax({
+ url: url,
+ type : "GET",
+ success : function(data, status, XHR ) {
+// Main.log("Server.fetchVideoList Success Response - status= " + status + " mime= " + XHR.responseType + " data= "+ data);
+
+ $(data).find("item").each(function () {
+ var title = $(this).find('title').text();
+// var link = $(this).find('link').text();
+ var link = $(this).find('enclosure').attr('url');
+ var guid = $(this).find('guid').text();
+ var programme = $(this).find('programme').text();
+ var description = $(this).find('description').text();
+ var startVal = parseInt($(this).find('start').text());
+ var durVal = parseInt($(this).find('duration').text());
+ var fps = parseFloat($(this).find('fps').text());
+ var ispes = $(this).find('ispes').text();
+ var isnew = $(this).find('isnew').text();
+// Main.log("Server.fetchVideoList: title= " + title + " start= " + startVal + " dur= " + durVal + " fps= " + fps);
+
+/* if (Main.state == Main.eLIVE) {
+ Epg.guidTitle[guid] = title;
+ }
+*/
+ var title_list = title.split("~");
+ Data.addItem( title_list, {link : link, prog: programme, desc: description, guid : guid, start: startVal,
+ dur: durVal, ispes : ispes, isnew : isnew, fps : fps});
+
+ }); // each
+
+ Data.completed(Server.doSort);
+
+ if (Server.dataReceivedCallback) {
+ Server.dataReceivedCallback();
+ }
+
+ },
+ error : function (jqXHR, status, error) {
+// Main.logToServer("Server.fetchVideoList Error Response - status= " + status + " error= "+ error);
+// Display.showPopup("Error with XML File: " + status);
+ Server.retries ++;
+ },
+ parsererror : function () {
+ // Main.logToServer("Server.fetchVideoList parserError " );
+ // Display.showPopup("Error in XML File");
+ Server.retries ++;
+ if (Server.errorCallback != null) {
+ Server.errorCallback("XmlError");
+ }
+
+ }
+ });
+};
+
+
+//---------------------------------------------
+
+Server.updateVdrStatus = function (){
+ Main.log ("get VDR Status");
+ $.ajax({
+ url: Config.serverUrl + "/vdrstatus.xml",
+ type : "GET",
+ success : function(data, status, XHR){
+ var free = $(data).find('free').text() / 1024.0;
+ var used = $(data).find('used').text() / 1024.0;
+ var percent = $(data).find('percent').text();
+
+ var unit = "GB";
+ var free_str = free.toFixed(2);
+ if (free_str.length > 6) {
+ free = free / 1024.0;
+ free_str = free.toFixed(2);
+ unit = "TB";
+ }
+ $("#logoDisk").text("Free: " +free_str + unit);
+ $("#selectDisk").text("Free: " +free_str + unit);
+ },
+ error: function(jqXHR, status, error){
+ Main.log("VdrStatus: Error");
+ }
+ });
+}
+
+
+Server.getResume = function (guid) {
+// Main.log ("***** getResume *****");
+ $.ajax({
+ url: Config.serverUrl + "/getResume.xml",
+ type : "POST",
+ data : "filename:" + guid +"\n",
+ success : function(data, status, XHR ) {
+ Main.log("**** Resome Success Response - status= " + status + " mime= " + XHR.responseType + " data= "+ data);
+
+ var resume_str = $(data).find("resume").text();
+ if (resume_str != "") {
+ var resume_val = parseFloat(resume_str);
+ Main.log("resume val= " + resume_val );
+ Main.logToServer("resume val= " + resume_val );
+ Player.resumePos = resume_val;
+ Player.playVideo( resume_val);
+ }
+ else {
+ Display.hide();
+ Display.showProgress();
+ Player.playVideo(-1);
+ }
+
+ },
+ error : function (jqXHR, status, error) {
+ Main.log("**** Resome Error Response - status= " + status + " error= "+ error);
+ Display.hide();
+ Display.showProgress();
+ Player.playVideo(-1);
+ }
+ });
+};
+
+Server.saveResume = function() {
+ var msg = "";
+ msg += "filename:" + Data.getCurrentItem().childs[Main.selectedVideo].payload.guid + "\n";
+ msg += "resume:"+ (Player.curPlayTime/1000) + "\n" ;
+
+ $.post(Config.serverUrl + "/setResume.xml", msg, function(data, textStatus, XHR) {
+ Main.logToServer("SaveResume Status= " + XHR.status );
+ }, "text");
+
+};
+
+Server.deleteRecording = function(guid) {
+ Main.log("Server.deleteRecording guid=" + guid);
+ Main.logToServer("Server.deleteRecording guid=" + guid);
+ Notify.handlerShowNotify("Deleting...", false);
+
+ $.ajax({
+ url: Config.serverUrl + "/deleteRecording.xml?id=" +guid,
+ type : "POST",
+ success : function(data, status, XHR ) {
+ Notify.showNotify("Deleted", true);
+ Data.deleteElm(Main.selectedVideo);
+ if (Main.selectedVideo >= Data.getVideoCount())
+ Main.selectedVideo = Data.getVideoCount() -1;
+ Server.updateVdrStatus();
+ Display.setVideoList(Main.selectedVideo, (Main.selectedVideo - Display.currentWindow));
+ Main.logToServer("Server.deleteRecording: Success" );
+ },
+ error : function (XHR, status, error) {
+ Main.logToServer("Server.deleteRecording: Error" );
+
+ // show popup
+ Notify.showNotify("Error", true);
+ }
+ });
+};
diff --git a/web/favicon.ico b/web/favicon.ico
new file mode 100755
index 0000000..2236569
--- /dev/null
+++ b/web/favicon.ico
Binary files differ
diff --git a/web/index.html b/web/index.html
new file mode 100755
index 0000000..f396ed4
--- /dev/null
+++ b/web/index.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
+<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
+<script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
+<script language="javascript" type="text/javascript" src="Server.js"></script>
+<script language="javascript" type="text/javascript" src="Data.js"></script>
+<script>
+$(document).ready(function(){
+ var state = 'rec'; // Rec
+
+ Server.init();
+
+ Server.dataReceivedCallback = function() {
+ console.log("Loaded");
+ $("#anchor").append(Data.createJQMDomTree()).trigger('create');
+ $.mobile.loading('hide');
+ //http://jquerymobile.com/
+
+ // end of dataReceivedCallBack
+ };
+ Server.errorCallback = function (msg) {
+ alert (msg);
+ buttonHandler('rec');
+ };
+
+ $.mobile.loading('show');
+ Server.setSort(true);
+ Server.fetchVideoList("/recordings.xml?mode=nodesc");
+
+ removeDomTree = function () {
+ // parent should not be deleted.
+ $("#anchor").children().remove();
+ };
+
+ buttonHandler = function(btn) {
+ console.log("Click: " + btn);
+ if (state == btn) {
+ console.log("No Change");
+ };
+ $.mobile.loading('show');
+ Data.reset();
+ removeDomTree();
+ switch (btn) {
+ case 'rec':
+ state = 'rec';
+ $('#recbtn').addClass('ui-btn-active');
+ $('#medbtn').removeClass('ui-btn-active');
+ $('#chnbtn').removeClass('ui-btn-active');
+ Server.setSort(true);
+ Server.fetchVideoList("/recordings.xml?mode=nodesc");
+ break;
+ case 'med':
+ state = 'med';
+ $('#medbtn').addClass('ui-btn-active');
+ $('#recbtn').removeClass('ui-btn-active');
+ $('#chnbtn').removeClass('ui-btn-active');
+ Server.setSort(true);
+ Server.fetchVideoList("/media.xml");
+ break;
+ case 'chn':
+ state = 'chn';
+ $('#chnbtn').addClass('ui-btn-active');
+ $('#medbtn').removeClass('ui-btn-active');
+ $('#recbtn').removeClass('ui-btn-active');
+ Server.setSort(false);
+ Server.fetchVideoList("/channels.xml?mode=nodesc");
+ break;
+ };
+ };
+
+});
+</script>
+<style type="text/css" >
+h2 { margin:1.2em 0 .4em 0; }
+ }
+</style>
+</head>
+
+<body>
+ <div data-role="page" class="type-interior">
+
+ <div data-role="header" data-theme="b">
+ <h1>Recordings</h1>
+ </div> <!-- /header -->
+
+ <div data-role="content">
+ <div class="content-primary" >
+
+ <div data-role="controlgroup" data-type="horizontal" data-mini="true">
+ <a href="#" id="recbtn" data-role="button" data-transition="fade" class="ui-btn-active" onclick="return buttonHandler('rec')">Recordings</a>
+ <a href="#" id="medbtn" data-role="button" data-transition="fade" onclick="return buttonHandler('med')">Media</a>
+ <a href="#" id="chnbtn" data-role="button" data-transition="fade" onclick="return buttonHandler('chn')">Channels</a>
+ </div>
+
+ <div id="anchor"/>
+ </div>
+ </div>
+</div>
+ </body>
+</html>
+