public static void Main(string[] args) { // load the default setup from an embeded resource var setup = new Setup(); // get the config file from args string configFile = null; bool interactive = false; bool checkDB = false; for (int i = 0; i < args.Length; i++) { if ((args[i] == "-c") || (args[i] == "--configFile")) { configFile = args[++i]; } else if (args[i] == "-i") { interactive = true; } else if ((args[i] == "-d") || (args[i] == "--checkDB")) { checkDB = true; } } // load the current setup if (configFile != null) { using (FileStream stream = File.OpenRead(configFile)) setup = JsonValue.ParseToObject <Setup>(ReadWithoutComment(stream)); Console.WriteLine("Setup loaded from '" + configFile + "'"); } else { Console.WriteLine("Default setup loaded"); } string dbUrl = setup.database.url; // quick check to validate the currents models. // If not compatible with the DB Schema. STOP HERE if (!DB.CheckDBModels(new Dictionary <string, string>() { ["DEFAULT"] = dbUrl, ["DOCS"] = setup.doc.url })) { return; } // if only check DB is asked, stop here if (checkDB) { return; } if (!System.IO.Directory.Exists(setup.server.temporaryDirectory)) { System.IO.Directory.CreateDirectory(setup.server.temporaryDirectory); } // clean the temporary dir foreach (var file in System.IO.Directory.EnumerateFiles(setup.server.temporaryDirectory)) { File.Delete(file); } var logger = new Logger(setup.log, setup.mail); var server = new Server(setup.server.port, logger); server.StopOnException = setup.server.stopOnException; server.AllowGZip = setup.http.allowGZip; server.KeepAliveMax = setup.http.keepAliveMax; server.KeepAliveTimeout = setup.http.keepAliveTimeout; var sessions = new Sessions( dbUrl, setup.authentication.session.timeout, setup.authentication.session.longTimeout, setup.authentication.session.cookie); var contextInjector = new ContextInjector(); server.Add(contextInjector); var longTaskScheduler = new Utils.PriorityTaskScheduler(2); var mapper = new PathMapper(); server.Add(mapper); mapper.Add("/api/sessions", sessions); mapper.Add("/api/subjects", new Subjects(dbUrl)); mapper.Add("/api/grades", new Grades(dbUrl)); var applications = new Applications(dbUrl); mapper.Add("/api/applications", applications); mapper.Add("/api/resources", new Resources(dbUrl, setup.server.storage)); mapper.Add("/api/structures_resources", new StructuresResources(dbUrl)); mapper.Add("/api/profiles_types", new ProfilesTypes(dbUrl)); mapper.Add("/api/profiles", new Profiles(dbUrl)); mapper.Add("/api/emails", new Emails(dbUrl)); mapper.Add("/api/phones", new Phones(dbUrl)); mapper.Add("/api/groups", new Groups(dbUrl)); mapper.Add("/api/groups_users", new GroupsUsers(dbUrl)); mapper.Add("/api/groups_grades", new GroupsGrades(dbUrl)); mapper.Add("/api/structures_types", new StructuresTypes(dbUrl)); mapper.Add("/api/structures", new Structures(dbUrl, setup.server.storage)); mapper.Add("/api/user_links", new UserLinks(dbUrl)); var users = new Users(dbUrl, setup.server.storage, setup.authentication.masterPassword); mapper.Add("/api/users", users); mapper.Add("/api/users_extended", new UsersExtended(dbUrl)); mapper.Add("/api/sso", new Sso(dbUrl, users)); mapper.Add("/api/tiles", new Tiles(dbUrl)); mapper.Add("/api/flux", new PortailFlux(dbUrl)); mapper.Add("/api/news", new PortailNews(dbUrl)); mapper.Add("/api/users", new PortailRss(dbUrl)); mapper.Add("/api/logs", new Logs(dbUrl)); mapper.Add("/api/browser_logs", new BrowserLogs(dbUrl)); mapper.Add("/api/ent", new Ents(dbUrl)); mapper.Add("/api/publipostages", new Publipostages(dbUrl, setup.mail)); mapper.Add("/api/structures", new StructureRss(logger, dbUrl)); mapper.Add("/api/avatar/user", new StaticFiles( Path.Combine(setup.server.storage, "avatar"), setup.http.defaultCacheDuration)); mapper.Add("/sso", new Cas(logger, dbUrl, sessions, users, setup.authentication, setup.mail, setup.sms, setup.gar)); //mapper.Add("/sso/oidc", new OidcSso(setup.authentication.oidcSso, users, cas)); mapper.Add("/api/aaf/synchronizations", new AafSyncService( dbUrl, setup.aaf.logPath, logger, setup.aaf.path, setup.aaf.zipPath, setup.aaf.logPath)); mapper.Add("/api/aaf", new Aaf.Aaf(dbUrl, setup.aaf.path, setup.aaf.zipPath)); mapper.Add("/api/setup", new SetupService(setup)); mapper.Add("/api/manage", new Manage.ManageService(longTaskScheduler)); mapper.Add("/api/users", new Mail.ImapCheck(dbUrl)); mapper.Add("/api/mailboxes", new Mail.Mailboxes(dbUrl, setup.mail.server.path)); var blobs = new Blobs(logger, setup.doc.url, Path.Combine(setup.server.storage, "blobs"), setup.server.temporaryDirectory); mapper.Add("/api/blobs", blobs); var onlyOfficeSessions = new OnlyOfficeSessions(logger, setup.doc.url, setup.server.publicUrl); mapper.Add("/api/docs/onlyoffice/sessions", onlyOfficeSessions); var videoEncoder = new VideoEncoderService(longTaskScheduler); mapper.Add("/api/videoencoder", videoEncoder); var audioEncoder = new AudioEncoderService(longTaskScheduler); mapper.Add("/api/audioencoder", audioEncoder); var docs = new Docs(logger, setup.doc.url, setup.doc.path, setup.server.temporaryDirectory, blobs, setup.http.defaultCacheDuration, dbUrl, setup, longTaskScheduler, videoEncoder, audioEncoder); mapper.Add("/api/docs", docs); //mapper.Add("/api/icons", new Icons(dbUrl)); mapper.Add("/api/icons", new StaticIcons(setup.server.publicIcons, setup.http.defaultCacheDuration)); mapper.Add("/api/sso_clients", new SsoClients(dbUrl)); mapper.Add("/api/sso_clients_urls", new SsoClientsUrls(dbUrl)); mapper.Add("/api/sso_clients_attributes", new SsoClientsAttributes(dbUrl)); var smsService = new Sms.SmsService(logger, dbUrl, setup.sms); mapper.Add("/api/sms", smsService); mapper.Add("/api/bonapp", new BonApp.BonAppService(setup.restaurant.bonApp)); mapper.Add("/api/book_allocations", new Textbook.BookAllocations(dbUrl)); mapper.Add("/api/edulib", new Textbook.EduLibService(setup.textbook.eduLib, dbUrl)); mapper.Add("/api/gar", new GAR.Resources(setup.gar, logger)); mapper.Add("/docs", new ElFinder(setup.doc.url, setup.doc.path, setup.server.temporaryDirectory, blobs, setup.http.defaultCacheDuration, dbUrl, setup, docs)); // if the request is not already handled, try static files server.Add(new StaticFiles(setup.server.publicFiles, setup.http.defaultCacheDuration)); // inject some object needed for the HttpContextExtensions and ContextExtensions contextInjector.Inject("users", users); contextInjector.Inject("sessions", sessions); contextInjector.Inject("applications", applications); contextInjector.Inject("publicUrl", setup.server.publicUrl); contextInjector.Inject("setup", setup); // start a day scheduler to run the AAF sync task var dayScheduler = new Scheduler.DayScheduler(logger); foreach (var dayRun in setup.aaf.runs) { dayScheduler.Add(new Scheduler.DaySchedule { Day = dayRun.day, Time = dayRun.time, // schedule the AAF synchronization task Action = () => Synchronizer.DaySyncTask( logger, setup.aaf.path, setup.aaf.zipPath, setup.aaf.logPath, dbUrl) }); } server.Start(); if (interactive) { Console.WriteLine("Press 'Q' to stop..."); while (Console.ReadKey().Key != ConsoleKey.Q) { } } else { Console.WriteLine("Press 'Ctrl + C' to stop..."); // catch signals for service stop var signals = new UnixSignal[] { new UnixSignal(Signum.SIGINT), new UnixSignal(Signum.SIGTERM), new UnixSignal(Signum.SIGUSR2), }; Signum signal; bool run = true; do { var index = UnixSignal.WaitAny(signals, -1); signal = signals[index].Signum; switch (signal) { case Signum.SIGINT: run = false; break; case Signum.SIGTERM: run = false; break; case Signum.SIGUSR2: run = false; break; } } while (run); } server.Stop(); dayScheduler.Dispose(); blobs.Dispose(); smsService.Dispose(); onlyOfficeSessions.Dispose(); }
private async Task <string> EncodeMediaInfoAsync(MediaAnalyzeInfo mediaInfo) { if (mediaInfo == null) { txtMediaInfo.Clear(); return(""); } // Sanity check if (!mediaInfo.NeedsVideoReencode && !mediaInfo.NeedsAudioReencode) { return(""); } // Log EncodeLog($"Start Encoding: {mediaInfo.Filename}"); txtMediaInfo.Text = GetMediaInfoAnalysis(mediaInfo); string videoOutputFileName = ""; // Encode video if (mediaInfo.NeedsVideoReencode) { EncodeLog($"Video Encoding: {mediaInfo.Filename}..."); X264VideoEncoderService videoEncoderService = ServiceFactory.GetService <X264VideoEncoderService>(); int res = await Task.Run(() => videoEncoderService.Encode( mediaInfo, @"E:\Programs\MeGUI\tools\x264\x264.exe", new Action <string>((log) => EncodeLog(log)), new Action <string>((progress) => EncodeProgress(progress)), out videoOutputFileName) ); if (res != 0) { EncodeLog($"Video Encoder failed for {mediaInfo.Filename}! Exit code : {res}"); return(""); } } string audioOutputFileName = ""; // Encode Audio if (mediaInfo.NeedsAudioReencode) { EncodeLog($"Audio Encoding: {mediaInfo.Filename}..."); AudioEncoderService audioEncoderService = ServiceFactory.GetService <AudioEncoderService>(); NeroAacAudioEncoder audioEncoder = new NeroAacAudioEncoder(@"E:\Programs\MeGUI\tools\eac3to\neroAacEnc.exe"); DefaultAudioEncoderSettings audioEncoderSettings = new DefaultAudioEncoderSettings(-1, "m4a"); int res = await Task.Run(() => audioEncoderService.Encode( mediaInfo, audioEncoder, audioEncoderSettings, new Action <string>((log) => EncodeLog(log)), new Action <string>((progress) => EncodeProgress(progress)), out audioOutputFileName) ); if (res != 0) { EncodeLog($"Audio Encoder failed for {mediaInfo.Filename}! Exit code : {res}"); return(""); } } // Mux final video! EncodeLog($"Muxing: {mediaInfo.Filename}..."); DefaultMuxerSettings muxerSettings = new DefaultMuxerSettings( videoOutputFileName, mediaInfo.NeedsAudioReencode ? audioOutputFileName : mediaInfo.Filename, "mkv" ); MkvMergeMuxer muxer = new MkvMergeMuxer(@"C:\Program Files\MKVToolNix\mkvmerge.exe"); MkvMergeMuxerService mkvMergeMuxerService = new MkvMergeMuxerService(); string muxedFilename = ""; await Task.Run(() => mkvMergeMuxerService.Mux( muxer, muxerSettings, new Action <string>((log) => EncodeLog(log)), new Action <string>((progress) => EncodeProgress(progress)), out muxedFilename) ); return(muxedFilename); }