自分のPCにある写真をPicasa webに丸ごとアップ

自分のPCにあるjpg写真をサブディレクトリーの階層ごと丸ごとアップロードします。
G* Advent Calendar 2011 17日目のネタです。  #gadvent2011
特にGroovyの新技術を使うこともなく、あくまて日用の小道具として、目的志向でGroovyを活用したいと思います。

picasaのwebストレージも Google+に参加するとほぼ容量無制限となるので、

公開するかどうかは、後でアクセス権の設定の時に考えるとして自分のPCの写真を全てPicasaに保存します。
目的は洪水対策ですね、自分の家のPCが全壊してもアルバムは保全したいと思います。

前提として使うアプリケーションは Gladinet Cloud Desktopです。
これによりPicasa web サービスがドライブとしてPCにマウントして見ることができます。
したがって動作OSはWindowsです。

Picasa webサービズがドライブとして見えているのだから、
ここに一気に xcopyrobocopy で一気にコピーできるかというと、Picasa web には制約があって、サブディレクトリーは一段までです。
例えば
c:/趣味/つり/伊豆/船1.jpg
という深いディレクリーにある画像ファイルはそのままでは送れません、それを
c:¥趣味_つり_伊豆¥舟1.jpg
という風にディレクトリー名をひとつの長いものに変えて送る必要があります。
ここでは特にPicasaWebサービスAPIとかは使っていなのでPicasa以外の似たようなサービスにも適用できると思います。

以下のスクリプトは、自分の持っているjpgをまるごと複製するので、動かす頻度がとても少ないのでハードコードしまくりです。

コピー先のPicasaディレクトリーは、ルートが z:/GooglePicasa という設定になっている前提です。
またこのスクリプト自体は、複製元の写真の配置してある場所のルートで起動します。
sleep で相当遅くなってますが、これは Gladinet のフリー版は、一日あたりの転送数に、制限がある為です
まったりPCをつけっぱなしにて動かすことが前提です。
多分Gladinet側の問題たと思いますが、何やら動作が不安定です。
量的にGladinetに負荷をかけすぎているのかもしれません。

def  targetDrive="z:\\GooglePiasa\\"  // Gladinet で設定したPicasa Webサービスのroot directory

File.metaClass.copy = { String destName -> 
  if(delegate.isFile()){
    new File(destName).withOutputStream{ out ->
      out.write delegate.readBytes()
    }
  }
}

new File(".").eachFileRecurse { file -> 
  if(file.isFile() && file.name.endsWith('.jpg')){
    curName = file.getPath().replaceAll(/.\\(.*)/) {m0,m1 -> m1}
      newName = curName.reverse().replaceFirst("\\\\", "----").reverse()
      newName = newName.replaceAll("\\\\", "_")
      newName = newName.replaceAll("----", "\\\\")
      newFile = new File(URLDecoder.decode(newName, "UTF-8"))
      println "現行ファイル名: "+curName
      println "新規ファイル名: "+newName
      
      subDir = newName.toString().replaceAll(/\\.*$/,"")
      if (subDir && subDir.length() +2< newName.length() ) { 
        targetDir = new File(targetDrive+subDir)
          if (!targetDir.exists()) {
             println "Subdir作成:" + targetDrive+subDir
             new File(targetDrive+subDir).mkdir();    //make folders   
             Thread.sleep(1000*60)
          }
      }
      new File(curName).copy(targetDrive+newName)
      Thread.sleep(1000*60)
  }
}

すみません、いまいち安定動作していません、うーん。