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

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

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

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

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


(初版作成日: 2021.09.05, 最終更新日: 2021.12.31)

本記事の最新版はZennにあるバージョンを参照ください。以下の内容は記録用に残しています。


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

(2021.12.31) コードをブラウザ動作版に変更。

コードはこちら

利用方法はREADME.mdに記載している。

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

処理の流れ

  1. アセットに関する情報を書き換え
    1. 変更前のアセットIDと、変更後のアセットIDのマッピング
    2. アセットのID, name, path書き換え
  2. ソース接続/ターゲット接続情報の書き換え
  3. 処理結果をzipファイルにまとめてダウンロード

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

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

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


内部構造について

プロジェクトファイル(*.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": "アセットID1のpathと同じ",
            "type": アセットID1のtypeと同じ,
        },
        "timestamp": 1.2
    }
}

脚注

※1 公式のPR#1027で修正されているものの、リリース前にプロジェクトが凍結した。そのため、修正版はすぐには出ない見通し。

以上