appengineのidはsubtitleliketweets。
docTypeは3種類:
この_docIdをsrtのidとして使います。
areaMap { textNum: 123, srtId:"xxxyyyzzz", a1: ["e", "", 1234567], a2: ["a", "
abc@gmail.com", 12345577], .... }
srtIdはsrtの_docId。textNumはこのsrtに含まれるテキストの数。
a1, a2, a3,はそれぞれエリアを表している。エリアとは20個の文を含んだ範囲の事。
つまり、123文あるなら1+(123-1)/20 = 7エリアとなる。
それぞれのエリアが排他制御の単位。
a1: [,,,]
のそれぞれは、先頭が"e", "d", "a"のどれかの文字でそれぞれempty, done, assignedを表す。
a1: [,,,]の第二要素は現在assigneされてるユーザーのアカウント名。最初の文字が"a"の時だけ中が入ってる。
基本""かnullが入っている(アップロードのスクリプトで空にしといたら""にならなくて、面倒なのでそのまま放置してある…)
最後はいつ更新されたかを表すlongの値。1970年あたりからのミリセカンド。JSのnew Date()と同じ感じだと思う。
現時点では1時間以上立ってたらaの値は無視して"e"と思う事にしている(予約したままクラッシュした場合など)
text {srtId: "xxxyyyzzz", target: "日本語訳", original: "Origina english text", textId: 12, header:"00:14:35,959 --> 00:14:42,009" }
実際の翻訳したテキストが入ってる。一文1エントリ。targetが""じゃなければ訳した、とみなしている。
textIdはそのsrtの何番目の文か。最初は1。
本来cond=srtId.eq."xxxxyyzzz"&cond=textId.lt.20とかで取りたいのだが、jsonengineの制限で複数フィールドのクエリが出来ないので、今はtextIdのrangeリクエストで全部取ってからsrtIdはAndroid側でフィルタリングしている。
headerはexportする時に使うけど普段は気にしなくてオーケー。
areaMapのa1はtextIdの1〜20が、a2はtextIdの21〜40を担当している。
例えばtextIdが30の文を変更する場合:
1. areaMapを以下 a2:["a",
yourname@gmail.com, 11223344] で更新。最後は現在時刻のlong値。
2. srtIdが対象としているsrtの_docIdでtextIdが30の文をget
3. 2でとったエントリの_docIdに対してtargetを変更してpost。
という感じ。
終了する時はareaMapの"a"を"e"に戻して下さい。
なお、"d"にするのは終わった時では無く、そこのエリアを予約した人が作業しようとした時に更新してます。
作業開始の探し方:
1. areaMapから自分のaccountか、1時間以上前か、"e"のエントリを探す
2. 上記エントリのtextを取得sいてみる
3. 全部targetが""じゃなければareaMapを"d"に更新して1に戻る
4. targetが""な文があったらareaMapを"a"に変更して作業開始(排他制御的には"a"に先にすべきだが)
こんな感じ。
最終更新:2012年11月25日 21:07