/posts.json implemented

This commit is contained in:
2026-02-06 20:52:29 +00:00
commit e2b04277a8
6 changed files with 271 additions and 0 deletions

97
src/e621.c Normal file
View File

@@ -0,0 +1,97 @@
// Includes
#include <openssl/evp.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "e621.h"
struct Memory {
char *data;
size_t size;
};
struct curl_slist *MakeHeaders(e6_auth_t auth) {
struct curl_slist *headers = NULL;
char auth_buf[256];
char base64_buf[128];
snprintf(auth_buf, sizeof(auth_buf), "%s:%s", auth.username, auth.api_key);
EVP_EncodeBlock((unsigned char*)base64_buf, (unsigned char*)auth_buf, strlen(auth_buf));
memset(auth_buf, 0, sizeof(auth_buf));
snprintf(auth_buf, sizeof(base64_buf), "Authorization: Basic %s", base64_buf);
headers = curl_slist_append(headers, auth_buf);
char user_agent_buf[256];
snprintf(user_agent_buf, sizeof(user_agent_buf), "User-Agent: %s/%f (by %s on e621)", auth.project_name, auth.project_ver, auth.username);
headers = curl_slist_append(headers, user_agent_buf);
return headers;
}
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userdata)
{
size_t total = size * nmemb;
struct Memory *mem = (struct Memory *)userdata;
char *ptr = realloc(mem->data, mem->size + total + 1);
if (!ptr)
return 0;
mem->data = ptr;
memcpy(&(mem->data[mem->size]), contents, total);
mem->size += total;
mem->data[mem->size] = '\0';
return total;
}
e6_post_t *E6List(e6_auth_t auth, char **tags, int tags_count, unsigned int page, unsigned int limit) {
CURL *curl = curl_easy_init();
CURLcode result;
struct Memory read_buffer;
read_buffer.data = malloc(1);
read_buffer.size = 0;
if (curl) {
char *url = (char *)malloc(E621_URL_BUF_SIZE);
strncpy(url, E621_HOST, E621_URL_BUF_SIZE);
strcat(url, "/posts.json?tags=");
for (int i = 0; i < tags_count; i++) {
char *tag = tags[i];
strncat(url, tag, strlen(tag));
strcat(url, "+");
}
char page_buf[15];
snprintf(page_buf, sizeof(page_buf), "&page=%d", page);
strncat(url, page_buf, strlen(page_buf));
char limit_buf[15];
snprintf(limit_buf, sizeof(limit_buf), "&limit=%d", limit);
strncat(url, limit_buf, strlen(limit_buf));
struct curl_slist *headers = MakeHeaders(auth);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&read_buffer);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
result = curl_easy_perform(curl);
} else {
fprintf(stderr, "Failed to initialize CURL");
exit(EXIT_FAILURE);
}
if (result != CURLE_OK) {
fprintf(stderr, "CURL error: %s", curl_easy_strerror(result));
return NULL;
}
// Temp (testing purposes)
printf(read_buffer.data);
return NULL;
}

9
src/main.c Normal file
View File

@@ -0,0 +1,9 @@
#include "e621.h"
#include "creds.h" // provides the API key and username
int main(int argc, char *argv[]) {
e6_auth_t auth = { USERNAME, API_KEY, "c621", 0.1 };
E6List(auth, (char* []){ "order:score", "cat" }, 2, 1, 3);
return 0;
}