commit 3a53bf2867abd13c2f86d2379f6d9a86a63acc33
parent cc9ff4617be560ff8a42bd6940a9610ce346d913
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date:   Mon, 18 Mar 2024 18:52:43 +0000
Automatic generation of feeds on update
Diffstat:
1 file changed, 24 insertions(+), 7 deletions(-)
diff --git a/src/iens.scm b/src/iens.scm
@@ -173,6 +173,7 @@
 (define config-author-name #f)
 (define config-author-email #f)
 (define config-author-uri #f)
+(define config-autogenerate #f)
 (define config-editor #f)
 (define config-entry-id-prefix "")
 (define config-list-tagged-count 0)
@@ -212,6 +213,7 @@
   (set! config-author-name  (get-config "author-name"))
   (set! config-author-email (get-config "author-email"))
   (set! config-author-uri   (get-config "author-uri"))
+  (set! config-autogenerate (not (zero? (get-config/default "autogenerate" 0))))
   (set! config-editor       (get-config/default "editor" default-editor))
   (set! config-entry-id-prefix (get-config/default "entry-id-prefix" ""))
   (set! config-list-tagged-count (get-config/default "list-tagged-count" 0))
@@ -420,7 +422,8 @@
 
 (define (update-feed-cache* mtime id)
   (let ((data (query fetch-row
-                     (sql db "SELECT mtime,selector FROM feed WHERE id=?;")
+                     (sql db "SELECT mtime,selector,filename,title,url
+                              FROM feed WHERE id=?;")
                      id))
         (old-sig (alist-ref id feed-cache = '())))
     (if (null? data)
@@ -429,13 +432,27 @@
           (unless (equal? old-sig new-sig)
             (when (or (null? (car data))
                       (> mtime (car data)))
-              (touch-feed mtime id))
+              (touch-feed mtime id)
+              (set! (car data) mtime))
             (when config-verbose
-              (write-line (conc "Marking feed " id " as dirty:"))
-              (write-diff (diff-signature old-sig new-sig)))
-            (unless (any (cut = id <>) dirty-feeds)
-              (set! dirty-feeds (cons id dirty-feeds)))
-            (set! feed-cache (alist-update! id new-sig feed-cache =)))))))
+               (write-line (if config-autogenerate
+                               (conc "Autogenerating feed " id)
+                               (conc "Marking feed " id " as dirty:")))
+               (write-diff (diff-signature old-sig new-sig)))
+            (if config-autogenerate
+                (with-output-to-file (caddr data) ;filename
+                  (cut write-feed
+                    (car data) ;mtime
+                    (list-ref data 3) ;title
+                    (list-ref data 4) ;url
+                    (query fetch-rows
+                      (sql db (string-append "SELECT id,url,type,description,
+                                                     notes,ptime,ctime,mtime
+                                              FROM entry " (cadr data) ";")))))
+                (unless (any (cut = id <>) dirty-feeds)
+                  (set! dirty-feeds (cons id dirty-feeds))))
+            (set! feed-cache
+                  (alist-update! id new-sig feed-cache =)))))))
 
 (define (update-feed-cache mtime . id-list)
   (for-each