sndid/sndid-server

138 lines
3.2 KiB
Python
Executable File

#!/usr/bin/env python
"""
sndid-server
Copyright 2022, 2023, Joe Weiss <joe.weiss@gmail.com>
Copyright 2023, Jeff Moe <moe@spacecruft.org>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
https://github.com/joeweiss/birdnetlib/blob/main/examples/simple_tcp_server.py
"""
from birdnetlib import RecordingBuffer
from birdnetlib.analyzer import Analyzer
import birdnetlib.wavutils as wavutils
from datetime import datetime
from pprint import pprint
import socketserver
import argparse
parser = argparse.ArgumentParser(description="Run sndid-server")
parser.add_argument(
"-i",
"--ip",
help="Server IP address (default 127.0.0.1)",
type=str,
required=False,
default="127.0.0.1",
)
parser.add_argument(
"-p",
"--port",
help="Server network port (default 9988)",
type=int,
required=False,
default="9988",
)
parser.add_argument(
"-t",
"--latitude",
help="Latitude (default 40.57)",
type=str,
required=False,
default="40.57",
)
parser.add_argument(
"-n",
"--longitude",
help="Longitude (default -105.23)",
type=str,
required=False,
default="-105.23",
)
# XXX set to NOW for default.
parser.add_argument(
"-y",
"--year",
help="Year (default 2023)",
type=int,
required=False,
default="2023",
)
parser.add_argument(
"-m",
"--month",
help="Month (default 9)",
type=int,
required=False,
default="9",
)
parser.add_argument(
"-d",
"--day",
help="Day (default 19)",
type=int,
required=False,
default="19",
)
parser.add_argument(
"-c",
"--confidence",
help="Minimum Confidence (default 0.25)",
type=float,
required=False,
default="0.25",
)
args = parser.parse_args()
LAT = args.latitude
LON = args.longitude
IP = args.ip
PORT = args.port
YEAR = args.year
MONTH = args.month
DAY = args.day
CONFIDENCE = args.confidence
class MyTCPHandler(socketserver.StreamRequestHandler):
def handle(self):
analyzer = Analyzer()
# Read WAV data from the socket
for rate, data in wavutils.bufferwavs(self.rfile):
# Make a RecordingBuffer with buffer and rate
recording = RecordingBuffer(
analyzer,
data,
rate,
lat=LAT,
lon=LON,
date=datetime(year=YEAR, month=MONTH, day=DAY),
min_conf=CONFIDENCE,
)
recording.analyze()
pprint(recording.detections)
if __name__ == "__main__":
try:
with socketserver.TCPServer((IP, PORT), MyTCPHandler) as server:
print("sndid-server Birdnetlib started")
print("IP:", IP)
print("PORT:", PORT)
server.serve_forever()
except KeyboardInterrupt:
server.server_close()