- Created complete documentation in docs/ directory - Added PROJECT_OVERVIEW.md with feature highlights and getting started guide - Added ARCHITECTURE.md with system design and technical details - Added SECURITY.md with comprehensive security implementation guide - Added DEVELOPMENT.md with development workflows and best practices - Added DEPLOYMENT.md with production deployment instructions - Added API.md with complete REST API documentation - Added CONTRIBUTING.md with contribution guidelines - Added CHANGELOG.md with version history and migration notes - Reorganized all documentation files into docs/ directory for better organization - Updated README.md with proper documentation links and quick navigation - Enhanced project structure with professional documentation standards
117 lines
3.2 KiB
PHP
117 lines
3.2 KiB
PHP
<?php
|
|
/*******************************************************************************************************************
|
|
| Video Progress Tracking API
|
|
| Handles watch progress updates for resume functionality
|
|
|*******************************************************************************************************************/
|
|
|
|
define('_ISVALID', true);
|
|
|
|
// Include core configuration
|
|
include_once '../../f_core/config.core.php';
|
|
|
|
// Set JSON response headers
|
|
header('Content-Type: application/json');
|
|
header('Access-Control-Allow-Origin: *');
|
|
header('Access-Control-Allow-Methods: POST, OPTIONS');
|
|
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
|
|
|
|
// Handle preflight requests
|
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
|
http_response_code(200);
|
|
exit();
|
|
}
|
|
|
|
try {
|
|
// Only allow POST requests
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
sendError('Method not allowed', 405);
|
|
}
|
|
|
|
// Get current user
|
|
$userId = VSession::isLoggedIn() ? $_SESSION['user_id'] : null;
|
|
|
|
if (!$userId) {
|
|
sendError('User must be logged in', 401);
|
|
}
|
|
|
|
// Get JSON input
|
|
$input = file_get_contents('php://input');
|
|
$data = json_decode($input, true);
|
|
|
|
if (json_last_error() !== JSON_ERROR_NONE) {
|
|
sendError('Invalid JSON input', 400);
|
|
}
|
|
|
|
// Validate required fields
|
|
$requiredFields = ['video_key', 'current_time', 'duration'];
|
|
foreach ($requiredFields as $field) {
|
|
if (!isset($data[$field])) {
|
|
sendError("Missing required field: {$field}", 400);
|
|
}
|
|
}
|
|
|
|
// Validate CSRF token
|
|
if (!VSecurity::validateCSRFToken('video_progress', $data['csrf_token'] ?? '')) {
|
|
sendError('Invalid CSRF token', 403);
|
|
}
|
|
|
|
$videoKey = $data['video_key'];
|
|
$currentTime = (float)$data['current_time'];
|
|
$duration = (float)$data['duration'];
|
|
|
|
// Validate data
|
|
if ($currentTime < 0 || $duration <= 0 || $currentTime > $duration) {
|
|
sendError('Invalid time values', 400);
|
|
}
|
|
|
|
// Initialize streaming system
|
|
$streaming = new VStreaming();
|
|
|
|
// Update watch progress
|
|
$streaming->updateWatchProgress($videoKey, $userId, $currentTime, $duration);
|
|
|
|
sendSuccess([
|
|
'message' => 'Progress updated successfully',
|
|
'video_key' => $videoKey,
|
|
'current_time' => $currentTime,
|
|
'duration' => $duration,
|
|
'watch_percentage' => ($duration > 0) ? ($currentTime / $duration) * 100 : 0
|
|
]);
|
|
|
|
} catch (Exception $e) {
|
|
VLogger::getInstance()->error('Video progress API error', [
|
|
'error' => $e->getMessage(),
|
|
'trace' => $e->getTraceAsString()
|
|
]);
|
|
|
|
sendError('Internal server error', 500);
|
|
}
|
|
|
|
/**
|
|
* Send success response
|
|
*/
|
|
function sendSuccess($data, $code = 200)
|
|
{
|
|
http_response_code($code);
|
|
echo json_encode([
|
|
'success' => true,
|
|
'data' => $data,
|
|
'timestamp' => time()
|
|
]);
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* Send error response
|
|
*/
|
|
function sendError($message, $code = 400)
|
|
{
|
|
http_response_code($code);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'error' => $message,
|
|
'timestamp' => time()
|
|
]);
|
|
exit();
|
|
}
|
|
?>
|