diff --git a/.editorconfig b/.editorconfig
index 398cb36..0adf1e7 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -23,6 +23,10 @@ insert_final_newline = false
#### .NET Coding Conventions ####
[*.{cs,vb}]
+# Diagnostic severity preferences
+dotnet_diagnostic.IDE0058.severity = none
+dotnet_diagnostic.IDE0100.severity = none
+
# Organize usings
dotnet_separate_import_directive_groups = true
dotnet_sort_system_directives_first = true
@@ -59,7 +63,7 @@ dotnet_style_prefer_auto_properties = true:suggestion
dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
-dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = false:silent
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
diff --git a/src/Directory.packages.props b/src/Directory.packages.props
index 5ce8323..0f718b5 100644
--- a/src/Directory.packages.props
+++ b/src/Directory.packages.props
@@ -6,7 +6,15 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/StreamShorts.Console/.editorconfig b/src/StreamShorts.Console/.editorconfig
index 79a8d3d..2dc531e 100644
--- a/src/StreamShorts.Console/.editorconfig
+++ b/src/StreamShorts.Console/.editorconfig
@@ -1,2 +1,2 @@
[*.cs]
-dotnet_diagnostic.CA2007.severity = none
\ No newline at end of file
+dotnet_diagnostic.CA2007.severity = none
diff --git a/src/StreamShorts.Console/Commands/DefaultCommand.cs b/src/StreamShorts.Console/Commands/DefaultCommand.cs
new file mode 100644
index 0000000..60ae4fe
--- /dev/null
+++ b/src/StreamShorts.Console/Commands/DefaultCommand.cs
@@ -0,0 +1,45 @@
+namespace StreamShorts.Console.Commands;
+
+internal class DefaultCommand(
+ IFileSystem fileSystem,
+ IAnsiConsole console
+) : AsyncCommand
+{
+ private readonly IFileSystem _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
+ private readonly IAnsiConsole _console = console ?? throw new ArgumentNullException(nameof(console));
+
+ internal class Settings : CommandSettings
+ {
+ [CommandArgument(0, "[Stream]")]
+ [Description("The path to the stream")]
+ public string Stream { get; init; } = string.Empty;
+ }
+
+ public override ValidationResult Validate(CommandContext context, Settings settings)
+ {
+ if (string.IsNullOrWhiteSpace(settings.Stream))
+ {
+ return ValidationResult.Error("Stream path must be provided.");
+ }
+
+ if (_fileSystem.File.Exists(settings.Stream) is false)
+ {
+ return ValidationResult.Error($"The specified stream file '{settings.Stream}' does not exist.");
+ }
+
+ var fileExtension = _fileSystem.Path.GetExtension(settings.Stream).ToUpperInvariant();
+
+ if (fileExtension != ".MP4")
+ {
+ return ValidationResult.Error("The specified stream file must be an .mp4 file.");
+ }
+
+ return base.Validate(context, settings);
+ }
+
+ public override Task ExecuteAsync(CommandContext context, Settings settings)
+ {
+ _console.Write($"[green]Processing stream:[/] {settings.Stream}");
+ return Task.FromResult(0);
+ }
+}
\ No newline at end of file
diff --git a/src/StreamShorts.Console/Hosting/HostBuilderExtensions.cs b/src/StreamShorts.Console/Hosting/HostBuilderExtensions.cs
new file mode 100644
index 0000000..4b4bdd6
--- /dev/null
+++ b/src/StreamShorts.Console/Hosting/HostBuilderExtensions.cs
@@ -0,0 +1,21 @@
+namespace StreamShorts.Console.Hosting;
+
+internal static class HostBuilderExtensions
+{
+ public static CommandApp BuildApp(this IHostBuilder builder)
+ {
+ var registrar = new TypeRegistrar(builder);
+ var app = new CommandApp(registrar);
+
+ app.Configure(static c =>
+ c.SetExceptionHandler(static (ex, resolver) =>
+ {
+ var console = resolver?.Resolve(typeof(IAnsiConsole)) as IAnsiConsole;
+ console?.WriteLine($"[red]An error occurred while executing the command:[/]");
+ console?.WriteException(ex, ExceptionFormats.ShortenEverything);
+ })
+ );
+
+ return app;
+ }
+}
\ No newline at end of file
diff --git a/src/StreamShorts.Console/Hosting/TypeRegistrar.cs b/src/StreamShorts.Console/Hosting/TypeRegistrar.cs
new file mode 100644
index 0000000..50ab983
--- /dev/null
+++ b/src/StreamShorts.Console/Hosting/TypeRegistrar.cs
@@ -0,0 +1,28 @@
+namespace StreamShorts.Console.Hosting;
+
+internal class TypeRegistrar(IHostBuilder builder) : ITypeRegistrar
+{
+ private readonly IHostBuilder _builder = builder;
+
+ public ITypeResolver Build()
+ {
+ return new TypeResolver(_builder.Build());
+ }
+
+ public void Register(Type service, Type implementation)
+ {
+ _builder.ConfigureServices((_, services) => services.AddSingleton(service, implementation));
+ }
+
+ public void RegisterInstance(Type service, object implementation)
+ {
+ _builder.ConfigureServices((_, services) => services.AddSingleton(service, implementation));
+ }
+
+ public void RegisterLazy(Type service, Func