diff --git a/package-lock.json b/package-lock.json
index 432a422..4bf6f5e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,7 +24,7 @@
"@angular/platform-browser-dynamic": "^10.0.8",
"@angular/platform-server": "^10.0.8",
"@angular/router": "^10.0.8",
- "@antmedia/web_player": "2.9.1-SNAPSHOT-2024-May-26-04-53",
+ "@antmedia/web_player": "3.0.0-SNAPSHOT-2025-Jun-28-08-06",
"@ngui/map": "0.30.3",
"@ngui/ngui": "0.15.2",
"@types/googlemaps": "3.39.11",
@@ -38,7 +38,7 @@
"chartist-plugin-zoom": "0.6.0",
"chartjs-plugin-zoom": "0.7.7",
"copy-webpack-plugin": "6.0.3",
- "datatables": "1.10.18",
+ "datatables.net": "1.11.4",
"datatables.net-bs": "1.11.5",
"datatables.net-responsive": "^2.5.1",
"easy-pie-chart": "2.1.7",
@@ -1011,12 +1011,14 @@
}
},
"node_modules/@antmedia/videojs-webrtc-plugin": {
- "version": "1.2.1",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@antmedia/videojs-webrtc-plugin/-/videojs-webrtc-plugin-1.3.3.tgz",
+ "integrity": "sha512-+/4cDpmSTkkybmxoKcFjpM6Z9criQNVuLE++v3yKwpOtgFZqIwuA7cIWn/ZZ4p1cLuPSq6vH/yIsWstQaf1uVg==",
"license": "MIT",
"dependencies": {
- "@antmedia/webrtc_adaptor": "^2.8.0-SNAPSHOT",
+ "@antmedia/webrtc_adaptor": "^2.11.3",
"global": "^4.4.0",
- "video.js": "^6 || ^7"
+ "video.js": "^8"
},
"engines": {
"node": ">=14",
@@ -1024,27 +1026,19 @@
}
},
"node_modules/@antmedia/web_player": {
- "version": "2.9.1-SNAPSHOT-2024-May-26-04-53",
- "resolved": "https://registry.npmjs.org/@antmedia/web_player/-/web_player-2.9.1-SNAPSHOT-2024-May-26-04-53.tgz",
- "integrity": "sha512-8pQxkF7cq3mlvR9sRrSLAADv6cwLLjVXqWP77BfdvEhnJ0I+fq7Q+IC1k36SWrD/mz3hJA/A9zrc6/hIQkbCxw==",
+ "version": "3.0.0-SNAPSHOT-2025-Jun-28-08-06",
+ "resolved": "https://registry.npmjs.org/@antmedia/web_player/-/web_player-3.0.0-SNAPSHOT-2025-Jun-28-08-06.tgz",
+ "integrity": "sha512-7hPeiKcJTPhZwNxptw1594jsPn/rqL40qaB7xvH1Ofza6DUaLM0cF8QE/Xpw5fZ0NgQgrtnpOO+X2DJHcC7jkg==",
+ "license": "ISC",
"dependencies": {
- "@antmedia/videojs-webrtc-plugin": "^1.2.1",
- "@antmedia/webrtc_adaptor": "2.9.1-SNAPSHOT-2024-May-17-12-21",
+ "@antmedia/videojs-webrtc-plugin": "^1.3.3",
+ "@antmedia/webrtc_adaptor": "^2.11.3",
+ "@rollup/plugin-json": "6.1.0",
"aframe": "1.5.0",
"dashjs": "^4.7.4",
"rimraf": "^5.0.5",
- "video.js": "^7.18.0",
- "videojs-contrib-quality-levels": "^2.2.1",
- "videojs-hls-quality-selector": "^1.1.4"
- }
- },
- "node_modules/@antmedia/web_player/node_modules/@antmedia/webrtc_adaptor": {
- "version": "2.9.1-SNAPSHOT-2024-May-17-12-21",
- "resolved": "https://registry.npmjs.org/@antmedia/webrtc_adaptor/-/webrtc_adaptor-2.9.1-SNAPSHOT-2024-May-17-12-21.tgz",
- "integrity": "sha512-fu212FJ+oWnD6qx3vDGpzjy0P2t0YMzYs25ocupGXT3JylCTJMDDJMNc2XkuW4fk2eQoTOdntw+SIDewbqgVNQ==",
- "dependencies": {
- "@mediapipe/selfie_segmentation": "^0.1.1675465747",
- "url": "^0.11.1"
+ "video.js": "^8.17.3",
+ "videojs-quality-selector-hls": "^1.1.1"
}
},
"node_modules/@antmedia/web_player/node_modules/brace-expansion": {
@@ -1111,9 +1105,10 @@
}
},
"node_modules/@antmedia/webrtc_adaptor": {
- "version": "2.8.0-SNAPSHOT",
- "resolved": "https://registry.npmjs.org/@antmedia/webrtc_adaptor/-/webrtc_adaptor-2.8.0-SNAPSHOT.tgz",
- "integrity": "sha512-w+SdgW3KZi5e+M14VyA9LQmGx62iC7j3mCa8ux5nOPEyIuTHaOQ/7tAE6TnyshBfB4ru8xzjGbyZdVivpQfBiw==",
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/@antmedia/webrtc_adaptor/-/webrtc_adaptor-2.16.2.tgz",
+ "integrity": "sha512-5BWmm/ZDSvgIm7npC/H5kLFqOKYhQYOnBfBFBUC7q7BuiVT5AXCiXxknpEE8oVuA4op5cMFUX8fDfunSa3PUgw==",
+ "license": "ISC",
"dependencies": {
"@mediapipe/selfie_segmentation": "^0.1.1675465747",
"url": "^0.11.1"
@@ -3033,6 +3028,8 @@
},
"node_modules/@mediapipe/selfie_segmentation": {
"version": "0.1.1675465747",
+ "resolved": "https://registry.npmjs.org/@mediapipe/selfie_segmentation/-/selfie_segmentation-0.1.1675465747.tgz",
+ "integrity": "sha512-IxYxNhwE5VwOm52L1yoFWYLP7q9Pd+NJjzOC5tlepfvEGaY3o9hslhUrx9BgseqdfZtKSDtd/4NfCSMjNzQalA==",
"license": "Apache-2.0"
},
"node_modules/@ngtools/webpack": {
@@ -3295,6 +3292,60 @@
"node": ">=14"
}
},
+ "node_modules/@rollup/plugin-json": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
+ "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz",
+ "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/@schematics/angular": {
"version": "10.0.5",
"dev": true,
@@ -3417,6 +3468,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
"node_modules/@types/glob": {
"version": "7.1.3",
"dev": true,
@@ -3513,47 +3570,45 @@
"integrity": "sha512-f4q/s76+8nOy+fhrNHyetuoPDR01lmlZB5czfCG+OOnBw/Wf+x48DcCDPmMQY7oL8xYFL8qfenMoiS8DUkKBUw=="
},
"node_modules/@videojs/http-streaming": {
- "version": "2.16.2",
+ "version": "3.17.4",
+ "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.17.4.tgz",
+ "integrity": "sha512-XAvdG2dolBuV2Fx8bu1kjmQ2D4TonGzZH68Pgv/O9xMSFWdZtITSMFismeQLEAtMmGwze8qNJp3RgV+jStrJqg==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.12.5",
- "@videojs/vhs-utils": "3.0.5",
- "aes-decrypter": "3.1.3",
+ "@videojs/vhs-utils": "^4.1.1",
+ "aes-decrypter": "^4.0.2",
"global": "^4.4.0",
- "m3u8-parser": "4.8.0",
- "mpd-parser": "^0.22.1",
- "mux.js": "6.0.1",
- "video.js": "^6 || ^7"
+ "m3u8-parser": "^7.2.0",
+ "mpd-parser": "^1.3.1",
+ "mux.js": "7.1.0",
+ "video.js": "^7 || ^8"
},
"engines": {
"node": ">=8",
"npm": ">=5"
},
"peerDependencies": {
- "video.js": "^6 || ^7"
+ "video.js": "^8.19.0"
}
},
"node_modules/@videojs/http-streaming/node_modules/@babel/runtime": {
- "version": "7.23.8",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@videojs/http-streaming/node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "license": "MIT"
- },
"node_modules/@videojs/vhs-utils": {
- "version": "3.0.5",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz",
+ "integrity": "sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.12.5",
- "global": "^4.4.0",
- "url-toolkit": "^2.2.1"
+ "global": "^4.4.0"
},
"engines": {
"node": ">=8",
@@ -3561,21 +3616,18 @@
}
},
"node_modules/@videojs/vhs-utils/node_modules/@babel/runtime": {
- "version": "7.23.8",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@videojs/vhs-utils/node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "license": "MIT"
- },
"node_modules/@videojs/xhr": {
- "version": "2.6.0",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.7.0.tgz",
+ "integrity": "sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.5.5",
@@ -3723,7 +3775,9 @@
}
},
"node_modules/@xmldom/xmldom": {
- "version": "0.8.10",
+ "version": "0.8.12",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz",
+ "integrity": "sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -3834,29 +3888,26 @@
}
},
"node_modules/aes-decrypter": {
- "version": "3.1.3",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.2.tgz",
+ "integrity": "sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.12.5",
- "@videojs/vhs-utils": "^3.0.5",
+ "@videojs/vhs-utils": "^4.1.1",
"global": "^4.4.0",
"pkcs7": "^1.0.4"
}
},
"node_modules/aes-decrypter/node_modules/@babel/runtime": {
- "version": "7.23.8",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/aes-decrypter/node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "license": "MIT"
- },
"node_modules/aframe": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/aframe/-/aframe-1.5.0.tgz",
@@ -4038,10 +4089,6 @@
"node": ">=4"
}
},
- "node_modules/any-promise": {
- "version": "1.3.0",
- "license": "MIT"
- },
"node_modules/anymatch": {
"version": "3.1.1",
"license": "ISC",
@@ -5142,6 +5189,15 @@
"dev": true,
"license": "Apache-2.0"
},
+ "node_modules/centra": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz",
+ "integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6"
+ }
+ },
"node_modules/chalk": {
"version": "2.4.2",
"license": "MIT",
@@ -6324,21 +6380,15 @@
"node": ">=10"
}
},
- "node_modules/datatables": {
- "version": "1.10.18",
+ "node_modules/datatables.net": {
+ "version": "1.11.4",
+ "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.11.4.tgz",
+ "integrity": "sha512-z9LG4O0VYOYzp+rnArLExvnUWV8ikyWBcHYZEKDfVuz7BKxQdEq4a/tpO0Trbm+FL1+RY7UEIh+UcYNY/hwGxA==",
"license": "MIT",
"dependencies": {
"jquery": ">=1.7"
}
},
- "node_modules/datatables.net": {
- "version": "1.13.11",
- "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.13.11.tgz",
- "integrity": "sha512-AE6RkMXziRaqzPcu/pl3SJXeRa6fmXQG/fVjuRESujvkzqDCYEeKTTpPMuVJSGYJpPi32WGSphVNNY1G4nSN/g==",
- "dependencies": {
- "jquery": "1.8 - 4"
- }
- },
"node_modules/datatables.net-bs": {
"version": "1.11.5",
"resolved": "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.11.5.tgz",
@@ -6365,6 +6415,15 @@
"jquery": ">=1.7"
}
},
+ "node_modules/datatables.net-responsive/node_modules/datatables.net": {
+ "version": "1.13.11",
+ "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.13.11.tgz",
+ "integrity": "sha512-AE6RkMXziRaqzPcu/pl3SJXeRa6fmXQG/fVjuRESujvkzqDCYEeKTTpPMuVJSGYJpPi32WGSphVNNY1G4nSN/g==",
+ "license": "MIT",
+ "dependencies": {
+ "jquery": "1.8 - 4"
+ }
+ },
"node_modules/date-format": {
"version": "4.0.3",
"dev": true,
@@ -7127,6 +7186,12 @@
"node": ">=4.0"
}
},
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
"node_modules/esutils": {
"version": "2.0.3",
"dev": true,
@@ -8034,51 +8099,6 @@
"node": ">= 8"
}
},
- "node_modules/fs-promise": {
- "version": "0.5.0",
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "fs-extra": "^0.26.5",
- "mz": "^2.3.1",
- "thenify-all": "^1.6.0"
- }
- },
- "node_modules/fs-promise/node_modules/fs-extra": {
- "version": "0.26.7",
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^2.1.0",
- "klaw": "^1.0.0",
- "path-is-absolute": "^1.0.0",
- "rimraf": "^2.2.8"
- }
- },
- "node_modules/fs-promise/node_modules/jsonfile": {
- "version": "2.4.0",
- "license": "MIT",
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/fs-promise/node_modules/klaw": {
- "version": "1.3.1",
- "license": "MIT",
- "optionalDependencies": {
- "graceful-fs": "^4.1.9"
- }
- },
- "node_modules/fs-promise/node_modules/rimraf": {
- "version": "2.7.1",
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
"node_modules/fs-write-stream-atomic": {
"version": "1.0.10",
"license": "ISC",
@@ -8976,9 +8996,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/individual": {
- "version": "2.0.0"
- },
"node_modules/infer-owner": {
"version": "1.0.4",
"license": "ISC"
@@ -10074,17 +10091,6 @@
"karma-jasmine": ">=1.1"
}
},
- "node_modules/karma-safaritechpreview-launcher": {
- "version": "0.0.6",
- "license": "MIT",
- "dependencies": {
- "fs-promise": "^0.5.0",
- "marcosc-async": "^3.0.4"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/karma-source-map-support": {
"version": "1.4.0",
"dev": true,
@@ -10372,10 +10378,6 @@
"node": ">=10"
}
},
- "node_modules/keycode": {
- "version": "2.2.1",
- "license": "MIT"
- },
"node_modules/keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
@@ -10707,28 +10709,25 @@
}
},
"node_modules/m3u8-parser": {
- "version": "4.8.0",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.2.0.tgz",
+ "integrity": "sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.12.5",
- "@videojs/vhs-utils": "^3.0.5",
+ "@videojs/vhs-utils": "^4.1.1",
"global": "^4.4.0"
}
},
"node_modules/m3u8-parser/node_modules/@babel/runtime": {
- "version": "7.23.8",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/m3u8-parser/node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "license": "MIT"
- },
"node_modules/magic-string": {
"version": "0.25.7",
"license": "MIT",
@@ -10882,11 +10881,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/marcosc-async": {
- "version": "3.0.5",
- "engines": ">=4",
- "license": "CC0-1.0"
- },
"node_modules/material-components-web": {
"version": "7.0.0",
"license": "MIT",
@@ -11389,11 +11383,13 @@
}
},
"node_modules/mpd-parser": {
- "version": "0.22.1",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.3.1.tgz",
+ "integrity": "sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.12.5",
- "@videojs/vhs-utils": "^3.0.5",
+ "@videojs/vhs-utils": "^4.0.0",
"@xmldom/xmldom": "^0.8.3",
"global": "^4.4.0"
},
@@ -11402,19 +11398,14 @@
}
},
"node_modules/mpd-parser/node_modules/@babel/runtime": {
- "version": "7.23.8",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/mpd-parser/node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "license": "MIT"
- },
"node_modules/ms": {
"version": "2.1.2",
"license": "MIT"
@@ -11442,7 +11433,9 @@
"license": "ISC"
},
"node_modules/mux.js": {
- "version": "6.0.1",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.1.0.tgz",
+ "integrity": "sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.11.2",
@@ -11457,28 +11450,14 @@
}
},
"node_modules/mux.js/node_modules/@babel/runtime": {
- "version": "7.23.8",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/mux.js/node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "license": "MIT"
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
"node_modules/nan": {
"version": "2.14.1",
"dev": true,
@@ -12734,6 +12713,8 @@
},
"node_modules/pkcs7": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz",
+ "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.5.5"
@@ -14591,7 +14572,7 @@
},
"node_modules/rollup": {
"version": "2.10.9",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"bin": {
"rollup": "dist/bin/rollup"
@@ -14622,13 +14603,6 @@
"aproba": "^1.1.1"
}
},
- "node_modules/rust-result": {
- "version": "1.0.0",
- "license": "MIT",
- "dependencies": {
- "individual": "^2.0.0"
- }
- },
"node_modules/rxjs": {
"version": "6.6.2",
"license": "Apache-2.0",
@@ -14666,12 +14640,6 @@
],
"license": "MIT"
},
- "node_modules/safe-json-parse": {
- "version": "4.0.0",
- "dependencies": {
- "rust-result": "^1.0.0"
- }
- },
"node_modules/safe-regex": {
"version": "1.1.0",
"license": "MIT",
@@ -16173,23 +16141,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/thenify": {
- "version": "3.3.1",
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "license": "MIT",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/three-bmfont-text": {
"version": "3.0.0",
"resolved": "git+ssh://git@github.com/dmarcos/three-bmfont-text.git#eed4878795be9b3e38cf6aec6b903f56acd1f695",
@@ -16741,10 +16692,6 @@
"node": ">=4"
}
},
- "node_modules/url-toolkit": {
- "version": "2.2.5",
- "license": "Apache-2.0"
- },
"node_modules/url/node_modules/punycode": {
"version": "1.4.1",
"license": "MIT"
@@ -16870,65 +16817,75 @@
}
},
"node_modules/video.js": {
- "version": "7.21.5",
+ "version": "8.23.7",
+ "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.23.7.tgz",
+ "integrity": "sha512-cG4HOygYt+Z8j6Sf5DuK6OgEOoM+g9oGP6vpqoZRaD13aHE4PMITbyjJUXZcIQbgB0wJEadBRaVm5lJIzo2jAA==",
"license": "Apache-2.0",
"dependencies": {
- "@babel/runtime": "^7.12.5",
- "@videojs/http-streaming": "2.16.2",
- "@videojs/vhs-utils": "^3.0.4",
- "@videojs/xhr": "2.6.0",
- "aes-decrypter": "3.1.3",
- "global": "^4.4.0",
- "keycode": "^2.2.0",
- "m3u8-parser": "4.8.0",
- "mpd-parser": "0.22.1",
- "mux.js": "6.0.1",
- "safe-json-parse": "4.0.0",
- "videojs-font": "3.2.0",
- "videojs-vtt.js": "^0.15.5"
+ "@babel/runtime": "^7.28.4",
+ "@videojs/http-streaming": "^3.17.3",
+ "@videojs/vhs-utils": "^4.1.1",
+ "@videojs/xhr": "2.7.0",
+ "aes-decrypter": "^4.0.2",
+ "global": "4.4.0",
+ "m3u8-parser": "^7.2.0",
+ "mpd-parser": "^1.3.1",
+ "mux.js": "^7.0.1",
+ "videojs-contrib-quality-levels": "4.1.0",
+ "videojs-font": "4.2.0",
+ "videojs-vtt.js": "0.15.5"
}
},
"node_modules/video.js/node_modules/@babel/runtime": {
- "version": "7.23.8",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/video.js/node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "license": "MIT"
- },
"node_modules/videojs-contrib-quality-levels": {
- "version": "2.2.1",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz",
+ "integrity": "sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==",
"license": "Apache-2.0",
"dependencies": {
- "global": "^4.3.2",
- "video.js": "^6 || ^7 || ^8"
+ "global": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=16",
+ "npm": ">=8"
},
"peerDependencies": {
- "video.js": "^6 || ^7 || ^8"
+ "video.js": "^8"
}
},
"node_modules/videojs-font": {
- "version": "3.2.0",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.2.0.tgz",
+ "integrity": "sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ==",
"license": "Apache-2.0"
},
- "node_modules/videojs-hls-quality-selector": {
- "version": "1.1.4",
+ "node_modules/videojs-quality-selector-hls": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/videojs-quality-selector-hls/-/videojs-quality-selector-hls-1.1.1.tgz",
+ "integrity": "sha512-GR7Bs/pL4nioq+jlSASqy4nUlnnmY7NnjXY6vBPlmBJA7OuYD80ceyejuCbNeaXX7cC11WOtKTeC8QBJcKuMtA==",
"license": "MIT",
"dependencies": {
- "global": "^4.3.2",
- "karma-safaritechpreview-launcher": "0.0.6",
- "video.js": "^7.5.5",
- "videojs-contrib-quality-levels": "^2.0.9"
+ "global": "^4.4.0",
+ "video.js": "^8.3.0",
+ "videojs-contrib-quality-levels": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18",
+ "npm": ">=9"
}
},
"node_modules/videojs-vtt.js": {
"version": "0.15.5",
+ "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz",
+ "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==",
"license": "Apache-2.0",
"dependencies": {
"global": "^4.3.1"
@@ -18786,37 +18743,30 @@
}
},
"@antmedia/videojs-webrtc-plugin": {
- "version": "1.2.1",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@antmedia/videojs-webrtc-plugin/-/videojs-webrtc-plugin-1.3.3.tgz",
+ "integrity": "sha512-+/4cDpmSTkkybmxoKcFjpM6Z9criQNVuLE++v3yKwpOtgFZqIwuA7cIWn/ZZ4p1cLuPSq6vH/yIsWstQaf1uVg==",
"requires": {
- "@antmedia/webrtc_adaptor": "^2.8.0-SNAPSHOT",
+ "@antmedia/webrtc_adaptor": "^2.11.3",
"global": "^4.4.0",
- "video.js": "^6 || ^7"
+ "video.js": "^8"
}
},
"@antmedia/web_player": {
- "version": "2.9.1-SNAPSHOT-2024-May-26-04-53",
- "resolved": "https://registry.npmjs.org/@antmedia/web_player/-/web_player-2.9.1-SNAPSHOT-2024-May-26-04-53.tgz",
- "integrity": "sha512-8pQxkF7cq3mlvR9sRrSLAADv6cwLLjVXqWP77BfdvEhnJ0I+fq7Q+IC1k36SWrD/mz3hJA/A9zrc6/hIQkbCxw==",
+ "version": "3.0.0-SNAPSHOT-2025-Jun-28-08-06",
+ "resolved": "https://registry.npmjs.org/@antmedia/web_player/-/web_player-3.0.0-SNAPSHOT-2025-Jun-28-08-06.tgz",
+ "integrity": "sha512-7hPeiKcJTPhZwNxptw1594jsPn/rqL40qaB7xvH1Ofza6DUaLM0cF8QE/Xpw5fZ0NgQgrtnpOO+X2DJHcC7jkg==",
"requires": {
- "@antmedia/videojs-webrtc-plugin": "^1.2.1",
- "@antmedia/webrtc_adaptor": "2.9.1-SNAPSHOT-2024-May-17-12-21",
+ "@antmedia/videojs-webrtc-plugin": "^1.3.3",
+ "@antmedia/webrtc_adaptor": "^2.11.3",
+ "@rollup/plugin-json": "6.1.0",
"aframe": "1.5.0",
"dashjs": "^4.7.4",
"rimraf": "^5.0.5",
- "video.js": "^7.18.0",
- "videojs-contrib-quality-levels": "^2.2.1",
- "videojs-hls-quality-selector": "^1.1.4"
+ "video.js": "^8.17.3",
+ "videojs-quality-selector-hls": "^1.1.1"
},
"dependencies": {
- "@antmedia/webrtc_adaptor": {
- "version": "2.9.1-SNAPSHOT-2024-May-17-12-21",
- "resolved": "https://registry.npmjs.org/@antmedia/webrtc_adaptor/-/webrtc_adaptor-2.9.1-SNAPSHOT-2024-May-17-12-21.tgz",
- "integrity": "sha512-fu212FJ+oWnD6qx3vDGpzjy0P2t0YMzYs25ocupGXT3JylCTJMDDJMNc2XkuW4fk2eQoTOdntw+SIDewbqgVNQ==",
- "requires": {
- "@mediapipe/selfie_segmentation": "^0.1.1675465747",
- "url": "^0.11.1"
- }
- },
"brace-expansion": {
"version": "2.0.1",
"requires": {
@@ -18851,9 +18801,9 @@
}
},
"@antmedia/webrtc_adaptor": {
- "version": "2.8.0-SNAPSHOT",
- "resolved": "https://registry.npmjs.org/@antmedia/webrtc_adaptor/-/webrtc_adaptor-2.8.0-SNAPSHOT.tgz",
- "integrity": "sha512-w+SdgW3KZi5e+M14VyA9LQmGx62iC7j3mCa8ux5nOPEyIuTHaOQ/7tAE6TnyshBfB4ru8xzjGbyZdVivpQfBiw==",
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/@antmedia/webrtc_adaptor/-/webrtc_adaptor-2.16.2.tgz",
+ "integrity": "sha512-5BWmm/ZDSvgIm7npC/H5kLFqOKYhQYOnBfBFBUC7q7BuiVT5AXCiXxknpEE8oVuA4op5cMFUX8fDfunSa3PUgw==",
"requires": {
"@mediapipe/selfie_segmentation": "^0.1.1675465747",
"url": "^0.11.1"
@@ -20446,7 +20396,9 @@
}
},
"@mediapipe/selfie_segmentation": {
- "version": "0.1.1675465747"
+ "version": "0.1.1675465747",
+ "resolved": "https://registry.npmjs.org/@mediapipe/selfie_segmentation/-/selfie_segmentation-0.1.1675465747.tgz",
+ "integrity": "sha512-IxYxNhwE5VwOm52L1yoFWYLP7q9Pd+NJjzOC5tlepfvEGaY3o9hslhUrx9BgseqdfZtKSDtd/4NfCSMjNzQalA=="
},
"@ngtools/webpack": {
"version": "10.0.5",
@@ -20659,6 +20611,31 @@
"version": "0.11.0",
"optional": true
},
+ "@rollup/plugin-json": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
+ "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==",
+ "requires": {
+ "@rollup/pluginutils": "^5.1.0"
+ }
+ },
+ "@rollup/pluginutils": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz",
+ "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==",
+ "requires": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "dependencies": {
+ "picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="
+ }
+ }
+ },
"@schematics/angular": {
"version": "10.0.5",
"dev": true,
@@ -20743,6 +20720,11 @@
"version": "2.8.12",
"dev": true
},
+ "@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="
+ },
"@types/glob": {
"version": "7.1.3",
"dev": true,
@@ -20822,50 +20804,47 @@
"integrity": "sha512-f4q/s76+8nOy+fhrNHyetuoPDR01lmlZB5czfCG+OOnBw/Wf+x48DcCDPmMQY7oL8xYFL8qfenMoiS8DUkKBUw=="
},
"@videojs/http-streaming": {
- "version": "2.16.2",
+ "version": "3.17.4",
+ "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.17.4.tgz",
+ "integrity": "sha512-XAvdG2dolBuV2Fx8bu1kjmQ2D4TonGzZH68Pgv/O9xMSFWdZtITSMFismeQLEAtMmGwze8qNJp3RgV+jStrJqg==",
"requires": {
"@babel/runtime": "^7.12.5",
- "@videojs/vhs-utils": "3.0.5",
- "aes-decrypter": "3.1.3",
+ "@videojs/vhs-utils": "^4.1.1",
+ "aes-decrypter": "^4.0.2",
"global": "^4.4.0",
- "m3u8-parser": "4.8.0",
- "mpd-parser": "^0.22.1",
- "mux.js": "6.0.1",
- "video.js": "^6 || ^7"
+ "m3u8-parser": "^7.2.0",
+ "mpd-parser": "^1.3.1",
+ "mux.js": "7.1.0",
+ "video.js": "^7 || ^8"
},
"dependencies": {
"@babel/runtime": {
- "version": "7.23.8",
- "requires": {
- "regenerator-runtime": "^0.14.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.14.1"
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="
}
}
},
"@videojs/vhs-utils": {
- "version": "3.0.5",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz",
+ "integrity": "sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==",
"requires": {
"@babel/runtime": "^7.12.5",
- "global": "^4.4.0",
- "url-toolkit": "^2.2.1"
+ "global": "^4.4.0"
},
"dependencies": {
"@babel/runtime": {
- "version": "7.23.8",
- "requires": {
- "regenerator-runtime": "^0.14.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.14.1"
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="
}
}
},
"@videojs/xhr": {
- "version": "2.6.0",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.7.0.tgz",
+ "integrity": "sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==",
"requires": {
"@babel/runtime": "^7.5.5",
"global": "~4.4.0",
@@ -20994,7 +20973,9 @@
}
},
"@xmldom/xmldom": {
- "version": "0.8.10"
+ "version": "0.8.12",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz",
+ "integrity": "sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg=="
},
"@xtuc/ieee754": {
"version": "1.2.0"
@@ -21066,22 +21047,20 @@
"dev": true
},
"aes-decrypter": {
- "version": "3.1.3",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.2.tgz",
+ "integrity": "sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==",
"requires": {
"@babel/runtime": "^7.12.5",
- "@videojs/vhs-utils": "^3.0.5",
+ "@videojs/vhs-utils": "^4.1.1",
"global": "^4.4.0",
"pkcs7": "^1.0.4"
},
"dependencies": {
"@babel/runtime": {
- "version": "7.23.8",
- "requires": {
- "regenerator-runtime": "^0.14.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.14.1"
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="
}
}
},
@@ -21197,9 +21176,6 @@
"color-convert": "^1.9.0"
}
},
- "any-promise": {
- "version": "1.3.0"
- },
"anymatch": {
"version": "3.1.1",
"requires": {
@@ -22821,18 +22797,12 @@
"whatwg-url": "^8.0.0"
}
},
- "datatables": {
- "version": "1.10.18",
- "requires": {
- "jquery": ">=1.7"
- }
- },
"datatables.net": {
- "version": "1.13.11",
- "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.13.11.tgz",
- "integrity": "sha512-AE6RkMXziRaqzPcu/pl3SJXeRa6fmXQG/fVjuRESujvkzqDCYEeKTTpPMuVJSGYJpPi32WGSphVNNY1G4nSN/g==",
+ "version": "1.11.4",
+ "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.11.4.tgz",
+ "integrity": "sha512-z9LG4O0VYOYzp+rnArLExvnUWV8ikyWBcHYZEKDfVuz7BKxQdEq4a/tpO0Trbm+FL1+RY7UEIh+UcYNY/hwGxA==",
"requires": {
- "jquery": "1.8 - 4"
+ "jquery": ">=1.7"
}
},
"datatables.net-bs": {
@@ -22861,6 +22831,16 @@
"requires": {
"datatables.net": "^1.13.0",
"jquery": ">=1.7"
+ },
+ "dependencies": {
+ "datatables.net": {
+ "version": "1.13.11",
+ "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.13.11.tgz",
+ "integrity": "sha512-AE6RkMXziRaqzPcu/pl3SJXeRa6fmXQG/fVjuRESujvkzqDCYEeKTTpPMuVJSGYJpPi32WGSphVNNY1G4nSN/g==",
+ "requires": {
+ "jquery": "1.8 - 4"
+ }
+ }
}
},
"date-format": {
@@ -23411,6 +23391,11 @@
"estraverse": {
"version": "4.3.0"
},
+ "estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
"esutils": {
"version": "2.0.3",
"dev": true
@@ -24023,45 +24008,6 @@
"minipass": "^3.0.0"
}
},
- "fs-promise": {
- "version": "0.5.0",
- "requires": {
- "any-promise": "^1.0.0",
- "fs-extra": "^0.26.5",
- "mz": "^2.3.1",
- "thenify-all": "^1.6.0"
- },
- "dependencies": {
- "fs-extra": {
- "version": "0.26.7",
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^2.1.0",
- "klaw": "^1.0.0",
- "path-is-absolute": "^1.0.0",
- "rimraf": "^2.2.8"
- }
- },
- "jsonfile": {
- "version": "2.4.0",
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "klaw": {
- "version": "1.3.1",
- "requires": {
- "graceful-fs": "^4.1.9"
- }
- },
- "rimraf": {
- "version": "2.7.1",
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
"fs-write-stream-atomic": {
"version": "1.0.10",
"requires": {
@@ -24683,9 +24629,6 @@
"version": "1.0.1",
"dev": true
},
- "individual": {
- "version": "2.0.0"
- },
"infer-owner": {
"version": "1.0.4"
},
@@ -25558,13 +25501,6 @@
"dev": true,
"requires": {}
},
- "karma-safaritechpreview-launcher": {
- "version": "0.0.6",
- "requires": {
- "fs-promise": "^0.5.0",
- "marcosc-async": "^3.0.4"
- }
- },
"karma-source-map-support": {
"version": "1.4.0",
"dev": true,
@@ -25572,9 +25508,6 @@
"source-map-support": "^0.5.5"
}
},
- "keycode": {
- "version": "2.2.1"
- },
"keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
@@ -25811,21 +25744,19 @@
}
},
"m3u8-parser": {
- "version": "4.8.0",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.2.0.tgz",
+ "integrity": "sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==",
"requires": {
"@babel/runtime": "^7.12.5",
- "@videojs/vhs-utils": "^3.0.5",
+ "@videojs/vhs-utils": "^4.1.1",
"global": "^4.4.0"
},
"dependencies": {
"@babel/runtime": {
- "version": "7.23.8",
- "requires": {
- "regenerator-runtime": "^0.14.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.14.1"
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="
}
}
},
@@ -25953,9 +25884,6 @@
"object-visit": "^1.0.0"
}
},
- "marcosc-async": {
- "version": "3.0.5"
- },
"material-components-web": {
"version": "7.0.0",
"requires": {
@@ -26309,22 +26237,20 @@
}
},
"mpd-parser": {
- "version": "0.22.1",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.3.1.tgz",
+ "integrity": "sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==",
"requires": {
"@babel/runtime": "^7.12.5",
- "@videojs/vhs-utils": "^3.0.5",
+ "@videojs/vhs-utils": "^4.0.0",
"@xmldom/xmldom": "^0.8.3",
"global": "^4.4.0"
},
"dependencies": {
"@babel/runtime": {
- "version": "7.23.8",
- "requires": {
- "regenerator-runtime": "^0.14.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.14.1"
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="
}
}
},
@@ -26348,31 +26274,21 @@
"dev": true
},
"mux.js": {
- "version": "6.0.1",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.1.0.tgz",
+ "integrity": "sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==",
"requires": {
"@babel/runtime": "^7.11.2",
"global": "^4.4.0"
},
"dependencies": {
"@babel/runtime": {
- "version": "7.23.8",
- "requires": {
- "regenerator-runtime": "^0.14.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.14.1"
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="
}
}
},
- "mz": {
- "version": "2.7.0",
- "requires": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
"nan": {
"version": "2.14.1",
"dev": true,
@@ -27255,6 +27171,8 @@
},
"pkcs7": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz",
+ "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==",
"requires": {
"@babel/runtime": "^7.5.5"
}
@@ -28603,7 +28521,7 @@
},
"rollup": {
"version": "2.10.9",
- "dev": true,
+ "devOptional": true,
"requires": {
"fsevents": "~2.1.2"
}
@@ -28621,12 +28539,6 @@
"aproba": "^1.1.1"
}
},
- "rust-result": {
- "version": "1.0.0",
- "requires": {
- "individual": "^2.0.0"
- }
- },
"rxjs": {
"version": "6.6.2",
"requires": {
@@ -28645,12 +28557,6 @@
"safe-buffer": {
"version": "5.2.1"
},
- "safe-json-parse": {
- "version": "4.0.0",
- "requires": {
- "rust-result": "^1.0.0"
- }
- },
"safe-regex": {
"version": "1.1.0",
"requires": {
@@ -29678,18 +29584,6 @@
}
}
},
- "thenify": {
- "version": "3.3.1",
- "requires": {
- "any-promise": "^1.0.0"
- }
- },
- "thenify-all": {
- "version": "1.6.0",
- "requires": {
- "thenify": ">= 3.1.0 < 4"
- }
- },
"three-bmfont-text": {
"version": "git+ssh://git@github.com/dmarcos/three-bmfont-text.git#eed4878795be9b3e38cf6aec6b903f56acd1f695",
"integrity": "sha512-FDlyR8SyHQ0Ek38qBx5Hg/AwPuBI/1w/QWpMgzw19Vn81xsDNFTOXJpU0HcvI78C72wwXjJ3T7+EX7k2geDV4Q==",
@@ -30062,9 +29956,6 @@
}
}
},
- "url-toolkit": {
- "version": "2.2.5"
- },
"use": {
"version": "3.1.1"
},
@@ -30140,55 +30031,58 @@
}
},
"video.js": {
- "version": "7.21.5",
- "requires": {
- "@babel/runtime": "^7.12.5",
- "@videojs/http-streaming": "2.16.2",
- "@videojs/vhs-utils": "^3.0.4",
- "@videojs/xhr": "2.6.0",
- "aes-decrypter": "3.1.3",
- "global": "^4.4.0",
- "keycode": "^2.2.0",
- "m3u8-parser": "4.8.0",
- "mpd-parser": "0.22.1",
- "mux.js": "6.0.1",
- "safe-json-parse": "4.0.0",
- "videojs-font": "3.2.0",
- "videojs-vtt.js": "^0.15.5"
+ "version": "8.23.7",
+ "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.23.7.tgz",
+ "integrity": "sha512-cG4HOygYt+Z8j6Sf5DuK6OgEOoM+g9oGP6vpqoZRaD13aHE4PMITbyjJUXZcIQbgB0wJEadBRaVm5lJIzo2jAA==",
+ "requires": {
+ "@babel/runtime": "^7.28.4",
+ "@videojs/http-streaming": "^3.17.3",
+ "@videojs/vhs-utils": "^4.1.1",
+ "@videojs/xhr": "2.7.0",
+ "aes-decrypter": "^4.0.2",
+ "global": "4.4.0",
+ "m3u8-parser": "^7.2.0",
+ "mpd-parser": "^1.3.1",
+ "mux.js": "^7.0.1",
+ "videojs-contrib-quality-levels": "4.1.0",
+ "videojs-font": "4.2.0",
+ "videojs-vtt.js": "0.15.5"
},
"dependencies": {
"@babel/runtime": {
- "version": "7.23.8",
- "requires": {
- "regenerator-runtime": "^0.14.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.14.1"
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="
}
}
},
"videojs-contrib-quality-levels": {
- "version": "2.2.1",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz",
+ "integrity": "sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==",
"requires": {
- "global": "^4.3.2",
- "video.js": "^6 || ^7 || ^8"
+ "global": "^4.4.0"
}
},
"videojs-font": {
- "version": "3.2.0"
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.2.0.tgz",
+ "integrity": "sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ=="
},
- "videojs-hls-quality-selector": {
- "version": "1.1.4",
+ "videojs-quality-selector-hls": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/videojs-quality-selector-hls/-/videojs-quality-selector-hls-1.1.1.tgz",
+ "integrity": "sha512-GR7Bs/pL4nioq+jlSASqy4nUlnnmY7NnjXY6vBPlmBJA7OuYD80ceyejuCbNeaXX7cC11WOtKTeC8QBJcKuMtA==",
"requires": {
- "global": "^4.3.2",
- "karma-safaritechpreview-launcher": "0.0.6",
- "video.js": "^7.5.5",
- "videojs-contrib-quality-levels": "^2.0.9"
+ "global": "^4.4.0",
+ "video.js": "^8.3.0",
+ "videojs-contrib-quality-levels": "^4.0.0"
}
},
"videojs-vtt.js": {
"version": "0.15.5",
+ "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz",
+ "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==",
"requires": {
"global": "^4.3.1"
}
diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts
index 7ed7d51..49ff6b7 100644
--- a/src/app/app.routing.ts
+++ b/src/app/app.routing.ts
@@ -33,6 +33,10 @@ export const AppRoutes: Routes = [{
path: 'cluster',
loadChildren: './cluster/cluster.module#ClusterModule',
canActivate: [AuthService]
+ },{
+ path: 'plugins',
+ loadChildren: './plugins/plugins.module#PluginsModule',
+ canActivate: [AuthService]
},{
path: 'support',
loadChildren: './support/support.module#SupportModule',
diff --git a/src/app/plugins/plugins.component.css b/src/app/plugins/plugins.component.css
new file mode 100644
index 0000000..5be3cea
--- /dev/null
+++ b/src/app/plugins/plugins.component.css
@@ -0,0 +1,287 @@
+.plugin-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
+ gap: 24px;
+}
+
+.plugin-grid-item {
+ display: flex;
+}
+
+.plugin-card {
+ border: 1px solid #eee;
+ border-radius: 12px;
+ transition: box-shadow 0.2s, transform 0.2s;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+}
+
+.plugin-card .card-body {
+ flex: 1 1 auto;
+ display: flex;
+ flex-direction: column;
+}
+
+.plugin-card .card-footer {
+ flex: 0 0 auto;
+}
+
+.plugin-card:hover {
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
+ transform: translateY(-2px);
+}
+
+.plugin-header {
+ display: flex;
+ align-items: center;
+ margin-bottom: 16px;
+}
+
+.plugin-icon {
+ width: 52px;
+ height: 52px;
+ border-radius: 12px;
+ margin-right: 14px;
+ object-fit: cover;
+ border: 1px solid #f0f0f0;
+}
+
+.plugin-icon-placeholder {
+ width: 52px;
+ height: 52px;
+ border-radius: 12px;
+ margin-right: 14px;
+ background: linear-gradient(135deg, #fce4e8 0%, #f9f0f1 100%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 22px;
+ color: #DD0330;
+}
+
+.plugin-info {
+ flex: 1;
+ min-width: 0;
+}
+
+.plugin-name {
+ margin: 0 0 2px 0;
+ font-size: 15px;
+ font-weight: 600;
+ color: #333;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.plugin-meta {
+ font-size: 12px;
+ color: #999;
+}
+
+.plugin-description {
+ font-size: 13px;
+ color: #666;
+ line-height: 1.5;
+ margin-bottom: 16px;
+ min-height: 40px;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+}
+
+.plugin-details-link {
+ display: inline-block;
+ margin: -8px 0 12px;
+ font-size: 0.85em;
+ color: #DD0330;
+ text-decoration: none;
+}
+
+.plugin-details-link:hover {
+ text-decoration: underline;
+}
+
+.plugin-details-link i {
+ font-size: 0.8em;
+ margin-left: 2px;
+}
+
+.plugin-badges {
+ display: flex;
+ gap: 8px;
+ flex-wrap: wrap;
+ margin-bottom: 4px;
+}
+
+.plugin-badges .badge {
+ font-size: 11px;
+ font-weight: 500;
+ padding: 4px 10px;
+ border-radius: 12px;
+ letter-spacing: 0.3px;
+}
+
+.badge-category {
+ background-color: #f0f0f0;
+ color: #555;
+}
+
+.badge-restart {
+ background-color: #fff3cd;
+ color: #856404;
+ border: 1px solid #ffc107;
+}
+
+.status-active {
+ background-color: #d4edda;
+ color: #155724;
+ border: 1px solid #28a745;
+}
+
+.status-pending {
+ background-color: #fff3cd;
+ color: #856404;
+ border: 1px solid #ffc107;
+}
+
+.status-installing {
+ background-color: #d1ecf1;
+ color: #0c5460;
+ border: 1px solid #17a2b8;
+}
+
+.status-failed {
+ background-color: #f8d7da;
+ color: #721c24;
+ border: 1px solid #dc3545;
+}
+
+.card-footer {
+ background: #fafafa;
+ border-top: 1px solid #f0f0f0;
+ padding: 12px 20px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.card-body {
+ padding: 20px;
+}
+
+.btn-install {
+ background-color: #DD0330;
+ border-color: #DD0330;
+ color: #fff;
+ border-radius: 20px;
+ padding: 6px 20px;
+ font-size: 13px;
+ font-weight: 500;
+ transition: all 0.2s;
+}
+
+.btn-install:hover {
+ background-color: #b8022a;
+ border-color: #b8022a;
+ color: #fff;
+}
+
+.btn-install:disabled {
+ opacity: 0.6;
+}
+
+.btn-uninstall {
+ border: 1px solid #DD0330;
+ color: #DD0330;
+ background: transparent;
+ border-radius: 20px;
+ padding: 6px 20px;
+ font-size: 13px;
+ font-weight: 500;
+ transition: all 0.2s;
+}
+
+.btn-uninstall:hover {
+ background-color: #DD0330;
+ color: #fff;
+}
+
+.btn-uninstall:disabled {
+ opacity: 0.6;
+}
+
+.section-title {
+ font-size: 14px;
+ font-weight: 600;
+ color: #999;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ margin-bottom: 16px;
+ margin-top: 8px;
+}
+
+.error-alert {
+ background: #fff5f5;
+ border: 1px solid #fed7d7;
+ border-radius: 8px;
+ padding: 8px 12px;
+ margin-top: 12px;
+ font-size: 12px;
+ color: #c53030;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ word-break: break-word;
+}
+
+.empty-state {
+ padding: 60px 20px;
+ text-align: center;
+}
+
+.empty-state i {
+ font-size: 56px;
+ color: #ddd;
+ margin-bottom: 16px;
+ display: block;
+}
+
+.empty-state p {
+ color: #999;
+ font-size: 14px;
+}
+
+.loading-state {
+ padding: 60px 20px;
+ text-align: center;
+}
+
+.loading-state i {
+ color: #DD0330;
+}
+
+.loading-state p {
+ color: #999;
+ margin-top: 12px;
+}
+
+.page-header {
+ margin-bottom: 24px;
+}
+
+.page-header h4 {
+ font-weight: 600;
+ color: #333;
+ margin-bottom: 4px;
+}
+
+.page-header p {
+ color: #999;
+ font-size: 14px;
+ margin: 0;
+}
diff --git a/src/app/plugins/plugins.component.html b/src/app/plugins/plugins.component.html
new file mode 100644
index 0000000..c3358fd
--- /dev/null
+++ b/src/app/plugins/plugins.component.html
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
No plugins available. Check the plugin registry URL in server settings.
+
+
+
0">
+
+
+
+
+
+
{{ plugin.description }}
+
+
+ Learn more
+
+
+
+
+ {{ plugin.category }}
+
+
+ Requires Restart
+
+
+ {{ getStatusLabel(plugin) }}
+
+
+
+
+ {{ plugin.installedRecord.lastError }}
+
+
+
+
+
+
+
+
+
0" style="margin-top: 16px;">
+
Custom Plugins
+
+
+
+
+
+
+
+
+ {{ plugin.description }}
+
+
+
+
+ {{ getCustomStatusLabel(plugin) }}
+
+
+
+
+ {{ plugin.lastError }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/plugins/plugins.component.ts b/src/app/plugins/plugins.component.ts
new file mode 100644
index 0000000..fc0a0e9
--- /dev/null
+++ b/src/app/plugins/plugins.component.ts
@@ -0,0 +1,251 @@
+import { Component, OnInit } from '@angular/core';
+import { RestService } from '../rest/rest.service';
+
+declare var swal: any;
+
+@Component({
+ moduleId: module.id,
+ selector: 'plugins-cmp',
+ templateUrl: 'plugins.component.html',
+ styleUrls: ['plugins.component.css']
+})
+export class PluginsComponent implements OnInit {
+
+ catalogPlugins: any[] = [];
+ installedPlugins: any[] = [];
+ mergedPlugins: any[] = [];
+ customPlugins: any[] = [];
+ loading = true;
+ installing: { [key: string]: boolean } = {};
+ uninstalling: { [key: string]: boolean } = {};
+
+ constructor(private restService: RestService) {}
+
+ ngOnInit() {
+ this.loadPlugins();
+ }
+
+ loadPlugins() {
+ this.loading = true;
+
+ this.restService.getServerSettings().subscribe((settings: any) => {
+ let registryUrl = settings.pluginRegistryUrl || 'https://antmedia-plugins.s3.eu-west-2.amazonaws.com/catalog.json';
+
+ // Use native fetch for the catalog — Angular's HttpClient adds withCredentials
+ // via the AuthInterceptor, which breaks CORS for external URLs.
+ fetch(registryUrl)
+ .then(res => res.json())
+ .then((catalog: any) => {
+ this.catalogPlugins = catalog.plugins || [];
+ this.fetchInstalledAndMerge();
+ })
+ .catch((error) => {
+ console.warn('Could not fetch plugin catalog:', error);
+ this.catalogPlugins = [];
+ this.fetchInstalledAndMerge();
+ });
+ });
+ }
+
+ fetchInstalledAndMerge() {
+ this.restService.getInstalledPlugins().subscribe(
+ (installed: any) => {
+ this.installedPlugins = installed || [];
+ this.mergePluginLists();
+ this.loading = false;
+ },
+ (error) => {
+ console.warn('Could not fetch installed plugins:', error);
+ this.installedPlugins = [];
+ this.mergePluginLists();
+ this.loading = false;
+ }
+ );
+ }
+
+ mergePluginLists() {
+ console.log('Catalog plugins:', JSON.stringify(this.catalogPlugins));
+ console.log('Installed plugins:', JSON.stringify(this.installedPlugins));
+
+ let installedMap = new Map();
+ for (let p of this.installedPlugins) {
+ let key = p.pluginId || p.name || '';
+ installedMap.set(key, p);
+ }
+
+ // Merge catalog plugins with install status
+ this.mergedPlugins = this.catalogPlugins.map(entry => {
+ // Try to find a matching installed plugin by id or by name
+ let installed = installedMap.get(entry.id) || null;
+
+ // Also try matching by plugin name if id didn't match
+ if (!installed) {
+ for (let [, val] of installedMap) {
+ if (val.name === entry.name) {
+ installed = val;
+ break;
+ }
+ }
+ }
+
+ // Remove from map so we can find custom plugins later
+ if (installed) {
+ installedMap.delete(installed.pluginId || installed.name);
+ }
+
+ return {
+ ...entry,
+ installed: !!installed,
+ installedRecord: installed,
+ state: installed ? installed.state : null
+ };
+ });
+
+ // Remaining installed plugins not in catalog = custom plugins
+ this.customPlugins = [];
+ installedMap.forEach((val) => {
+ this.customPlugins.push(val);
+ });
+ }
+
+ getStatusLabel(plugin: any): string {
+ if (!plugin.installed) return '';
+ switch (plugin.state) {
+ case 'ACTIVE': return 'Active';
+ case 'INSTALLED_PENDING_RESTART': return 'Restart Required';
+ case 'INSTALLING': return 'Installing...';
+ case 'FAILED': return 'Failed';
+ default: return plugin.state || 'Unknown';
+ }
+ }
+
+ getStatusClass(plugin: any): string {
+ if (!plugin.installed) return '';
+ switch (plugin.state) {
+ case 'ACTIVE': return 'status-active';
+ case 'INSTALLED_PENDING_RESTART': return 'status-pending';
+ case 'INSTALLING': return 'status-installing';
+ case 'FAILED': return 'status-failed';
+ default: return '';
+ }
+ }
+
+ getCustomStatusLabel(plugin: any): string {
+ return this.getStatusLabel({ installed: true, state: plugin.state });
+ }
+
+ getCustomStatusClass(plugin: any): string {
+ return this.getStatusClass({ installed: true, state: plugin.state });
+ }
+
+ installPlugin(plugin: any) {
+ let restartNote = plugin.requiresRestart
+ ? '
⚠️ This plugin requires a server restart after installation.'
+ : '';
+
+ swal({
+ title: 'Install Plugin',
+ html: ''
+ + '
' + plugin.name + '
'
+ + '
v' + plugin.pluginVersion + ' by ' + plugin.author + '
'
+ + '
' + (plugin.description || '') + '
'
+ + restartNote
+ + '
',
+ showCancelButton: true,
+ confirmButtonColor: '#DD0330',
+ confirmButtonText: ' Install',
+ cancelButtonText: 'Cancel',
+ confirmButtonClass: 'btn btn-sm',
+ cancelButtonClass: 'btn btn-sm btn-default',
+ buttonsStyling: true
+ }).then(() => {
+ this.installing[plugin.id] = true;
+ this.restService.installPluginFromUrl(plugin.id, plugin.downloadUrl).subscribe(
+ (result: any) => {
+ this.installing[plugin.id] = false;
+ if (result.success) {
+ swal({
+ title: 'Installed',
+ text: result.message || 'Plugin installed successfully',
+ type: 'success',
+ confirmButtonColor: '#DD0330'
+ });
+ } else {
+ swal({
+ title: 'Installation Failed',
+ text: result.message || 'Something went wrong',
+ type: 'error',
+ confirmButtonColor: '#DD0330'
+ });
+ }
+ this.loadPlugins();
+ },
+ (error) => {
+ this.installing[plugin.id] = false;
+ swal({
+ title: 'Installation Failed',
+ text: error.message || 'Could not connect to server',
+ type: 'error',
+ confirmButtonColor: '#DD0330'
+ });
+ }
+ );
+ });
+ }
+
+ uninstallPlugin(plugin: any) {
+ let name = plugin.name || plugin.pluginId || plugin.id;
+ let installedRecord = plugin.installedRecord || plugin;
+ let pluginId = installedRecord.pluginId || plugin.id;
+
+ swal({
+ title: 'Uninstall Plugin',
+ html: ''
+ + '
Are you sure you want to uninstall ' + name + '?
'
+ + '
The plugin files will be removed. A server restart may be needed to fully clean up.
'
+ + '
',
+ showCancelButton: true,
+ confirmButtonColor: '#DD0330',
+ confirmButtonText: ' Uninstall',
+ cancelButtonText: 'Cancel',
+ buttonsStyling: true
+ }).then(() => {
+ this.uninstalling[pluginId] = true;
+ this.restService.uninstallPlugin(pluginId).subscribe(
+ (result: any) => {
+ this.uninstalling[pluginId] = false;
+ if (result.success) {
+ swal({
+ title: 'Uninstalled',
+ text: result.message || 'Plugin removed',
+ type: 'success',
+ confirmButtonColor: '#DD0330'
+ });
+ } else {
+ swal({
+ title: 'Uninstall Failed',
+ text: result.message || 'Something went wrong',
+ type: 'error',
+ confirmButtonColor: '#DD0330'
+ });
+ }
+ this.loadPlugins();
+ },
+ (error) => {
+ this.uninstalling[pluginId] = false;
+ swal({
+ title: 'Uninstall Failed',
+ text: error.message || 'Could not connect to server',
+ type: 'error',
+ confirmButtonColor: '#DD0330'
+ });
+ }
+ );
+ });
+ }
+
+ uninstallCustomPlugin(plugin: any) {
+ this.uninstallPlugin(plugin);
+ }
+
+}
diff --git a/src/app/plugins/plugins.module.ts b/src/app/plugins/plugins.module.ts
new file mode 100644
index 0000000..c97dc63
--- /dev/null
+++ b/src/app/plugins/plugins.module.ts
@@ -0,0 +1,18 @@
+import {NgModule} from '@angular/core';
+import {RouterModule} from '@angular/router';
+import {CommonModule} from '@angular/common';
+import {FormsModule} from '@angular/forms';
+
+import {PluginsComponent} from './plugins.component';
+import {PluginsRoutes} from './plugins.routing';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ RouterModule.forChild(PluginsRoutes),
+ FormsModule
+ ],
+ declarations: [PluginsComponent]
+})
+
+export class PluginsModule {}
diff --git a/src/app/plugins/plugins.routing.ts b/src/app/plugins/plugins.routing.ts
new file mode 100644
index 0000000..07420b9
--- /dev/null
+++ b/src/app/plugins/plugins.routing.ts
@@ -0,0 +1,10 @@
+import {Routes} from '@angular/router';
+import {PluginsComponent} from './plugins.component';
+
+export const PluginsRoutes: Routes = [{
+ path: '',
+ children: [{
+ path: '',
+ component: PluginsComponent
+ }]
+}];
diff --git a/src/app/rest/rest.service.ts b/src/app/rest/rest.service.ts
index 7ec9741..adcdb40 100644
--- a/src/app/rest/rest.service.ts
+++ b/src/app/rest/rest.service.ts
@@ -461,6 +461,20 @@ export class RestService {
public getServerSettings(): Observable