index.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  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. cursor: pointer;
  57. }
  58. .videoObject:hover{
  59. background-color: #ffdd91;
  60. }
  61. </style>
  62. </head>
  63. <body>
  64. <!-- Viewing Panel-->
  65. <div class="playerwrapper" align="center">
  66. <div id="dplayer" class="unstyled" align="left"></div>
  67. </div>
  68. <!-- PlayList-->
  69. <div class="ui container">
  70. <h3 class="ui header">
  71. <span id="videoname">No Video Loaded</span>
  72. <div class="sub header"><span id="playlistName">N/A</span> / <span id="ext">[no_mdeia]</span></div>
  73. </h3>
  74. <div class="ui segment">
  75. <p><i class="expand icon"></i>Screen Size</p>
  76. <!--
  77. <button class="ui tiny button" onclick="setScreenSize('50%');">
  78. Small
  79. </button>
  80. -->
  81. <button class="ui tiny button" onclick="setScreenSize('70%');">
  82. Normal
  83. </button>
  84. <button class="ui tiny button" onclick="setScreenSize('100%');">
  85. Full Width
  86. </button>
  87. <div class="ui toggle right floated checkbox">
  88. <input id="autoplayToggle" type="checkbox" name="autoplay" onchange="setAutoplay(this);">
  89. <label>Autoplay</label>
  90. </div>
  91. </div>
  92. <div id="playList" class="ui fluid segment">
  93. <p><i class="list icon"></i> PlayLists</p>
  94. <select id="playListSelector" class="ui search fluid dropdown">
  95. <option value="">Select Playlist</option>
  96. </select>
  97. <br>
  98. <p><i class="file icon"></i>PlayList Videos</p>
  99. <div id="videolist" class="ui relaxed divided list">
  100. </div>
  101. </div>
  102. <br><br><br>
  103. </div>
  104. <script>
  105. var playerObject;
  106. var AllPlaylist = [];
  107. var currentPlaylist = [];
  108. var currentPlaying;
  109. //var unsortedVideoFiles = [];
  110. var autoPlay = false;
  111. var previousScreenSize = "70%";
  112. $('.ui.dropdown').dropdown();
  113. init();
  114. initPlaylist();
  115. autoPlay = (ao_module_storage.loadStorage("Video","autoplay") == "true");
  116. if (autoPlay){
  117. $("#autoplayToggle").attr("checked",true);
  118. }
  119. function init(){
  120. //Removed set global volume and isolate two systems
  121. /*var defaultVol = localStorage.getItem("global_volume");
  122. if (defaultVol == null || defaultVol == "" || defaultVol == undefined){
  123. defaultVol = 0.4;
  124. }
  125. */
  126. const dp = new DPlayer({
  127. container: document.getElementById('dplayer'),
  128. autoplay: false,
  129. //volume: parseFloat(defaultVol),
  130. video: {
  131. pic: 'img/thumbnail.png',
  132. }
  133. });
  134. playerObject = dp;
  135. /*
  136. dp.on("volumechange",function(){
  137. var newVol = dp.volume();
  138. if (localStorage){
  139. localStorage.setItem("global_volume",newVol);
  140. }
  141. });
  142. */
  143. //handle autoplay on end
  144. dp.on('ended', function() {
  145. if (autoPlay){
  146. //Play next item in list
  147. var nextToPlay = 0;
  148. for (var i =0; i < currentPlaylist.length; i++){
  149. if (currentPlaylist[i].Filename == currentPlaying){
  150. nextToPlay = i + 1;
  151. if (nextToPlay >= currentPlaylist.length){
  152. //last video. loop back to first esp
  153. nextToPlay = 0;
  154. }
  155. }
  156. }
  157. //Play the selected item
  158. var nextPlayObject = currentPlaylist[nextToPlay];
  159. console.log(currentPlaylist[nextToPlay],nextToPlay);
  160. $("#videoname").text(nextPlayObject.Filename);
  161. $("#ext").text("[" + nextPlayObject.Ext + "]" );
  162. currentPlaying = nextPlayObject.Filename;
  163. playVideo("../media?file=" + encodeURIComponent(nextPlayObject.Filepath));
  164. $("#videolist").find(".search").val(nextPlayObject.Filename);
  165. $(".playing").removeClass("playing");
  166. $(".videoObject").each(function(){
  167. if ($(this).attr("filename") == nextPlayObject.Filename){
  168. $(this).addClass("playing");
  169. }
  170. });
  171. }
  172. });
  173. //Handle full screen
  174. dp.on('fullscreen', function() {
  175. previousScreenSize = $("#dplayer").css("width");
  176. setScreenSize("100%");
  177. });
  178. dp.on('fullscreen_cancel', function() {
  179. setScreenSize(previousScreenSize);
  180. });
  181. }
  182. function setAutoplay(obj){
  183. autoPlay = obj.checked;
  184. if (autoPlay){
  185. ao_module_storage.setStorage("Video","autoplay","true");
  186. }else{
  187. ao_module_storage.setStorage("Video","autoplay","false");
  188. }
  189. }
  190. $("#playListSelector").on("change",function(){
  191. var selectedPlaylistName = $(this).val();
  192. var thisPlaylistDevice = "";
  193. $("#playListSelector").find(".playlistObject").each(function(){
  194. if ($(this).attr("value") == selectedPlaylistName){
  195. thisPlaylistDevice = $(this).attr("device");
  196. }
  197. });
  198. if (thisPlaylistDevice.length == 0){
  199. //Unsorted playlist
  200. console.log("Listing unsorted playlists");
  201. listUnsortedFiles();
  202. }else{
  203. listPlayList(selectedPlaylistName);
  204. }
  205. //console.log(thisPlaylistDevice);
  206. });
  207. function setScreenSize(size){
  208. $("#dplayer").css("width",size);
  209. }
  210. function initPlaylist(){
  211. $.ajax({
  212. url: "../system/ajgi/interface?script=Video/backend/buildPlaylist.js",
  213. success: function(data){
  214. console.log(data);
  215. //Initial playlist dropdown
  216. $("#playListSelector").html("");
  217. $("#playListSelector").append(`<option class="" value="">Select Playlist</option>`);
  218. for (var i = 0; i < data.length; i++){
  219. var thisDevice = data[i];
  220. var thisDeviceName = thisDevice.StorageName;
  221. var playlistInThisDevice = thisDevice.PlayLists;
  222. //var unsortedVideoInThisDevice = thisDevice.UnsortedVideos;
  223. //Append playlist
  224. for (var j = 0; j < playlistInThisDevice.length; j++){
  225. var thisPlaylistName = playlistInThisDevice[j].Name;
  226. AllPlaylist.push(JSON.parse(JSON.stringify(playlistInThisDevice[j])));
  227. $("#playListSelector").append(`<option class="playlistObject" value="${thisPlaylistName}" device="${thisDeviceName}">${thisPlaylistName}</option>`);
  228. }
  229. /*
  230. for (var k = 0; k < unsortedVideoInThisDevice.length; k++){
  231. unsortedVideoFiles.push(JSON.parse(JSON.stringify(unsortedVideoInThisDevice[k])));
  232. }
  233. */
  234. }
  235. //Append unsorted into playlist
  236. //$("#playListSelector").append(`<option class="playlistObject" value="unsorted" device="">Unsorted Playlist</option>`);
  237. updateWindowEvents();
  238. }
  239. });
  240. }
  241. /*
  242. function listUnsortedFiles(){
  243. //Append unsorted files
  244. $("#videolist").html("");
  245. currentPlaylist = unsortedVideoFiles;
  246. for (var k = 0; k < unsortedVideoFiles.length; k++){
  247. var thisVideoName = unsortedVideoFiles[k].Filename;
  248. var thisFilePath = unsortedVideoFiles[k].Filepath;
  249. var ext = unsortedVideoFiles[k].Ext;
  250. $("#videolist").append(`<div class="item videoObject" onclick="playThisFile(this);" filename="${thisVideoName}" filepath="${thisFilePath}" ext="${ext}" playlist="Unsorted">
  251. <i class="file icon"></i>
  252. <div class="content">
  253. <a class="header">${thisVideoName}</a>
  254. <div class="description">${thisFilePath} / [${ext}]</div>
  255. </div>
  256. </div>`);
  257. }
  258. }
  259. */
  260. function listPlayList(playlistName){
  261. $("#videolist").html("");
  262. var targetPlaylist;
  263. for (var i =0; i < AllPlaylist.length; i++){
  264. if (AllPlaylist[i].Name == playlistName){
  265. targetPlaylist = AllPlaylist[i];
  266. }
  267. }
  268. currentPlaylist = targetPlaylist.Files;
  269. //Parse the playlist
  270. for (var i = 0; i < currentPlaylist.length; i++){
  271. var playListName = targetPlaylist.Name;
  272. var thisVideoName = currentPlaylist[i].Filename;
  273. thisVideoName = thisVideoName.split(".");
  274. thisVideoName.pop();
  275. thisVideoName = thisVideoName.join(".");
  276. var thisFilePath = currentPlaylist[i].Filepath;
  277. var ext = currentPlaylist[i].Ext;
  278. $("#videolist").append(`<div class="item videoObject" onclick="playThisFile(this);" filename="${thisVideoName}" filepath="${thisFilePath}" ext="${ext}" playlist="${playListName}">
  279. <img class="ui top aligned tiny image thumbnail" src="img/no_preview.svg">
  280. <div class="content" style="width: calc(100% - 100px);">
  281. <p class="header">${thisVideoName}</p>
  282. <div class="description">${thisFilePath} <br> ${ext.substr(1)}</div>
  283. </div>
  284. </div>`);
  285. }
  286. //Render the thumbnail
  287. $(".videoObject").each(function(){
  288. let vidDomElet = $(this);
  289. ao_module_agirun("Video/backend/getThumbnail.js", {
  290. file: $(this).attr("filepath")
  291. },function(data){
  292. if (data.error == undefined && data.length > 0){
  293. //Thumbnail get. Render it to the DOM element
  294. $(vidDomElet).find(".thumbnail").attr("src", 'data:image/jpg;base64,' + data);
  295. }
  296. } );
  297. });
  298. }
  299. function playThisFile(obj){
  300. $(".playing").removeClass("playing");
  301. //var fileDescriptor = $(obj).parent().parent();
  302. var fileDescriptor = $(obj);
  303. $("#videoname").text(fileDescriptor.attr("filename"));
  304. $("#playlistName").text(fileDescriptor.attr("playlist"));
  305. $("#ext").text("[" + fileDescriptor.attr("ext") + "]" );
  306. currentPlaying = fileDescriptor.attr('filename');
  307. playVideo("../media?file=" + encodeURIComponent(fileDescriptor.attr("filepath")));
  308. $(fileDescriptor).addClass("playing");
  309. window.scrollTo(0, 0);
  310. }
  311. function playVideo(src){
  312. playerObject.video.src = src;
  313. playerObject.play()
  314. updateWindowEvents();
  315. }
  316. $(window).on("resize",function(){
  317. updateWindowEvents();
  318. });
  319. function updateWindowEvents(){
  320. $("#dplayer").css("max-height",window.innerHeight);
  321. }
  322. </script>
  323. </body>
  324. </html>