using System.Diagnostics; using ttrss_co_client.ttrss; using ttrss_co_client.ttrss.datastructures; namespace ttrss_co_client.tasks { ///ffmpegify public class Convert : Phase2Task { public override string TaskName => "convert"; public override async Task> ActOn(WorkOrder wo) { var conversionFilenameTarget = wo.data["path"].Substring(0, wo.data["path"].LastIndexOf('.')) + wo.data["conversion-target"]; if(conversionFilenameTarget == wo.data["path"]) { Console.WriteLine("no conversion needed"); return new Tuple(TaskStatus.ContinueNow, wo); } var article = (await TtrssClient.GetArticles(wo.articleId))?.FirstOrDefault(); if(article == null){ Console.Error.WriteLine($"article {wo.articleId} couldn't be retrieved!"); return null; } var sw = new Stopwatch(); sw.Start(); var conversionProc = Process.Start("ffmpeg", $"-y -loglevel quiet -i \"{wo.data["path"]}\" \"{conversionFilenameTarget}\""); conversionProc.WaitForExit(); sw.Stop(); if(File.Exists(conversionFilenameTarget)) { Console.WriteLine($" converted {wo.data["path"]} -> {conversionFilenameTarget}"); File.Delete(wo.data["path"]); wo.data["path"] =conversionFilenameTarget; } var outputStr = $"converted in {sw.Elapsed}"; Console.WriteLine(outputStr); //re-get, in case conversion took a long time article = (await TtrssClient.GetArticles(wo.articleId))?.FirstOrDefault(); await TtrssClient.UpdateArticleNote($"{article.note}\n{outputStr}", article.id); var toReturn = new Tuple(TaskStatus.ContinueNow, wo); if(!wo.Phase2TaskList.Any()) { Console.Error.WriteLine($"work order {wo.guid} came to conversion, but thinks its done?"); return new Tuple(TaskStatus.Done, null); } return toReturn; } } }