diff --git a/app/models/transcode_command.rb b/app/models/transcode_command.rb index ea419f8b..b4650505 100644 --- a/app/models/transcode_command.rb +++ b/app/models/transcode_command.rb @@ -8,6 +8,13 @@ class TranscodeCommand artist_name: 'TPE1' }.freeze + METADATA_KEYS_VS_FLAC_TAGS = { + track_title: 'TITLE', + track_number: 'TRACKNUMBER', + album_title: 'ALBUM', + artist_name: 'ARTIST' + }.freeze + def initialize(input, output, format, metadata = {}, image = nil) @input = input @output = output @@ -69,10 +76,21 @@ def transcoding_options(format) end def id3v23_keys - METADATA_KEYS_VS_ID3V23_TAGS.keys + metadata_lookup.keys end def id3v23_key_for(key) - METADATA_KEYS_VS_ID3V23_TAGS[key] + metadata_lookup[key] + end + + def metadata_lookup + case @format.to_s + when /^mp3/ + METADATA_KEYS_VS_ID3V23_TAGS + when /^flac/ + METADATA_KEYS_VS_FLAC_TAGS + else + raise ArgumentError, "unsupported format: #{@format}" + end end end diff --git a/test/models/transcode_command_test.rb b/test/models/transcode_command_test.rb index 8faaf519..46353194 100644 --- a/test/models/transcode_command_test.rb +++ b/test/models/transcode_command_test.rb @@ -42,7 +42,7 @@ class TranscodeCommandTest < ActiveSupport::TestCase assert_contains_pair(command_string, ['-c', 'copy']) end - test 'adds metadata using ID3v2.3 format' do + test 'adds ID3 tags using ID3v2.3 format for MP3 formats' do metadata = { track_title: 'track-title', track_number: 'track-number', @@ -58,6 +58,22 @@ class TranscodeCommandTest < ActiveSupport::TestCase assert_contains_pair(command_string, ['-metadata', 'TPE1="artist-name"']) end + test 'adds FLAC tags using ID3v2.3 format for FLAC formats' do + metadata = { + track_title: 'track-title', + track_number: 'track-number', + album_title: 'album-title', + artist_name: 'artist-name' + } + command_string = TranscodeCommand.new(@input, @output, :flac, metadata).generate + assert_contains_pair(command_string, ['-write_id3v2', '1']) + assert_contains_pair(command_string, ['-id3v2_version', '3']) + assert_contains_pair(command_string, ['-metadata', 'TITLE="track-title"']) + assert_contains_pair(command_string, ['-metadata', 'TRACKNUMBER="track-number"']) + assert_contains_pair(command_string, ['-metadata', 'ALBUM="album-title"']) + assert_contains_pair(command_string, ['-metadata', 'ARTIST="artist-name"']) + end + test 'transcodes audio to mp3 using libmp3lame codec highest audio quality' do command_string = TranscodeCommand.new(@input, @output, :mp3v0).generate assert_contains_pair(command_string, ['-codec:a', 'libmp3lame'])