diff --git a/birdnet.conf-defaults b/birdnet.conf-defaults index 8cc19f0..d2cacea 100644 --- a/birdnet.conf-defaults +++ b/birdnet.conf-defaults @@ -71,7 +71,7 @@ RTSP_STREAM= #----------------------- Apprise Miscellanous Configuration -------------------# APPRISE_NOTIFICATION_TITLE="New BirdNET-Pi Detection" -APPRISE_NOTIFICATION_BODY="A \$sciname \$comname was just detected with a confidence of \$confidence" +APPRISE_NOTIFICATION_BODY="A \$comname (\$sciname) was just detected with a confidence of \$confidence" APPRISE_NOTIFY_EACH_DETECTION=0 APPRISE_NOTIFY_NEW_SPECIES=0 APPRISE_WEEKLY_REPORT=1 diff --git a/scripts/advanced.php b/scripts/advanced.php index 32d5c6b..e225442 100644 --- a/scripts/advanced.php +++ b/scripts/advanced.php @@ -222,8 +222,8 @@ if(isset($_GET['submit'])) { if(isset($_GET["custom_image_label"])) { $custom_image_label = $_GET["custom_image_label"]; if(strcmp($custom_image_label,$config['CUSTOM_IMAGE_TITLE']) !== 0) { - $contents = preg_replace("/CUSTOM_IMAGE_TITLE=.*/", "CUSTOM_IMAGE_TITLE=$custom_image_label", $contents); - $contents2 = preg_replace("/CUSTOM_IMAGE_TITLE=.*/", "CUSTOM_IMAGE_TITLE=$custom_image_label", $contents2); + $contents = preg_replace("/CUSTOM_IMAGE_TITLE=.*/", "CUSTOM_IMAGE_TITLE=\"$custom_image_label\"", $contents); + $contents2 = preg_replace("/CUSTOM_IMAGE_TITLE=.*/", "CUSTOM_IMAGE_TITLE=\"$custom_image_label\"", $contents2); } } @@ -313,19 +313,22 @@ foreach($formats as $format){

The BirdNET-Pi URL is how the main page will be reached. If you want your installation to respond to an IP address, place that here, but be sure to indicate "http://".
Example for IP: http://192.168.0.109
Example if you own your own domain: https://virginia.birdnetpi.com

>
+

This allows you to quiet the display of how many commits your installation is behind by relative to the Github repo. This number appears next to "Tools" when you're 50 or more commits behind.

>
+

This allows you to remove the axes and labels of the spectrograms that are generated by Sox for each detection for a cleaner appearance.


-

These allow you to show a custom image on the Overview page of your BirdNET-Pi. This can be used to show a dynamically updating picture of your garden, for example.



+

These allow you to show a custom image on the Overview page of your BirdNET-Pi. This can be used to show a dynamically updating picture of your garden, for example.

+

BirdNET-Lite Settings

