diff --git a/include/fat_strings.hpp b/include/fat_strings.hpp index 9ef0147..e80d33d 100644 --- a/include/fat_strings.hpp +++ b/include/fat_strings.hpp @@ -29,12 +29,14 @@ struct image_info; struct video_info; struct file_info; +struct audio_info; namespace matrix::detail{ raii::string _image_body(const image_info& image); raii::string _video_body(const video_info& video); raii::string _file_body(const file_info& video); + raii::string _audio_body(const audio_info& audio); raii::string _message_body(const raii::string_base& text); } diff --git a/include/matrix.hpp b/include/matrix.hpp index 15dfb93..eead9b6 100644 --- a/include/matrix.hpp +++ b/include/matrix.hpp @@ -57,7 +57,8 @@ namespace matrix{ size_t thumb_height; size_t thumbsize; }; - using video_info = image_info; + struct video_info : public image_info{}; + struct audio_info : public file_info{}; class bot { @@ -133,11 +134,14 @@ namespace matrix{ image_info upload_image(const raii::string_base& filename, const raii::string_base& alias); video_info upload_video(const raii::string_base& filename); video_info upload_video(const raii::string_base& filename, const raii::string_base& alias); + audio_info upload_audio(const raii::string_base& filename); + audio_info upload_audio(const raii::string_base& filename, const raii::string_base& alias); //send messages raii::rjp_string send_image(const raii::string_base& room, const image_info& image); raii::rjp_string send_video(const raii::string_base& room, const video_info& video); raii::rjp_string send_message(const raii::string_base& room, const raii::string_base& text); + raii::rjp_string send_audio(const raii::string_base& room, const audio_info& audio); raii::rjp_string send_file(const raii::string_base& room, const file_info& file); void sync(void); diff --git a/include/reddit.hpp b/include/reddit.hpp index 7c90ed6..3d4a863 100644 --- a/include/reddit.hpp +++ b/include/reddit.hpp @@ -57,7 +57,7 @@ namespace reddit{ } enum class post_type{ - image, link, text, video, unrecognized + image, link, text, video, audio, unrecognized }; class post diff --git a/src/fat_strings.cpp b/src/fat_strings.cpp index f58f980..bde4fae 100644 --- a/src/fat_strings.cpp +++ b/src/fat_strings.cpp @@ -124,6 +124,20 @@ namespace matrix::detail{ "}"); } + raii::string _audio_body(const audio_info& audio){ + return raii::string( + "{" + "\"body\":\"" + raii::json_escape(audio.filename) + "\"," + "\"info\":{" + "\"mimetype\":\"audio/" + raii::json_escape(audio.filetype) + "\"," + "\"size\":" + itostr(audio.filesize) + + "}," + "\"msgtype\":\"m.audio\"," + "\"body\":\"" + audio.filename + "\"," + "\"url\":\"" + raii::json_escape(audio.fileurl) + "\"" + "}"); + } + raii::string _message_body(const raii::string_base& msg){ return raii::string("{\"body\":\""_ss + raii::json_escape(msg) + "\",\"msgtype\":\"m.text\"}"_ss); } diff --git a/src/matrix.cpp b/src/matrix.cpp index ae060b1..97234c1 100644 --- a/src/matrix.cpp +++ b/src/matrix.cpp @@ -228,6 +228,9 @@ namespace matrix{ video_info bot::upload_video(const raii::string_base& filename){ return upload_video(filename, raii::static_string()); } + audio_info bot::upload_audio(const raii::string_base& filename){ + return upload_audio(filename, raii::static_string()); + } #ifdef HAS_FFMPEG video_info bot::upload_video(const raii::string_base& filename, const raii::string_base& alias){ video_info ret = {}; @@ -242,27 +245,48 @@ namespace matrix{ ret.thumb_height = context.height(); ret.width = context.width(); ret.height = context.height(); - raii::string mimetype = context.get_mimetype(); + ret.filetype = context.get_mimetype(); context.reset(); //early cleanup to save memory ret.thumbsize = packet->size; ret.thumburl = _post_and_find(raii::static_string((char*)packet->data, packet->size), m_urls.file_upload, header, "content_uri"_ss); packet.reset(); - header = raii::curl_llist(raii::string("Content-Type: video/" + mimetype)); + header = raii::curl_llist(raii::string("Content-Type: video/" + ret.filetype)); raii::filerd fd(filename); if(!fd) return {}; ret.filesize = fd.length(); - ret.filetype = std::move(mimetype); ret.fileurl = _upload_file(fd, header); ret.filename = alias ? alias : filename; return ret; } + audio_info bot::upload_audio(const raii::string_base& filename, const raii::string_base& alias){ + audio_info ret = {}; + + raii::video_man context(filename); + if(!context) + return {}; + ret.filetype = context.get_mimetype(); + context.reset(); + raii::curl_llist header(raii::string("Content-Type: audio/" + ret.filetype)); + raii::filerd fd(filename); + if(!fd) return {}; + ret.filesize = fd.length(); + ret.fileurl = _upload_file(fd, header); + ret.filename = alias ? alias : filename; + + return ret; + } #else //HAS_FFMPEG video_info bot::upload_video(const raii::string_base& filename, const raii::string_base& alias){ video_info ret = {}; ret = upload_file(filename, alias); return ret; } + audio_info bot::upload_audio(const raii::string_base& filename, const raii::string_base& alias){ + audio_info ret = {}; + ret = upload_file(filename, alias); + return ret; + } #endif //HAS_FFMPEG raii::rjp_string bot::send_file(const raii::string_base& room, const file_info& file){ @@ -274,6 +298,9 @@ namespace matrix{ raii::rjp_string bot::send_video(const raii::string_base& room, const video_info& video){ return _send_message(room, detail::_video_body(video)); } + raii::rjp_string bot::send_audio(const raii::string_base& room, const audio_info& audio){ + return _send_message(room, detail::_audio_body(audio)); + } raii::rjp_string bot::send_message(const raii::string_base& room, const raii::string_base& text){ return _send_message(room, detail::_message_body(text)); } diff --git a/src/raii/video_man.cpp b/src/raii/video_man.cpp index 352f8e9..3ee4cac 100644 --- a/src/raii/video_man.cpp +++ b/src/raii/video_man.cpp @@ -41,7 +41,9 @@ namespace raii{ } raii::string video_man::get_mimetype(void)const{ const char* first = strstr(m_vid->iformat->name, ","); - return raii::string(raii::static_string(m_vid->iformat->name, first - m_vid->iformat->name)); + if(first) + return raii::string(raii::static_string(m_vid->iformat->name, first - m_vid->iformat->name)); + return raii::string(raii::static_string(m_vid->iformat->name)); } auto video_man::create_jpg_thumbnail(void) -> packet_type{ context_type jpg_context = _get_jpeg_context(m_context); diff --git a/src/test.cpp b/src/test.cpp index 5475b2f..5d72686 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -362,6 +362,14 @@ int main(){ val = matbot.send_message(roomid, raii::string(reply.title() + "\n" + reply.posturl())); DEBUG_PRINT("text event: %s\n", val.get()); } + else if(reply.type() == reddit::post_type::audio){ + DEBUG_PRINT("Got an audio file\n"); + auto audio_data = matbot.upload_audio(reply.name()); + auto val = matbot.send_audio(roomid, audio_data); + DEBUG_PRINT("audio event: %s\n", val.get()); + val = matbot.send_message(roomid, raii::string(reply.title() + "\n" + reply.posturl())); + DEBUG_PRINT("text event: %s\n", val.get()); + } else if(reply.type() == reddit::post_type::link) { DEBUG_PRINT("Got a link\n"); @@ -373,6 +381,4 @@ int main(){ DEBUG_PRINT("TODO HANDLE THIS TYPE OF POST\n"); return 0; } - - }