ubuntu
カテゴリ
TV録画後にAmatsukazeへ Windowsの設定2
2026/04/18 23時tv
■タスクスケジューラーに登録
WinTask
Windows+R>taskschd.msc で、タスクスケジューラーを起動>タスクの作成
全般タブ:
- 名前: Amatsukaze send
- ログオンしているときのみ実行する
- 最上位の特権で実行する: チェック不要
トリガータブ:
- 毎日 → 開始: 3:00:00
操作タブ:
- プログラム: powershell.exe
- 引数: -ExecutionPolicy Bypass -File "C:\FSW_32\script\amatsukaze_send.ps1"
条件タブ:
- タスクの実行のためにスリープを解除するにチェック
設定タブ:
- タスクが既に実行中の場合: 新しいインスタンスを開始しない
- 名前: Amatsukaze send5
- 新規 → 毎日 → 開始: 5:00:00
- 引数: -ExecutionPolicy Bypass -File "C:\FSW_32\script\amatsukaze_send5.ps1"
これで、Ubuntu Server で録画したTSファイルを、普段はスリープ使用しているWindows 機で、朝3時に複数ファイル、スリープを解除してAmatsukazeに渡してエンコードを行う、録画中のファイルをエンコードしないように、ファイル作成2時間後のファイルのみとして、5時にもう一度起動し残ったファイルをエンコード、朝目覚めた時にはほぼエンコードが完了するシステムの構築が完了した。

しかし、夕方移行メイン機を触る時間が多いので、この時間エンコードが動いていないのはも勿体ない無いので、トリガーにログオン時とロック解除時に起動するスクリプトを作成する。

windows 機で起動時に起動する amatsukaze_watcher.ps1 スクリプト作成
# amatsukaze_watcher.ps1
# 録画TSファイルをリアルタイム監視して即時Amatsukaze投入する常駐スクリプト

# 共通設定読み込み
. "C:\FSW_32\script\amatsukaze_config.ps1"

function Write-Log($msg) {
    $line = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') : $msg"
    Add-Content "$LOG_DIR\$(Get-Date -Format yyyyMM)_watcher.log" $line
    Write-Host $line
}

function Process-File($filePath) {
    $file = Get-Item -LiteralPath $filePath -ErrorAction SilentlyContinue
    if (-not $file) { return }

    $baseName = $file.BaseName

    # 投入済みチェック
    if (Is-Done $baseName) { return }

    # スキップ判定(共通設定)
    $skipReason = Should-Skip $baseName
    if ($skipReason) {
        Write-Log "SKIP($skipReason): $baseName"
        Add-DoneLog $baseName
        return
    }

    # 録画終了確認(最終更新から5分以上経過)
    # ※ UNCパス越しのファイルロックチェックは信頼性が低いため時間経過で判定
    $age = (Get-Date) - $file.LastWriteTime
    if ($age.TotalMinutes -lt 5) {
        Write-Log "WAIT(録画中の可能性: $([int]$age.TotalMinutes)分): $baseName"
        return
    }

    # プロファイル判定(リネーム前のチャンネルタグで判定する必要があるため、ここで実施)
    $profile = Get-Profile $baseName

    # ファイル名整形(共通設定)
    $newName = Sanitize-Name $baseName
    $targetPath = $file.FullName

    if ($newName -ne $baseName) {
        $newPath = Join-Path $file.DirectoryName ($newName + $file.Extension)
        if (-not (Test-Path -LiteralPath $newPath)) {
            try {
                Rename-Item -LiteralPath $file.FullName -NewName ($newName + $file.Extension)
                Write-Log "RENAMED: $baseName -> $newName"
                $targetPath = $newPath
                Add-DoneLog $newName
            } catch {
                Write-Log "ERROR(rename): $baseName - $_"
                return
            }
        } else {
            Write-Log "SKIP(同名存在): $newName"
            Add-DoneLog $baseName
            return
        }
    }

    # --- WOWOWの前番組CM(約35秒)Trimは無効化中 ---
    # フォーマット切り替え(PMT更新)を含む長尺映画で
    # join_logo_scp.exeの出力AVSファイルが不正です エラーになるため。
    # CM解析無効化(プロファイル振り分け)のみ有効。
    # if ($baseName -match $WOWOW_PATTERN) {
    #     Write-WowowTrimAvs $targetPath
    #     Write-Log "TrimAvs作成: $([System.IO.Path]::GetFileName($targetPath)).trim.avs (先頭${WOWOW_TRIM_START_FRAMES}フレームをカット)"
    # }

    # AddTask投入
    Write-Log "AddTask: $targetPath (profile: $profile)"
    & $ADDTASK -r $AMATSUKAZE -f $targetPath -ip "localhost" -p 32768 `
        -o $OUTPUT_DIR -s $profile --priority 3 --no-move `
        2>&1 | ForEach-Object { Write-Log $_ }

    Add-DoneLog $baseName
    Write-Log "投入済み記録: $baseName"
}

# ===== 起動時:未投入ファイルを一括処理 =====
Write-Log "==== Watcher起動 ===="
Write-Log "起動時の未投入ファイルをチェック..."

if (Test-Path $TARGET_DIR) {
    $existing = Get-ChildItem -LiteralPath $TARGET_DIR -Filter "*.ts" -File -ErrorAction SilentlyContinue
    foreach ($f in $existing) {
        Process-File $f.FullName
        Start-Sleep -Seconds 2
    }
} else {
    Write-Log "WARNING: $TARGET_DIR にアクセスできません(ネットワーク未接続?)"
}

Write-Log "起動時チェック完了"

# ===== メインループ(ポーリング方式) =====
Write-Log "監視開始(ポーリング): $TARGET_DIR"

while ($true) {
    Start-Sleep -Seconds 30

    # ネットワーク接続確認
    if (-not (Test-Path $TARGET_DIR)) {
        Write-Log "WARNING: ネットワーク未接続、次回チェックまで待機"
        continue
    }

    $files = Get-ChildItem -LiteralPath $TARGET_DIR -Filter "*.ts" -File -ErrorAction SilentlyContinue
    foreach ($f in $files) {
        Process-File $f.FullName
    }
}
上記のスプリクトを起動すると、ターミナル画面が表示されるので、それを裏に隠すために amatsukaze_watcher.vbs ファイルを作成する
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File ""C:\FSW_32\script\amatsukaze_watcher.ps1""", 0, False
Set WshShell = Nothing
注意事項:vbsファイルのエンコードの種類は Shift-JISにする。

Windows+R>taskschd.msc で、タスクスケジューラーを起動>タスクの作成
全般タブ:
- 名前: Amatsukaze Watcher
- ログオン時しているときのみ実行する
- 最上位の特権で実行する: チェック不要
トリガータブ:
- ログオン時 - ワークステーションのロック解除時 操作タブ:
- プログラム: wscript.exe
- 引数: "C:\FSW_32\script\amatsukaze_watcher.vbs"
設定タブ:
- タスクが既に実行中の場合: 新しいインスタンスを開始しない
記事一覧