diff --git a/README.md b/README.md index d73aa147..15dd6ecd 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,12 @@ ffplayout-frontend This web GUI is for managing [ffplayout-engine](https://github.com/ffplayout/ffplayout-engine) and it depend on [ffplayout-api](https://github.com/ffplayout/ffplayout-api). +**The Interface is mostly made for 24/7 streaming.** Other scenarios like streaming in folder mode or playlists with no starting time will work, but is not shown correctly. + For a better understanding about the functionality, take a look to the screenshots below. -The Interface is mostly made for 24/7 streaming. Other scenarios like streaming in folder mode or playlists with no starting time will work, but is not shown correctly. -You can install it on a fresh Debian/CentOS minimal like system with running `./install.sh` as root. - -**Recommend system is a current Debian version.** - -Updating is also possible with: `./install.sh update` +You can install it on a fresh Debian like system with the [standalone installer](https://github.com/ffplayout/ffplayout-installer). Or read the instruction [install.md](docs/install.md) for manual installation. After installations you have to setup ssl for your **https** connections. diff --git a/assets/scss/globals.scss b/assets/scss/globals.scss index 5863dca0..8357de86 100644 --- a/assets/scss/globals.scss +++ b/assets/scss/globals.scss @@ -1,5 +1,6 @@ #__nuxt, #__layout, #__layout > div, #__layout > div > div { - height: 100% + height: 100%; + width: 100%; } @font-face{ diff --git a/install.sh b/install.sh deleted file mode 100755 index d1379958..00000000 --- a/install.sh +++ /dev/null @@ -1,687 +0,0 @@ -#!/usr/bin/env bash - -if [[ $(whoami) != 'root' ]]; then - echo "This script must run under root!" - exit 1 -fi - -if [[ "$(grep -Ei 'centos|fedora' /etc/*release)" ]]; then - serviceUser="nginx" -else - serviceUser="www-data" -fi - -# get sure that we have our correct PATH -export PATH=$PATH:/usr/local/bin -export NUXT_TELEMETRY_DISABLED=1 - -runInstall() { - if [[ ! -f "/etc/ffplayout/ffplayout.yml" ]]; then - echo "" - echo "------------------------------------------------------------------------------" - echo "path to media storage, default: /opt/ffplayout/media" - echo "------------------------------------------------------------------------------" - echo "" - - read -p "media path :$ " mediaPath - - if [[ -z "$mediaPath" ]]; then - mediaPath="/opt/ffplayout/media" - fi - - echo "" - echo "------------------------------------------------------------------------------" - echo "playlist path, default: /opt/ffplayout/playlists" - echo "------------------------------------------------------------------------------" - echo "" - - read -p "playlist path :$ " playlistPath - - if [[ -z "$playlistPath" ]]; then - playlistPath="/opt/ffplayout/playlists" - fi - fi - - if ! ffmpeg -version &> /dev/null; then - echo "" - echo "------------------------------------------------------------------------------" - echo "compile and install (nonfree) ffmpeg:" - echo "------------------------------------------------------------------------------" - echo "" - while true; do - read -p "Do you wish to compile ffmpeg? (Y/n) :$ " yn - case $yn in - [Yy]* ) compileFFmpeg="y"; break;; - [Nn]* ) compileFFmpeg="n"; break;; - * ) ( - echo "------------------------------------" - echo "Please answer yes or no!" - echo "" - );; - esac - done - fi - - if ! nginx -t &> /dev/null; then - echo "" - echo "------------------------------------------------------------------------------" - echo "install and setup nginx:" - echo "------------------------------------------------------------------------------" - echo "" - while true; do - read -p "Do you wish to install nginx? (Y/n) :$ " yn - case $yn in - [Yy]* ) installNginx="y"; break;; - [Nn]* ) installNginx="n"; break;; - * ) ( - echo "------------------------------------" - echo "Please answer yes or no!" - echo "" - );; - esac - done - - echo "" - echo "------------------------------------------------------------------------------" - echo "ffplayout domain name (like: example.org)" - echo "------------------------------------------------------------------------------" - echo "" - - read -p "domain name :$ " domainFrontend - fi - - if [[ ! -d /usr/local/srs ]]; then - echo "" - echo "------------------------------------------------------------------------------" - echo "install and srs rtmp/hls server:" - echo "------------------------------------------------------------------------------" - echo "" - while true; do - read -p "Do you wish to install srs? (Y/n) :$ " yn - case $yn in - [Yy]* ) installSRS="y"; break;; - [Nn]* ) installSRS="n"; break;; - * ) ( - echo "------------------------------------" - echo "Please answer yes or no!" - echo "" - );; - esac - done - fi - - if [[ ! -d "/opt/ffplayout-engine" ]]; then - echo "" - echo "------------------------------------------------------------------------------" - echo "install ffplayout-engine:" - echo "------------------------------------------------------------------------------" - echo "" - while true; do - read -p "Do you wish to install ffplayout-engine? (Y/n) :$ " yn - case $yn in - [Yy]* ) installEngine="y"; break;; - [Nn]* ) installEngine="n"; break;; - * ) ( - echo "------------------------------------" - echo "Please answer yes or no!" - echo "" - );; - esac - done - fi - - echo "" - echo "------------------------------------------------------------------------------" - echo "install main packages" - echo "------------------------------------------------------------------------------" - - if [[ "$(grep -Ei 'debian|buntu|mint' /etc/*release)" ]]; then - packages=(sudo curl wget net-tools git python3-dev build-essential virtualenv - python3-virtualenv mediainfo autoconf automake libtool pkg-config - yasm cmake mercurial gperf) - installedPackages=$(dpkg --get-selections | awk '{print $1}' | tr '\n' ' ') - apt update - - if [[ "$installedPackages" != *"curl"* ]]; then - apt install -y curl - fi - - if [[ "$installedPackages" != *"nodejs"* ]]; then - curl -sL https://deb.nodesource.com/setup_12.x | bash - - apt install -y nodejs - fi - - for pkg in ${packages[@]}; do - if [[ "$installedPackages" != *"$pkg"* ]]; then - apt install -y $pkg - fi - done - - if [[ $installNginx == 'y' ]] && [[ "$installedPackages" != *"nginx"* ]]; then - apt install -y nginx - rm /etc/nginx/sites-enabled/default - fi - - nginxConfig="/etc/nginx/sites-available" - - elif [[ "$(grep -Ei 'centos|fedora' /etc/*release)" ]]; then - packages=(libstdc++-static yasm mercurial libtool libmediainfo mediainfo - cmake net-tools git python3 python36-devel wget python3-virtualenv - gperf nano nodejs python3-policycoreutils policycoreutils-devel) - installedPackages=$(dnf list --installed | awk '{print $1}' | tr '\n' ' ') - activeRepos=$(dnf repolist enabled | awk '{print $1}' | tr '\n' ' ') - - if [[ "$activeRepos" != *"epel"* ]]; then - dnf -y install epel-release - fi - - if [[ "$activeRepos" != *"PowerTools"* ]]; then - dnf -y config-manager --enable PowerTools - fi - - if [[ "$activeRepos" != *"nodesource"* ]]; then - curl -sL https://rpm.nodesource.com/setup_12.x | sudo -E bash - - fi - - for pkg in ${packages[@]}; do - if [[ "$installedPackages" != *"$pkg"* ]]; then - dnf -y install $pkg - fi - done - - if [[ ! $(dnf group list "Development Tools" | grep -i "install") ]]; then - dnf -y group install "Development Tools" - fi - - if [[ $installNginx == 'y' ]] && [[ "$installedPackages" != *"nginx"* ]]; then - dnf -y install nginx - systemctl enable nginx - systemctl start nginx - firewall-cmd --permanent --add-service=http - firewall-cmd --permanent --zone=public --add-service=https - firewall-cmd --reload - mkdir /var/www - chcon -vR system_u:object_r:httpd_sys_content_t:s0 /var/www - fi - - if [[ $(alternatives --list | grep "no-python") ]]; then - alternatives --set python /usr/bin/python3 - fi - - nginxConfig="/etc/nginx/conf.d" - fi - - if [[ $compileFFmpeg == 'y' ]]; then - echo "" - echo "------------------------------------------------------------------------------" - echo "compile and install ffmpeg" - echo "------------------------------------------------------------------------------" - cd /opt/ - - if [[ ! -d "ffmpeg-build" ]]; then - git clone https://github.com/jb-alvarado/compile-ffmpeg-osx-linux.git ffmpeg-build - fi - - cd ffmpeg-build - - if [[ ! -f "build_config.txt" ]]; then -cat < "build_config.txt" -#--enable-decklink ---disable-ffplay ---disable-sdl2 ---enable-fontconfig -#--enable-libaom -#--enable-libass -#--enable-libbluray ---enable-libfdk-aac ---enable-libfribidi ---enable-libfreetype ---enable-libmp3lame ---enable-libopus ---enable-libsoxr -#--enable-libsrt ---enable-libtwolame ---enable-libvpx ---enable-libx264 ---enable-libx265 ---enable-libzimg ---enable-libzmq ---enable-nonfree -#--enable-opencl -#--enable-opengl -#--enable-openssl -#--enable-libsvtav1 -EOF - sed -i 's/mediainfo="yes"/mediainfo="no"/g' ./compile-ffmpeg.sh - sed -i 's/mp4box="yes"/mp4box="no"/g' ./compile-ffmpeg.sh - fi - - ./compile-ffmpeg.sh - - \cp local/bin/ff* /usr/local/bin/ - fi - - if [[ $installSRS == 'y' ]] && [[ ! -d "/usr/local/srs" ]]; then - echo "" - echo "------------------------------------------------------------------------------" - echo "compile and install srs" - echo "------------------------------------------------------------------------------" - - cd /opt/ - git clone https://github.com/ossrs/srs.git - cd srs/trunk/ - - ./configure - make - make install - - mkdir -p "/var/www/srs/live" - mkdir "/etc/srs" - -cat < "/etc/srs/srs.conf" -listen 1935; -max_connections 20; -daemon on; -pid /usr/local/srs/objs/srs.pid; -srs_log_tank console; # file; -srs_log_file /var/log/srs.log; -ff_log_dir /tmp; - -# can be: verbose, info, trace, warn, error -srs_log_level error; - -http_api { - enabled on; - listen 1985; -} - -stats { - network 0; - disk sda vda xvda xvdb; -} - -vhost __defaultVhost__ { - # timestamp correction - mix_correct on; - - http_hooks { - enabled off; - on_publish http://127.0.0.1:8085/api/v1/streams; - on_unpublish http://127.0.0.1:8085/api/v1/streams; - } - - hls { - enabled on; - hls_path /var/www/srs; - hls_fragment 6; - hls_window 3600; - hls_cleanup on; - hls_dispose 0; - hls_m3u8_file live/stream.m3u8; - hls_ts_file live/stream-[seq].ts; - } -} -EOF - -cat < "/etc/systemd/system/srs.service" -[Unit] -Description=SRS -Documentation=https://github.com/ossrs/srs/wiki -After=network.target - -[Service] -Type=forking -ExecStartPre=/usr/local/srs/objs/srs -t -c /etc/srs/srs.conf -ExecStart=/usr/local/srs/objs/srs -c /etc/srs/srs.conf -ExecStop=/bin/kill -TERM \$MAINPID -ExecReload=/bin/kill -1 \$MAINPID -Restart=always -RestartSec=3 - -[Install] -WantedBy=multi-user.target -EOF - - systemctl enable srs.service - systemctl start srs.service - fi - - if [[ "$(grep -Ei 'centos|fedora' /etc/*release)" ]]; then - echo "" - echo "------------------------------------------------------------------------------" - echo "creating selinux rules" - echo "------------------------------------------------------------------------------" - - if [[ $(getsebool httpd_can_network_connect | awk '{print $NF}') == "off" ]]; then - setsebool httpd_can_network_connect on -P - fi - - if [[ ! $(semanage port -l | grep http_port_t | grep "8001") ]]; then - semanage port -a -t http_port_t -p tcp 8001 - fi - - if [[ ! $(semodule -l | grep gunicorn) ]]; then -cat < gunicorn.te -module gunicorn 1.0; - -require { - type init_t; - type httpd_sys_content_t; - type unreserved_port_t; - class tcp_socket name_connect; - type etc_t; - type sudo_exec_t; - class file { create execute execute_no_trans getattr ioctl lock map open read unlink write }; - class lnk_file { getattr read }; -} - -#============= init_t ============== - -#!!!! This avc is allowed in the current policy -allow init_t etc_t:file write; - -#!!!! This avc is allowed in the current policy -#!!!! This av rule may have been overridden by an extended permission av rule -allow init_t httpd_sys_content_t:file { create execute execute_no_trans getattr ioctl lock map open read unlink write }; - -#!!!! This avc is allowed in the current policy -allow init_t httpd_sys_content_t:lnk_file { getattr read }; - -#!!!! This avc can be allowed using the boolean 'nis_enabled' -allow init_t unreserved_port_t:tcp_socket name_connect; - -#!!!! This avc is allowed in the current policy -allow init_t sudo_exec_t:file { execute execute_no_trans map open read }; -EOF - - checkmodule -M -m -o gunicorn.mod gunicorn.te - semodule_package -o gunicorn.pp -m gunicorn.mod - semodule -i gunicorn.pp - - rm -f gunicorn.* - fi - - if [[ ! $(semodule -l | grep "custom-http") ]]; then -cat < custom-http.te -module custom-http 1.0; - -require { - type init_t; - type httpd_sys_content_t; - class file { create lock unlink write }; -} - -#============= init_t ============== -allow init_t httpd_sys_content_t:file unlink; - -#!!!! This avc is allowed in the current policy -allow init_t httpd_sys_content_t:file { create lock write }; -EOF - - checkmodule -M -m -o custom-http.mod custom-http.te - semodule_package -o custom-http.pp -m custom-http.mod - semodule -i custom-http.pp - - rm -f custom-http.* - fi - - if [[ ! $(semodule -l | grep "custom-fileop") ]]; then -cat < custom-fileop.te -module custom-fileop 1.0; - -require { - type init_t; - type httpd_sys_content_t; - type usr_t; - class file { create rename unlink write }; - class dir { create rmdir }; -} - -#============= init_t ============== -allow init_t httpd_sys_content_t:file rename; - -#!!!! This avc is allowed in the current policy -allow init_t usr_t:dir create; -allow init_t usr_t:dir rmdir; - -#!!!! This avc is allowed in the current policy -allow init_t usr_t:file create; -allow init_t usr_t:file { rename unlink write }; - -EOF - - checkmodule -M -m -o custom-fileop.mod custom-fileop.te - semodule_package -o custom-fileop.pp -m custom-fileop.mod - semodule -i custom-fileop.pp - - rm -f custom-fileop.* - fi - fi - - if ! grep -q "ffplayout-engine.service" "/etc/sudoers"; then - echo "$serviceUser ALL = NOPASSWD: /bin/systemctl start ffplayout-engine.service, /bin/systemctl stop ffplayout-engine.service, /bin/systemctl reload ffplayout-engine.service, /bin/systemctl restart ffplayout-engine.service, /bin/systemctl status ffplayout-engine.service, /bin/systemctl is-active ffplayout-engine.service, /bin/journalctl -n 1000 -u ffplayout-engine.service" >> /etc/sudoers - fi - - if [[ "$installEngine" == "y" ]] && [[ ! -d "/opt/ffplayout-engine" ]]; then - echo "" - echo "------------------------------------------------------------------------------" - echo "install ffplayout engine" - echo "------------------------------------------------------------------------------" - - cd /opt - git clone https://github.com/ffplayout/ffplayout-engine.git - cd ffplayout-engine - - virtualenv -p python3 venv - source ./venv/bin/activate - - pip install -r requirements-base.txt - - mkdir /etc/ffplayout - mkdir /var/log/ffplayout - mkdir -p $mediaPath - mkdir -p $playlistPath - - cp ffplayout.yml /etc/ffplayout/ - chown -R $serviceUser. /etc/ffplayout - chown $serviceUser. /var/log/ffplayout - chown $serviceUser. $mediaPath - chown $serviceUser. $playlistPath - - cp docs/ffplayout-engine.service /etc/systemd/system/ - sed -i "s/User=root/User=$serviceUser/g" /etc/systemd/system/ffplayout-engine.service - sed -i "s/Group=root/Group=$serviceUser/g" /etc/systemd/system/ffplayout-engine.service - - sed -i "s|\"\/playlists\"|\"$playlistPath\"|g" /etc/ffplayout/ffplayout.yml - sed -i "s|\"\/mediaStorage|\"$mediaPath|g" /etc/ffplayout/ffplayout.yml - - systemctl enable ffplayout-engine.service - - deactivate - fi - - if [[ ! -d "/var/www/ffplayout-api" ]]; then - echo "" - echo "------------------------------------------------------------------------------" - echo "install ffplayout-api" - echo "------------------------------------------------------------------------------" - - cd /var/www - git clone https://github.com/ffplayout/ffplayout-api.git - cd ffplayout-api - - virtualenv -p python3 venv - source ./venv/bin/activate - - pip install -r requirements-base.txt - - cd ffplayout - - secret=$(python manage.py shell -c 'from django.core.management import utils; print(utils.get_random_secret_key())') - - sed -i "s/---a-very-important-secret-key\:-generate-it-new---/$secret/g" ffplayout/settings/production.py - sed -i "s/localhost/$domainFrontend/g" ../docs/db_data.json - - python manage.py makemigrations && python manage.py migrate - python manage.py collectstatic - python manage.py loaddata ../docs/db_data.json - python manage.py createsuperuser - - deactivate - - chown $serviceUser. -R /var/www - - cd .. - - cp docs/ffplayout-api.service /etc/systemd/system/ - - sed -i "s/User=root/User=$serviceUser/g" /etc/systemd/system/ffplayout-api.service - sed -i "s/Group=root/Group=$serviceUser/g" /etc/systemd/system/ffplayout-api.service - - sed -i "s/'localhost'/'localhost', \'$domainFrontend\'/g" /var/www/ffplayout-api/ffplayout/ffplayout/settings/production.py - sed -i "s/ffplayout\\.local/$domainFrontend\'\n \'https\\:\/\/$domainFrontend/g" /var/www/ffplayout-api/ffplayout/ffplayout/settings/production.py - - systemctl enable ffplayout-api.service - systemctl start ffplayout-api.service - fi - - if [[ ! -d "/var/www/ffplayout-frontend" ]]; then - echo "" - echo "------------------------------------------------------------------------------" - echo "install ffplayout-frontend" - echo "------------------------------------------------------------------------------" - - cd /var/www - git clone https://github.com/ffplayout/ffplayout-frontend.git - cd ffplayout-frontend - - ln -s "$mediaPath" /var/www/ffplayout-frontend/static/ - - npm install - -cat < ".env" -BASE_URL='http://$domainFrontend' -API_URL='/' -EOF - - npm run build - - chown $serviceUser. -R /var/www - - if [[ $installNginx == 'y' ]]; then - cp docs/ffplayout.conf "$nginxConfig/" - - origin=$(echo "$domainFrontend" | sed 's/\./\\\\./g') - - sed -i "s/ffplayout.local/$domainFrontend/g" $nginxConfig/ffplayout.conf - sed -i "s/ffplayout\\\.local/$origin/g" $nginxConfig/ffplayout.conf - - if [[ "$(grep -Ei 'debian|buntu|mint' /etc/*release)" ]]; then - ln -s $nginxConfig/ffplayout.conf /etc/nginx/sites-enabled/ - fi - fi - fi - - if [[ $installNginx == 'y' ]]; then - systemctl restart nginx - fi - - echo "" - echo "------------------------------------------------------------------------------" - echo "installation done..." - echo "------------------------------------------------------------------------------" - - echo "" - echo "add your ssl config to $nginxConfig/ffplayout.conf" - echo "" -} - -runUpdate() { - if [[ -d "/opt/ffmpeg-build" ]]; then - cd "/opt/ffmpeg-build" - - git pull - - ./compile-ffmpeg.sh - - echo "" - echo "------------------------------------------------------------------------------" - echo "updating ffmpeg-build done..." - echo "------------------------------------------------------------------------------" - fi - - if [[ -d "/opt/ffplayout-engine" ]]; then - cd "/opt/ffplayout-engine" - git pull - - source ./venv/bin/activate - pip install --upgrade -r requirements-base.txt - deactivate - - echo "" - echo "------------------------------------------------------------------------------" - echo "updating ffplayout-engine done..." - echo "------------------------------------------------------------------------------" - else - echo "" - echo "------------------------------------------------------------------------------" - echo "WARNING: no ffplayout-engine found..." - echo "------------------------------------------------------------------------------" - fi - - if [[ -d "/var/www/ffplayout-api" ]]; then - cd "/var/www/ffplayout-api" - git pull - - source ./venv/bin/activate - pip install --upgrade -r requirements-base.txt - deactivate - - echo "" - echo "------------------------------------------------------------------------------" - echo "updating ffplayout-api done..." - echo "------------------------------------------------------------------------------" - else - echo "" - echo "------------------------------------------------------------------------------" - echo "WARNING: no ffplayout-api found..." - echo "------------------------------------------------------------------------------" - fi - - if [[ -d "/var/www/ffplayout-frontend" ]]; then - cd "/var/www/ffplayout-frontend" - git pull - - rm -rf node_modules - sudo -H -u $serviceUser bash -c 'npm install' - sudo -H -u $serviceUser bash -c 'npm run build' - - echo "" - echo "------------------------------------------------------------------------------" - echo "updating ffplayout-frontend done..." - echo "------------------------------------------------------------------------------" - else - echo "" - echo "------------------------------------------------------------------------------" - echo "WARNING: no ffplayout-frontend found..." - echo "------------------------------------------------------------------------------" - fi - - echo "" - echo "------------------------------------------------------------------------------" - echo "updating done..." - echo "if there is a new ffmpeg version, run:" - echo " systemctl stop ffplayout-engine" - echo " cp /opt/ffmpeg-build/local/bin/ff* /usrlocal/bin" - echo " systemctl start ffplayout-engine" - echo "" - echo "to apply update restart services:" - echo " systemctl restart ffplayout-engine" - echo " systemctl restart ffplayout-api" -} - -if [[ "$1" == "update" ]]; then - runUpdate -else - runInstall -fi diff --git a/layouts/default.vue b/layouts/default.vue index 67e11afe..6d2ef419 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -44,6 +44,7 @@ html, body { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; box-sizing: border-box; + width: 100%; height: 100%; padding: 0; margin: 0; diff --git a/nuxt.config.js b/nuxt.config.js index c4a895a1..40ed673d 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -44,12 +44,12 @@ export default { plugins: [ { src: '~/plugins/axios' }, { src: '~/plugins/filters' }, + { src: '~/plugins/helpers.js' }, { src: '~/plugins/nuxt-client-init.js', ssr: false }, { src: '~plugins/video.js', ssr: false }, { src: '~plugins/scrollbar.js', ssr: false }, { src: '~plugins/splitpanes.js', ssr: false }, { src: '~plugins/loading.js', ssr: false }, - { src: '~/plugins/helpers.js' }, { src: '~plugins/draggable.js', ssr: false } ], /* diff --git a/package-lock.json b/package-lock.json index 702a85b8..16113108 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2558,28 +2558,28 @@ } }, "browserslist": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", - "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", "requires": { - "caniuse-lite": "^1.0.30001165", + "caniuse-lite": "^1.0.30001173", "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.621", + "electron-to-chromium": "^1.3.634", "escalade": "^3.1.1", - "node-releases": "^1.1.67" + "node-releases": "^1.1.69" } }, "caniuse-lite": { - "version": "1.0.30001171", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001171.tgz", - "integrity": "sha512-5Alrh8TTYPG9IH4UkRqEBZoEToWRLvPbSQokvzSz0lii8/FOWKG4keO1HoYfPWs8IF/NH/dyNPg1cmJGvV3Zlg==" + "version": "1.0.30001180", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001180.tgz", + "integrity": "sha512-n8JVqXuZMVSPKiPiypjFtDTXc4jWIdjxull0f92WLo7e1MSi3uJ3NvveakSh/aCl1QKFAvIz3vIj0v+0K+FrXw==" }, "core-js-compat": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", - "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", + "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", "requires": { - "browserslist": "^4.15.0", + "browserslist": "^4.16.1", "semver": "7.0.0" }, "dependencies": { @@ -2591,9 +2591,9 @@ } }, "electron-to-chromium": { - "version": "1.3.633", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.633.tgz", - "integrity": "sha512-bsVCsONiVX1abkWdH7KtpuDAhsQ3N3bjPYhROSAXE78roJKet0Y5wznA14JE9pzbwSZmSMAW6KiKYf1RvbTJkA==" + "version": "1.3.647", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.647.tgz", + "integrity": "sha512-Or2Nu8TjkmSywY9hk85K/Y6il28hchlonITz30fkC87qvSNupQl29O12BzDDDTnUFlo6kEIFL2QGSpkZDMxH8g==" }, "escalade": { "version": "3.1.1", @@ -2601,9 +2601,9 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "node-releases": { - "version": "1.1.67", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", - "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==" + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==" }, "regexpu-core": { "version": "4.7.1", @@ -2778,9 +2778,9 @@ } }, "@nuxt/components": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@nuxt/components/-/components-1.2.2.tgz", - "integrity": "sha512-AByrBPnV4mWwwf1tPaKLmtg6JBsNJACLuSnpJOpWGV6KjS5S8i6BTf8dqiPN0uGg6YeSQaeDWtnfILcoLp2GSw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@nuxt/components/-/components-1.2.5.tgz", + "integrity": "sha512-OgLO45JNYBus7+fh+nimniLlpD09ABHKLp7+ShrOAkWP8KmXTlZAj2IvYQX3Areau6sWepV2+3vg1SyErh/Fow==", "requires": { "chalk": "^4.1.0", "chokidar": "^3.4.3", @@ -2788,6 +2788,7 @@ "globby": "^11.0.1", "lodash": "^4.17.20", "semver": "^7.3.4", + "upath": "^2.0.1", "vue-template-compiler": "^2.6.12" }, "dependencies": { @@ -2833,6 +2834,11 @@ "requires": { "has-flag": "^4.0.0" } + }, + "upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==" } } }, @@ -3113,24 +3119,24 @@ } }, "@nuxt/telemetry": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-1.3.0.tgz", - "integrity": "sha512-anAhyccoVyy/RetkqVsIxpJKdAu/GHyLl79ZtH0oOCbYcC85k8d+LC1S10WcqXyeqyUKifLxGR6yPqSPmQCCtg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-1.3.3.tgz", + "integrity": "sha512-ElnoAJo1n/Ui0j9i3xqhXajoGJdEwmkEtsWftlZUpQNJxdfoz+623qnt9XHMYa0X5Nf1PXYdcUKa2u4AASXOjA==", "requires": { "arg": "^5.0.0", "chalk": "^4.1.0", "ci-info": "^2.0.0", "consola": "^2.15.0", - "create-require": "^1.1.0", + "create-require": "^1.1.1", "defu": "^3.2.2", - "destr": "^1.0.1", + "destr": "^1.1.0", "dotenv": "^8.2.0", "fs-extra": "^8.1.0", - "git-url-parse": "^11.4.0", + "git-url-parse": "^11.4.3", "inquirer": "^7.3.3", "is-docker": "^2.1.1", - "jiti": "^0.1.16", - "nanoid": "^3.1.18", + "jiti": "^1.3.0", + "nanoid": "^3.1.20", "node-fetch": "^2.6.1", "parse-git-config": "^3.0.0", "rc9": "^1.2.0", @@ -3177,6 +3183,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "jiti": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.3.0.tgz", + "integrity": "sha512-CrRtGy3v7PE5dGWtMBe+FMaViXX2eUa7I+Cyo0WmyggVm61lfpEs1orBQalHx9KDIp0Kl5mNaXGHZCMgTpNDXw==" + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3188,9 +3199,9 @@ } }, "@nuxt/ufo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@nuxt/ufo/-/ufo-0.5.2.tgz", - "integrity": "sha512-nnKFQ4NA5id5ekyQWHTdOfirIZRQzfEHMB9T0T6NZdWy4+3Nrw0GTBQ3J9Am0gg8kvqR0mMQTn1wK6ya3i/XmA==" + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@nuxt/ufo/-/ufo-0.5.4.tgz", + "integrity": "sha512-JZOGDlt2BvLCBmLhrchhRJ6tP9PBfSWLdsHC+JVJ5Qp8/hT/2u61cSsLS30zUOwcPRaQ3y2oHNkEiKJ5v90iEQ==" }, "@nuxt/utils": { "version": "2.14.12", @@ -3314,9 +3325,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001171", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001171.tgz", - "integrity": "sha512-5Alrh8TTYPG9IH4UkRqEBZoEToWRLvPbSQokvzSz0lii8/FOWKG4keO1HoYfPWs8IF/NH/dyNPg1cmJGvV3Zlg==" + "version": "1.0.30001180", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001180.tgz", + "integrity": "sha512-n8JVqXuZMVSPKiPiypjFtDTXc4jWIdjxull0f92WLo7e1MSi3uJ3NvveakSh/aCl1QKFAvIz3vIj0v+0K+FrXw==" }, "chalk": { "version": "3.0.0", @@ -3473,9 +3484,9 @@ } }, "@types/estree": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", - "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", "dev": true }, "@types/html-minifier-terser": { @@ -3503,9 +3514,9 @@ "dev": true }, "@types/node": { - "version": "14.14.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.16.tgz", - "integrity": "sha512-naXYePhweTi+BMv11TgioE2/FXU4fSl29HAH1ffxVciNsH3rYXjNP2yM8wqmSm7jS20gM8TIklKiTen+1iVncw==" + "version": "14.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", + "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -3544,9 +3555,9 @@ } }, "@types/webpack": { - "version": "4.41.25", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.25.tgz", - "integrity": "sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ==", + "version": "4.41.26", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.26.tgz", + "integrity": "sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA==", "requires": { "@types/anymatch": "*", "@types/node": "*", @@ -4644,9 +4655,9 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "bluebird": { "version": "3.7.2", @@ -4696,9 +4707,9 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "bootstrap": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.3.tgz", - "integrity": "sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", + "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" }, "bootstrap-vue": { "version": "2.21.2", @@ -5115,13 +5126,13 @@ "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==" }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -5811,14 +5822,14 @@ } }, "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, "css-select-base-adapter": { @@ -5843,9 +5854,9 @@ } }, "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" }, "cssdb": { "version": "4.4.0", @@ -5986,9 +5997,9 @@ } }, "dayjs": { - "version": "1.9.8", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.9.8.tgz", - "integrity": "sha512-F42qBtJRa30FKF7XDnOQyNUTsaxDkuaZRj/i7BejSHC34LlLfPoIU4aeopvWfM+m1dJ6/DHKAWLg2ur+pLgq1w==" + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", + "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" }, "de-indent": { "version": "1.0.2", @@ -6102,9 +6113,9 @@ } }, "destr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/destr/-/destr-1.0.1.tgz", - "integrity": "sha512-LnEdINrd1ydSqRiAGjMBVrG/G8hNruwE+fEKlkJA14MGPEoI9T7zJDwGpkMTyXT2ASE0ycnN2SYn4k6Q7j7lHg==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/destr/-/destr-1.1.0.tgz", + "integrity": "sha512-Ev/sqS5AzzDwlpor/5wFCDu0dYMQu/0x2D6XfAsQ0E7uQmamIgYJ6Dppo2T2EOFVkeVYWjc+PCLKaqZZ57qmLg==" }, "destroy": { "version": "1.0.4", @@ -6197,9 +6208,9 @@ } }, "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -6342,9 +6353,9 @@ } }, "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -7048,9 +7059,9 @@ "dev": true }, "eslint-webpack-plugin": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.4.1.tgz", - "integrity": "sha512-cj8iPWZKuAiVD8MMgTSunyMCAvxQxp5mxoPHZl1UMGkApFXaXJHdCFcCR+oZEJbBNhReNa5SjESIn34uqUbBtg==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.4.3.tgz", + "integrity": "sha512-+15ifHFkGn0gB7lQBe+xgyKcjelxv9xlTutGHEPYBUUj+1Rjrjq3+1REJLJpyAHgpQTatpqkRY1z8gQuyn3Aww==", "dev": true, "requires": { "@types/eslint": "^7.2.4", @@ -7643,9 +7654,9 @@ } }, "flatted": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", - "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "flatten": { @@ -7692,9 +7703,9 @@ } }, "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", + "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==" }, "for-in": { "version": "1.0.2", @@ -7849,9 +7860,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", "optional": true }, "function-bind": { @@ -8000,9 +8011,9 @@ } }, "git-url-parse": { - "version": "11.4.3", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.4.3.tgz", - "integrity": "sha512-LZTTk0nqJnKN48YRtOpR8H5SEfp1oM2tls90NuZmBxN95PnCvmuXGzqQ4QmVirBgKx2KPYfPGteX3/raWjKenQ==", + "version": "11.4.4", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.4.4.tgz", + "integrity": "sha512-Y4o9o7vQngQDIU9IjyCmRJBin5iYjI5u9ZITnddRZpD7dcCFQj2sL2XuMNbLRE4b4B/4ENPsp2Q8P44fjAZ0Pw==", "requires": { "git-up": "^4.0.0" } @@ -8425,16 +8436,16 @@ "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=" }, "html-webpack-plugin": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", - "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.1.tgz", + "integrity": "sha512-yzK7RQZwv9xB+pcdHNTjcqbaaDZ+5L0zJHXfi89iWIZmb/FtzxhLk0635rmJihcQbs3ZUF27Xp4oWGx6EK56zg==", "requires": { "@types/html-minifier-terser": "^5.0.0", "@types/tapable": "^1.0.5", "@types/webpack": "^4.41.8", "html-minifier-terser": "^5.0.1", "loader-utils": "^1.2.3", - "lodash": "^4.17.15", + "lodash": "^4.17.20", "pretty-error": "^2.1.1", "tapable": "^1.1.3", "util.promisify": "1.0.0" @@ -9037,9 +9048,9 @@ } }, "jiti": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-0.1.18.tgz", - "integrity": "sha512-UUoooMMbuKJivBJL8tH+Tkf4gdF4CcwdaswrBW+HJxme0L1NWjXEV8A4wxgHW2s5rJnDM5NoVmuUYT6PNSgKmw==" + "version": "0.1.20", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-0.1.20.tgz", + "integrity": "sha512-nlsuibooCG5yEjmGSVqxhjULy3rO1Gl0LDP+HpUMbzOSLcz5s1Gf5cPnjvHiei0JCG3SXX761HQArDzNIfdz4Q==" }, "js-base64": { "version": "2.6.4", @@ -9635,9 +9646,9 @@ } }, "mime": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", - "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", + "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==" }, "mime-db": { "version": "1.44.0", @@ -9912,9 +9923,9 @@ } }, "node-html-parser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-2.0.0.tgz", - "integrity": "sha512-3wJdYSxiVIBxuiFm9UtfNWAlBw2P+Vb/RN1nqf40q2JeZDpcJ1HsrWuWV3j15SSJ25TvfnOoac2Q+uDU9iY0sw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-2.0.2.tgz", + "integrity": "sha512-N2000Ho9dkabvRZcyiwm6zOpdiAzxAxcJ0Z0WNoh/yXHG0YCuiK2WpNQfN+9vheLNY/h/It11Gk7uwT4QTfk9Q==", "requires": { "he": "1.2.0" } @@ -10470,12 +10481,36 @@ } }, "parse-path": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.2.tgz", - "integrity": "sha512-HSqVz6iuXSiL8C1ku5Gl1Z5cwDd9Wo0q8CoffdAghP6bz8pJa1tcMC+m4N+z6VAS8QdksnIGq1TB6EgR4vPR6w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.3.tgz", + "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==", "requires": { "is-ssh": "^1.3.0", - "protocols": "^1.4.0" + "protocols": "^1.4.0", + "qs": "^6.9.4", + "query-string": "^6.13.8" + }, + "dependencies": { + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + }, + "query-string": { + "version": "6.13.8", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.8.tgz", + "integrity": "sha512-jxJzQI2edQPE/NPUOusNjO/ZOGqr1o2OBa/3M00fU76FsLXDVbJDv/p7ng5OdQyorKrkRz1oqfwmbe5MAMePQg==", + "requires": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" + } } }, "parse-url": { @@ -11614,11 +11649,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "proper-lockfile": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.1.tgz", - "integrity": "sha512-1w6rxXodisVpn7QYvLk706mzprPTAPCYAqxMvctmPN3ekuRk/kuGkGc82pangZiAt4R3lwSuUzheTTn0/Yb7Zg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "requires": { - "graceful-fs": "^4.1.11", + "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } @@ -12022,13 +12057,13 @@ "optional": true }, "renderkid": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.4.tgz", - "integrity": "sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", "requires": { - "css-select": "^1.1.0", + "css-select": "^2.0.2", "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", + "htmlparser2": "^3.10.1", "lodash": "^4.17.20", "strip-ansi": "^3.0.0" }, @@ -12966,6 +13001,11 @@ "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -13724,9 +13764,9 @@ } }, "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" }, "tsutils": { "version": "3.17.1", @@ -13799,9 +13839,9 @@ "integrity": "sha512-m4hvMLxgGHXG3O3fQVAyyAQpZzDOvwnhOTjYz5Xmr7r/+LpkNy3vJXdVRWgd1TkAb7NGROZuSy96CrlNVjA7KA==" }, "uglify-js": { - "version": "3.12.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.3.tgz", - "integrity": "sha512-feZzR+kIcSVuLi3s/0x0b2Tx4Iokwqt+8PJM7yRHKuldg4MLdam4TCFeICv+lgDtuYiCtdmrtIP+uN9LWvDasw==" + "version": "3.12.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.5.tgz", + "integrity": "sha512-SgpgScL4T7Hj/w/GexjnBHi3Ien9WS1Rpfg5y91WXMj9SY997ZCQU76mH4TpLwwfmMvoOU8wiaRkIf6NaH3mtg==" }, "unfetch": { "version": "4.2.0", @@ -14180,9 +14220,9 @@ "integrity": "sha512-ZMjqRpWabMPqPc7gIrG0Nw6vRf1+itwf0Itft7LbMXs2g3Zs/NFmevjZGN1x7K3Q95GmIjWbQZTVerxiBxI+0g==" }, "vue-router": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.9.tgz", - "integrity": "sha512-CGAKWN44RqXW06oC+u4mPgHLQQi2t6vLD/JbGRDAXm0YpMv0bgpKuU5bBd7AvMgfTz9kXVRIWKHqRwGEb8xFkA==" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", + "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw==" }, "vue-server-renderer": { "version": "2.6.12", @@ -14303,9 +14343,9 @@ } }, "vuex": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.0.tgz", - "integrity": "sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ==" + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", + "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==" }, "watchpack": { "version": "1.7.5", @@ -14560,9 +14600,9 @@ } }, "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -14572,7 +14612,7 @@ "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", + "enhanced-resolve": "^4.5.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", diff --git a/package.json b/package.json index 99739ef2..4d0cea54 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@nuxtjs/axios": "^5.12.5", "@nuxtjs/dayjs": "^1.3.0", "@nuxtjs/dotenv": "^1.4.1", - "bootstrap": "^4.5.3", + "bootstrap": "^4.6.0", "bootstrap-vue": "^2.21.2", "cookie-universal-nuxt": "^2.1.4", "jwt-decode": "^3.1.2", diff --git a/pages/logging.vue b/pages/logging.vue index e77397b9..4468b59b 100644 --- a/pages/logging.vue +++ b/pages/logging.vue @@ -6,24 +6,39 @@ - + -
+                        
                     
                 
                 
                     
                         
-                        
+                        
                     
                 
                 
                     
                         
-                        
+                        
                     
                 
             
@@ -63,7 +78,10 @@ export default {
         return {
             logName: 'ffplayout',
             currentLog: null,
-            listDate: this.$dayjs().format('YYYY-MM-DD')
+            listDate: this.$dayjs().format('YYYY-MM-DD'),
+            scrollOP: {
+                wheelSpeed: 5
+            }
         }
     },
 
@@ -97,22 +115,46 @@ export default {
 
 
 
diff --git a/store/config.js b/store/config.js
index 7e85a14f..30cb2799 100644
--- a/store/config.js
+++ b/store/config.js
@@ -4,6 +4,8 @@ export const state = () => ({
     configGui: null,
     configGuiRaw: null,
     netChoices: [],
+    startInSec: null,
+    playlistLength: 86400.0,
     configPlayout: [],
     currentUser: null,
     configUser: null
@@ -25,6 +27,12 @@ export const mutations = {
     UPDATE_NET_CHOICES (state, list) {
         state.netChoices = list
     },
+    UPDATE_START_TIME (state, sec) {
+        state.startInSec = sec
+    },
+    UPDATE_PLAYLIST_LENGTH (state, sec) {
+        state.playlistLength = sec
+    },
     UPDATE_PLAYLOUT_CONFIG (state, config) {
         state.configPlayout = config
     },
@@ -103,6 +111,14 @@ export const actions = {
         const response = await this.$axios.get(`api/player/config/?configPlayout&path=${path}`)
 
         if (response.data) {
+            if (response.data.playlist.day_start) {
+                commit('UPDATE_START_TIME', this.$timeToSeconds(response.data.playlist.day_start))
+            }
+
+            if (response.data.playlist.length) {
+                commit('UPDATE_PLAYLIST_LENGTH', this.$timeToSeconds(response.data.playlist.length))
+            }
+
             commit('UPDATE_PLAYLOUT_CONFIG', response.data)
         }
     },
diff --git a/store/playlist.js b/store/playlist.js
index dc3cd106..f71a6ec7 100644
--- a/store/playlist.js
+++ b/store/playlist.js
@@ -49,15 +49,24 @@ export const mutations = {
 }
 
 export const actions = {
-    async getPlaylist ({ commit, dispatch, state }, { dayStart, date }) {
+    async getPlaylist ({ commit, dispatch, state, rootState }, { dayStart, date }) {
+        const timeInSec = this.$timeToSeconds(this.$dayjs().format('HH:mm:ss'))
+        let dateToday = this.$dayjs().format('YYYY-MM-DD')
+
+        if (rootState.config.startInSec > timeInSec) {
+            dateToday = this.$dayjs(dateToday).subtract(1, 'day').format('YYYY-MM-DD')
+        }
+
         const response = await this.$axios.get(`api/player/playlist/?date=${date}`)
 
         if (response.data && response.data.program) {
             commit('UPDATE_PLAYLIST', this.$processPlaylist(dayStart, response.data.program))
 
-            if (date === this.$dayjs().format('YYYY-MM-DD')) {
+            if (date === dateToday) {
                 commit('UPDATE_TODAYS_PLAYLIST', JSON.parse(JSON.stringify(response.data.program)))
                 dispatch('setCurrentClip')
+            } else {
+                commit('SET_CURRENT_CLIP_INDEX', null)
             }
         } else {
             commit('UPDATE_PLAYLIST', [])
@@ -65,26 +74,30 @@ export const actions = {
     },
 
     setCurrentClip ({ commit, dispatch, state, rootState }) {
-        let start
-        if (rootState.config.configPlayout.playlist.day_start) {
-            start = this.$timeToSeconds(rootState.config.configPlayout.playlist.day_start)
+        let begin
+        let lastTime = this.$timeToSeconds(this.$dayjs().format('HH:mm:ss'))
+
+        if (rootState.config.startInSec) {
+            begin = rootState.config.startInSec
         } else {
             commit('SET_CURRENT_CLIP', 'day_start is not set, cannot calculate current clip')
             return
         }
 
+        if (lastTime < begin) {
+            lastTime += rootState.config.playlistLength
+        }
+
         for (let i = 0; i < state.playlistToday.length; i++) {
             const duration = state.playlistToday[i].out - state.playlistToday[i].in
 
-            const playTime = this.$timeToSeconds(this.$dayjs().format('HH:mm:ss')) - start
-
             // animate the progress bar
-            if (playTime <= duration) {
-                const progValue = playTime * 100 / duration
+            if (lastTime < begin + duration) {
+                const progValue = (lastTime - begin) * 100 / duration
                 commit('SET_PROGRESS_VALUE', progValue)
                 commit('SET_CURRENT_CLIP', state.playlistToday[i].source)
                 commit('SET_CURRENT_CLIP_INDEX', i)
-                commit('SET_CURRENT_CLIP_START', start)
+                commit('SET_CURRENT_CLIP_START', begin)
                 commit('SET_CURRENT_CLIP_DURATION', duration)
                 commit('SET_CURRENT_CLIP_IN', state.playlistToday[i].in)
                 commit('SET_CURRENT_CLIP_OUT', state.playlistToday[i].out)
@@ -92,23 +105,28 @@ export const actions = {
                 break
             }
 
-            start += duration
+            begin += duration
         }
     },
 
-    animClock ({ commit, dispatch, state }) {
+    animClock ({ commit, dispatch, state, rootState }) {
         const time = this.$dayjs().format('HH:mm:ss')
-        const timeSec = this.$timeToSeconds(time)
-        const playTime = timeSec - state.currentClipStart
-        const progValue = playTime * 100 / state.currentClipDuration
+        let timeSec = this.$timeToSeconds(time)
 
         commit('SET_TIME', time)
 
+        if (timeSec < rootState.config.startInSec) {
+            timeSec += rootState.config.playlistLength
+        }
+
         if (timeSec < state.currentClipStart) {
             return
         }
 
-        // animate the progress bar
+        const playTime = timeSec - state.currentClipStart
+        const progValue = playTime * 100 / state.currentClipDuration
+
+        // set progress bar value
         if (playTime <= state.currentClipDuration && progValue >= 0) {
             commit('SET_PROGRESS_VALUE', progValue)
             commit('SET_TIME_LEFT', this.$secToHMS(state.currentClipDuration - playTime))