tumblr.lisp 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. (in-package :chatikbot)
  2. (defvar *tumblr-roll* nil "List of tumblr to select from")
  3. (defparameter *read-timeout* 5 "API request timeout")
  4. (defun lo-string (val)
  5. (string-downcase (princ-to-string val)))
  6. (defun tumblr-read (domain &rest args)
  7. (handler-case
  8. (let ((params (loop for (k v) on args by #'cddr
  9. when v collect (cons (lo-string k) (lo-string v)))))
  10. (yason:parse
  11. (subseq (flexi-streams:octets-to-string
  12. (bordeaux-threads:with-timeout (*read-timeout*)
  13. (drakma:http-request
  14. (format nil "~A/api/read/json" domain)
  15. :parameters params
  16. :force-binary t))
  17. :external-format :utf-8) 22)
  18. :object-as :alist))
  19. (bordeaux-threads:timeout (e) (error e))))
  20. (defun tumblr-random-post (&key (roll *tumblr-roll*) type)
  21. (when roll
  22. (let* ((domain (random-elt roll))
  23. (total (aget "posts-total" (tumblr-read domain :num 1 :type type)))
  24. (res (tumblr-read domain :num 1 :type type :start (random total))))
  25. (aget "photo-url-1280"
  26. (first (aget "posts" res))))))
  27. (defun tumblr-random-photo (&optional (roll *tumblr-roll*))
  28. (tumblr-random-post :roll roll :type :photo))