diff --git a/scripts/install_config.sh b/scripts/install_config.sh index f60c077..e6dc4c4 100755 --- a/scripts/install_config.sh +++ b/scripts/install_config.sh @@ -99,7 +99,7 @@ RTSP_STREAM= #----------------------- Apprise Miscellanous Configuration -------------------# APPRISE_NOTIFICATION_TITLE="New BirdNET-Pi Detection" -APPRISE_NOTIFICATION_BODY="A \$sciname \$comname was just detected with a confidence of \$confidence" +APPRISE_NOTIFICATION_BODY="A \$comname (\$sciname) was just detected with a confidence of \$confidence" APPRISE_NOTIFY_EACH_DETECTION=0 APPRISE_NOTIFY_NEW_SPECIES=0 APPRISE_WEEKLY_REPORT=1 diff --git a/scripts/overview.php b/scripts/overview.php index d045fcb..c2f62bd 100644 --- a/scripts/overview.php +++ b/scripts/overview.php @@ -37,6 +37,33 @@ if(isset($_GET['custom_image'])){ die(); } +if(isset($_GET['blacklistimage'])) { + if(isset($_SERVER['PHP_AUTH_USER'])) { + $submittedpwd = $_SERVER['PHP_AUTH_PW']; + $submitteduser = $_SERVER['PHP_AUTH_USER']; + if($submittedpwd == $config['CADDY_PWD'] && $submitteduser == 'birdnet'){ + + $imageid = $_GET['blacklistimage']; + $file_handle = fopen($home."/BirdNET-Pi/scripts/blacklisted_images.txt", 'a+'); + fwrite($file_handle, $imageid . "\n"); + fclose($file_handle); + unset($_SESSION['images']); + die("OK"); + } else { + header('WWW-Authenticate: Basic realm="My Realm"'); + header('HTTP/1.0 401 Unauthorized'); + echo 'You must be authenticated.'; + exit; + } + } else { + header('WWW-Authenticate: Basic realm="My Realm"'); + header('HTTP/1.0 401 Unauthorized'); + echo 'You must be authenticated.'; + exit; + } + +} + if(isset($_GET['fetch_chart_string']) && $_GET['fetch_chart_string'] == "true") { $myDate = date('Y-m-d'); $chart = "Combo-$myDate.png"; @@ -57,6 +84,7 @@ if(isset($_GET['ajax_detections']) && $_GET['ajax_detections'] == "true" && isse } $iterations = 0; $lines; + $licenses_urls = array(); // hopefully one of the 5 most recent detections has an image that is valid, we'll use that one as the most recent detection until the newer ones get their images created while($mostrecent = $result4->fetchArray(SQLITE3_ASSOC)) { $comname = preg_replace('/ /', '_', $mostrecent['Com_Name']); @@ -95,6 +123,19 @@ if(isset($_GET['ajax_detections']) && $_GET['ajax_detections'] == "true" && isse if($key !== false) { $image = $_SESSION['images'][$key]; } else { + // Get license information if we haven't already + if (empty($licenses_urls)) { + $licenses_url = "https://api.flickr.com/services/rest/?method=flickr.photos.licenses.getInfo&api_key=".$config["FLICKR_API_KEY"]."&format=json&nojsoncallback=1"; + $licenses_response = file_get_contents($licenses_url); + $licenses_data = json_decode($licenses_response, true)["licenses"]["license"]; + foreach ($licenses_data as $license) { + $license_id = $license["id"]; + $license_name = $license["name"]; + $license_url = $license["url"]; + $licenses_urls[$license_id] = $license_url; + } + } + // only open the file once per script execution if(!isset($lines)) { $lines = file($home."/BirdNET-Pi/model/labels_flickr.txt"); @@ -107,21 +148,30 @@ if(isset($_GET['ajax_detections']) && $_GET['ajax_detections'] == "true" && isse } } - // Make the API call + // Read the blacklisted image ids from the file into an array + $blacklisted_ids = array_map('trim', file($home."/BirdNET-Pi/scripts/blacklisted_images.txt")); + + // Make the API call $flickrjson = json_decode(file_get_contents("https://www.flickr.com/services/rest/?method=flickr.photos.search&api_key=".$config["FLICKR_API_KEY"]."&text=".str_replace(" ", "%20", $engname).$comnameprefix."&sort=relevance".$args."&per_page=5&media=photos&format=json&nojsoncallback=1"), true)["photos"]["photo"]; - // Find the first photo that is not blacklisted + // Find the first photo that is not blacklisted or is not the specific blacklisted id $photo = null; foreach ($flickrjson as $flickrphoto) { - if ($flickrphoto["id"] !== "4892923285") { + if ($flickrphoto["id"] !== "4892923285" && !in_array($flickrphoto["id"], $blacklisted_ids)) { $photo = $flickrphoto; break; } } + + $license_url = "https://api.flickr.com/services/rest/?method=flickr.photos.getInfo&api_key=".$config["FLICKR_API_KEY"]."&photo_id=".$photo["id"]."&format=json&nojsoncallback=1"; + $license_response = file_get_contents($license_url); + $license_info = json_decode($license_response, true)["photo"]["license"]; + $license_url = $licenses_urls[$license_info]; + $modaltext = "https://flickr.com/photos/".$photo["owner"]."/".$photo["id"]; $authorlink = "https://flickr.com/people/".$photo["owner"]; $imageurl = 'https://farm' .$photo["farm"]. '.static.flickr.com/' .$photo["server"]. '/' .$photo["id"]. '_' .$photo["secret"]. '.jpg'; - array_push($_SESSION['images'], array($comname,$imageurl,$photo["title"], $modaltext, $authorlink)); + array_push($_SESSION['images'], array($comname,$imageurl,$photo["title"], $modaltext, $authorlink, $license_url)); $image = $_SESSION['images'][count($_SESSION['images'])-1]; } } @@ -151,7 +201,7 @@ if(isset($_GET['ajax_detections']) && $_GET['ajax_detections'] == "true" && isse

