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

View File

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

View File

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