Facebook
From Anorexic Porcupine, 3 Years ago, written in JavaScript.
This paste is a reply to Untitled from Sloppy Kitten - go back
Embed
Viewing differences between Untitled and Re: Untitled
/*
NicoJKログのTOKYO MXとBS11を結合するJScriptです。
TSファイルの作成日時に近いjk9とjk211のログを結合し、ダミーチャンネルのログとして出力します。
拡張子をJSにし、WSHとして実行して下さい。

実行方法
cscript 本スクリプトのパス tsパス nicoJKログ(末尾に\はつけない) ダミーチャンネル(省略時999) 探索範囲[秒](省略時180)

実行例
cscript D:\merge_jk9_jk211.js "D:\Videos\ご注文はうさぎですか?BLOOM #11「にっこりカフェと七色の魔法使い」.ts" "D:\NicoJK"
前後180秒以内の該当するログをマージし、999チャンネルに出力する。

NicoConvAssとの併用例
NicoConvAssのch_sid.txtを以下のように書き換える。
211        4        211        *        BS11

999        4        211        *        BS11
BS11のTSファイルはjk999を参照するようになる。

注意点
・TSファイルのチャンネルは考慮してません。
 TOKYO MX・BS11以外のTSファイルが与えられた場合でも、近い時間帯のログをマージします。
・TSファイルの作成日時と録画開始日時が大きくずれていると、ログもずれます。
・エラーは考慮してません。
・生成したログをNicoConvAss以外で使った場合にどうなるかは不明です。
・TS作成日時とjkログ日時は割とずれます。
 必要に応じて探索範囲を広げて下さい。
*/

var fso = new ActiveXObject("Scripting.FileSystemObject");

// TSファイルのパス
var tsFile = WScript.Arguments(0);
// NicoJKログのパス(\で終わらない)
var nicoJKLog = WScript.Arguments(1);
// 出力チャンネル(既定値999)
var outputCH = WScript.Arguments.length >= 3 ? WScript.Arguments(2) : 999;
// 探索範囲[秒](既定値180)
var maxDiff = WScript.Arguments.length >= 4 ? WScript.Arguments(3) : 180;

var outputFolder = nicoJKLog + "\\jk" + outputCH;

// TSファイルのUNIXTIME
var unixtime = Math.floor(fso.GetFile(tsFile).DateCreated / 1000);

// txtをマージ
var output = readNearFile(unixtime, nicoJKLog + "\\jk9") + readNearFile(unixtime, nicoJKLog + "\\jk211");

// 出力フォルダがなければ作る(1階層のみ)
if (!fso.FolderExists(outputFolder)) fso.CreateFolder(outputFolder);
// txtを出力
if (output.length) writeFile(outputFolder + "\\" + unixtime + ".txt", output, 'UTF-8');

function readNearFile(unixtime, path) {
        var txt = getNearFile(unixtime, path);
        return txt ? readFile(txt, 'UTF-8') :  '';
}

// テキストファイルを読み込む
function readFile(path, charset) {
        var sr = new ActiveXObject("ADODB.Stream");
        sr.Charset = charset;
        sr.Open();
        sr.LoadFromFile(path);
        return sr.ReadText();
}

// テキストファイルを保存
function writeFile(path, context, charset) {
        var sr = new ActiveXObject("ADODB.Stream");
        sr.Charset = charset;
        sr.Open();
        sr.WriteText(context);
        sr.SaveToFile(path, 2);
}

// UNIXタイムスタンプに近い日時のJKログファイル名を取得
function getNearFile(unixtime, folder) {
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        var result = [];
        var diff = [];
        var fileunix;

        var fc = fso.getFolder(folder).Files;
        var e = new Enumerator(fc);
        for (; !e.atEnd(); e.moveNext()) {
                var file = e.item();
                fileunix = file.Name.slice( 0, -4);
                // ファイル名が数値か確認(割とザルなので、正規表現に書き換えたい)
                if (!isNaN(fileunix)) {
                        result.push(file.Path);
                        diff.push(Math.abs(fileunix - unixtime));
                }
        }

        var max = diff.length;
        var min = maxDiff;
        var found = -1;
        for (var i = 0; i < max; i++) {
                if (diff[i] < min) {
                        min = diff[i];
                        found = i;
                }
        }
        return found !== -1 ? result[found] : false;
}