Convert ID3 metadata field on audio attachments into hashtags

main
Bob Mottram 2022-05-20 16:18:02 +01:00
parent 59293c7dd5
commit 4a632c1c94
2 changed files with 52 additions and 0 deletions

View File

@ -162,6 +162,38 @@ def _spoof_meta_data(base_dir: str, nickname: str, domain: str,
return
def get_music_metadata(filename: str) -> {}:
"""Returns metadata for a music file
"""
result = None
try:
result = subprocess.run(['exiftool', '-v3', filename],
stdout=subprocess.PIPE)
except BaseException as ex:
print('EX: get_music_metadata failed ' + str(ex))
if not result:
return {}
if not result.stdout:
return {}
try:
id3_lines = result.stdout.decode('utf-8').split('\n')
except BaseException:
print('EX: get_music_metadata unable to decode output')
return {}
fieldnames = (
'Title', 'Artist', 'Genre', 'Track', 'Album', 'Length', 'Band'
)
music_metadata = {}
for line in id3_lines:
for field in fieldnames:
if field + ' = ' in line:
field_value = line.split(field + ' = ')[1]
if '>' in field_value:
field_value = field_value.split('>')[0].strip()
music_metadata[field.lower()] = field_value
return music_metadata
def convert_image_to_low_bandwidth(image_filename: str) -> None:
"""Converts an image to a low bandwidth version
"""

View File

@ -32,6 +32,8 @@ from webfinger import webfinger_handle
from httpsig import create_signed_header
from siteactive import site_is_active
from languages import understood_post_language
from utils import valid_hash_tag
from utils import get_audio_extensions
from utils import get_summary_from_post
from utils import get_user_paths
from utils import invalid_ciphertext
@ -70,6 +72,7 @@ from utils import remove_html
from utils import dangerous_markup
from utils import acct_dir
from utils import local_actor_url
from media import get_music_metadata
from media import attach_media
from media import replace_you_tube
from media import replace_twitter
@ -1423,6 +1426,23 @@ def _create_post_base(base_dir: str,
else:
mentioned_recipients = ''
# add hashtags from audio file ID3 tags, such as Artist, Album, etc
if attach_image_filename and media_type:
audio_types = get_audio_extensions()
music_metadata = None
for ext in audio_types:
if ext in media_type:
music_metadata = get_music_metadata(attach_image_filename)
break
if music_metadata:
for audio_tag, audio_value in music_metadata.items():
if audio_tag == 'title' or audio_tag == 'track':
continue
audio_value = audio_value.title().replace(' ', '')
if valid_hash_tag(audio_value) and \
'#' + audio_value not in content:
content += ' #' + audio_value
tags = []
hashtags_dict = {}