class RBOX_TEST_DATABASE

(source code)

description

Rythmbox test database

note
	description: "Rythmbox test database"

	author: "Finnian Reilly"
	copyright: "Copyright (c) 2001-2022 Finnian Reilly"
	contact: "finnian at eiffel hyphen loop dot com"

	license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
	date: "2024-04-16 16:22:53 GMT (Tuesday 16th April 2024)"
	revision: "28"

class
	RBOX_TEST_DATABASE

inherit
	RBOX_DATABASE
		export
			{EQA_TEST_SET} make
		redefine
			new_cortina, new_song, extend_with_song, expanded_file_uri, shortened_file_uri, on_context_return
		end

	EL_MODULE_AUDIO_COMMAND

	EL_PROTOCOL_CONSTANTS
		export
			{NONE} all
		end

create
	make

feature -- Element change

	extend_with_song (song: RBOX_SONG)
		do
			if song.duration > 10 then
				song.set_duration (song.duration // 10)
			end
			if not song.is_hidden and then not song.mp3_path.exists then
				File_system.make_directory (song.mp3_path.parent)
				OS.copy_file (cached_song_file_path (song), song.mp3_path)
			end
			Precursor (song)
		end

feature -- Factory

	new_song: RBOX_TEST_SONG
		do
			create Result.make
		end

	new_cortina (
		a_source_song: RBOX_SONG; a_tanda_type: ZSTRING; a_track_number, a_duration: INTEGER
	): RBOX_CORTINA_TEST_SONG
		do
			create Result.make (a_source_song, a_tanda_type, a_track_number, a_duration)
		end

feature {RBOX_IRADIO_ENTRY} -- Implementation

	expanded_file_uri (a_uri: EL_URI): EL_URI
		local
			modified: STRING
		do
			create modified.make_from_string (a_uri)
			modified.replace_substring_all (Var_music, Encoded_music_dir)
			Result := modified
		end

	shortened_file_uri (a_uri: EL_URI): EL_URI
		local
			modified: STRING
		do
			create modified.make_from_string (a_uri)
			modified.replace_substring_all (Encoded_music_dir, Var_music)
			Result := modified
		end

	on_context_return (context: EL_EIF_OBJ_XPATH_CONTEXT)
		do
			if attached {RBOX_IGNORED_ENTRY} context as entry then
				entry.set_location (expanded_file_uri (entry.location))
			end
			Precursor (context)
		end

feature {EQA_TEST_SET} -- Access

	cached_song_file_path (song: RBOX_SONG): FILE_PATH
		do
			if attached song.mp3_path.relative_path (music_dir).steps as steps then
				steps.put_front ("test-mp3")
				Result := File_system.cached (steps, agent generate_mp3_file (song, ?))
			end
		end

	generate_mp3_file (song: RBOX_SONG; mp3_path: FILE_PATH)
			-- Path to auto generated mp3 file under build directory
		require
			valid_duration: song.duration > 0
		local
			mp3_writer: like Audio_command.new_wav_to_mp3
			temp_path, wav_path: FILE_PATH; mp3_info: TL_MUSICBRAINZ_MPEG_FILE
			modification_time: DATE_TIME
		do
			temp_path := song.mp3_path
			modification_time := song.modification_time
			song.set_mp3_path (mp3_path)

			File_system.make_directory (mp3_path.parent)
			wav_path := mp3_path.with_new_extension ("wav")

			-- Create a unique Random wav file
			Test_wav_generator.set_output_file_path (wav_path)
			Test_wav_generator.set_frequency_lower (100 + (200 * Random.real_item).rounded)
			Random.forth
			Test_wav_generator.set_frequency_upper (600  + (600 * Random.real_item).rounded)
			Random.forth
			Test_wav_generator.set_cycles_per_sec ((1.0 + Random.real_item.to_double).truncated_to_real)
			Random.forth

			if song.duration > 0 then
				Test_wav_generator.set_duration (song.duration)
			end
			Test_wav_generator.execute

			mp3_writer := Audio_command.new_wav_to_mp3 (wav_path, mp3_path)
			mp3_writer.set_bit_rate_per_channel (48)
			mp3_writer.set_num_channels (1)
			mp3_writer.execute
			File_system.remove_file (wav_path)

			song.update_file_info

			create mp3_info.make (mp3_path)
			song.write_id3_info (mp3_info)
			mp3_info.dispose

			song.set_modification_time (modification_time)
			File.set_modification_time (mp3_path, song.mtime)
			song.set_mp3_path (temp_path)
		ensure
			file_exists: mp3_path.exists
			song_path_unchange: old song.mp3_path ~ song.mp3_path
		end

	update_mp3_root_location
		do
		end

feature {NONE} -- Constants

	Var_music: STRING
		once
			Result := "$MUSIC"
		end

	Encoded_music_dir: STRING
		once
			Encoded_location.set_from_string (music_dir)
			create Result.make_from_string (Encoded_location)
		end

	Test_wav_generator: EL_WAV_GENERATION_COMMAND_I
		once
			create {EL_WAV_GENERATION_COMMAND_IMP} Result.make ("")
		end

	Random: RANDOM
		once
			create Result.make
		end

end