add summaryFormat option
this should help scripts find new articles without having to parse human-readable output
This commit is contained in:
parent
b199aacdfe
commit
25f01b702a
2
Makefile
2
Makefile
@ -1,5 +1,5 @@
|
|||||||
PREFIX = ~/.local
|
PREFIX = ~/.local
|
||||||
VERSION = 0.3
|
VERSION = 0.3.1
|
||||||
|
|
||||||
PKG_CONFIG = pkg-config
|
PKG_CONFIG = pkg-config
|
||||||
|
|
||||||
|
27
config.def.h
27
config.def.h
@ -63,3 +63,30 @@ enum outputFormats {
|
|||||||
|
|
||||||
// When saving, sets the format of the saved file.
|
// When saving, sets the format of the saved file.
|
||||||
static const enum outputFormats outputFormat = OUTPUT_HTML;
|
static const enum outputFormats outputFormat = OUTPUT_HTML;
|
||||||
|
|
||||||
|
// Controls what is printed to stdout after each update.
|
||||||
|
enum summaryFormats {
|
||||||
|
/*
|
||||||
|
Prints the number of new articles for each feed.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
feed1: 2 new articles
|
||||||
|
feed2: 2 new articles
|
||||||
|
|
||||||
|
*/
|
||||||
|
SUMMARY_HUMAN_READABLE,
|
||||||
|
|
||||||
|
/*
|
||||||
|
Prints relative paths of new articles.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
feed1/article1.json
|
||||||
|
feed1/article2.json
|
||||||
|
feed2/something.json
|
||||||
|
feed2/otherthing.json
|
||||||
|
|
||||||
|
*/
|
||||||
|
SUMMARY_FILES,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const enum summaryFormats summaryFormat = SUMMARY_HUMAN_READABLE;
|
||||||
|
113
handlers.c
113
handlers.c
@ -104,7 +104,7 @@ FILE *
|
|||||||
openFile(const char *folder, char *fileName, char *fileExt)
|
openFile(const char *folder, char *fileName, char *fileExt)
|
||||||
{
|
{
|
||||||
// [folder]/[fileName][fileExt]
|
// [folder]/[fileName][fileExt]
|
||||||
// caller's responsibility to sanitize names, but frees fileName
|
// caller's responsibility to sanitize names and free fileName
|
||||||
|
|
||||||
if (!folder) {
|
if (!folder) {
|
||||||
logMsg(LOG_ERROR, "NULL folder");
|
logMsg(LOG_ERROR, "NULL folder");
|
||||||
@ -143,7 +143,6 @@ openFile(const char *folder, char *fileName, char *fileExt)
|
|||||||
|
|
||||||
FILE *itemFile = fopen(filePath, "a");
|
FILE *itemFile = fopen(filePath, "a");
|
||||||
free (filePath);
|
free (filePath);
|
||||||
free (fileName);
|
|
||||||
|
|
||||||
return itemFile;
|
return itemFile;
|
||||||
}
|
}
|
||||||
@ -191,6 +190,62 @@ outputJson(itemStruct *item, FILE *f)
|
|||||||
}
|
}
|
||||||
#endif // JSON
|
#endif // JSON
|
||||||
|
|
||||||
|
int
|
||||||
|
processItem(itemStruct *item, const char *folder)
|
||||||
|
{
|
||||||
|
// Returns 1 if the article is new, 0 if not, -1 for error.
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
char fileExt[10];
|
||||||
|
void (*outputFunction)(itemStruct *, FILE *);
|
||||||
|
|
||||||
|
switch (outputFormat) {
|
||||||
|
case OUTPUT_HTML:
|
||||||
|
memcpy(fileExt, ".html", 6);
|
||||||
|
outputFunction = &outputHtml;
|
||||||
|
break;
|
||||||
|
#ifdef JSON
|
||||||
|
case OUTPUT_JSON:
|
||||||
|
memcpy(fileExt, ".json", 6);
|
||||||
|
outputFunction = &outputJson;
|
||||||
|
break;
|
||||||
|
#endif //JSON
|
||||||
|
|
||||||
|
default:
|
||||||
|
logMsg(LOG_FATAL, "Output format is invalid.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *basename = san(item->fields[FIELD_TITLE]);
|
||||||
|
|
||||||
|
FILE *itemFile = openFile(folder, basename, fileExt);
|
||||||
|
|
||||||
|
if (!itemFile) {
|
||||||
|
logMsg(LOG_ERROR, "Could not open file '%s/%s/%s'.\n",
|
||||||
|
folder,
|
||||||
|
basename,
|
||||||
|
fileExt
|
||||||
|
);
|
||||||
|
|
||||||
|
ret = -1;
|
||||||
|
goto cleanup_basename;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do not overwrite files
|
||||||
|
if (!ftell(itemFile)) {
|
||||||
|
outputFunction(item, itemFile);
|
||||||
|
ret = 1;
|
||||||
|
if (summaryFormat == SUMMARY_FILES)
|
||||||
|
logMsg(LOG_OUTPUT, "%s%c%s%s\n", folder, fsep(), basename, fileExt);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(itemFile);
|
||||||
|
cleanup_basename:
|
||||||
|
free(basename);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
itemAction(itemStruct *item, const char *folder)
|
itemAction(itemStruct *item, const char *folder)
|
||||||
{
|
{
|
||||||
@ -203,54 +258,22 @@ itemAction(itemStruct *item, const char *folder)
|
|||||||
|
|
||||||
while (cur) {
|
while (cur) {
|
||||||
prev = cur;
|
prev = cur;
|
||||||
|
int res = processItem(cur, folder);
|
||||||
char fileExt[10];
|
if (res == 1)
|
||||||
void (*outputFunction)(itemStruct *, FILE *);
|
|
||||||
|
|
||||||
switch (outputFormat) {
|
|
||||||
case OUTPUT_HTML:
|
|
||||||
memcpy(fileExt, ".html", 6);
|
|
||||||
outputFunction = &outputHtml;
|
|
||||||
break;
|
|
||||||
#ifdef JSON
|
|
||||||
case OUTPUT_JSON:
|
|
||||||
memcpy(fileExt, ".json", 6);
|
|
||||||
outputFunction = &outputJson;
|
|
||||||
break;
|
|
||||||
#endif //JSON
|
|
||||||
|
|
||||||
default:
|
|
||||||
logMsg(LOG_FATAL, "Output format is invalid.\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE *itemFile = openFile(folder, san(cur->fields[FIELD_TITLE]), fileExt);
|
|
||||||
|
|
||||||
if (!itemFile) {
|
|
||||||
logMsg(LOG_ERROR, "Could not open file '%s/%s/%s'.\n",
|
|
||||||
folder,
|
|
||||||
san(cur->fields[FIELD_TITLE]),
|
|
||||||
fileExt
|
|
||||||
);
|
|
||||||
|
|
||||||
cur = cur->next;
|
|
||||||
freeItem(prev);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do not overwrite files
|
|
||||||
if (!ftell(itemFile)) {
|
|
||||||
outputFunction(cur, itemFile);
|
|
||||||
newItems++;
|
newItems++;
|
||||||
}
|
|
||||||
|
|
||||||
fclose(itemFile);
|
|
||||||
cur = cur->next;
|
cur = cur->next;
|
||||||
freeItem(prev);
|
freeItem(prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newItems)
|
switch (summaryFormat) {
|
||||||
logMsg(LOG_OUTPUT, "%s : %d new articles\n", folder, newItems);
|
case SUMMARY_HUMAN_READABLE:
|
||||||
|
if (newItems)
|
||||||
|
logMsg(LOG_OUTPUT, "%s : %d new articles\n", folder, newItems);
|
||||||
|
break;
|
||||||
|
case SUMMARY_FILES:
|
||||||
|
// print output after saving each file
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user