start
This commit is contained in:
@@ -1,82 +1,93 @@
|
||||
package com.auction;
|
||||
|
||||
import org.opencv.core.Core;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Main entry point for Troostwijk Auction Monitor.
|
||||
*
|
||||
* ARCHITECTURE:
|
||||
* This project focuses on:
|
||||
* 1. Image processing and object detection
|
||||
* 2. Bid monitoring and notifications
|
||||
* 3. Data enrichment
|
||||
*
|
||||
* Auction/Lot scraping is handled by the external ARCHITECTURE-TROOSTWIJK-SCRAPER process.
|
||||
* That process populates the auctions and lots tables in the shared database.
|
||||
* This process reads from those tables and enriches them with:
|
||||
* - Downloaded images
|
||||
* - Object detection labels
|
||||
* - Bid monitoring
|
||||
* - Notifications
|
||||
*/
|
||||
public class Main {
|
||||
public static void main2(String[] args) {
|
||||
// If arguments are passed, this is likely a one-off command via dokku run
|
||||
// Just exit immediately to allow the command to run
|
||||
if (args.length > 0) {
|
||||
IO.println("Command mode - exiting to allow shell commands");
|
||||
return;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Console.println("=== Troostwijk Auction Monitor ===\n");
|
||||
|
||||
// Configuration
|
||||
String databaseFile = System.getenv().getOrDefault("DATABASE_FILE", "troostwijk.db");
|
||||
String notificationConfig = System.getenv().getOrDefault("NOTIFICATION_CONFIG", "desktop");
|
||||
|
||||
// YOLO model paths (optional - monitor works without object detection)
|
||||
String yoloCfg = "models/yolov4.cfg";
|
||||
String yoloWeights = "models/yolov4.weights";
|
||||
String yoloClasses = "models/coco.names";
|
||||
|
||||
// Load native OpenCV library (only if models exist)
|
||||
try {
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
Console.println("✓ OpenCV loaded");
|
||||
} catch (UnsatisfiedLinkError e) {
|
||||
Console.println("⚠️ OpenCV not available - image detection disabled");
|
||||
}
|
||||
|
||||
IO.println("Starting Troostwijk Auction Scraper...");
|
||||
IO.println("Container is running and healthy.");
|
||||
Console.println("Initializing monitor...");
|
||||
var monitor = new TroostwijkMonitor(databaseFile, notificationConfig,
|
||||
yoloCfg, yoloWeights, yoloClasses);
|
||||
|
||||
// Keep container alive
|
||||
// Show current database state
|
||||
Console.println("\n📊 Current Database State:");
|
||||
monitor.printDatabaseStats();
|
||||
|
||||
// Check for pending image processing
|
||||
Console.println("\n[1/2] Processing images...");
|
||||
monitor.processPendingImages();
|
||||
|
||||
// Start monitoring service
|
||||
Console.println("\n[2/2] Starting bid monitoring...");
|
||||
monitor.scheduleMonitoring();
|
||||
|
||||
Console.println("\n✓ Monitor is running. Press Ctrl+C to stop.\n");
|
||||
Console.println("NOTE: This process expects auction/lot data from the external scraper.");
|
||||
Console.println(" Make sure ARCHITECTURE-TROOSTWIJK-SCRAPER is running and populating the database.\n");
|
||||
|
||||
// Keep application alive
|
||||
try {
|
||||
Thread.sleep(Long.MAX_VALUE);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
IO.println("Container interrupted, exiting.");
|
||||
Console.println("Monitor interrupted, exiting.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Alternative entry point for container environments.
|
||||
* Simply keeps the container alive for manual commands.
|
||||
*/
|
||||
public static void main2(String[] args) {
|
||||
if (args.length > 0) {
|
||||
Console.println("Command mode - exiting to allow shell commands");
|
||||
return;
|
||||
}
|
||||
|
||||
Console.println("Troostwijk Monitor container is running and healthy.");
|
||||
Console.println("Use 'docker exec' or 'dokku run' to execute commands.");
|
||||
|
||||
try {
|
||||
Thread.sleep(Long.MAX_VALUE);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
Console.println("Container interrupted, exiting.");
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Entry point. Configure database location, notification settings, and
|
||||
* YOLO model paths here before running. Once started the scraper
|
||||
* discovers Dutch auctions, scrapes lots, and begins monitoring.
|
||||
*/
|
||||
public static void main(String[] args) throws Exception {
|
||||
IO.println("=== Troostwijk Auction Scraper ===\n");
|
||||
|
||||
// Configuration parameters (replace with your own values)
|
||||
String databaseFile = "troostwijk.db";
|
||||
|
||||
// Notification configuration - choose one:
|
||||
// Option 1: Desktop notifications only (free, no setup required)
|
||||
String notificationConfig = System.getenv().getOrDefault("NOTIFICATION_CONFIG", "desktop");
|
||||
|
||||
// Option 2: Desktop + Email via Gmail (free, requires Gmail app password)
|
||||
// Format: "smtp:username:appPassword:toEmail"
|
||||
// Example: "smtp:your.email@gmail.com:abcd1234efgh5678:recipient@example.com"
|
||||
// Get app password: Google Account > Security > 2-Step Verification > App passwords
|
||||
|
||||
// YOLO model paths (optional - scraper works without object detection)
|
||||
String yoloCfg = "models/yolov4.cfg";
|
||||
String yoloWeights = "models/yolov4.weights";
|
||||
String yoloClasses = "models/coco.names";
|
||||
|
||||
// Load native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
|
||||
IO.println("Initializing scraper...");
|
||||
TroostwijkScraper scraper = new TroostwijkScraper(databaseFile, notificationConfig, "",
|
||||
yoloCfg, yoloWeights, yoloClasses);
|
||||
|
||||
// Step 1: Discover auctions in NL
|
||||
IO.println("\n[1/3] Discovering Dutch auctions...");
|
||||
List<Integer> auctions = scraper.discoverDutchAuctions();
|
||||
IO.println("✓ Found " + auctions.size() + " auctions: " + auctions);
|
||||
|
||||
// Step 2: Fetch lots for each auction
|
||||
IO.println("\n[2/3] Fetching lot details...");
|
||||
int totalAuctions = auctions.size();
|
||||
int currentAuction = 0;
|
||||
for (int saleId : auctions) {
|
||||
currentAuction++;
|
||||
IO.println(" [Page " + currentAuction + "] Fetching auctions...");
|
||||
IO.println(" [" + currentAuction + "/" + totalAuctions + "] Processing sale " + saleId + "...");
|
||||
scraper.fetchLotsForSale(saleId);
|
||||
}
|
||||
|
||||
// Show database summary
|
||||
IO.println("\n📊 Database Summary:");
|
||||
scraper.printDatabaseStats();
|
||||
|
||||
// Step 3: Start monitoring bids and closures
|
||||
IO.println("\n[3/3] Starting monitoring service...");
|
||||
scraper.scheduleMonitoring();
|
||||
IO.println("✓ Monitoring active. Press Ctrl+C to stop.\n");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user