ページ内の画像を一括ダウンロード : hkob の雑記録 (269)

はじめに

hkob の雑記録の第269回目は、このブログの下書きを書いている Notion ページから画像を一括ダウンロードする Alfred workflow について解説します。

ブログへの画像アップロード

このブログは「はてなブログ」に掲載していますが、元記事は全て Notion で執筆しています。基本的に Notion で書いたページをコピーして、はてなブログのエディタに貼り付けています。Notion からコピーすると Markdown になるので、基本的にはそのまま掲載できます。ただし、画像だけは aws のファイルになるので、貼り付け直しが必要です。このため、毎回画像をダウンロードしていました。

作成したワークフロー

作成したワークフローは以下のようになります。それほど頻繁に使うワークフローではないので、「getimage」というキーワードにしました。

作成したワークフロー

最初に Notion のアプリに切り替えたあと、次の applescript で cmd-L としてページの URL を取得します。ここまでは以前の既存のタスクに日付を設定するものと同じです。

URL を取得する AppleScript

次の Arg and Vars では取得したクリップボードを引数に変換します。

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 に貼り付けた画像が一気にダウンロードされました。

ダウンロードされた画像群

おわりに

これまでスクロールしながら、ダウンロードボタンを押していたことからすると、圧倒的に手間が減りました。もっと早く作成していればよかったです。

hkob.notion.site