From b7420af3adeb9d8e2ff2bb00fc8c143825544595 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 20 Feb 2025 12:58:50 +0300 Subject: [PATCH] added rss support --- config.h | 8 +++++ img.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 85 insertions(+), 13 deletions(-) diff --git a/config.h b/config.h index 36937fe..15d911c 100644 --- a/config.h +++ b/config.h @@ -2,6 +2,7 @@ #define ROOT "8img_dir" #define DB ROOT"/db" + /* Html generator */ #define CSS "style.css" #define LOGO "logo.png" @@ -10,3 +11,10 @@ #define TITLE "8img gallery" #define POST_PER_PAGE 5 + +/* RSS generator */ +#define LINK "mygallery.com" +#define XML_FILE "index.xml" + +#define LANGUAGE "en-US" +#define MAX_POST_COUNT 25 diff --git a/img.c b/img.c index 8fc0f44..345529c 100644 --- a/img.c +++ b/img.c @@ -5,11 +5,15 @@ #include #include #include +#include #include "config.h" struct DB_STR { char *filename; + struct stat stat; + char stat_filled; + char **tags; size_t size; @@ -56,7 +60,7 @@ void copy(const char *src, const char *dst) { if (ifp == NULL) exit(1); - FILE *ofp = file_open(dst, "a"); + FILE *ofp = file_open(dst, "w"); if (ofp == NULL) { fclose(ifp); exit(1); @@ -166,7 +170,6 @@ struct DB_STR *new_db_value(char *str) { if (db == NULL) return NULL; - /* Filename */ char *tok = strtok(str, " "); char *ptr = strrchr(tok, '\n'); @@ -177,7 +180,6 @@ struct DB_STR *new_db_value(char *str) { if (db->filename == NULL) goto NDV_CLOSE; - /* Tags */ tok = strtok(NULL, " "); if (tok == NULL) @@ -203,6 +205,15 @@ struct DB_STR *new_db_value(char *str) { } } + /* Stats */ + char new_path[PATH_MAX + 1]; + snprintf(new_path, sizeof(new_path) - 1, "%s/%s", ROOT, db->filename); + + if (stat(new_path, &db->stat) < 0) + fprintf(stderr, "8img: stat: %s: %s\n", db->filename, strerror(errno)); + + else + db->stat_filled = 1; return db; @@ -255,8 +266,8 @@ RDB_CLOSE: return db; } -struct DB_STR *build_html(FILE *fp, const char *file, const struct UNIQ_TAGS ut, struct DB_STR *db, const size_t page, const size_t pages) { - fprintf(fp, "\n\n\n%s\n\n\n

%s
%s/p%zu

\n", CSS, TITLE, LOGO, DESC, file, page); +struct DB_STR *build_html_page(FILE *fp, const char *file, const struct UNIQ_TAGS ut, struct DB_STR *db, const size_t page, const size_t pages) { + fprintf(fp, "\n\n\n%s\n\n\n
\n

%s
%s/p%zu

\n", CSS, TITLE, LOGO, DESC, file, page); /* Tags */ fputs("
\nall", fp); @@ -282,7 +293,7 @@ struct DB_STR *build_html(FILE *fp, const char *file, const struct UNIQ_TAGS ut, } } - fprintf(fp, "\n%s
\n>", p->filename, p->filename, p->filename); + fprintf(fp, "\n%s
\n| %s
\n>", p->filename, p->filename, p->filename, ctime(&p->stat.st_ctime)); for (size_t i = 0; i < p->size; i++) fprintf(fp, " %s", p->tags[i], p->tags[i]); @@ -290,7 +301,7 @@ struct DB_STR *build_html(FILE *fp, const char *file, const struct UNIQ_TAGS ut, p = i; images++; - if (images >= POST_PER_PAGE) + if (images == POST_PER_PAGE) break; } @@ -321,7 +332,7 @@ struct DB_STR *build_html(FILE *fp, const char *file, const struct UNIQ_TAGS ut, return p; } -void build(const char *file, const struct UNIQ_TAGS ut, struct DB_STR *db) { +void build_html(const char *file, const struct UNIQ_TAGS ut, struct DB_STR *db) { size_t page = 0; size_t pages = 0; @@ -352,17 +363,17 @@ void build(const char *file, const struct UNIQ_TAGS ut, struct DB_STR *db) { while (1) { char new_path[PATH_MAX + 1]; if (page == 0) - snprintf(new_path, sizeof(new_path), "%s/%s.html", ROOT, file); + snprintf(new_path, sizeof(new_path) - 1, "%s/%s.html", ROOT, file); else - snprintf(new_path, sizeof(new_path), "%s/%s-%zu.html", ROOT, file, page); + snprintf(new_path, sizeof(new_path) - 1, "%s/%s-%zu.html", ROOT, file, page); FILE *fp = file_open(new_path, "w"); if (fp == NULL) return; /* Builders */ - p = build_html(fp, file, ut, p, page, pages); + p = build_html_page(fp, file, ut, p, page, pages); if (p == NULL) { fclose(fp); break; @@ -373,6 +384,58 @@ void build(const char *file, const struct UNIQ_TAGS ut, struct DB_STR *db) { } } + +void build_xml(const char *file, struct DB_STR *db) { + char new_path[PATH_MAX + 1]; + snprintf(new_path, sizeof(new_path) - 1, "%s/%s", ROOT, file); + + FILE *fp = file_open(new_path, "w"); + if (fp == NULL) + return; + + /* Header */ + fprintf(fp, "\n\n\n\t\n\t%s\n\t%s\n\t%s\n\t%s\n", LINK, TITLE, LINK, DESC, LANGUAGE); + + /* Content */ + size_t count = 0; + struct DB_STR *p = db; + while (p) { + struct DB_STR *i = p->next; + + /* Link to file */ + size_t size = sizeof(LINK) + strlen(p->filename) + 1; + char *new_link = malloc(size + 1); + if (new_link == NULL) { + fprintf(stdout, "8img: malloc: %s: %s\n", p->filename, strerror(errno)); + continue; + } + + if (LINK[sizeof(LINK) - 1] == '/') + snprintf(new_link, size, "%s%s", LINK, p->filename); + + else + snprintf(new_link, size, "%s/%s", LINK, p->filename); + + /* Post */ + fprintf(fp, "\n\n\t%s\n\t%s\n\t%s\n\t\n\t\t%s\t\n\tplup

\n\t\t

", p->filename, new_link, new_link, ctime(&p->stat.st_ctime), new_link); + + /* Tags */ + for (size_t i = 0; i < p->size; i++) + fprintf(fp, " %s  ", p->tags[i], p->tags[i]); + + fputs("

\n\t]]>
\n
", fp); + free(new_link); + + if (count == MAX_POST_COUNT) + break; + + p = i; + } + + fputs("\n
\n
", fp); + fclose(fp); +} + char **uniq(struct DB_STR *db, size_t *uniq_size) { char **uniq_tag = malloc(sizeof(char *)); if (uniq_tag == NULL) @@ -424,9 +487,10 @@ void rebuild(void) { struct UNIQ_TAGS ut = {.tags = uniq_tag, .size = uniq_size}; for (size_t i = 0; i < uniq_size; i++) - build(uniq_tag[i], ut, db); + build_html(uniq_tag[i], ut, db); - build("index", ut, db); + build_html("index", ut, db); + build_xml(XML_FILE, db); } else