feat: Add comprehensive documentation suite and reorganize project structure
- 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
This commit is contained in:
117
api/video/progress.php
Normal file
117
api/video/progress.php
Normal file
@@ -0,0 +1,117 @@
|
||||
<?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();
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user