はじめに
hkob の雑記録の第269回目は、このブログの下書きを書いている Notion ページから画像を一括ダウンロードする Alfred workflow について解説します。
ブログへの画像アップロード
このブログは「はてなブログ」に掲載していますが、元記事は全て Notion で執筆しています。基本的に Notion で書いたページをコピーして、はてなブログのエディタに貼り付けています。Notion からコピーすると Markdown になるので、基本的にはそのまま掲載できます。ただし、画像だけは aws のファイルになるので、貼り付け直しが必要です。このため、毎回画像をダウンロードしていました。
作成したワークフロー
作成したワークフローは以下のようになります。それほど頻繁に使うワークフローではないので、「getimage」というキーワードにしました。
最初に Notion のアプリに切り替えたあと、次の applescript で cmd-L としてページの URL を取得します。ここまでは以前の既存のタスクに日付を設定するものと同じです。
次の Arg and Vars では取得したクリップボードを引数に変換します。
肝心のスクリプトは以下のようになりました。以前検証したように新しい NotionRubyMapping を使うために、zsh から mise でインストールした最新版の ruby を利用するようにしています。
スクリプトは以下のようになりました。基本はページ内のブロックのうち、ImageBlock を探して download するだけです。Notion ブロックは階層構造を取りますが、2階層下の孫ブロックまで検索します。なお、png に決め打ちしていますが、ほぼ載せているのは基本スクリーンショットだけなので問題ないと思います。必要ならファイル名をダウンロード後に書き換えるつもりです。
query=$1 PATH="$HOME/.local/share/mise/shims:$PATH" ruby <<-EOL require "open-uri" require "pathname" require "notion_ruby_mapping" include NotionRubyMapping NotionRubyMapping.configure { |c| c.token = ENV["NOTION_API_KEY"] } DIR = Pathname "/Users/hkob/Downloads" def download(url, num) URI.open(url) do |res| IO.copy_stream(res, DIR + format("image%02<num>d.png", num: num)) end end url = "$1" num = 0 page = Page.find url page.children.each do |block| if block.is_a? ImageBlock download block.url, num num += 1 elsif block.has_children block.children.each do |sub_block| if sub_block.is_a? ImageBlock download sub_block.url, num num += 1 end end end end print "Output #{num} files" EOL
動作確認
getimage を実行したらダウンロードフォルダに Notion に貼り付けた画像が一気にダウンロードされました。
おわりに
これまでスクロールしながら、ダウンロードボタンを押していたことからすると、圧倒的に手間が減りました。もっと早く作成していればよかったです。