iPhoneだと割とsafariを利用し、あとで読むものは片っ端から Reading List に突っ込んでいたりします。
ですが、PCで見る場合はChromeが多いので、SafariのReading Listの値を引っこ抜けないかどうかを調べてみました。
どこに保存されているか
How do I export my safari 5.1 Reading list? | Official Apple Support Communities
~/Library/Safari/Bookmarks.plist だそうです。
しかも、以下でxmlに変換できるそうです。これは知りませんでした。
/usr/bin/plutil -convert xml1 -o - ~/Library/Safari/Bookmarks.plist
構造を確認して見る
bookmarkと混在していますが、key=ReadingList 周辺にあるようです。
titleは key=ReadingListNonSync のdictに key=Title で格納されているようです。
ですが時々値が入っていなかったりします。
ですので、key=URIDictionary のdictに key=Title で格納されているもの(この値はtilteだったりurlだったりする)を使ってみました。
urlは key=URLString に格納されています。
<dict>
<key>ReadingList</key>
<dict>
<key>DateAdded</key>
<date>2017-01-31T11:05:08Z</date>
<key>PreviewText</key>
<string>みなさんこんにちわ。 メドピアでエンジニアをやっている内田と申します。 現在メドピアではPHPで作られたレガシーな独自フレームワーク (以下FW) からRailsへと移行するプロジェクトが進んでいます。 今回は移行に向けて行ったことについて共有したいと思います。 移行の計画 メドピア株式会社では、医師限定のコミュニティ…</string>
<key>SourceBundleID</key>
<string>com.atebits.Tweetie2</string>
<key>SourceLocalizedAppName</key>
<string>Twitter</string>
</dict>
<key>ReadingListNonSync</key>
<dict>
<key>ArchiveOnDisk</key>
<true/>
<key>DateLastFetched</key>
<date>2017-02-01T05:07:48Z</date>
<key>FetchResult</key>
<integer>1</integer>
<key>Title</key>
<string>レガシーな独自フレームワークから脱却してRailsへ徐々に移行している話</string>
<key>neverFetchMetadata</key>
<false/>
<key>siteName</key>
<string>メドピア開発者ブログ</string>
</dict>
<key>URIDictionary</key>
<dict>
<key>title</key>
<string>http://tech.medpeer.co.jp/entry/2017/01/31/004227</string>
</dict>
<key>URLString</key>
<string>http://tech.medpeer.co.jp/entry/2017/01/31/004227</string>
<key>WebBookmarkType</key>
<string>WebBookmarkTypeLeaf</string>
<key>WebBookmarkUUID</key>
<string>58B295F7-1BC2-46DB-BD54-9084F779FA01</string>
</dict>
抜いて見る
require "nokogiri"
xml = `/usr/bin/plutil -convert xml1 -o - ~/Library/Safari/Bookmarks.plist`
doc = Nokogiri::XML(xml)
doc.xpath("//key[text() = 'ReadingList']/..").each do |elm|
non_sync_title = elm.xpath("key[text() = 'ReadingListNonSync']/following-sibling::dict/key[text() = 'Title']/following-sibling::string[1]").text
url_dic_title = elm.xpath("key[text() = 'URIDictionary']/following-sibling::dict/string[1]").text
title = non_sync_title.empty? ? url_dic_title : non_sync_title
link = elm.xpath("key[text() = 'URLString']/following-sibling::string[1]").text
puts "<li><a href=\"#{link}\">#{title}</a></li>"
end
こんな感じ。
めでたしめでたし。