Files
easystream-main/f_core/f_classes/class.uploadsystem.php
SamiAhmed7777 0b7e2d0a5b 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
2025-10-21 00:39:45 -07:00

155 lines
6.0 KiB
PHP

<?php
defined('_ISVALID') or exit;
class VUploadSystem {
public static function uploadForm() {
if (!VSession::isLoggedIn()) {
return '<div class="error">Please login to upload videos</div>';
}
return '
<div class="upload-container">
<h2>Upload Video</h2>
<form id="upload-form" method="post" enctype="multipart/form-data">
<div class="form-group">
<label>Video File</label>
<input type="file" name="video_file" accept="video/*" required>
<small>Supported formats: MP4, AVI, MOV, WMV (Max: 500MB)</small>
</div>
<div class="form-group">
<label>Title</label>
<input type="text" name="title" placeholder="Enter video title" required maxlength="100">
</div>
<div class="form-group">
<label>Description</label>
<textarea name="description" placeholder="Describe your video" rows="4"></textarea>
</div>
<div class="form-group">
<label>Category</label>
<select name="category">
<option value="1">Entertainment</option>
<option value="2">Education</option>
<option value="3">Music</option>
<option value="4">Gaming</option>
<option value="5">Sports</option>
</select>
</div>
<div class="form-group">
<label>Privacy</label>
<select name="privacy">
<option value="public">Public</option>
<option value="private">Private</option>
<option value="unlisted">Unlisted</option>
</select>
</div>
<button type="submit" class="btn-upload">Upload Video</button>
</form>
<div id="upload-progress" style="display:none;">
<div class="progress-bar">
<div class="progress-fill"></div>
</div>
<p>Uploading... <span id="progress-text">0%</span></p>
</div>
</div>';
}
public static function processUpload() {
if (!VSession::isLoggedIn()) {
return ['error' => 'Not logged in'];
}
if (!isset($_FILES['video_file']) || $_FILES['video_file']['error'] !== UPLOAD_ERR_OK) {
return ['error' => 'No file uploaded or upload error'];
}
$file = $_FILES['video_file'];
$title = trim($_POST['title'] ?? '');
$description = trim($_POST['description'] ?? '');
$category = (int)($_POST['category'] ?? 1);
$privacy = $_POST['privacy'] ?? 'public';
// Validate inputs
if (empty($title)) {
return ['error' => 'Title is required'];
}
// Check file size (500MB max)
if ($file['size'] > 500 * 1024 * 1024) {
return ['error' => 'File too large (max 500MB)'];
}
// Check file type
$allowed_types = ['video/mp4', 'video/avi', 'video/quicktime', 'video/x-msvideo'];
if (!in_array($file['type'], $allowed_types)) {
return ['error' => 'Invalid file type'];
}
// Generate unique filename
$file_key = uniqid() . time();
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
$filename = $file_key . '.' . $extension;
// Create upload directory
$upload_dir = 'f_data/videos/' . date('Y/m/');
if (!is_dir($upload_dir)) {
mkdir($upload_dir, 0755, true);
}
$target_path = $upload_dir . $filename;
// Move uploaded file
if (move_uploaded_file($file['tmp_name'], $target_path)) {
// Save to database
global $class_database;
$user_id = VSession::getUserId();
$sql = "INSERT INTO db_videofiles (
usr_id, file_key, file_title, file_description, file_category,
privacy, file_name, file_path, upload_date, approved, processing_status
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW(), 1, 'pending')";
$result = $class_database->execute($sql, [
$user_id, $file_key, $title, $description, $category,
$privacy, $filename, $target_path
]);
if ($result) {
// Queue video for processing
$processor = new VVideoProcessor();
$jobId = $processor->queueVideoProcessing($target_path, $file_key, [
'formats' => ['1080p', '720p', '480p', '360p'],
'generate_preview' => true,
'generate_hls' => true
]);
VLogger::getInstance()->info('Video uploaded and queued for processing', [
'file_key' => $file_key,
'user_id' => $user_id,
'job_id' => $jobId,
'file_size' => $file['size'],
'original_name' => $file['name']
]);
return [
'success' => 'Video uploaded successfully and is being processed',
'file_key' => $file_key,
'job_id' => $jobId,
'message' => 'Your video is being processed. You will be notified when it\'s ready.'
];
} else {
// Clean up file if database insert failed
unlink($target_path);
return ['error' => 'Database error'];
}
}
return ['error' => 'Failed to save file'];
}
}
?>