Merge pull request #39 from macaodha/fix/handle-empty-files-gracefully

fix: Handle Empty Audio Files Gracefully (GH-20)
This commit is contained in:
Santiago Martinez Balvanera 2024-11-11 12:59:28 +00:00 committed by GitHub
commit d5753b95bb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 8 deletions

View File

@ -1,4 +1,5 @@
"""BatDetect2 command line interface.""" """BatDetect2 command line interface."""
import os import os
import click import click
@ -129,10 +130,9 @@ def detect(
): ):
results_path = audio_file.replace(audio_dir, ann_dir) results_path = audio_file.replace(audio_dir, ann_dir)
save_results_to_file(results, results_path) save_results_to_file(results, results_path)
except (RuntimeError, ValueError, LookupError) as err: except (RuntimeError, ValueError, LookupError, EOFError) as err:
error_files.append(audio_file) error_files.append(audio_file)
click.secho(f"Error processing file!: {err}", fg="red") click.secho(f"Error processing file {audio_file}: {err}", fg="red")
raise err
click.echo(f"\nResults saved to: {ann_dir}") click.echo(f"\nResults saved to: {ann_dir}")

View File

@ -7,10 +7,11 @@ from click.testing import CliRunner
from batdetect2.cli import cli from batdetect2.cli import cli
runner = CliRunner()
def test_cli_base_command(): def test_cli_base_command():
"""Test the base command.""" """Test the base command."""
runner = CliRunner()
result = runner.invoke(cli, ["--help"]) result = runner.invoke(cli, ["--help"])
assert result.exit_code == 0 assert result.exit_code == 0
assert ( assert (
@ -20,7 +21,6 @@ def test_cli_base_command():
def test_cli_detect_command_help(): def test_cli_detect_command_help():
"""Test the detect command help.""" """Test the detect command help."""
runner = CliRunner()
result = runner.invoke(cli, ["detect", "--help"]) result = runner.invoke(cli, ["detect", "--help"])
assert result.exit_code == 0 assert result.exit_code == 0
assert "Detect bat calls in files in AUDIO_DIR" in result.output assert "Detect bat calls in files in AUDIO_DIR" in result.output
@ -34,7 +34,6 @@ def test_cli_detect_command_on_test_audio(tmp_path):
if results_dir.exists(): if results_dir.exists():
results_dir.rmdir() results_dir.rmdir()
runner = CliRunner()
result = runner.invoke( result = runner.invoke(
cli, cli,
[ [
@ -58,7 +57,6 @@ def test_cli_detect_command_with_non_trivial_time_expansion(tmp_path):
if results_dir.exists(): if results_dir.exists():
results_dir.rmdir() results_dir.rmdir()
runner = CliRunner()
result = runner.invoke( result = runner.invoke(
cli, cli,
[ [
@ -83,7 +81,6 @@ def test_cli_detect_command_with_the_spec_feature_flag(tmp_path: Path):
if results_dir.exists(): if results_dir.exists():
results_dir.rmdir() results_dir.rmdir()
runner = CliRunner()
result = runner.invoke( result = runner.invoke(
cli, cli,
[ [
@ -110,3 +107,26 @@ def test_cli_detect_command_with_the_spec_feature_flag(tmp_path: Path):
df = pd.read_csv(results_dir / expected_file) df = pd.read_csv(results_dir / expected_file)
assert not (df.duration == -1).any() assert not (df.duration == -1).any()
def test_cli_detect_fails_gracefully_on_empty_file(tmp_path: Path):
results_dir = tmp_path / "results"
target = tmp_path / "audio"
target.mkdir()
# Create an empty file with the .wav extension
empty_file = target / "empty.wav"
empty_file.touch()
result = runner.invoke(
cli,
args=[
"detect",
str(target),
str(results_dir),
"0.3",
"--spec_features",
],
)
assert result.exit_code == 0
assert f"Error processing file {empty_file}" in result.output