Former-commit-id: 499d03f710
This commit is contained in:
Jonas Kamsker 2022-03-20 19:36:45 +01:00
commit b8505babf4
4 changed files with 14 additions and 68 deletions

View file

@ -67,51 +67,5 @@ public static string Replace(this string str, Dictionary<char, string> replaceLi
return parsedString.ToString(); return parsedString.ToString();
} }
/// <summary>
/// Counts the number of occurrences of the specified substring within
/// the current string.
/// </summary>
/// <param name="s">The current string.</param>
/// <param name="substring">The substring we are searching for.</param>
/// <param name="aggressiveSearch">Indicates whether or not the algorithm
/// should be aggressive in its search behavior (see Remarks). Default
/// behavior is non-aggressive.</param>
/// <remarks>This algorithm has two search modes - aggressive and
/// non-aggressive. When in aggressive search mode (aggressiveSearch =
/// true), the algorithm will try to match at every possible starting
/// character index within the string. When false, all subsequent
/// character indexes within a substring match will not be evaluated.
/// For example, if the string was 'abbbc' and we were searching for
/// the substring 'bb', then aggressive search would find 2 matches
/// with starting indexes of 1 and 2. Non aggressive search would find
/// just 1 match with starting index at 1. After the match was made,
/// the non aggressive search would attempt to make it's next match
/// starting at index 3 instead of 2.</remarks>
/// <returns>The count of occurrences of the substring within the string.</returns>
public static int CountOccurrences(this string s, string substring,
bool aggressiveSearch = false)
{
// if s or substring is null or empty, substring cannot be found in s
if (string.IsNullOrEmpty(s) || string.IsNullOrEmpty(substring))
return 0;
// if the length of substring is greater than the length of s,
// substring cannot be found in s
if (substring.Length > s.Length)
return 0;
int count = 0, n = 0;
while ((n = s.IndexOf(substring, n, StringComparison.InvariantCulture)) != -1)
{
if (aggressiveSearch)
n++;
else
n += substring.Length;
count++;
}
return count;
}
} }
} }

View file

@ -1,4 +1,5 @@
using System.Text; using System.Collections.Generic;
using System.Text;
namespace FFMpegCore.Arguments namespace FFMpegCore.Arguments
{ {
@ -9,6 +10,7 @@ public interface IDynamicArgument
/// </summary> /// </summary>
/// <param name="context"></param> /// <param name="context"></param>
/// <returns></returns> /// <returns></returns>
public string GetText(StringBuilder context); //public string GetText(StringBuilder context);
public string GetText(IEnumerable<IArgument> context);
} }
} }

View file

@ -1,6 +1,7 @@
using FFMpegCore.Extend; using FFMpegCore.Extend;
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -28,9 +29,14 @@ public MetaDataArgument(string metaDataContent)
public void Post() => File.Delete(_tempFileName); public void Post() => File.Delete(_tempFileName);
public string GetText(StringBuilder context) public string GetText(IEnumerable<IArgument>? arguments)
{ {
var index = context?.ToString().CountOccurrences("-i") ?? 0; arguments ??= Enumerable.Empty<IArgument>();
var index = arguments
.TakeWhile(x => x != this)
.OfType<IInputArgument>()
.Count();
return $"-i \"{_tempFileName}\" -map_metadata {index}"; return $"-i \"{_tempFileName}\" -map_metadata {index}";
} }

View file

@ -22,24 +22,8 @@ private FFMpegArguments() { }
private string GetText() private string GetText()
{ {
var sb = new StringBuilder(); var allArguments = _globalArguments.Arguments.Concat(Arguments).ToArray();
var appendSpace = false; return string.Join(" ", allArguments.Select(arg => arg is IDynamicArgument dynArg ? dynArg.GetText(allArguments) : arg.Text));
foreach (var arg in _globalArguments.Arguments.Concat(Arguments))
{
if (appendSpace)
{
sb.Append(' ');
}
else
{
appendSpace = true;
}
sb.Append(arg is IDynamicArgument dynArg ? dynArg.GetText(sb) : arg.Text);
}
return sb.ToString();
} }
public static FFMpegArguments FromConcatInput(IEnumerable<string> filePaths, Action<FFMpegArgumentOptions>? addArguments = null) => new FFMpegArguments().WithInput(new ConcatArgument(filePaths), addArguments); public static FFMpegArguments FromConcatInput(IEnumerable<string> filePaths, Action<FFMpegArgumentOptions>? addArguments = null) => new FFMpegArguments().WithInput(new ConcatArgument(filePaths), addArguments);