0) { ?> - +
@@ -254,15 +304,18 @@ body::-webkit-scrollbar {
- +

+
@@ -312,6 +381,7 @@ echo ""; ?>
+
diff --git a/scripts/todays_detections.php b/scripts/todays_detections.php index 495e0f2..2a91ba2 100644 --- a/scripts/todays_detections.php +++ b/scripts/todays_detections.php @@ -213,6 +213,7 @@ if(isset($_GET['ajax_detections']) && $_GET['ajax_detections'] == "true" ) { } $iterations = 0; $lines; + $licenses_urls = array(); if (file_exists('./scripts/thisrun.txt')) { $config = parse_ini_file('./scripts/thisrun.txt'); @@ -221,7 +222,6 @@ if(isset($_GET['ajax_detections']) && $_GET['ajax_detections'] == "true" ) { } - while($todaytable=$result0->fetchArray(SQLITE3_ASSOC)) { $iterations++; @@ -253,6 +253,19 @@ if(isset($_GET['ajax_detections']) && $_GET['ajax_detections'] == "true" ) { if($key !== false) { $image = $_SESSION['images'][$key]; } else { + // Get license information if we haven't already + if (empty($licenses_urls)) { + $licenses_url = "https://api.flickr.com/services/rest/?method=flickr.photos.licenses.getInfo&api_key=".$config["FLICKR_API_KEY"]."&format=json&nojsoncallback=1"; + $licenses_response = file_get_contents($licenses_url); + $licenses_data = json_decode($licenses_response, true)["licenses"]["license"]; + foreach ($licenses_data as $license) { + $license_id = $license["id"]; + $license_name = $license["name"]; + $license_url = $license["url"]; + $licenses_urls[$license_id] = $license_url; + } + } + // only open the file once per script execution if(!isset($lines)) { $lines = file($home."/BirdNET-Pi/model/labels_flickr.txt"); @@ -264,21 +277,30 @@ if(isset($_GET['ajax_detections']) && $_GET['ajax_detections'] == "true" ) { break; } } + // Read the blacklisted image ids from the file into an array + $blacklisted_ids = array_map('trim', file($home."/BirdNET-Pi/scripts/blacklisted_images.txt")); + // Make the API call $flickrjson = json_decode(file_get_contents("https://www.flickr.com/services/rest/?method=flickr.photos.search&api_key=".$config["FLICKR_API_KEY"]."&text=".str_replace(" ", "%20", $engname).$comnameprefix."&sort=relevance".$args."&per_page=5&media=photos&format=json&nojsoncallback=1"), true)["photos"]["photo"]; - // Find the first photo that is not blacklisted + // Find the first photo that is not blacklisted or is not the specific blacklisted id $photo = null; foreach ($flickrjson as $flickrphoto) { - if ($flickrphoto["id"] !== "4892923285") { + if ($flickrphoto["id"] !== "4892923285" && !in_array($flickrphoto["id"], $blacklisted_ids)) { $photo = $flickrphoto; break; } } + + $license_url = "https://api.flickr.com/services/rest/?method=flickr.photos.getInfo&api_key=".$config["FLICKR_API_KEY"]."&photo_id=".$photo["id"]."&format=json&nojsoncallback=1"; + $license_response = file_get_contents($license_url); + $license_info = json_decode($license_response, true)["photo"]["license"]; + $license_url = $licenses_urls[$license_info]; + $modaltext = "https://flickr.com/photos/".$photo["owner"]."/".$photo["id"]; $authorlink = "https://flickr.com/people/".$photo["owner"]; $imageurl = 'https://farm' .$photo["farm"]. '.static.flickr.com/' .$photo["server"]. '/' .$photo["id"]. '_' .$photo["secret"]. '.jpg'; - array_push($_SESSION['images'], array($comname,$imageurl,$photo["title"], $modaltext, $authorlink)); + array_push($_SESSION['images'], array($comname,$imageurl,$photo["title"], $modaltext, $authorlink, $license_url)); $image = $_SESSION['images'][count($_SESSION['images'])-1]; } } @@ -290,7 +312,7 @@ if(isset($_GET['ajax_detections']) && $_GET['ajax_detections'] == "true" ) {
0) { ?> - +
@@ -305,7 +327,7 @@ if(isset($_GET['ajax_detections']) && $_GET['ajax_detections'] == "true" ) {
0) { ?> - +
@@ -378,16 +400,19 @@ die();
- +

- + +