add audio duration

This commit is contained in:
Andrea Maria Piana 2020-06-23 16:30:39 +02:00
parent e58ba1e9c8
commit 8716a8ce45
No known key found for this signature in database
GPG Key ID: AA6CCA6DE0E06424
7 changed files with 98 additions and 58 deletions

View File

@ -24,6 +24,8 @@ type QuotedMessage struct {
Base64Image string `json:"image,omitempty"`
// Base64Audio is the converted base64 audio
Base64Audio string `json:"audio,omitempty"`
// AudioDurationMs is the audio duration in milliseconds
AudioDurationMs uint64 `json:"audioDuration,omitempty"`
}
type CommandState int
@ -141,6 +143,7 @@ func (m *Message) MarshalJSON() ([]byte, error) {
EnsName string `json:"ensName"`
Image string `json:"image,omitempty"`
Audio string `json:"audio,omitempty"`
AudioDurationMs uint64 `json:"audioDurationMs,omitempty"`
Sticker *StickerAlias `json:"sticker"`
CommandParameters *CommandParameters `json:"commandParameters"`
Timestamp uint64 `json:"timestamp"`
@ -179,6 +182,11 @@ func (m *Message) MarshalJSON() ([]byte, error) {
Hash: sticker.Hash,
}
}
if audio := m.GetAudio(); audio != nil {
item.AudioDurationMs = audio.DurationMs
}
return json.Marshal(item)
}
@ -186,11 +194,12 @@ func (m *Message) UnmarshalJSON(data []byte) error {
type Alias Message
aux := struct {
*Alias
ResponseTo string `json:"responseTo"`
EnsName string `json:"ensName"`
ChatID string `json:"chatId"`
Sticker *protobuf.StickerMessage `json:"sticker"`
ContentType protobuf.ChatMessage_ContentType `json:"contentType"`
ResponseTo string `json:"responseTo"`
EnsName string `json:"ensName"`
ChatID string `json:"chatId"`
Sticker *protobuf.StickerMessage `json:"sticker"`
AudioDurationMs uint64 `json:"audioDurationMs"`
ContentType protobuf.ChatMessage_ContentType `json:"contentType"`
}{
Alias: (*Alias)(m),
}
@ -200,6 +209,11 @@ func (m *Message) UnmarshalJSON(data []byte) error {
if aux.ContentType == protobuf.ChatMessage_STICKER {
m.Payload = &protobuf.ChatMessage_Sticker{Sticker: aux.Sticker}
}
if aux.ContentType == protobuf.ChatMessage_AUDIO {
m.Payload = &protobuf.ChatMessage_Audio{
Audio: &protobuf.AudioMessage{DurationMs: aux.AudioDurationMs},
}
}
m.ResponseTo = aux.ResponseTo
m.EnsName = aux.EnsName
m.ChatId = aux.ChatID

View File

@ -38,6 +38,7 @@ func (db sqlitePersistence) tableUserMessagesAllFields() string {
image_base64,
audio_payload,
audio_type,
audio_duration_ms,
audio_base64,
command_id,
command_value,
@ -71,6 +72,7 @@ func (db sqlitePersistence) tableUserMessagesAllFieldsJoin() string {
m1.sticker_pack,
m1.sticker_hash,
m1.image_base64,
m1.audio_duration_ms,
m1.audio_base64,
m1.command_id,
m1.command_value,
@ -87,6 +89,7 @@ func (db sqlitePersistence) tableUserMessagesAllFieldsJoin() string {
m2.source,
m2.text,
m2.image_base64,
m2.audio_duration_ms,
m2.audio_base64,
c.alias,
c.identicon`
@ -105,11 +108,13 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
var quotedFrom sql.NullString
var quotedImage sql.NullString
var quotedAudio sql.NullString
var quotedAudioDuration sql.NullInt64
var alias sql.NullString
var identicon sql.NullString
sticker := &protobuf.StickerMessage{}
command := &CommandParameters{}
audio := &protobuf.AudioMessage{}
args := []interface{}{
&message.ID,
@ -129,6 +134,7 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
&sticker.Pack,
&sticker.Hash,
&message.Base64Image,
&audio.DurationMs,
&message.Base64Audio,
&command.ID,
&command.Value,
@ -145,6 +151,7 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
&quotedFrom,
&quotedText,
&quotedImage,
&quotedAudioDuration,
&quotedAudio,
&alias,
&identicon,
@ -156,10 +163,11 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
if quotedText.Valid {
message.QuotedMessage = &QuotedMessage{
From: quotedFrom.String,
Text: quotedText.String,
Base64Image: quotedImage.String,
Base64Audio: quotedAudio.String,
From: quotedFrom.String,
Text: quotedText.String,
Base64Image: quotedImage.String,
AudioDurationMs: uint64(quotedAudioDuration.Int64),
Base64Audio: quotedAudio.String,
}
}
message.Alias = alias.String
@ -168,6 +176,10 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
message.Payload = &protobuf.ChatMessage_Sticker{Sticker: sticker}
}
if message.ContentType == protobuf.ChatMessage_AUDIO {
message.Payload = &protobuf.ChatMessage_Audio{Audio: audio}
}
if message.ContentType == protobuf.ChatMessage_TRANSACTION_COMMAND {
message.CommandParameters = command
}
@ -217,6 +229,7 @@ func (db sqlitePersistence) tableUserMessagesAllValues(message *Message) ([]inte
message.Base64Image,
audio.Payload,
audio.Type,
audio.DurationMs,
message.Base64Audio,
command.ID,
command.Value,

View File

@ -1396,11 +1396,13 @@ func (m *Messenger) SendChatMessage(ctx context.Context, message *Message) (*Mes
return nil, err
}
audio := protobuf.AudioMessage{
Payload: payload,
Type: audio.Type(payload),
audioMessage := message.GetAudio()
if audioMessage == nil {
return nil, errors.New("no audio has been passed")
}
message.Payload = &protobuf.ChatMessage_Audio{Audio: &audio}
audioMessage.Payload = payload
audioMessage.Type = audio.Type(payload)
message.Payload = &protobuf.ChatMessage_Audio{Audio: audioMessage}
}
logger := m.logger.With(zap.String("site", "Send"), zap.String("chatID", message.ChatId))

View File

@ -15,7 +15,7 @@
// 1593087212_add_mute_chat_and_raw_message_fields.down.sql (0)
// 1593087212_add_mute_chat_and_raw_message_fields.up.sql (215B)
// 1595862781_add_audio_data.down.sql (0)
// 1595862781_add_audio_data.up.sql (186B)
// 1595862781_add_audio_data.up.sql (246B)
// doc.go (850B)
package migrations
@ -385,7 +385,7 @@ func _1595862781_add_audio_dataDownSql() (*asset, error) {
return a, nil
}
var __1595862781_add_audio_dataUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xcb\x41\x0a\xc2\x40\x0c\x05\xd0\x7d\x4f\xf1\xe9\x19\xc4\x4d\x57\x33\x4e\x04\x21\x66\x40\x32\xe0\xae\x44\x1a\x44\x50\x5a\x8c\x5d\xf4\xf6\x9e\xa1\x07\x78\x89\x95\x6e\xd0\x94\x99\xb0\x86\x7f\xc7\x8f\x47\xd8\xd3\x03\xa9\x14\x9c\x2a\xb7\xab\xc0\xd6\xe9\x35\x8f\x8b\x6d\xef\xd9\x26\x64\xae\x79\xe8\x76\xc0\xdf\xb6\x38\x2e\xa2\xbb\xd0\xc3\xc2\x8f\x07\x28\xdd\x15\x52\x15\xd2\x98\x51\xe8\x9c\x1a\x2b\xfa\x7e\xe8\xfe\x01\x00\x00\xff\xff\x87\xd0\x8b\xbb\xba\x00\x00\x00")
var __1595862781_add_audio_dataUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xcb\x41\xaa\xc3\x20\x10\x06\xe0\x7d\x4e\xf1\x93\x33\x3c\xde\x26\x2b\x53\x2d\x14\xa6\x0a\x65\x84\xee\x64\x8a\x52\x02\x4d\x0d\x99\xb8\xc8\xed\x7b\x06\x0f\xf0\x19\x62\xf7\x00\x9b\x99\x1c\x9a\x96\x3d\xad\x45\x55\xde\x45\x61\xac\xc5\x25\x50\xbc\x7b\x48\xcb\x4b\x4d\x9b\x9c\x9f\x2a\x19\x33\x85\x79\x1a\x3a\xe0\x71\x6e\x05\x37\xcf\x5d\x28\xb7\x5d\x8e\xa5\x7e\xd3\xaa\xdd\xf6\x25\x5a\xfe\xff\xc0\xee\xc9\xf0\x81\xe1\x23\x11\xac\xbb\x9a\x48\x8c\x71\x9c\x86\x5f\x00\x00\x00\xff\xff\xeb\x6f\xa0\x62\xf6\x00\x00\x00")
func _1595862781_add_audio_dataUpSqlBytes() ([]byte, error) {
return bindataRead(
@ -400,8 +400,8 @@ func _1595862781_add_audio_dataUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 186, mode: os.FileMode(0644), modTime: time.Unix(1595862768, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0xf0, 0xf7, 0x5d, 0x8e, 0xc4, 0xd5, 0xb1, 0xb0, 0xa, 0x7c, 0xbd, 0x26, 0x22, 0xfe, 0xc0, 0xf0, 0xb0, 0x4e, 0x97, 0x2f, 0xcf, 0x8c, 0x24, 0x88, 0xdc, 0x6e, 0xab, 0x41, 0x99, 0xce, 0x36}}
info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0644), modTime: time.Unix(1595862893, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xae, 0xd2, 0xee, 0x55, 0xfb, 0x36, 0xa4, 0x92, 0x66, 0xe, 0x81, 0x62, 0x1e, 0x7a, 0x69, 0xa, 0xd5, 0x4b, 0xa5, 0x6a, 0x8d, 0x1d, 0xce, 0xf3, 0x3e, 0xc0, 0x5f, 0x9c, 0x66, 0x1b, 0xb4, 0xed}}
return a, nil
}

View File

@ -1,3 +1,4 @@
ALTER TABLE user_messages ADD COLUMN audio_payload BLOB;
ALTER TABLE user_messages ADD COLUMN audio_type INT;
ALTER TABLE user_messages ADD COLUMN audio_duration_ms INT;
ALTER TABLE user_messages ADD COLUMN audio_base64 TEXT NOT NULL DEFAULT "";

View File

@ -261,6 +261,7 @@ func (m *ImageMessage) GetType() ImageMessage_ImageType {
type AudioMessage struct {
Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
Type AudioMessage_AudioType `protobuf:"varint,2,opt,name=type,proto3,enum=protobuf.AudioMessage_AudioType" json:"type,omitempty"`
DurationMs uint64 `protobuf:"varint,3,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -305,6 +306,13 @@ func (m *AudioMessage) GetType() AudioMessage_AudioType {
return AudioMessage_UNKNOWN_AUDIO_TYPE
}
func (m *AudioMessage) GetDurationMs() uint64 {
if m != nil {
return m.DurationMs
}
return 0
}
type ChatMessage struct {
// Lamport timestamp of the chat message
Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"`
@ -490,45 +498,46 @@ func init() {
func init() { proto.RegisterFile("chat_message.proto", fileDescriptor_263952f55fd35689) }
var fileDescriptor_263952f55fd35689 = []byte{
// 631 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0xcb, 0x4e, 0xdb, 0x40,
0x14, 0xc5, 0x89, 0x13, 0xc7, 0xd7, 0x29, 0x9a, 0x4e, 0x11, 0xb8, 0x12, 0x52, 0x53, 0xab, 0x8b,
0xac, 0xb2, 0xa0, 0x54, 0xea, 0xd6, 0x98, 0x69, 0x30, 0xe0, 0x87, 0xc6, 0x93, 0x52, 0x56, 0x96,
0x71, 0xa6, 0x24, 0x02, 0xc7, 0x16, 0x36, 0x52, 0xd9, 0xf4, 0x13, 0xba, 0xeb, 0x47, 0x74, 0xdf,
0x0f, 0xac, 0x66, 0x8c, 0x13, 0x83, 0xaa, 0x6e, 0xba, 0xf2, 0x7d, 0x9c, 0x7b, 0x7c, 0xe6, 0xce,
0x19, 0xc0, 0xe9, 0x22, 0xa9, 0xe2, 0x8c, 0x97, 0x65, 0x72, 0xcd, 0x27, 0xc5, 0x5d, 0x5e, 0xe5,
0x78, 0x20, 0x3f, 0x57, 0xf7, 0x5f, 0xad, 0x8f, 0xb0, 0x1d, 0x55, 0xcb, 0xf4, 0x86, 0xdf, 0x79,
0x35, 0x02, 0x63, 0x50, 0x17, 0x49, 0xb9, 0x30, 0x95, 0x91, 0x32, 0xd6, 0xa9, 0x8c, 0x45, 0xad,
0x48, 0xd2, 0x1b, 0xb3, 0x33, 0x52, 0xc6, 0x3d, 0x2a, 0x63, 0xeb, 0x97, 0x02, 0x43, 0x37, 0x4b,
0xae, 0x79, 0x33, 0x68, 0x82, 0x56, 0x24, 0x0f, 0xb7, 0x79, 0x32, 0x97, 0xb3, 0x43, 0xda, 0xa4,
0xf8, 0x10, 0xd4, 0xea, 0xa1, 0xe0, 0x72, 0x7c, 0xfb, 0x60, 0x34, 0x69, 0xfe, 0x3e, 0x69, 0xcf,
0xd7, 0x09, 0x7b, 0x28, 0x38, 0x95, 0x68, 0xcb, 0x05, 0x7d, 0x5d, 0xc2, 0xbb, 0x80, 0x67, 0xfe,
0x99, 0x1f, 0x5c, 0xf8, 0xb1, 0xeb, 0xd9, 0x53, 0x12, 0xb3, 0xcb, 0x90, 0xa0, 0x2d, 0xac, 0x41,
0x37, 0xf4, 0xa7, 0x48, 0xc1, 0x03, 0x50, 0x4f, 0x43, 0x32, 0x45, 0x1d, 0x11, 0x5d, 0x90, 0xa3,
0x10, 0x75, 0x45, 0x73, 0xea, 0x7e, 0x42, 0xaa, 0xf5, 0x53, 0x81, 0xa1, 0x7d, 0x3f, 0x5f, 0xe6,
0xff, 0xa1, 0xb5, 0x3d, 0x5f, 0x27, 0x2d, 0xad, 0x1f, 0x40, 0x5f, 0x97, 0xda, 0x5a, 0xed, 0xd9,
0xb1, 0x1b, 0xb4, 0xb4, 0xda, 0xb6, 0x83, 0x14, 0x19, 0x78, 0x14, 0x75, 0xac, 0x1f, 0x7d, 0x30,
0x9c, 0x45, 0x52, 0x35, 0xb2, 0x76, 0xa0, 0x97, 0xde, 0xe6, 0xe9, 0x8d, 0x14, 0xa5, 0xd2, 0x3a,
0xc1, 0xfb, 0xa0, 0x57, 0xcb, 0x8c, 0x97, 0x55, 0x92, 0x15, 0x52, 0x97, 0x4a, 0x37, 0x05, 0x71,
0x37, 0x15, 0xff, 0x56, 0x99, 0xdd, 0xfa, 0xbe, 0x44, 0x8c, 0xdf, 0x80, 0x71, 0xc7, 0xcb, 0x22,
0x5f, 0x95, 0x3c, 0xae, 0x72, 0x53, 0x95, 0x2d, 0x68, 0x4a, 0x2c, 0xc7, 0xaf, 0x61, 0xc0, 0x57,
0x65, 0xbc, 0x4a, 0x32, 0x6e, 0xf6, 0x64, 0x57, 0xe3, 0xab, 0xd2, 0x4f, 0x32, 0x8e, 0xf7, 0x40,
0x93, 0x8e, 0x59, 0xce, 0xcd, 0xbe, 0xec, 0xf4, 0x45, 0xea, 0xce, 0xf1, 0x31, 0x0c, 0x1f, 0x5d,
0x14, 0xcb, 0x0d, 0x69, 0x72, 0x43, 0x6f, 0x37, 0x1b, 0x6a, 0x9d, 0x64, 0xf2, 0xf8, 0x95, 0x2b,
0x32, 0xb2, 0x4d, 0x22, 0x58, 0xd2, 0x7c, 0x55, 0xf1, 0x55, 0x55, 0xb3, 0x0c, 0xfe, 0xc5, 0xe2,
0xd4, 0xc8, 0x9a, 0x25, 0xdd, 0x24, 0xf8, 0x10, 0xb4, 0xb2, 0xb6, 0xad, 0xa9, 0x8f, 0x94, 0xb1,
0x71, 0x60, 0x6e, 0x08, 0x9e, 0xfa, 0xf9, 0x64, 0x8b, 0x36, 0x50, 0x3c, 0x81, 0xde, 0x52, 0x38,
0xca, 0x04, 0x39, 0xb3, 0xfb, 0x77, 0x23, 0x9e, 0x6c, 0xd1, 0x1a, 0x26, 0xf0, 0x89, 0xb8, 0x55,
0xd3, 0x78, 0x8e, 0x6f, 0x9b, 0x41, 0xe0, 0x25, 0xcc, 0xfa, 0x0e, 0x46, 0xeb, 0xdc, 0xd8, 0x84,
0x9d, 0xc6, 0x07, 0x1e, 0x89, 0xa2, 0x96, 0x6b, 0xb7, 0x01, 0x02, 0x9f, 0xc4, 0x2c, 0x88, 0x03,
0x9f, 0x20, 0x05, 0x23, 0x18, 0x86, 0xb3, 0xa3, 0x73, 0xd7, 0x89, 0xa7, 0x34, 0x98, 0x85, 0xa8,
0x83, 0x5f, 0xc2, 0x8b, 0x90, 0xba, 0x9f, 0x6d, 0x46, 0x1e, 0x4b, 0x5d, 0x3c, 0x82, 0xfd, 0xe8,
0x32, 0x62, 0xc4, 0x5b, 0xb3, 0x3d, 0x45, 0xa8, 0xd6, 0x6f, 0x05, 0x8c, 0xd6, 0xca, 0xda, 0x02,
0x9c, 0xc0, 0x67, 0xc4, 0x67, 0x2d, 0x01, 0x8c, 0x7c, 0x61, 0x71, 0x78, 0x6e, 0xbb, 0x3e, 0x52,
0xb0, 0x01, 0x5a, 0xc4, 0x5c, 0xe7, 0x8c, 0x50, 0xd4, 0xc1, 0x00, 0xfd, 0x88, 0xd9, 0x6c, 0x16,
0xa1, 0x2e, 0xd6, 0xa1, 0x47, 0xbc, 0xe0, 0xd4, 0x45, 0x2a, 0xde, 0x83, 0x57, 0x8c, 0xda, 0x7e,
0x64, 0x3b, 0xcc, 0x0d, 0x04, 0xa3, 0xe7, 0xd9, 0xfe, 0x31, 0xea, 0xe1, 0x31, 0xbc, 0x7b, 0x26,
0xac, 0xf9, 0xdb, 0x53, 0x81, 0x7d, 0xc1, 0x26, 0x5f, 0x2f, 0xd2, 0x44, 0x28, 0x1f, 0x07, 0x1a,
0x1c, 0xe9, 0xeb, 0xc7, 0x78, 0xd5, 0x97, 0x1b, 0x7e, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x68,
0xd3, 0x79, 0xbb, 0xb5, 0x04, 0x00, 0x00,
// 652 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0x4d, 0x6f, 0xd3, 0x40,
0x10, 0xad, 0x13, 0x27, 0x8e, 0xc7, 0xa1, 0x5a, 0x96, 0xaa, 0x35, 0x52, 0x25, 0x82, 0xc5, 0x21,
0xa7, 0x1c, 0x4a, 0x91, 0xb8, 0xba, 0xae, 0x49, 0xdd, 0xd6, 0x1f, 0x5a, 0x6f, 0x28, 0x3d, 0x59,
0xae, 0xb3, 0x34, 0x51, 0xeb, 0x0f, 0xc5, 0xae, 0x44, 0x2f, 0xfc, 0x04, 0xfe, 0x07, 0x77, 0xc4,
0xef, 0x43, 0xbb, 0xae, 0x13, 0xa7, 0x42, 0x5c, 0x38, 0x79, 0x66, 0xf6, 0xcd, 0xf3, 0x9b, 0xd9,
0xb7, 0x80, 0x93, 0x45, 0x5c, 0x45, 0x29, 0x2b, 0xcb, 0xf8, 0x96, 0x4d, 0x8a, 0x55, 0x5e, 0xe5,
0x78, 0x20, 0x3e, 0x37, 0x0f, 0x5f, 0x8d, 0x8f, 0xb0, 0x1b, 0x56, 0xcb, 0xe4, 0x8e, 0xad, 0xdc,
0x1a, 0x81, 0x31, 0xc8, 0x8b, 0xb8, 0x5c, 0xe8, 0xd2, 0x48, 0x1a, 0xab, 0x44, 0xc4, 0xbc, 0x56,
0xc4, 0xc9, 0x9d, 0xde, 0x19, 0x49, 0xe3, 0x1e, 0x11, 0xb1, 0xf1, 0x53, 0x82, 0xa1, 0x93, 0xc6,
0xb7, 0xac, 0x69, 0xd4, 0x41, 0x29, 0xe2, 0xc7, 0xfb, 0x3c, 0x9e, 0x8b, 0xde, 0x21, 0x69, 0x52,
0x7c, 0x0c, 0x72, 0xf5, 0x58, 0x30, 0xd1, 0xbe, 0x7b, 0x34, 0x9a, 0x34, 0x7f, 0x9f, 0xb4, 0xfb,
0xeb, 0x84, 0x3e, 0x16, 0x8c, 0x08, 0xb4, 0xe1, 0x80, 0xba, 0x2e, 0xe1, 0x7d, 0xc0, 0x33, 0xef,
0xc2, 0xf3, 0xaf, 0xbc, 0xc8, 0x71, 0xcd, 0xa9, 0x1d, 0xd1, 0xeb, 0xc0, 0x46, 0x3b, 0x58, 0x81,
0x6e, 0xe0, 0x4d, 0x91, 0x84, 0x07, 0x20, 0x9f, 0x07, 0xf6, 0x14, 0x75, 0x78, 0x74, 0x65, 0x9f,
0x04, 0xa8, 0xcb, 0x0f, 0xa7, 0xce, 0x27, 0x24, 0x1b, 0xbf, 0x25, 0x18, 0x9a, 0x0f, 0xf3, 0x65,
0xfe, 0x1f, 0x5a, 0xdb, 0xfd, 0x75, 0xb2, 0xd1, 0x8a, 0xdf, 0x80, 0x36, 0x7f, 0x58, 0xc5, 0xd5,
0x32, 0xcf, 0xa2, 0xb4, 0xd4, 0xbb, 0x23, 0x69, 0x2c, 0x13, 0x68, 0x4a, 0x6e, 0x69, 0x7c, 0x00,
0x75, 0xdd, 0xd3, 0x1e, 0xc6, 0x9c, 0x9d, 0x3a, 0x7e, 0x6b, 0x18, 0xd3, 0xb4, 0x90, 0x24, 0x02,
0x97, 0xa0, 0x8e, 0xf1, 0xa3, 0x0f, 0x9a, 0xb5, 0x88, 0xab, 0x46, 0xf7, 0x1e, 0xf4, 0x92, 0xfb,
0x3c, 0xb9, 0x13, 0xaa, 0x65, 0x52, 0x27, 0xf8, 0x10, 0xd4, 0x6a, 0x99, 0xb2, 0xb2, 0x8a, 0xd3,
0x42, 0x08, 0x97, 0xc9, 0xa6, 0xc0, 0x2f, 0xaf, 0x62, 0xdf, 0x2a, 0x21, 0x4a, 0x25, 0x22, 0xe6,
0x7a, 0x57, 0xac, 0x2c, 0xf2, 0xac, 0x64, 0x51, 0x95, 0xeb, 0xb2, 0x38, 0x82, 0xa6, 0x44, 0x73,
0xfc, 0x1a, 0x06, 0x2c, 0x2b, 0xa3, 0x2c, 0x4e, 0x99, 0xde, 0x13, 0xa7, 0x0a, 0xcb, 0x4a, 0x2f,
0x4e, 0x19, 0x3e, 0x00, 0x45, 0x58, 0x6a, 0x39, 0xd7, 0xfb, 0xe2, 0xa4, 0xcf, 0x53, 0x67, 0x8e,
0x4f, 0x61, 0xf8, 0x64, 0xb3, 0x48, 0xac, 0x50, 0x11, 0x2b, 0x7c, 0xbb, 0x59, 0x61, 0x6b, 0x92,
0xc9, 0xd3, 0x57, 0xec, 0x50, 0x4b, 0x37, 0x09, 0x67, 0x49, 0xf2, 0xac, 0x62, 0x59, 0x55, 0xb3,
0x0c, 0xfe, 0xc5, 0x62, 0xd5, 0xc8, 0x9a, 0x25, 0xd9, 0x24, 0xf8, 0x18, 0x94, 0xb2, 0xf6, 0xb5,
0xae, 0x8e, 0xa4, 0xb1, 0x76, 0xa4, 0x6f, 0x08, 0xb6, 0x0d, 0x7f, 0xb6, 0x43, 0x1a, 0x28, 0x9e,
0x40, 0x6f, 0xc9, 0x2d, 0xa7, 0x83, 0xe8, 0xd9, 0xff, 0xbb, 0x53, 0xcf, 0x76, 0x48, 0x0d, 0xe3,
0xf8, 0x98, 0xdf, 0xaa, 0xae, 0x3d, 0xc7, 0xb7, 0xdd, 0xc2, 0xf1, 0x02, 0x66, 0x7c, 0x07, 0xad,
0x35, 0x37, 0xd6, 0x61, 0xaf, 0xf1, 0x81, 0x6b, 0x87, 0x61, 0xcb, 0xd6, 0xbb, 0x00, 0xbe, 0x67,
0x47, 0xd4, 0x8f, 0x7c, 0xcf, 0x46, 0x12, 0x46, 0x30, 0x0c, 0x66, 0x27, 0x97, 0x8e, 0x15, 0x4d,
0x89, 0x3f, 0x0b, 0x50, 0x07, 0xbf, 0x84, 0x17, 0x01, 0x71, 0x3e, 0x9b, 0xd4, 0x7e, 0x2a, 0x75,
0xf1, 0x08, 0x0e, 0xc3, 0xeb, 0x90, 0xda, 0xee, 0x9a, 0x6d, 0x1b, 0x21, 0x1b, 0xbf, 0x24, 0xd0,
0x5a, 0x2b, 0x6b, 0x0b, 0xb0, 0x7c, 0x8f, 0xda, 0x1e, 0x6d, 0x09, 0xa0, 0xf6, 0x17, 0x1a, 0x05,
0x97, 0xa6, 0xe3, 0x21, 0x09, 0x6b, 0xa0, 0x84, 0xd4, 0xb1, 0x2e, 0x6c, 0x82, 0x3a, 0x18, 0xa0,
0x1f, 0x52, 0x93, 0xce, 0x42, 0xd4, 0xc5, 0x2a, 0xf4, 0x6c, 0xd7, 0x3f, 0x77, 0x90, 0x8c, 0x0f,
0xe0, 0x15, 0x25, 0xa6, 0x17, 0x9a, 0x16, 0x75, 0x7c, 0xce, 0xe8, 0xba, 0xa6, 0x77, 0x8a, 0x7a,
0x78, 0x0c, 0xef, 0x9e, 0x09, 0x6b, 0xfe, 0xb6, 0x2d, 0xb0, 0xcf, 0xd9, 0xc4, 0xf3, 0x46, 0x0a,
0x0f, 0xc5, 0xe3, 0x40, 0x83, 0x13, 0x75, 0xfd, 0x5a, 0x6f, 0xfa, 0x62, 0xc3, 0xef, 0xff, 0x04,
0x00, 0x00, 0xff, 0xff, 0x5b, 0xc2, 0xb0, 0xfc, 0xd6, 0x04, 0x00, 0x00,
}

View File

@ -22,6 +22,7 @@ message ImageMessage {
message AudioMessage {
bytes payload = 1;
AudioType type = 2;
uint64 duration_ms = 3;
enum AudioType {
UNKNOWN_AUDIO_TYPE = 0;
AAC = 1;