New feat : Disk usage summary (#318)

* Disk usage summary

* Explain why there is more files than the max specified

* Update advanced.php

* Update advanced.php

* Few improvements

* Improve alerts

* Define HOME

* Use single alert

* Shorten message for single alert

* Add execute permission to scripts/disk_species_count.sh

* Removed MAX_FILE_SPECIES

* Update advanced.php

* Improve message

* Update scripts/advanced.php

Co-authored-by: Nachtzuster <Nachtzuster@users.noreply.github.com>

* Clean

* Update scripts/advanced.php

Co-authored-by: Nachtzuster <Nachtzuster@users.noreply.github.com>

* Typo

---------

Co-authored-by: root <root@db21ed7f-webtop.local.hass.io>
Co-authored-by: Nachtzuster <Nachtzuster@users.noreply.github.com>
This commit is contained in:
Alexandre
2025-04-23 18:41:59 +02:00
committed by GitHub
parent 1d8506bb93
commit 465e9739ce
2 changed files with 88 additions and 3 deletions
+13 -3
View File
@@ -5,9 +5,18 @@ error_reporting(E_ERROR);
require_once "scripts/common.php"; require_once "scripts/common.php";
$home = get_home(); $home = get_home();
$config = get_config(); $config = get_config();
$user = get_user();
ensure_authenticated(); ensure_authenticated();
if (isset($_GET['run_species_count'])) {
echo "<script>";
$output = shell_exec("sudo -u $user ".$home."/BirdNET-Pi/scripts/disk_species_count.sh 2>&1");
$escaped_output = htmlspecialchars($output, ENT_QUOTES | ENT_SUBSTITUTE);
echo "alert(`$escaped_output`);";
echo "</script>";
}
if(isset($_GET['submit'])) { if(isset($_GET['submit'])) {
$contents = file_get_contents('/etc/birdnet/birdnet.conf'); $contents = file_get_contents('/etc/birdnet/birdnet.conf');
$restart_livestream = false; $restart_livestream = false;
@@ -307,14 +316,15 @@ $newconfig = get_config();
<label for="purge_threshold">Purge Threshold (Disk Used %):</label> <label for="purge_threshold">Purge Threshold (Disk Used %):</label>
<input name="purge_threshold" type="number" style="width:6em;" min="20" max="99" step="1" value="<?php print($newconfig['PURGE_THRESHOLD']);?>"/> <input name="purge_threshold" type="number" style="width:6em;" min="20" max="99" step="1" value="<?php print($newconfig['PURGE_THRESHOLD']);?>"/>
<p>Defines how full the disk should be before the purge operations occur.<br>Note: This variable is still active if Keep is set. This means that the servies will be stopped at the purge threshold.</p><br> <p>Defines how full the disk should be before the purge operations occur.<br>Note: This variable is still active if Keep is set. This means that the servies will be stopped at the purge threshold.</p><br>
<label for="max_files_species">Amount of files to keep for each species :</label> <label for="max_files_species">Number of files to keep for each species :</label>
<input name="max_files_species" type="number" style="width:6em;" min="0" step="1" value="<?php print($newconfig['MAX_FILES_SPECIES']);?>"/> <input name="max_files_species" type="number" style="width:6em;" min="0" step="1" value="<?php print($newconfig['MAX_FILES_SPECIES']);?>"/>
</td></tr><tr><td> </td></tr><tr><td>
If different than 0 (keep all), defines the maximum number of files to be kept for each species, with priority give to files with highest confidence. If different than 0 (keep all), defines the number of files to keep for each species, with priority given to files with higher confidence. This value does not include files from the last 7 days, these new files are protected against auto-deletion.
This value does not take into account the last 7 days (protected by default).
</td></tr><tr><td> </td></tr><tr><td>
Note only the spectrogram and audio files are deleted, the obsevation data remains in the database. Note only the spectrogram and audio files are deleted, the obsevation data remains in the database.
The files protected through the "lock" icon are also not affected. The files protected through the "lock" icon are also not affected.
<br>
<button type="submit" name="run_species_count" value="1" onclick="{this.innerHTML = 'Loading ... please wait.';this.classList.add('disabled')}"><i>[Click here for disk usage summary]</i></button>
</td></tr></table><br> </td></tr></table><br>
<table class="settingstable"><tr><td> <table class="settingstable"><tr><td>
+75
View File
@@ -0,0 +1,75 @@
#!/bin/bash
# Get default values
source /etc/birdnet/birdnet.conf
base_dir="$(readlink -f "$HOME/BirdSongs/Extracted/By_Date")"
cd "$base_dir" || exit 1
# Function to format numbers to k if ≥1000
format_k() {
local value=$1
if [ "$value" -ge 1000 ]; then
awk -v v="$value" 'BEGIN { printf "%.1fk", v/1000 }'
else
echo "$value"
fi
}
# Get bird names from the database
bird_names=$(sqlite3 -readonly "$HOME"/BirdNET-Pi/scripts/birds.db <<EOF
.headers off
.mode list
SELECT DISTINCT Com_Name FROM detections;
EOF
)
# Sanitize names for folder matching
sanitized_names="$(echo "$bird_names" | tr ' ' '_' | tr -d "'" | grep '[[:alnum:]]')"
sanitized_names=$(echo "$sanitized_names" | sed 's/_*$//')
# Count species
species_count=$(echo "$sanitized_names" | wc -l)
total_file_count=0
# Temp files
data_file=$(mktemp)
output_file=$(mktemp)
# Loop through each species
while read -r species; do
# Count total files
total=$(find */"$species" -type f -name "*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]*.*" \
-not -iname "*.png" 2>/dev/null | wc -l)
total_file_count=$((total_file_count + total))
# Format total
total_display=$(format_k "$total")
# Clean species name for display
species_display=$(echo "$species" | tr '_' ' ')
# Save padded sort key + display line
printf "%05d %s : %s\n" "$total" "$total_display" "$species_display" >> "$data_file"
done <<<"$sanitized_names"
# Avoid TERM error if not running in a terminal
[ -t 1 ] && clear
# Build final output
{
echo "BirdSongs stored on your drive"
echo " "
echo "Location : $base_dir: "
echo "Free space : $(df -h "$base_dir" | awk 'NR==2 {print $4}' | sed 's/G/ GB/; s/M/ MB/; s/K/ KB/')"
echo "Total species : $species_count"
echo "Total files : $(format_k "$total_file_count")"
echo "Total size : $(du -sh . | sed 's/G/ GB/; s/M/ MB/; s/K/ KB/' | cut -f1)"
echo " "
sort -r "$data_file" | sed 's/^[0-9]* //'
} > "$output_file"
# Show results
cat "$output_file"
# Clean up
rm -f "$data_file" "$output_file"