index.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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. <meta charset="UTF-8">
  7. <meta name="theme-color" content="#4b75ff">
  8. <link rel="stylesheet" href="script/semantic/semantic.min.css">
  9. <script src="../script/jquery.min.js"></script>
  10. <script src="script/semantic/semantic.min.js"></script>
  11. <script src="../script/ao_module.js"></script>
  12. <script src="script/DPlayer.min.js"></script>
  13. <link rel="manifest" crossorigin="use-credentials" href="manifest.json">
  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. <br><br>
  82. <div class="ui toggle right floated checkbox">
  83. <input id="autoplayToggle" type="checkbox" name="autoplay" onchange="setAutoplay(this);">
  84. <label>Autoplay</label>
  85. </div>
  86. </div>
  87. <div id="playList" class="ui fluid segment">
  88. <p><i class="list icon"></i> PlayLists</p>
  89. <select id="playListSelector" class="ui search fluid dropdown">
  90. <option value="">Select Playlist</option>
  91. </select>
  92. <br>
  93. <p><i class="file icon"></i>PlayList Videos</p>
  94. <div id="videolist" class="ui relaxed divided list">
  95. </div>
  96. </div>
  97. <br><br><br>
  98. </div>
  99. <script>
  100. var playerObject;
  101. var AllPlaylist = [];
  102. var currentPlaylist = [];
  103. var currentPlaying;
  104. var unsortedVideoFiles = [];
  105. var autoPlay = false;
  106. var previousScreenSize = "70%";
  107. $('.ui.dropdown').dropdown();
  108. init();
  109. initPlaylist();
  110. autoPlay = (ao_module_storage.loadStorage("Video","autoplay") == "true");
  111. if (autoPlay){
  112. $("#autoplayToggle").attr("checked",true);
  113. }
  114. function init(){
  115. //Removed set global volume and isolate two systems
  116. /*var defaultVol = localStorage.getItem("global_volume");
  117. if (defaultVol == null || defaultVol == "" || defaultVol == undefined){
  118. defaultVol = 0.4;
  119. }
  120. */
  121. const dp = new DPlayer({
  122. container: document.getElementById('dplayer'),
  123. autoplay: false,
  124. //volume: parseFloat(defaultVol),
  125. video: {
  126. pic: 'img/thumbnail.png',
  127. }
  128. });
  129. playerObject = dp;
  130. /*
  131. dp.on("volumechange",function(){
  132. var newVol = dp.volume();
  133. if (localStorage){
  134. localStorage.setItem("global_volume",newVol);
  135. }
  136. });
  137. */
  138. //handle autoplay on end
  139. dp.on('ended', function() {
  140. if (autoPlay){
  141. //Play next item in list
  142. var nextToPlay = 0;
  143. for (var i =0; i < currentPlaylist.length; i++){
  144. if (currentPlaylist[i].Filename == currentPlaying){
  145. nextToPlay = i + 1;
  146. if (nextToPlay >= currentPlaylist.length){
  147. //last video. loop back to first esp
  148. nextToPlay = 0;
  149. }
  150. }
  151. }
  152. //Play the selected item
  153. var nextPlayObject = currentPlaylist[nextToPlay];
  154. console.log(currentPlaylist[nextToPlay],nextToPlay);
  155. $("#videoname").text(nextPlayObject.Filename);
  156. $("#ext").text("[" + nextPlayObject.Ext + "]" );
  157. currentPlaying = nextPlayObject.Filename;
  158. playVideo("../media?file=" + encodeURIComponent(nextPlayObject.Filepath));
  159. $("#videolist").find(".search").val(nextPlayObject.Filename);
  160. $(".playing").removeClass("playing");
  161. $(".videoObject").each(function(){
  162. if ($(this).attr("filename") == nextPlayObject.Filename){
  163. $(this).addClass("playing");
  164. }
  165. });
  166. }
  167. });
  168. //Handle full screen
  169. dp.on('fullscreen', function() {
  170. previousScreenSize = $("#dplayer").css("width");
  171. setScreenSize("100%");
  172. });
  173. dp.on('fullscreen_cancel', function() {
  174. setScreenSize(previousScreenSize);
  175. });
  176. }
  177. function setAutoplay(obj){
  178. autoPlay = obj.checked;
  179. if (autoPlay){
  180. ao_module_storage.setStorage("Video","autoplay","true");
  181. }else{
  182. ao_module_storage.setStorage("Video","autoplay","false");
  183. }
  184. }
  185. $("#playListSelector").on("change",function(){
  186. var selectedPlaylistName = $(this).val();
  187. var thisPlaylistDevice = "";
  188. $("#playListSelector").find(".playlistObject").each(function(){
  189. if ($(this).attr("value") == selectedPlaylistName){
  190. thisPlaylistDevice = $(this).attr("device");
  191. }
  192. });
  193. if (thisPlaylistDevice.length == 0){
  194. //Unsorted playlist
  195. console.log("Listing unsorted playlists");
  196. listUnsortedFiles();
  197. }else{
  198. listPlayList(selectedPlaylistName);
  199. }
  200. //console.log(thisPlaylistDevice);
  201. });
  202. function setScreenSize(size){
  203. $("#dplayer").css("width",size);
  204. }
  205. function initPlaylist(){
  206. $.ajax({
  207. url: "../system/ajgi/interface?script=Video/backend/buildPlaylist.js",
  208. success: function(data){
  209. console.log(data);
  210. //Initial playlist dropdown
  211. $("#playListSelector").html("");
  212. $("#playListSelector").append(`<option class="" value="">Select Playlist</option>`);
  213. for (var i = 0; i < data.length; i++){
  214. var thisDevice = data[i];
  215. var thisDeviceName = thisDevice.StorageName;
  216. var playlistInThisDevice = thisDevice.PlayLists;
  217. var unsortedVideoInThisDevice = thisDevice.UnsortedVideos;
  218. //Append playlist
  219. for (var j = 0; j < playlistInThisDevice.length; j++){
  220. var thisPlaylistName = playlistInThisDevice[j].Name;
  221. AllPlaylist.push(JSON.parse(JSON.stringify(playlistInThisDevice[j])));
  222. $("#playListSelector").append(`<option class="playlistObject" value="${thisPlaylistName}" device="${thisDeviceName}">${thisPlaylistName}</option>`);
  223. }
  224. for (var k = 0; k < unsortedVideoInThisDevice.length; k++){
  225. unsortedVideoFiles.push(JSON.parse(JSON.stringify(unsortedVideoInThisDevice[k])));
  226. }
  227. }
  228. //Append unsorted into playlist
  229. $("#playListSelector").append(`<option class="playlistObject" value="unsorted" device="">Unsorted Playlist</option>`);
  230. updateWindowEvents();
  231. }
  232. });
  233. }
  234. function listUnsortedFiles(){
  235. //Append unsorted files
  236. $("#videolist").html("");
  237. currentPlaylist = unsortedVideoFiles;
  238. for (var k = 0; k < unsortedVideoFiles.length; k++){
  239. var thisVideoName = unsortedVideoFiles[k].Filename;
  240. var thisFilePath = unsortedVideoFiles[k].Filepath;
  241. var ext = unsortedVideoFiles[k].Ext;
  242. $("#videolist").append(`<div class="item videoObject" filename="${thisVideoName}" filepath="${thisFilePath}" ext="${ext}" playlist="Unsorted">
  243. <i class="file icon"></i>
  244. <div class="content">
  245. <a class="header" onclick="playThisFile(this);">${thisVideoName}</a>
  246. <div class="description">${thisFilePath} / [${ext}]</div>
  247. </div>
  248. </div>`);
  249. }
  250. }
  251. function listPlayList(playlistName){
  252. $("#videolist").html("");
  253. var targetPlaylist;
  254. for (var i =0; i < AllPlaylist.length; i++){
  255. if (AllPlaylist[i].Name == playlistName){
  256. targetPlaylist = AllPlaylist[i];
  257. }
  258. }
  259. currentPlaylist = targetPlaylist.Files;
  260. //Parse the playlist
  261. for (var i = 0; i < currentPlaylist.length; i++){
  262. var playListName = targetPlaylist.Name;
  263. var thisVideoName = currentPlaylist[i].Filename;
  264. var thisFilePath = currentPlaylist[i].Filepath;
  265. var ext = currentPlaylist[i].Ext;
  266. $("#videolist").append(`<div class="item videoObject" filename="${thisVideoName}" filepath="${thisFilePath}" ext="${ext}" playlist="${playListName}">
  267. <i class="file icon"></i>
  268. <div class="content">
  269. <a class="header" onclick="playThisFile(this);">${thisVideoName}</a>
  270. <div class="description">${thisFilePath} / [${ext}]</div>
  271. </div>
  272. </div>`);
  273. }
  274. }
  275. function playThisFile(obj){
  276. $(".playing").removeClass("playing");
  277. var fileDescriptor = $(obj).parent().parent();
  278. $("#videoname").text(fileDescriptor.attr("filename"));
  279. $("#playlistName").text(fileDescriptor.attr("playlist"));
  280. $("#ext").text("[" + fileDescriptor.attr("ext") + "]" );
  281. currentPlaying = fileDescriptor.attr('filename');
  282. playVideo("../media?file=" + encodeURIComponent(fileDescriptor.attr("filepath")));
  283. $(fileDescriptor).addClass("playing");
  284. window.scrollTo(0, 0);
  285. }
  286. function playVideo(src){
  287. playerObject.video.src = src;
  288. playerObject.play()
  289. updateWindowEvents();
  290. }
  291. $(window).on("resize",function(){
  292. updateWindowEvents();
  293. });
  294. function updateWindowEvents(){
  295. $("#dplayer").css("max-height",window.innerHeight);
  296. }
  297. </script>
  298. </body>
  299. </html>