non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

SafariのリーディングリストをFirefoxなどで読む

こんばんは、先日息子に買ったプラレールカシオペアが初のアマゾンへの返品になりましたkjunichiです。モーターのブラシが不良だったみたいで、エネループ入れて動かしたら初めはやたらと高速で動いたのですが、その後すぐに異音が出るようになり、どうもモータのブラシの一部が焼き切れてしまい、モータの軸がガタつきこれが、異音の原因となっていたようでした。

Rubyでプロパティリストを使う準備

gem install CFPropertyList

Rubyでプロパティリストを読み込む

require 'cfpropertylist'
plist = CFPropertyList::List.new(:file => "Bookmarks.plist")
data = CFPropertyList.native_types(plist.value)

Bookmarkの構造が俺には複雑で苦戦

ハッシュが出来、その次は配列で、またその中はハッシュみたいな

リーディングリストにアクセスする

lista = data['Children']
rl=lista[lista.size-1]['Children']
(0..598).each{|i|
  puts rl[i]['URIDictionary']['title'] + " " + rl[i]['URLString']
}

ruby的にはこんな感じで格納されてる

=> {
"ReadingList"=>{
"DateAdded"=>2013-05-14 08:31:52 +0900, 
"DateLastViewed"=>2013-05-15 12:35:32 +0900, 
"PreviewText"=>"このページをモバイルデバイスに最適化されたPublickey Smart Edtionで読む JavaScriptのプログラミングスタイルはどうあるべきか?重鎮
Douglas Crockford氏が脳の働きとの関係を語る(後編)。QCon Tokyo 2013 2013年5月1"
}, 
"ReadingListNonSync"=>{
"ArchiveOnDisk"=>true, "DateLastFetched"=>2013-05-16 07:27:02 +0900, "FetchResult"=>1, "PreviewText"=>"JavaScriptのプログラミングスタイルはどうあるべきか? 重鎮Douglas Crockford氏が脳の働きとの関係を語る(後編)。QCon Tokyo 2013 2013年5月13日 4月23日に都内で開催されたエンジニア向けのイベント「QCon Tokyo 2013」"
},
 "Sync"=>{"Key"=>"\"C=3255@U=ca51b725-be75-411a-8340-09c60f38bf27\"", 
"ServerID"=>"https://kjw_junichi%40mac.com@p02-bookmarks.icloud.com/95582769/bookmarks/BFEmlLhQQi64yzedNfEOOA/DC1036B1-1C4E-48
ED-80DF-7FF9F0FCD51E.xbel"}, "URIDictionary"=>{"title"=>"JavaScriptのプログラミングスタイルはどうあるべきか? 重鎮Douglas Cr                      r
ockford氏が脳の働きとの関係を語る(後編)。QCon Tokyo 2013 - Publickey"}, "URLString"=>"http://www.publickey1.jp/blog/13/ja                  a
vascript_douglas_crockfordqcon_tokyo_2013_1.html", "WebBookmarkType"=>"WebBookmarkTypeLeaf", "WebBookmarkUUID"=>"B6D208F6-E3
05-4149-A215-96419B96C460"}  

1エントリの構造

ReadingList

DateAdded

DateLastViewed

これが設定されていなければ、未読扱いか?

URIDictionary

title

URLString

何とか手元の環境で動いたのがこちら

#!/usr/bin/env ruby

require 'cfpropertylist'
plist = CFPropertyList::List.new(:file => File.expand_path("~/Library/Safari/Bookmarks.plist"))
data = CFPropertyList.native_types(plist.value)
a=data['Children']
b=a[a.size-1]['Children']
puts "<html><body><ul>"
(0..b.size-1).each{|i|
  if b[i]['ReadingList']['DateLastViewed']
    puts "<li><a href=\""+b[i]['URLString']+"\">" + b[i]['URIDictionary']['title']+"</a></li>"
  end
}
puts "</ul></body></html>"