public TempCode(CTDbContext c, CreateBoxTokenTask createBoxTokenTask, UpdateBoxTokenTask updateBoxTokenTask, SceneDetectionTask ePubGeneratorTask, ProcessVideoTask processVideoTask, GenerateVTTFileTask generateVTTFileTask, TranscriptionTask transcriptionTask, ConvertVideoToWavTask convertVideoToWavTask, DownloadMediaTask downloadMediaTask, DownloadPlaylistInfoTask downloadPlaylistInfoTask, QueueAwakerTask queueAwakerTask, RpcClient rpcClient) { context = c; _createBoxTokenTask = createBoxTokenTask; _updateBoxTokenTask = updateBoxTokenTask; _sceneDetectionTask = ePubGeneratorTask; _processVideoTask = processVideoTask; _generateVTTFileTask = generateVTTFileTask; _transcriptionTask = transcriptionTask; _convertVideoToWavTask = convertVideoToWavTask; _downloadMediaTask = downloadMediaTask; _downloadPlaylistInfoTask = downloadPlaylistInfoTask; _queueAwakerTask = queueAwakerTask; _rpcClient = rpcClient; }
public static void Main() { var configuration = CTDbContext.GetConfigurations(); // This project relies on Dependency Injection to configure its various services, // For more info, https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1 // All the services used are configured using the service provider. var serviceProvider = new ServiceCollection() .AddLogging(builder => { builder.AddConsole(); builder.AddFilter <Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider> ("", LogLevel.Warning); builder.AddApplicationInsights(configuration.GetValue <string>("APPLICATION_INSIGHTS_KEY")); }) .AddOptions() .Configure <AppSettings>(configuration) .AddDbContext <CTDbContext>(options => options.UseLazyLoadingProxies().UseNpgsql(CTDbContext.ConnectionStringBuilder())) .AddSingleton <RabbitMQConnection>() .AddSingleton <CaptionQueries>() .AddSingleton <DownloadPlaylistInfoTask>() .AddSingleton <DownloadMediaTask>() .AddSingleton <ConvertVideoToWavTask>() .AddSingleton <TranscriptionTask>() .AddSingleton <QueueAwakerTask>() .AddSingleton <GenerateVTTFileTask>() .AddSingleton <RpcClient>() .AddSingleton <ProcessVideoTask>() .AddSingleton <MSTranscriptionService>() .AddSingleton <SceneDetectionTask>() .AddSingleton <UpdateBoxTokenTask>() .AddSingleton <CreateBoxTokenTask>() .AddSingleton <BuildElasticIndexTask>() .AddSingleton <ExampleTask>() .AddSingleton <CleanUpElasticIndexTask>() .AddSingleton <BoxAPI>() .AddScoped <Seeder>() .AddScoped <SlackLogger>() .AddSingleton <TempCode>() .BuildServiceProvider(); _serviceProvider = serviceProvider; _logger = serviceProvider.GetRequiredService <ILogger <Program> >(); Globals.appSettings = serviceProvider.GetService <IOptions <AppSettings> >().Value; TaskEngineGlobals.KeyProvider = new KeyProvider(Globals.appSettings); AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(ExceptionHandler); _logger.LogInformation("Seeding database"); // Seed the database, with some initial data. Seeder seeder = serviceProvider.GetService <Seeder>(); seeder.Seed(); _logger.LogInformation("Starting TaskEngine"); // Delete any pre-existing queues on rabbitMQ. RabbitMQConnection rabbitMQ = serviceProvider.GetService <RabbitMQConnection>(); _logger.LogInformation("RabbitMQ - deleting all queues"); rabbitMQ.DeleteAllQueues(); //TODO/TOREVIEW: Should we create all of the queues _before_ starting them? // In the current version (all old messages deleted) it is ununnecessary // But it seems cleaner to me to create them all first before starting them ushort concurrent_videotasks = toUInt16(Globals.appSettings.MAX_CONCURRENT_VIDEO_TASKS, NO_CONCURRENCY); ushort concurrent_synctasks = toUInt16(Globals.appSettings.MAX_CONCURRENT_SYNC_TASKS, MIN_CONCURRENCY); ushort concurrent_transcriptions = toUInt16(Globals.appSettings.MAX_CONCURRENT_TRANSCRIPTIONS, MIN_CONCURRENCY); // Create and start consuming from all queues. // Upstream Sync related _logger.LogInformation($"Creating DownloadPlaylistInfoTask & DownloadMediaTask consumers. Concurrency={concurrent_synctasks} "); serviceProvider.GetService <DownloadPlaylistInfoTask>().Consume(concurrent_synctasks); serviceProvider.GetService <DownloadMediaTask>().Consume(concurrent_synctasks); // Transcription Related _logger.LogInformation($"Creating TranscriptionTask & GenerateVTTFileTask consumers. Concurrency={concurrent_transcriptions} "); serviceProvider.GetService <TranscriptionTask>().Consume(concurrent_transcriptions); serviceProvider.GetService <GenerateVTTFileTask>().Consume(concurrent_transcriptions); // Video Processing Related _logger.LogInformation($"Creating ProcessVideoTask & SceneDetectionTask consumers. Concurrency={concurrent_videotasks} "); serviceProvider.GetService <ProcessVideoTask>().Consume(concurrent_videotasks); serviceProvider.GetService <SceneDetectionTask>().Consume(concurrent_videotasks); // We dont want concurrency for these tasks _logger.LogInformation("Creating QueueAwakerTask and Box token tasks consumers."); serviceProvider.GetService <QueueAwakerTask>().Consume(NO_CONCURRENCY); //TODO TOREVIEW: NO_CONCURRENCY? serviceProvider.GetService <UpdateBoxTokenTask>().Consume(NO_CONCURRENCY); serviceProvider.GetService <CreateBoxTokenTask>().Consume(NO_CONCURRENCY); // Elastic Search index should be built after TranscriptionTask serviceProvider.GetService <BuildElasticIndexTask>().Consume(NO_CONCURRENCY); // Outdated Elastic Search index would be removed serviceProvider.GetService <CleanUpElasticIndexTask>().Consume(NO_CONCURRENCY); serviceProvider.GetService <ExampleTask>().Consume(NO_CONCURRENCY); _logger.LogInformation("Done creating task consumers"); //nolonger used : // nope serviceProvider.GetService<nope ConvertVideoToWavTask>().Consume(concurrent_videotasks); bool hacktest = false; if (hacktest) { TempCode tempCode = serviceProvider.GetService <TempCode>(); tempCode.Temp(); return; } _logger.LogInformation("All done!"); QueueAwakerTask queueAwakerTask = serviceProvider.GetService <QueueAwakerTask>(); int periodicCheck = Math.Max(1, Convert.ToInt32(Globals.appSettings.PERIODIC_CHECK_EVERY_MINUTES)); _logger.LogInformation("Periodic Check Every {0} minutes", periodicCheck); var timeInterval = new TimeSpan(0, periodicCheck, 0); // Check for new tasks every "timeInterval". // The periodic check will discover all undone tasks // TODO/REVIEW: However some tasks also publish the next items while (true) { queueAwakerTask.Publish(new JObject { { "Type", TaskType.PeriodicCheck.ToString() } }); Thread.Sleep(timeInterval); } ; }