tumblr.lisp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. (in-package :chatikbot)
  2. (defvar *tumblr-roll* nil "List of tumblr to select from")
  3. (defparameter *read-timeout* 5 "API request timeout")
  4. (defparameter *boobs-roll*
  5. '("http://bbt12.tumblr.com"
  6. "http://boobsarethegreatest.tumblr.com"
  7. "http://neverending-boobs.tumblr.com"
  8. "http://titsandeyes.tumblr.com"
  9. "http://perfectbreasts.tumblr.com")
  10. "Tumblr roll with boobs")
  11. (defparameter *ass-roll*
  12. '("http://divine-asses.tumblr.com"
  13. "http://greatestassonearth.tumblr.com")
  14. "Tumblr roll with asses")
  15. (defun lo-string (val)
  16. (string-downcase (princ-to-string val)))
  17. (defun tumblr-read (domain &rest args)
  18. (handler-case
  19. (let ((params (loop for (k v) on args by #'cddr
  20. when v collect (cons (lo-string k) (lo-string v)))))
  21. (yason:parse
  22. (subseq (flexi-streams:octets-to-string
  23. (bordeaux-threads:with-timeout (*read-timeout*)
  24. (drakma:http-request
  25. (format nil "~A/api/read/json" domain)
  26. :parameters params
  27. :force-binary t))
  28. :external-format :utf-8) 22)
  29. :object-as :alist))
  30. (bordeaux-threads:timeout (e) (error e))))
  31. (defun tumblr-random-post (&key (roll *tumblr-roll*) type (num 1))
  32. (when roll
  33. (let* ((domain (random-elt roll))
  34. (total (aget "posts-total" (tumblr-read domain :num 1 :type type)))
  35. (start (random total))
  36. (res (tumblr-read domain :num num :type type :start start)))
  37. (log:info "Post" start "from" domain)
  38. (loop for post in (aget "posts" res)
  39. collect (aget "photo-url-1280" post)))))
  40. (defun tumblr-random-photo (&optional (roll *tumblr-roll*) (num 1))
  41. (tumblr-random-post :roll roll :type :photo :num num))