diff --git a/MediaBrowser.Controller/Configuration/ServerApplicationPaths.cs b/MediaBrowser.Controller/Configuration/ServerApplicationPaths.cs
index b0c4904c9..874e97aed 100644
--- a/MediaBrowser.Controller/Configuration/ServerApplicationPaths.cs
+++ b/MediaBrowser.Controller/Configuration/ServerApplicationPaths.cs
@@ -1,5 +1,4 @@
using System.IO;
-using System.Reflection;
using MediaBrowser.Common.Configuration;
namespace MediaBrowser.Controller.Configuration
@@ -227,24 +226,7 @@ namespace MediaBrowser.Controller.Configuration
{
if (_FFMpegPath == null)
{
- string filename = "ffmpeg.exe";
-
- _FFMpegPath = Path.Combine(FFMpegDirectory, filename);
-
- // Always re-extract the first time to handle new versions
- if (File.Exists(_FFMpegPath))
- {
- File.Delete(_FFMpegPath);
- }
-
- // Extract exe
- using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MediaBrowser.Controller.FFMpeg." + filename))
- {
- using (FileStream fileStream = new FileStream(_FFMpegPath, FileMode.Create))
- {
- stream.CopyTo(fileStream);
- }
- }
+ _FFMpegPath = Path.Combine(FFMpegDirectory, "ffmpeg.exe");
}
return _FFMpegPath;
@@ -261,24 +243,7 @@ namespace MediaBrowser.Controller.Configuration
{
if (_FFProbePath == null)
{
- string filename = "ffprobe.exe";
-
- _FFProbePath = Path.Combine(FFMpegDirectory, filename);
-
- /*// Always re-extract the first time to handle new versions
- if (File.Exists(_FFProbePath))
- {
- File.Delete(_FFProbePath);
- }
-
- // Extract exe
- using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MediaBrowser.Controller.FFMpeg." + filename))
- {
- using (FileStream fileStream = new FileStream(_FFProbePath, FileMode.Create))
- {
- stream.CopyTo(fileStream);
- }
- }*/
+ _FFProbePath = Path.Combine(FFMpegDirectory, "ffprobe.exe");
}
return _FFProbePath;
diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs
index a6a728698..da0263f6f 100644
--- a/MediaBrowser.Controller/Kernel.cs
+++ b/MediaBrowser.Controller/Kernel.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
+using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
@@ -73,7 +74,10 @@ namespace MediaBrowser.Controller
progress.Report(new TaskProgress() { Description = "Loading Users", PercentComplete = 15 });
ReloadUsers();
- progress.Report(new TaskProgress() { Description = "Loading Media Library", PercentComplete = 20 });
+ progress.Report(new TaskProgress() { Description = "Extracting FFMpeg", PercentComplete = 20 });
+ await ExtractFFMpeg();
+
+ progress.Report(new TaskProgress() { Description = "Loading Media Library", PercentComplete = 25 });
await ReloadRoot();
progress.Report(new TaskProgress() { Description = "Loading Complete", PercentComplete = 100 });
@@ -252,8 +256,12 @@ namespace MediaBrowser.Controller
return list;
}
+ ///
+ /// Runs all metadata providers for an entity
+ ///
internal async Task ExecuteMetadataProviders(BaseEntity item, ItemResolveEventArgs args)
{
+ // Get all supported providers
var supportedProviders = Kernel.Instance.MetadataProviders.Where(i => i.Supports(item));
// Start with non-internet providers. Run them sequentially
@@ -273,6 +281,34 @@ namespace MediaBrowser.Controller
}
}
+ ///
+ /// Run these during Init.
+ /// Can't run do this on-demand because there will be multiple workers accessing them at once and we'd have to lock them
+ ///
+ private async Task ExtractFFMpeg()
+ {
+ // FFMpeg.exe
+ await ExtractFFMpeg(ApplicationPaths.FFMpegPath);
+ await ExtractFFMpeg(ApplicationPaths.FFProbePath);
+ }
+
+ private async Task ExtractFFMpeg(string exe)
+ {
+ if (File.Exists(exe))
+ {
+ File.Delete(exe);
+ }
+
+ // Extract exe
+ using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MediaBrowser.Controller.FFMpeg." + Path.GetFileName(exe)))
+ {
+ using (FileStream fileStream = new FileStream(exe, FileMode.Create))
+ {
+ await stream.CopyToAsync(fileStream);
+ }
+ }
+ }
+
protected override void DisposeComposableParts()
{
base.DisposeComposableParts();