DevDevデブ!!

プログラミングのこととか書きます。多分。。。

speakerdeckのスライドをpdfで保存するCLIコマンドを作った

github.com

pocketに保存したspeakerdeckのスライドをpdfでダウンロードしてローカルに保存するコマンド

won't read it laterの頭文字をとって「wril」です。

なぜ作った?

端的にいうとspeakerdeckが重くてkindle fire HD7と俺の寿命がマッハなので、いったんpdfで保存し、kindleパーソナルライブラリに突っ込もうとしたって話

いや、ほんと、speakerdeckって重くないですか? エアロバイク漕ぎながらpocketに入れた記事を消化するんですが、slideshareは普通に見られるのに、speakerdeckは重くてまともにスライドのページがめくれないんですよね。

めくれないどころか、kindle fire HD7がフリーズして再起動したんですよね。

おかげでspeakerdeckのスライドが全然消化できないので、技術で殴ろうとしたという話

仕組み

  • pocketのapiを叩いて、「speakerdeck」という文字列が含まれるエントリを検索
  • 上記検索結果からエントリのURLにアクセス
  • アクセスしたspeakerdeckのページから、PDFのダウンロードリンクをスクレイピング
  • 上記pdfリンクにアクセスしてダウンロード

技術的に特におもしろいところはない。

pdfをkindleパーソナルライブラリにアップロードするところは今のところsento-to-kindleアプリで手動アップロードしている

使い方

以下でコマンドをビルド

npm install
npm run build

pocketのコンシューマキー、アクセストークンを環境変数に設定

export POCKET_CONSUMER_KEY=xxxx
export POCKET_ACCESS_TOKEN=xxxx

以下のように実行

node dist/main.js -d /tmp/pdf_dl -c 10 -s unread

オプションで指定しているのはそれぞれ

  • ダウンロード先ディレクト
  • ダウンロード数
  • pocketのアーティクルのstateの指定

ちなみにpdfのタイトルはURLをスラッシュ区切りにして、末尾のパスを使っている。 これだと同名のスライドがあった場合、上書きされてしまうので、スライド著者のspeakerdeckのアカウント名を先頭に入れて一意性を担保したほうがいいかもしれない。

終わりに

とりあえず、pocketに保存したspeakerdeckのページからスライドをpdfダウンロードして、kindleパーソナルライブラリに保存するという目的は達成できている。

あとはページング対応入れたらいいかなという感じ

というか、当初IFTTTとAWS Lambdaと組み合わせてピタゴラスイッチ化するつもりだったんだけど、途中でめんどくなってやめた。CLIコマンドならnode.jsである必要はないので、golangで書き直すかも。