196 lines
4.9 KiB
C

#include "../../include/gallery_p/gallery.h"
#include "../../include/utils_op/utils.h"
#include "../../include/file_op/file.h"
#include "../../include/utils_op/arr.h"
/**
* @brief Get the list of albums on server
*
* @return gallery_t*
*/
gallery_t *get_album_list()
{
gallery_t *list = NULL, *curr = list;
char **albums_titles_list = malloc(0);
ssize_t albums_am = get_dir_list(&albums_titles_list, GALLERY_ROOT);
if (albums_am < 0)
{
err_msg("couldn't read albums list");
return list;
}
if (albums_am == 0)
return list;
list = new_album_item(albums_titles_list[0]);
get_album_imgs(&list->images, &list->img_am, albums_titles_list[0]);
curr = list;
for (unsigned int i = 1; i < albums_am; i++)
{
curr->next = new_album_item(albums_titles_list[i]);
curr = curr->next;
get_album_imgs(&curr->images, &curr->img_am, albums_titles_list[i]);
}
free_arr(albums_titles_list, albums_am);
return list;
}
/**
* @brief Generates new album item
*
* @param title
* @return gallery_t*
*/
gallery_t *new_album_item(char *folder_name)
{
gallery_t *new = calloc(1, sizeof(gallery_t));
char *title = strdup(folder_name);
title[strlen(title) - 1] = '\0';
new->title = strdup(repair_spaces(title));
free(title);
new->img_am = 0;
new->images = NULL;
new->next = NULL;
return new;
}
/**
* @brief Generates new image item
*
* @param path
* @return img_t
*/
img_t new_img_item(char *path)
{
img_t img;
img.date_taken = 0;
img.description = NULL;
img.path = strdup(path);
img.rating = 0;
img.tags = NULL;
return img;
}
int get_album_imgs(img_t **images_arr, int *size, char *title)
{
char **photos_list = calloc(0, sizeof(char *));
char *album_path = strdup(GALLERY_ROOT);
album_path = realloc(album_path, strlen(album_path) + strlen(title) + 1);
album_path = strcat(album_path, title);
ssize_t photos_am = get_dir_list(&photos_list, album_path);
free(album_path);
*images_arr = calloc(photos_am, sizeof(img_t));
for (int j = 0; j < photos_am; j++)
{
char *img_path = strdup("/gallery/albums/");
img_path = realloc(img_path, strlen(img_path) + strlen(title) + strlen(photos_list[j]) + 1);
img_path = strcat(img_path, title);
img_path = strcat(img_path, photos_list[j]);
(*images_arr)[j] = new_img_item(img_path);
free(img_path);
}
*size = photos_am;
free_arr(photos_list, photos_am);
return photos_am;
}
char *gen_gallery_html()
{
FILE *album_template_fp = fopen("static/gallery/album.html", "r");
FILE *image_template_fp = fopen("static/gallery/image.html", "r");
size_t album_file_size = get_file_size(album_template_fp) + 1;
char *album_template = calloc(1, album_file_size);
size_t image_file_size = get_file_size(image_template_fp) + 1;
char *image_template = calloc(1, image_file_size);
fread(album_template, album_file_size, 1, album_template_fp);
fclose(album_template_fp);
fread(image_template, image_file_size, 1, image_template_fp);
fclose(image_template_fp);
gallery_t *albums_list_item = get_album_list();
char *gallery_content = strdup("");
while (albums_list_item != NULL)
{
if (albums_list_item->img_am <= 0)
{
albums_list_item = albums_list_item->next;
continue;
}
char *album_content = strdup("");
for (int i = 0; i < albums_list_item->img_am; i++)
{
char *link = albums_list_item->images[i].path;
size_t line_length = snprintf(NULL, 0, image_template, link, link) + 1;
char *image_content = calloc(1, line_length);
if (image_content == NULL)
return "500 Internal Error\n";
sprintf(image_content, image_template, link, link);
char *tmp = realloc(album_content, strlen(album_content) + strlen(image_content) + 1);
if (tmp == NULL)
return "500 Internal Error\n";
album_content = tmp;
album_content = strcat(album_content, image_content);
free(image_content);
}
size_t line_length = snprintf(NULL, 0, album_template, albums_list_item->title, album_content) + 1;
char *album_html = calloc(1, line_length);
if (album_html == NULL)
return "500 Internal Error\n";
sprintf(album_html, album_template, albums_list_item->title, album_content);
gallery_content = realloc(gallery_content, strlen(gallery_content) + line_length);
gallery_content = strcat(gallery_content, album_html);
free(album_content);
free(album_html);
free(image_template);
albums_list_item = albums_list_item->next;
}
free(album_template);
free(image_template);
return gallery_content;
}