# HG changeset patch # User Amine Sehili # Date 1566242331 -3600 # Node ID 1dfba457a9e14646da761b119fb10939b1cae21d # Parent ee6d2294cdd5d31202754002d92dc0f1fb9a8329 Implement __len__ and len in AudioRegion and views diff -r ee6d2294cdd5 -r 1dfba457a9e1 auditok/core.py --- a/auditok/core.py Wed Jul 31 20:07:27 2019 +0100 +++ b/auditok/core.py Mon Aug 19 20:18:51 2019 +0100 @@ -296,6 +296,13 @@ stop_sample = None if stop_s is None else round(stop_s * sr) return self._region[start_sample:stop_sample] + @property + def len(self): + """ + Return region duration in seconds. + """ + return self._region.duration + class _MillisView(_SecondsView): def __getitem__(self, index): @@ -309,6 +316,19 @@ index = slice(start_sec, stop_sec) return super(_MillisView, self).__getitem__(index) + def __len__(self): + """ + Return region duration in milliseconds. + """ + return round(self._region.duration * 1000) + + @property + def len(self): + """ + Return region duration in milliseconds. + """ + return len(self) + class _AudioRegionMetadata(dict): def __getattr__(self, name): @@ -515,9 +535,16 @@ def __len__(self): """ - Returns region duration in milliseconds. + Return region length in number of samples. """ - return round(self.duration * 1000) + return len(self._data) // (self.sample_width * self.channels) + + @property + def len(self): + """ + Return region length in number of samples. + """ + return len(self) def __bytes__(self): return self._data diff -r ee6d2294cdd5 -r 1dfba457a9e1 tests/test_core.py --- a/tests/test_core.py Wed Jul 31 20:07:27 2019 +0100 +++ b/tests/test_core.py Mon Aug 19 20:18:51 2019 +0100 @@ -923,7 +923,7 @@ self.assertEqual(region.meta.start, start) self.assertEqual(region.meta.end, expected_end) self.assertEqual(region.duration, expected_duration_s) - self.assertEqual(len(region), expected_duration_ms) + self.assertEqual(len(region.ms), expected_duration_ms) self.assertEqual(bytes(region), data) def test_creation_invalid_data_exception(self): @@ -1297,12 +1297,12 @@ ) @genty_dataset( - simple=(0.01, 0.03, 30), - rounded_len_floor=(0.00575, 0.01725, 17), - rounded_len_ceil=(0.00625, 0.01875, 19), + simple=(0.01, 0.03, 240, 30), + rounded_len_floor=(0.00575, 0.01725, 138, 17), + rounded_len_ceil=(0.00625, 0.01875, 150, 19), ) def test_multiplication( - self, duration, expected_duration, expected_length + self, duration, expected_duration, expected_len, expected_len_ms ): sw = 2 data = b"0" * int(duration * 8000 * sw) @@ -1313,7 +1313,11 @@ self.assertEqual(m_region.sw, 2) self.assertEqual(m_region.ch, 1) self.assertEqual(m_region.duration, expected_duration) - self.assertEqual(len(m_region), expected_length) + self.assertEqual(len(m_region), expected_len) + self.assertEqual(m_region.len, expected_len) + self.assertEqual(m_region.s.len, expected_duration) + self.assertEqual(len(m_region.ms), expected_len_ms) + self.assertEqual(m_region.ms.len, expected_len_ms) @genty_dataset(_str=("x", "str"), _float=(1.4, "float")) def test_multiplication_non_int(self, factor, _type):