"""Trafaret schemas for meta information of audio files.""" import trafaret as t from src.constants import audio_standards from src.constants import field_const from src import custom_validators from src.common.constants import transcoding_types from trafaret.extras import KeysSubset AUDIO_METADATA_SCHEMA = t.Dict({ t.Key(field_const.LOSSLESS): t.Atom(audio_standards.LOSSLESS_VALUE), t.Key(field_const.CHANNELS): t.Int(audio_standards.DEFAULT_NUMBER_OF_CHANNELS), t.Key(field_const.CHANNEL_MODE): t.String(audio_standards.DEFAULT_CHANEL_MODE), t.Key(field_const.SAMPLE_RATE): t.Int, t.Key(field_const.PLAYTIME_SECONDS): t.Float, t.Key(field_const.MIME_TYPE): t.Or( t.Atom(transcoding_types.MIME_TYPE_FILE_WAV), t.Atom(transcoding_types.MIME_TYPE_FILE_XWAV), t.Atom(transcoding_types.MIME_TYPE_FILE_VHDWAV), t.Atom(transcoding_types.MIME_TYPE_FILE_FLAC), t.Atom(transcoding_types.MIME_TYPE_FILE_XFLAC), t.Atom(transcoding_types.MIME_TYPE_FILE_MP4), t.Atom(transcoding_types.MIME_TYPE_FILE_XMP4) ), t.Key(field_const.BITS_PER_SAMPLE): t.Or(t.Atom(16), t.Atom(24)), t.Key(field_const.CHANNELS): t.Or( t.Atom(field_const.NUMBER_OF_CHANNELS_IN_STEREO), t.Atom(field_const.NUMBER_OF_CHANNELS_IN_MONO)), t.Key(field_const.CONTAINER): t.Or( t.Atom(transcoding_types.CONTAINER_FLAC), t.Atom(transcoding_types.CONTAINER_MPEG4), t.Atom(transcoding_types.CONTAINER_WAVE)), t.Key(field_const.CODEC): t.Or( t.Atom(field_const.PCM_CODEC_NAME), t.Atom(field_const.FLAC_CODEC_NAME), t.Atom(field_const.ALAC_CODEC_NAME)), KeysSubset( field_const.CHANNELS, field_const.SAMPLE_RATE, field_const.BIT_RATE, field_const.CONTAINER, field_const.BITS_PER_SAMPLE ): custom_validators.wav_bit_rate_validation, KeysSubset( field_const.BITS_PER_SAMPLE, field_const.SAMPLE_RATE): custom_validators.sample_rate_validation, KeysSubset( field_const.FILE_SIZE, field_const.PLAYTIME_SECONDS, field_const.CONTAINER ): custom_validators.wav_file_size_validation }, allow_extra='*')