Przeglądaj źródła

move common dependencies

Luke Pulverenti 8 lat temu
rodzic
commit
ce38e98791
23 zmienionych plików z 188 dodań i 612 usunięć
  1. 10 117
      MediaBrowser.Common.Implementations/BaseApplicationHost.cs
  2. 0 1
      MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs
  3. 0 1
      MediaBrowser.Common.Implementations/Devices/DeviceId.cs
  4. 0 399
      MediaBrowser.Common.Implementations/IO/LnkShortcutHandler.cs
  5. 1 1
      MediaBrowser.Common.Implementations/IO/ManagedFileSystem.cs
  6. 1 2
      MediaBrowser.Common.Implementations/IO/WindowsFileSystem.cs
  7. 0 22
      MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj
  8. 0 6
      MediaBrowser.Common.Implementations/packages.config
  9. 1 1
      MediaBrowser.Model/Logging/LogHelper.cs
  10. 1 0
      MediaBrowser.Model/MediaBrowser.Model.csproj
  11. 0 2
      MediaBrowser.Providers/Manager/MetadataService.cs
  12. 1 49
      MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs
  13. 0 0
      MediaBrowser.Server.Implementations/Logging/NLogger.cs
  14. 0 0
      MediaBrowser.Server.Implementations/Logging/NlogManager.cs
  15. 7 0
      MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
  16. 3 4
      MediaBrowser.Server.Implementations/Serialization/JsonSerializer.cs
  17. 1 0
      MediaBrowser.Server.Implementations/packages.config
  18. 1 1
      MediaBrowser.Server.Mono/Program.cs
  19. 153 3
      MediaBrowser.Server.Startup.Common/ApplicationHost.cs
  20. 4 0
      MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj
  21. 1 0
      MediaBrowser.Server.Startup.Common/packages.config
  22. 2 2
      MediaBrowser.ServerApplication/MainStartup.cs
  23. 1 1
      MediaBrowser.ServerApplication/Native/LnkShortcutHandler.cs

+ 10 - 117
MediaBrowser.Common.Implementations/BaseApplicationHost.cs

@@ -17,8 +17,6 @@ using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Updates;
-using ServiceStack;
-using SimpleInjector;
 using System;
 using System.Collections.Generic;
 using System.IO;
@@ -41,7 +39,7 @@ namespace MediaBrowser.Common.Implementations
     /// Class BaseApplicationHost
     /// </summary>
     /// <typeparam name="TApplicationPathsType">The type of the T application paths type.</typeparam>
