index.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  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%'); previousScreenSize='70%';">
  82. Normal
  83. </button>
  84. <button class="ui tiny button" onclick="setScreenSize('100%');previousScreenSize='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. //Check if there are file dropped into this interface. If yes, redirect to embedded
  116. var infile = ao_module_loadInputFiles();
  117. if (infile != null){
  118. window.location.href = "embedded.html" + window.location.hash;
  119. }
  120. autoPlay = (ao_module_storage.loadStorage("Video","autoplay") == "true");
  121. if (autoPlay){
  122. $("#autoplayToggle").attr("checked",true);
  123. }
  124. function init(){
  125. //Removed set global volume and isolate two systems
  126. /*var defaultVol = localStorage.getItem("global_volume");
  127. if (defaultVol == null || defaultVol == "" || defaultVol == undefined){
  128. defaultVol = 0.4;
  129. }
  130. */
  131. const dp = new DPlayer({
  132. container: document.getElementById('dplayer'),
  133. autoplay: false,
  134. //volume: parseFloat(defaultVol),
  135. video: {
  136. pic: 'img/thumbnail.png',
  137. }
  138. });
  139. playerObject = dp;
  140. /*
  141. dp.on("volumechange",function(){
  142. var newVol = dp.volume();
  143. if (localStorage){
  144. localStorage.setItem("global_volume",newVol);
  145. }
  146. });
  147. */
  148. //handle autoplay on end
  149. dp.on('ended', function() {
  150. if (autoPlay){
  151. //Play next item in list
  152. var nextToPlay = 0;
  153. for (var i =0; i < currentPlaylist.length; i++){
  154. if (currentPlaylist[i].Filename == currentPlaying){
  155. nextToPlay = i + 1;
  156. if (nextToPlay >= currentPlaylist.length){
  157. //last video. loop back to first esp
  158. nextToPlay = 0;
  159. }
  160. }
  161. }
  162. //Play the selected item
  163. var nextPlayObject = currentPlaylist[nextToPlay];
  164. console.log(currentPlaylist[nextToPlay],nextToPlay);
  165. $("#videoname").text(nextPlayObject.Filename);
  166. $("#ext").text("[" + nextPlayObject.Ext + "]" );
  167. currentPlaying = nextPlayObject.Filename;
  168. playVideo("../media?file=" + encodeURIComponent(nextPlayObject.Filepath));
  169. $("#videolist").find(".search").val(nextPlayObject.Filename);
  170. $(".playing").removeClass("playing");
  171. $(".videoObject").each(function(){
  172. if ($(this).attr("filename") == nextPlayObject.Filename){
  173. $(this).addClass("playing");
  174. }
  175. });
  176. }
  177. });
  178. //Handle full screen
  179. dp.on('fullscreen', function() {
  180. //previousScreenSize = $("#dplayer").css("width");
  181. setScreenSize("100%");
  182. });
  183. dp.on('fullscreen_cancel', function() {
  184. setScreenSize(previousScreenSize);
  185. });
  186. }
  187. function setAutoplay(obj){
  188. autoPlay = obj.checked;
  189. if (autoPlay){
  190. ao_module_storage.setStorage("Video","autoplay","true");
  191. }else{
  192. ao_module_storage.setStorage("Video","autoplay","false");
  193. }
  194. }
  195. $("#playListSelector").on("change",function(){
  196. var selectedPlaylistName = $(this).val();
  197. var thisPlaylistDevice = "";
  198. $("#playListSelector").find(".playlistObject").each(function(){
  199. if ($(this).attr("value") == selectedPlaylistName){
  200. thisPlaylistDevice = $(this).attr("device");
  201. }
  202. });
  203. if (thisPlaylistDevice.length == 0){
  204. //Unsorted playlist
  205. console.log("Listing unsorted playlists");
  206. listUnsortedFiles();
  207. }else{
  208. listPlayList(selectedPlaylistName);
  209. }
  210. //console.log(thisPlaylistDevice);
  211. });
  212. function setScreenSize(size){
  213. $("#dplayer").css("width",size);
  214. }
  215. function initPlaylist(){
  216. $.ajax({
  217. url: "../system/ajgi/interface?script=Video/backend/buildPlaylist.js",
  218. success: function(data){
  219. console.log(data);
  220. //Initial playlist dropdown
  221. $("#playListSelector").html("");
  222. $("#playListSelector").append(`<option class="" value="">Select Playlist</option>`);
  223. for (var i = 0; i < data.length; i++){
  224. var thisDevice = data[i];
  225. var thisDeviceName = thisDevice.StorageName;
  226. var playlistInThisDevice = thisDevice.PlayLists;
  227. //var unsortedVideoInThisDevice = thisDevice.UnsortedVideos;
  228. //Append playlist
  229. for (var j = 0; j < playlistInThisDevice.length; j++){
  230. var thisPlaylistName = playlistInThisDevice[j].Name;
  231. AllPlaylist.push(JSON.parse(JSON.stringify(playlistInThisDevice[j])));
  232. $("#playListSelector").append(`<option class="playlistObject" value="${thisPlaylistName}" device="${thisDeviceName}">${thisPlaylistName}</option>`);
  233. }
  234. /*
  235. for (var k = 0; k < unsortedVideoInThisDevice.length; k++){
  236. unsortedVideoFiles.push(JSON.parse(JSON.stringify(unsortedVideoInThisDevice[k])));
  237. }
  238. */
  239. }
  240. //Append unsorted into playlist
  241. //$("#playListSelector").append(`<option class="playlistObject" value="unsorted" device="">Unsorted Playlist</option>`);
  242. updateWindowEvents();
  243. }
  244. });
  245. }
  246. /*
  247. function listUnsortedFiles(){
  248. //Append unsorted files
  249. $("#videolist").html("");
  250. currentPlaylist = unsortedVideoFiles;
  251. for (var k = 0; k < unsortedVideoFiles.length; k++){
  252. var thisVideoName = unsortedVideoFiles[k].Filename;
  253. var thisFilePath = unsortedVideoFiles[k].Filepath;
  254. var ext = unsortedVideoFiles[k].Ext;
  255. $("#videolist").append(`<div class="item videoObject" onclick="playThisFile(this);" filename="${thisVideoName}" filepath="${thisFilePath}" ext="${ext}" playlist="Unsorted">
  256. <i class="file icon"></i>
  257. <div class="content">
  258. <a class="header">${thisVideoName}</a>
  259. <div class="description">${thisFilePath} / [${ext}]</div>
  260. </div>
  261. </div>`);
  262. }
  263. }
  264. */
  265. function listPlayList(playlistName){
  266. $("#videolist").html("");
  267. var targetPlaylist;
  268. for (var i =0; i < AllPlaylist.length; i++){
  269. if (AllPlaylist[i].Name == playlistName){
  270. targetPlaylist = AllPlaylist[i];
  271. }
  272. }
  273. currentPlaylist = targetPlaylist.Files;
  274. //Parse the playlist
  275. for (var i = 0; i < currentPlaylist.length; i++){
  276. var playListName = targetPlaylist.Name;
  277. var thisVideoName = currentPlaylist[i].Filename;
  278. thisVideoName = thisVideoName.split(".");
  279. thisVideoName.pop();
  280. thisVideoName = thisVideoName.join(".");
  281. var thisFilePath = currentPlaylist[i].Filepath;
  282. var ext = currentPlaylist[i].Ext;
  283. $("#videolist").append(`<div class="item videoObject" onclick="playThisFile(this);" filename="${thisVideoName}" filepath="${thisFilePath}" ext="${ext}" playlist="${playListName}">
  284. <img class="ui top aligned tiny image thumbnail" src="img/no_preview.svg">
  285. <div class="content" style="width: calc(100% - 100px);">
  286. <p class="header">${thisVideoName}</p>
  287. <div class="description">${thisFilePath} <br> ${ext.substr(1)}</div>
  288. </div>
  289. </div>`);
  290. }
  291. //Render the thumbnail
  292. $(".videoObject").each(function(){
  293. let vidDomElet = $(this);
  294. ao_module_agirun("Video/backend/getThumbnail.js", {
  295. file: $(this).attr("filepath")
  296. },function(data){
  297. if (data.error == undefined && data.length > 0){
  298. //Thumbnail get. Render it to the DOM element
  299. $(vidDomElet).find(".thumbnail").attr("src", 'data:image/jpg;base64,' + data);
  300. }
  301. } );
  302. });
  303. }
  304. function playThisFile(obj){
  305. $(".playing").removeClass("playing");
  306. //var fileDescriptor = $(obj).parent().parent();
  307. var fileDescriptor = $(obj);
  308. $("#videoname").text(fileDescriptor.attr("filename"));
  309. $("#playlistName").text(fileDescriptor.attr("playlist"));
  310. $("#ext").text("[" + fileDescriptor.attr("ext") + "]" );
  311. currentPlaying = fileDescriptor.attr('filename');
  312. playVideo("../media?file=" + encodeURIComponent(fileDescriptor.attr("filepath")));
  313. $(fileDescriptor).addClass("playing");
  314. window.scrollTo(0, 0);
  315. }
  316. function playVideo(src){
  317. playerObject.video.src = src;
  318. playerObject.play()
  319. updateWindowEvents();
  320. }
  321. $(window).on("resize",function(){
  322. updateWindowEvents();
  323. });
  324. function updateWindowEvents(){
  325. $("#dplayer").css("max-height",window.innerHeight);
  326. }
  327. </script>
  328. </body>
  329. </html>