index.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="apple-mobile-web-app-capable" content="yes" />
  5. <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"/>
  6. <link rel="manifest" href="manifest.json">
  7. <meta charset="UTF-8">
  8. <meta name="theme-color" content="#4b75ff">
  9. <link rel="stylesheet" href="script/semantic/semantic.min.css">
  10. <script src="../script/jquery.min.js"></script>
  11. <script src="script/semantic/semantic.min.js"></script>
  12. <script src="../script/ao_module.js"></script>
  13. <script src="script/DPlayer.min.js"></script>
  14. <title>Video</title>
  15. <style>
  16. html, body{
  17. background-color:rgba(250,250,250,0.95);
  18. padding:0px !important;
  19. margin: 0px;
  20. }
  21. #dplayer{
  22. display:inline-block;
  23. width:70%;
  24. vertical-align: top;
  25. }
  26. .playerwrapper{
  27. background-color:black;
  28. width:100%;
  29. margin-bottom:12px;
  30. }
  31. @media only screen and (max-width: 1900px) {
  32. #dplayer{
  33. width:50%;
  34. }
  35. }
  36. @media only screen and (max-width: 1500px) {
  37. #dplayer{
  38. width:60%;
  39. }
  40. }
  41. @media only screen and (max-width: 1024px) {
  42. #dplayer{
  43. width:70%;
  44. }
  45. }
  46. @media only screen and (max-width: 600px) {
  47. #dplayer{
  48. width:100%;
  49. }
  50. }
  51. .playing{
  52. background-color:#ededed;
  53. }
  54. .videoObject{
  55. padding:6px !important;
  56. }
  57. </style>
  58. </head>
  59. <body>
  60. <!-- Viewing Panel-->
  61. <div class="playerwrapper" align="center">
  62. <div id="dplayer" class="unstyled" align="left"></div>
  63. </div>
  64. <!-- PlayList-->
  65. <div class="ui container">
  66. <h3 class="ui header">
  67. <span id="videoname">No Video Loaded</span>
  68. <div class="sub header"><span id="playlistName">N/A</span> / <span id="ext">[no_mdeia]</span></div>
  69. </h3>
  70. <div class="ui segment">
  71. <p><i class="expand icon"></i>Screen Size</p>
  72. <button class="ui tiny button" onclick="setScreenSize('50%');">
  73. Small
  74. </button>
  75. <button class="ui tiny button" onclick="setScreenSize('70%');">
  76. Normal
  77. </button>
  78. <button class="ui tiny button" onclick="setScreenSize('100%');">
  79. Full Width
  80. </button>
  81. <div class="ui toggle checkbox" style="position:absolute;right:12px;bottom: 12px;">
  82. <input id="autoplayToggle" type="checkbox" name="autoplay" onchange="setAutoplay(this);">
  83. <label>Autoplay</label>
  84. </div>
  85. </div>
  86. <div id="playList" class="ui fluid segment">
  87. <p><i class="list icon"></i> PlayLists</p>
  88. <select id="playListSelector" class="ui search fluid dropdown">
  89. <option value="">Select Playlist</option>
  90. </select>
  91. <br>
  92. <p><i class="file icon"></i>PlayList Videos</p>
  93. <div id="videolist" class="ui relaxed divided list">
  94. </div>
  95. </div>
  96. <br><br><br>
  97. </div>
  98. <script>
  99. var playerObject;
  100. var AllPlaylist = [];
  101. var currentPlaylist = [];
  102. var currentPlaying;
  103. var unsortedVideoFiles = [];
  104. var autoPlay = false;
  105. var previousScreenSize = "70%";
  106. $('.ui.dropdown').dropdown();
  107. init();
  108. initPlaylist();
  109. autoPlay = (ao_module_storage.loadStorage("Video","autoplay") == "true");
  110. if (autoPlay){
  111. $("#autoplayToggle").attr("checked",true);
  112. }
  113. function init(){
  114. //Removed set global volume and isolate two systems
  115. /*var defaultVol = localStorage.getItem("global_volume");
  116. if (defaultVol == null || defaultVol == "" || defaultVol == undefined){
  117. defaultVol = 0.4;
  118. }
  119. */
  120. const dp = new DPlayer({
  121. container: document.getElementById('dplayer'),
  122. autoplay: false,
  123. //volume: parseFloat(defaultVol),
  124. video: {
  125. pic: 'img/thumbnail.png',
  126. }
  127. });
  128. playerObject = dp;
  129. /*
  130. dp.on("volumechange",function(){
  131. var newVol = dp.volume();
  132. if (localStorage){
  133. localStorage.setItem("global_volume",newVol);
  134. }
  135. });
  136. */
  137. //handle autoplay on end
  138. dp.on('ended', function() {
  139. if (autoPlay){
  140. //Play next item in list
  141. var nextToPlay = 0;
  142. for (var i =0; i < currentPlaylist.length; i++){
  143. if (currentPlaylist[i].Filename == currentPlaying){
  144. nextToPlay = i + 1;
  145. if (nextToPlay >= currentPlaylist.length){
  146. //last video. loop back to first esp
  147. nextToPlay = 0;
  148. }
  149. }
  150. }
  151. //Play the selected item
  152. var nextPlayObject = currentPlaylist[nextToPlay];
  153. console.log(currentPlaylist[nextToPlay],nextToPlay);
  154. $("#videoname").text(nextPlayObject.Filename);
  155. $("#ext").text("[" + nextPlayObject.Ext + "]" );
  156. currentPlaying = nextPlayObject.Filename;
  157. playVideo("../media?file=" + encodeURIComponent(nextPlayObject.Filepath));
  158. $("#videolist").find(".search").val(nextPlayObject.Filename);
  159. $(".playing").removeClass("playing");
  160. $(".videoObject").each(function(){
  161. if ($(this).attr("filename") == nextPlayObject.Filename){
  162. $(this).addClass("playing");
  163. }
  164. });
  165. }
  166. });
  167. //Handle full screen
  168. dp.on('fullscreen', function() {
  169. previousScreenSize = $("#dplayer").css("width");
  170. setScreenSize("100%");
  171. });
  172. dp.on('fullscreen_cancel', function() {
  173. setScreenSize(previousScreenSize);
  174. });
  175. }
  176. function setAutoplay(obj){
  177. autoPlay = obj.checked;
  178. if (autoPlay){
  179. ao_module_storage.setStorage("Video","autoplay","true");
  180. }else{
  181. ao_module_storage.setStorage("Video","autoplay","false");
  182. }
  183. }
  184. $("#playListSelector").on("change",function(){
  185. var selectedPlaylistName = $(this).val();
  186. var thisPlaylistDevice = "";
  187. $("#playListSelector").find(".playlistObject").each(function(){
  188. if ($(this).attr("value") == selectedPlaylistName){
  189. thisPlaylistDevice = $(this).attr("device");
  190. }
  191. });
  192. if (thisPlaylistDevice.length == 0){
  193. //Unsorted playlist
  194. console.log("Listing unsorted playlists");
  195. listUnsortedFiles();
  196. }else{
  197. listPlayList(selectedPlaylistName);
  198. }
  199. //console.log(thisPlaylistDevice);
  200. });
  201. function setScreenSize(size){
  202. $("#dplayer").css("width",size);
  203. }
  204. function initPlaylist(){
  205. $.ajax({
  206. url: "../system/ajgi/interface?script=Video/backend/buildPlaylist.js",
  207. success: function(data){
  208. console.log(data);
  209. //Initial playlist dropdown
  210. $("#playListSelector").html("");
  211. $("#playListSelector").append(`<option class="" value="">Select Playlist</option>`);
  212. for (var i = 0; i < data.length; i++){
  213. var thisDevice = data[i];
  214. var thisDeviceName = thisDevice.StorageName;
  215. var playlistInThisDevice = thisDevice.PlayLists;
  216. var unsortedVideoInThisDevice = thisDevice.UnsortedVideos;
  217. //Append playlist
  218. for (var j = 0; j < playlistInThisDevice.length; j++){
  219. var thisPlaylistName = playlistInThisDevice[j].Name;
  220. AllPlaylist.push(JSON.parse(JSON.stringify(playlistInThisDevice[j])));
  221. $("#playListSelector").append(`<option class="playlistObject" value="${thisPlaylistName}" device="${thisDeviceName}">${thisPlaylistName}</option>`);
  222. }
  223. for (var k = 0; k < unsortedVideoInThisDevice.length; k++){
  224. unsortedVideoFiles.push(JSON.parse(JSON.stringify(unsortedVideoInThisDevice[k])));
  225. }
  226. }
  227. //Append unsorted into playlist
  228. $("#playListSelector").append(`<option class="playlistObject" value="unsorted" device="">Unsorted Playlist</option>`);
  229. updateWindowEvents();
  230. }
  231. });
  232. }
  233. function listUnsortedFiles(){
  234. //Append unsorted files
  235. $("#videolist").html("");
  236. currentPlaylist = unsortedVideoFiles;
  237. for (var k = 0; k < unsortedVideoFiles.length; k++){
  238. var thisVideoName = unsortedVideoFiles[k].Filename;
  239. var thisFilePath = unsortedVideoFiles[k].Filepath;
  240. var ext = unsortedVideoFiles[k].Ext;
  241. $("#videolist").append(`<div class="item videoObject" filename="${thisVideoName}" filepath="${thisFilePath}" ext="${ext}" playlist="Unsorted">
  242. <i class="file icon"></i>
  243. <div class="content">
  244. <a class="header" onclick="playThisFile(this);">${thisVideoName}</a>
  245. <div class="description">${thisFilePath} / [${ext}]</div>
  246. </div>
  247. </div>`);
  248. }
  249. }
  250. function listPlayList(playlistName){
  251. $("#videolist").html("");
  252. var targetPlaylist;
  253. for (var i =0; i < AllPlaylist.length; i++){
  254. if (AllPlaylist[i].Name == playlistName){
  255. targetPlaylist = AllPlaylist[i];
  256. }
  257. }
  258. currentPlaylist = targetPlaylist.Files;
  259. //Parse the playlist
  260. for (var i = 0; i < currentPlaylist.length; i++){
  261. var playListName = targetPlaylist.Name;
  262. var thisVideoName = currentPlaylist[i].Filename;
  263. var thisFilePath = currentPlaylist[i].Filepath;
  264. var ext = currentPlaylist[i].Ext;
  265. $("#videolist").append(`<div class="item videoObject" filename="${thisVideoName}" filepath="${thisFilePath}" ext="${ext}" playlist="${playListName}">
  266. <i class="file icon"></i>
  267. <div class="content">
  268. <a class="header" onclick="playThisFile(this);">${thisVideoName}</a>
  269. <div class="description">${thisFilePath} / [${ext}]</div>
  270. </div>
  271. </div>`);
  272. }
  273. }
  274. function playThisFile(obj){
  275. $(".playing").removeClass("playing");
  276. var fileDescriptor = $(obj).parent().parent();
  277. $("#videoname").text(fileDescriptor.attr("filename"));
  278. $("#playlistName").text(fileDescriptor.attr("playlist"));
  279. $("#ext").text("[" + fileDescriptor.attr("ext") + "]" );
  280. currentPlaying = fileDescriptor.attr('filename');
  281. playVideo("../media?file=" + encodeURIComponent(fileDescriptor.attr("filepath")));
  282. $(fileDescriptor).addClass("playing");
  283. window.scrollTo(0, 0);
  284. }
  285. function playVideo(src){
  286. playerObject.video.src = src;
  287. playerObject.play()
  288. updateWindowEvents();
  289. }
  290. $(window).on("resize",function(){
  291. updateWindowEvents();
  292. });
  293. function updateWindowEvents(){
  294. $("#dplayer").css("max-height",window.innerHeight);
  295. }
  296. </script>
  297. </body>
  298. </html>