Compartmentalized some of the matrix image uploading. Changed file_info.filetype to file_info.mimetype
This commit is contained in:
parent
abf2edc9c6
commit
3179355b33
@ -45,7 +45,7 @@ namespace matrix{
|
||||
struct file_info{
|
||||
raii::rjp_string fileurl;
|
||||
raii::string filename;
|
||||
raii::string filetype;
|
||||
raii::string mimetype;
|
||||
size_t filesize;
|
||||
};
|
||||
struct image_info : file_info{
|
||||
|
||||
@ -54,6 +54,7 @@ namespace raii{
|
||||
|
||||
int height(void)const;
|
||||
int width(void)const;
|
||||
raii::string get_filetype(void)const;
|
||||
raii::string get_mimetype(void)const;
|
||||
packet_type create_jpg_thumbnail(void);
|
||||
|
||||
|
||||
@ -60,7 +60,6 @@ namespace matrix::detail{
|
||||
|
||||
|
||||
raii::string _image_body(const image_info& image){
|
||||
raii::string mimetype = "\"mimetype\":\"image/" + raii::json_escape(image.filetype) + "\"";
|
||||
raii::string url = raii::json_escape(image.fileurl);
|
||||
const raii::string_base* thumburl;
|
||||
if(image.thumburl)
|
||||
@ -73,12 +72,12 @@ namespace matrix::detail{
|
||||
"{"
|
||||
"\"body\":\"" + raii::json_escape(image.filename) + "\","
|
||||
"\"info\":{"
|
||||
"\"h\":" + itostr(image.height) + "," +
|
||||
mimetype + ","
|
||||
"\"h\":" + itostr(image.height) + ","
|
||||
"\"mimetype\":\"" + image.mimetype + "\","
|
||||
"\"size\":" + itostr(image.filesize) + ","
|
||||
"\"thumnail_info\":{"
|
||||
"\"h\":" + itostr(image.thumb_height) + "," +
|
||||
mimetype + ","
|
||||
"\"h\":" + itostr(image.thumb_height) + ","
|
||||
"\"mimetype\":\"" + image.mimetype + "\","
|
||||
"\"size\":" + itostr(image.thumbsize) + ","
|
||||
"\"w\":" + itostr(image.thumb_width) +
|
||||
"},"
|
||||
@ -96,7 +95,7 @@ namespace matrix::detail{
|
||||
"\"body\":\"" + raii::json_escape(video.filename) + "\","
|
||||
"\"info\":{"
|
||||
"\"h\":" + itostr(video.height) + ","
|
||||
"\"mimetype\":\"video/" + raii::json_escape(video.filetype) + "\","
|
||||
"\"mimetype\":\"" + video.mimetype + "\","
|
||||
"\"size\":" + itostr(video.filesize) + ","
|
||||
"\"thumnail_info\":{"
|
||||
"\"h\":" + itostr(video.thumb_height) + ","
|
||||
@ -129,7 +128,7 @@ namespace matrix::detail{
|
||||
"{"
|
||||
"\"body\":\"" + raii::json_escape(audio.filename) + "\","
|
||||
"\"info\":{"
|
||||
"\"mimetype\":\"audio/" + raii::json_escape(audio.filetype) + "\","
|
||||
"\"mimetype\":\"" + raii::json_escape(audio.mimetype) + "\","
|
||||
"\"size\":" + itostr(audio.filesize) +
|
||||
"},"
|
||||
"\"msgtype\":\"m.audio\","
|
||||
|
||||
113
src/matrix.cpp
113
src/matrix.cpp
@ -141,39 +141,8 @@ namespace matrix{
|
||||
return upload_image(filename, raii::static_string());
|
||||
}
|
||||
#ifdef HAS_FREEIMAGE
|
||||
image_info bot::upload_image(const raii::string_base& filename, const raii::string_base& alias){
|
||||
image_info ret;
|
||||
|
||||
fipImage image;
|
||||
auto formattotype = [](auto type) -> const char*{
|
||||
switch(type){
|
||||
case FIF_JPEG: return "jpeg";
|
||||
case FIF_PNG: return "png";
|
||||
case FIF_GIF: return "gif";
|
||||
default:
|
||||
;
|
||||
};
|
||||
return nullptr;
|
||||
};
|
||||
|
||||
//determine type of image. used to create thumbnail of the same type and verify this is an image.
|
||||
auto type = fipImage::identifyFIF(filename.get());
|
||||
if(type == FIF_UNKNOWN){
|
||||
return {};
|
||||
}
|
||||
|
||||
image.load(filename.get());
|
||||
//save fullsize image info
|
||||
ret.width = image.getWidth();
|
||||
ret.height = image.getHeight();
|
||||
ret.filetype = formattotype(type);
|
||||
ret.filename = alias ? alias : filename;
|
||||
|
||||
raii::curl_llist header(raii::string("Content-Type: image/" + ret.filetype));
|
||||
|
||||
//create and upload thumbnail
|
||||
image.makeThumbnail(500);
|
||||
|
||||
static std::vector<char> _create_image_thumbnail(fipImage& image, FREE_IMAGE_FORMAT type, size_t target_size){
|
||||
image.makeThumbnail(target_size);
|
||||
FreeImageIO fileout;
|
||||
std::vector<char> buffer;
|
||||
fileout.write_proc = [](void* ptr, unsigned int size, unsigned int nmemb, void* fp) -> unsigned int{
|
||||
@ -181,42 +150,63 @@ namespace matrix{
|
||||
buffer.insert(buffer.end(), (char*)ptr, ((char*)ptr)+size*nmemb);
|
||||
return size*nmemb;
|
||||
};
|
||||
bool b = false;
|
||||
switch(type){
|
||||
case FIF_JPEG:
|
||||
b = image.saveToHandle(type, &fileout, &buffer, JPEG_QUALITYGOOD | JPEG_SUBSAMPLING_411);
|
||||
break;
|
||||
return image.saveToHandle(type, &fileout, &buffer, JPEG_QUALITYGOOD | JPEG_SUBSAMPLING_411) ? buffer : std::vector<char>();
|
||||
case FIF_PNG:
|
||||
b = image.saveToHandle(type, &fileout, &buffer, PNG_Z_BEST_COMPRESSION);
|
||||
break;
|
||||
case FIF_GIF:
|
||||
b = image.saveToHandle(type, &fileout, &buffer);
|
||||
break;
|
||||
return image.saveToHandle(type, &fileout, &buffer, PNG_Z_BEST_COMPRESSION) ? buffer : std::vector<char>();
|
||||
default:
|
||||
;
|
||||
return image.saveToHandle(type, &fileout, &buffer) ? buffer : std::vector<char>();
|
||||
};
|
||||
if(!b){
|
||||
fprintf(stderr, "Unable to create image thumbnail");
|
||||
ret.thumb_width = ret.width;
|
||||
ret.thumb_height = ret.height;
|
||||
ret.thumbsize = ret.filesize;
|
||||
}
|
||||
static std::vector<char> _load_thumbnail_info(fipImage& image, image_info& info, FREE_IMAGE_FORMAT type){
|
||||
//create and upload thumbnail
|
||||
if(info.width > 500 || info.height > 500){
|
||||
std::vector<char> thumb_data = _create_image_thumbnail(image, type, 500);
|
||||
if(!thumb_data.size()){
|
||||
info.thumb_width = info.width;
|
||||
info.thumb_height = info.height;
|
||||
info.thumbsize = info.filesize;
|
||||
}else{
|
||||
info.thumb_width = image.getWidth();
|
||||
info.thumb_height = image.getHeight();
|
||||
info.thumbsize = thumb_data.size();
|
||||
return thumb_data;
|
||||
}
|
||||
}else{
|
||||
ret.thumb_width = image.getWidth();
|
||||
ret.thumb_height = image.getHeight();
|
||||
ret.thumburl = _post_and_find(raii::static_string(buffer.data(), buffer.size()), m_urls.file_upload, header, "content_uri"_ss);
|
||||
ret.thumbsize = buffer.size();
|
||||
info.thumb_width = info.width;
|
||||
info.thumb_height = info.height;
|
||||
info.thumbsize = info.filesize;
|
||||
}
|
||||
return {};
|
||||
}
|
||||
image_info bot::upload_image(const raii::string_base& filename, const raii::string_base& alias){
|
||||
image_info ret;
|
||||
FREE_IMAGE_FORMAT type = fipImage::identifyFIF(filename.get());
|
||||
ret.mimetype = FreeImage_GetFIFMimeType(type);
|
||||
raii::curl_llist header(raii::string("Content-Type: " + ret.mimetype));
|
||||
|
||||
raii::filerd fd(filename, "rb");
|
||||
if(!fd)
|
||||
return ret;
|
||||
{
|
||||
raii::filerd fd(filename, "rb");
|
||||
if(!fd)
|
||||
return ret;
|
||||
|
||||
ret.filesize = fd.length();
|
||||
ret.fileurl = _upload_file(fd, header);
|
||||
fd.reset();
|
||||
ret.filesize = fd.length();
|
||||
ret.fileurl = _upload_file(fd, header);
|
||||
}
|
||||
fipImage image;
|
||||
image.load(filename.get());
|
||||
ret.width = image.getWidth();
|
||||
ret.height = image.getHeight();
|
||||
ret.filename = alias ? alias : filename;
|
||||
std::vector<char> thumb_data = _load_thumbnail_info(image, ret, type);
|
||||
|
||||
if(thumb_data.size())
|
||||
ret.thumburl = _post_and_find(raii::static_string(thumb_data.data(), thumb_data.size()), m_urls.file_upload, header, "content_uri"_ss);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else //HAS_FREEIMAGE
|
||||
image_info bot::upload_image(const raii::string_base& filename, const raii::string_base& alias){
|
||||
image_info ret = {};
|
||||
@ -224,7 +214,6 @@ namespace matrix{
|
||||
return ret;
|
||||
}
|
||||
#endif //HAS_FREEIMAGE
|
||||
|
||||
video_info bot::upload_video(const raii::string_base& filename){
|
||||
return upload_video(filename, raii::static_string());
|
||||
}
|
||||
@ -245,13 +234,13 @@ namespace matrix{
|
||||
ret.thumb_height = context.height();
|
||||
ret.width = context.width();
|
||||
ret.height = context.height();
|
||||
ret.filetype = context.get_mimetype();
|
||||
ret.mimetype = 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/" + ret.filetype));
|
||||
header = raii::curl_llist(raii::string("Content-Type:" + ret.mimetype));
|
||||
raii::filerd fd(filename);
|
||||
if(!fd) return {};
|
||||
ret.filesize = fd.length();
|
||||
@ -265,9 +254,9 @@ namespace matrix{
|
||||
raii::video_man context(filename);
|
||||
if(!context)
|
||||
return {};
|
||||
ret.filetype = context.get_mimetype();
|
||||
ret.mimetype = context.get_mimetype();
|
||||
context.reset();
|
||||
raii::curl_llist header(raii::string("Content-Type: audio/" + ret.filetype));
|
||||
raii::curl_llist header(raii::string("Content-Type:" + ret.mimetype));
|
||||
raii::filerd fd(filename);
|
||||
if(!fd) return {};
|
||||
ret.filesize = fd.length();
|
||||
|
||||
@ -46,12 +46,18 @@ namespace raii{
|
||||
int video_man::width(void)const{
|
||||
return m_context->width;
|
||||
}
|
||||
raii::string video_man::get_mimetype(void)const{
|
||||
raii::string video_man::get_filetype(void)const{
|
||||
const char* first = strstr(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));
|
||||
}
|
||||
raii::string video_man::get_mimetype(void)const{
|
||||
const char* first = strstr(m_vid->iformat->name, ",");
|
||||
if(first)
|
||||
return raii::string("video/" + raii::static_string(m_vid->iformat->name, first - m_vid->iformat->name));
|
||||
return raii::string("video/" + 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);
|
||||
frame_type frame(_init_frame(m_context->width, m_context->height, m_context->pix_fmt), _frame_deleter);
|
||||
|
||||
@ -337,7 +337,7 @@ int main(){
|
||||
{
|
||||
int retries = 5;
|
||||
do{
|
||||
reply = mybot.get_top_post("ProgrammerHumor"_ss, reply.name(), reddit::time::hour);
|
||||
reply = mybot.get_hot_post("ProgrammerHumor"_ss, reply.name());
|
||||
if(reply.type() != reddit::post_type::text && reply.type() != reddit::post_type::link)
|
||||
break;
|
||||
--retries;
|
||||
@ -347,11 +347,11 @@ int main(){
|
||||
}while(retries);
|
||||
}
|
||||
|
||||
write_to_file("post.log", reply.raw());
|
||||
if(!reply){
|
||||
fprintf(stderr, "Did not recieve a reply!\n");
|
||||
return 3;
|
||||
}
|
||||
write_to_file("post.log", reply.raw());
|
||||
|
||||
DEBUG_PRINT("name: %s\n", reply.name().get());
|
||||
DEBUG_PRINT("title: %s\n", reply.title().get());
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user