|
@@ -7,31 +7,9 @@
|
|
|
(defparameter *rss-max-period* 1800 "Max rss refresh period in seconds")
|
|
(defparameter *rss-max-period* 1800 "Max rss refresh period in seconds")
|
|
|
(defparameter *rss-change-rate* 0.1 "Refresh period adjustment rata")
|
|
(defparameter *rss-change-rate* 0.1 "Refresh period adjustment rata")
|
|
|
|
|
|
|
|
-(defun http-default (url)
|
|
|
|
|
- (let ((uri (puri:uri url)))
|
|
|
|
|
- (puri:render-uri
|
|
|
|
|
- (if (null (puri:uri-scheme uri))
|
|
|
|
|
- (puri:uri (format nil "http://~A" url))
|
|
|
|
|
- uri)
|
|
|
|
|
- nil)))
|
|
|
|
|
-
|
|
|
|
|
-(defun get-by-tag (node tag)
|
|
|
|
|
- (nreverse (plump::get-elements-by-tag-name node tag)))
|
|
|
|
|
-
|
|
|
|
|
-(defun url-parse (url)
|
|
|
|
|
- (multiple-value-bind (body-stream status headers uri stream)
|
|
|
|
|
- (drakma:http-request (http-default url)
|
|
|
|
|
- :force-binary t
|
|
|
|
|
- :want-stream t
|
|
|
|
|
- :decode-content t)
|
|
|
|
|
- (declare (ignore status headers stream))
|
|
|
|
|
- (values
|
|
|
|
|
- (plump:parse (flex:make-flexi-stream body-stream :external-format :utf-8))
|
|
|
|
|
- uri)))
|
|
|
|
|
-
|
|
|
|
|
(defun find-rss-links (url)
|
|
(defun find-rss-links (url)
|
|
|
(handler-case
|
|
(handler-case
|
|
|
- (multiple-value-bind (root uri) (url-parse url)
|
|
|
|
|
|
|
+ (multiple-value-bind (root uri) (xml-request url)
|
|
|
(loop for link in (get-by-tag root "link")
|
|
(loop for link in (get-by-tag root "link")
|
|
|
when (string= "application/rss+xml" (plump:attribute link "type"))
|
|
when (string= "application/rss+xml" (plump:attribute link "type"))
|
|
|
collect (list (plump:attribute link "title")
|
|
collect (list (plump:attribute link "title")
|
|
@@ -42,7 +20,7 @@
|
|
|
(error (e) (log:error e))))
|
|
(error (e) (log:error e))))
|
|
|
|
|
|
|
|
(defun build-feed (url)
|
|
(defun build-feed (url)
|
|
|
- (let ((root (url-parse url)))
|
|
|
|
|
|
|
+ (let ((root (xml-request url)))
|
|
|
(alexandria:when-let (rss (car (get-by-tag root "rss")))
|
|
(alexandria:when-let (rss (car (get-by-tag root "rss")))
|
|
|
(make-feed :url url :title (child-text rss "title")))))
|
|
(make-feed :url url :title (child-text rss "title")))))
|
|
|
|
|
|
|
@@ -98,7 +76,7 @@
|
|
|
|
|
|
|
|
(defun parse-rss (url)
|
|
(defun parse-rss (url)
|
|
|
(let ((plump:*tag-dispatchers* plump:*xml-tags*))
|
|
(let ((plump:*tag-dispatchers* plump:*xml-tags*))
|
|
|
- (loop for item in (get-by-tag (url-parse url) "item")
|
|
|
|
|
|
|
+ (loop for item in (get-by-tag (xml-request url) "item")
|
|
|
collect (make-feed-item :guid (child-text item "guid")
|
|
collect (make-feed-item :guid (child-text item "guid")
|
|
|
:link (child-text item "link")
|
|
:link (child-text item "link")
|
|
|
:title (clean-text (child-text item "title"))
|
|
:title (clean-text (child-text item "title"))
|