diff --git a/scripts/birdnet_analysis.sh b/scripts/birdnet_analysis.sh index 5519c44..de0b5c6 100755 --- a/scripts/birdnet_analysis.sh +++ b/scripts/birdnet_analysis.sh @@ -91,32 +91,16 @@ run_analysis() { fi for i in "${files[@]}";do + [ ! -f ${1}/${i} ] && continue echo "${1}/${i}" > $HOME/BirdNET-Pi/analyzing_now.txt [ -z ${RECORDING_LENGTH} ] && RECORDING_LENGTH=15 - [ ${RECORDING_LENGTH} == "60" ] && RECORDING_LENGTH=01:00 - FILE_LENGTH="$(ffmpeg -i ${1}/${i} 2>&1 | awk -F. '/Duration/ {print $1}' | cut -d':' -f3-4)" - [ -z $FILE_LENGTH ] && sleep 1 && continue echo "RECORDING_LENGTH set to ${RECORDING_LENGTH}" a=0 - if [ "${RECORDING_LENGTH}" == "01:00" ];then - until [ "$(ffmpeg -i ${1}/${i} 2>&1 | awk -F. '/Duration/ {print $1}' | cut -d':' -f3-4)" == "${RECORDING_LENGTH}" ];do - sleep 1 - [ $a -ge 60 ] && rm -f ${1}/${i} && break - a=$((a+1)) - done - elif [ "${RECORDING_LENGTH}" -lt 10 ];then - until [ "$(ffmpeg -i ${1}/${i} 2>&1 | awk -F. '/Duration/ {print $1}' | cut -d':' -f3-4)" == "00:0${RECORDING_LENGTH}" ];do - sleep 1 - [ $a -ge ${RECORDING_LENGTH} ] && rm -f ${1}/${i} && break - a=$((a+1)) - done - else - until [ "$(ffmpeg -i ${1}/${i} 2>&1 | awk -F. '/Duration/ {print $1}' | cut -d':' -f3-4)" == "00:${RECORDING_LENGTH}" ];do - sleep 1 - [ $a -ge ${RECORDING_LENGTH} ] && rm -f ${1}/${i} && break - a=$((a+1)) - done - fi + until [ -z "$(lsof -t ${1}/${i})" ];do + sleep 2 + [ $a -ge ${RECORDING_LENGTH} ] && rm -f ${1}/${i} && break + a=$((a+2)) + done if ! grep 5050 <(netstat -tulpn 2>&1) &> /dev/null 2>&1;then echo "Waiting for socket" @@ -124,183 +108,48 @@ run_analysis() { sleep 1 done fi - if [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then - echo "analyze.py \ ---i "${1}/${i}" \ ---o "${1}/${i}.csv" \ ---lat "${LATITUDE}" \ ---lon "${LONGITUDE}" \ ---week "${WEEK}" \ ---overlap "${OVERLAP}" \ ---sensitivity "${SENSITIVITY}" \ ---min_conf "${CONFIDENCE}"" - analyze.py \ - --i "${1}/${i}" \ - --o "${1}/${i}.csv" \ - --lat "${LATITUDE}" \ - --lon "${LONGITUDE}" \ - --week "${WEEK}" \ - --overlap "${OVERLAP}" \ - --sensitivity "${SENSITIVITY}" \ - --min_conf "${CONFIDENCE}" - elif [ -f ${1}/${i} ] && [ -f ${INCLUDELIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then - echo "analyze.py \ ---i "${1}/${i}" \ ---o "${1}/${i}.csv" \ ---lat "${LATITUDE}" \ ---lon "${LONGITUDE}" \ ---week "${WEEK}" \ ---overlap "${OVERLAP}" \ ---sensitivity "${SENSITIVITY}" \ ---min_conf "${CONFIDENCE}" \ ---include_list "${INCLUDE_LIST}"" - analyze.py \ - --i "${1}/${i}" \ - --o "${1}/${i}.csv" \ - --lat "${LATITUDE}" \ - --lon "${LONGITUDE}" \ - --week "${WEEK}" \ - --overlap "${OVERLAP}" \ - --sensitivity "${SENSITIVITY}" \ - --min_conf "${CONFIDENCE}" \ - --include_list "${INCLUDE_LIST}" - elif [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then - echo "analyze.py \ ---i "${1}/${i}" \ ---o "${1}/${i}.csv" \ ---lat "${LATITUDE}" \ ---lon "${LONGITUDE}" \ ---week "${WEEK}" \ ---overlap "${OVERLAP}" \ ---sensitivity "${SENSITIVITY}" \ ---min_conf "${CONFIDENCE}" \ ---exclude_list "${EXCLUDE_LIST}"" - analyze.py \ - --i "${1}/${i}" \ - --o "${1}/${i}.csv" \ - --lat "${LATITUDE}" \ - --lon "${LONGITUDE}" \ - --week "${WEEK}" \ - --overlap "${OVERLAP}" \ - --sensitivity "${SENSITIVITY}" \ - --min_conf "${CONFIDENCE}" \ - --exclude_list "${EXCLUDE_LIST}" - elif [ -f ${1}/${i} ] && [ -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then - echo "analyze.py \ ---i "${1}/${i}" \ ---o "${1}/${i}.csv" \ ---lat "${LATITUDE}" \ ---lon "${LONGITUDE}" \ ---week "${WEEK}" \ ---overlap "${OVERLAP}" \ ---sensitivity "${SENSITIVITY}" \ ---min_conf "${CONFIDENCE}" \ ---include_list "${INCLUDE_LIST}" \ ---exclude_list "${EXCLUDE_LIST}"" - analyze.py \ - --i "${1}/${i}" \ - --o "${1}/${i}.csv" \ - --lat "${LATITUDE}" \ - --lon "${LONGITUDE}" \ - --week "${WEEK}" \ - --overlap "${OVERLAP}" \ - --sensitivity "${SENSITIVITY}" \ - --min_conf "${CONFIDENCE}" \ - --include_list "${INCLUDE_LIST}" \ - --exclude_list "${EXCLUDE_LIST}" - elif [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then - echo "analyze.py \ ---i "${1}/${i}" \ ---o "${1}/${i}.csv" \ ---lat "${LATITUDE}" \ ---lon "${LONGITUDE}" \ ---week "${WEEK}" \ ---overlap "${OVERLAP}" \ ---sensitivity "${SENSITIVITY}" \ ---min_conf "${CONFIDENCE}" \ ---birdweather_id "IN_USE"" - analyze.py \ - --i "${1}/${i}" \ - --o "${1}/${i}.csv" \ - --lat "${LATITUDE}" \ - --lon "${LONGITUDE}" \ - --week "${WEEK}" \ - --overlap "${OVERLAP}" \ - --sensitivity "${SENSITIVITY}" \ - --min_conf "${CONFIDENCE}" \ - --birdweather_id "${BIRDWEATHER_ID}" - elif [ -f ${1}/${i} ] && [ -f ${INCLUDE_LIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then - echo "analyze.py \ ---i "${1}/${i}" \ ---o "${1}/${i}.csv" \ ---lat "${LATITUDE}" \ ---lon "${LONGITUDE}" \ ---week "${WEEK}" \ ---overlap "${OVERLAP}" \ ---sensitivity "${SENSITIVITY}" \ ---min_conf "${CONFIDENCE}" \ ---include_list "${INCLUDE_LIST}" \ ---birdweather_id "IN_USE"" - analyze.py \ - --i "${1}/${i}" \ - --o "${1}/${i}.csv" \ - --lat "${LATITUDE}" \ - --lon "${LONGITUDE}" \ - --week "${WEEK}" \ - --overlap "${OVERLAP}" \ - --sensitivity "${SENSITIVITY}" \ - --min_conf "${CONFIDENCE}" \ - --include_list "${INCLUDE_LIST}" \ - --birdweather_id "${BIRDWEATHER_ID}" - elif [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then - echo "analyze.py \ ---i "${1}/${i}" \ ---o "${1}/${i}.csv" \ ---lat "${LATITUDE}" \ ---lon "${LONGITUDE}" \ ---week "${WEEK}" \ ---overlap "${OVERLAP}" \ ---sensitivity "${SENSITIVITY}" \ ---min_conf "${CONFIDENCE}" \ ---exclude_list "${EXCLUDE_LIST}" \ ---birdweather_id "IN_USE"" - analyze.py \ - --i "${1}/${i}" \ - --o "${1}/${i}.csv" \ - --lat "${LATITUDE}" \ - --lon "${LONGITUDE}" \ - --week "${WEEK}" \ - --overlap "${OVERLAP}" \ - --sensitivity "${SENSITIVITY}" \ - --min_conf "${CONFIDENCE}" \ - --exclude_list "${EXCLUDE_LIST}" \ - --birdweather_id "${BIRDWEATHER_ID}" - elif [ -f ${1}/${i} ] && [ -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then - echo "analyze.py \ ---i "${1}/${i}" \ ---o "${1}/${i}.csv" \ ---lat "${LATITUDE}" \ ---lon "${LONGITUDE}" \ ---week "${WEEK}" \ ---overlap "${OVERLAP}" \ ---sensitivity "${SENSITIVITY}" \ ---min_conf "${CONFIDENCE}" \ ---include_list "${INCLUDE_LIST}" \ ---exclude_list "${EXCLUDE_LIST}" \ ---birdweather_id "IN_USE"" - analyze.py \ - --i "${1}/${i}" \ - --o "${1}/${i}.csv" \ - --lat "${LATITUDE}" \ - --lon "${LONGITUDE}" \ - --week "${WEEK}" \ - --overlap "${OVERLAP}" \ - --sensitivity "${SENSITIVITY}" \ - --min_conf "${CONFIDENCE}" \ - --include_list "${INCLUDE_LIST}" \ - --exclude_list "${EXCLUDE_LIST}" \ - --birdweather_id "${BIRDWEATHER_ID}" + # prepare optional parameters for analyse.py + if [ -f ${INCLUDE_LIST} ]; then + INCLUDEPARAM="--include_list \"${INCLUDE_LIST}\"" + else + INCLUDEPARAM="" fi + if [ -f ${EXCLUDE_LIST} ]; then + EXCLUDEPARAM="--include_list \"${EXCLUDE_LIST}\"" + else + EXCLUDEPARAM="" + fi + if [ ! -z $BIRDWEATHER_ID ]; then + BIRDWEATHER_ID_PARAM="--birdweather_id \"${BIRDWEATHER_ID}\"" + BIRDWEATHER_ID_LOG="--birdweather_id \"IN_USE\"" + else + BIRDWEATHER_ID_PARAM="" + BIRDWEATHER_ID_LOG="" + fi + echo analyze.py \ +--i "${1}/${i}" \ +--o "${1}/${i}.csv" \ +--lat "${LATITUDE}" \ +--lon "${LONGITUDE}" \ +--week "${WEEK}" \ +--overlap "${OVERLAP}" \ +--sensitivity "${SENSITIVITY}" \ +--min_conf "${CONFIDENCE}" \ +${INCLUDEPARAM} \ +${EXCLUDEPARAM} \ +${BIRDWEATHER_ID_LOG} + analyze.py \ + --i "${1}/${i}" \ + --o "${1}/${i}.csv" \ + --lat "${LATITUDE}" \ + --lon "${LONGITUDE}" \ + --week "${WEEK}" \ + --overlap "${OVERLAP}" \ + --sensitivity "${SENSITIVITY}" \ + --min_conf "${CONFIDENCE}" \ + ${INCLUDEPARAM} \ + ${EXCLUDEPARAM} \ + ${BIRDWEATHER_ID_PARAM} done } diff --git a/scripts/install_services.sh b/scripts/install_services.sh index 7b486ae..b19e399 100755 --- a/scripts/install_services.sh +++ b/scripts/install_services.sh @@ -18,7 +18,7 @@ install_depends() { apt install -qqy caddy ftpd sqlite3 php-sqlite3 alsa-utils \ pulseaudio avahi-utils sox libsox-fmt-mp3 php php-fpm php-curl php-xml \ php-zip icecast2 swig ffmpeg wget unzip curl cmake make bc libjpeg-dev \ - zlib1g-dev python3-dev python3-pip python3-venv + zlib1g-dev python3-dev python3-pip python3-venv lsof } diff --git a/scripts/most_recent.sh b/scripts/most_recent.sh new file mode 100755 index 0000000..cf10249 --- /dev/null +++ b/scripts/most_recent.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +OLDIFS=$IFS +IFS=\| +most_recent_results=($(sqlite3 ~/BirdNET-Pi/scripts/birds.db \ + 'SELECT Com_Name, Time, Date FROM detections + ORDER BY Date DESC, Time DESC + LIMIT 1')) +today=$(date +%F) +yesterday=$(date --date="yesterday" +%F) +two_days_ago=$(date --date="2 days ago" +%F) + +echo -n The most recent detection was + +if [[ "${most_recent_results[0]}" =~ ^[AEIOU].* ]];then + echo -n " an ${most_recent_results[0]} at " +else + echo -n " a ${most_recent_results[0]} at " +fi +most_recent_results[1]=$(date --date="${most_recent_results[1]}" +%l:%M%p) +echo -n ${most_recent_results[1]} +if [[ ${most_recent_results[2]} == $today ]];then + echo " today." +elif [[ ${most_recent_results[2]} == $yesterday ]];then + echo " yesterday." +elif [[ ${most_recent_results[2]} == $two_days_ago ]];then + echo " two days ago." +else + echo " on ${most_recent_results[2]}." +fi + +IFS=$OLDIFS diff --git a/scripts/update_birdnet.sh b/scripts/update_birdnet.sh index dd6e84a..0135963 100755 --- a/scripts/update_birdnet.sh +++ b/scripts/update_birdnet.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Update BirdNET-Pi +# Update BirdNET-Pi's Git Repo source /etc/birdnet/birdnet.conf trap 'exit 1' SIGINT SIGHUP USER=$(awk -F: '/1000/ {print $1}' /etc/passwd) @@ -11,13 +11,7 @@ sudo -u${USER} git -C $my_dir pull -f sudo systemctl daemon-reload sudo -u${USER} git -C $my_dir stash pop sudo ln -sf $my_dir/* /usr/local/bin/ -if ! grep python3 <(head -n1 $my_dir/analyze.py);then - echo "Ensure all python scripts use the virtual environment" - sed -si "1 i\\#\!$HOME/BirdNET-Pi/birdnet/bin/python3" $my_dir/*.py -fi -if ! grep PRIVACY_MODE /etc/birdnet/birdnet.conf;then - sudo -u${USER} echo "PRIVACY_MODE=off" >> /etc/birdnet/birdnet.conf -fi -if ! grep RTSP_STREAM /etc/birdnet/birdnet.conf;then - sudo -u${USER} echo "RTSP_STREAM=" >> /etc/birdnet/birdnet.conf -fi + +# The script below handles changes to the host system +# Any additions to the updater should be placed in that file. +sudo $my_dir/update_birdnet_snippets.sh \ No newline at end of file diff --git a/scripts/update_birdnet_snippets.sh b/scripts/update_birdnet_snippets.sh new file mode 100755 index 0000000..3c45174 --- /dev/null +++ b/scripts/update_birdnet_snippets.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Update BirdNET-Pi +source /etc/birdnet/birdnet.conf +trap 'exit 1' SIGINT SIGHUP +USER=$(awk -F: '/1000/ {print $1}' /etc/passwd) +HOME=$(awk -F: '/1000/ {print $6}' /etc/passwd) +my_dir=$HOME/BirdNET-Pi/scripts +if ! grep python3 <(head -n1 $my_dir/analyze.py) &>/dev/null;then + echo "Ensure all python scripts use the virtual environment" + sudo -u$USER sed -si "1 i\\#\!$HOME/BirdNET-Pi/birdnet/bin/python3" $my_dir/*.py +fi +if ! grep PRIVACY_MODE /etc/birdnet/birdnet.conf &>/dev/null;then + sudo -u$USER echo "PRIVACY_MODE=off" >> /etc/birdnet/birdnet.conf +fi +if ! which lsof &>/dev/null;then + sudo apt update && sudo apt -y install lsof +fi