Merge branch 'master' into dev
This commit is contained in:
commit
854f9fd70f
@ -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.
|
||||
|
@ -1,5 +1,6 @@
|
||||
#__nuxt, #__layout, #__layout > div, #__layout > div > div {
|
||||
height: 100%
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@font-face{
|
||||
|
687
install.sh
687
install.sh
@ -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 <<EOF > "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 <<EOF > "/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 <<EOF > "/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 <<EOF > 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 <<EOF > 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 <<EOF > 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 <<EOF > ".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
|
@ -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;
|
||||
|
@ -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 }
|
||||
],
|
||||
/*
|
||||
|
308
package-lock.json
generated
308
package-lock.json
generated
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -6,24 +6,39 @@
|
||||
<b-datepicker v-model="listDate" size="sm" class="date-div" offset="-35px" />
|
||||
</b-col>
|
||||
</b-row>
|
||||
<b-card no-body>
|
||||
<b-card no-body class="card-container">
|
||||
<b-tabs pills card vertical>
|
||||
<b-tab title="Playout" active @click="getLog('ffplayout')">
|
||||
<b-container class="log-container">
|
||||
<!-- eslint-disable-next-line -->
|
||||
<pre v-if="currentLog" :inner-html.prop="currentLog | formatStr" class="log-content" />
|
||||
<perfect-scrollbar
|
||||
v-if="currentLog"
|
||||
:options="scrollOP"
|
||||
class="log-content"
|
||||
:inner-html.prop="currentLog | formatStr"
|
||||
/>
|
||||
</b-container>
|
||||
</b-tab>
|
||||
<b-tab title="Decoder" @click="getLog('decoder')">
|
||||
<b-container class="log-container">
|
||||
<!-- eslint-disable-next-line -->
|
||||
<pre v-if="currentLog" :inner-html.prop="currentLog | formatStr" class="log-content" />
|
||||
<perfect-scrollbar
|
||||
v-if="currentLog"
|
||||
:options="scrollOP"
|
||||
class="log-content"
|
||||
:inner-html.prop="currentLog | formatStr"
|
||||
/>
|
||||
</b-container>
|
||||
</b-tab>
|
||||
<b-tab title="Encoder" @click="getLog('encoder')">
|
||||
<b-container class="log-container">
|
||||
<!-- eslint-disable-next-line -->
|
||||
<pre v-if="currentLog" :inner-html.prop="currentLog | formatStr" class="log-content" />
|
||||
<perfect-scrollbar
|
||||
v-if="currentLog"
|
||||
:options="scrollOP"
|
||||
class="log-content"
|
||||
:inner-html.prop="currentLog | formatStr"
|
||||
/>
|
||||
</b-container>
|
||||
</b-tab>
|
||||
</b-tabs>
|
||||
@ -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 {
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.ps__thumb-x {
|
||||
display: inherit !important;
|
||||
}
|
||||
|
||||
.col-auto {
|
||||
width: 122px;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.card-container {
|
||||
height: calc(100% - 90px);
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.card-container > div, .tab-content > .active {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.tab-content {
|
||||
max-width: calc(100% - 122px);
|
||||
width: calc(100% - 122px);
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.log-container {
|
||||
background: #1d2024;
|
||||
max-width: 95%;
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 1em;
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
.log-content {
|
||||
color: #ececec;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-family: monospace;
|
||||
font-size: 13px;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
.log-time {
|
||||
|
@ -31,7 +31,7 @@
|
||||
<splitpanes class="browser-row default-theme pane-row">
|
||||
<pane min-size="20" size="24">
|
||||
<div class="browser-div">
|
||||
<perfect-scrollbar>
|
||||
<perfect-scrollbar :options="scrollOP">
|
||||
<b-list-group class="folder-list">
|
||||
<b-list-group-item
|
||||
v-for="folder in folderTree.tree[1]"
|
||||
@ -67,7 +67,7 @@
|
||||
color="#ff9c36"
|
||||
/>
|
||||
<div class="browser-div">
|
||||
<perfect-scrollbar>
|
||||
<perfect-scrollbar :options="scrollOP">
|
||||
<b-list-group class="files-list">
|
||||
<b-list-group-item
|
||||
v-for="file in folderTree.tree[2]"
|
||||
@ -289,7 +289,10 @@ export default {
|
||||
overallProgress: 0,
|
||||
currentProgress: 0,
|
||||
cancelTokenSource: this.$axios.CancelToken.source(),
|
||||
lastPath: ''
|
||||
lastPath: '',
|
||||
scrollOP: {
|
||||
suppressScrollX: true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -220,9 +220,6 @@
|
||||
</b-col>
|
||||
<b-col class="grabbing">
|
||||
{{ item.source | filename }}
|
||||
<div class="clip-progress">
|
||||
<b-progress v-if="index === currentClipIndex" height="2px" :value="progressValue" />
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="1" class="text-center playlist-input">
|
||||
<b-link @click="showModal(item.source)">
|
||||
@ -298,6 +295,21 @@
|
||||
import { mapState } from 'vuex'
|
||||
import Menu from '@/components/Menu.vue'
|
||||
|
||||
function scrollTo (t) {
|
||||
let child
|
||||
if (t.currentClipIndex === null) {
|
||||
child = document.getElementById('clip_0')
|
||||
} else {
|
||||
child = document.getElementById(`clip_${t.currentClipIndex}`)
|
||||
}
|
||||
|
||||
if (child) {
|
||||
const parent = document.getElementById('scroll-container')
|
||||
const topPos = child.offsetTop
|
||||
parent.scrollTop = topPos - 50
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
name: 'Player',
|
||||
|
||||
@ -324,8 +336,7 @@ export default {
|
||||
videoOptions: {},
|
||||
previewOptions: {},
|
||||
previewComp: null,
|
||||
previewSource: '',
|
||||
autoScroll: true
|
||||
previewSource: ''
|
||||
}
|
||||
},
|
||||
|
||||
@ -347,6 +358,7 @@ export default {
|
||||
watch: {
|
||||
listDate (date) {
|
||||
this.getPlaylist()
|
||||
setTimeout(() => { scrollTo(this) }, 5000)
|
||||
}
|
||||
},
|
||||
|
||||
@ -371,25 +383,26 @@ export default {
|
||||
]
|
||||
}
|
||||
|
||||
const timeInSec = this.$timeToSeconds(this.$dayjs().format('HH:mm:ss'))
|
||||
const listStartSec = this.$timeToSeconds(this.configPlayout.playlist.day_start)
|
||||
|
||||
if (listStartSec > timeInSec) {
|
||||
this.listDate = this.$dayjs(this.listDate).subtract(1, 'day').format('YYYY-MM-DD')
|
||||
}
|
||||
|
||||
await this.getPlaylist()
|
||||
},
|
||||
|
||||
mounted () {
|
||||
if (!process.env.DEV) {
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
this.interval = setInterval(() => {
|
||||
this.$store.dispatch('playlist/animClock')
|
||||
const child = document.getElementById(`clip_${this.currentClipIndex}`)
|
||||
|
||||
if (child && this.autoScroll) {
|
||||
const parent = document.getElementById('scroll-container')
|
||||
const topPos = child.offsetTop
|
||||
parent.scrollTop = topPos - 50
|
||||
this.autoScroll = false
|
||||
}
|
||||
}, 5000)
|
||||
} else {
|
||||
this.$store.dispatch('playlist/animClock')
|
||||
}
|
||||
|
||||
setTimeout(() => { scrollTo(this) }, 4000)
|
||||
},
|
||||
|
||||
beforeDestroy () {
|
||||
@ -707,7 +720,7 @@ export default {
|
||||
}
|
||||
|
||||
.active-playlist-clip {
|
||||
background-color: #49515c !important;
|
||||
background-color: #565e6a !important;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
@ -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)
|
||||
}
|
||||
},
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user