Merge pull request #852 from jaredb7/Configurable-Service-Logging-Options
Configurable service logging options for select services
This commit is contained in:
+234
-56
@@ -245,10 +245,106 @@ if(isset($_GET['submit'])) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$fh = fopen('/etc/birdnet/birdnet.conf', "w");
|
if (isset($_GET["LogLevel_BirdnetRecordingService"])) {
|
||||||
$fh2 = fopen("./scripts/thisrun.txt", "w");
|
$birdnet_recording_service_log_level = trim($_GET["LogLevel_BirdnetRecordingService"]);
|
||||||
fwrite($fh, $contents);
|
|
||||||
fwrite($fh2, $contents2);
|
//If setting exists change it's value
|
||||||
|
if (array_key_exists('LogLevel_BirdnetRecordingService', $config)) {
|
||||||
|
//Setting exists already, see if the value changed
|
||||||
|
if (strcmp($birdnet_recording_service_log_level, $config['LogLevel_BirdnetRecordingService']) !== 0) {
|
||||||
|
$contents = preg_replace("/LogLevel_BirdnetRecordingService=.*/", "LogLevel_BirdnetRecordingService=\"$birdnet_recording_service_log_level\"", $contents);
|
||||||
|
$contents2 = preg_replace("/LogLevel_BirdnetRecordingService=.*/", "LogLevel_BirdnetRecordingService=\"$birdnet_recording_service_log_level\"", $contents2);
|
||||||
|
$fh = fopen("/etc/birdnet/birdnet.conf", "w");
|
||||||
|
$fh2 = fopen("./scripts/thisrun.txt", "w");
|
||||||
|
fwrite($fh, $contents);
|
||||||
|
fwrite($fh2, $contents2);
|
||||||
|
sleep(1);
|
||||||
|
exec("sudo systemctl restart birdnet_recording.service");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//Create the setting in the setting file - same as what update_birdnet_snippets.sh does but will take the users selected log level as the value
|
||||||
|
shell_exec('sudo echo "LogLevel_BirdnetRecordingService=\"' . $birdnet_recording_service_log_level . '\"" >> /etc/birdnet/birdnet.conf');
|
||||||
|
//also update this run txt file
|
||||||
|
shell_exec('sudo echo "LogLevel_BirdnetRecordingService=\"' . $birdnet_recording_service_log_level . '\"" >> ./scripts/thisrun.txt');
|
||||||
|
|
||||||
|
//Reload the config files as we've changed the contents, we need to make sure the contents of the existing variables reflects contents of the config file
|
||||||
|
sleep(1);
|
||||||
|
$contents = file_get_contents('/etc/birdnet/birdnet.conf');
|
||||||
|
$contents2 = file_get_contents('./scripts/thisrun.txt');
|
||||||
|
|
||||||
|
exec("sudo systemctl restart birdnet_recording.service");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET["LogLevel_SpectrogramViewerService"])) {
|
||||||
|
$spectrogram_viewer_service_log_level = trim($_GET["LogLevel_SpectrogramViewerService"]);
|
||||||
|
|
||||||
|
//If setting exists change it's value
|
||||||
|
if (array_key_exists('LogLevel_SpectrogramViewerService', $config)) {
|
||||||
|
//Setting exists already, see if the value changed
|
||||||
|
if (strcmp($spectrogram_viewer_service_log_level, $config['LogLevel_SpectrogramViewerService']) !== 0) {
|
||||||
|
$contents = preg_replace("/LogLevel_SpectrogramViewerService=.*/", "LogLevel_SpectrogramViewerService=\"$spectrogram_viewer_service_log_level\"", $contents);
|
||||||
|
$contents2 = preg_replace("/LogLevel_SpectrogramViewerService=.*/", "LogLevel_SpectrogramViewerService=\"$spectrogram_viewer_service_log_level\"", $contents2);
|
||||||
|
$fh = fopen("/etc/birdnet/birdnet.conf", "w");
|
||||||
|
$fh2 = fopen("./scripts/thisrun.txt", "w");
|
||||||
|
fwrite($fh, $contents);
|
||||||
|
fwrite($fh2, $contents2);
|
||||||
|
sleep(1);
|
||||||
|
exec("sudo systemctl restart spectrogram_viewer.service");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//Create the setting in the setting file - same as what update_birdnet_snippets.sh does but will take the users selected log level as the value
|
||||||
|
shell_exec('sudo echo "LogLevel_SpectrogramViewerService=\"' . $spectrogram_viewer_service_log_level . '\"" >> /etc/birdnet/birdnet.conf');
|
||||||
|
//also update this run txt file
|
||||||
|
shell_exec('sudo echo "LogLevel_SpectrogramViewerService=\"' . $spectrogram_viewer_service_log_level . '\"" >> ./scripts/thisrun.txt');
|
||||||
|
|
||||||
|
//Reload the config files as we've changed the contents, we need to make sure the contents of the existing variables reflects contents of the config file
|
||||||
|
sleep(1);
|
||||||
|
$contents = file_get_contents('/etc/birdnet/birdnet.conf');
|
||||||
|
$contents2 = file_get_contents('./scripts/thisrun.txt');
|
||||||
|
|
||||||
|
exec("sudo systemctl restart spectrogram_viewer.service");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET["LogLevel_LiveAudioStreamService"])) {
|
||||||
|
$livestream_audio_service_log_level = trim($_GET["LogLevel_LiveAudioStreamService"]);
|
||||||
|
|
||||||
|
//If setting exists change it's value
|
||||||
|
if (array_key_exists('LogLevel_LiveAudioStreamService', $config)) {
|
||||||
|
//Setting exists already, see if the value changed
|
||||||
|
if (strcmp($livestream_audio_service_log_level, $config['LogLevel_LiveAudioStreamService']) !== 0) {
|
||||||
|
$contents = preg_replace("/LogLevel_LiveAudioStreamService=.*/", "LogLevel_LiveAudioStreamService=\"$livestream_audio_service_log_level\"", $contents);
|
||||||
|
$contents2 = preg_replace("/LogLevel_LiveAudioStreamService=.*/", "LogLevel_LiveAudioStreamService=\"$livestream_audio_service_log_level\"", $contents2);
|
||||||
|
//Write the settings to the config files, so we can restart the relevant services
|
||||||
|
$fh = fopen("/etc/birdnet/birdnet.conf", "w");
|
||||||
|
$fh2 = fopen("./scripts/thisrun.txt", "w");
|
||||||
|
fwrite($fh, $contents);
|
||||||
|
fwrite($fh2, $contents2);
|
||||||
|
sleep(1);
|
||||||
|
exec("sudo systemctl restart livestream.service && sudo systemctl restart icecast2.service");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//Create the setting in the setting file - same as what update_birdnet_snippets.sh does but will take the users selected log level as the value
|
||||||
|
shell_exec('sudo echo "LogLevel_LiveAudioStreamService=\"' . $livestream_audio_service_log_level . '\"" >> /etc/birdnet/birdnet.conf');
|
||||||
|
//also update this run txt file
|
||||||
|
shell_exec('sudo echo "LogLevel_LiveAudioStreamService=\"' . $livestream_audio_service_log_level . '\"" >> ./scripts/thisrun.txt');
|
||||||
|
|
||||||
|
//Reload the config files as we've changed the contents, we need to make sure the contents of the existing variables reflects contents of the config file
|
||||||
|
sleep(1);
|
||||||
|
$contents = file_get_contents('/etc/birdnet/birdnet.conf');
|
||||||
|
$contents2 = file_get_contents('./scripts/thisrun.txt');
|
||||||
|
|
||||||
|
exec("sudo systemctl restart livestream.service && sudo systemctl restart icecast2.service");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Finally write the data out. some sections do this themselves in order to have the new settings ready for the services that will be restarted
|
||||||
|
//but will doubly ensure the settings are saved after any modification
|
||||||
|
$fh = fopen('/etc/birdnet/birdnet.conf', "w");
|
||||||
|
$fh2 = fopen("./scripts/thisrun.txt", "w");
|
||||||
|
fwrite($fh, $contents);
|
||||||
|
fwrite($fh2, $contents2);
|
||||||
}
|
}
|
||||||
|
|
||||||
$user = trim(shell_exec("awk -F: '/1000/{print $1}' /etc/passwd"));
|
$user = trim(shell_exec("awk -F: '/1000/{print $1}' /etc/passwd"));
|
||||||
@@ -288,57 +384,6 @@ if (file_exists('./scripts/thisrun.txt')) {
|
|||||||
output.innerHTML = this.value;
|
output.innerHTML = this.value;
|
||||||
document.getElementById("predictionCount").innerHTML = parseInt((this.value * <?php echo $count; ?>)/100);
|
document.getElementById("predictionCount").innerHTML = parseInt((this.value * <?php echo $count; ?>)/100);
|
||||||
}
|
}
|
||||||
//Keep track of how many new input fields were added
|
|
||||||
var number_of_new_rtsp_urls_added = 0;
|
|
||||||
//Function to insert new input fields
|
|
||||||
function addNewrtspInput() {
|
|
||||||
//Find the placeholder input field
|
|
||||||
var url_template_element = document.getElementById('rtsp_stream_url_placeholder');
|
|
||||||
var new_url_input_template = url_template_element.cloneNode();
|
|
||||||
var br_seperator = document.createElement("BR");
|
|
||||||
|
|
||||||
//Fix up the new element so it's visible, set the style so it's sligned correctly
|
|
||||||
new_url_input_template.setAttribute("id", "rtsp_stream_url_new_" + number_of_new_rtsp_urls_added);
|
|
||||||
new_url_input_template.setAttribute("name", "rtsp_stream_new_" + number_of_new_rtsp_urls_added);
|
|
||||||
new_url_input_template.removeAttribute("style");
|
|
||||||
|
|
||||||
//Insert the new input field before the button to add new urls
|
|
||||||
var newrtspstream_button = document.getElementById('newrtspstream_button_container');
|
|
||||||
//Insert the new input element before the newrtspstream button
|
|
||||||
newrtspstream_button.parentNode.insertBefore(new_url_input_template, newrtspstream_button);
|
|
||||||
//Add a separator before the button
|
|
||||||
newrtspstream_button.parentNode.insertBefore(br_seperator, newrtspstream_button);
|
|
||||||
|
|
||||||
//Increment the counter
|
|
||||||
number_of_new_rtsp_urls_added++;
|
|
||||||
}
|
|
||||||
|
|
||||||
var rtsp_stream_string = "";
|
|
||||||
var rtsp_stream_string_array = [];
|
|
||||||
//Collect all the rtsp urls that have been set, concat them into a single string and set it into the rtsp_stream input field so it gets saved
|
|
||||||
function collectrtspUrls() {
|
|
||||||
//Reset the array and string so we don't get duplicates
|
|
||||||
rtsp_stream_string = "";
|
|
||||||
rtsp_stream_string_array = [];
|
|
||||||
|
|
||||||
//Get the inputs by name (which is similar across
|
|
||||||
var existing_rtsp_stream_urls = document.querySelectorAll('[name^="rtsp_stream_"]');
|
|
||||||
//Loop over the result and get the values
|
|
||||||
for (let i = 0; i < existing_rtsp_stream_urls.length; i++) {
|
|
||||||
//Only collect results that re not empty and add them to the array
|
|
||||||
if (existing_rtsp_stream_urls[i].value !== 'undefined' && existing_rtsp_stream_urls[i].value !== "") {
|
|
||||||
rtsp_stream_string_array.push(existing_rtsp_stream_urls[i].value.trim());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//if the array is not empty, then implode the array joining all the values by a comma
|
|
||||||
if (rtsp_stream_string_array.length !== 0) {
|
|
||||||
rtsp_stream_string = rtsp_stream_string_array.join(',');
|
|
||||||
//Locate the hidden rtsp_stream input field that we'll populate with the full string which will get saved to the config file
|
|
||||||
var rtsp_stream_input = document.querySelector('[name=rtsp_stream]');
|
|
||||||
rtsp_stream_input.setAttribute('value',rtsp_stream_string);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
<p>If a Human is predicted anywhere among the top <span id="predictionCount"><?php echo $newconfig['PRIVACY_THRESHOLD'] == 0 ? "threshold % of" : intval(($newconfig['PRIVACY_THRESHOLD'] * $count)/100); ?></span> predictions, the sample will be considered of human origin and no data will be collected. Start with 1% and move up as needed.</p>
|
<p>If a Human is predicted anywhere among the top <span id="predictionCount"><?php echo $newconfig['PRIVACY_THRESHOLD'] == 0 ? "threshold % of" : intval(($newconfig['PRIVACY_THRESHOLD'] * $count)/100); ?></span> predictions, the sample will be considered of human origin and no data will be collected. Start with 1% and move up as needed.</p>
|
||||||
</td></tr></table><br>
|
</td></tr></table><br>
|
||||||
@@ -408,6 +453,61 @@ foreach($formats as $format){
|
|||||||
<br>
|
<br>
|
||||||
<span id="newrtspstream" onclick="addNewrtspInput();">Add</span><br>
|
<span id="newrtspstream" onclick="addNewrtspInput();">Add</span><br>
|
||||||
</div>
|
</div>
|
||||||
|
<script>
|
||||||
|
//Keep track of how many new input fields were added
|
||||||
|
var number_of_new_rtsp_urls_added = 0;
|
||||||
|
|
||||||
|
//Function to insert new input fields
|
||||||
|
function addNewrtspInput() {
|
||||||
|
//Find the placeholder input field
|
||||||
|
var url_template_element = document.getElementById('rtsp_stream_url_placeholder');
|
||||||
|
var new_url_input_template = url_template_element.cloneNode();
|
||||||
|
var br_seperator = document.createElement("BR");
|
||||||
|
|
||||||
|
//Fix up the new element so it's visible, set the style so it's sligned correctly
|
||||||
|
new_url_input_template.setAttribute("id", "rtsp_stream_url_new_" + number_of_new_rtsp_urls_added);
|
||||||
|
new_url_input_template.setAttribute("name", "rtsp_stream_new_" + number_of_new_rtsp_urls_added);
|
||||||
|
new_url_input_template.removeAttribute("style");
|
||||||
|
|
||||||
|
//Insert the new input field before the button to add new urls
|
||||||
|
var newrtspstream_button = document.getElementById('newrtspstream_button_container');
|
||||||
|
//Insert the new input element before the newrtspstream button
|
||||||
|
newrtspstream_button.parentNode.insertBefore(new_url_input_template, newrtspstream_button);
|
||||||
|
//Add a separator before the button
|
||||||
|
newrtspstream_button.parentNode.insertBefore(br_seperator, newrtspstream_button);
|
||||||
|
|
||||||
|
//Increment the counter
|
||||||
|
number_of_new_rtsp_urls_added++;
|
||||||
|
}
|
||||||
|
|
||||||
|
var rtsp_stream_string = "";
|
||||||
|
var rtsp_stream_string_array = [];
|
||||||
|
|
||||||
|
//Collect all the rtsp urls that have been set, concat them into a single string and set it into the rtsp_stream input field so it gets saved
|
||||||
|
function collectrtspUrls() {
|
||||||
|
//Reset the array and string so we don't get duplicates
|
||||||
|
rtsp_stream_string = "";
|
||||||
|
rtsp_stream_string_array = [];
|
||||||
|
|
||||||
|
//Get the inputs by name (which is similar across
|
||||||
|
var existing_rtsp_stream_urls = document.querySelectorAll('[name^="rtsp_stream_"]');
|
||||||
|
//Loop over the result and get the values
|
||||||
|
for (let i = 0; i < existing_rtsp_stream_urls.length; i++) {
|
||||||
|
//Only collect results that re not empty and add them to the array
|
||||||
|
if (existing_rtsp_stream_urls[i].value !== 'undefined' && existing_rtsp_stream_urls[i].value !== "") {
|
||||||
|
rtsp_stream_string_array.push(existing_rtsp_stream_urls[i].value.trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if the array is not empty, then implode the array joining all the values by a comma
|
||||||
|
if (rtsp_stream_string_array.length !== 0) {
|
||||||
|
rtsp_stream_string = rtsp_stream_string_array.join(',');
|
||||||
|
//Locate the hidden rtsp_stream input field that we'll populate with the full string which will get saved to the config file
|
||||||
|
var rtsp_stream_input = document.querySelector('[name=rtsp_stream]');
|
||||||
|
rtsp_stream_input.setAttribute('value', rtsp_stream_string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
<p>If you place an RTSP stream URL here, BirdNET-Pi will use that as its audio source.<br>Multiple streams are allowed but may have a impact on rPi performance.<br>Analyze ffmpeg CPU/Memory usage with <b>top</b> or <b>htop</b> if necessary.<br>To remove all and use the soundcard again, just delete the RTSP entries and click Save at the bottom.</p>
|
<p>If you place an RTSP stream URL here, BirdNET-Pi will use that as its audio source.<br>Multiple streams are allowed but may have a impact on rPi performance.<br>Analyze ffmpeg CPU/Memory usage with <b>top</b> or <b>htop</b> if necessary.<br>To remove all and use the soundcard again, just delete the RTSP entries and click Save at the bottom.</p>
|
||||||
</td></tr></table><br>
|
</td></tr></table><br>
|
||||||
<table class="settingstable"><tr><td>
|
<table class="settingstable"><tr><td>
|
||||||
@@ -505,7 +605,85 @@ foreach($formats as $format){
|
|||||||
<input name="freqshift_pitch" type="number" min="-4000" max="4000" step="1" value="<?php print($newconfig['FREQSHIFT_PITCH']);?>" required/><br>
|
<input name="freqshift_pitch" type="number" min="-4000" max="4000" step="1" value="<?php print($newconfig['FREQSHIFT_PITCH']);?>" required/><br>
|
||||||
</p>
|
</p>
|
||||||
</td></tr></table><br>
|
</td></tr></table><br>
|
||||||
</p>
|
|
||||||
|
<table class="settingstable">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<h2>Logging</h2>
|
||||||
|
<div class="callout callout-warning">
|
||||||
|
<b>Note:</b>
|
||||||
|
It is recommended that the Log Level be set to <b>Error</b> on production systems to keep output
|
||||||
|
manageable, by only reporting errors.
|
||||||
|
<br>
|
||||||
|
Not all components support the log level option at this time.
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Birdnet Recording:
|
||||||
|
<select id="LogLevel_BirdnetRecordingService" name="LogLevel_BirdnetRecordingService">
|
||||||
|
<option value="error" <?php echo $newconfig['LogLevel_BirdnetRecordingService'] == "error" || !array_key_exists('LogLevel_BirdnetRecordingService', $newconfig) ? "selected=''" : "" ?>>
|
||||||
|
Errors Only
|
||||||
|
</option>
|
||||||
|
<option value="warning" <?php echo $newconfig['LogLevel_BirdnetRecordingService'] == "warning" ? "selected=''" : "" ?>>
|
||||||
|
Warning
|
||||||
|
</option>
|
||||||
|
<option value="info" <?php echo $newconfig['LogLevel_BirdnetRecordingService'] == "info" ? "selected=''" : "" ?>>
|
||||||
|
Info
|
||||||
|
</option>
|
||||||
|
<option value="debug" <?php echo $newconfig['LogLevel_BirdnetRecordingService'] == "debug" ? "selected=''" : "" ?>>
|
||||||
|
Debug
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Live Audio Stream:
|
||||||
|
<select id="LogLevel_LiveAudioStreamService" name="LogLevel_LiveAudioStreamService">
|
||||||
|
<option value="error" <?php echo $newconfig['LogLevel_LiveAudioStreamService'] == "error" || !array_key_exists('LogLevel_LiveAudioStreamService', $newconfig) ? "selected=''" : "" ?>>
|
||||||
|
Errors Only
|
||||||
|
</option>
|
||||||
|
<option value="warning" <?php echo $newconfig['LogLevel_LiveAudioStreamService'] == "warning" ? "selected=''" : "" ?>>
|
||||||
|
Warning
|
||||||
|
</option>
|
||||||
|
<option value="info" <?php echo $newconfig['LogLevel_LiveAudioStreamService'] == "info" ? "selected=''" : "" ?>>
|
||||||
|
Info
|
||||||
|
</option>
|
||||||
|
<option value="debug" <?php echo $newconfig['LogLevel_LiveAudioStreamService'] == "debug" ? "selected=''" : "" ?>>
|
||||||
|
Debug
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Spectrogram Service:
|
||||||
|
<select id="LogLevel_SpectrogramViewerService" name="LogLevel_SpectrogramViewerService">
|
||||||
|
<option value="error" <?php echo $newconfig['LogLevel_SpectrogramViewerService'] == "error" || !array_key_exists('LogLevel_SpectrogramViewerService', $newconfig) ? "selected=''" : "" ?>>
|
||||||
|
Errors Only
|
||||||
|
</option>
|
||||||
|
<option value="warning" <?php echo $newconfig['LogLevel_SpectrogramViewerService'] == "warning" ? "selected=''" : "" ?>>
|
||||||
|
Warning
|
||||||
|
</option>
|
||||||
|
<option value="info" <?php echo $newconfig['LogLevel_SpectrogramViewerService'] == "info" ? "selected=''" : "" ?>>
|
||||||
|
Info
|
||||||
|
</option>
|
||||||
|
<option value="debug" <?php echo $newconfig['LogLevel_SpectrogramViewerService'] == "debug" ? "selected=''" : "" ?>>
|
||||||
|
Debug
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<small>
|
||||||
|
<b>'error'</b> - Show all errors, including ones which can be recovered from. <b>This is the default value.</b><br>
|
||||||
|
<b>'warning'</b> - Show all warnings and errors. Any message related to possibly incorrect or unexpected events will be shown.<br>
|
||||||
|
<b>'info'</b> - Show informative messages and output during processing. This is in addition to warnings and errors. This will produce more output, use this for initial debugging.<br>
|
||||||
|
<b>'debug'</b> - Show everything, including debugging information. Produces a lot of output.<br>
|
||||||
|
</small>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
<br><br>
|
<br><br>
|
||||||
<input type="hidden" name="view" value="Advanced">
|
<input type="hidden" name="view" value="Advanced">
|
||||||
<button onclick="if(<?php print($newconfig['PRIVACY_THRESHOLD']);?> != document.getElementById('privacy_threshold').value){return confirm('This will take about 90 seconds.')} collectrtspUrls();" type="submit" name="submit" value="advanced">
|
<button onclick="if(<?php print($newconfig['PRIVACY_THRESHOLD']);?> != document.getElementById('privacy_threshold').value){return confirm('This will take about 90 seconds.')} collectrtspUrls();" type="submit" name="submit" value="advanced">
|
||||||
|
|||||||
@@ -1,10 +1,16 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Performs the recording from the specified RTSP stream or soundcard
|
# Performs the recording from the specified RTSP stream or soundcard
|
||||||
#set -x
|
|
||||||
source /etc/birdnet/birdnet.conf
|
source /etc/birdnet/birdnet.conf
|
||||||
|
|
||||||
# Set the logging level
|
# Read the logging level from the configuration option
|
||||||
LOGGING_LEVEL='error'
|
LOGGING_LEVEL="${LogLevel_BirdnetRecordingService}"
|
||||||
|
# If empty for some reason default to log level of error
|
||||||
|
[ -z $LOGGING_LEVEL ] && LOGGING_LEVEL='error'
|
||||||
|
# Additionally if we're at debug or info level then allow printing of script commands and variables
|
||||||
|
if [ "$LOGGING_LEVEL" == "info" ] || [ "$LOGGING_LEVEL" == "debug" ];then
|
||||||
|
# Enable printing of commands/variables etc to terminal for debugging
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
[ -z $RECORDING_LENGTH ] && RECORDING_LENGTH=15
|
[ -z $RECORDING_LENGTH ] && RECORDING_LENGTH=15
|
||||||
|
|
||||||
@@ -26,7 +32,7 @@ if [ ! -z $RTSP_STREAM ];then
|
|||||||
# Loop over the streams
|
# Loop over the streams
|
||||||
for i in "${RTSP_STREAMS_EXPLODED_ARRAY[@]}"
|
for i in "${RTSP_STREAMS_EXPLODED_ARRAY[@]}"
|
||||||
do
|
do
|
||||||
# Map id used to map input to output, this is 0 based in ffmpeg decrement
|
# Map id used to map input to output (first stream being 0), this is 0 based in ffmpeg so decrement our counter (which is more human readable) by 1
|
||||||
MAP_ID=$((RTSP_STREAMS_STARTED_COUNT-1))
|
MAP_ID=$((RTSP_STREAMS_STARTED_COUNT-1))
|
||||||
# Build up the parameters to process the RSTP stream, including mapping for the output
|
# Build up the parameters to process the RSTP stream, including mapping for the output
|
||||||
FFMPEG_PARAMS+="-vn -thread_queue_size 512 -i ${i} -map ${MAP_ID}:a:0 -t ${RECORDING_LENGTH} -acodec pcm_s16le -ac 2 -ar 48000 file:${RECS_DIR}/StreamData/$(date "+%F")-birdnet-RTSP_${RTSP_STREAMS_STARTED_COUNT}-$(date "+%H:%M:%S").wav "
|
FFMPEG_PARAMS+="-vn -thread_queue_size 512 -i ${i} -map ${MAP_ID}:a:0 -t ${RECORDING_LENGTH} -acodec pcm_s16le -ac 2 -ar 48000 file:${RECS_DIR}/StreamData/$(date "+%F")-birdnet-RTSP_${RTSP_STREAMS_STARTED_COUNT}-$(date "+%H:%M:%S").wav "
|
||||||
@@ -34,7 +40,7 @@ if [ ! -z $RTSP_STREAM ];then
|
|||||||
((RTSP_STREAMS_STARTED_COUNT += 1))
|
((RTSP_STREAMS_STARTED_COUNT += 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
# Make sure were passing something valid to ffmpeg, ffmpeg will run interactive and control our look by waiting ${RECORDING_LENGTH} between loops
|
# Make sure were passing something valid to ffmpeg, ffmpeg will run interactive and control our loop by waiting ${RECORDING_LENGTH} between loops because it will stop once that much has been recorded
|
||||||
if [ -n "$FFMPEG_PARAMS" ];then
|
if [ -n "$FFMPEG_PARAMS" ];then
|
||||||
ffmpeg -hide_banner -loglevel $LOGGING_LEVEL -nostdin $FFMPEG_PARAMS
|
ffmpeg -hide_banner -loglevel $LOGGING_LEVEL -nostdin $FFMPEG_PARAMS
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -2,8 +2,15 @@
|
|||||||
# Live Audio Stream Service Script
|
# Live Audio Stream Service Script
|
||||||
source /etc/birdnet/birdnet.conf
|
source /etc/birdnet/birdnet.conf
|
||||||
|
|
||||||
# Set logging level
|
# Read the logging level from the configuration option
|
||||||
LOGGING_LEVEL='error'
|
LOGGING_LEVEL="${LogLevel_LiveAudioStreamService}"
|
||||||
|
# If empty for some reason default to log level of error
|
||||||
|
[ -z $LOGGING_LEVEL ] && LOGGING_LEVEL='error'
|
||||||
|
# Additionally if we're at debug or info level then allow printing of script commands and variables
|
||||||
|
if [ "$LOGGING_LEVEL" == "info" ] || [ "$LOGGING_LEVEL" == "debug" ];then
|
||||||
|
# Enable printing of commands/variables etc to terminal for debugging
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z ${REC_CARD} ];then
|
if [ -z ${REC_CARD} ];then
|
||||||
echo "Stream not supported"
|
echo "Stream not supported"
|
||||||
|
|||||||
+10
-1
@@ -1,8 +1,17 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# set -x
|
|
||||||
# Make sox spectrogram
|
# Make sox spectrogram
|
||||||
source /etc/birdnet/birdnet.conf
|
source /etc/birdnet/birdnet.conf
|
||||||
|
|
||||||
|
# Read the logging level from the configuration option
|
||||||
|
LOGGING_LEVEL="${LogLevel_SpectrogramViewerService}"
|
||||||
|
# If empty for some reason default to log level of error
|
||||||
|
[ -z $LOGGING_LEVEL ] && LOGGING_LEVEL='error'
|
||||||
|
# Additionally if we're at debug or info level then allow printing of script commands and variables
|
||||||
|
if [ "$LOGGING_LEVEL" == "info" ] || [ "$LOGGING_LEVEL" == "debug" ];then
|
||||||
|
# Enable printing of commands/variables etc to terminal for debugging
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# Time to sleep between generating spectrogram's, default set the recording length
|
# Time to sleep between generating spectrogram's, default set the recording length
|
||||||
# To try catch the spectrogram as soon as possible run at a smaller intervals
|
# To try catch the spectrogram as soon as possible run at a smaller intervals
|
||||||
SLEEP_DELAY=$((RECORDING_LENGTH / 4))
|
SLEEP_DELAY=$((RECORDING_LENGTH / 4))
|
||||||
|
|||||||
@@ -199,6 +199,19 @@ suntime_installation_status=$(~/BirdNET-Pi/birdnet/bin/python3 -c 'import pkguti
|
|||||||
if [[ "$suntime_installation_status" = "not installed" ]];then
|
if [[ "$suntime_installation_status" = "not installed" ]];then
|
||||||
$HOME/BirdNET-Pi/birdnet/bin/pip3 install -U pip
|
$HOME/BirdNET-Pi/birdnet/bin/pip3 install -U pip
|
||||||
$HOME/BirdNET-Pi/birdnet/bin/pip3 install suntime
|
$HOME/BirdNET-Pi/birdnet/bin/pip3 install suntime
|
||||||
|
|
||||||
|
|
||||||
|
# For new Advanced Setting Logging level options
|
||||||
|
if ! grep LogLevel_BirdnetRecordingService /etc/birdnet/birdnet.conf &>/dev/null;then
|
||||||
|
sudo -u$USER echo "LogLevel_BirdnetRecordingService=\"error\"" >> /etc/birdnet/birdnet.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep LogLevel_LiveAudioStreamService /etc/birdnet/birdnet.conf &>/dev/null;then
|
||||||
|
sudo -u$USER echo "LogLevel_LiveAudioStreamService=\"error\"" >> /etc/birdnet/birdnet.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep LogLevel_SpectrogramViewerService /etc/birdnet/birdnet.conf &>/dev/null;then
|
||||||
|
sudo -u$USER echo "LogLevel_SpectrogramViewerService=\"error\"" >> /etc/birdnet/birdnet.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
|
|||||||
Reference in New Issue
Block a user