196 lines
4.9 KiB
C
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;
|
|
} |