Files
audio_splitter/metadata.py
T

100 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Metadata selection and building."""
def select_album_value(track, input_metadata, args):
"""
Determine the album value according to precedence.
Precedence: --album > %al > original album > original title > None.
Args:
track: Dict of parsed track data.
input_metadata: Dict from get_metadata().
args: Parsed commandline arguments.
Returns:
Album string or None.
"""
original_album = input_metadata.get('album')
original_title = input_metadata.get('title')
if args.album:
return args.album
elif track.get('al'):
return track.get('al')
elif original_album:
return original_album
elif original_title:
return original_title
else:
return None
def select_comment_value(input_metadata, args):
"""
Determine the comment value according to precedence.
Precedence: --no-comment > --comment > --merge-comments >
--comment-stream > first comment from file.
Args:
input_metadata: Dict from get_metadata().
args: Parsed commandline arguments.
Returns:
Comment string or None.
"""
original_comments = input_metadata.get('comments', [])
if args.no_comment:
return None
elif args.comment:
return args.comment
elif args.merge_comments and original_comments:
separator = args.comment_separator if args.comment_separator else '; '
comments_text = separator.join(comment for _, comment in original_comments)
return comments_text if comments_text else None
elif args.comment_stream is not None:
if 0 <= args.comment_stream < len(original_comments):
return original_comments[args.comment_stream][1]
else:
print(f"Warning: Stream {args.comment_stream} not found in comments list. "
f"Using first comment (if any).")
if original_comments:
return original_comments[0][1]
return None
elif original_comments:
# Default: use the first comment.
return original_comments[0][1]
else:
return None
def build_metadata_dict(track, idx, input_metadata, args):
"""
Assemble the final metadata dictionary for FFmpeg.
Args:
track: Dict of parsed track data.
idx: Track index (1based).
input_metadata: Dict from get_metadata().
args: Parsed commandline arguments.
Returns:
Dict with metadata fields (empty values removed).
"""
album_value = select_album_value(track, input_metadata, args)
comment_value = select_comment_value(input_metadata, args)
metadata = {
'title': track.get('tn', ''),
'artist': track.get('an', ''),
'album': album_value,
'date': track.get('date', ''),
'track': f"{idx:02d}",
'comment': comment_value
}
# Remove empty fields.
return {k: v for k, v in metadata.items() if v}