100 lines
2.9 KiB
Python
100 lines
2.9 KiB
Python
"""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 command‑line 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 command‑line 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 (1‑based).
|
||
input_metadata: Dict from get_metadata().
|
||
args: Parsed command‑line 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}
|