115 lines
2.6 KiB
C
115 lines
2.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "defines.h"
|
|
|
|
static FILE *ueberzug = NULL;
|
|
extern unsigned int terminal_height;
|
|
extern unsigned int terminal_width;
|
|
char previewd;
|
|
|
|
char* text(char *path, unsigned long *file_size);
|
|
void images_print(char *file_name);
|
|
void images_clear();
|
|
char* generic(char *path);
|
|
|
|
char* get_mimetype(char *path){
|
|
static char *cmd_str = "file --mime-type -b ./\"";
|
|
unsigned long cmd_len = strlen(cmd_str);
|
|
unsigned int path_len = strlen(path);
|
|
|
|
char *cmd = malloc((cmd_len + path_len) + 2);
|
|
memset(cmd, ' ', cmd_len + path_len);
|
|
memcpy(cmd, cmd_str, cmd_len);
|
|
memcpy(cmd + cmd_len, path, path_len);
|
|
cmd[cmd_len + path_len] = '\"';
|
|
cmd[cmd_len + path_len + 1] = '\0';
|
|
|
|
FILE *cmd_open = popen(cmd, "r");
|
|
char *line = NULL;
|
|
size_t size = 0;
|
|
if (getline(&line, &size, cmd_open) != -1){
|
|
pclose(cmd_open);
|
|
return line;
|
|
} else {
|
|
pclose(cmd_open);
|
|
return "unknown";
|
|
}
|
|
}
|
|
char* preview_file(char *file_name, unsigned long file_size){
|
|
/* this calls "file" on path */
|
|
|
|
char *file_buffer;
|
|
|
|
|
|
char *mime = get_mimetype(file_name);
|
|
|
|
if (strstr(mime, "text")) {
|
|
file_buffer = text(file_name, &file_size);
|
|
} else {
|
|
file_buffer = generic(file_name);
|
|
}
|
|
|
|
if (strstr(mime, "image")) {
|
|
images_print(file_name);
|
|
previewd = 1;
|
|
} else {
|
|
images_clear();
|
|
}
|
|
|
|
free(mime);
|
|
return file_buffer;
|
|
|
|
}
|
|
char* text(char *path, unsigned long *file_size){
|
|
|
|
char *file_buffer = malloc(*file_size + 1);
|
|
FILE *fp = fopen(path, "r");
|
|
if (fread(file_buffer, *file_size, 1, fp) != 0) {
|
|
file_buffer[*file_size] = '\0';
|
|
return file_buffer;
|
|
} else {
|
|
return "failed reading file";
|
|
}
|
|
}
|
|
void images_clear() {
|
|
if (previewd == 1) {
|
|
fprintf(ueberzug, "{\"action\": \"remove\", \
|
|
\"identifier\": \"preview\"}\n");
|
|
fflush(ueberzug);
|
|
previewd = 0;
|
|
}
|
|
}
|
|
void images_print(char *file_name) {
|
|
char *path=getcwd(NULL, 0);
|
|
fprintf(ueberzug, "{\"action\": \"remove\", \
|
|
\"identifier\": \"preview\"}\n");
|
|
fprintf(ueberzug, "{\"action\":\"add\", \
|
|
\"identifier\":\"preview\", \
|
|
\"max_height\":%d, \
|
|
\"max_width\":%d, \
|
|
\"y\":0, \
|
|
\"x\":%d, \
|
|
\"path\":\"%s/%s\"}\n", terminal_height, terminal_width/2, terminal_width/2, path, file_name);
|
|
fflush(ueberzug);
|
|
free(path);
|
|
}
|
|
char* generic(char *path){
|
|
char *cmd = concat("file ./\"", path);
|
|
cmd = concat(cmd, "\"");
|
|
|
|
FILE *cmd_open = popen(cmd, "r");
|
|
char *line = NULL;
|
|
size_t size = 0;
|
|
if (getline(&line, &size, cmd_open) != -1) {
|
|
pclose(cmd_open);
|
|
return line;
|
|
} else {
|
|
pclose(cmd_open);
|
|
return "failed executing shell command \"file\"";
|
|
}
|
|
}
|
|
void ueberzug_init(){
|
|
ueberzug = popen("ueberzug layer -s ", "w");
|
|
}
|