From d793e47e6cbd727a451eceaaf672d04cfb5b1012 Mon Sep 17 00:00:00 2001 From: Pavel Muhortov Date: Thu, 22 Jun 2023 12:48:47 +0300 Subject: [PATCH] converter.sh absorbed cctv-scheduler.py --- .gitignore | 1 + .vscode/launch.json | 13 + README.md | 82 +- archive/0.3/README.md | 199 +++ archive/0.3/cctv-scheduler.conf | 112 ++ archive/0.3/cctv-scheduler.py | 1632 ++++++++++++++++++ converter.conf => archive/0.3/converter.conf | 0 converter.sh => archive/0.3/converter.sh | 0 archive/0.3/publisher-template-page-1007.xml | 525 ++++++ archive/0.3/publisher.conf | 86 + archive/0.3/publisher.sh | 599 +++++++ cctv-scheduler.conf | 26 +- cctv-scheduler.py | 454 ++++- info/images/cctv-scheduler-0.4.png | Bin 0 -> 368622 bytes 14 files changed, 3632 insertions(+), 97 deletions(-) create mode 100644 archive/0.3/README.md create mode 100755 archive/0.3/cctv-scheduler.conf create mode 100755 archive/0.3/cctv-scheduler.py rename converter.conf => archive/0.3/converter.conf (100%) rename converter.sh => archive/0.3/converter.sh (100%) create mode 100644 archive/0.3/publisher-template-page-1007.xml create mode 100644 archive/0.3/publisher.conf create mode 100644 archive/0.3/publisher.sh create mode 100755 info/images/cctv-scheduler-0.4.png diff --git a/.gitignore b/.gitignore index 7f8262b..d01ece3 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ dist/ downloads/ test/ tmp/ +temp/ var/ *.log *.list \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 28e25af..3ec4bde 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -30,6 +30,19 @@ ], "console": "integratedTerminal", "justMyCode": true + }, + { + "name": "Python: cctv-scheduler -c -w -3", + "type": "python", + "request": "launch", + "program": "${file}", + "args": [ + "-c", + "-w", + "-1" + ], + "console": "integratedTerminal", + "justMyCode": true } ] } \ No newline at end of file diff --git a/README.md b/README.md index 21d3a03..0b9631d 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,11 @@ PTZ IP-Camera management ____ - [`cctv-scheduler.py`](https://git.hmp.today/pavel.muhortov/cctv-scheduler#cctv-scheduler-py) -- [`converter.sh`](https://git.hmp.today/pavel.muhortov/cctv-scheduler#converter-sh) - [`publisher.sh`](https://git.hmp.today/pavel.muhortov/cctv-scheduler#publisher-sh) ____ -![cctv-scheduler](info/images/cctv-scheduler-0.3.png) +![cctv-scheduler](info/images/cctv-scheduler-0.4.png) ## `Installation` @@ -31,8 +30,6 @@ Download scripts and configs. ```bash wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/cctv-scheduler.py -O /home/user/cctv-scheduler/cctv-scheduler.py wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/cctv-scheduler.conf -O /home/user/cctv-scheduler/cctv-scheduler.conf -wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/converter.sh -O /home/user/cctv-scheduler/converter.sh -wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/converter.conf -O /home/user/cctv-scheduler/converter.conf wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/publisher.sh -O /home/user/cctv-scheduler/publisher.sh wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/publisher.conf -O /home/user/cctv-scheduler/publisher.conf wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/publisher-template-page-1007.xml -O /home/user/cctv-scheduler/publisher-template-page-1007.xml @@ -44,7 +41,6 @@ Edit configs. ```bash nano /home/user/cctv-scheduler/cctv-scheduler.conf -nano /home/user/cctv-scheduler/converter.conf nano /home/user/cctv-scheduler/publisher.conf ``` @@ -59,59 +55,24 @@ crontab -e ## `cctv-scheduler`.py **Description:** -> [Hikvision](https://git.hmp.today/pavel.muhortov/cctv-scheduler/src/branch/master/info/hikvision/manual/isapi.pdf) PTZ IP-Camera management. Media streaming. +> [Hikvision](https://git.hmp.today/pavel.muhortov/cctv-scheduler/src/branch/master/info/hikvision/manual/isapi.pdf) PTZ IP-Camera management. Media streaming. Images to video converting. > Additionally: > > - getting temperature from DS18B20 over SSH, > - saving pictures to FTP. +> - converting picture collection to video. > -> This is only a local "proof of conept" for testing and debugging. +> This is only a local "proof of concept" for testing and debugging. **Dependencies:** > > - [Python 3](https://www.python.org/downloads/) (tested version 3.9.5 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) > - [paramiko](https://www.paramiko.org/) Python 3 module (tested version 3.1.0) > - [ffmpeg](https://ffmpeg.org) (tested version 4.3.4 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) - -| PARAMETERS | DESCRIPTION | DEFAULT| -|-------------|-------------|--------| -|**[-h]**|print help and exit|| -|**[-b, --broadcast]**|streaming media to destination|`None`| -|**[-s, --sequences]**|run sequences from config file|`None`| -|**[--config]**|custom configuration file path|`./cctv-scheduler.conf`| - -Example usage in terminal with make the script executable: - -```bash -chmod u+x ./cctv-scheduler.py -./cctv-scheduler.py -s --config /home/user/cctv-scheduler/cctv-scheduler.conf -``` - -Example usage with cron: - -```bash -# crontab -e -* * * * * /usr/bin/python3 /home/user/cctv-scheduler/cctv-scheduler.py -b -0 * * * * /usr/bin/python3 /home/user/cctv-scheduler/cctv-scheduler.py -s -``` - -____ - -## `converter`.sh - -**Description:** -> JPEG to MP4 converter. -> -> This is only a local "proof of conept" for testing and debugging. - -**Dependencies:** -> -> - [bash](https://www.gnu.org/software/bash/) (tested version 5.1.4 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) -> - [ffmpeg](https://ffmpeg.org/download.html) (tested version 4.3.4 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) -> - filesystem organization: +> - specified record pictures filesystem organization > >```bash -> # filesystem organisation example +> # record pictures filesystem organization example >/root/ > /2022/ > /12/ @@ -130,26 +91,35 @@ ____ > /image-02_2023.01.03_time.jpeg >``` -| POSITION | PARAMETERS | DESCRIPTION | DEFAULT | -|-----------|--------------|------------------------|---------------| -| 1 | **[qn]** |execution without pauses|| -| 2 | **[/path/to/conf]** |path to config| `./converter.conf` | -| 3 | **[-d\|-w\|-m\|-y]** |periods: '' - today \| '-d' - yesterday \| '-w' - last week \| '-m' - last month \| '-y' - last year|`''`| +| PARAMETERS | DESCRIPTION | DEFAULT| +|-------------|-------------|--------| +|**[-h]**|print help and exit|| +|**[-b, --broadcast]**|streaming media to destination|`None`| +|**[-s, --sequences]**|run sequences from config file|`None`| +|**[--config]**|custom configuration file path|`./cctv-scheduler.conf`| +|**[-c, --converter]**|convert JPEG collection to MP4|`None`| +|**[-d, --day]**|day in amount of days from today, for which the publication or conversion is made|`0`| +|**[-w, --week]**|week in amount of weeks from today, for which the publication or conversion is made|`0`| +|**[-m, --month]**|month in amount of months from today, for which the publication or conversion is made|`0`| +|**[-y, --year]**|year in amount of years from today, for which the publication or conversion is made|`0`| -Example usage in terminal with bash for today's MP4 making: +Example usage in terminal with make the script executable: ```bash -bash ./converter.sh - ./converter.conf +chmod u+x ./cctv-scheduler.py +./cctv-scheduler.py -s --config /home/user/cctv-scheduler/cctv-scheduler.conf ``` Example usage with cron: ```bash # crontab -e -1 0 * * * bash /home/user/cctv-scheduler/converter.sh qn - -d -7 0 * * 1 bash /home/user/cctv-scheduler/converter.sh qn - -w -30 0 1 * * bash /home/user/cctv-scheduler/converter.sh qn - -m -36 0 1 1 * bash /home/user/cctv-scheduler/converter.sh qn - -y +* * * * * /usr/bin/python3 /home/user/cctv-scheduler/cctv-scheduler.py -b +0 * * * * /usr/bin/python3 /home/user/cctv-scheduler/cctv-scheduler.py -s +1 0 * * * /usr/bin/python3 /home/user/cctv-scheduler/cctv-scheduler.py -c -d -1 +7 0 * * 1 /usr/bin/python3 /home/user/cctv-scheduler/cctv-scheduler.py -c -w -1 +30 0 1 * * /usr/bin/python3 /home/user/cctv-scheduler/cctv-scheduler.py -c -m -1 +36 0 1 1 * /usr/bin/python3 /home/user/cctv-scheduler/cctv-scheduler.py -c -y -1 ``` ____ diff --git a/archive/0.3/README.md b/archive/0.3/README.md new file mode 100644 index 0000000..21d3a03 --- /dev/null +++ b/archive/0.3/README.md @@ -0,0 +1,199 @@ +# cctv-scheduler + +PTZ IP-Camera management +____ + +- [`cctv-scheduler.py`](https://git.hmp.today/pavel.muhortov/cctv-scheduler#cctv-scheduler-py) +- [`converter.sh`](https://git.hmp.today/pavel.muhortov/cctv-scheduler#converter-sh) +- [`publisher.sh`](https://git.hmp.today/pavel.muhortov/cctv-scheduler#publisher-sh) + +____ + +![cctv-scheduler](info/images/cctv-scheduler-0.3.png) + +## `Installation` + +### `Requirements` + +Cameras settings: +> +> - Configuration -> System -> Security -> Authentication -> RTSP Authentication: digest/basic +> - Configuration -> System -> Security -> Authentication -> WEB Authentication: digest/basic +> - Configuration -> Network -> Advanced Settings -> Integration Protocol -> Enable Hikvision-CGI: Enabled +> - Configuration -> Network -> Advanced Settings -> Integration Protocol -> Hikvision-CGI Authentication: digest/basic + +Look at the description of dependencies and install the necessary. + +### `Downloading` + +Download scripts and configs. + +```bash +wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/cctv-scheduler.py -O /home/user/cctv-scheduler/cctv-scheduler.py +wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/cctv-scheduler.conf -O /home/user/cctv-scheduler/cctv-scheduler.conf +wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/converter.sh -O /home/user/cctv-scheduler/converter.sh +wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/converter.conf -O /home/user/cctv-scheduler/converter.conf +wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/publisher.sh -O /home/user/cctv-scheduler/publisher.sh +wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/publisher.conf -O /home/user/cctv-scheduler/publisher.conf +wget https://git.hmp.today/pavel.muhortov/cctv-scheduler/raw/branch/master/publisher-template-page-1007.xml -O /home/user/cctv-scheduler/publisher-template-page-1007.xml +``` + +### `Configuration` + +Edit configs. + +```bash +nano /home/user/cctv-scheduler/cctv-scheduler.conf +nano /home/user/cctv-scheduler/converter.conf +nano /home/user/cctv-scheduler/publisher.conf +``` + +### `Scheduler` + +Look at examples and edit scheduler tasks: + +```bash +crontab -e +``` + +## `cctv-scheduler`.py + +**Description:** +> [Hikvision](https://git.hmp.today/pavel.muhortov/cctv-scheduler/src/branch/master/info/hikvision/manual/isapi.pdf) PTZ IP-Camera management. Media streaming. +> Additionally: +> +> - getting temperature from DS18B20 over SSH, +> - saving pictures to FTP. +> +> This is only a local "proof of conept" for testing and debugging. + +**Dependencies:** +> +> - [Python 3](https://www.python.org/downloads/) (tested version 3.9.5 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) +> - [paramiko](https://www.paramiko.org/) Python 3 module (tested version 3.1.0) +> - [ffmpeg](https://ffmpeg.org) (tested version 4.3.4 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) + +| PARAMETERS | DESCRIPTION | DEFAULT| +|-------------|-------------|--------| +|**[-h]**|print help and exit|| +|**[-b, --broadcast]**|streaming media to destination|`None`| +|**[-s, --sequences]**|run sequences from config file|`None`| +|**[--config]**|custom configuration file path|`./cctv-scheduler.conf`| + +Example usage in terminal with make the script executable: + +```bash +chmod u+x ./cctv-scheduler.py +./cctv-scheduler.py -s --config /home/user/cctv-scheduler/cctv-scheduler.conf +``` + +Example usage with cron: + +```bash +# crontab -e +* * * * * /usr/bin/python3 /home/user/cctv-scheduler/cctv-scheduler.py -b +0 * * * * /usr/bin/python3 /home/user/cctv-scheduler/cctv-scheduler.py -s +``` + +____ + +## `converter`.sh + +**Description:** +> JPEG to MP4 converter. +> +> This is only a local "proof of conept" for testing and debugging. + +**Dependencies:** +> +> - [bash](https://www.gnu.org/software/bash/) (tested version 5.1.4 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) +> - [ffmpeg](https://ffmpeg.org/download.html) (tested version 4.3.4 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) +> - filesystem organization: +> +>```bash +> # filesystem organisation example +>/root/ +> /2022/ +> /12/ +> /52/ +> /31/ +> /image-01_2022.12.31_time.jpeg +> /image-02_2022.12.31_time.jpeg +> /2023/ +> /01/ +> /01/ +> /02/ +> /image-01_2023.01.02_time.jpeg +> /image-02_2023.01.02_time.jpeg +> /03/ +> /image-01_2023.01.03_time.jpeg +> /image-02_2023.01.03_time.jpeg +>``` + +| POSITION | PARAMETERS | DESCRIPTION | DEFAULT | +|-----------|--------------|------------------------|---------------| +| 1 | **[qn]** |execution without pauses|| +| 2 | **[/path/to/conf]** |path to config| `./converter.conf` | +| 3 | **[-d\|-w\|-m\|-y]** |periods: '' - today \| '-d' - yesterday \| '-w' - last week \| '-m' - last month \| '-y' - last year|`''`| + +Example usage in terminal with bash for today's MP4 making: + +```bash +bash ./converter.sh - ./converter.conf +``` + +Example usage with cron: + +```bash +# crontab -e +1 0 * * * bash /home/user/cctv-scheduler/converter.sh qn - -d +7 0 * * 1 bash /home/user/cctv-scheduler/converter.sh qn - -w +30 0 1 * * bash /home/user/cctv-scheduler/converter.sh qn - -m +36 0 1 1 * bash /home/user/cctv-scheduler/converter.sh qn - -y +``` + +____ + +## `publisher`.sh + +**Description:** +> Uploading MP4 to [Wordpress](https://wordpress.com/) and [Telegram](https://web.telegram.org/). +> Additionally: +> +> - editing [Wordpress](https://codex.wordpress.org/XML-RPC_WordPress_API) page from template +> - recompressing video if size [over 50MB](https://core.telegram.org/bots/api#sendvideo) +> +> This is only a local "proof of conept" for testing and debugging. + +**Dependencies:** +> +> - [bash](https://www.gnu.org/software/bash/) (tested version 5.1.4 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) +> - [curl](https://curl.se/download.html) (tested version 7.74 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) +> - [ffmpeg](https://ffmpeg.org/download.html) (tested version 4.3.4 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) +> - [libxml2-utils](https://gitlab.gnome.org/GNOME/libxml2) (tested version 2.9.10 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) +> - [jq](https://stedolan.github.io/jq/download/) (tested version 1.6 on [Debian GNU/Linux 11](http://ftp.debian.org/debian/dists/bullseye/)) +> + +| POSITION | PARAMETERS | DESCRIPTION | DEFAULT | +|-----------|--------------|------------------------|---------------| +| 1 | **[qn]** |execution without pauses|| +| 2 | **[/path/to/conf]** |path to config| `./publisher.conf` | +| 3 | **[-d\|-w\|-m\|-y]** |periods: '' - 0 day \| '-d' - -X day \| '-w' - -X week \| '-m' - -X month \| '-y' - -X year|`''`| +| 4 | **[1\|2\|3..XXX]** |multiplier for period: '' - 1 day\|week\|month\|year|`1`| +| 5 | **[--onlytg\|--onlywp]** |'--onlytg' - only publish to Telegram \|'--onlywp' - only publish to Wordpress|| + +Example usage in terminal with bash for publish to Telegram today's MP4: + +```bash +bash ./publisher.sh - ./publisher.conf - - - - --onlytg +``` + +Example usage with cron: + +```bash +# crontab -e +1 1 * * * bash /home/user/cctv-scheduler/publisher.sh qn - -d +7 1 * * 1 bash /home/user/cctv-scheduler/publisher.sh qn - -w +30 1 1 * * bash /home/user/cctv-scheduler/publisher.sh qn - -m +36 1 1 1 * bash /home/user/cctv-scheduler/publisher.sh qn - -y +``` diff --git a/archive/0.3/cctv-scheduler.conf b/archive/0.3/cctv-scheduler.conf new file mode 100755 index 0000000..702868f --- /dev/null +++ b/archive/0.3/cctv-scheduler.conf @@ -0,0 +1,112 @@ +[common] +# By default, a temporary files directory is created in the same path where the script is located. +# If you need change it, uncomment the parameter and set the path you want. +#temp_path = /tmp/cctv-scheduler +# +# By default, logs use the same directory where the script is located. +# If you need change it, uncomment the parameter and set the path you want. +#log_root = /var/log/cctv-scheduler +# +# The default log level is "INFO". +# If you get errors or want to change the logging level, uncomment the parameter and set the level you want: +# DEBUG, INFO, WARNING, ERROR, CRITICAL. +#log_level = DEBUG + + +[enable-broadcast] +# List the broadcast block names. Only blocks with the TRUE value will be used. +camera.test.local = true + + +[enable-sequences] +# List the sequence/camera block names. Only blocks with the TRUE value will be used. +camera.test.local = true + + +[enable-sensors] +# List the sensor block names. Only blocks with the TRUE value will be used. +sensor.test.local = true + + +[broadcast-config:camera.test.local] +# Broadcast parameter description block always starts with "broadcast-config:". +src = rtsp://user:pass@192.168.254.253:554/Streaming/Channels/101,http://radio.fm:8000/stream.mp3 +dst = rtp://239.0.0.1:5554 +# Optionality you can change video stream framerate. +#fps = 25 +# +# Optionality you can set YouTube recommended preset: +# 240p, 360p, 480p, 720p, 1080p, 1440p, 2160p. +#preset = 1080p +# +# By default ffmpeg expected in /usr/bin/ffmpeg or C:\Program Files\ffmpeg\bin\ffmpeg.exe. +# If you need change it, uncomment the parameter and set the path you want. +#ffpath = /usr/bin/ffmpeg +# +# If you get program freezes because your network unstable, uncomment the parameter. +#watchdog = true +# +# By default, watchdog waits 5 seconds before terminating the program. +# If you need change it, uncomment the parameter and set the path you want. +#watchsec = 15 +# +# If you use crontab or other scheduler to run, uncomment the parameter to prevent process overlap. +#onlyonce = true + + +[sensor-config:sensor.test.local] +# Remote host's sensor parameter description block always starts with "sensor-config:". +hostname = 192.168.254.252 +username = user +userpass = pass +# To recognize options for polling a sensor, you must specify the type of sensor. +# Supported types: +# ds18b20 +nodetype = ds18b20 +nodename = 28-1a2b3c4d5e6f + + +[camera-config:camera.test.local] +# Camera parameter description block always starts with "camera-config:". +hostname = 192.168.254.253 +username = user +userpass = pass +# If a record directory on a remote host is used, a username and password must be specified. +# Supported protocols: +# FTP, SFTP. +records_root_path = ftp://192.168.254.254/Records/camera.test.local +records_root_user = user +records_root_pass = pass + + +[camera-sequences:camera.test.local] +# Camera sequence description block always starts with "camera-sequences:". +# Place only the sequence of PTZ-actions in this block! +# Variable name can be anything. Only 'downloadjpeg' is using this for filename prefix. +# Available actions: +# setcamerapos, setcameramov, settextonosd, downloadjpeg, capabilities, getcamerapos, +# setptzmovyyu, setptzmovyyd, setptzmovxxl, setptzmovxxr, setptzmovzzi, setptzmovzzo, +# setptzpreset, setptztostop, setmovtohome, setposashome, rebootcamera. +# +# Format (spaces are used for readability only): +# name = action, x, y, zoom, preset, speed, d(ms), w(s), text, notes or anything +step001 = capabilities, -, -, -, -, -, -, 3, , +step002 = getcamerapos, -, -, -, -, -, -, 3, , +step011 = setmovtohome, -, -, -, -, -, -, 15, , +step021 = setptzmovyyd, -, -, -, -, 2, -, 5, , 'speed: 1..7' +step022 = setptzmovyyu, -, -, -, -, 4, -, 3, , 'speed: 1..7' +step023 = setptzmovxxl, -, -, -, -, 4, -, 3, , 'speed: 1..7' +step024 = setptzmovxxr, -, -, -, -, 2, -, 5, , 'speed: 1..7' +step025 = setptzmovzzi, -, -, -, -, 7, -, 3, , 'speed: 1..7' +step026 = setptzmovzzo, -, -, -, -, 7, -, 3, , 'speed: 1..7' +step027 = setptztostop, -, -, -, -, -, -, 3, , +step031 = setptzpreset, -, -, -, 2, 1, -, 15, , 'speed: 1..7' +step041 = setcameramov, 33, 33, 66, -, -, -, 5, , 'x: -100..100, y: -100..100, z: -100..100, duration: 0..180000' +step042 = setcameramov, -66, -66, -99, -, -, 5000, 0, , 'x: -100..100, y: -100..100, z: -100..100, duration: 0..180000' +step043 = setcamerapos, 0, 0, 0, -, -, -, 15, , 'x: 0..3600, y: -900..2700, z: 0..1000' +step051 = setposashome, -, -, -, -, -, -, 3.5, , +step061 = settextonosd, 0, 0, -, -, -, -, 3, hello, 'x|y: osd text position, text: text for osd without quotes or commas' +step062 = settextonosd, 0, 0, -, -, -, -, 3, sensor-config:sensor.test.local, 'if a sensor configuration is specified, the sensor value is used instead of text' +step063 = settextonosd, 0, 0, -, -, -, -, 3, , 'an empty text value is used to clear the osd' +step071 = downloadjpeg, 1280, 720, -, -, -, -, 5, , 'name: filename prefix, x|y: camera width|height resolution' +step999 = rebootcamera, -, -, -, -, -, -, 120, , diff --git a/archive/0.3/cctv-scheduler.py b/archive/0.3/cctv-scheduler.py new file mode 100755 index 0000000..6463e41 --- /dev/null +++ b/archive/0.3/cctv-scheduler.py @@ -0,0 +1,1632 @@ +#!/usr/bin/env python3 + + +import logging +import urllib.request +from argparse import ArgumentParser +from datetime import datetime +from ftplib import FTP +from multiprocessing import Process, Queue +from os import path, sep, makedirs, remove, replace, environ +from subprocess import Popen, PIPE, STDOUT +from sys import platform +from time import sleep +from paramiko import SSHClient, AutoAddPolicy + + +class Parse: + """Parser of configs, arguments, parameters. + """ + def __init__(self, parameters, block: str = None) -> None: + """Object constructor. + + Args: + parameters: dictionary as "key":"value" or + ArgumentParser class object or + string path to the file or + string as "var1=val1;var2=val2". + block (str, optional): name of target block from text. Defaults to None. + """ + self.path = '' + self.data = {} + if type(parameters) is dict: + self._dict2dict(parameters) + if type(parameters) is ArgumentParser: + self._dict2dict(self.argv2dict(parameters)) + if type(parameters) is str: + if path.exists(parameters): + self._dict2dict( + self.strs2dict( + self.conf2strs(parameters), + block + ) + ) + self.path = parameters + else: + self._dict2dict(self.strs2dict(parameters, block)) + + def __str__(self) -> str: + """Overrides method for print(object). + + Returns: + str: string with contents of the object's dictionary. + """ + string = '' + for key, val in self.data.items(): + string += str(type(val)) + ' ' + str(key) + ' = ' + str(val) + '\n' + return string + + def _dict2dict(self, dictionary: dict) -> None: + """Updates or adds dictionary data. + + Args: + dictionary (dict): dictionary as "key":"value". + """ + self.data.update(dictionary) + + def expand(self, store: str = None) -> dict: + """Expand dictionary "key":"name.conf" to dictionary "key":{subkey: subval}. + + Args: + store (str, optional): path to directory with name.conf. Defaults to None. + + Returns: + dict: expanded dictionary as "key":{subkey: subval}. + """ + for key in self.data: + if store: + config = store + sep + self.data[key] + else: + config = self.data[key] + with open(config) as file: + self.data[key] = Parse(file.read()).data + return self.data + + @classmethod + def argv2dict(cls, parser: ArgumentParser) -> dict: + """Converts startup arguments to a dictionary. + + Args: + parser (ArgumentParser): argparse.ArgumentParser class object. + + Returns: + dict: dictionary as "key":"value". + """ + parser = ArgumentParser(add_help=False, parents=[parser]) + return vars(parser.parse_args()) + + @classmethod + def conf2strs(cls, config: str) -> str: + """Builds a dictionary from a file containing parameters. + + Args: + config (str): path to the config file. + + Returns: + str: string as "var1=val1;\nvar2=val2;". + """ + with open(config) as file: + raw = file.read() + strs = '' + for line in raw.splitlines(): + if not line.lstrip().startswith('#'): + strs += line + '\n' + return strs + + @classmethod + def strs2dict(cls, strings: str, blockname: str) -> dict: + """Builds a dictionary from a strings containing parameters. + + Args: + strings (str): string as "var1=val1;var2=val2;". + blockname (str): name of target block from text. + + Returns: + dict: dictionary as "key":"value". + """ + dictionary = {} + if blockname: + strings = cls.block(blockname, strings) + for line in strings.replace('\n', ';').split(';'): + if not line.lstrip().startswith('#') and "=" in line: + dictionary[line.split('=')[0].strip()] = line.split('=')[1].strip().split(';')[0].strip() + return dictionary + + @classmethod + def str2bool(cls, value: str) -> bool: + """Converts a string value to boolean. + + Args: + value (str): string containing "true" or "false", "yes" or "no", "1" or "0". + + Returns: + bool: bool True or False. + """ + return str(value).lower() in ("true", "yes", "1") + + @classmethod + def block(cls, blockname: str, text: str) -> str: + """Cuts a block of text between line [blockname] and line [next block] or EOF. + + Args: + blockname (str): string in [] after which the block starts. + text (str): string of text from which the block is needed. + + Returns: + str: string of text between line [block name] and line [next block]. + """ + level = 1 + save = False + result = '' + for line in text.splitlines(): + if line.startswith('[') and blockname in line: + level = line.count('[') + save = True + elif line.startswith('[') and '['*level in line: + save = False + elif save: + result += line + '\n' + return result + + +class Connect: + """Set of connection methods (functions) for various protocols. + """ + @staticmethod + def http( + url: str, method: str = 'GET', + username: str = '', password: str = '', authtype: str = None, + contenttype: str = 'text/plain', contentdata: str = '' + ) -> str: + """Handling HTTP request. + + Args: + url (str): request url. + method (str, optional): HTTP request method. Defaults to 'GET'. + username (str, optional): username for url authentication. Defaults to ''. + password (str, optional): password for url authentication. Defaults to ''. + authtype (str, optional): digest|basic authentication type. Defaults to None. + contenttype (str, optional): 'Content-Type' header. Defaults to 'text/plain'. + contentdata (str, optional): content data. Defaults to ''. + + Returns: + str: HTTP response or 'ERROR'. + """ + + # Preparing authorization + if authtype: + pswd = urllib.request.HTTPPasswordMgrWithDefaultRealm() + pswd.add_password(None, url, username, password) + if authtype == 'basic': + auth = urllib.request.HTTPBasicAuthHandler(pswd) + if authtype == 'digest': + auth = urllib.request.HTTPDigestAuthHandler(pswd) + urllib.request.install_opener(urllib.request.build_opener(auth)) + + # Preparing request + request = urllib.request.Request(url=url, data=bytes(contentdata.encode('utf-8')), method=method) + request.add_header('Content-Type', contenttype) + + # Response + try: + response = urllib.request.urlopen(request).read() + logging.debug( + msg='' + + '\n' + 'uri: ' + url + + '\n' + 'method: ' + method + + '\n' + 'username: ' + username + + '\n' + 'password: ' + password + + '\n' + 'authtype: ' + authtype + + '\n' + 'content-type: ' + contenttype + + '\n' + 'content-data: ' + contentdata + ) + if response.startswith(b'\xff\xd8'): + return response + else: + return str(response.decode('utf-8')) + except Exception as error: + logging.debug(msg='\n' + 'error: ' + str(error)) + return 'ERROR' + + @staticmethod + def ssh_commands(command: str, hostname: str, username: str, password: str, port: int = 22) -> str: + """Handling SSH command executing. + + Args: + command (str): command for executing. + hostname (str): remote hostname or ip address. + username (str): remote host username. + password (str): remote host password. + port (int, optional): remote host connection port. Defaults to 22. + + Returns: + str: terminal response or 'ERROR'. + """ + client = SSHClient() + client.set_missing_host_key_policy(AutoAddPolicy()) + try: + client.connect(hostname=hostname, username=username, password=password, port=port) + stdin, stdout, stderr = client.exec_command(command=command, get_pty=True) + if 'sudo' in command: + stdin.write(password + '\n') + stdin.flush() + stdout.flush() + data = stdout.read() + stderr.read() + client.close() + return data.decode('utf-8') + except Exception as error: + logging.debug( + msg='' + + '\n' + 'host: ' + hostname + ':' + str(port) + + '\n' + 'user: ' + username + + '\n' + 'pass: ' + password + + '\n' + 'command: ' + command + + '\n' + 'error: ' + str(error) + ) + return 'ERROR' + + @staticmethod + def ssh_put_file(src_file: str, dst_file: str, hostname: str, username: str, password: str, port: int = 22) -> str: + """Handling SFTP upload file. + + Args: + src_file (str): /local/path/to/file. + dst_file (str): /remote/path/to/file. + hostname (str): remote hostname or ip address. + username (str): remote host username. + password (str): remote host password. + port (int, optional): remote host connection port. Defaults to 22. + + Returns: + str: '/remote/path/to/file' or 'ERROR'. + """ + client = SSHClient() + client.set_missing_host_key_policy(AutoAddPolicy()) + try: + client.connect(hostname=hostname, username=username, password=password, port=port) + client.exec_command('mkdir -p ' + path.dirname(dst_file)) + try: + sftp = client.open_sftp() + sftp.put(localpath=src_file, remotepath=dst_file) + sftp.stat(dst_file) + sftp.close() + return dst_file + except Exception as error: + logging.debug( + msg='' + + '\n' + 'dst_file: ' + dst_file + + '\n' + 'error: ' + str(error) + ) + return 'ERROR' + except Exception as error: + logging.debug( + msg='' + + '\n' + 'host: ' + hostname + ':' + str(port) + + '\n' + 'user: ' + username + + '\n' + 'pass: ' + password + + '\n' + 'src_file: ' + src_file + + '\n' + 'dst_file: ' + dst_file + + '\n' + 'error: ' + str(error) + ) + return 'ERROR' + ''' + @staticmethod + def ssh_get_file(src_file: str, dst_file: str, hostname: str, username: str, password: str, port: int = 22) -> str: + """Handling SFTP download file. + + Args: + src_file (str): /remote/path/to/file. + dst_file (str): /local/path/to/file. + hostname (str): remote hostname or ip address. + username (str): remote host username. + password (str): remote host password. + port (int, optional): remote host connection port. Defaults to 22. + + Returns: + str: '/local/path/to/file' or 'ERROR'. + """ + client = SSHClient() + client.set_missing_host_key_policy(AutoAddPolicy()) + try: + client.connect(hostname=hostname, username=username, password=password, port=port) + with client.open_sftp() as sftp: + sftp.get(remotepath=src_file, localpath=dst_file) + client.close() + except Exception as error: + logging.debug( + msg='' + + '\n' + 'host: ' + hostname + ':' + str(port) + + '\n' + 'user: ' + username + + '\n' + 'pass: ' + password + + '\n' + 'src_file: ' + src_file + + '\n' + 'dst_file: ' + dst_file + + '\n' + 'error: ' + str(error) + ) + return 'ERROR' + ''' + @staticmethod + def ftp_put_file(src_file: str, dst_file: str, hostname: str, username: str, password: str) -> bool: + dst_path = dst_file.split('/')[:-1] + ftp = FTP(host=hostname) + try: + ftp.login(user=username, passwd=password) + for path_item in dst_path: + if path_item.strip() == '': + continue + path_item = path_item.replace('/', '') + try: + ftp.cwd(path_item) + except Exception: + ftp.mkd(path_item) + ftp.cwd(path_item) + except Exception: + pass + + with open(src_file, "rb") as file: + ftp.storbinary(f"STOR {dst_file}", file) + ftp.quit() + return True + ''' + @staticmethod + def ftp_get_file(src_file: str, dst_file: str, hostname: str, username: str, password: str): + ftp = FTP(host=hostname) + try: + ftp.login(user=username, passwd=password) + with open(dst_file, "wb") as file: + ftp.retrbinary(f"RETR {src_file}", file.write) + ftp.quit() + except Exception: + pass + ''' + ''' + @staticmethod + def xmlrpc(): + pass + ''' + + +class HikISAPI(Connect): + """Representing Hikvision device with ISAPI. + The class inherits the necessary connection methods of the Connect class + """ + def __init__( + self, + hostname: str, + username: str, userpass: str, + authtype: str = 'digest', + hostport: int = 80, protocol: str = 'http', + channel: int = 101, videoid: int = 1 + ) -> None: + """Object constructor. + + Args: + hostname (str): camera hostname or ip address. + username (str): camera admin username. + userpass (str): camera admin password. + authtype (str, optional): digest|basic camera authentication type. Defaults to 'digest'. + hostport (int, optional): camera connection port. Defaults to 80. + protocol (str, optional): camera connection protocol. Defaults to 'http'. + channel (int, optional): camera channel id. Defaults to 101. + videoid (int, optional): camera video id. Defaults to 1. + """ + self._host = hostname + self._port = hostport + self._user = username + self._pswd = userpass + self._auth = authtype + self._prot = protocol + self._chan = channel + self._viid = videoid + + def __call( + self, + url: str, method: str = 'GET', + contenttype: str = 'application/x-www-form-urlencoded', + contentdata: str = '' + ) -> str: + """Send request to camera. + + Args: + url (str): API path for request. + method (str, optional): HTTP request method. Defaults to 'GET'. + contenttype (str, optional): Content-Type header. Defaults to 'application/x-www-form-urlencoded'. + contentdata (str, optional): data for send with request. Defaults to ''. + + Returns: + str: HTTP response content. + """ + return self.http( + url=url, method=method, + username=self._user, password=self._pswd, authtype=self._auth, + contenttype=contenttype, contentdata=contentdata + ) + + def capabilities(self) -> bool: + """Get camera capabilities. + + Returns: + bool: True if successed. Printing a response with a logger at the INFO level. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/ISAPI/PTZCtrl/channels/" + str(self._viid) + "/capabilities" + ) + response = self.__call(url=url, method='GET') + if response != 'ERROR': + logging.info(msg='\n' + response + '\n') + return True + else: + return False + + def downloadjpeg(self, dst_file: str = path.splitext(__file__)[0] + '.jpeg', x: int = 1920, y: int = 1080) -> bool: + """Get static picture from camera. + + Args: + dst_file (str, optional): absolute path of picture to save. Defaults to scriptname+'.jpeg'. + x (int, optional): picture width. Defaults to 1920. + y (int, optional): picture height. Defaults to 1080. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/Streaming/channels/" + str(self._viid) + + "/picture?snapShotImageType=JPEG&videoResolutionWidth=" + + str(x) + "&videoResolutionHeight=" + str(y) + ) + with open(dst_file, "wb") as file: + response = self.__call(url=url, method='GET') + if response != 'ERROR': + file.write(response) + logging.debug(msg='\n' + dst_file + '\n') + return True + else: + return False + + def getcamerapos(self) -> bool: + """Get current camera position. + + Returns: + bool: True if successed. Printing a response with a logger at the INFO level. + """ + url = (self._prot + '://' + self._host + ':' + str(self._port) + + "/ISAPI/PTZCtrl/channels/" + str(self._chan) + "/status") + response = self.__call(url=url, method='GET') + if response != 'ERROR': + logging.info(msg='\n' + response + '\n') + return True + else: + return False + + def rebootcamera(self) -> bool: + """Set camera reboot command. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/ISAPI/System/reboot" + ) + response = self.__call(url=url, method="PUT") + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setptzmovyyu(self, speed: int = 1) -> bool: + """Start camera moving to up. + + Args: + speed (int, optional): moving speed from 1 to 7. Defaults to 1. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/PTZ/channels/" + str(self._viid) + + "/PTZControl?command=TILT_UP&speed=" + str(speed) + + "&mode=start" + ) + response = self.__call(url=url, method='GET') + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setptzmovyyd(self, speed: int = 1) -> bool: + """Start camera moving to down. + + Args: + speed (int, optional): moving speed from 1 to 7. Defaults to 1. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/PTZ/channels/" + str(self._viid) + + "/PTZControl?command=TILT_DOWN&speed=" + str(speed) + + "&mode=start" + ) + response = self.__call(url=url, method='GET') + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setptzmovxxl(self, speed: int = 1) -> bool: + """Start camera moving to left. + + Args: + speed (int, optional): moving speed from 1 to 7. Defaults to 1. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/PTZ/channels/" + str(self._viid) + + "/PTZControl?command=PAN_LEFT&speed=" + str(speed) + + "&mode=start" + ) + response = self.__call(url=url, method='GET') + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setptzmovxxr(self, speed: int = 1) -> bool: + """Start camera moving to right. + + Args: + speed (int, optional): moving speed from 1 to 7. Defaults to 1. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/PTZ/channels/" + str(self._viid) + + "/PTZControl?command=PAN_RIGHT&speed=" + str(speed) + + "&mode=start" + ) + response = self.__call(url=url, method='GET') + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setptzmovzzi(self, speed: int = 1) -> bool: + """Start camera zoom in. + + Args: + speed (int, optional): moving speed from 1 to 7. Defaults to 1. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/PTZ/channels/" + str(self._viid) + + "/PTZControl?command=ZOOM_OUT&speed=" + str(speed) + + "&mode=start" + ) + response = self.__call(url=url, method='GET') + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setptzmovzzo(self, speed: int = 1) -> bool: + """Start camera zoom out. + + Args: + speed (int, optional): moving speed from 1 to 7. Defaults to 1. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/PTZ/channels/" + str(self._viid) + + "/PTZControl?command=ZOOM_IN&speed=" + str(speed) + + "&mode=start" + ) + response = self.__call(url=url, method='GET') + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setptzpreset(self, preset: int, speed: int = 1) -> bool: + """Start camera moving to preset. + + Args: + preset (int): saved preset number. + speed (int, optional): moving speed from 1 to 7. Defaults to 1. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/PTZ/channels/" + str(self._viid) + + "/PTZControl?command=GOTO_PRESET&presetNo=" + str(preset) + + "&speed=" + str(speed) + + "&mode=start" + ) + response = self.__call(url=url, method='GET') + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setptztostop(self) -> bool: + """Stop any camera moving. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/PTZ/channels/" + str(self._viid) + + "/PTZControl?command=GOTO_PRESET&mode=stop" + ) + response = self.__call(url=url, method='GET') + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setcamerapos(self, x: int = 0, y: int = 0, z: int = 0) -> bool: + """Set camera moving to absolute position. + + Args: + x (int, optional): horisontal camera position from 0 to 3600. Defaults to 0. + y (int, optional): vertical camera position from -900 to 2700. Defaults to 0. + z (int, optional): zoom camera position from 0 to 1000. Defaults to 0. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/ISAPI/PTZCtrl/channels/" + str(self._chan) + + "/absolute" + ) + xml = ''.join( + '' + + '' + + '' + str(y) + '' + + '' + str(x) + '' + + '' + str(z) + '' + + '' + ) + response = self.__call(url=url, method="PUT", contenttype="text/xml", contentdata=xml) + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def __setcameramovcon(self, x: int = 0, y: int = 0, z: int = 0) -> bool: + """Set camera moving to direction until other signal or 180 seconds elapse. + + Args: + x (int, optional): acceleration of horizontal camera movement from -100 to 100. Defaults to 0. + y (int, optional): acceleration of vertical camera movement from -100 to 100. Defaults to 0. + z (int, optional): acceleration of zoom camera movement from -100 to 100. Defaults to 0. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/ISAPI/PTZCtrl/channels/" + str(self._chan) + + "/continuous" + ) + xml = ''.join( + '' + + '' + + '' + str(x) + '' + + '' + str(y) + '' + + '' + str(z) + '' + + '' + ) + response = self.__call(url=url, method="PUT", contenttype="text/xml", contentdata=xml) + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def __setcameramovmom(self, x: int = 0, y: int = 0, z: int = 0, t: int = 180000) -> bool: + """Set camera moving to direction until other signal or duration elapse. + + Args: + x (int, optional): acceleration of horizontal camera movement from -100 to 100. Defaults to 0. + y (int, optional): acceleration of vertical camera movement from -100 to 100. Defaults to 0. + z (int, optional): acceleration of zoom camera movement from -100 to 100. Defaults to 0. + t (int, optional): duration in ms of acceleration from 0 to 180000. Defaults to 180000. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/ISAPI/PTZCtrl/channels/" + str(self._chan) + + "/momentary" + ) + xml = ''.join( + '' + + '' + + '' + str(x) + '' + + '' + str(y) + '' + + '' + str(z) + '' + + '' + str(t) + '' + + '' + ) + response = self.__call(url=url, method="PUT", contenttype="text/xml", contentdata=xml) + if response != 'ERROR': + sleep(t/1000) + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setcameramov(self, x: int = 0, y: int = 0, z: int = 0, t: int = 0) -> bool: + """Set camera moving to direction (polymorph abstraction). + + Args: + x (int, optional): acceleration of horizontal camera movement from -100 to 100. Defaults to 0. + y (int, optional): acceleration of vertical camera movement from -100 to 100. Defaults to 0. + z (int, optional): acceleration of zoom camera movement from -100 to 100. Defaults to 0. + t (int, optional): duration in ms of acceleration from 0 to 180000. Defaults to 0. + + Returns: + bool: True if successed. + """ + if t == '-' or int(t) == 0: + return self.__setcameramovcon(x=int(x), y=int(y), z=int(z)) + else: + return self.__setcameramovmom(x=int(x), y=int(y), z=int(z), t=int(t)) + + def setmovtohome(self) -> bool: + """Set camera moving to homeposition. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/ISAPI/PTZCtrl/channels/" + str(self._chan) + + "/homeposition/goto" + ) + xml = ''.join( + '' + + '' + ) + response = self.__call(url=url, method="PUT", contenttype="text/xml", contentdata=xml) + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def setposashome(self) -> bool: + """Save current camera position as homeposition. + + Returns: + bool: True if successed. + """ + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/ISAPI/PTZCtrl/channels/" + str(self._chan) + + "/homeposition" + ) + xml = ''.join( + '' + + '' + ) + response = self.__call(url=url, method="PUT", contenttype="text/xml", contentdata=xml) + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + def settextonosd(self, enabled: str = "true", x: int = 0, y: int = 0, message: str = "") -> bool: + """Set message as video overlay text. + + Args: + enabled (str, optional): true or false. Defaults to "true". + x (int, optional): horizontal text position from 0 to video width. Defaults to 0. + y (int, optional): vertical text position from 0 to video heith. Defaults to 0. + message (str, optional): overlay text content. Defaults to "". + + Returns: + bool: True if successed. + """ + if message == '-': + message = "" + url = ( + self._prot + '://' + self._host + ':' + str(self._port) + + "/ISAPI/System/Video/inputs/channels/" + str(self._chan) + + "/overlays/text" + ) + xml = ''.join( + '' + + '' + + '' + + '1' + + '' + enabled + '' + + '' + str(x) + '' + + '' + str(y) + '' + + '' + message + '' + + '' + + '' + ) + response = self.__call(url=url, method="PUT", contenttype="text/xml", contentdata=xml) + if response != 'ERROR': + logging.debug(msg='\n' + response + '\n') + return True + else: + return False + + +class Sensor(Connect): + """Representing sensor connected to remote host. + The class inherits the necessary connection methods of the Connect class + """ + def __init__( + self, + hostname: str, username: str, userpass: str, + nodetype: str, nodename: str, + hostport: int = 22 + ) -> None: + """Object constructor. + + Args: + hostname (str): sensor's remote host hostname or ip address. + username (str): sensor's remote host username. + userpass (str): sensor's remote host password. + nodetype (str): 'ds18b20' or other sensor type. + nodename (str): 28-1a2b3c4d5e6f (ds18b20 example). + hostport (int, optional): sensor's remote host connection port. Defaults to 22. + """ + self._host = hostname + self._port = hostport + self._user = username + self._pswd = userpass + self._type = nodetype + self._node = nodename + + def __call(self, command: str) -> str: + """Send request to sensor's remote host. + + Args: + command (str): command to poll the sensor. + + Returns: + str: sensor's remote host response content. + """ + return self.ssh_commands( + command=command, + hostname=self._host, port=self._port, + username=self._user, password=self._pswd + ) + + def __temperature(self, nodename: str) -> str: + """Preparating request for ds18b20 sensor type. + + Args: + nodename (str): 28-1a2b3c4d5e6f (ds18b20 example). + + Returns: + str: formatted string with temperature in Celsius. + """ + command = 'cat /sys/bus/w1/devices/' + nodename + '/temperature' + response = self.__call(command=command) + if response != 'ERROR': + try: + temperature = str(int(response)//1000) + "'C" + return temperature + except Exception as error: + logging.debug( + msg='' + + '\n' + 'host: ' + self._host + ':' + str(self._port) + + '\n' + 'user: ' + self._user + + '\n' + 'pass: ' + self._pswd + + '\n' + 'command: ' + command + + '\n' + 'error: ' + str(error) + ) + return 'ERROR' + + def value(self) -> str: + """Public method to get sensor value. + + Returns: + str: sensor value. + """ + if self._type == 'ds18b20': + return self.__temperature(nodename=self._node) + + +class Sequence: + """Sequence handling. + """ + @staticmethod + def run( + device: HikISAPI, sensors: dict, sequence: dict, + records_root_path: str = None, + records_root_user: str = None, + records_root_pass: str = None + ) -> None: + """Sequences executor. + + Args: + device (HikISAPI): HikISAPI object. + sensors (dict): collection as key=sensorname:value=Sensor object. + sequence (dict): sequence steps collection. + records_root_path (str, optional): path (local|smb|ftp,sftp) to records directory. Defaults to None. + records_root_user (str, optional): username if path on remote host. Defaults to None. + records_root_pass (str, optional): password if path on remote host. Defaults to None. + """ + for key, value in sequence.items(): + action = value.split(',')[0].strip() + x = value.split(',')[1].strip() + y = value.split(',')[2].strip() + z = value.split(',')[3].strip() + p = value.split(',')[4].strip() + s = value.split(',')[5].strip() + t = value.split(',')[6].strip() + w = value.split(',')[7].strip() + m = value.split(',')[8].strip() + if 'sensor-config:' in m: + sensor_name = m.split(':')[1].strip() + sensor_value = sensors[sensor_name].value() + if sensor_value != 'ERROR': + m = sensor_value + else: + m = '' + logging.info( + msg=' action:' + key + ' = ' + action + + ',' + x + ',' + y + ',' + z + + ',' + p + ',' + s + ',' + t + + ',' + w + ',' + m + ) + if action == 'capabilities': + response = device.capabilities() + elif action == 'getcamerapos': + response = device.getcamerapos() + elif action == 'rebootcamera': + response = device.rebootcamera() + elif action == 'setptzmovyyu': + response = device.setptzmovyyu(speed=int(s)) + elif action == 'setptzmovyyd': + response = device.setptzmovyyd(speed=int(s)) + elif action == 'setptzmovxxl': + response = device.setptzmovxxl(speed=int(s)) + elif action == 'setptzmovxxr': + response = device.setptzmovxxr(speed=int(s)) + elif action == 'setptzmovzzi': + response = device.setptzmovzzi(speed=int(s)) + elif action == 'setptzmovzzo': + response = device.setptzmovzzo(speed=int(s)) + elif action == 'setptzpreset': + response = device.setptzpreset(preset=int(p), speed=int(s)) + elif action == 'setptztostop': + response = device.setptztostop() + elif action == 'setcamerapos': + response = device.setcamerapos(x=int(x), y=int(y), z=int(z)) + elif action == 'setcameramov': + response = device.setcameramov(x=int(x), y=int(y), z=int(z), t=t) + elif action == 'setmovtohome': + response = device.setmovtohome() + elif action == 'setposashome': + response = device.setposashome() + elif action == 'settextonosd': + response = device.settextonosd(x=int(x), y=int(y), message=m) + elif action == 'downloadjpeg': + records_root_temp = records_root_path + if records_root_temp != path.dirname(path.realpath(__file__)): + records_root_temp = path.dirname(path.realpath(__file__)) + sep + 'temp' + makedirs(records_root_temp, exist_ok=True) + dy = datetime.now().strftime('%Y') + dm = datetime.now().strftime('%m') + dv = datetime.now().strftime('%V') + dd = datetime.now().strftime('%d') + th = datetime.now().strftime('%H') + tm = datetime.now().strftime('%M') + ts = datetime.now().strftime('%S') + records_file_name = (key + '_' + dy + '-' + dm + '-' + dd + '_' + th + '.' + tm + '.' + ts + '.jpeg') + if device.downloadjpeg(x=int(x), y=int(y), dst_file=records_root_temp + sep + records_file_name): + hostname = 'localhost' + hostport, hosttype = None, None + username = records_root_user + userpass = records_root_pass + hostpath = records_root_path + if '://' in records_root_path: + hostname = records_root_path.split('/')[2] + hosttype = records_root_path.split('://')[0] + if hosttype == 'ftp': + hostport = 21 + if hosttype == 'sftp': + hostport = 22 + if hosttype == 'smb': + hostport = 445 + hostpath = records_root_path.replace(hosttype + '://' + hostname, '') + if '@' in hostname: + username = hostname.split('@')[0].split(':')[0] + userpass = hostname.split('@')[0].split(':')[1] + hostname = hostname.split('@')[1] + if ':' in hostname: + hostport = int(hostname.split(':')[1]) + hostname = hostname.split(':')[0] + if hosttype == 'ftp': + src_file = records_root_temp + sep + records_file_name + dst_file = hostpath + '/' + dy + '/' + dm + '/' + dv + '/' + dd + '/' + records_file_name + if Connect.ftp_put_file( + src_file=src_file, + dst_file=dst_file, + hostname=hostname, + username=username, + password=userpass + ): + try: + remove(src_file) + except OSError: + pass + elif hosttype == 'sftp': + src_file = records_root_temp + sep + records_file_name + dst_file = hostpath + '/' + dy + '/' + dm + '/' + dv + '/' + dd + '/' + records_file_name + response = Connect.ssh_put_file( + src_file=src_file, dst_file=dst_file, + hostname=hostname, port=hostport, + username=username, password=userpass) + if response != 'ERROR': + try: + remove(src_file) + except OSError: + pass + response = True + else: + response = False + else: + src_file = records_root_temp + sep + records_file_name + dst_file = hostpath + sep + dy + sep + dm + sep + dv + sep + dd + sep + records_file_name + try: + makedirs(hostpath + sep + dy + sep + dm + sep + dv + sep + dd, exist_ok=True) + replace(src=src_file, dst=dst_file) + response = True + except Exception as error: + logging.debug( + msg='' + + '\n' + 'src_file: ' + src_file + + '\n' + 'dst_file: ' + dst_file + + '\n' + 'error: ' + str(error) + ) + response = False + else: + response = False + if w != '-' or float(w) != 0: + sleep(float(w)) + if response: + logging.info(msg=' result:' + key + ' = OK') + else: + logging.warning(msg='result:' + key + ' = ERROR') + + +class Proc: + """Find a running process from Python. + """ + @classmethod + def _list_windows(cls) -> list: + """Find all running process with wmi. + + Returns: + list: dictionaries with descriptions of found processes. + """ + execlist = [] + separate = b'\r\r\n' + out, err = Popen( + [ + 'wmic', 'process', 'get', + 'CommandLine,ExecutablePath,Name,ProcessId', + '/format:list' + ], + stdout=PIPE, + stderr=PIPE + ).communicate() + for line in out.split(separate + separate): + execpid, exename, exepath, cmdline = None, None, None, None + for subline in line.split(separate): + if b'ProcessId=' in subline: + execpid = subline.split(b'=')[1].decode('utf-8') + if b'Name=' in subline: + exename = subline.split(b'=')[1].decode('utf-8') + if b'ExecutablePath=' in subline: + exepath = subline.split(b'=')[1].decode('utf-8') + if b'CommandLine=' in subline: + cmdline = subline.split(b'=')[1].decode('utf-8') + if execpid and exename: + execlist.append( + { + 'execpid': execpid, + 'exename': exename, + 'exepath': exepath, + 'cmdline': cmdline + } + ) + return execlist + + @classmethod + def _list_linux(cls) -> list: + """Find all running process with ps. + + Returns: + list: dictionaries with descriptions of found processes. + """ + execlist = [] + out, err = Popen( + [ + '/bin/ps', '-eo', 'pid,args' + ], + stdout=PIPE, + stderr=PIPE + ).communicate() + for line in out.splitlines(): + execpid = line.split()[0].decode('utf-8') + exepath = line.split()[1].decode('utf-8') + exename = path.basename(exepath) + cmdline = line.split(None, 1)[1].decode('utf-8') + if execpid and exename: + execlist.append( + { + 'execpid': execpid, + 'exename': exename, + 'exepath': exepath, + 'cmdline': cmdline + } + ) + return execlist + + @classmethod + def list(cls) -> list: + """Find all running process. + + Returns: + list: dictionaries with descriptions of found processes. + """ + if platform.startswith('linux') or platform.startswith('darwin'): + return cls._list_linux() + elif platform.startswith('win32'): + return cls._list_windows() + else: + return None + + @classmethod + def search(cls, find: str, exclude: str = None) -> list: + """Find specified processes. + + Args: + find (str): find process pid, name or arguments. + exclude (str, optional): exclude process pid, name or arguments. Defaults to None. + + Returns: + list: dictionaries with descriptions of found processes. + """ + proc_found = [] + try: + for proc in cls.list(): + if exclude and ( + exclude in proc['execpid'] or + exclude in proc['exename'] or + exclude in proc['exepath'] or + exclude in proc['cmdline'] + ): + pass + elif ( + find in proc['execpid'] or + find in proc['exename'] or + find in proc['exepath'] or + find in proc['cmdline'] + ): + proc_found.append(proc) + except TypeError as ex: + print('ON', platform, 'PLATFORM', 'search ERROR:', ex) + finally: + if len(proc_found) == 0: + return None + else: + return proc_found + + @classmethod + def kill(cls, pid: int) -> None: + """Kill the process by means of the OS. + + Args: + pid (int): process ID. + """ + if platform.startswith('linux') or platform.startswith('darwin'): + Popen(['kill', '-s', 'SIGKILL', str(pid)]) + elif platform.startswith('win32'): + Popen(['taskkill', '/PID', str(pid), '/F']) + + +class FFmpeg: + """FFmpeg management from Python. + """ + @classmethod + def run( + cls, + src: str, + dst: str = None, + fps: int = None, + preset: str = None, + ffpath: str = None, + watchdog: bool = False, + watchsec: int = None, + onlyonce: bool = False + ) -> None: + """Running the installed ffmpeg + + Args: + src (str): sources urls (example: "rtsp://user:pass@host:554/Streaming/Channels/101, anull"). + dst (str, optional): destination url (example: rtp://239.0.0.1:5554). Defaults to None. + fps (int, optional): frame per second encoding output. Defaults to None. + preset (str, optional): 240p, 360p, 480p, 720p, 1080p, 1440p, 2160p. Defaults to None. + ffpath (str, optional): alternative path to bin (example: /usr/bin/ffmpeg). Defaults to None. + watchdog (bool, optional): detect ffmpeg freeze and terminate. Defaults to False. + watchsec (int, optional): seconds to wait before the watchdog terminates. Defaults to None. + onlyonce (bool, optional): detect ffmpeg running copy and terminate. Defaults to False. + """ + + process = ( + cls._bin(ffpath).split() + + cls._src(src).split() + + cls._preset(preset, fps).split() + + cls._dst(dst).split() + ) + if onlyonce and Proc.search(' '.join(process)): + print('Process already exist, exit...') + else: + logging.info(msg='Starting ' + ' '.join(process)) + with Popen(process, stdout=PIPE, stderr=STDOUT) as proc: + que = None + if watchdog: + que = Queue() + Process( + target=cls._watchdog, + args=(proc.pid, watchsec, que,), + daemon=True + ).start() + for line in proc.stdout: + if not que: + print(line, flush=True) + else: + que.put(line) + exit() + + @classmethod + def _bin(cls, path_ffmpeg: str) -> str: + """Returns the path to the ffmpeg depending on the OS. + + Args: + path_ffmpeg (str): alternative path to bin. + + Returns: + str: path to ffmpeg. + """ + faq = ( + '\n' + 'Main download page: https://ffmpeg.org/download.html\n' + '\n' + 'Install on Linux (Debian):\n' + '\tsudo apt install -y ffmpeg\n' + '\tTarget: /usr/bin/ffmpeg\n' + '\n' + 'Install on Windows:\n' + '\tDownload and extract archive from: https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.7z\n' + '\tTarget: "%PROGRAMFILES%\\ffmpeg\\bin\\ffmpeg.exe"\n' + '\n' + 'Install on MacOS:\n' + '\tDownload and extract archive from: https://evermeet.cx/ffmpeg/\n' + '\tTarget: /usr/bin/ffmpeg\n' + ) + if not path_ffmpeg: + if platform.startswith('linux') or platform.startswith('darwin'): + path_ffmpeg = '/usr/bin/ffmpeg' + elif platform.startswith('win32'): + path_ffmpeg = environ['PROGRAMFILES'] + "\\ffmpeg\\bin\\ffmpeg.exe" + if path.exists(path_ffmpeg): + return path_ffmpeg + else: + print('ON', platform, 'PLATFORM', 'not found ffmpeg', faq) + return None + + @classmethod + def _src(cls, sources: str) -> list: + """Parsing sources into ffmpeg format. + + Args: + sources (str): comma-separated list of sources in string format. + + Returns: + list: ffmpeg format list of sources. + """ + list_sources = [] + for src in sources.split(','): + src = src.strip() + if 'null' in src: + src = ' '.join(['-f lavfi -i', src]) + elif 'rtsp' in src: + src = ' '.join(['-rtsp_transport tcp -i', src]) + else: + src = ' '.join(['-stream_loop -1 -re -i', src]) + list_sources.append(src) + return ' '.join(list_sources) + + @classmethod + def _preset(cls, choice: str, fps: int) -> str: + """Parsing preset into ffmpeg format. + + Args: + choice (str): preset selection. + fps (int): frame per second encoding output. + + Returns: + str: ffmpeg format encoding parameters. + """ + tune = '-tune zerolatency' + video = '-c:v copy' + audio = '-c:a aac -b:a 128k' + width, height, kbps = None, None, None + if choice: + if choice == '240p': + width, height, kbps = 426, 240, 480 + if choice == '360p': + width, height, kbps = 640, 360, 720 + if choice == '480p': + width, height, kbps = 854, 480, 1920 + if choice == '720p': + width, height, kbps = 1280, 720, 3960 + if choice == '1080p': + width, height, kbps = 1920, 1080, 5940 + if choice == '1440p': + width, height, kbps = 2560, 1440, 12960 + if choice == '2160p': + width, height, kbps = 3840, 2160, 32400 + if width and height and kbps: + video = ''.join( + [ + '-vf scale=', + str(width), ':', str(height), + ',setsar=1:1' + ] + ) + video = ' '.join( + [ + video, + '-c:v libx264 -pix_fmt yuv420p -preset ultrafast' + ] + ) + if fps: + video = ' '.join([video, '-r', str(fps), '-g', str(fps * 2)]) + video = ' '.join([video, '-b:v', str(kbps) + 'k']) + return ' '.join([tune, video, audio]) + + @classmethod + def _dst(cls, destination: str) -> str: + """Parsing destination into ffmpeg format. + + Args: + destination (str): destination path or url. + + Returns: + str: ffmpeg format destination. + """ + container = '-f null' + stdout = '-v debug' # '-nostdin -nostats' # '-report' + if destination: + if 'rtmp' in destination: + container = '-f flv' + elif "rtp" in destination: + container = '-f rtp_mpegts' + else: + destination = '-' + return ' '.join([container, destination, stdout]) + + @classmethod + def _watchdog(cls, pid: int, sec: int, que: Queue = None) -> None: + """If no data arrives in the queue, kill the process. + + Args: + pid (int): process ID. + sec (int): seconds to wait for data. + que (Queue, optional): queue pointer. Defaults to None. + """ + if not sec: + sec = 5 + if que: + while True: + while not que.empty(): + print(que.get()) + sleep(sec) + if que.empty(): + Proc.kill(pid) + print('exit by watchdog') + break + exit() + + +if __name__ == "__main__": + time_start = datetime.now() + + args = ArgumentParser( + prog='cctv-scheduler', + description='Hikvision PTZ IP-Camera management.', + epilog='Dependencies: ' + '- Python 3 (tested version 3.9.5), ' + '- Python 3 modules: paramiko ' + ) + args.add_argument('--config', type=str, default=path.splitext(__file__)[0] + '.conf', required=False, + help='custom configuration file path') + args.add_argument('-b', '--broadcast', action='store_true', required=False, + help='streaming media to destination') + args.add_argument('-s', '--sequences', action='store_true', required=False, + help='run sequences from config file') + args.add_argument('-c', '--converter', action='store_true', required=False, + help='convert JPEG collection to MP4') + args.add_argument('-p', '--publisher', action='store_true', required=False, + help='publish content from templates') + args = vars(args.parse_args()) + + log_root = path.dirname(path.realpath(__file__)) + log_level = 'INFO' + if path.exists(args['config']): + conf = Parse(parameters=args['config'], block='common') + if 'log_root' in conf.data: + log_root = conf.data['log_root'] + if 'log_level' in conf.data: + if conf.data['log_level'] == 'DEBUG': + log_level = logging.DEBUG + elif conf.data['log_level'] == 'INFO': + log_level = logging.INFO + elif conf.data['log_level'] == 'WARNING': + log_level = logging.WARNING + elif conf.data['log_level'] == 'ERROR': + log_level = logging.ERROR + elif conf.data['log_level'] == 'CRITICAL': + log_level = logging.CRITICAL + logging.basicConfig( + format='%(asctime)s %(levelname)s: %(message)s', + datefmt='%Y-%m-%d_%H.%M.%S', + handlers=[ + logging.FileHandler( + filename=log_root + sep + path.splitext(path.basename(__file__))[0] + '.log', + mode='a' + ), + logging.StreamHandler() + ], + level=log_level + ) + logging.getLogger("paramiko").setLevel(logging.WARNING) + + if args['broadcast']: + logging.info(msg='Starting streaming media to destination') + broadcasts = {} + conf = Parse(parameters=args['config'], block='enable-broadcast') + for key, value in conf.data.items(): + if value == 'true': + broadcast_config = Parse( + parameters=args['config'], + block='broadcast-config:' + key + ).data + src = None + if 'src' in broadcast_config: + src = broadcast_config['src'] + dst = None + if 'dst' in broadcast_config: + dst = broadcast_config['dst'] + fps = None + if 'fps' in broadcast_config: + fps = broadcast_config['fps'] + preset = None + if 'preset' in broadcast_config: + preset = broadcast_config['preset'] + ffpath = None + if 'ffpath' in broadcast_config: + ffpath = broadcast_config['ffpath'] + watchdog = None + if 'watchdog' in broadcast_config: + watchdog = broadcast_config['watchdog'] + watchsec = None + if 'watchsec' in broadcast_config: + watchsec = int(broadcast_config['watchsec']) + monopoly = None + if 'onlyonce' in broadcast_config: + onlyonce = broadcast_config['onlyonce'] + FFmpeg.run( + src=src, + dst=dst, + fps=fps, + preset=preset, + ffpath=ffpath, + watchdog=watchdog, + watchsec=watchsec, + onlyonce=onlyonce + ) + elif args['sequences']: + logging.info(msg='Starting PTZ sequences from config file') + sensors = {} + conf = Parse(parameters=args['config'], block='enable-sensor') + for key, value in conf.data.items(): + if value == 'true': + device_config = Parse( + parameters=args['config'], + block='sensor-config:' + key + ).data + device_entity = Sensor( + hostname=device_config['hostname'], + username=device_config['username'], + userpass=device_config['userpass'], + nodetype=device_config['nodetype'], + nodename=device_config['nodename'] + ) + sensors[key] = device_entity + + conf = Parse(parameters=args['config'], block='enable-sequences') + for key, value in conf.data.items(): + if value == 'true': + device_sequence = Parse( + parameters=args['config'], + block='camera-sequences:' + key + ).data + device_config = Parse( + parameters=args['config'], + block='camera-config:' + key + ).data + device_entity = HikISAPI( + hostname=device_config['hostname'], + username=device_config['username'], + userpass=device_config['userpass'] + ) + records_root_path = path.dirname(path.realpath(__file__)) + records_root_user = None + records_root_pass = None + if 'records_root_path' in device_config: + records_root_path = device_config['records_root_path'] + if 'records_root_user' in device_config: + records_root_user = device_config['records_root_user'] + if 'records_root_pass' in device_config: + records_root_pass = device_config['records_root_pass'] + Sequence.run( + device=device_entity, + sensors=sensors, + sequence=device_sequence, + records_root_path=records_root_path, + records_root_user=records_root_user, + records_root_pass=records_root_pass + ) + elif args['converter']: + logging.info(msg='Starting convert JPEG collection to MP4') + elif args['publisher']: + logging.info(msg='Starting publish content from templates') + else: + logging.info(msg='Start arguments was not selected. Exit.') + + time_execute = datetime.now() - time_start + logging.info(msg='execution time is ' + str(time_execute) + '. Exit.') diff --git a/converter.conf b/archive/0.3/converter.conf similarity index 100% rename from converter.conf rename to archive/0.3/converter.conf diff --git a/converter.sh b/archive/0.3/converter.sh similarity index 100% rename from converter.sh rename to archive/0.3/converter.sh diff --git a/archive/0.3/publisher-template-page-1007.xml b/archive/0.3/publisher-template-page-1007.xml new file mode 100644 index 0000000..4b8ab60 --- /dev/null +++ b/archive/0.3/publisher-template-page-1007.xml @@ -0,0 +1,525 @@ + +wp.editPage + + 1 + wpeditpageid + wpxmlrpcuser + wpxmlrpcpass + + dateCreatedwpeditdateis + useridwpedituserid + page_idwpeditpageid + page_statuspublish + description + + + + <!-- wp:heading {"level":3} --><h3>Now</h3><!-- /wp:heading --> + <!-- wp:embed {"url":"youtubelink","type":"video","providerNameSlug":"youtube", + "responsive":true,"className":"wp-embed-aspect-4-3 wp-has-aspect-ratio"} --> + <figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"> + <div class="wp-block-embed__wrapper"> + youtubelink + </div></figure><!-- /wp:embed --> + + + <!-- wp:heading {"level":3} --><h3>Yesterday</h3><!-- /wp:heading --> + <!-- wp:uagb/tabs {"block_id":"yesterday", + "tabHeaders":["currentdp01[0]", + "currentdp02[0]", + "currentdp04[0]", + "currentdp05[0]", + "currentdp11[0]", + "currentdp12[0]"],"tabActive":5,"activeTabBgColor":"#4b4b4b", + "tabTitleLeftMargin":1,"tabTitleRightMargin":1,"tabTitleTopMargin":1,"tabTitleBottomMargin":1} --> + <div class="wp-block-uagb-tabs uagb-block-yesterday uagb-tabs__wrap uagb-tabs__hstyle1-desktop uagb-tabs__vstyle6-tablet uagb-tabs__vstyle6-mobile" data-tab-active="0"> + <ul class="uagb-tabs__panel uagb-tabs__align-left"><li class="uagb-tab uagb-tabs__active"> + <a href="#uagb-tabs__tab0" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="0"> + <span>currentdp01[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab1" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="1"> + <span>currentdp02[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab2" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="2"> + <span>currentdp04[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab3" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="3"> + <span>currentdp05[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab4" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="4"> + <span>currentdp11[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab5" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="5"> + <span>currentdp12[0]</span></a></li></ul> + + <div class="uagb-tabs__body-wrap"> + <!-- wp:uagb/tabs-child {"block_id":"daypoint01", + "header":"currentdp01[0]","tabActive":5, + "tabHeaders":["currentdp01[0]", + "currentdp02[0]", + "currentdp04[0]", + "currentdp05[0]", + "currentdp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-0"> + <div class="uagb-blocks__daypoint01 uagb-tabs__body" aria-labelledby="uagb-tabs__tab0"> + <!-- wp:video {"id":1036} --><figure class="wp-block-video"> + <video controls loop src="currentdp01[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"daypoint02","id":1, + "header":"currentdp02[0]","tabActive":5, + "tabHeaders":["currentdp01[0]", + "currentdp02[0]", + "currentdp04[0]", + "currentdp05[0]", + "currentdp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-1"> + <div class="uagb-blocks__daypoint02 uagb-tabs__body" aria-labelledby="uagb-tabs__tab1"> + <!-- wp:video {"id":1041} --><figure class="wp-block-video"> + <video controls loop src="currentdp02[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"daypoint04","id":2, + "header":"currentdp04[0]","tabActive":5, + "tabHeaders":["currentdp01[0]", + "currentdp02[0]", + "currentdp04[0]", + "currentdp05[0]", + "currentdp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-2"> + <div class="uagb-blocks__daypoint04 uagb-tabs__body" aria-labelledby="uagb-tabs__tab2"> + <!-- wp:video {"id":1046} --><figure class="wp-block-video"> + <video controls loop src="currentdp04[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"daypoint05","id":3, + "header":"currentdp05[0]","tabActive":5, + "tabHeaders":["currentdp01[0]", + "currentdp02[0]", + "currentdp04[0]", + "currentdp05[0]", + "currentdp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-3"> + <div class="uagb-blocks__daypoint05 uagb-tabs__body" aria-labelledby="uagb-tabs__tab3"> + <!-- wp:video {"id":1051} --><figure class="wp-block-video"> + <video controls loop src="currentdp05[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"daypoint11","id":4, + "header":"currentdp11[0]","tabActive":5, + "tabHeaders":["currentdp01[0]", + "currentdp02[0]", + "currentdp04[0]", + "currentdp05[0]", + "currentdp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-4"> + <div class="uagb-blocks__daypoint11 uagb-tabs__body" aria-labelledby="uagb-tabs__tab4"> + <!-- wp:video {"id":1056} --><figure class="wp-block-video"> + <video controls loop src="currentdp11[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"daypoint12","id":5, + "header":"currentdp12[0]","tabActive":5, + "tabHeaders":["currentdp01[0]", + "currentdp02[0]", + "currentdp04[0]", + "currentdp05[0]", + "currentdp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-5"> + <div class="uagb-blocks__daypoint12 uagb-tabs__body" aria-labelledby="uagb-tabs__tab5"> + <!-- wp:video {"id":1061} --><figure class="wp-block-video"> + <video controls loop src="currentdp12[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --></div></div> + <!-- /wp:uagb/tabs --> + + + <!-- wp:heading {"level":3} --><h3>Last week</h3><!-- /wp:heading --> + <!-- wp:uagb/tabs {"block_id":"lastweek", + "tabHeaders":["currentwp01[0]", + "currentwp02[0]", + "currentwp04[0]", + "currentwp05[0]", + "currentwp11[0]", + "currentwp12[0]"],"tabActive":5,"activeTabBgColor":"#4b4b4b", + "tabTitleLeftMargin":1,"tabTitleRightMargin":1,"tabTitleTopMargin":1,"tabTitleBottomMargin":1} --> + <div class="wp-block-uagb-tabs uagb-block-lastweek uagb-tabs__wrap uagb-tabs__hstyle1-desktop uagb-tabs__vstyle6-tablet uagb-tabs__vstyle6-mobile" data-tab-active="0"> + <ul class="uagb-tabs__panel uagb-tabs__align-left"><li class="uagb-tab uagb-tabs__active"> + <a href="#uagb-tabs__tab0" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="0"> + <span>currentwp01[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab1" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="1"> + <span>currentwp02[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab2" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="2"> + <span>currentwp04[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab3" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="3"> + <span>currentwp05[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab4" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="4"> + <span>currentwp11[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab5" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="5"> + <span>currentwp12[0]</span></a></li></ul> + + <div class="uagb-tabs__body-wrap"> + <!-- wp:uagb/tabs-child {"block_id":"weekpoint01", + "header":"currentwp01[0]","tabActive":5, + "tabHeaders":["currentwp01[0]", + "currentwp02[0]", + "currentwp04[0]", + "currentwp05[0]", + "currentwp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-0"> + <div class="uagb-blocks__weekpoint01 uagb-tabs__body" aria-labelledby="uagb-tabs__tab0"> + <!-- wp:video {"id":1036} --><figure class="wp-block-video"> + <video controls loop src="currentwp01[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"weekpoint02","id":1, + "header":"currentwp02[0]","tabActive":5, + "tabHeaders":["currentwp01[0]", + "currentwp02[0]", + "currentwp04[0]", + "currentwp05[0]", + "currentwp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-1"> + <div class="uagb-blocks__weekpoint02 uagb-tabs__body" aria-labelledby="uagb-tabs__tab1"> + <!-- wp:video {"id":1041} --><figure class="wp-block-video"> + <video controls loop src="currentwp02[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"weekpoint04","id":2, + "header":"currentwp04[0]","tabActive":5, + "tabHeaders":["currentwp01[0]", + "currentwp02[0]", + "currentwp04[0]", + "currentwp05[0]", + "currentwp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-2"> + <div class="uagb-blocks__weekpoint04 uagb-tabs__body" aria-labelledby="uagb-tabs__tab2"> + <!-- wp:video {"id":1046} --><figure class="wp-block-video"> + <video controls loop src="currentwp04[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"weekpoint05","id":3, + "header":"currentwp05[0]","tabActive":5, + "tabHeaders":["currentwp01[0]", + "currentwp02[0]", + "currentwp04[0]", + "currentwp05[0]", + "currentwp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-3"> + <div class="uagb-blocks__weekpoint05 uagb-tabs__body" aria-labelledby="uagb-tabs__tab3"> + <!-- wp:video {"id":1051} --><figure class="wp-block-video"> + <video controls loop src="currentwp05[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"weekpoint11","id":4, + "header":"currentwp11[0]","tabActive":5, + "tabHeaders":["currentwp01[0]", + "currentwp02[0]", + "currentwp04[0]", + "currentwp05[0]", + "currentwp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-4"> + <div class="uagb-blocks__weekpoint11 uagb-tabs__body" aria-labelledby="uagb-tabs__tab4"> + <!-- wp:video {"id":1056} --><figure class="wp-block-video"> + <video controls loop src="currentwp11[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"weekpoint12","id":5, + "header":"currentwp12[0]","tabActive":5, + "tabHeaders":["currentwp01[0]", + "currentwp02[0]", + "currentwp04[0]", + "currentwp05[0]", + "currentwp11[0]","wp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-5"> + <div class="uagb-blocks__weekpoint12 uagb-tabs__body" aria-labelledby="uagb-tabs__tab5"> + <!-- wp:video {"id":1061} --><figure class="wp-block-video"> + <video controls loop src="currentwp12[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --></div></div> + <!-- /wp:uagb/tabs --> + + + <!-- wp:heading {"level":3} --><h3>Last month</h3><!-- /wp:heading --> + <!-- wp:uagb/tabs {"block_id":"lastmonth", + "tabHeaders":["currentmp01[0]", + "currentmp02[0]", + "currentmp04[0]", + "currentmp05[0]", + "currentmp11[0]", + "currentmp12[0]"],"tabActive":5,"activeTabBgColor":"#4b4b4b", + "tabTitleLeftMargin":1,"tabTitleRightMargin":1,"tabTitleTopMargin":1,"tabTitleBottomMargin":1} --> + <div class="wp-block-uagb-tabs uagb-block-lastmonth uagb-tabs__wrap uagb-tabs__hstyle1-desktop uagb-tabs__vstyle6-tablet uagb-tabs__vstyle6-mobile" data-tab-active="0"> + <ul class="uagb-tabs__panel uagb-tabs__align-left"><li class="uagb-tab uagb-tabs__active"> + <a href="#uagb-tabs__tab0" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="0"> + <span>currentmp01[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab1" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="1"> + <span>currentmp02[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab2" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="2"> + <span>currentmp04[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab3" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="3"> + <span>currentmp05[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab4" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="4"> + <span>currentmp11[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab5" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="5"> + <span>currentmp12[0]</span></a></li></ul> + + <div class="uagb-tabs__body-wrap"> + <!-- wp:uagb/tabs-child {"block_id":"monthpoint01", + "header":"currentmp01[0]","tabActive":5, + "tabHeaders":["currentmp01[0]", + "currentmp02[0]", + "currentmp04[0]", + "currentmp05[0]", + "currentmp11[0]","mp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-0"> + <div class="uagb-blocks__monthpoint01 uagb-tabs__body" aria-labelledby="uagb-tabs__tab0"> + <!-- wp:video {"id":1037} --><figure class="wp-block-video"> + <video controls loop src="currentmp01[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"monthpoint02","id":1, + "header":"currentmp02[0]","tabActive":5, + "tabHeaders":["currentmp01[0]", + "currentmp02[0]", + "currentmp04[0]", + "currentmp05[0]", + "currentmp11[0]","mp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-1"> + <div class="uagb-blocks__monthpoint02 uagb-tabs__body" aria-labelledby="uagb-tabs__tab1"> + <!-- wp:video {"id":1042} --><figure class="wp-block-video"> + <video controls loop src="currentmp02[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"monthpoint04","id":2, + "header":"currentmp04[0]","tabActive":5, + "tabHeaders":["currentmp01[0]", + "currentmp02[0]", + "currentmp04[0]", + "currentmp05[0]", + "currentmp11[0]","mp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-2"> + <div class="uagb-blocks__monthpoint04 uagb-tabs__body" aria-labelledby="uagb-tabs__tab2"> + <!-- wp:video {"id":1047} --><figure class="wp-block-video"> + <video controls loop src="currentmp04[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"monthpoint05","id":3, + "header":"currentmp05[0]","tabActive":5, + "tabHeaders":["currentmp01[0]", + "currentmp02[0]", + "currentmp04[0]", + "currentmp05[0]", + "currentmp11[0]","mp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-3"> + <div class="uagb-blocks__monthpoint05 uagb-tabs__body" aria-labelledby="uagb-tabs__tab3"> + <!-- wp:video {"id":1052} --><figure class="wp-block-video"> + <video controls loop src="currentmp05[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"monthpoint11","id":4, + "header":"currentmp11[0]","tabActive":5, + "tabHeaders":["currentmp01[0]", + "currentmp02[0]", + "currentmp04[0]", + "currentmp05[0]", + "currentmp11[0]","mp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-4"> + <div class="uagb-blocks__monthpoint11 uagb-tabs__body" aria-labelledby="uagb-tabs__tab4"> + <!-- wp:video {"id":1057} --><figure class="wp-block-video"> + <video controls loop src="currentmp11[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"monthpoint12","id":5, + "header":"currentmp12[0]","tabActive":5, + "tabHeaders":["currentmp01[0]", + "currentmp02[0]", + "currentmp04[0]", + "currentmp05[0]", + "currentmp11[0]","mp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-5"> + <div class="uagb-blocks__monthpoint12 uagb-tabs__body" aria-labelledby="uagb-tabs__tab5"> + <!-- wp:video {"id":1062} --><figure class="wp-block-video"> + <video controls loop src="currentmp12[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --></div></div> + <!-- /wp:uagb/tabs --> + + + <!-- wp:heading {"level":3} --><h3>Last year</h3><!-- /wp:heading --> + <!-- wp:uagb/tabs {"block_id":"lastyear", + "tabHeaders":["currentyp01[0]", + "currentyp02[0]", + "currentyp04[0]", + "currentyp05[0]", + "currentyp11[0]", + "currentyp12[0]"],"tabActive":5,"activeTabBgColor":"#4b4b4b", + "tabTitleLeftMargin":1,"tabTitleRightMargin":1,"tabTitleTopMargin":1,"tabTitleBottomMargin":1} --> + <div class="wp-block-uagb-tabs uagb-block-lastyear uagb-tabs__wrap uagb-tabs__hstyle1-desktop uagb-tabs__vstyle6-tablet uagb-tabs__vstyle6-mobile" data-tab-active="0"> + <ul class="uagb-tabs__panel uagb-tabs__align-left"><li class="uagb-tab uagb-tabs__active"> + <a href="#uagb-tabs__tab0" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="0"> + <span>currentyp01[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab1" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="1"> + <span>currentyp02[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab2" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="2"> + <span>currentyp04[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab3" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="3"> + <span>currentyp05[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab4" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="4"> + <span>currentyp11[0]</span></a></li><li class="uagb-tab "> + <a href="#uagb-tabs__tab5" class="uagb-tabs-list uagb-tabs__icon-position-left" data-tab="5"> + <span>currentyp12[0]</span></a></li></ul> + + <div class="uagb-tabs__body-wrap"> + <!-- wp:uagb/tabs-child {"block_id":"yearpoint01", + "header":"currentyp01[0]","tabActive":5, + "tabHeaders":["currentyp01[0]", + "currentyp02[0]", + "currentyp04[0]", + "currentyp05[0]", + "currentyp11[0]","yp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-0"> + <div class="uagb-blocks__yearpoint01 uagb-tabs__body" aria-labelledby="uagb-tabs__tab0"> + <!-- wp:video {"id":1038} --><figure class="wp-block-video"> + <video controls loop src="currentyp01[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"yearpoint02","id":1, + "header":"currentyp02[0]","tabActive":5, + "tabHeaders":["currentyp01[0]", + "currentyp02[0]", + "currentyp04[0]", + "currentyp05[0]", + "currentyp11[0]","yp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-1"> + <div class="uagb-blocks__yearpoint02 uagb-tabs__body" aria-labelledby="uagb-tabs__tab1"> + <!-- wp:video {"id":1043} --><figure class="wp-block-video"> + <video controls loop src="currentyp02[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"yearpoint04","id":2, + "header":"currentyp04[0]","tabActive":5, + "tabHeaders":["currentyp01[0]", + "currentyp02[0]", + "currentyp04[0]", + "currentyp05[0]", + "currentyp11[0]","yp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-2"> + <div class="uagb-blocks__yearpoint04 uagb-tabs__body" aria-labelledby="uagb-tabs__tab2"> + <!-- wp:video {"id":1048} --><figure class="wp-block-video"> + <video controls loop src="currentyp04[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"yearpoint05","id":3, + "header":"currentyp05[0]","tabActive":5, + "tabHeaders":["currentyp01[0]", + "currentyp02[0]", + "currentyp04[0]", + "currentyp05[0]", + "currentyp11[0]","yp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-3"> + <div class="uagb-blocks__yearpoint05 uagb-tabs__body" aria-labelledby="uagb-tabs__tab3"> + <!-- wp:video {"id":1053} --><figure class="wp-block-video"> + <video controls loop src="currentyp05[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"yearpoint11","id":4, + "header":"currentyp11[0]","tabActive":5, + "tabHeaders":["currentyp01[0]", + "currentyp02[0]", + "currentyp04[0]", + "currentyp05[0]", + "currentyp11[0]","yp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-4"> + <div class="uagb-blocks__yearpoint11 uagb-tabs__body" aria-labelledby="uagb-tabs__tab4"> + <!-- wp:video {"id":1058} --><figure class="wp-block-video"> + <video controls loop src="currentyp11[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --> + + <!-- wp:uagb/tabs-child {"block_id":"yearpoint12","id":5, + "header":"currentyp12[0]","tabActive":5, + "tabHeaders":["currentyp01[0]", + "currentyp02[0]", + "currentyp04[0]", + "currentyp05[0]", + "currentyp11[0]","yp1tab"]} --> + <div class="wp-block-uagb-tabs-child uagb-tabs__body-container uagb-tabs__inner-tab uagb-inner-tab-5"> + <div class="uagb-blocks__yearpoint12 uagb-tabs__body" aria-labelledby="uagb-tabs__tab5"> + <!-- wp:video {"id":1063} --><figure class="wp-block-video"> + <video controls loop src="currentyp12[1]"> + </video></figure><!-- /wp:video --></div></div><!-- /wp:uagb/tabs-child --></div></div> + <!-- /wp:uagb/tabs --> + + + + + titleMedia + linkwppagelinkis + permaLinkwppagelinkis + categories + excerpt + text_more + mt_allow_comments0 + mt_allow_pings0 + wp_slugmedia + wp_password + wp_authorwppageauthor + wp_page_parent_id0 + wp_page_parent_title + wp_page_order0 + wp_author_idwpedituserid + wp_author_display_namewppageauthor + date_created_gmtwpeditdateis + custom_fields + + id4258 + keycontent_display_featured_image + value0 + + + id4257 + keycontent_display_title + value0 + + + id4259 + keycontent_width + valuecontainer + + + id4253 + keydisable_space_above_footer + value0 + + + id4252 + keydisable_space_below_header + value0 + + + id4251 + keyhide_footer + value0 + + + id4250 + keyhide_header + value0 + + + id4254 + keyhide_titlebar + value0 + + + id4255 + keypage_overwrite_defaults + value0 + + + id4260 + keysidebar_layout + valuedefault-sidebar + + + id4256 + keytitlebar_padding + value80 + + + wp_page_templatedefault + + + \ No newline at end of file diff --git a/archive/0.3/publisher.conf b/archive/0.3/publisher.conf new file mode 100644 index 0000000..e9b7d94 --- /dev/null +++ b/archive/0.3/publisher.conf @@ -0,0 +1,86 @@ +logs=./publisher.log + +pathroot=/home/user/cctv-scheduler/records +vidnamesarray=point-01 point-02 point-04 point-05 point-11 point-12 + + +telegramapiurl=https://api.telegram.org/bot1234567890:YOURAPIKEY +telegramchatid=123456789 +tgpreviewlink=https://www.hmp.today/wp-content/uploads/2021/02/site-slider_hmp-qr_bwg-3840x1705-1.png +tgpreviewtext=https://www.hmp.today/media + + +wpxmlrpclink=https://www.hmp.today/xmlrpc.php +wpxmlrpcuser=user +wpxmlrpcpass=pass +wppageauthor=author +wppagelinkis=https://www.hmp.today/media +wpeditpageid=1007 +wpedituserid=0 +wpeditdateis=20220707T00:00:00 +wptemplateis=./publisher-template-page-1007.xml + + +youtubelink=https://youtu.be/link + + +defaultdp01=point-01 https://www.hmp.today/wp-content/uploads/2022/07/point-01_yyyy.mm_.dd_.mp4 +defaultwp01=point-01 https://www.hmp.today/wp-content/uploads/2022/07/point-01_w.mp4 +defaultmp01=point-01 https://www.hmp.today/wp-content/uploads/2022/07/point-01_yyyy.mm_.mp4 +defaultyp01=point-01 https://www.hmp.today/wp-content/uploads/2022/07/point-01_yyyy.mp4 + +defaultdp02=point-02 https://www.hmp.today/wp-content/uploads/2022/07/point-02_yyyy.mm_.dd_.mp4 +defaultwp02=point-02 https://www.hmp.today/wp-content/uploads/2022/07/point-02_w.mp4 +defaultmp02=point-02 https://www.hmp.today/wp-content/uploads/2022/07/point-02_yyyy.mm_.mp4 +defaultyp02=point-02 https://www.hmp.today/wp-content/uploads/2022/07/point-02_yyyy.mp4 + +defaultdp04=point-04 https://www.hmp.today/wp-content/uploads/2022/07/point-04_yyyy.mm_.dd_.mp4 +defaultwp04=point-04 https://www.hmp.today/wp-content/uploads/2022/07/point-04_w.mp4 +defaultmp04=point-04 https://www.hmp.today/wp-content/uploads/2022/07/point-04_yyyy.mm_.mp4 +defaultyp04=point-04 https://www.hmp.today/wp-content/uploads/2022/07/point-04_yyyy.mp4 + +defaultdp05=point-05 https://www.hmp.today/wp-content/uploads/2022/07/point-05_yyyy.mm_.dd_.mp4 +defaultwp05=point-05 https://www.hmp.today/wp-content/uploads/2022/07/point-05_w.mp4 +defaultmp05=point-05 https://www.hmp.today/wp-content/uploads/2022/07/point-05_yyyy.mm_.mp4 +defaultyp05=point-05 https://www.hmp.today/wp-content/uploads/2022/07/point-05_yyyy.mp4 + +defaultdp11=point-11 https://www.hmp.today/wp-content/uploads/2022/07/point-11_yyyy.mm_.dd_.mp4 +defaultwp11=point-11 https://www.hmp.today/wp-content/uploads/2022/07/point-11_w.mp4 +defaultmp11=point-11 https://www.hmp.today/wp-content/uploads/2022/07/point-11_yyyy.mm_.mp4 +defaultyp11=point-11 https://www.hmp.today/wp-content/uploads/2022/07/point-11_yyyy.mp4 + +defaultdp12=point-12 https://www.hmp.today/wp-content/uploads/2022/07/point-12_yyyy.mm_.dd_.mp4 +defaultwp12=point-12 https://www.hmp.today/wp-content/uploads/2022/07/point-12_w.mp4 +defaultmp12=point-12 https://www.hmp.today/wp-content/uploads/2022/07/point-12_yyyy.mm_.mp4 +defaultyp12=point-12 https://www.hmp.today/wp-content/uploads/2022/07/point-12_yyyy.mp4 + + +currentdp01=point-01 +currentwp01=point-01 +currentmp01=point-01 +currentyp01=point-01 + +currentdp02=point-02 +currentwp02=point-02 +currentmp02=point-02 +currentyp02=point-02 + +currentdp04=point-04 +currentwp04=point-04 +currentmp04=point-04 +currentyp04=point-04 + +currentdp05=point-05 +currentwp05=point-05 +currentmp05=point-05 +currentyp05=point-05 + +currentdp11=point-11 +currentwp11=point-11 +currentmp11=point-11 +currentyp11=point-11 + +currentdp12=point-12 +currentwp12=point-12 +currentmp12=point-12 +currentyp12=point-12 diff --git a/archive/0.3/publisher.sh b/archive/0.3/publisher.sh new file mode 100644 index 0000000..205da6d --- /dev/null +++ b/archive/0.3/publisher.sh @@ -0,0 +1,599 @@ +#! /bin/bash + +# DESCRIPTION: +# Uploading MP4 to Wordpress and Telegram. +# Additionally: +# - editing Wordpress page from template +# - recompressing video if size over 50MB +# This is only a local "proof of conept" for testing and debugging. +# +# DEPENDENCIES: +# - curl +# - ffmpeg +# - libxml2-utils +# - jq +# +# PARAMETERS: +# 1: "qn" - execution without pauses +# 2: custom configuration file path +# 3: periods: '' - today | '-d' - yesterday | '-w' - last week | '-m' - last month | '-y' - last year +# 4: period multiplier: '' - 1 day|week|month|year +# 5: publishing '--onlytg' - only to Telegram | '--onlywp' - only to Wordpress +# +# FUNCTIONS: +# + +####################################### +# Print message and add to log. +# Globals: +# logs +# Arguments: +# 1: message to print and logging +####################################### +addtologs() { + echo "$(date +'%Y.%m.%d-%H:%M:%S') $1" | tee -a "${logs}" +} + +####################################### +# Waiting for press [ENTER]. +# Globals: +# None +# Arguments: +# None +####################################### +execpause() { + read -r -p "Press [ENTER] to continue... " +} + +####################################### +# Exit procedure. +# Globals: +# show +# Arguments: +# None +####################################### +execquite() { + addtologs "execution time is $(($(date +%s)-time)) seconds, exit" + if [ "${show}" != "qn" ]; then + execpause + fi + exit +} + +####################################### +# Error exit procedure with Telegram notification. +# Globals: +# telegramapiurl +# telegramchatid +# Arguments: +# 1: message to print and logging +####################################### +execerror() { + addtologs "error: $1" + curl -s -X POST "${telegramapiurl}/sendMessage" \ + -d "chat_id=${telegramchatid}" \ + -d "text=$(basename -s .sh "$0") error: $1" \ + >> /dev/null 2>&1 + execquite +} + +####################################### +# Parsing config file and creating global vars. +# Globals: +# None +# Arguments: +# None +####################################### +getconfig() { + logs=$(grep "logs=" "${conf}" | cut -d= -f2) + pathroot=$(grep "pathroot=" "${conf}" | cut -d= -f2) + IFS=" " read -r -a vidnamesarray <<< "$(grep "vidnamesarray=" "${conf}" | cut -d= -f2)" + telegramapiurl=$(grep "telegramapiurl=" "${conf}" | cut -d= -f2) + telegramchatid=$(grep "telegramchatid=" "${conf}" | cut -d= -f2) + tgpreviewlink=$(grep "tgpreviewlink=" "${conf}" | cut -d= -f2) + tgpreviewtext=$(grep "tgpreviewtext=" "${conf}" | cut -d= -f2) + wpxmlrpclink=$(grep "wpxmlrpclink=" "${conf}" | cut -d= -f2) + wpxmlrpcuser=$(grep "wpxmlrpcuser=" "${conf}" | cut -d= -f2) + wpxmlrpcpass=$(grep "wpxmlrpcpass=" "${conf}" | cut -d= -f2) + wppageauthor=$(grep "wppageauthor=" "${conf}" | cut -d= -f2) + wppagelinkis=$(grep "wppagelinkis=" "${conf}" | cut -d= -f2) + wpeditpageid=$(grep "wpeditpageid=" "${conf}" | cut -d= -f2) + wpedituserid=$(grep "wpedituserid=" "${conf}" | cut -d= -f2) + wpeditdateis=$(grep "wpeditdateis=" "${conf}" | cut -d= -f2) + wptemplateis=$(grep "wptemplateis=" "${conf}" | cut -d= -f2) + youtubelink=$(grep "youtubelink=" "${conf}" | cut -d= -f2) + + IFS=" " read -r -a defaultdp01 <<< "$(grep "defaultdp01=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultwp01 <<< "$(grep "defaultwp01=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultmp01 <<< "$(grep "defaultmp01=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultyp01 <<< "$(grep "defaultyp01=" "${conf}" | cut -d= -f2)" + + IFS=" " read -r -a defaultdp02 <<< "$(grep "defaultdp02=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultwp02 <<< "$(grep "defaultwp02=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultmp02 <<< "$(grep "defaultmp02=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultyp02 <<< "$(grep "defaultyp02=" "${conf}" | cut -d= -f2)" + + IFS=" " read -r -a defaultdp04 <<< "$(grep "defaultdp04=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultwp04 <<< "$(grep "defaultwp04=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultmp04 <<< "$(grep "defaultmp04=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultyp04 <<< "$(grep "defaultyp04=" "${conf}" | cut -d= -f2)" + + IFS=" " read -r -a defaultdp05 <<< "$(grep "defaultdp05=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultwp05 <<< "$(grep "defaultwp05=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultmp05 <<< "$(grep "defaultmp05=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultyp05 <<< "$(grep "defaultyp05=" "${conf}" | cut -d= -f2)" + + IFS=" " read -r -a defaultdp11 <<< "$(grep "defaultdp11=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultwp11 <<< "$(grep "defaultwp11=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultmp11 <<< "$(grep "defaultmp11=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultyp11 <<< "$(grep "defaultyp11=" "${conf}" | cut -d= -f2)" + + IFS=" " read -r -a defaultdp12 <<< "$(grep "defaultdp12=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultwp12 <<< "$(grep "defaultwp12=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultmp12 <<< "$(grep "defaultmp12=" "${conf}" | cut -d= -f2)" + IFS=" " read -r -a defaultyp12 <<< "$(grep "defaultyp12=" "${conf}" | cut -d= -f2)" + + IFS=" " read -r -a currentdp01 <<< "$(grep "currentdp01=" "${conf}" | cut -d= -f2)" + if [ -z "${currentdp01[1]}" ]; then + currentdp01=${defaultdp01[*]} + fi + IFS=" " read -r -a currentwp01 <<< "$(grep "currentwp01=" "${conf}" | cut -d= -f2)" + if [ -z "${currentwp01[1]}" ]; then + currentwp01=${defaultwp01[*]} + fi + IFS=" " read -r -a currentmp01 <<< "$(grep "currentmp01=" "${conf}" | cut -d= -f2)" + if [ -z "${currentmp01[1]}" ]; then + currentmp01=${defaultmp01[*]} + fi + IFS=" " read -r -a currentyp01 <<< "$(grep "currentyp01=" "${conf}" | cut -d= -f2)" + if [ -z "${currentyp01[1]}" ]; then + currentyp01=${defaultyp01[*]} + fi + + IFS=" " read -r -a currentdp02 <<< "$(grep "currentdp02=" "${conf}" | cut -d= -f2)" + if [ -z "${currentdp02[1]}" ]; then + currentdp02=${defaultdp02[*]} + fi + IFS=" " read -r -a currentwp02 <<< "$(grep "currentwp02=" "${conf}" | cut -d= -f2)" + if [ -z "${currentwp02[1]}" ]; then + currentwp02=${defaultwp02[*]} + fi + IFS=" " read -r -a currentmp02 <<< "$(grep "currentmp02=" "${conf}" | cut -d= -f2)" + if [ -z "${currentmp02[1]}" ]; then + currentmp02=${defaultmp02[*]} + fi + IFS=" " read -r -a currentyp02 <<< "$(grep "currentyp02=" "${conf}" | cut -d= -f2)" + if [ -z "${currentyp02[1]}" ]; then + currentyp02=${defaultyp02[*]} + fi + + IFS=" " read -r -a currentdp04 <<< "$(grep "currentdp04=" "${conf}" | cut -d= -f2)" + if [ -z "${currentdp04[1]}" ]; then + currentdp04=${defaultdp04[*]} + fi + IFS=" " read -r -a currentwp04 <<< "$(grep "currentwp04=" "${conf}" | cut -d= -f2)" + if [ -z "${currentwp04[1]}" ]; then + currentwp04=${defaultwp04[*]} + fi + IFS=" " read -r -a currentmp04 <<< "$(grep "currentmp04=" "${conf}" | cut -d= -f2)" + if [ -z "${currentmp04[1]}" ]; then + currentmp04=${defaultmp04[*]} + fi + IFS=" " read -r -a currentyp04 <<< "$(grep "currentyp04=" "${conf}" | cut -d= -f2)" + if [ -z "${currentyp04[1]}" ]; then + currentyp04=${defaultyp04[*]} + fi + + IFS=" " read -r -a currentdp05 <<< "$(grep "currentdp05=" "${conf}" | cut -d= -f2)" + if [ -z "${currentdp05[1]}" ]; then + currentdp05=${defaultdp05[*]} + fi + IFS=" " read -r -a currentwp05 <<< "$(grep "currentwp05=" "${conf}" | cut -d= -f2)" + if [ -z "${currentwp05[1]}" ]; then + currentwp05=${defaultwp05[*]} + fi + IFS=" " read -r -a currentmp05 <<< "$(grep "currentmp05=" "${conf}" | cut -d= -f2)" + if [ -z "${currentmp05[1]}" ]; then + currentmp05=${defaultmp05[*]} + fi + IFS=" " read -r -a currentyp05 <<< "$(grep "currentyp05=" "${conf}" | cut -d= -f2)" + if [ -z "${currentyp05[1]}" ]; then + currentyp05=${defaultyp05[*]} + fi + + IFS=" " read -r -a currentdp11 <<< "$(grep "currentdp11=" "${conf}" | cut -d= -f2)" + if [ -z "${currentdp11[1]}" ]; then + currentdp11=${defaultdp11[*]} + fi + IFS=" " read -r -a currentwp11 <<< "$(grep "currentwp11=" "${conf}" | cut -d= -f2)" + if [ -z "${currentwp11[1]}" ]; then + currentwp11=${defaultwp11[*]} + fi + IFS=" " read -r -a currentmp11 <<< "$(grep "currentmp11=" "${conf}" | cut -d= -f2)" + if [ -z "${currentmp11[1]}" ]; then + currentmp11=${defaultmp11[*]} + fi + IFS=" " read -r -a currentyp11 <<< "$(grep "currentyp11=" "${conf}" | cut -d= -f2)" + if [ -z "${currentyp11[1]}" ]; then + currentyp11=${defaultyp11[*]} + fi + + IFS=" " read -r -a currentdp12 <<< "$(grep "currentdp12=" "${conf}" | cut -d= -f2)" + if [ -z "${currentdp12[1]}" ]; then + currentdp12=${defaultdp12[*]} + fi + IFS=" " read -r -a currentwp12 <<< "$(grep "currentwp12=" "${conf}" | cut -d= -f2)" + if [ -z "${currentwp12[1]}" ]; then + currentwp12=${defaultwp12[*]} + fi + IFS=" " read -r -a currentmp12 <<< "$(grep "currentmp12=" "${conf}" | cut -d= -f2)" + if [ -z "${currentmp12[1]}" ]; then + currentmp12=${defaultmp12[*]} + fi + IFS=" " read -r -a currentyp12 <<< "$(grep "currentyp12=" "${conf}" | cut -d= -f2)" + if [ -z "${currentyp12[1]}" ]; then + currentyp12=${defaultyp12[*]} + fi +} + +####################################### +# Writing changes to configuration file. +# Globals: +# conf +# when +# vidnamesarray +# vidlinksarray +# Arguments: +# None +####################################### +setconfig() { + if [ -z "${when}" ] || [ "${when}" == "-d" ]; then + if [ -n "${vidnamesarray[0]}" ] && [ -n "${vidlinksarray[0]}" ]; then + sed -i "s#$(grep 'currentdp01=' "${conf}")#currentdp01=${vidnamesarray[0]} ${vidlinksarray[0]}#" "${conf}" + fi + if [ -n "${vidnamesarray[1]}" ] && [ -n "${vidlinksarray[1]}" ]; then + sed -i "s#$(grep 'currentdp02=' "${conf}")#currentdp02=${vidnamesarray[1]} ${vidlinksarray[1]}#" "${conf}" + fi + if [ -n "${vidnamesarray[2]}" ] && [ -n "${vidlinksarray[2]}" ]; then + sed -i "s#$(grep 'currentdp04=' "${conf}")#currentdp04=${vidnamesarray[2]} ${vidlinksarray[2]}#" "${conf}" + fi + if [ -n "${vidnamesarray[3]}" ] && [ -n "${vidlinksarray[3]}" ]; then + sed -i "s#$(grep 'currentdp05=' "${conf}")#currentdp05=${vidnamesarray[3]} ${vidlinksarray[3]}#" "${conf}" + fi + if [ -n "${vidnamesarray[4]}" ] && [ -n "${vidlinksarray[4]}" ]; then + sed -i "s#$(grep 'currentdp11=' "${conf}")#currentdp11=${vidnamesarray[4]} ${vidlinksarray[4]}#" "${conf}" + fi + if [ -n "${vidnamesarray[5]}" ] && [ -n "${vidlinksarray[5]}" ]; then + sed -i "s#$(grep 'currentdp12=' "${conf}")#currentdp12=${vidnamesarray[5]} ${vidlinksarray[5]}#" "${conf}" + fi + fi + if [ "${when}" == "-w" ]; then + if [ -n "${vidnamesarray[0]}" ] && [ -n "${vidlinksarray[0]}" ]; then + sed -i "s#$(grep 'currentwp01=' "${conf}")#currentwp01=${vidnamesarray[0]} ${vidlinksarray[0]}#" "${conf}" + fi + if [ -n "${vidnamesarray[1]}" ] && [ -n "${vidlinksarray[1]}" ]; then + sed -i "s#$(grep 'currentwp02=' "${conf}")#currentwp02=${vidnamesarray[1]} ${vidlinksarray[1]}#" "${conf}" + fi + if [ -n "${vidnamesarray[2]}" ] && [ -n "${vidlinksarray[2]}" ]; then + sed -i "s#$(grep 'currentwp04=' "${conf}")#currentwp04=${vidnamesarray[2]} ${vidlinksarray[2]}#" "${conf}" + fi + if [ -n "${vidnamesarray[3]}" ] && [ -n "${vidlinksarray[3]}" ]; then + sed -i "s#$(grep 'currentwp05=' "${conf}")#currentwp05=${vidnamesarray[3]} ${vidlinksarray[3]}#" "${conf}" + fi + if [ -n "${vidnamesarray[4]}" ] && [ -n "${vidlinksarray[4]}" ]; then + sed -i "s#$(grep 'currentwp11=' "${conf}")#currentwp11=${vidnamesarray[4]} ${vidlinksarray[4]}#" "${conf}" + fi + if [ -n "${vidnamesarray[5]}" ] && [ -n "${vidlinksarray[5]}" ]; then + sed -i "s#$(grep 'currentwp12=' "${conf}")#currentwp12=${vidnamesarray[5]} ${vidlinksarray[5]}#" "${conf}" + fi + fi + if [ "${when}" == "-m" ]; then + if [ -n "${vidnamesarray[0]}" ] && [ -n "${vidlinksarray[0]}" ]; then + sed -i "s#$(grep 'currentmp01=' "${conf}")#currentmp01=${vidnamesarray[0]} ${vidlinksarray[0]}#" "${conf}" + fi + if [ -n "${vidnamesarray[1]}" ] && [ -n "${vidlinksarray[1]}" ]; then + sed -i "s#$(grep 'currentmp02=' "${conf}")#currentmp02=${vidnamesarray[1]} ${vidlinksarray[1]}#" "${conf}" + fi + if [ -n "${vidnamesarray[2]}" ] && [ -n "${vidlinksarray[2]}" ]; then + sed -i "s#$(grep 'currentmp04=' "${conf}")#currentmp04=${vidnamesarray[2]} ${vidlinksarray[2]}#" "${conf}" + fi + if [ -n "${vidnamesarray[3]}" ] && [ -n "${vidlinksarray[3]}" ]; then + sed -i "s#$(grep 'currentmp05=' "${conf}")#currentmp05=${vidnamesarray[3]} ${vidlinksarray[3]}#" "${conf}" + fi + if [ -n "${vidnamesarray[4]}" ] && [ -n "${vidlinksarray[4]}" ]; then + sed -i "s#$(grep 'currentmp11=' "${conf}")#currentmp11=${vidnamesarray[4]} ${vidlinksarray[4]}#" "${conf}" + fi + if [ -n "${vidnamesarray[5]}" ] && [ -n "${vidlinksarray[5]}" ]; then + sed -i "s#$(grep 'currentmp12=' "${conf}")#currentmp12=${vidnamesarray[5]} ${vidlinksarray[5]}#" "${conf}" + fi + fi + if [ "${when}" == "-y" ]; then + if [ -n "${vidnamesarray[0]}" ] && [ -n "${vidlinksarray[0]}" ]; then + sed -i "s#$(grep 'currentyp01=' "${conf}")#currentyp01=${vidnamesarray[0]} ${vidlinksarray[0]}#" "${conf}" + fi + if [ -n "${vidnamesarray[1]}" ] && [ -n "${vidlinksarray[1]}" ]; then + sed -i "s#$(grep 'currentyp02=' "${conf}")#currentyp02=${vidnamesarray[1]} ${vidlinksarray[1]}#" "${conf}" + fi + if [ -n "${vidnamesarray[2]}" ] && [ -n "${vidlinksarray[2]}" ]; then + sed -i "s#$(grep 'currentyp04=' "${conf}")#currentyp04=${vidnamesarray[2]} ${vidlinksarray[2]}#" "${conf}" + fi + if [ -n "${vidnamesarray[3]}" ] && [ -n "${vidlinksarray[3]}" ]; then + sed -i "s#$(grep 'currentyp05=' "${conf}")#currentyp05=${vidnamesarray[3]} ${vidlinksarray[3]}#" "${conf}" + fi + if [ -n "${vidnamesarray[4]}" ] && [ -n "${vidlinksarray[4]}" ]; then + sed -i "s#$(grep 'currentyp11=' "${conf}")#currentyp11=${vidnamesarray[4]} ${vidlinksarray[4]}#" "${conf}" + fi + if [ -n "${vidnamesarray[5]}" ] && [ -n "${vidlinksarray[5]}" ]; then + sed -i "s#$(grep 'currentyp12=' "${conf}")#currentyp12=${vidnamesarray[5]} ${vidlinksarray[5]}#" "${conf}" + fi + fi +} + +# +# VARIABLES: +# + +show=$1 +conf=$2 +if [ -z "${conf}" ] || [ "${conf}" == "-" ]; then + conf="$(dirname "$(realpath "$0")")/$(basename -s .sh "$0").conf" +fi +ever=$4 +if [ -z "${ever}" ] || [ "${ever}" == "-" ]; then + ever=1 +fi +if grep -q -o "^[0-9][0-9]*$" <<< "${ever}"; then + : +else + execerror "${ever} - wrong argument" +fi +when=$3 +if [ -z "${when}" ]; then + viddate=$(date +"%Y").$(date +"%m").$(date +"%d") +fi +if [ "${when}" == "-d" ]; then + d=$(date -d "-${ever} day" +"%d") + m=$(date +"%m") + if [ "$(date -d "-${ever} day" +'%m')" != "$(date +'%m')" ]; then + m=$(date -d "-${ever} day" +'%m') + fi + y=$(date +"%Y") + if [ "$(date -d "-${ever} day" +'%Y')" != "$(date +'%Y')" ]; then + y=$(date -d "-${ever} day" +'%Y') + fi + viddate="${y}.${m}.${d}" +fi +if [ "${when}" == "-w" ]; then + w=$(date -d "-${ever} week" +"%V") + y=$(date +"%Y") + if [ "$(date -d "-${ever} week" +'%Y')" != "$(date +'%Y')" ]; then + y=$(date -d "-${ever} week" +'%Y') + fi + viddate="${y}-w${w}" +fi +if [ "${when}" == "-m" ]; then + m=$(date -d "-${ever} month" +"%m") + y=$(date +"%Y") + if [ "$(date -d "-${ever} month" +'%Y')" != "$(date +'%Y')" ]; then + y=$(date -d "-${ever} month" +'%Y') + fi + viddate="${y}.${m}" +fi +if [ "${when}" == "-y" ]; then + y=$(date -d "-${ever} year" +"%Y") + viddate="${y}" +fi +vidname="${viddate}.mp4" +only=$5 + +time=$(date +%s) +cd "$(dirname "$(realpath "$0")")" || execerror +if [ ! -e "${conf}" ]; then + execerror "Not found config file: ${conf}" +else + getconfig +fi +if [ -z "${logs}" ]; then + logs=/dev/null +elif [ ! -e "${logs}" ]; then + touch "${logs}" +fi +if ! command -v curl &> /dev/null || \ + ! command -v ffmpeg &> /dev/null || \ + ! command -v xmllint &> /dev/null || \ + ! command -v jq &> /dev/null; then + execerror "Not found dependencies" +fi + +# +# MAIN: +# + +vidpathsarray=() +vidlinksarray=() +vidtgidsarray=() +vidtgcpsarray=() +for name in "${vidnamesarray[@]}"; do + vidmatch="${name}_${vidname}" + while read -r FILE; do + vidpathsarray+=("${FILE}") + done < <(find "${pathroot}" -name "*${vidmatch}" | sort) +done +for item in "${!vidpathsarray[@]}"; do + # WORDPRESS UPLOAD VIDEO + if [ ! "$only" == "--onlytg" ]; then + # This realisation isn't optimal, but it fixes a few issues with large files: + # variable=$(base64 $file) -> "xrealloc: cannot allocate" + # response=$(curl -X POST -d @${file}.xml $url) -> "curl: option -d: out of memory" + filetype="video/mp4" + echo ' + wp.uploadFile + + 1 + '"${wpxmlrpcuser}"' + '"${wpxmlrpcpass}"' + + name'"$(basename "${vidpathsarray[$item]}")"' + type'"${filetype}"' + bits' > "${vidpathsarray[$item]}.xml" + base64 --wrap=0 "${vidpathsarray[$item]}" >> "${vidpathsarray[$item]}.xml" + echo ' + + + ' >> "${vidpathsarray[$item]}.xml" + response="${vidpathsarray[$item]}-response.xml" + if curl -X POST -T "${vidpathsarray[$item]}.xml" "${wpxmlrpclink}" > "${response}"; then + vidlinksarray+=("$(xmllint --xpath '//member[contains(name,"link")]/value/string/text()' "${response}")") + vidlinkcodeis=$(curl --output /dev/null --silent --write-out "%{http_code}" "${vidlinksarray[$item]}") + else + execerror "${response}" + fi + if [[ ${vidlinkcodeis} -eq 200 ]]; then + rm "${vidpathsarray[$item]}.xml" + rm "${response}" + echo "$(date +'%Y.%m.%d-%H:%M:%S') sent ${vidpathsarray[$item]} to ${vidlinksarray[$item]}" | tee -a "${logs}" + echo -e "WORDPRESS UPLOAD VIDEO RESULT:" + echo -e "item: ${item}" + echo -e "type: ${filetype}" + echo -e "name: ${vidnamesarray[$item]}" + echo -e "base: $(basename "${vidpathsarray[$item]}")" + echo -e "path: ${vidpathsarray[$item]}" + echo -e "link: ${vidlinksarray[$item]}" + echo -e "code: ${vidlinkcodeis}" + else + vidlinksarray[item]='' + fi + fi + + # TELEGRAM SEND/UPLOAD VIDEO + if [ ! "${only}" == "--onlywp" ]; then + videofullpath=${vidpathsarray[$item]} + vidcompressed=${videofullpath//".mp4"/"-compressed.mp4"} + if [ -n "$(find "${videofullpath}" -prune -size +51380224c)" ]; then + duration=$(ffprobe -i "${videofullpath}" \ + -show_entries format=duration -v quiet -of csv="p=0" | cut -d'.' -f 1) + if ffmpeg -i "${videofullpath}" \ + -c:v libx264 -b:v "$((49*8*1000/duration))k" \ + -vf "scale=960:540,fps=25,format=yuv420p" \ + -preset veryslow "${vidcompressed}" -y -loglevel quiet -stats; then + videofullpath=${vidcompressed} + else + execerror "ffmpeg convert ${videofullpath} to ${vidcompressed}" + fi + fi + videobasename=$(basename "${videofullpath}") + videobasename=${videobasename//".mp4"/""} + response=$(curl -s \ + -F "chat_id=${telegramchatid}" \ + -F "video=@${videofullpath}" \ + -F "caption=${videobasename}" \ + "${telegramapiurl}/sendVideo") + if curl -s -F "chat_id=${telegramchatid}" \ + -F "message_id=$(echo "${response}" | jq -r '.result.message_id')" \ + "${telegramapiurl}/deleteMessage"; then + vidtgidsarray+=("$(echo "${response}" | jq -r '.result.video.file_id')") + vidtgcpsarray+=("$(echo "${response}" | jq -r '.result.caption')") + addtologs "sent ${videofullpath} to ${vidtgidsarray[$item]} Telegram file ID" + else + execerror "sent ${videofullpath} to ${telegramchatid} Telegram Chat ID" + fi + if [ -e "${vidcompressed}" ]; then + rm "${vidcompressed}" + fi + fi +done + +# TELEGRAM SEND MEDIAGROUP +if [ ! "${only}" == "--onlywp" ]; then + response=$(curl -s -F "chat_id=${telegramchatid}" \ + -F media='[ + {"type":"photo","media":"'"${tgpreviewlink}"'", + "caption":"period: '"${viddate}"'\nsource: '"${tgpreviewtext}"'\nstream: '"${youtubelink}"'"}, + {"type":"video","media":"'"${vidtgidsarray[0]}"'"}, + {"type":"video","media":"'"${vidtgidsarray[1]}"'"}, + {"type":"video","media":"'"${vidtgidsarray[2]}"'"}, + {"type":"video","media":"'"${vidtgidsarray[3]}"'"}, + {"type":"video","media":"'"${vidtgidsarray[4]}"'"}, + {"type":"video","media":"'"${vidtgidsarray[5]}"'"}]' \ + -H "Content-Type:multipart/form-data" \ + "${telegramapiurl}/sendMediaGroup") +fi + +# WORDPRESS UPDATE PAGE +if [ ! "${only}" == "--onlytg" ]; then + setconfig + getconfig + xml=$(cat "./${wptemplateis}") + + xml=${xml//wpeditpageid/${wpeditpageid}} + xml=${xml//wpxmlrpcuser/${wpxmlrpcuser}} + xml=${xml//wpxmlrpcpass/${wpxmlrpcpass}} + + xml=${xml//youtubelink/${youtubelink}} + + xml=${xml//"currentdp01[0]"/${currentdp01[0]}} + xml=${xml//"currentdp01[1]"/${currentdp01[1]}} + xml=${xml//"currentdp02[0]"/${currentdp02[0]}} + xml=${xml//"currentdp02[1]"/${currentdp02[1]}} + xml=${xml//"currentdp04[0]"/${currentdp04[0]}} + xml=${xml//"currentdp04[1]"/${currentdp04[1]}} + xml=${xml//"currentdp05[0]"/${currentdp05[0]}} + xml=${xml//"currentdp05[1]"/${currentdp05[1]}} + xml=${xml//"currentdp11[0]"/${currentdp11[0]}} + xml=${xml//"currentdp11[1]"/${currentdp11[1]}} + xml=${xml//"currentdp12[0]"/${currentdp12[0]}} + xml=${xml//"currentdp12[1]"/${currentdp12[1]}} + + xml=${xml//"currentwp01[0]"/${currentwp01[0]}} + xml=${xml//"currentwp01[1]"/${currentwp01[1]}} + xml=${xml//"currentwp02[0]"/${currentwp02[0]}} + xml=${xml//"currentwp02[1]"/${currentwp02[1]}} + xml=${xml//"currentwp04[0]"/${currentwp04[0]}} + xml=${xml//"currentwp04[1]"/${currentwp04[1]}} + xml=${xml//"currentwp05[0]"/${currentwp05[0]}} + xml=${xml//"currentwp05[1]"/${currentwp05[1]}} + xml=${xml//"currentwp11[0]"/${currentwp11[0]}} + xml=${xml//"currentwp11[1]"/${currentwp11[1]}} + xml=${xml//"currentwp12[0]"/${currentwp12[0]}} + xml=${xml//"currentwp12[1]"/${currentwp12[1]}} + + xml=${xml//"currentmp01[0]"/${currentmp01[0]}} + xml=${xml//"currentmp01[1]"/${currentmp01[1]}} + xml=${xml//"currentmp02[0]"/${currentmp02[0]}} + xml=${xml//"currentmp02[1]"/${currentmp02[1]}} + xml=${xml//"currentmp04[0]"/${currentmp04[0]}} + xml=${xml//"currentmp04[1]"/${currentmp04[1]}} + xml=${xml//"currentmp05[0]"/${currentmp05[0]}} + xml=${xml//"currentmp05[1]"/${currentmp05[1]}} + xml=${xml//"currentmp11[0]"/${currentmp11[0]}} + xml=${xml//"currentmp11[1]"/${currentmp11[1]}} + xml=${xml//"currentmp12[0]"/${currentmp12[0]}} + xml=${xml//"currentmp12[1]"/${currentmp12[1]}} + + xml=${xml//"currentyp01[0]"/${currentyp01[0]}} + xml=${xml//"currentyp01[1]"/${currentyp01[1]}} + xml=${xml//"currentyp02[0]"/${currentyp02[0]}} + xml=${xml//"currentyp02[1]"/${currentyp02[1]}} + xml=${xml//"currentyp04[0]"/${currentyp04[0]}} + xml=${xml//"currentyp04[1]"/${currentyp04[1]}} + xml=${xml//"currentyp05[0]"/${currentyp05[0]}} + xml=${xml//"currentyp05[1]"/${currentyp05[1]}} + xml=${xml//"currentyp11[0]"/${currentyp11[0]}} + xml=${xml//"currentyp11[1]"/${currentyp11[1]}} + xml=${xml//"currentyp12[0]"/${currentyp12[0]}} + xml=${xml//"currentyp12[1]"/${currentyp12[1]}} + + xml=${xml//wpedituserid/${wpedituserid}} + xml=${xml//wppageauthor/${wppageauthor}} + xml=${xml//wppagelinkis/${wppagelinkis}} + xml=${xml//wpeditdateis/${wpeditdateis}} + + response=$(curl -d "${xml}" "${wpxmlrpclink}") + if echo "${response}" | grep -q '1'; then + addtologs "update $(grep 'Link' "${xml}" | cut -d'>' -f 6 | cut -d'<' -f 1))" + else + echo "${response}" | xmllint --format - > "${pathroot}/wp-page${wpeditpageid}-response.xml" 2>/dev/null + execerror "${pathroot}/wp-page${wpeditpageid}-response.xml" + fi +fi +execquite diff --git a/cctv-scheduler.conf b/cctv-scheduler.conf index 702868f..743d0d3 100644 --- a/cctv-scheduler.conf +++ b/cctv-scheduler.conf @@ -28,6 +28,11 @@ camera.test.local = true sensor.test.local = true +[enable-convert] +# List the convert block names. Only blocks with the TRUE value will be used. +camera.test.local = true + + [broadcast-config:camera.test.local] # Broadcast parameter description block always starts with "broadcast-config:". src = rtsp://user:pass@192.168.254.253:554/Streaming/Channels/101,http://radio.fm:8000/stream.mp3 @@ -108,5 +113,24 @@ step051 = setposashome, -, -, -, -, -, -, step061 = settextonosd, 0, 0, -, -, -, -, 3, hello, 'x|y: osd text position, text: text for osd without quotes or commas' step062 = settextonosd, 0, 0, -, -, -, -, 3, sensor-config:sensor.test.local, 'if a sensor configuration is specified, the sensor value is used instead of text' step063 = settextonosd, 0, 0, -, -, -, -, 3, , 'an empty text value is used to clear the osd' -step071 = downloadjpeg, 1280, 720, -, -, -, -, 5, , 'name: filename prefix, x|y: camera width|height resolution' +step071 = downloadjpeg, 1920, 1080, -, -, -, -, 5, , 'name: filename prefix, x|y: camera width|height resolution' step999 = rebootcamera, -, -, -, -, -, -, 120, , + + +[convert-config:camera.test.local] +# Converter parameter description block always starts with "convert-config:". +image_find_names = step071, image-01, image-02 +# If a image root or destination video directories on a remote host is used, a username and password must be specified. +# Supported protocols: +# FTP. +image_root_path = ftp://192.168.254.254/Records/camera.test.local +image_root_user = user +image_root_pass = pass + +video_dest_path = ftp://192.168.254.254/Downloads +video_dest_user = user +video_dest_pass = pass + +video_scale_x = 1920 +video_scale_y = 1080 +video_framerate = 25 \ No newline at end of file diff --git a/cctv-scheduler.py b/cctv-scheduler.py index 5b20558..cd5df83 100644 --- a/cctv-scheduler.py +++ b/cctv-scheduler.py @@ -4,15 +4,17 @@ import calendar import base64 +import datetime import json import logging +from random import choice import re import urllib.request from argparse import ArgumentParser -from datetime import datetime from ftplib import FTP from multiprocessing import Process, Queue -from os import environ, makedirs, path, remove, replace, sep, stat, walk +from os import environ, makedirs, path, remove, replace, rmdir, sep, stat, walk +from string import ascii_letters, digits from subprocess import Popen, PIPE, STDOUT from sys import platform from time import sleep @@ -389,6 +391,75 @@ class Connect: ) return 'ERROR' ''' + + @staticmethod + # pylint: disable=W0718 + def ftp_file_search( + root_path: (str), + search_name: (str, type(None)) = None, + ftp: FTP = None, + hostname: str = None, + username: str = None, + password: str = None + ) -> list: + """Search files over FTP. + + Args: + root_path (str): where to search. + search_name (str, None, optional): full or partial filename for the filter. + Defaults to None. + ftp (FTP, optional): FTP object generated by recursive search. Defaults to None. + hostname (str, optional): ftp hostname. Defaults to None. + username (str, optional): ftp username. Defaults to None. + password (str, optional): ftp password. Defaults to None. + + Returns: + list: list of found files. + """ + parent = False + if not ftp: + try: + ftp = FTP(host=hostname) + ftp.login(user=username, passwd=password) + parent = True + except Exception: + pass + + result = [] + ftp.cwd(root_path) + for file in ftp.mlsd(): + if file[1]['type'] == 'dir': + result = result + Connect.ftp_file_search( + root_path=root_path + "/" + file[0], + search_name=search_name, + ftp=ftp + ) + elif file[1]['type'] == 'file': + if search_name: + if search_name in file[0]: + result.append(root_path + "/" + file[0]) + else: + result.append(root_path + "/" + file[0]) + + if parent: + ftp.close() + result.sort() + return result + + @staticmethod + # pylint: disable=W0718,C0116 + def ftp_get_file(src_file: str, dst_file: str, hostname: str, username: str, password: str): + ftp = FTP(host=hostname) + try: + ftp.login(user=username, passwd=password) + with open(dst_file, "wb+") as file: + ftp.retrbinary(f"RETR {src_file}", file.write) + ftp.quit() + return True + except Exception as error: + logging.debug(msg='\n' + 'error: ' + str(error)) + return False + @staticmethod # pylint: disable=W0718,C0116 def ftp_put_file( @@ -411,30 +482,13 @@ class Connect: except Exception: ftp.mkd(path_item) ftp.cwd(path_item) - except Exception: - pass - - with open(src_file, "rb") as file: - ftp.storbinary(f"STOR {dst_file}", file) - ftp.quit() - return True - ''' - @staticmethod - def ftp_get_file(src_file: str, dst_file: str, hostname: str, username: str, password: str): - ftp = FTP(host=hostname) - try: - ftp.login(user=username, passwd=password) - with open(dst_file, "wb") as file: - ftp.retrbinary(f"RETR {src_file}", file.write) + with open(src_file, "rb") as file: + ftp.storbinary(f"STOR {dst_file}", file) ftp.quit() - except Exception: - pass - ''' - ''' - @staticmethod - def xmlrpc(): - pass - ''' + return True + except Exception as error: + logging.debug(msg='\n' + 'error: ' + str(error)) + return False class HikISAPI(Connect): @@ -1734,13 +1788,13 @@ class Sequence: if records_root_temp != path.dirname(path.realpath(__file__)): records_root_temp = path.dirname(path.realpath(__file__)) + sep + 'temp' makedirs(records_root_temp, exist_ok=True) - dy = datetime.now().strftime('%Y') - dm = datetime.now().strftime('%m') - dv = datetime.now().strftime('%V') - dd = datetime.now().strftime('%d') - th = datetime.now().strftime('%H') - tm = datetime.now().strftime('%M') - ts = datetime.now().strftime('%S') + dy = datetime.datetime.now().strftime('%Y') + dm = datetime.datetime.now().strftime('%m') + dv = datetime.datetime.now().strftime('%V') + dd = datetime.datetime.now().strftime('%d') + th = datetime.datetime.now().strftime('%H') + tm = datetime.datetime.now().strftime('%M') + ts = datetime.datetime.now().strftime('%S') records_file_name = ( key + '_' + dy + '-' + dm + '-' + dd + '_' + th + '.' + tm + '.' + ts + '.jpeg' ) @@ -1838,6 +1892,164 @@ class Sequence: logging.warning(msg='result:' + key + ' = ERROR') +class Convert: + """Convert handling. + """ + @staticmethod + # pylint: disable=W0612 + def run( + image_root_path: (str, list), + image_find_names: list, + video_dest_path: str, + video_dest_sufx: str, + video_scale_x: int, + video_scale_y: int, + video_framerate: int, + video_duration: int, + temp_path: str, + image_root_user: (str, type(None)) = None, + image_root_pass: (str, type(None)) = None, + video_dest_user: (str, type(None)) = None, + video_dest_pass: (str, type(None)) = None + ) -> None: + """Converting executor. + + Args: + image_root_path (str, list): source images path. + image_find_names (list): image names to search. + video_dest_path (str): path to destination video. + video_dest_sufx (str): destination video name suffix. + video_scale_x (int): destination video width. + video_scale_y (int): destination video height. + video_framerate (int): destination video frame per second. + video_duration (int): destination video duration. + temp_path (str): path to directory for temp files. + image_root_user (str, type, optional): username to source images ftp,sftp,smb path. + Defaults to None. + image_root_pass (str, type, optional): password to source images ftp,sftp,smb path. + Defaults to None. + video_dest_user (str, type, optional): username to destination video ftp,sftp,smb path. + Defaults to None. + video_dest_pass (str, type, optional): password to destination video ftp,sftp,smb path. + Defaults to None. + """ + if isinstance(image_root_path, str): + image_root_path = [image_root_path] + + temp_path = temp_path + sep + Do.random_string(8) + temp_files = [] + for name in image_find_names: + image_found = [] + for image_root in image_root_path: + if '://' in image_root: + image_hostname = image_root.split('/')[2] + image_hosttype = image_root.split('://')[0] + if image_hosttype == 'ftp': + image_hostport = 21 + if image_hosttype == 'sftp': + image_hostport = 22 + if image_hosttype == 'smb': + image_hostport = 445 + image_hostpath = image_root.replace(image_hosttype + '://' + image_hostname, '') + if '@' in image_hostname: + image_root_user = image_hostname.split('@')[0].split(':')[0] + image_root_pass = image_hostname.split('@')[0].split(':')[1] + image_hostname = image_hostname.split('@')[1] + if ':' in image_hostname: + image_hostport = int(image_hostname.split(':')[1]) + image_hostname = image_hostname.split(':')[0] + if image_hosttype == 'ftp': + image_found = image_found + Connect.ftp_file_search( + root_path=image_hostpath, + search_name=name, + hostname=image_hostname, + username=image_root_user, + password=image_root_pass + ) + makedirs(temp_path, exist_ok=True) + for image in image_found: + if Connect.ftp_get_file( + src_file=image, + dst_file=temp_path + sep + path.basename(image), + hostname=image_hostname, + username=image_root_user, + password=image_root_pass + ): + temp_files.append(temp_path + sep + path.basename(image)) + elif image_hosttype == 'sftp': + pass + else: + pass + + image_temp_list = temp_path + sep + 'convert.list' + image_amount = 0 + with open(image_temp_list, mode='w+', encoding='UTF-8') as converter_list: + for file in Do.file_search(root_path=temp_path, search_name=name): + converter_list.write("\nfile '" + file + "'") + image_amount += 1 + temp_files.append(image_temp_list) + + video_converted = name + '_' + video_dest_sufx + '.mp4' + video_temp_path = temp_path + sep + video_converted + video_conv_conf = ('' + + '-r ' + + str(image_amount) + '/' + str(video_duration) + + ' -f concat -safe 0 -i ' + + image_temp_list + + ' -c:v libx264 -vf scale=' + str(video_scale_x) + ':' + str(video_scale_y) + + ',fps=' + str(video_framerate) + ',format=yuv420p ' + + video_temp_path + + ' -y' + ) + + if FFmpeg.run(raw=video_conv_conf) == 0: + temp_files.append(video_temp_path) + + if '://' in video_dest_path: + video_hostname = video_dest_path.split('/')[2] + video_hosttype = video_dest_path.split('://')[0] + if video_hosttype == 'ftp': + video_hostport = 21 + if video_hosttype == 'sftp': + video_hostport = 22 + if video_hosttype == 'smb': + video_hostport = 445 + video_hostpath = video_dest_path.replace( + video_hosttype + '://' + video_hostname, + '' + ) + if '@' in image_hostname: + video_dest_user = video_hostname.split('@')[0].split(':')[0] + video_dest_pass = video_hostname.split('@')[0].split(':')[1] + video_hostname = video_hostname.split('@')[1] + if ':' in video_hostname: + video_hostport = int(video_hostname.split(':')[1]) + video_hostname = video_hostname.split(':')[0] + if video_hosttype == 'ftp': + if Connect.ftp_put_file( + src_file=video_temp_path, + dst_file=video_hostpath + '/' + video_converted, + hostname=video_hostname, + username=video_dest_user, + password=video_dest_pass + ): + pass + elif image_hosttype == 'sftp': + pass + else: + pass + + for temp_file in temp_files: + try: + remove(temp_file) + except OSError as error: + logging.debug(msg='\n' + 'error: ' + str(error)) + try: + rmdir(temp_path) + except OSError as error: + logging.debug(msg='\n' + 'error: ' + str(error)) + + class Proc: """Find a running process from Python. """ @@ -2033,13 +2245,13 @@ class FFmpeg: target=cls._watchdog, args=(proc.pid, watchsec, que,), daemon=True - ).start() + ).start() for line in proc.stdout: if not que: - print(line, flush=True) + logging.debug(msg=line) else: que.put(line) - return proc.returncode + return proc.returncode @classmethod def _bin(cls, ffpath: str, tool: str = 'ffmpeg') -> str: @@ -2346,6 +2558,18 @@ class Do(): } return date + @staticmethod + def random_string(length: int) -> str: + """Generate string from lowercase letters, uppercase letters, digits. + + Args: + length (int): string lenght. + + Returns: + str: random string. + """ + return ''.join(choice(ascii_letters + digits) for i in range(length)) + @staticmethod # pylint: disable=W0612 def file_search(root_path: str, search_name: (str, type(None)) = None) -> list: @@ -2368,6 +2592,7 @@ class Do(): found_list.append(path.join(path.realpath(root), file)) else: found_list.append(path.join(path.realpath(root), file)) + found_list.sort() return found_list @staticmethod @@ -2774,7 +2999,7 @@ class Do(): if __name__ == "__main__": - time_start = datetime.now() + time_start = datetime.datetime.now() args = ArgumentParser( prog='cctv-scheduler', @@ -2782,7 +3007,7 @@ if __name__ == "__main__": epilog='Dependencies: ' '- Python 3 (tested version 3.9.5), ' '- Python 3 modules: paramiko ' - ) + ) args.add_argument('--config', type=str, default=path.splitext(__file__)[0] + '.conf', required=False, help='custom configuration file path') @@ -2794,10 +3019,27 @@ if __name__ == "__main__": help='convert JPEG collection to MP4') args.add_argument('-p', '--publisher', action='store_true', required=False, help='publish content from templates') + args.add_argument('-d', '--day', type=int, default=0, required=False, + help=('day in amount of days from today, ' + + 'for which the publication or conversion is made') + ) + args.add_argument('-w', '--week', type=int, default=0, required=False, + help=('week in amount of weeks from today, ' + + 'for which the publication or conversion is made') + ) + args.add_argument('-m', '--month', type=int, default=0, required=False, + help=('month in amount of months from today, ' + + 'for which the publication or conversion is made') + ) + args.add_argument('-y', '--year', type=int, default=0, required=False, + help=('year in amount of years from today, ' + + 'for which the publication or conversion is made') + ) args = vars(args.parse_args()) log_root = path.dirname(path.realpath(__file__)) log_level = 'INFO' + temp_path = path.dirname(path.realpath(__file__)) + sep + 'temp' if path.exists(args['config']): conf = Parse(parameters=args['config'], block='common') if 'log_root' in conf.data: @@ -2824,9 +3066,12 @@ if __name__ == "__main__": logging.StreamHandler() ], level=log_level - ) + ) logging.getLogger("paramiko").setLevel(logging.WARNING) + if 'temp_path' in conf.data: + temp_path = conf.data['temp_path'] + if args['broadcast']: logging.info(msg='Starting streaming media to destination') broadcasts = {} @@ -2924,11 +3169,140 @@ if __name__ == "__main__": records_root_pass=records_root_pass ) elif args['converter']: - logging.info(msg='Starting convert JPEG collection to MP4') + if args['day'] or args['week'] or args['month'] or args['year']: + convert_period = None + convert_amount = None + video_duration = None + if args['day']: + convert_period = 'day' + convert_amount = args['day'] + if args['week']: + convert_period = 'week' + convert_amount = args['week'] + if args['month']: + convert_period = 'month' + convert_amount = args['month'] + if args['year']: + convert_period = 'year' + convert_amount = args['year'] + convert_date = Do.date_calc(period=convert_period, amount=convert_amount) + + logging.info(msg='Starting convert JPEG collection to MP4') + conf = Parse(parameters=args['config'], block='enable-convert') + for key, value in conf.data.items(): + if value == 'true': + convert_config = Parse( + parameters=args['config'], + block='convert-config:' + key + ).data + image_root_path = path.dirname(path.realpath(__file__)) + image_root_user = None + image_root_pass = None + image_find_names = None + if 'image_root_path' in convert_config: + image_root_path = convert_config['image_root_path'] + if 'image_root_user' in convert_config: + image_root_user = convert_config['image_root_user'] + if 'image_root_pass' in convert_config: + image_root_pass = convert_config['image_root_pass'] + image_find_names = [] + for name in convert_config['image_find_names'].split(','): + image_find_names.append(name.strip()) + + if convert_date['period'] == 'day': + image_root_path = ('' + + image_root_path + '/' + + str(convert_date['start']['y']) + '/' + + str(convert_date['start']['m']).zfill(2) + '/' + + str(convert_date['start']['w']).zfill(2) + '/' + + str(convert_date['start']['d']).zfill(2) + ) + video_dest_sufx = ('' + + str(convert_date['start']['y']) + '.' + + str(convert_date['start']['m']).zfill(2) + '.' + + str(convert_date['start']['d']).zfill(2) + ) + video_duration = 1 + if convert_date['period'] == 'week': + if convert_date['start']['m'] == convert_date['end']['m']: + image_root_path = ('' + + image_root_path + '/' + + str(convert_date['start']['y']) + '/' + + str(convert_date['start']['m']).zfill(2) + '/' + + str(convert_date['start']['w']).zfill(2) + ) + else: + image_root_path = [ + ('' + + image_root_path + '/' + + str(convert_date['start']['y']) + '/' + + str(convert_date['start']['m']).zfill(2) + '/' + + str(convert_date['start']['w']).zfill(2) + ), + ('' + + image_root_path + '/' + + str(convert_date['end']['y']) + '/' + + str(convert_date['end']['m']).zfill(2) + '/' + + str(convert_date['end']['w']).zfill(2) + ) + ] + video_dest_sufx = ('' + + str(convert_date['start']['y']) + '-w' + + str(convert_date['start']['w']).zfill(2) + ) + video_duration = 7 + if convert_date['period'] == 'month': + image_root_path = ('' + + image_root_path + '/' + + str(convert_date['start']['y']) + '/' + + str(convert_date['start']['m']).zfill(2) + ) + video_dest_sufx = ('' + + str(convert_date['start']['y']) + '.' + + str(convert_date['start']['m']).zfill(2) + ) + video_duration = 30 + if convert_date['period'] == 'year': + image_root_path = ('' + + image_root_path + '/' + + str(convert_date['start']['y']) + ) + video_dest_sufx = ('' + + str(convert_date['start']['y']) + ) + video_duration = 360 + + video_dest_path = path.dirname(path.realpath(__file__)) + video_dest_user = None + video_dest_pass = None + if 'video_dest_path' in convert_config: + video_dest_path = convert_config['video_dest_path'] + if 'video_dest_user' in convert_config: + video_dest_user = convert_config['video_dest_user'] + if 'video_dest_pass' in convert_config: + video_dest_pass = convert_config['video_dest_pass'] + + Convert.run( + image_root_path=image_root_path, + image_root_user=image_root_user, + image_root_pass=image_root_pass, + image_find_names=image_find_names, + video_dest_path=video_dest_path, + video_dest_sufx=video_dest_sufx, + video_dest_user=video_dest_user, + video_dest_pass=video_dest_pass, + video_scale_x=int(convert_config['video_scale_x']), + video_scale_y=int(convert_config['video_scale_y']), + video_framerate=int(convert_config['video_framerate']), + video_duration=video_duration, + temp_path=temp_path + ) + else: + logging.info(msg='Period was not selected. Exit.') elif args['publisher']: logging.info(msg='Starting publish content from templates') else: logging.info(msg='Start arguments was not selected. Exit.') - time_execute = datetime.now() - time_start + time_execute = datetime.datetime.now() - time_start logging.info(msg='execution time is ' + str(time_execute) + '. Exit.') diff --git a/info/images/cctv-scheduler-0.4.png b/info/images/cctv-scheduler-0.4.png new file mode 100755 index 0000000000000000000000000000000000000000..341f89d9b3c2068bab52e19d47eb438b7966de8a GIT binary patch literal 368622 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

NDTgK1SvY+8vo9%lnBAlGv{Ak{3~ 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�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�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 literal 0 HcmV?d00001