Advertisement
thebys

Hydra Video Workflow Assist

May 18th, 2019
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.79 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Diagnostics;
  6.  
  7. namespace HydraVideoAssist
  8. {
  9.     //This is a script for assisted calling of FFMPEG to reduce source video footage without loosing quality.
  10.     //Use case:
  11.     //   - Interactively trim source video files of which you only need small parts (e. g. 30 seconds from 10 minutes)
  12.     //   - Allows for original file deletion after wanted part is copied to new file and verified by playback.
  13.     //   - Set FFMPEG and work directory constatns below, then execute, interact and save space.
  14.  
  15.     class Program
  16.     {
  17.         const int FilesToDisplay = 64;
  18.         const int TerminalWidth = 72;
  19.  
  20.         const string FFMPEGExecutableFullName = @"C:\Users\Thebys\Desktop\Apps\ffmpeg-20190517-c3458f0-win64-static\bin\ffmpeg.exe";
  21.         const string WorkingDirectory = "K:\\TEMP RAW";
  22.         static string InputFileFullName = "";
  23.         static string OutputFileFullName = "";
  24.         static int StartTimeSeconds = 0;
  25.         static int DurationTimeSeconds = 0;
  26.  
  27.         static void Main(string[] args)
  28.         {
  29.             Console.WriteLine("Hello, welcome to Hydra Video Assist!");
  30.  
  31.             MainMenu();
  32.         }
  33.         private static void MainMenu()
  34.         {
  35.             Console.WriteLine("Process a file or quit? (default: Process...)");
  36.             var MenuActionInput = Console.ReadLine();
  37.             if (string.IsNullOrWhiteSpace(MenuActionInput))
  38.             {
  39.                 ProcessFile();
  40.             }
  41.             else
  42.             {
  43.                 Environment.Exit(0);
  44.             }
  45.         }
  46.  
  47.         private static void ProcessFile()
  48.         {
  49.             AskForInputFileName();
  50.  
  51.             AskForOutputFileName();
  52.  
  53.             AskToPlayFile(InputFileFullName);
  54.  
  55.             AskForStartTime();
  56.  
  57.             AskForDurationTime();
  58.  
  59.             ExecuteFFMPEG();
  60.  
  61.             AskToPlayFile(OutputFileFullName);
  62.  
  63.             AskForOriginalDeletion();
  64.         }
  65.  
  66.         private static void AskForInputFileName()
  67.         {
  68.             var FileSelectionList = new List<FileInfo>();
  69.             var files = Directory.GetFiles(WorkingDirectory, "*.MOV").OrderBy(f => new FileInfo(f).Length).Reverse().Take(FilesToDisplay);
  70.  
  71.             foreach (var file in files)
  72.             {
  73.                 FileSelectionList.Add(new FileInfo(file));
  74.             }
  75.  
  76.             var fileIndex = 0;
  77.             foreach (FileInfo file in FileSelectionList)
  78.             {
  79.                 Console.WriteLine($"{fileIndex}\t{file.Name.PadRight(TerminalWidth).Substring(0, TerminalWidth)}\t{file.Length / (1024 * 1024)} MB");
  80.                 fileIndex++;
  81.             }
  82.  
  83.             Console.WriteLine("Ok, Now Select file to trim (default: 0):");
  84.             var SelectedInputFileIndex = Console.ReadLine();
  85.             InputFileFullName = FileSelectionList[Convert.ToInt32(SelectedInputFileIndex)].FullName;
  86.             Console.WriteLine($"Input file selected: {InputFileFullName}");
  87.         }
  88.         private static void AskForOutputFileName()
  89.         {
  90.             Console.WriteLine("Please set output file name:");
  91.  
  92.             var OutputFileNameDir = new FileInfo(InputFileFullName).Directory.FullName;     // $"{.}";
  93.             var OutputFileNameAttempt = new FileInfo(InputFileFullName).Name.Split("_20")[0];
  94.             var OutputFileNameExt = new FileInfo(InputFileFullName).Extension;
  95.             var OutputFileNameCandidate = Path.Combine(OutputFileNameDir, $"__{OutputFileNameAttempt}{OutputFileNameExt}");
  96.  
  97.             Console.WriteLine($"Default: {OutputFileNameCandidate}");
  98.  
  99.             var OutputFileNameInput = Console.ReadLine();
  100.             if (String.IsNullOrWhiteSpace(OutputFileNameInput))
  101.             {
  102.                 OutputFileFullName = OutputFileNameCandidate;
  103.             }
  104.             else
  105.             {
  106.                 OutputFileFullName = OutputFileNameInput;
  107.             }
  108.         }
  109.         private static void AskToPlayFile(string FileNameToPlay)
  110.         {
  111.             Console.WriteLine("Would you like to play the file now (default yes)?");
  112.             var ShouldPlayFile = Console.ReadLine();
  113.  
  114.             if (ShouldPlayFile == "yes" || String.IsNullOrWhiteSpace(ShouldPlayFile))
  115.             {
  116.                 try
  117.                 {
  118.                     new Process
  119.                     {
  120.                         StartInfo = new ProcessStartInfo(FileNameToPlay)
  121.                         {
  122.                             UseShellExecute = true
  123.                         }
  124.                     }.Start();
  125.                 }
  126.                 catch (Exception e)
  127.                 {
  128.                     Console.WriteLine($"Failed to play file: {e.Message}");
  129.                 }
  130.             }
  131.         }
  132.  
  133.         private static void AskForStartTime()
  134.         {
  135.             Console.WriteLine("Please enter start time in seconds or type \"r\" to restart, \"d\" to delete:");
  136.             var StartTimeInput = Console.ReadLine();
  137.             if (StartTimeInput == "r") MainMenu();
  138.             if (StartTimeInput == "d") AskForOriginalDeletion();
  139.             else
  140.             {
  141.                 StartTimeSeconds = Convert.ToInt32(StartTimeInput);
  142.             }
  143.         }
  144.  
  145.         private static void AskForDurationTime()
  146.         {
  147.             Console.WriteLine("Please enter duration time in seconds:");
  148.             var DurationTimeInput = Console.ReadLine();
  149.             DurationTimeSeconds = Convert.ToInt32(DurationTimeInput);
  150.         }
  151.  
  152.         private static void ExecuteFFMPEG()
  153.         {
  154.             Console.WriteLine($"Will run FFMPEG with the following command, looking good?");
  155.             Console.WriteLine($"ffmpeg.exe -ss {StartTimeSeconds} -t {DurationTimeSeconds} -i \"{InputFileFullName}\" -c copy -map 0 \"{OutputFileFullName}\"");
  156.             Console.ReadLine();
  157.  
  158.             try
  159.             {
  160.                 new Process
  161.                 {
  162.                     StartInfo = new ProcessStartInfo(FFMPEGExecutableFullName)
  163.                     {
  164.                         UseShellExecute = true,
  165.                         Arguments = $"-ss {StartTimeSeconds} -t {DurationTimeSeconds} -i \"{InputFileFullName}\" -c copy -map 0 \"{OutputFileFullName}\""
  166.                     }
  167.                 }.Start();
  168.             }
  169.             catch (Exception e)
  170.             {
  171.                 Console.WriteLine($"Failed to run ffmpeg: {e.Message}");
  172.             }
  173.         }
  174.  
  175.         private static void AskForOriginalDeletion()
  176.         {
  177.             Console.WriteLine($"Should the original input file be delted?");
  178.             Console.WriteLine($"Default: no. Write \"yes\" to delete.");
  179.  
  180.             var ShlouldDeleteInputFile = Console.ReadLine();
  181.             if (ShlouldDeleteInputFile == "yes")
  182.             {
  183.                 try
  184.                 {
  185.                     var OriginalfileSize = new FileInfo(InputFileFullName).Length / (1024*1024);
  186.                     var NewfileSize = new FileInfo(OutputFileFullName).Length / (1024*1024);
  187.                     File.Delete(InputFileFullName);
  188.                     Console.WriteLine($"Original input file ({OriginalfileSize} MB) has been deleted.");
  189.                     Console.WriteLine($"New file has {NewfileSize} MB, saved {OriginalfileSize - NewfileSize} MB).");
  190.                 }
  191.                 catch (Exception e)
  192.                 {
  193.                     Console.WriteLine($"Failed to delete file: {e.Message}");
  194.                     Console.WriteLine($"Retry? Default: yes.");
  195.                     var RetryFileDeleteInput = Console.ReadLine();
  196.                     if (RetryFileDeleteInput == "yes" || string.IsNullOrWhiteSpace(RetryFileDeleteInput))
  197.                     {
  198.                         AskForOriginalDeletion();
  199.                     }
  200.                 }
  201.             }
  202.  
  203.             MainMenu();
  204.         }
  205.     }
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement