forked from Tyrrrz/YoutubeExplode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConversionRequestBuilder.cs
107 lines (93 loc) · 3 KB
/
ConversionRequestBuilder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using YoutubeExplode.Converter.Utils.Extensions;
using YoutubeExplode.Videos.Streams;
namespace YoutubeExplode.Converter;
/// <summary>
/// Builder for <see cref="ConversionRequest"/>.
/// </summary>
public partial class ConversionRequestBuilder
{
private readonly string _outputFilePath;
private string? _ffmpegCliFilePath;
private Container? _container;
private ConversionPreset _preset;
/// <summary>
/// Initializes an instance of <see cref="ConversionRequestBuilder"/>.
/// </summary>
public ConversionRequestBuilder(string outputFilePath) =>
_outputFilePath = outputFilePath;
private Container GetDefaultContainer() => new(
Path.GetExtension(_outputFilePath).TrimStart('.').NullIfWhiteSpace() ??
"mp4"
);
/// <summary>
/// Sets FFmpeg CLI path.
/// </summary>
public ConversionRequestBuilder SetFFmpegPath(string path)
{
_ffmpegCliFilePath = path;
return this;
}
/// <summary>
/// Sets output container.
/// </summary>
public ConversionRequestBuilder SetContainer(Container container)
{
_container = container;
return this;
}
/// <summary>
/// Sets output container.
/// </summary>
public ConversionRequestBuilder SetContainer(string container) =>
SetContainer(new Container(container));
/// <summary>
/// Sets conversion format.
/// </summary>
[Obsolete("Use SetContainer instead."), ExcludeFromCodeCoverage]
public ConversionRequestBuilder SetFormat(ConversionFormat format) =>
SetContainer(new Container(format.Name));
/// <summary>
/// Sets conversion format.
/// </summary>
[Obsolete("Use SetContainer instead."), ExcludeFromCodeCoverage]
public ConversionRequestBuilder SetFormat(string format) =>
SetContainer(format);
/// <summary>
/// Sets conversion preset.
/// </summary>
public ConversionRequestBuilder SetPreset(ConversionPreset preset)
{
_preset = preset;
return this;
}
/// <summary>
/// Builds the resulting request.
/// </summary>
public ConversionRequest Build() => new(
_ffmpegCliFilePath ?? DefaultFFmpegCliPathLazy.Value,
_outputFilePath,
_container ?? GetDefaultContainer(),
_preset
);
}
public partial class ConversionRequestBuilder
{
private static readonly Lazy<string> DefaultFFmpegCliPathLazy = new(() =>
// Try to find FFmpeg in the probe directory
Directory
.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory ?? Directory.GetCurrentDirectory())
.FirstOrDefault(f =>
string.Equals(
Path.GetFileNameWithoutExtension(f),
"ffmpeg",
StringComparison.OrdinalIgnoreCase
)
) ??
// Otherwise fallback to just "ffmpeg" and hope it's on the PATH
"ffmpeg"
);
}