VoTTでプロジェクト、動画・画像の場所を変更してもロードできるようにする

VoTT v2.2.0現在、プロジェクトや動画・画像(アセット)のパスを変更するとロードできなくなる※1。

これは以下の2点の原因による。

  1. アセットに関する情報(アセットのIDなど)が絶対パスに依存している
  2. ローカルファイルシステム設定の場合、ソース接続、ターゲット接続が絶対パスで保存されている

修正コードを作ったので、ファイル構造について注釈しつつ記載する。


vott-replace-paths: VoTTファイルパス修正ツール

コードはこちら

環境設定・利用方法はREADME.mdに記載している。

ツール実行後、変換後のプロジェクト(*.vott)およびアセット管理情報(*-assets.json)はoutput/下に保存される(元ファイルをバックアップとして残しておくため)。

なお、元々のプロジェクトおよびアセットがAzure Blob Storageおよびローカルファイルシステムどちらにあった場合も使用可能。

ローカルファイルシステム上の保存パスを変更する場合

以下の通りパラメータを指定する。

1
2
3
4
$ python main.py \
    -k プロジェクトのセキュリティトークン \
    -s ソース接続におけるアセットの保存パス \
    -t ターゲット接続におけるプロジェクトの保存パス

Azure Blob Storage上のコンテナに移動させる場合

以下の通りパラメータを指定する。

1
2
3
4
5
6
$ python main.py \
    -k プロジェクトのセキュリティトークン \
    -t プロジェクトの保存パス \
    -a Azure Blob Storageのアカウント名 \
    -c Azure Blob Storageのコンテナ名 \
    -sas コンテナアクセス用のSAS文字列

処理の流れ

大まかには以下の通り処理する。

  1. アセットに関する情報を書き換え
    1. 変更前のアセットIDと、変更後のアセットIDのマッピング
    2. アセット管理情報の名前変更
    3. アセットのID, name, path書き換え
  2. ソース接続/ターゲット接続情報の書き換え

プロジェクトおよびアセット管理情報においては、複数箇所で同じアセットIDが使われることがある。

そのため、1.1.で変更前のアセットID => 変更後のアセットIDをマッピングしている。

1.2.では、アセット管理情報のファイル名自身にアセットIDが含まれているため、これを更新する。

1.3.は、後述の内部構成に基づいてプロジェクトおよびアセット管理情報ファイルの書き換えを行う。

最後に、ソース接続/ターゲット接続情報を書き換える。こちらも後述の内部構造に基づき、移動後の絶対パスもしくはAzure Blob Storageへの接続情報(アカウント名・アカウント名・SAS文字列)を暗号化して保存する。


内部構造について

プロジェクトファイル(*.vott)

プロジェクトの設定情報とアセットに関する情報からなる。

下記json例のうち、assetsがアセットに関する情報、それ以外がプロジェクトの設定情報である(本件に関連しないものは省略している)。

このうち、書き換えが必要なのは

となる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
{
    "name": "プロジェクト名",
    "securityToken": "セキュリティトークン名",
    "sourceConnection": {
        "name": "ソース接続名",
        "providerType": "localFileSystemProxy か azureBlobStorage",
        "providerOptions": {
            "encrypted": "暗号化済み接続情報",
        },
        "id": "ソース接続ID"
    },
    "targetConnection": {
        "name": "ターゲット接続名",
        "providerType": "localFileSystemProxy か azureBlobStorage",
        "providerOptions": {
            "encrypted": "暗号化済み接続情報",
        },
        "id": "ターゲット接続ID"
    },
    "lastVisitedAssetId": "最後に閲覧したアセットID",
    "assets": {
        "アセットID1": {
            "id": "アセットID1",
            "name": "アセットのファイル名",
            "path": "アセットファイルの絶対パス等",
            "type": 2,
        },
        "アセットID2": {
            "id": "アセットID2",
            "name": "アセットのファイル名#t=1.2",
            "path": "アセットファイルの絶対パス等#t=1.2",
            "type": 3,
            "parent": {
                "id": "アセットID1",
                "name": "アセットID1のnameと同じ",
                "path": "アセットID1のpathと同じ",
                "type": アセットID1のtypeと同じ,
            },
            "timestamp": 1.2
        },
        ...
    }
}

アセット管理ファイル(*-assets.json)

アセットに関する情報およびバージョン情報からなる。 ファイルが

  1. アセット自身の管理ファイル(type=2)
  2. アセット上の特定時刻の管理ファイル(type=3)

のどちらかによってparentの有無が変わる。書き換えが必要なのはassetのid, name, pathだが、書き換えルールはプロジェクトファイル(*.vott)と同じである。

1. アセット自身の管理ファイルの場合(一部省略)

1
2
3
4
5
6
7
8
{
    "asset": {
        "id": "アセットID1",
        "name": "アセットのファイル名",
        "path": "アセットのファイルの絶対パス",
        "type": 2,
    },
}

2. アセット上の特定時刻の管理ファイルの場合(一部省略)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
    "asset": {
        "id": "アセットID2",
        "name": "アセットのファイル名#t=1.2",
        "path": "アセットのファイルの絶対パス",
        "type": 3,
        "parent": {
            "id": "アセットID1",
            "name": "アセットID1のnameと同じ",
            "path": "アセットID2のpathと同じ",
            "type": アセットID2のtypeと同じ,
        },
        "timestamp": 1.2
    }
}

脚注

※1 公式のPR#1027で修正されているので、次期リリースではローカルファイルパスの問題は解消される見込み。ただし、Azure Blob Storageおよびローカルファイルシステム間の移動に関してはその限りではない。

以上