-    public abstract class BaseApplicationHost<TApplicationPathsType> : IApplicationHost, IDependencyContainer
+    public abstract class BaseApplicationHost<TApplicationPathsType> : IApplicationHost
         where TApplicationPathsType : class, IApplicationPaths
     {
         /// <summary>
@@ -84,11 +82,6 @@ namespace MediaBrowser.Common.Implementations
         /// <value>The application paths.</value>
         protected TApplicationPathsType ApplicationPaths { get; private set; }
 
-        /// <summary>
-        /// The container
-        /// </summary>
-        protected readonly Container Container = new Container();
-
         /// <summary>
         /// The json serializer
         /// </summary>
@@ -223,15 +216,6 @@ namespace MediaBrowser.Common.Implementations
         /// <returns>Task.</returns>
         public virtual async Task Init(IProgress<double> progress)
         {
-            try
-            {
-                // https://github.com/ServiceStack/ServiceStack/blob/master/tests/ServiceStack.WebHost.IntegrationTests/Web.config#L4
-                Licensing.RegisterLicense("1001-e1JlZjoxMDAxLE5hbWU6VGVzdCBCdXNpbmVzcyxUeXBlOkJ1c2luZXNzLEhhc2g6UHVNTVRPclhvT2ZIbjQ5MG5LZE1mUTd5RUMzQnBucTFEbTE3TDczVEF4QUNMT1FhNXJMOWkzVjFGL2ZkVTE3Q2pDNENqTkQyUktRWmhvUVBhYTBiekJGUUZ3ZE5aZHFDYm9hL3lydGlwUHI5K1JsaTBYbzNsUC85cjVJNHE5QVhldDN6QkE4aTlvdldrdTgyTk1relY2eis2dFFqTThYN2lmc0JveHgycFdjPSxFeHBpcnk6MjAxMy0wMS0wMX0=");
-            }
-            catch
-            {
-                // Failing under mono
-            }
             progress.Report(1);
 
             JsonSerializer = CreateJsonSerializer();
@@ -328,10 +312,7 @@ namespace MediaBrowser.Common.Implementations
             return builder;
         }
 
-        protected virtual IJsonSerializer CreateJsonSerializer()
-        {
-            return new JsonSerializer(FileSystemManager, LogManager.GetLogger("JsonSerializer"));
-        }
+        protected abstract IJsonSerializer CreateJsonSerializer();
 
         private void SetHttpLimit()
         {
@@ -424,8 +405,6 @@ namespace MediaBrowser.Common.Implementations
         /// </summary>
         protected virtual void FindParts()
         {
-            RegisterModules();
-
             ConfigurationManager.AddParts(GetExports<IConfigurationFactory>());
             Plugins = GetExports<IPlugin>().Select(LoadPlugin).Where(i => i != null).ToArray();
         }
@@ -525,25 +504,6 @@ namespace MediaBrowser.Common.Implementations
             return Task.FromResult(true);
         }
 
-        private void RegisterModules()
-        {
-            var moduleTypes = GetExportTypes<IDependencyModule>();
-
-            foreach (var type in moduleTypes)
-            {
-                try
-                {
-                    var instance = Activator.CreateInstance(type) as IDependencyModule;
-                    if (instance != null)
-                        instance.BindDependencies(this);
-                }
-                catch (Exception ex)
-                {
-                    Logger.ErrorException("Error setting up dependency bindings for " + type.Name, ex);
-                }
-            }
-        }
-
         /// <summary>
         /// Gets a list of types within an assembly
         /// This will handle situations that would normally throw an exception - such as a type within the assembly that depends on some other non-existant reference
@@ -584,43 +544,14 @@ namespace MediaBrowser.Common.Implementations
         /// </summary>
         /// <param name="type">The type.</param>
         /// <returns>System.Object.</returns>
-        public object CreateInstance(Type type)
-        {
-            try
-            {
-                return Container.GetInstance(type);
-            }
-            catch (Exception ex)
-            {
-                Logger.ErrorException("Error creating {0}", ex, type.FullName);
-
-                throw;
-            }
-        }
+        public abstract object CreateInstance(Type type);
 
         /// <summary>
         /// Creates the instance safe.
         /// </summary>
         /// <param name="type">The type.</param>
         /// <returns>System.Object.</returns>
-        protected object CreateInstanceSafe(Type type)
-        {
-            try
-            {
-                return Container.GetInstance(type);
-            }
-            catch (Exception ex)
-            {
-                Logger.ErrorException("Error creating {0}", ex, type.FullName);
-                // Don't blow up in release mode
-                return null;
-            }
-        }
-
-        void IDependencyContainer.RegisterSingleInstance<T>(T obj, bool manageLifetime)
-        {
-            RegisterSingleInstance(obj, manageLifetime);
-        }
+        protected abstract object CreateInstanceSafe(Type type);
 
         /// <summary>
         /// Registers the specified obj.
@@ -628,68 +559,30 @@ namespace MediaBrowser.Common.Implementations
         /// <typeparam name="T"></typeparam>
         /// <param name="obj">The obj.</param>
         /// <param name="manageLifetime">if set to <c>true</c> [manage lifetime].</param>
-        protected void RegisterSingleInstance<T>(T obj, bool manageLifetime = true)
-            where T : class
-        {
-            Container.RegisterSingleton(obj);
-
-            if (manageLifetime)
-            {
-                var disposable = obj as IDisposable;
-
-                if (disposable != null)
-                {
-                    DisposableParts.Add(disposable);
-                }
-            }
-        }
-
-        void IDependencyContainer.RegisterSingleInstance<T>(Func<T> func)
-        {
-            RegisterSingleInstance(func);
-        }
+        protected abstract void RegisterSingleInstance<T>(T obj, bool manageLifetime = true)
+            where T : class;
 
         /// <summary>
         /// Registers the single instance.
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="func">The func.</param>
-        protected void RegisterSingleInstance<T>(Func<T> func)
-            where T : class
-        {
-            Container.RegisterSingleton(func);
-        }
-
-        void IDependencyContainer.Register(Type typeInterface, Type typeImplementation)
-        {
-            Container.Register(typeInterface, typeImplementation);
-        }
+        protected abstract void RegisterSingleInstance<T>(Func<T> func)
+            where T : class;
 
         /// <summary>
         /// Resolves this instance.
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <returns>``0.</returns>
-        public T Resolve<T>()
-        {
-            return (T)Container.GetRegistration(typeof(T), true).GetInstance();
-        }
+        public abstract T Resolve<T>();
 
         /// <summary>
         /// Resolves this instance.
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <returns>``0.</returns>
-        public T TryResolve<T>()
-        {
-            var result = Container.GetRegistration(typeof(T), false);
-
-            if (result == null)
-            {
-                return default(T);
-            }
-            return (T)result.GetInstance();
-        }
+        public abstract T TryResolve<T>();
 
         /// <summary>
         /// Loads the assembly.

+ 0 - 1
MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs

@@ -11,7 +11,6 @@ using System.Linq;
 using System.Threading;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
 
 namespace MediaBrowser.Common.Implementations.Configuration
 {

+ 0 - 1
MediaBrowser.Common.Implementations/Devices/DeviceId.cs

@@ -3,7 +3,6 @@ using MediaBrowser.Model.Logging;
 using System;
 using System.IO;
 using System.Text;
-using MediaBrowser.Common.IO;
 using MediaBrowser.Model.IO;
 
 namespace MediaBrowser.Common.Implementations.Devices

+ 0 - 399
MediaBrowser.Common.Implementations/IO/LnkShortcutHandler.cs

@@ -1,399 +0,0 @@
-using System;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Security;
-using System.Text;
-using MediaBrowser.Model.IO;
-
-namespace MediaBrowser.Common.Implementations.IO
-{
-    public class LnkShortcutHandler :IShortcutHandler
-    {
-        public string Extension
-        {
-            get { return ".lnk"; }
-        }
-
-        public string Resolve(string shortcutPath)
-        {
-            var link = new ShellLink();
-            ((IPersistFile)link).Load(shortcutPath, NativeMethods.STGM_READ);
-            // ((IShellLinkW)link).Resolve(hwnd, 0) 
-            var sb = new StringBuilder(NativeMethods.MAX_PATH);
-            WIN32_FIND_DATA data;
-            ((IShellLinkW)link).GetPath(sb, sb.Capacity, out data, 0);
-            return sb.ToString();
-        }
-
-        public void Create(string shortcutPath, string targetPath)
-        {
-            throw new NotImplementedException();
-        }
-    }
-
-    /// <summary>
-    /// Class NativeMethods
-    /// </summary>
-    [SuppressUnmanagedCodeSecurity]
-    public static class NativeMethods
-    {
-        /// <summary>
-        /// The MA x_ PATH
-        /// </summary>
-        public const int MAX_PATH = 260;
-        /// <summary>
-        /// The MA x_ ALTERNATE
-        /// </summary>
-        public const int MAX_ALTERNATE = 14;
-        /// <summary>
-        /// The INVALI d_ HANDL e_ VALUE
-        /// </summary>
-        public static IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
-        /// <summary>
-        /// The STG m_ READ
-        /// </summary>
-        public const uint STGM_READ = 0;
-    }
-
-    /// <summary>
-    /// Struct FILETIME
-    /// </summary>
-    [StructLayout(LayoutKind.Sequential)]
-    public struct FILETIME
-    {
-        /// <summary>
-        /// The dw low date time
-        /// </summary>
-        public uint dwLowDateTime;
-        /// <summary>
-        /// The dw high date time
-        /// </summary>
-        public uint dwHighDateTime;
-    }
-
-    /// <summary>
-    /// Struct WIN32_FIND_DATA
-    /// </summary>
-    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
-    public struct WIN32_FIND_DATA
-    {
-        /// <summary>
-        /// The dw file attributes
-        /// </summary>
-        public FileAttributes dwFileAttributes;
-        /// <summary>
-        /// The ft creation time
-        /// </summary>
-        public FILETIME ftCreationTime;
-        /// <summary>
-        /// The ft last access time
-        /// </summary>
-        public FILETIME ftLastAccessTime;
-        /// <summary>
-        /// The ft last write time
-        /// </summary>
-        public FILETIME ftLastWriteTime;
-        /// <summary>
-        /// The n file size high
-        /// </summary>
-        public int nFileSizeHigh;
-        /// <summary>
-        /// The n file size low
-        /// </summary>
-        public int nFileSizeLow;
-        /// <summary>
-        /// The dw reserved0
-        /// </summary>
-        public int dwReserved0;
-        /// <summary>
-        /// The dw reserved1
-        /// </summary>
-        public int dwReserved1;
-
-        /// <summary>
-        /// The c file name
-        /// </summary>
-        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NativeMethods.MAX_PATH)]
-        public string cFileName;
-
-        /// <summary>
-        /// This will always be null when FINDEX_INFO_LEVELS = basic
-        /// </summary>
-        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NativeMethods.MAX_ALTERNATE)]
-        public string cAlternate;
-
-        /// <summary>
-        /// Gets or sets the path.
-        /// </summary>
-        /// <value>The path.</value>
-        public string Path { get; set; }
-
-        /// <summary>
-        /// Returns a <see cref="System.String" /> that represents this instance.
-        /// </summary>
-        /// <returns>A <see cref="System.String" /> that represents this instance.</returns>
-        public override string ToString()
-        {
-            return Path ?? string.Empty;
-        }
-    }
-
-    /// <summary>
-    /// Enum SLGP_FLAGS
-    /// </summary>
-    [Flags]
-    public enum SLGP_FLAGS
-    {
-        /// <summary>
-        /// Retrieves the standard short (8.3 format) file name
-        /// </summary>
-        SLGP_SHORTPATH = 0x1,
-        /// <summary>
-        /// Retrieves the Universal Naming Convention (UNC) path name of the file
-        /// </summary>
-        SLGP_UNCPRIORITY = 0x2,
-        /// <summary>
-        /// Retrieves the raw path name. A raw path is something that might not exist and may include environment variables that need to be expanded
-        /// </summary>
-        SLGP_RAWPATH = 0x4
-    }
-    /// <summary>
-    /// Enum SLR_FLAGS
-    /// </summary>
-    [Flags]
-    public enum SLR_FLAGS
-    {
-        /// <summary>
-        /// Do not display a dialog box if the link cannot be resolved. When SLR_NO_UI is set,
-        /// the high-order word of fFlags can be set to a time-out value that specifies the
-        /// maximum amount of time to be spent resolving the link. The function returns if the
-        /// link cannot be resolved within the time-out duration. If the high-order word is set
-        /// to zero, the time-out duration will be set to the default value of 3,000 milliseconds
-        /// (3 seconds). To specify a value, set the high word of fFlags to the desired time-out
-        /// duration, in milliseconds.
-        /// </summary>
-        SLR_NO_UI = 0x1,
-        /// <summary>
-        /// Obsolete and no longer used
-        /// </summary>
-        SLR_ANY_MATCH = 0x2,
-        /// <summary>
-        /// If the link object has changed, update its path and list of identifiers.
-        /// If SLR_UPDATE is set, you do not need to call IPersistFile::IsDirty to determine
-        /// whether or not the link object has changed.
-        /// </summary>
-        SLR_UPDATE = 0x4,
-        /// <summary>
-        /// Do not update the link information
-        /// </summary>
-        SLR_NOUPDATE = 0x8,
-        /// <summary>
-        /// Do not execute the search heuristics
-        /// </summary>
-        SLR_NOSEARCH = 0x10,
-        /// <summary>
-        /// Do not use distributed link tracking
-        /// </summary>
-        SLR_NOTRACK = 0x20,
-        /// <summary>
-        /// Disable distributed link tracking. By default, distributed link tracking tracks
-        /// removable media across multiple devices based on the volume name. It also uses the
-        /// Universal Naming Convention (UNC) path to track remote file systems whose drive letter
-        /// has changed. Setting SLR_NOLINKINFO disables both types of tracking.
-        /// </summary>
-        SLR_NOLINKINFO = 0x40,
-        /// <summary>
-        /// Call the Microsoft Windows Installer
-        /// </summary>
-        SLR_INVOKE_MSI = 0x80
-    }
-
-    /// <summary>
-    /// The IShellLink interface allows Shell links to be created, modified, and resolved
-    /// </summary>
-    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("000214F9-0000-0000-C000-000000000046")]
-    public interface IShellLinkW
-    {
-        /// <summary>
-        /// Retrieves the path and file name of a Shell link object
-        /// </summary>
-        /// <param name="pszFile">The PSZ file.</param>
-        /// <param name="cchMaxPath">The CCH max path.</param>
-        /// <param name="pfd">The PFD.</param>
-        /// <param name="fFlags">The f flags.</param>
-        void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out WIN32_FIND_DATA pfd, SLGP_FLAGS fFlags);
-        /// <summary>
-        /// Retrieves the list of item identifiers for a Shell link object
-        /// </summary>
-        /// <param name="ppidl">The ppidl.</param>
-        void GetIDList(out IntPtr ppidl);
-        /// <summary>
-        /// Sets the pointer to an item identifier list (PIDL) for a Shell link object.
-        /// </summary>
-        /// <param name="pidl">The pidl.</param>
-        void SetIDList(IntPtr pidl);
-        /// <summary>
-        /// Retrieves the description string for a Shell link object
-        /// </summary>
-        /// <param name="pszName">Name of the PSZ.</param>
-        /// <param name="cchMaxName">Name of the CCH max.</param>
-        void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
-        /// <summary>
-        /// Sets the description for a Shell link object. The description can be any application-defined string
-        /// </summary>
-        /// <param name="pszName">Name of the PSZ.</param>
-        void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
-        /// <summary>
-        /// Retrieves the name of the working directory for a Shell link object
-        /// </summary>
-        /// <param name="pszDir">The PSZ dir.</param>
-        /// <param name="cchMaxPath">The CCH max path.</param>
-        void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
-        /// <summary>
-        /// Sets the name of the working directory for a Shell link object
-        /// </summary>
-        /// <param name="pszDir">The PSZ dir.</param>
-        void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
-        /// <summary>
-        /// Retrieves the command-line arguments associated with a Shell link object
-        /// </summary>
-        /// <param name="pszArgs">The PSZ args.</param>
-        /// <param name="cchMaxPath">The CCH max path.</param>
-        void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
-        /// <summary>
-        /// Sets the command-line arguments for a Shell link object
-        /// </summary>
-        /// <param name="pszArgs">The PSZ args.</param>
-        void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
-        /// <summary>
-        /// Retrieves the hot key for a Shell link object
-        /// </summary>
-        /// <param name="pwHotkey">The pw hotkey.</param>
-        void GetHotkey(out short pwHotkey);
-        /// <summary>
-        /// Sets a hot key for a Shell link object
-        /// </summary>
-        /// <param name="wHotkey">The w hotkey.</param>
-        void SetHotkey(short wHotkey);
-        /// <summary>
-        /// Retrieves the show command for a Shell link object
-        /// </summary>
-        /// <param name="piShowCmd">The pi show CMD.</param>
-        void GetShowCmd(out int piShowCmd);
-        /// <summary>
-        /// Sets the show command for a Shell link object. The show command sets the initial show state of the window.
-        /// </summary>
-        /// <param name="iShowCmd">The i show CMD.</param>
-        void SetShowCmd(int iShowCmd);
-        /// <summary>
-        /// Retrieves the location (path and index) of the icon for a Shell link object
-        /// </summary>
-        /// <param name="pszIconPath">The PSZ icon path.</param>
-        /// <param name="cchIconPath">The CCH icon path.</param>
-        /// <param name="piIcon">The pi icon.</param>
-        void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath,
-            int cchIconPath, out int piIcon);
-        /// <summary>
-        /// Sets the location (path and index) of the icon for a Shell link object
-        /// </summary>
-        /// <param name="pszIconPath">The PSZ icon path.</param>
-        /// <param name="iIcon">The i icon.</param>
-        void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
-        /// <summary>
-        /// Sets the relative path to the Shell link object
-        /// </summary>
-        /// <param name="pszPathRel">The PSZ path rel.</param>
-        /// <param name="dwReserved">The dw reserved.</param>
-        void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
-        /// <summary>
-        /// Attempts to find the target of a Shell link, even if it has been moved or renamed
-        /// </summary>
-        /// <param name="hwnd">The HWND.</param>
-        /// <param name="fFlags">The f flags.</param>
-        void Resolve(IntPtr hwnd, SLR_FLAGS fFlags);
-        /// <summary>
-        /// Sets the path and file name of a Shell link object
-        /// </summary>
-        /// <param name="pszFile">The PSZ file.</param>
-        void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
-
-    }
-
-    /// <summary>
-    /// Interface IPersist
-    /// </summary>
-    [ComImport, Guid("0000010c-0000-0000-c000-000000000046"),
-    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
-    public interface IPersist
-    {
-        /// <summary>
-        /// Gets the class ID.
-        /// </summary>
-        /// <param name="pClassID">The p class ID.</param>
-        [PreserveSig]
-        void GetClassID(out Guid pClassID);
-    }
-
-    /// <summary>
-    /// Interface IPersistFile
-    /// </summary>
-    [ComImport, Guid("0000010b-0000-0000-C000-000000000046"),
-    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
-    public interface IPersistFile : IPersist
-    {
-        /// <summary>
-        /// Gets the class ID.
-        /// </summary>
-        /// <param name="pClassID">The p class ID.</param>
-        new void GetClassID(out Guid pClassID);
-        /// <summary>
-        /// Determines whether this instance is dirty.
-        /// </summary>
-        [PreserveSig]
-        int IsDirty();
-
-        /// <summary>
-        /// Loads the specified PSZ file name.
-        /// </summary>
-        /// <param name="pszFileName">Name of the PSZ file.</param>
-        /// <param name="dwMode">The dw mode.</param>
-        [PreserveSig]
-        void Load([In, MarshalAs(UnmanagedType.LPWStr)]
-            string pszFileName, uint dwMode);
-
-        /// <summary>
-        /// Saves the specified PSZ file name.
-        /// </summary>
-        /// <param name="pszFileName">Name of the PSZ file.</param>
-        /// <param name="remember">if set to <c>true</c> [remember].</param>
-        [PreserveSig]
-        void Save([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName,
-            [In, MarshalAs(UnmanagedType.Bool)] bool remember);
-
-        /// <summary>
-        /// Saves the completed.
-        /// </summary>
-        /// <param name="pszFileName">Name of the PSZ file.</param>
-        [PreserveSig]
-        void SaveCompleted([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName);
-
-        /// <summary>
-        /// Gets the cur file.
-        /// </summary>
-        /// <param name="ppszFileName">Name of the PPSZ file.</param>
-        [PreserveSig]
-        void GetCurFile([In, MarshalAs(UnmanagedType.LPWStr)] string ppszFileName);
-    }
-
-    // CLSID_ShellLink from ShlGuid.h 
-    /// <summary>
-    /// Class ShellLink
-    /// </summary>
-    [
-        ComImport,
-        Guid("00021401-0000-0000-C000-000000000046")
-    ]
-    public class ShellLink
-    {
-    }
-}

+ 1 - 1
MediaBrowser.Common.Implementations/IO/ManagedFileSystem.cs

@@ -5,7 +5,7 @@ using System.Linq;
 using System.Text;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Model.IO;
-using Patterns.Logging;
+using MediaBrowser.Model.Logging;
 
 namespace MediaBrowser.Common.Implementations.IO
 {

+ 1 - 2
MediaBrowser.Common.Implementations/IO/WindowsFileSystem.cs

@@ -1,4 +1,4 @@
-using Patterns.Logging;
+using MediaBrowser.Model.Logging;
 
 namespace MediaBrowser.Common.Implementations.IO
 {
@@ -7,7 +7,6 @@ namespace MediaBrowser.Common.Implementations.IO
         public WindowsFileSystem(ILogger logger)
             : base(logger, true, true)
         {
-            AddShortcutHandler(new LnkShortcutHandler());
             EnableFileSystemRequestConcat = false;
         }
     }

+ 0 - 22
MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj

@@ -45,26 +45,12 @@
     <RunPostBuildEvent>Always</RunPostBuildEvent>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
-      <HintPath>..\packages\NLog.4.3.10\lib\net45\NLog.dll</HintPath>
-      <Private>True</Private>
-    </Reference>
-    <Reference Include="Patterns.Logging">
-      <HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath>
-    </Reference>
-    <Reference Include="SimpleInjector, Version=3.2.4.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
-      <HintPath>..\packages\SimpleInjector.3.2.4\lib\net45\SimpleInjector.dll</HintPath>
-      <Private>True</Private>
-    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Configuration" />
     <Reference Include="System.Core" />
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Net" />
     <Reference Include="System.Xml" />
-    <Reference Include="ServiceStack.Text">
-      <HintPath>..\ThirdParty\ServiceStack.Text\ServiceStack.Text.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="..\SharedVersion.cs">
@@ -79,12 +65,8 @@
     <Compile Include="HttpClientManager\HttpClientInfo.cs" />
     <Compile Include="HttpClientManager\HttpClientManager.cs" />
     <Compile Include="IO\IsoManager.cs" />
-    <Compile Include="IO\LnkShortcutHandler.cs" />
     <Compile Include="IO\ManagedFileSystem.cs" />
     <Compile Include="IO\WindowsFileSystem.cs" />
-    <Compile Include="Logging\LogHelper.cs" />
-    <Compile Include="Logging\NLogger.cs" />
-    <Compile Include="Logging\NlogManager.cs" />
     <Compile Include="Networking\BaseNetworkManager.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="ScheduledTasks\DailyTrigger.cs" />
@@ -102,7 +84,6 @@
     <Compile Include="Security\PluginSecurityManager.cs" />
     <Compile Include="Security\RegRecord.cs" />
     <Compile Include="Security\SuppporterInfoResponse.cs" />
-    <Compile Include="Serialization\JsonSerializer.cs" />
     <Compile Include="Serialization\XmlSerializer.cs" />
     <Compile Include="Updates\GithubUpdater.cs" />
     <Compile Include="Updates\InstallationManager.cs" />
@@ -117,9 +98,6 @@
       <Name>MediaBrowser.Model</Name>
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup>
-    <None Include="packages.config" />
-  </ItemGroup>
   <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>

+ 0 - 6
MediaBrowser.Common.Implementations/packages.config

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
-  <package id="NLog" version="4.3.10" targetFramework="net46" />
-  <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
-  <package id="SimpleInjector" version="3.2.4" targetFramework="net46" />
-</packages>

+ 1 - 1
MediaBrowser.Common.Implementations/Logging/LogHelper.cs → MediaBrowser.Model/Logging/LogHelper.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Text;
 
-namespace MediaBrowser.Common.Implementations.Logging
+namespace MediaBrowser.Model.Logging
 {
     /// <summary>
     /// Class LogHelper

+ 1 - 0
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -142,6 +142,7 @@
     <Compile Include="IO\IShortcutHandler.cs" />
     <Compile Include="IO\StreamDefaults.cs" />
     <Compile Include="Globalization\ILocalizationManager.cs" />
+    <Compile Include="Logging\LogHelper.cs" />
     <Compile Include="MediaInfo\LiveStreamRequest.cs" />
     <Compile Include="MediaInfo\LiveStreamResponse.cs" />
     <Compile Include="MediaInfo\PlaybackInfoRequest.cs" />

+ 0 - 2
MediaBrowser.Providers/Manager/MetadataService.cs

@@ -10,8 +10,6 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Providers;

+ 1 - 49
MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs

@@ -93,44 +93,19 @@ namespace MediaBrowser.Providers.MediaInfo
                 return;
             }
 
-            var failHistoryPath = Path.Combine(_config.ApplicationPaths.CachePath, "subtitlehistory.json");
-            var history = GetHistory(failHistoryPath);
-
             var numComplete = 0;
-            var hasChanges = false;
 
             foreach (var video in videos)
             {
-                DateTime lastAttempt;
-                if (history.TryGetValue(video.Id.ToString("N"), out lastAttempt))
-                {
-                    if ((DateTime.UtcNow - lastAttempt).TotalDays <= 7)
-                    {
-                        continue;
-                    }
-                }
-
                 try
                 {
-                    var shouldRetry = await DownloadSubtitles(video, options, cancellationToken).ConfigureAwait(false);
-
-                    if (shouldRetry)
-                    {
-                        history[video.Id.ToString("N")] = DateTime.UtcNow;
-                    }
-                    else
-                    {
-                        history.Remove(video.Id.ToString("N"));
-                    }
+                    await DownloadSubtitles(video, options, cancellationToken).ConfigureAwait(false);
                 }
                 catch (Exception ex)
                 {
                     _logger.ErrorException("Error downloading subtitles for {0}", ex, video.Path);
-                    history[video.Id.ToString("N")] = DateTime.UtcNow;
                 }
 
-                hasChanges = true;
-
                 // Update progress
                 numComplete++;
                 double percent = numComplete;
@@ -138,29 +113,6 @@ namespace MediaBrowser.Providers.MediaInfo
 
                 progress.Report(100 * percent);
             }
-
-            if (hasChanges)
-            {
-                _json.SerializeToFile(history, failHistoryPath);
-            }
-        }
-
-        private Dictionary<string,DateTime> GetHistory(string path)
-        {
-            try
-            {
-                var result = _json.DeserializeFromFile<Dictionary<string, DateTime>>(path);
-
-                if (result != null)
-                {
-                    return result;
-                }
-            }
-            catch
-            {
-            }
-
-            return new Dictionary<string, DateTime>();
         }
 
         private async Task<bool> DownloadSubtitles(Video video, SubtitleOptions options, CancellationToken cancellationToken)

+ 0 - 0
MediaBrowser.Common.Implementations/Logging/NLogger.cs → MediaBrowser.Server.Implementations/Logging/NLogger.cs


+ 0 - 0
MediaBrowser.Common.Implementations/Logging/NlogManager.cs → MediaBrowser.Server.Implementations/Logging/NlogManager.cs


+ 7 - 0
MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj

@@ -61,6 +61,10 @@
       <HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.1.1.0.0\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll</HintPath>
       <Private>True</Private>
     </Reference>
+    <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
+      <HintPath>..\packages\NLog.4.3.10\lib\net45\NLog.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="Patterns.Logging">
       <HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath>
     </Reference>
@@ -272,6 +276,8 @@
     <Compile Include="LiveTv\TunerHosts\SatIp\TransmissionMode.cs" />
     <Compile Include="LiveTv\TunerHosts\SatIp\Utils.cs" />
     <Compile Include="Localization\LocalizationManager.cs" />
+    <Compile Include="Logging\NLogger.cs" />
+    <Compile Include="Logging\NlogManager.cs" />
     <Compile Include="Logging\PatternsLogger.cs" />
     <Compile Include="MediaEncoder\EncodingManager.cs" />
     <Compile Include="Notifications\IConfigurableNotificationService.cs" />
@@ -281,6 +287,7 @@
     <Compile Include="Persistence\IDbConnector.cs" />
     <Compile Include="Persistence\MediaStreamColumns.cs" />
     <Compile Include="Reflection\AssemblyInfo.cs" />
+    <Compile Include="Serialization\JsonSerializer.cs" />
     <Compile Include="Social\SharingManager.cs" />
     <Compile Include="Social\SharingRepository.cs" />
     <Compile Include="Sorting\StartDateComparer.cs" />

+ 3 - 4
MediaBrowser.Common.Implementations/Serialization/JsonSerializer.cs → MediaBrowser.Server.Implementations/Serialization/JsonSerializer.cs

@@ -1,11 +1,10 @@
-using MediaBrowser.Model.Serialization;
-using System;
+using System;
 using System.IO;
-using MediaBrowser.Common.IO;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Serialization;
 
-namespace MediaBrowser.Common.Implementations.Serialization
+namespace MediaBrowser.Server.Implementations.Serialization
 {
     /// <summary>
     /// Provides a wrapper around third party json serialization.

+ 1 - 0
MediaBrowser.Server.Implementations/packages.config

@@ -5,6 +5,7 @@
   <package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" />
   <package id="MediaBrowser.Naming" version="1.0.0.55" targetFramework="net45" />
   <package id="Microsoft.IO.RecyclableMemoryStream" version="1.1.0.0" targetFramework="net46" />
+  <package id="NLog" version="4.3.10" targetFramework="net46" />
   <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
   <package id="SimpleInjector" version="3.2.4" targetFramework="net46" />
   <package id="SocketHttpListener" version="1.0.0.40" targetFramework="net45" />

+ 1 - 1
MediaBrowser.Server.Mono/Program.cs

@@ -77,7 +77,7 @@ namespace MediaBrowser.Server.Mono
             // Allow all https requests
             ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
 
-            var fileSystem = new ManagedFileSystem(new PatternsLogger(logManager.GetLogger("FileSystem")), false, false);
+            var fileSystem = new ManagedFileSystem(logManager.GetLogger("FileSystem"), false, false);
             fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem));
 
             var nativeApp = new NativeApp(options, logManager.GetLogger("App"));

+ 153 - 3
MediaBrowser.Server.Startup.Common/ApplicationHost.cs

@@ -103,10 +103,10 @@ using MediaBrowser.Common.Implementations.Networking;
 using MediaBrowser.Common.Implementations.Serialization;
 using MediaBrowser.Common.Implementations.Updates;
 using MediaBrowser.Common.IO;
+using MediaBrowser.Common.Plugins;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Extensions;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Model.Activity;
 using MediaBrowser.Model.Globalization;
@@ -119,15 +119,18 @@ using MediaBrowser.Model.Social;
 using MediaBrowser.Model.Xml;
 using MediaBrowser.Server.Implementations.Archiving;
 using MediaBrowser.Server.Implementations.Reflection;
+using MediaBrowser.Server.Implementations.Serialization;
 using MediaBrowser.Server.Implementations.Xml;
 using OpenSubtitlesHandler;
+using ServiceStack;
+using StringExtensions = MediaBrowser.Controller.Extensions.StringExtensions;
 
 namespace MediaBrowser.Server.Startup.Common
 {
     /// <summary>
     /// Class CompositionRoot
     /// </summary>
-    public class ApplicationHost : BaseApplicationHost<ServerApplicationPaths>, IServerApplicationHost
+    public class ApplicationHost : BaseApplicationHost<ServerApplicationPaths>, IServerApplicationHost, IDependencyContainer
     {
         /// <summary>
         /// Gets the server configuration manager.
@@ -234,6 +237,11 @@ namespace MediaBrowser.Server.Startup.Common
 
         internal INativeApp NativeApp { get; set; }
 
+        /// <summary>
+        /// The container
+        /// </summary>
+        protected readonly SimpleInjector.Container Container = new SimpleInjector.Container();
+
         /// <summary>
         /// Initializes a new instance of the <see cref="ApplicationHost" /> class.
         /// </summary>
@@ -399,7 +407,17 @@ namespace MediaBrowser.Server.Startup.Common
 
         protected override IJsonSerializer CreateJsonSerializer()
         {
-            var result = base.CreateJsonSerializer();
+            try
+            {
+                // https://github.com/ServiceStack/ServiceStack/blob/master/tests/ServiceStack.WebHost.IntegrationTests/Web.config#L4
+                Licensing.RegisterLicense("1001-e1JlZjoxMDAxLE5hbWU6VGVzdCBCdXNpbmVzcyxUeXBlOkJ1c2luZXNzLEhhc2g6UHVNTVRPclhvT2ZIbjQ5MG5LZE1mUTd5RUMzQnBucTFEbTE3TDczVEF4QUNMT1FhNXJMOWkzVjFGL2ZkVTE3Q2pDNENqTkQyUktRWmhvUVBhYTBiekJGUUZ3ZE5aZHFDYm9hL3lydGlwUHI5K1JsaTBYbzNsUC85cjVJNHE5QVhldDN6QkE4aTlvdldrdTgyTk1relY2eis2dFFqTThYN2lmc0JveHgycFdjPSxFeHBpcnk6MjAxMy0wMS0wMX0=");
+            }
+            catch
+            {
+                // Failing under mono
+            }
+
+            var result = new JsonSerializer(FileSystemManager, LogManager.GetLogger("JsonSerializer"));
 
             ServiceStack.Text.JsConfig<Movie>.ExcludePropertyNames = new[] { "ShortOverview" };
             ServiceStack.Text.JsConfig<Movie>.ExcludePropertyNames = new[] { "Taglines" };
@@ -1010,6 +1028,8 @@ namespace MediaBrowser.Server.Startup.Common
                 ConfigurationManager.SaveConfiguration();
             }
 
+            RegisterModules();
+
             base.FindParts();
 
             HttpServer.Init(GetExports<IService>(false));
@@ -1686,5 +1706,135 @@ namespace MediaBrowser.Server.Startup.Common
         {
             NativeApp.EnableLoopback(appName);
         }
+
+        private void RegisterModules()
+        {
+            var moduleTypes = GetExportTypes<IDependencyModule>();
+
+            foreach (var type in moduleTypes)
+            {
+                try
+                {
+                    var instance = Activator.CreateInstance(type) as IDependencyModule;
+                    if (instance != null)
+                        instance.BindDependencies(this);
+                }
+                catch (Exception ex)
+                {
+                    Logger.ErrorException("Error setting up dependency bindings for " + type.Name, ex);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Creates an instance of type and resolves all constructor dependancies
+        /// </summary>
+        /// <param name="type">The type.</param>
+        /// <returns>System.Object.</returns>
+        public override object CreateInstance(Type type)
+        {
+            try
+            {
+                return Container.GetInstance(type);
+            }
+            catch (Exception ex)
+            {
+                Logger.ErrorException("Error creating {0}", ex, type.FullName);
+
+                throw;
+            }
+        }
+
+        /// <summary>
+        /// Creates the instance safe.
+        /// </summary>
+        /// <param name="type">The type.</param>
+        /// <returns>System.Object.</returns>
+        protected override object CreateInstanceSafe(Type type)
+        {
+            try
+            {
+                return Container.GetInstance(type);
+            }
+            catch (Exception ex)
+            {
+                Logger.ErrorException("Error creating {0}", ex, type.FullName);
+                // Don't blow up in release mode
+                return null;
+            }
+        }
+
+        void IDependencyContainer.RegisterSingleInstance<T>(T obj, bool manageLifetime)
+        {
+            RegisterSingleInstance(obj, manageLifetime);
+        }
+
+        /// <summary>
+        /// Registers the specified obj.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="obj">The obj.</param>
+        /// <param name="manageLifetime">if set to <c>true</c> [manage lifetime].</param>
+        protected override void RegisterSingleInstance<T>(T obj, bool manageLifetime = true)
+        {
+            Container.RegisterSingleton(obj);
+
+            if (manageLifetime)
+            {
+                var disposable = obj as IDisposable;
+
+                if (disposable != null)
+                {
+                    DisposableParts.Add(disposable);
+                }
+            }
+        }
+
+        void IDependencyContainer.RegisterSingleInstance<T>(Func<T> func)
+        {
+            RegisterSingleInstance(func);
+        }
+
+        /// <summary>
+        /// Registers the single instance.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="func">The func.</param>
+        protected override void RegisterSingleInstance<T>(Func<T> func)
+        {
+            Container.RegisterSingleton(func);
+        }
+
+        void IDependencyContainer.Register(Type typeInterface, Type typeImplementation)
+        {
+            Container.Register(typeInterface, typeImplementation);
+        }
+
+        /// <summary>
+        /// Resolves this instance.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <returns>``0.</returns>
+        public override T Resolve<T>()
+        {
+            return (T)Container.GetRegistration(typeof(T), true).GetInstance();
+        }
+
+        /// <summary>
+        /// Resolves this instance.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <returns>``0.</returns>
+        public override T TryResolve<T>()
+        {
+            var result = Container.GetRegistration(typeof(T), false);
+
+            if (result == null)
+            {
+                return default(T);
+            }
+            return (T)result.GetInstance();
+        }
+
     }
 }

+ 4 - 0
MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj

@@ -48,6 +48,10 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\ThirdParty\ServiceStack.Text\ServiceStack.Text.dll</HintPath>
     </Reference>
+    <Reference Include="SimpleInjector, Version=3.2.4.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+      <HintPath>..\packages\SimpleInjector.3.2.4\lib\net45\SimpleInjector.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Configuration" />
     <Reference Include="System.Core" />

+ 1 - 0
MediaBrowser.Server.Startup.Common/packages.config

@@ -2,4 +2,5 @@
 <packages>
   <package id="Mono.Posix" version="4.0.0.0" targetFramework="net45" />
   <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
+  <package id="SimpleInjector" version="3.2.4" targetFramework="net46" />
 </packages>

+ 2 - 2
MediaBrowser.ServerApplication/MainStartup.cs

@@ -308,9 +308,9 @@ namespace MediaBrowser.ServerApplication
         /// <param name="options">The options.</param>
         private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, bool runService, StartupOptions options)
         {
-            var fileSystem = new WindowsFileSystem(new PatternsLogger(logManager.GetLogger("FileSystem")));
+            var fileSystem = new WindowsFileSystem(logManager.GetLogger("FileSystem"));
+            fileSystem.AddShortcutHandler(new LnkShortcutHandler());
             fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem));
-            //fileSystem.AddShortcutHandler(new LnkShortcutHandler(fileSystem));
 
             var nativeApp = new WindowsApp(fileSystem, _logger)
             {

+ 1 - 1
MediaBrowser.ServerApplication/Native/LnkShortcutHandler.cs

@@ -7,7 +7,7 @@ using MediaBrowser.Model.IO;
 
 namespace MediaBrowser.ServerApplication.Native
 {
-    public class LnkShortcutHandler : IShortcutHandler
+    public class LnkShortcutHandler :IShortcutHandler
     {
         public string Extension
         {