public async Task AddQueue(AddQueueDirectory dir) { // 既に追加されているファイルは除外する var ignoreSet = new HashSet <string>(queue .Where(t => t.Path == dir.DirPath) .SelectMany(t => t.Items) .Select(item => item.Path)); var items = ((dir.Targets != null) ? dir.Targets : Directory.GetFiles(dir.DirPath) .Where(s => { string lower = s.ToLower(); return(lower.EndsWith(".ts") || lower.EndsWith(".m2t") || lower.EndsWith(".mp4")); })) .Where(f => !ignoreSet.Contains(f)); if (dir.DstPath != null && Directory.Exists(dir.DstPath) == false) { await client.OnOperationResult( "出力先フォルダが存在しません:" + dir.DstPath); return; } var target = new QueueDirectory() { Path = dir.DirPath, Items = items.Select(f => new QueueItem() { Path = f }).ToList(), DstPath = (dir.DstPath != null) ? dir.DstPath : Path.Combine(dir.DirPath, "encoded") }; if (target.Items.Count == 0) { await client.OnOperationResult( "エンコード対象ファイルが見つかりません。パス:" + dir.DirPath); return; } queue.Add(target); Task task = client.OnQueueUpdate(new QueueUpdate() { Type = UpdateType.Add, Directory = target }); Task task2 = RequestFreeSpace(); if (encodePaused == false && nowEncoding == false) { await StartEncode(); } await task; await task2; }
public async Task ProcessDiretoryItem(EncodeServer server, QueueDirectory dir) { succeeded = Path.Combine(dir.Path, "succeeded"); failed = Path.Combine(dir.Path, "failed"); encoded = dir.DstPath; Directory.CreateDirectory(succeeded); Directory.CreateDirectory(failed); Directory.CreateDirectory(encoded); int failCount = 0; // 待たなくてもいいタスクリスト waitList = new List <Task>(); var itemList = dir.Items.ToArray(); while (dir.CurrentHead < itemList.Length) { if (failCount > 0) { int waitSec = (failCount * 10 + 10); waitList.Add(server.AddEncodeLog("エンコードに失敗したので" + waitSec + "秒待機します。(parallel=" + id + ")")); await Task.Delay(waitSec * 1000); if (server.encodePaused) { break; } } if (dir.CurrentHead >= itemList.Length) { break; } var src = itemList[dir.CurrentHead++]; waitList.Add(server.UpdateItemState(true, false, src, dir)); var logItem = await ProcessItem(server, src); if (logItem.Success) { File.Move(src.Path, succeeded + "\\" + Path.GetFileName(src.Path)); failCount = 0; } else { File.Move(src.Path, failed + "\\" + Path.GetFileName(src.Path)); ++failCount; } server.log.Items.Add(logItem); server.WriteLog(); waitList.Add(server.UpdateItemState(false, true, src, dir)); waitList.Add(server.client.OnLogUpdate(server.log.Items.Last())); waitList.Add(server.RequestFreeSpace()); if (server.encodePaused) { break; } } await Task.WhenAll(waitList.ToArray()); }
private Task UpdateItemState(bool isEncoding, bool isComplete, QueueItem item, QueueDirectory dir) { item.IsEncoding = isEncoding; item.IsComplete = isComplete; return(client.OnQueueUpdate(new QueueUpdate() { Type = UpdateType.Update, DirPath = dir.Path, Item = item })); }