diff --git a/feedsnake.scm b/feedsnake.scm index c1de956..c3bc035 100644 --- a/feedsnake.scm +++ b/feedsnake.scm @@ -38,8 +38,8 @@ (updated-feed-string read-feed entries-since entry->string) (import scheme - (chicken base) (chicken condition) (chicken io) (chicken port) - srfi-1 srfi-19 srfi-69 + (chicken base) (chicken condition) (chicken io) (chicken pathname) (chicken port) + srfi-1 srfi-13 srfi-19 srfi-69 date-strings feedsnake-helpers http-client @@ -130,7 +130,7 @@ ;; Parse an atom feed into a feedsnake-friendly alist (define (atom-doc->feedsnake-feed atom) `((title ,(last (feed-title atom))) - (urls ,(feed-links atom)) + (url ,(atom-feed-preferred-url atom)) (authors ,(map author-name (feed-authors atom))) (updated ,(feed-updated atom)) (entry-updated ,(atom-feed-latest-entry-date atom)) @@ -140,6 +140,7 @@ (feed-entries atom))))) + ;; Parse an atom entry into a feedsnake entry :> (define (atom-entry->feedsnake-entry entry atom) (let ([published (rfc339-string->date (entry-published entry))] @@ -150,11 +151,21 @@ (updated ,(or updated published)) (published ,(or published updated)) (summary ,(last (entry-summary entry))) - (urls ,(map link-uri (entry-links entry))) + (urls ,(map (lambda (link) (atom-link->string link atom)) + (entry-links entry))) (authors ,(if (null? entry-authors) feed-authors entry-authors)) (feed-title ,(feed-title atom))))) +;; The preferred/given URL for an atom feed +(define (atom-feed-preferred-url atom) + (car + (filter + (lambda (link) + (string=? (link-relation link) "self")) + (feed-links atom)))) + + ;; Get an atom feed's latest date for an entry's updating/publishing (define (atom-feed-latest-entry-date atom) (let ([entry-date @@ -168,6 +179,15 @@ (map entry-date (feed-entries atom))))) +;; Convert an atom-link into a proper, valid url +(define (atom-link->string link atom) + (if (string-contains (link-uri link) "://") + (link-uri link) + (string-append (pathname-directory (atom-feed-preferred-url atom)) + "/" + (link-uri link)))) + + ;; Download a file over HTTP to the given port. (define (fetch-http url out-port) (call-with-input-request