# utils


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

## Time Formatting

------------------------------------------------------------------------

<a
href="https://github.com/cj-mills/cjm-transcript-vad-align/blob/main/cjm_transcript_vad_align/utils.py#L15"
target="_blank" style="float:right; font-size:smaller">source</a>

### format_time_precise

``` python

def format_time_precise(
    seconds:Optional, # Time in seconds
)->str: # Formatted time string (m:ss.s)

```

*Format seconds as m:ss.s for sub-second display.*

## Tests

## Audio File Boundaries

------------------------------------------------------------------------

<a
href="https://github.com/cj-mills/cjm-transcript-vad-align/blob/main/cjm_transcript_vad_align/utils.py#L26"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_audio_file_boundaries

``` python

def get_audio_file_boundaries(
    chunks:List, # Ordered list of VAD chunks
)->Set: # Indices where audio_file_index changes from the previous chunk

```

*Find indices where audio_file_index changes between adjacent chunks.*

A boundary at index N means chunk\[N\].audio_file_index differs from
chunk\[N-1\].audio_file_index.

------------------------------------------------------------------------

<a
href="https://github.com/cj-mills/cjm-transcript-vad-align/blob/main/cjm_transcript_vad_align/utils.py#L41"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_audio_file_count

``` python

def get_audio_file_count(
    chunks:List, # Ordered list of VAD chunks
)->int: # Number of unique audio files

```

*Count the number of unique audio files in the chunk list.*

------------------------------------------------------------------------

<a
href="https://github.com/cj-mills/cjm-transcript-vad-align/blob/main/cjm_transcript_vad_align/utils.py#L50"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_audio_file_position

``` python

def get_audio_file_position(
    chunks:List, # Ordered list of VAD chunks
    focused_index:int, # Index of the focused chunk
)->Optional: # 1-based position of the audio file, or None

```

*Get the audio file position (1-based) of the focused chunk.*

Returns which audio file the focused chunk belongs to, based on order of
first appearance.

``` python
assert format_time_precise(6.6) == "0:06.6"
assert format_time_precise(9.8) == "0:09.8"
assert format_time_precise(65.25) == "1:05.2"
assert format_time_precise(0.0) == "0:00.0"
assert format_time_precise(None) == "-:--.-"
print("format_time_precise tests passed")
```

``` python
from cjm_transcript_vad_align.models import VADChunk

# Test get_audio_file_boundaries
chunks_single = [
    VADChunk(index=0, start_time=0.0, end_time=1.0, audio_file_index=0),
    VADChunk(index=1, start_time=1.0, end_time=2.0, audio_file_index=0),
]
assert get_audio_file_boundaries(chunks_single) == set()

chunks_multi = [
    VADChunk(index=0, start_time=0.0, end_time=1.0, audio_file_index=0),
    VADChunk(index=1, start_time=1.0, end_time=2.0, audio_file_index=0),
    VADChunk(index=2, start_time=0.0, end_time=1.5, audio_file_index=1),
    VADChunk(index=3, start_time=1.5, end_time=3.0, audio_file_index=1),
    VADChunk(index=4, start_time=0.0, end_time=2.0, audio_file_index=2),
]
assert get_audio_file_boundaries(chunks_multi) == {2, 4}
assert get_audio_file_boundaries([]) == set()
print("get_audio_file_boundaries tests passed")

# Test get_audio_file_count
assert get_audio_file_count(chunks_single) == 1
assert get_audio_file_count(chunks_multi) == 3
assert get_audio_file_count([]) == 0
print("get_audio_file_count tests passed")

# Test get_audio_file_position
assert get_audio_file_position(chunks_multi, 0) == 1
assert get_audio_file_position(chunks_multi, 1) == 1
assert get_audio_file_position(chunks_multi, 2) == 2
assert get_audio_file_position(chunks_multi, 4) == 3
assert get_audio_file_position(chunks_multi, 99) is None
assert get_audio_file_position([], 0) is None
print("get_audio_file_position tests passed")
```

    get_audio_file_boundaries tests passed
    get_audio_file_count tests passed
    get_audio_file_position tests passed
