電子書籍をAmazonPrimePhotoにバックアップする

せっかくPrimeStudentに登録しているのでPrimePhoto上に電子書籍をバックアップさせることにした. 技術的にハマることは特になかったけど単純作業でケアレスミスを連発 (eg; 「完成した30GBのデータを完全に削除しVPSから元データを取り直し」など). 結局アップロードし終わるのに丸1週間かかった

VPSから書籍を落としてくる

普通にSCPを使うと遅すぎるのでtarで圧縮・転送・展開を同時に行う. まずはowncloudのデータディレクトリにアクセスするべく,VPS上で,

% sudo gpasswd -a taichi www-data

そしてRingoServer上にtmuxセッションを張って,

% ssh sakura tar czv "/var/www/owncloud/data/taichi/files/電子書籍\&PDF資料" |\
tar xzvf - -C "/var/smb/taichi/ebook/RAW"

を実行. 細々したファイルの大量転送は通信に掛かるオーバーヘッドが酷い. 圧縮・暗号化をかけるだけ遅くなるので,LANからは必ずSMB/CIFSでボリュームマウントする.

画像ファイル名を統一する(もともと画像で保存してあった場合)

画像ファイル名を001.jpgって感じに統一していきたい. /sumikkono-sorasan/vol1/001a.jpgなディレクトリ構造を前提.

最初に必ずドライラン,

% ./a.sh | less

で順序関係に破綻がないことを確認する. mvを発行してから気づいても手遅れ.

.jpegとかがたまに混ざっているので,

% find . -type f -not -name "*.jpg" -and -not "*.png"

で確認する. ドットファイルが混ざっていれば,

% find . -type f -name ".*" -exec rm {} \;

で削除.

PDFファイル名を統一する

PDFファイル名をxxx\_vol1.pdfって感じに統一したい. /RAW/sumikkono-sorasan/vol1.pdfなディレクトリ構造を前提.

このスクリプトの肝は,まずはファイル名・ディレクトリ名からスペースを削除していること. 逆変換は

% find $BASE -name "*_*" | rename 's/_/ /g'

で一発.

ちなみにMacだとデフォルトでrenameコマンドが使えないのでbrewからインストール (PermissionDeniedで怒られたので/usr/localの権限を修正).

% brew install rename
% sudo chown -R $USER /usr/local/
% brew link rename
% rename 's/ /_/g' *

Automatorを使ってPDFからPNGを抽出

ImageMagickでconvertする方法だとクオリティが微妙でしかも遅い. MacのPreviewを使ってPNG書き出しさせた方が早いし綺麗.

数百冊相当のPDFがあるので当然作業は自動化させる. 今回はxxxx\_vol1.pdfという書籍に対しxxx\_vol1というディレクトリを作成し, その中に001.pngって感じにページ3桁ゼロパディング表記で書き出していきたい (ゼロパディングしないとバージョンソートに対応していないクライアントで表示順序がイカれる).

まずはworkerを作る.

1つ目のシェルスクリプトはディレクトリを新規作成し移動,フルパスを引き渡す.

2つ目のシェルスクリプトはPreviewによって生成されたPNG画像のファイル名からスペースを除去する (sora 2.pngみたいな出力になっているから). renameコマンド使わない方法でやってみた(匠の遊び心).

3つ目のシェルスクリプトはPNG画像ファイル名を3桁ゼロパディング表記に直す.

4つ目のシェルスクリプトは完成した画像一式を作業ディレクトリから保存先ディレクトリに移動する.

これで完成. workerにジョブを渡すフロントエンドを作る.

1つのworkerは1coreを専有するので,クアッドコアの能力をフルに引き出すべく4つにコピー.

PDFファイル群を4つのグループに分けて(等コストバランシング)実行.

定期的にdoneフォルダの中身をサーバに移してあげないと128GBの記憶装置はすぐにパンパンになってしまうので注意. 放置してたら空き容量5MBでプロセス止まった. 作業復旧させるのめんどくさかった.

途中まで完成してたファイルを全部消したのでやり直し

順調にAutomatorが完成形式のディレクトリを吐き出してくれる中,doneフォルダの中身を間違ってrmで薙ぎ払ってしまった. 30GB相当の進捗が蒸発し涙目. とりあえず残りの作業を進行させる.

消してしまった書籍の同定作業は手動で行った. 破壊的な操作を行う場合は指差し確認!

Amazon Cloud Drive にアップロードする

JP版のCloudDriveはAPIが提供されていないのでブラウザからアップロードする タブを使って並行アップロード 長時間動かし続けるとメモリアロケーションエラーで死ぬ可能性が高まるので、程々にプロセス再起動を実行

一発でアップロードが完了することはあまりなく、たいてい失敗するファイルが何個か出てくる.

ファイル名にタイトルを入れていないので、こんなスクリプトを使って失敗している可能性のあるファイルを抽出し再アップロード.

つまり047.png029.pngのアップロードに失敗したときは,

% ./delete.sh "047.png" "029.png"

したあとフォルダを上げ直す.

ちなみにこれは破壊的な変更を加えていないので、直後であれば復元可能.

% ./undo.sh

でもとに戻せる.