121 lines
7.2 KiB
PHP
Executable File
121 lines
7.2 KiB
PHP
Executable File
<?php
|
|
// YouTube Factory API Wrapper - routes to /youtube-factory/api/index.php
|
|
header('Content-Type: application/json');
|
|
header('Access-Control-Allow-Origin: *');
|
|
|
|
$action = $_REQUEST['action'] ?? '';
|
|
require_once '/opt/wevads-arsenal/public/youtube-factory/config.php';
|
|
|
|
try {
|
|
$db = wv_db();
|
|
|
|
switch ($action) {
|
|
case 'health':
|
|
case 'status':
|
|
$pending = $db->query("SELECT COUNT(*) FROM yt_jobs WHERE status='pending' OR status='script_ready'")->fetchColumn();
|
|
$rendering = $db->query("SELECT COUNT(*) FROM yt_jobs WHERE status='rendering'")->fetchColumn();
|
|
$today = $db->query("SELECT COUNT(*) FROM yt_jobs WHERE status IN ('rendered','uploaded') AND created_at::date = CURRENT_DATE")->fetchColumn();
|
|
$trends = $db->query("SELECT COUNT(*) FROM yt_trends WHERE processed=FALSE")->fetchColumn();
|
|
$totalTrends = $db->query("SELECT COUNT(*) FROM yt_trends")->fetchColumn();
|
|
$totalJobs = $db->query("SELECT COUNT(*) FROM yt_jobs")->fetchColumn();
|
|
$channels = $db->query("SELECT COUNT(*) FROM yt_channels WHERE is_active=TRUE")->fetchColumn();
|
|
$assets = $db->query("SELECT COUNT(*) FROM yt_assets WHERE is_active=TRUE")->fetchColumn();
|
|
$jobsByStatus = $db->query("SELECT status, COUNT(*) as cnt FROM yt_jobs GROUP BY status ORDER BY cnt DESC")->fetchAll(PDO::FETCH_ASSOC);
|
|
$trendsByCountry = $db->query("SELECT country_code, COUNT(*) as cnt FROM yt_trends GROUP BY country_code ORDER BY cnt DESC")->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
echo json_encode([
|
|
'status' => 'ok', 'module' => 'youtube-factory',
|
|
'pending_jobs' => (int)$pending, 'rendering_jobs' => (int)$rendering,
|
|
'completed_today' => (int)$today, 'unprocessed_trends' => (int)$trends,
|
|
'total_trends' => (int)$totalTrends, 'total_jobs' => (int)$totalJobs,
|
|
'active_channels' => (int)$channels, 'active_assets' => (int)$assets,
|
|
'jobs_by_status' => $jobsByStatus, 'trends_by_country' => $trendsByCountry,
|
|
'ffmpeg' => !empty(shell_exec('which ffmpeg'))
|
|
]);
|
|
break;
|
|
|
|
case 'list_trends':
|
|
$country = $_REQUEST['country'] ?? '';
|
|
$processed = $_REQUEST['processed'] ?? '';
|
|
$limit = min((int)($_REQUEST['limit'] ?? 50), 200);
|
|
$where = '1=1';
|
|
if ($country) $where .= " AND country_code='" . substr(preg_replace('/[^A-Z]/', '', strtoupper($country)), 0, 2) . "'";
|
|
if ($processed !== '') $where .= " AND processed=" . ($processed === 'true' ? 'TRUE' : 'FALSE');
|
|
$trends = $db->query("SELECT * FROM yt_trends WHERE $where ORDER BY trend_score DESC, scraped_at DESC LIMIT $limit")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['status' => 'ok', 'count' => count($trends), 'trends' => $trends]);
|
|
break;
|
|
|
|
case 'list_jobs':
|
|
$status = $_REQUEST['job_status'] ?? '';
|
|
$limit = min((int)($_REQUEST['limit'] ?? 50), 200);
|
|
$where = '1=1';
|
|
if ($status) $where .= " AND j.status='$status'";
|
|
$jobs = $db->query("SELECT j.*, t.keyword, t.country_code, t.category FROM yt_jobs j LEFT JOIN yt_trends t ON j.trend_id=t.id WHERE $where ORDER BY j.created_at DESC LIMIT $limit")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['status' => 'ok', 'count' => count($jobs), 'jobs' => $jobs]);
|
|
break;
|
|
|
|
case 'list_channels':
|
|
$channels = $db->query("SELECT * FROM yt_channels ORDER BY total_views DESC")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['status' => 'ok', 'channels' => $channels]);
|
|
break;
|
|
|
|
case 'list_assets':
|
|
$assets = $db->query("SELECT * FROM yt_assets WHERE is_active=TRUE ORDER BY usage_count DESC LIMIT 100")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['status' => 'ok', 'assets' => $assets]);
|
|
break;
|
|
|
|
case 'performance':
|
|
$perf = $db->query("SELECT p.*, j.title, t.keyword FROM yt_performance p LEFT JOIN yt_jobs j ON p.job_id=j.id LEFT JOIN yt_trends t ON j.trend_id=t.id ORDER BY p.date DESC LIMIT 50")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['status' => 'ok', 'performance' => $perf]);
|
|
break;
|
|
|
|
case 'fetch_trends':
|
|
require_once '/opt/wevads-arsenal/public/youtube-factory/core/YtTrendScraper.php';
|
|
$scraper = new YtTrendScraper();
|
|
$count = $scraper->fetchTrends($_REQUEST['country'] ?? 'FR', (int)($_REQUEST['max'] ?? 20));
|
|
echo json_encode(['status' => 'ok', 'trends_added' => $count]);
|
|
break;
|
|
|
|
case 'generate_script':
|
|
require_once '/opt/wevads-arsenal/public/youtube-factory/core/YtScriptGenerator.php';
|
|
$gen = new YtScriptGenerator();
|
|
$result = $gen->generate((int)$_REQUEST['trend_id'], $_REQUEST['style'] ?? 'educational');
|
|
echo json_encode(['status' => 'ok', 'result' => $result]);
|
|
break;
|
|
|
|
case 'auto_pipeline':
|
|
require_once '/opt/wevads-arsenal/public/youtube-factory/core/YtTrendScraper.php';
|
|
require_once '/opt/wevads-arsenal/public/youtube-factory/core/YtScriptGenerator.php';
|
|
require_once '/opt/wevads-arsenal/public/youtube-factory/core/YtVideoRenderer.php';
|
|
$scraper = new YtTrendScraper();
|
|
$scraper->fetchTrends($_REQUEST['country'] ?? 'FR', 10);
|
|
$trends = $scraper->getUnprocessed(3);
|
|
$gen = new YtScriptGenerator();
|
|
$renderer = new YtVideoRenderer();
|
|
$results = [];
|
|
foreach ($trends as $t) {
|
|
try {
|
|
$script = $gen->generate($t['id']);
|
|
$results[] = ['trend' => $t['keyword'], 'job_id' => $script['job_id']];
|
|
} catch (Exception $e) {
|
|
$results[] = ['trend' => $t['keyword'], 'error' => $e->getMessage()];
|
|
}
|
|
}
|
|
echo json_encode(['status' => 'ok', 'pipeline' => $results]);
|
|
break;
|
|
|
|
case 'stats':
|
|
$daily = $db->query("SELECT created_at::date as day, COUNT(*) as jobs, SUM(CASE WHEN status='rendered' OR status='uploaded' THEN 1 ELSE 0 END) as completed FROM yt_jobs GROUP BY created_at::date ORDER BY day DESC LIMIT 14")->fetchAll(PDO::FETCH_ASSOC);
|
|
$topCategories = $db->query("SELECT category, COUNT(*) as cnt FROM yt_trends WHERE category IS NOT NULL GROUP BY category ORDER BY cnt DESC LIMIT 10")->fetchAll(PDO::FETCH_ASSOC);
|
|
$statusBreakdown = $db->query("SELECT status, COUNT(*) as cnt FROM yt_jobs GROUP BY status ORDER BY cnt DESC")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['status' => 'ok', 'daily' => $daily, 'top_categories' => $topCategories, 'status_breakdown' => $statusBreakdown]);
|
|
break;
|
|
|
|
default:
|
|
echo json_encode(['status' => 'error', 'message' => 'Unknown action. Available: health, list_trends, list_jobs, list_channels, list_assets, performance, fetch_trends, generate_script, auto_pipeline, stats']);
|
|
}
|
|
} catch (Exception $e) {
|
|
http_response_code(500);
|
|
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
|
|
}
|