if(Debug.debug) console.log("Loading: PageInfo.js"); class PageInfo { constructor(comms, settings, extensionMode){ this.hasVideos = false; this.siteDisabled = false; this.videos = []; this.settings = settings; this.actionHandlerInitQueue = []; this.lastUrl = window.location.href; this.extensionMode = extensionMode; if(comms){ this.comms = comms; } this.rescan(RescanReason.PERIODIC); this.scheduleUrlCheck(); this.currentZoomScale = 1; } destroy() { if(Debug.debug || Debug.init){ console.log("[PageInfo::destroy] destroying all videos!") } if(this.rescanTimer){ clearTimeout(this.rescanTimer); } for (var video of this.videos) { this.comms.unregisterVideo(video.id) video.destroy(); } } reset() { for(var video of this.videos) { video.destroy(); } this.rescan(RescanReason.MANUAL); } initMouseActionHandler(videoData) { if (this.actionHandler) { this.actionHandler.registerHandleMouse(videoData); } else { this.actionHandlerInitQueue.push(videoData); } } setActionHandler(actionHandler) { this.actionHandler = actionHandler; for (var item of this.actionHandlerInitQueue) { this.actionHandler.registerHandleMouse(item); } this.actionHandlerInitQueue = []; } rescan(rescanReason){ const oldVideoCount = this.videos.length; try{ var vids = document.getElementsByTagName('video'); if(!vids || vids.length == 0){ this.hasVideos = false; if(rescanReason == RescanReason.PERIODIC){ this.scheduleRescan(RescanReason.PERIODIC); } return; } // add new videos this.hasVideos = false; var videoExists = false; var video, v; for (video of vids) { // če najdemo samo en video z višino in širino, to pomeni, da imamo na strani veljavne videe // če trenutni video nima definiranih teh vrednostih, preskočimo vse nadaljnja preverjanja // <===[:::::::]===> // if we find even a single video with width and height, that means the page has valid videos // if video lacks either of the two properties, we skip all further checks cos pointless if(video.offsetWidth && video.offsetHeight){ this.hasVideos = true; } else { continue; } videoExists = false; for (v of this.videos) { if (v.destroyed) { continue; //TODO: if destroyed video is same as current video, copy aspect ratio settings to current video } if (v.video == video) { videoExists = true; break; } } if (videoExists) { continue; } else { if(Debug.debug && Debug.periodic && Debug.videoRescan){ console.log("[PageInfo::rescan] found new video candidate:", video, "NOTE:: Video initialization starts here:\n--------------------------------\n") } v = new VideoData(video, this.settings, this); // console.log("[PageInfo::rescan] v is:", v) // debugger; v.initArDetection(); this.videos.push(v); if(Debug.debug && Debug.periodic && Debug.videoRescan){ console.log("[PageInfo::rescan] END VIDEO INITIALIZATION\n\n\n-------------------------------------\nvideos[] is now this:", this.videos,"\n\n\n\n\n\n\n\n") } } } this.removeDestroyed(); // če smo ostali brez videev, potem odregistriraj stran. // če nismo ostali brez videev, potem registriraj stran. // // if we're left withotu videos on the current page, we unregister the page. // if we have videos, we call register. // if(Debug.debug) { // console.log("[PageInfo::rescan] Comms:", this.comms, "\nvideos.length:", this.videos.length, "\nold video count:", oldVideoCount) // } if (this.comms) { if (this.videos.length != oldVideoCount) { // only if number of videos changed, tho if (this.videos.length > 0) { this.comms.registerVideo({host: window.location.host, location: window.location}); } else { this.comms.unregisterVideo({host: window.location.host, location: window.location}); } } } }catch(e){ console.log("rescan error:",e) } if(rescanReason == RescanReason.PERIODIC){ this.scheduleRescan(RescanReason.PERIODIC); } } removeDestroyed(){ this.videos = this.videos.filter( vid => vid.destroyed === false); } scheduleRescan(rescanReason){ if(rescanReason != RescanReason.PERIODIC){ this.rescan(rescanReason); return; } try{ if(this.rescanTimer){ clearTimeout(this.rescanTimer); } var ths = this; this.rescanTimer = setTimeout(function(rr){ ths.rescanTimer = null; ths.rescan(rr); ths = null; }, rescanReason === this.settings.active.pageInfo.timeouts.rescan, RescanReason.PERIODIC) } catch(e) { if(Debug.debug){ console.log("[PageInfo::scheduleRescan] scheduling rescan failed. Here's why:",e) } } } scheduleUrlCheck() { try{ if(this.urlCheckTimer){ clearTimeout(this.urlCheckTimer); } var ths = this; this.rescanTimer = setTimeout(function(){ ths.rescanTimer = null; ths.ghettoUrlCheck(); ths = null; }, this.settings.active.pageInfo.timeouts.urlCheck) }catch(e){ if(Debug.debug){ console.log("[PageInfo::scheduleUrlCheck] scheduling URL check failed. Here's why:",e) } } } ghettoUrlCheck() { if (this.lastUrl != window.location.href){ if(Debug.debug){ console.log("[PageInfo::ghettoUrlCheck] URL has changed. Triggering a rescan!"); } this.rescan(RescanReason.URL_CHANGE); this.lastUrl = window.location.href; } this.scheduleUrlCheck(); } initArDetection(playingOnly){ if (playingOnly) { for(var vd of this.videos){ if(vd.isPlaying()) { vd.initArDetection(); } } return; } else { for(var vd of this.videos){ vd.initArDetection(); } } } // to je treba klicat ob menjavi zavihkov // these need to be called on tab switch pauseProcessing(playingOnly){ if (playingOnly) { for(var vd of this.videos){ if (vd.isPlaying()) { vd.pause(); } } } else { for(var vd of this.videos){ vd.pause(); } } } resumeProcessing(resumeAutoar = false, playingOnly = false){ if (playingOnly) { for(var vd of this.videos){ if (vd.isPlaying()) { vd.resume(); if(resumeAutoar){ vd.resumeAutoAr(); } } } } else { for(var vd of this.videos){ vd.resume(); if(resumeAutoar){ vd.resumeAutoAr(); } } } } startArDetection(playingOnly){ if (Debug.debug) { console.log('[PageInfo::startArDetection()] starting automatic ar detection!') } if (playingOnly) { for(var vd of this.videos){ if (video.isPlaying()) { vd.startArDetection(); } } } else { for(var vd of this.videos){ vd.startArDetection(); } } } stopArDetection(playingOnly){ if (playingOnly) { for(var vd of this.videos){ if (vd.isPlaying()) { vd.stopArDetection(); } } } else { for(var vd of this.videos){ vd.stopArDetection(); } } } setAr(ar, playingOnly){ if (Debug.debug) { console.log('[PageInfo::setAr] aspect ratio:', ar, "playing only?", playingOnly) } if (ar !== 'auto') { this.stopArDetection(playingOnly); } else { if (Debug.debug) { console.log('[PageInfo::setAr] aspect ratio is auto'); } try { for (var vd of this.videos) { if (!playingOnly || vd.isPlaying()) { vd.resetLastAr(); } } } catch (e) { console.log("???", e); } this.initArDetection(playingOnly); this.startArDetection(playingOnly); return; } // TODO: find a way to only change aspect ratio for one video if (ar === 'reset') { for (var vd of this.videos) { if (!playingOnly || vd.isPlaying()) { vd.resetAr(); } } } else { for (var vd of this.videos) { if (!playingOnly || vd.isPlaying()) { vd.setAr(ar) } } } } setVideoFloat(videoFloat, playingOnly) { if (playingOnly) { for(var vd of this.videos) { if (vd.isPlaying()) { vd.setVideoFloat(videoFloat) } } } else { for(var vd of this.videos) { vd.setVideoFloat(videoFloat) } } } setPanMode(mode, playingOnly) { if (playingOnly) { for(var vd of this.videos) { if (vd.isPlaying()) { vd.setPanMode(mode); } } } else { for(var vd of this.videos) { vd.setPanMode(mode); } } } restoreAr(playingOnly) { if (playingOnly) { for(var vd of this.videos){ if (vd.isPlaying()) { vd.restoreAr(); } } } else { for(var vd of this.videos){ vd.restoreAr(); } } } setStretchMode(sm, playingOnly){ // TODO: find a way to only change aspect ratio for one video if (playingOnly) { for(var vd of this.videos){ if (vd.isPlaying()) { vd.setStretchMode(sm) } } } else { for(var vd of this.videos){ vd.setStretchMode(sm) } } } setZoom(zoomLevel, no_announce, playingOnly) { if (playingOnly) { for(var vd of this.videos) { if (vd.isPlaying()) { vd.setZoom(zoomLevel, no_announce); } } } else { for(var vd of this.videos) { vd.setZoom(zoomLevel, no_announce); } } } zoomStep(step, playingOnly) { for(var vd of this.videos){ if (!playingOnly || vd.isPlaying()) { vd.zoomStep(step); } } } announceZoom(scale) { if (this.announceZoomTimeout) { clearTimeout(this.announceZoom); } this.currentZoomScale = scale; const ths = this; this.announceZoomTimeout = setTimeout(() => ths.comms.announceZoom(scale), this.settings.active.zoom.announceDebounce); } requestCurrentZoom() { this.comms.announceZoom(this.currentZoomScale); } } var RescanReason = { PERIODIC: 0, URL_CHANGE: 1, MANUAL: 2 }