Skip to content

Commit fb14224

Browse files
committed
Fix rendering of Duration tags to use ISO 8601
1 parent 7e57bfc commit fb14224

9 files changed

Lines changed: 34 additions & 21 deletions

File tree

MANUAL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,8 @@ Sometimes it is desirable to create a chain of context invocations such as:
242242
%Lower{%Collapse{%Strip{%Name()}}}
243243
```
244244

245-
To streamline such operations, _pipe list_ syntax sugar can be used.
246-
The, following expression is equivalent to the one above:
245+
To streamline such operations, _pipe list_ syntax sugar can be used
246+
and above expression can be written as:
247247
```
248248
%Name()|%Strip()|%Collapse()|%Lower()
249249
```

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ You can also take a look on the following examples.
3030
-->
3131

3232
## Examples
33-
**Note: When experimenting on your own please use `--dry-run` flag!** \
33+
**Note: When experimenting on your own please use `-dr`/`--dry-run` flag!** \
3434
**`tempren` will not override your files by default but invalid template can mangle their names.**
3535

3636
<details>

tempren/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ def render_template_evaluation_error(
603603
def cli_prompt_conflict_resolver(
604604
source_path: Path, destination_path: Path
605605
) -> Union[ConflictResolutionStrategy, Path]:
606-
log.warning("White processing:")
606+
log.warning("While processing:")
607607
log.warning(f" {source_path}")
608608
log.warning("following path was generated:")
609609
log.warning(f" {destination_path}")

tempren/tags/audio.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import datetime
12
from abc import ABC
23
from datetime import timedelta
34
from typing import Any, Dict, Optional
45

6+
import isodate
57
import mutagen
68
import mutagen.mp3
79
from mutagen.easyid3 import EasyID3
@@ -31,20 +33,29 @@ def _extract_metadata(self, file: File) -> Dict[str, Any]:
3133
audio_file = mutagen.File(file.absolute_path)
3234
if audio_file is None:
3335
raise FileNotSupportedError()
34-
metadata_dict = dict()
35-
metadata_dict["duration"] = audio_file.info.length
36-
metadata_dict["channels"] = audio_file.info.channels
37-
metadata_dict["sample_rate"] = audio_file.info.sample_rate
38-
metadata_dict["bitrate"] = audio_file.info.bitrate
36+
metadata_dict: Dict[str, Any] = dict()
37+
self.try_to_extract_property(metadata_dict, audio_file.info, "length")
38+
self.try_to_extract_property(metadata_dict, audio_file.info, "channels")
39+
self.try_to_extract_property(metadata_dict, audio_file.info, "sample_rate")
40+
self.try_to_extract_property(metadata_dict, audio_file.info, "bitrate")
3941
if isinstance(audio_file, mutagen.mp3.MP3):
4042
metadata_dict["comments"] = audio_file.get("COMM::XXX", "")
4143
audio_file = mutagen.mp3.MP3(file.absolute_path, ID3=EasyID3)
4244
else:
43-
metadata_dict["bits_per_sample"] = audio_file.info.bits_per_sample
45+
self.try_to_extract_property(
46+
metadata_dict, audio_file.info, "bits_per_sample"
47+
)
4448

4549
metadata_dict.update(dict(audio_file))
4650
return metadata_dict
4751

52+
@staticmethod
53+
def try_to_extract_property(
54+
metadata_dict: Dict[str, Any], audio_info, property_name: str
55+
):
56+
if hasattr(audio_info, property_name):
57+
metadata_dict[property_name] = getattr(audio_info, property_name)
58+
4859
def format_value(self, metadata_value: Any):
4960
return metadata_value
5061

@@ -92,13 +103,13 @@ class TrackTag(MutagenTagBase):
92103

93104

94105
class DurationTag(MutagenTagBase):
95-
"""Track duration in seconds"""
106+
"""Track duration in ISO 8601 notation"""
96107

97-
tag_key = "duration"
108+
tag_key = "length"
98109

99110
def format_value(self, metadata_value: Any):
100-
duration_in_seconds = float(super().format_value(metadata_value))
101-
return timedelta(seconds=duration_in_seconds)
111+
duration_seconds = float(super().format_value(metadata_value))
112+
return isodate.duration_isoformat(timedelta(seconds=duration_seconds))
102113

103114

104115
class ChannelsTag(MutagenTagBase):

tempren/tags/gpx.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import Any, Optional
44

55
import gpxpy
6+
import isodate
67
from gpxpy.gpx import GPX, GPXXMLSyntaxException
78

89
from tempren.exceptions import FileNotSupportedError, MissingMetadataError
@@ -56,13 +57,13 @@ def extract_metadata(self, gpx: GPX) -> Any:
5657

5758

5859
class DurationTag(GpxTagBase):
59-
"""Duration of the activity"""
60+
"""Duration of the activity in ISO 8601 notation"""
6061

6162
def extract_metadata(self, gpx: GPX) -> timedelta:
6263
duration_seconds = gpx.get_duration()
6364
if not duration_seconds:
6465
raise MissingMetadataError()
65-
return timedelta(seconds=duration_seconds)
66+
return isodate.duration_isoformat(timedelta(seconds=duration_seconds))
6667

6768

6869
class DistanceTag(GpxTagBase):

tempren/tags/video.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from fractions import Fraction
44
from typing import Any, Optional
55

6+
import isodate
67
from pymediainfo import MediaInfo
78

89
from tempren.exceptions import FileNotSupportedError, MissingMetadataError
@@ -92,10 +93,10 @@ def extract_video_metadata(self, video_track) -> Any:
9293

9394

9495
class DurationTag(VideoInfoTagBase):
95-
"""Video duration in seconds"""
96+
"""Video duration in ISO 8601 notation"""
9697

9798
def extract_video_metadata(self, video_track) -> timedelta:
98-
return timedelta(milliseconds=video_track.duration)
99+
return isodate.duration_isoformat(timedelta(milliseconds=video_track.duration))
99100

100101

101102
class BitRateTag(VideoInfoTagBase):

tests/tags/test_audio.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def test_duration_extraction(self, sample_file: File):
8181

8282
duration = tag.process(sample_file, None)
8383

84-
assert duration == timedelta(seconds=1, microseconds=288707)
84+
assert duration == "PT1.288707S"
8585

8686
def test_channels_extraction(self, sample_file: File):
8787
tag = ChannelsTag()

tests/tags/test_gpx.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def test_duration(self, tag: DurationTag, gpx_data_dir: Path):
9090

9191
result = tag.process(walk_file, None)
9292

93-
assert result == timedelta(minutes=26, seconds=42, microseconds=274000)
93+
assert result == "PT26M42.274S"
9494

9595

9696
class TestDistanceTag(GpxTagTests):

tests/tags/test_video.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def test_duration(self, tag: DurationTag, video_data_dir: Path):
150150

151151
duration = tag.process(video_file, None)
152152

153-
assert duration == timedelta(seconds=2, milliseconds=800)
153+
assert duration == "PT2.8S"
154154

155155

156156
class TestBitRateTag(VideoInfoTagTests):

0 commit comments

Comments
 (0)