6f42890d | (defpackage :reading-list-reader (:use :cl ) (:export )) (in-package :reading-list-reader) (serapeum:eval-always |
1aa0f8f7 | (named-readtables:in-readtable :objc-readtable)) |
6f42890d | |
d5a8a26b | (defun slugify (s) (cl-ppcre:regex-replace-all "\\s+" (string-downcase s) "_")) (defun select-child (d title) (flet ((get-title (h) (equal (gethash "Title" h) title))) (fw.lu:let-each (:be *) (gethash "Children" d) (remove-if-not #'get-title *)))) (defparameter *reading-list-location* "Library/Safari/Bookmarks.plist") (defun get-bookmark-filename () (uiop:native-namestring (merge-pathnames *reading-list-location* (truename "~/")))) (defun translate-plist (fn) (objc-runtime.data-extractors:extract-from-objc (objc-runtime.data-extractors:get-plist fn))) |
6f42890d | |
d5a8a26b | (defun make-org-file (s reading-list-info) |
1aa0f8f7 | (format s "~&* Safari Reading List~%") (serapeum:mapply (serapeum:partial 'make-org-entry s) |
d5a8a26b | reading-list-info)) (defun make-org-entry (s date title url preview tag) (format s "~&** ~a (~a) :~{~a:~}~% ~a~2% ~{~<~% ~1,80:;~a~> ~}~2%" title (local-time:format-timestring nil date :format local-time:+rfc3339-format/date-only+) (alexandria:ensure-list tag) |
6f42890d | url (serapeum:tokens preview))) |
d5a8a26b | |
6f42890d | (defun get-readinglist-info (bookmarks) |
d5a8a26b | (sort (mapcar 'extract-link-info |
85382f54 | (gethash "Children" (car (select-child bookmarks |
d5a8a26b | "com.apple.ReadingList")))) 'local-time:timestamp> :key 'car)) |
6f42890d | |
47822ccc | (defun extract-link-info (link) |
d5a8a26b | (list (local-time:parse-rfc3339-timestring (or (fw.lu:pick '("ReadingList" "DateAdded") link) (fw.lu:pick '("ReadingList" "DateLastViewed") link) (fw.lu:pick '("ReadingListNonSync" "DateLastFetched") link) (local-time:now))) (fw.lu:pick '("URIDictionary" "title") link) |
47822ccc | (fw.lu:pick '("URLString") link) (plump:decode-entities (coerce (fw.lu:pick '("ReadingList" "PreviewText") link) 'simple-string) t) (fw.lu:may (slugify (fw.lu:pick '("ReadingListNonSync" "siteName") link))))) |
d5a8a26b | (defun main () #+(and build sbcl) (progn (sb-ext:disable-debugger) (sb-alien:alien-funcall (sb-alien:extern-alien "disable_lossage_handler" (function sb-alien:void)))) (make-org-file *standard-output* (get-readinglist-info (translate-plist (get-bookmark-filename))))) |