using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Web; using Ninject; using NLog.Config; using NLog.Targets; using NzbDrone.Core.Instrumentation; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Fakes; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using SubSonic.DataProviders; using SubSonic.Query; using SubSonic.Repository; using NLog; using System.Linq; namespace NzbDrone.Core { public static class CentralDispatch { private static IKernel _kernel; private static readonly Object kernelLock = new object(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public static void BindKernel() { lock (kernelLock) { Logger.Debug("Binding Ninject's Kernel"); _kernel = new StandardKernel(); //Sqlite string connectionString = String.Format("Data Source={0};Version=3;", Path.Combine(AppPath, "nzbdrone.db")); var dbProvider = ProviderFactory.GetProvider(connectionString, "System.Data.SQLite"); //SQLExpress //string connectionString = String.Format(@"server=.\SQLExpress; database=NzbDrone; Trusted_Connection=True;"); //var dbProvider = ProviderFactory.GetProvider(connectionString, "System.Data.SqlClient"); //Sqlite string logConnectionString = String.Format("Data Source={0};Version=3;", Path.Combine(AppPath, "log.db")); var logDbProvider = ProviderFactory.GetProvider(logConnectionString, "System.Data.SQLite"); //SQLExpress //string logConnectionString = String.Format(@"server=.\SQLExpress; database=NzbDroneLogs; Trusted_Connection=True;"); //var logDbProvider = ProviderFactory.GetProvider(logConnectionString, "System.Data.SqlClient"); var logRepository = new SimpleRepository(logDbProvider, SimpleRepositoryOptions.RunMigrations); //dbProvider.ExecuteQuery(new QueryCommand("VACUUM", dbProvider)); dbProvider.Log = new NlogWriter(); dbProvider.LogParams = true; _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().ToMethod(c => new SimpleRepository(dbProvider, SimpleRepositoryOptions.RunMigrations)).InSingletonScope(); _kernel.Bind().ToConstant(logRepository).WhenInjectedInto().InSingletonScope(); _kernel.Bind().ToConstant(logRepository).WhenInjectedInto().InSingletonScope(); ForceMigration(_kernel.Get()); SetupIndexers(_kernel.Get()); //Setup the default set of indexers on start-up SetupDefaultQualityProfiles(_kernel.Get()); //Setup the default QualityProfiles on start-up //Get the Timers going var config = _kernel.Get(); var timer = _kernel.Get(); timer.SetRssSyncTimer(Convert.ToInt32(config.GetValue("SyncFrequency", "15", true))); timer.StartRssSyncTimer(); } } public static String AppPath { get { if (HttpContext.Current != null) { return new DirectoryInfo(HttpContext.Current.Server.MapPath("\\")).FullName; } return Directory.GetCurrentDirectory(); } } public static string ExecutablePath { get { //var uri = new Uri(Assembly.EscapedCodeBase); //return Path.GetDirectoryName(uri.LocalPath); return Directory.GetCurrentDirectory(); } } public static IKernel NinjectKernel { get { if (_kernel == null) { BindKernel(); } return _kernel; } } private static void ForceMigration(IRepository repository) { repository.GetPaged(0, 1); repository.GetPaged(0, 1); repository.GetPaged(0, 1); repository.GetPaged(0, 1); } /// /// This method forces IISExpress process to exit with the host application /// public static void DedicateToHost() { try { Logger.Debug("Attaching to parent process for automatic termination."); var pc = new PerformanceCounter("Process", "Creating Process ID", Process.GetCurrentProcess().ProcessName); var pid = (int)pc.NextValue(); var hostProcess = Process.GetProcessById(pid); hostProcess.EnableRaisingEvents = true; hostProcess.Exited += (delegate { Logger.Info("Host has been terminated. Shutting down web server."); ShutDown(); }); Logger.Debug("Successfully Attached to host. Process ID: {0}", pid); } catch (Exception e) { Logger.Fatal(e); } } private static void ShutDown() { Logger.Info("Shutting down application."); Process.GetCurrentProcess().Kill(); } private static void SetupIndexers(IRepository repository) { //Setup the default providers in the Providers table string nzbMatrixRss = "http://rss.nzbmatrix.com/rss.php?page=download&username={USERNAME}&apikey={APIKEY}&subcat=6&english=1"; string nzbsOrgRss = "http://nzbs.org/rss.php?type=1&dl=1&num=100&i={UID}&h={HASH}"; string nzbsrusRss = "http://www.nzbsrus.com/rssfeed.php?cat=91,75&i={UID}&h={HASH}"; var nzbMatrixIndexer = new Indexer { IndexerName = "NzbMatrix", RssUrl = nzbMatrixRss, ApiUrl = String.Empty, Order = 1 }; var nzbsOrgIndexer = new Indexer { IndexerName = "NzbsOrg", RssUrl = nzbsOrgRss, ApiUrl = String.Empty, Order = 2 }; var nzbsrusIndexer = new Indexer { IndexerName = "Nzbsrus", RssUrl = nzbsrusRss, ApiUrl = String.Empty, Order = 3 }; //NzbMatrix Logger.Debug("Checking for NzbMatrix Indexer"); var nzbMatix = repository.Single("NzbMatrix"); if (nzbMatix == null) { Logger.Debug("Adding new Indexer: NzbMatrix"); repository.Add(nzbMatrixIndexer); } else { Logger.Debug("Updating Indexer: NzbMatrix"); nzbMatix.RssUrl = nzbMatrixIndexer.RssUrl; nzbMatix.ApiUrl = nzbMatrixIndexer.ApiUrl; repository.Update(nzbMatix); } //Nzbs.org Logger.Debug("Checking for Nzbs.org"); var nzbsOrg = repository.Single("NzbsOrg"); if (nzbsOrg == null) { Logger.Debug("Adding new Indexer: Nzbs.org"); repository.Add(nzbsOrgIndexer); } else { Logger.Debug("Updating Indexer: Nzbs.org"); nzbsOrg.RssUrl = nzbsOrgIndexer.RssUrl; nzbsOrg.ApiUrl = nzbsOrgIndexer.ApiUrl; repository.Update(nzbsOrg); } //Nzbsrus Logger.Debug("Checking for Nzbsrus"); var nzbsrus = repository.Single("Nzbsrus"); if (nzbsrus == null) { Logger.Debug("Adding new Indexer: Nzbsrus"); repository.Add(nzbsrusIndexer); } else { Logger.Debug("Updating Indexer: Nzbsrus"); nzbsrus.RssUrl = nzbsOrgIndexer.RssUrl; nzbsrus.ApiUrl = nzbsOrgIndexer.ApiUrl; repository.Update(nzbsrus); } } private static void SetupDefaultQualityProfiles(IRepository repository) { var sdtv = new QualityProfile { Name = "SDTV", Allowed = new List { QualityTypes.TV }, Cutoff = QualityTypes.TV }; var dvd = new QualityProfile { Name = "DVD SD", Allowed = new List { QualityTypes.DVD }, Cutoff = QualityTypes.DVD }; var bdrip = new QualityProfile { Name = "BDRip", Allowed = new List { QualityTypes.BDRip }, Cutoff = QualityTypes.BDRip }; var hdtv = new QualityProfile { Name = "HDTV", Allowed = new List { QualityTypes.HDTV }, Cutoff = QualityTypes.HDTV }; var webdl = new QualityProfile { Name = "WEBDL", Allowed = new List { QualityTypes.WEBDL }, Cutoff = QualityTypes.WEBDL }; var bluray = new QualityProfile { Name = "Bluray", Allowed = new List { QualityTypes.Bluray }, Cutoff = QualityTypes.Bluray }; //Add or Update SDTV Logger.Debug(String.Format("Checking for default QualityProfile: {0}", sdtv.Name)); var sdtvDb = repository.Single(i => i.Name == sdtv.Name); if (sdtvDb == null) { Logger.Debug(String.Format("Adding new default QualityProfile: {0}", sdtv.Name)); repository.Add(sdtv); } else { Logger.Debug(String.Format("Updating default QualityProfile: {0}", sdtv.Name)); sdtv.QualityProfileId = sdtvDb.QualityProfileId; repository.Update(sdtv); } //Add or Update DVD Logger.Debug(String.Format("Checking for default QualityProfile: {0}", dvd.Name)); var dvdDb = repository.Single(i => i.Name == dvd.Name); if (dvdDb == null) { Logger.Debug(String.Format("Adding new default QualityProfile: {0}", dvd.Name)); repository.Add(dvd); } else { Logger.Debug(String.Format("Updating default QualityProfile: {0}", dvd.Name)); dvd.QualityProfileId = dvdDb.QualityProfileId; repository.Update(dvd); } //Add or Update BDRip Logger.Debug(String.Format("Checking for default QualityProfile: {0}", bdrip.Name)); var bdripDb = repository.Single(i => i.Name == bdrip.Name); if (bdripDb == null) { Logger.Debug(String.Format("Adding new default QualityProfile: {0}", bdrip.Name)); repository.Add(bdrip); } else { Logger.Debug(String.Format("Updating default QualityProfile: {0}", bdrip.Name)); bdrip.QualityProfileId = bdripDb.QualityProfileId; repository.Update(bdrip); } //Add or Update HDTV Logger.Debug(String.Format("Checking for default QualityProfile: {0}", hdtv.Name)); var hdtvDb = repository.Single(i => i.Name == hdtv.Name); if (hdtvDb == null) { Logger.Debug(String.Format("Adding new default QualityProfile: {0}", hdtv.Name)); repository.Add(hdtv); } else { Logger.Debug(String.Format("Updating default QualityProfile: {0}", hdtv.Name)); hdtv.QualityProfileId = hdtvDb.QualityProfileId; repository.Update(hdtv); } //Add or Update WEBDL Logger.Debug(String.Format("Checking for default QualityProfile: {0}", webdl.Name)); var webdlDb = repository.Single(i => i.Name == webdl.Name); if (webdlDb == null) { Logger.Debug(String.Format("Adding new default QualityProfile: {0}", webdl.Name)); repository.Add(webdl); } else { Logger.Debug(String.Format("Updating default QualityProfile: {0}", webdl.Name)); webdl.QualityProfileId = webdlDb.QualityProfileId; repository.Update(webdl); } //Add or Update Bluray Logger.Debug(String.Format("Checking for default QualityProfile: {0}", bluray.Name)); var blurayDb = repository.Single(i => i.Name == bluray.Name); if (blurayDb == null) { Logger.Debug(String.Format("Adding new default QualityProfile: {0}", bluray.Name)); repository.Add(bluray); } else { Logger.Debug(String.Format("Updating default QualityProfile: {0}", bluray.Name)); bluray.QualityProfileId = blurayDb.QualityProfileId; repository.Update(bluray); } } } }