summaryrefslogtreecommitdiff
path: root/localwebsite/htdocs
diff options
context:
space:
mode:
Diffstat (limited to 'localwebsite/htdocs')
-rw-r--r--localwebsite/htdocs/assets/app.css39
-rw-r--r--localwebsite/htdocs/assets/app.js153
2 files changed, 151 insertions, 41 deletions
diff --git a/localwebsite/htdocs/assets/app.css b/localwebsite/htdocs/assets/app.css
index 59c0f35..d93c4f7 100644
--- a/localwebsite/htdocs/assets/app.css
+++ b/localwebsite/htdocs/assets/app.css
@@ -152,25 +152,22 @@
40% { opacity: 1; }
}
-/* cams page */
-@media only screen and (min-width: 640px) {
- .camfeeds {
- display: flex;
- flex-wrap: wrap;
- flex-direction: row;
- }
- .camfeeds > video {
- display: flex;
- flex-basis: calc(50% - 20px);
- justify-content: center;
- flex-direction: column;
- width: calc(50% - 10px);
- margin: 5px;
- }
-}
-@media only screen and (max-width: 639px) {
- .camfeeds > video {
- max-width: 100%;
- }
-} \ No newline at end of file
+.camfeeds:not(.is_mobile) {
+ display: flex;
+ flex-wrap: wrap;
+ flex-direction: row;
+}
+
+.camfeeds:not(.is_mobile) > video {
+ display: flex;
+ flex-basis: calc(50% - 20px);
+ justify-content: center;
+ flex-direction: column;
+ width: calc(50% - 10px);
+ margin: 5px;
+}
+
+.camfeeds.is_mobile > video {
+ max-width: 100%;
+}
diff --git a/localwebsite/htdocs/assets/app.js b/localwebsite/htdocs/assets/app.js
index c08490f..ff2295d 100644
--- a/localwebsite/htdocs/assets/app.js
+++ b/localwebsite/htdocs/assets/app.js
@@ -1,4 +1,7 @@
-var ajax = {
+(function() {
+var RE_WHITESPACE = /[\t\r\n\f]/g
+
+window.ajax = {
get: function(url, data) {
if (typeof data == 'object') {
var index = 0;
@@ -35,28 +38,138 @@ var ajax = {
}
};
-function extend(a, b) {
+window.extend = function(a, b) {
return Object.assign(a, b);
}
-function ge(id) {
+window.ge = function(id) {
return document.getElementById(id);
}
-(function() {
- var ua = navigator.userAgent.toLowerCase();
- window.browserInfo = {
- version: (ua.match(/.+(?:me|ox|on|rv|it|ra|ie)[\/: ]([\d.]+)/) || [0,'0'])[1],
- //opera: /opera/i.test(ua),
- msie: (/msie/i.test(ua) && !/opera/i.test(ua)) || /trident/i.test(ua),
- mozilla: /firefox/i.test(ua),
- android: /android/i.test(ua),
- mac: /mac/i.test(ua),
- samsungBrowser: /samsungbrowser/i.test(ua),
- chrome: /chrome/i.test(ua),
- safari: /safari/i.test(ua),
- mobile: /iphone|ipod|ipad|opera mini|opera mobi|iemobile|android/i.test(ua),
- operaMini: /opera mini/i.test(ua),
- ios: /iphone|ipod|ipad|watchos/i.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1),
- };
-})();
+var ua = navigator.userAgent.toLowerCase();
+window.browserInfo = {
+ version: (ua.match(/.+(?:me|ox|on|rv|it|ra|ie)[\/: ]([\d.]+)/) || [0,'0'])[1],
+ //opera: /opera/i.test(ua),
+ msie: (/msie/i.test(ua) && !/opera/i.test(ua)) || /trident/i.test(ua),
+ mozilla: /firefox/i.test(ua),
+ android: /android/i.test(ua),
+ mac: /mac/i.test(ua),
+ samsungBrowser: /samsungbrowser/i.test(ua),
+ chrome: /chrome/i.test(ua),
+ safari: /safari/i.test(ua),
+ mobile: /iphone|ipod|ipad|opera mini|opera mobi|iemobile|android/i.test(ua),
+ operaMini: /opera mini/i.test(ua),
+ ios: /iphone|ipod|ipad|watchos/i.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1),
+};
+
+window.isTouchDevice = function() {
+ return 'ontouchstart' in window || navigator.msMaxTouchPoints;
+}
+
+window.hasClass = function(el, name) {
+ if (!el)
+ throw new Error('hasClass: invalid element')
+
+ if (el.nodeType !== 1)
+ throw new Error('hasClass: expected nodeType is 1, got' + el.nodeType)
+
+ if (window.DOMTokenList && el.classList instanceof DOMTokenList) {
+ return el.classList.contains(name)
+ } else {
+ return (" " + el.className + " ").replace(RE_WHITESPACE, " ").indexOf(" " + name + " ") >= 0
+ }
+}
+
+window.addClass = function(el, name) {
+ if (!hasClass(el, name)) {
+ el.className = (el.className ? el.className + ' ' : '') + name;
+ return true
+ }
+ return false
+}
+
+window.Cameras = {
+ hlsOptions: null,
+ hlsHost: null,
+ hlsProto: null,
+ debugVideoEvents: false,
+
+ setupHls: function(video, name, useHls) {
+ var src = this.hlsProto + '://' + this.hlsHost + '/ipcam/' + name + '/live.m3u8';
+
+ // hls.js is not supported on platforms that do not have Media Source Extensions (MSE) enabled.
+
+ // When the browser has built-in HLS support (check using `canPlayType`), we can provide an HLS manifest (i.e. .m3u8 URL) directly to the video element through the `src` property.
+ // This is using the built-in support of the plain video element, without using hls.js.
+
+ if (useHls) {
+ var config = this.hlsOptions;
+ config.xhrSetup = function (xhr,url) {
+ xhr.withCredentials = true;
+ };
+
+ var hls = new Hls(config);
+ hls.loadSource(src);
+ hls.attachMedia(video);
+ hls.on(Hls.Events.MEDIA_ATTACHED, function () {
+ video.muted = true;
+ video.play();
+ });
+ } else {
+ console.warn('hls.js is not supported, trying the native way...')
+
+ video.autoplay = true;
+ video.muted = true;
+ if (window.browserInfo.ios)
+ video.setAttribute('controls', 'controls');
+
+ video.src = src;
+
+ var events = ['canplay'];
+ if (this.debugVideoEvents)
+ events.push('canplay', 'canplaythrough', 'durationchange', 'ended', 'loadeddata', 'loadedmetadata', 'pause', 'play', 'playing', 'progress', 'seeked', 'seeking', 'stalled', 'suspend', 'timeupdate', 'waiting');
+
+ for (var i = 0; i < events.length; i++) {
+ var evt = events[i];
+ (function(evt, video, name) {
+ video.addEventListener(evt, function(e) {
+ if (this.debugVideoEvents)
+ console.log(name + ': ' + evt, e);
+
+ if (!window.browserInfo.ios && ['canplay', 'loadedmetadata'].includes(evt))
+ video.play();
+ })
+ })(evt, video, name);
+ }
+ }
+ },
+
+ init: function(cams, options, proto, host, debugVideoEvents) {
+ // this.cams = cams;
+ this.hlsOptions = options;
+ this.hlsProto = proto;
+ this.hlsHost = host;
+ this.debugVideoEvents = debugVideoEvents
+
+ let useHls = Hls.isSupported();
+ if (!useHls && !this.hasFallbackSupport()) {
+ alert('Neither HLS nor vnd.apple.mpegurl is not supported by your browser.');
+ return;
+ }
+
+ for (var i = 0; i < cams.length; i++) {
+ var name = cams[i];
+ var video = document.createElement('video');
+ video.setAttribute('id', 'video-'+name);
+ document.getElementById('videos').appendChild(video);
+
+ this.setupHls(video, name, useHls);
+ }
+ },
+
+ hasFallbackSupport: function() {
+ var video = document.createElement('video');
+ return video.canPlayType('application/vnd.apple.mpegurl');
+ },
+};
+})(); \ No newline at end of file