From f77dad143cd6440e3ad43c87fd1bbb79030b14fc Mon Sep 17 00:00:00 2001 From: Devdatt Bhatt Date: Thu, 4 Jun 2026 09:20:28 +0000 Subject: [PATCH] update --- Readme.md | 0 settings/index.php | 202 ++++++++++++++++++++++++++++++++++++++++- settings/logo.png | Bin 0 -> 24342 bytes settings/settings.json | 8 +- setup.sh | 6 +- transcode.sh | 87 +++++++++++++++--- 6 files changed, 279 insertions(+), 24 deletions(-) mode change 100644 => 100755 Readme.md create mode 100755 settings/logo.png mode change 100644 => 100755 settings/settings.json mode change 100644 => 100755 transcode.sh diff --git a/Readme.md b/Readme.md old mode 100644 new mode 100755 diff --git a/settings/index.php b/settings/index.php index 5c3e00b..969a60e 100755 --- a/settings/index.php +++ b/settings/index.php @@ -5,7 +5,8 @@ session_start(); // Define settings file path - save in same directory as this file -$settings_file = __DIR__ . '/settings.json'; +$settings_file = 'settings.json'; +$logo_file = 'logo.png'; // Default settings $default_settings = [ @@ -55,10 +56,74 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $settings['frame_rate'] = $_POST['frame_rate'] ?? $settings['frame_rate']; $settings['gop'] = $_POST['gop'] ?? $settings['gop']; + // Handle logo upload + if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) { + // Check if GD library is available + if (!extension_loaded('gd')) { + $message = "GD library not available for image processing!"; + } else { + $allowed_types = ['image/png']; + $file_type = mime_content_type($_FILES['logo']['tmp_name']); + + if (in_array($file_type, $allowed_types)) { + // Move uploaded file + $target_path = $logo_file; + if (move_uploaded_file($_FILES['logo']['tmp_name'], $target_path)) { + // Process image with GD library to make it square + $image = imagecreatefrompng($target_path); + if ($image !== false) { + $width = imagesx($image); + $height = imagesy($image); + + // Calculate square dimensions (use smaller dimension) + $size = min($width, $height); + + // Create square canvas + $square = imagecreatetruecolor(128, 128); + + // Fill with transparent background + $transparent = imagecolorallocatealpha($square, 0, 0, 0, 127); + imagefill($square, 0, 0, $transparent); + + // Calculate position to center the image + $x = ($width - $size) / 2; + $y = ($height - $size) / 2; + + // Copy and resize to square + imagecopyresampled($square, $image, 0, 0, $x, $y, 128, 128, $size, $size); + + // Save the processed image + imagepng($square, $target_path); + + // Free memory + imagedestroy($image); + imagedestroy($square); + + $message = "Logo uploaded and processed successfully!"; + } else { + $message = "Error processing image with GD library!"; + } + } else { + $message = "Error uploading logo!"; + } + } else { + $message = "Only PNG images are allowed!"; + } + } + } + + // Handle logo removal + if (isset($_POST['remove_logo']) && $_POST['remove_logo'] == '1') { + if (file_exists($logo_file)) { + unlink($logo_file); + $message = "Logo removed successfully!"; + } + } + // Save settings to JSON file $settings_json = json_encode($settings, JSON_PRETTY_PRINT); if (file_put_contents($settings_file, $settings_json) !== false) { - $message = "Settings saved successfully!"; + $message .= " Settings saved successfully!"; } else { $message = "Error saving settings!"; } @@ -489,6 +554,95 @@ $_SESSION['settings'] = $settings; .btn-container { margin-top: 20px; } + + .logo-container { + text-align: center; + margin: 20px 0; + } + + .logo-preview { + width: 128px; + height: 128px; + margin: 0 auto; + border-radius: 0; /* Changed from 50% to 0 for square shape */ + overflow: hidden; + border: 2px solid rgba(92, 107, 192, 0.5); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); + background: rgba(13, 19, 33, 0.7); + display: flex; + justify-content: center; + align-items: center; + position: relative; + margin-bottom: 15px; + } + + .logo-preview img { + width: 100%; + height: 100%; + object-fit: contain; + display: block; + } + + .logo-preview .no-logo { + color: #4facfe; + font-size: 0.9rem; + text-align: center; + padding: 10px; + } + + .logo-actions { + display: flex; + justify-content: center; + gap: 10px; + margin-top: 10px; + } + + .logo-actions button { + padding: 8px 15px; + border: none; + border-radius: 8px; + cursor: pointer; + font-size: 0.9rem; + transition: all 0.3s; + } + + .upload-btn { + background: rgba(92, 107, 192, 0.3); + color: #4facfe; + } + + .remove-btn { + background: rgba(231, 76, 60, 0.3); + color: #e74c3c; + } + + .logo-actions button:hover { + transform: translateY(-2px); + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); + } + + .logo-preview::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: 2px dashed rgba(92, 107, 192, 0.3); + border-radius: 50%; + pointer-events: none; + } + + /* Fix for logo preview */ + .logo-preview img { + display: block; + max-width: 100%; + max-height: 100%; + } + + .logo-preview img[src=""] { + display: none; + } @@ -512,6 +666,34 @@ $_SESSION['settings'] = $settings;

+
+

Logo Management

+
+
+ + Logo Preview + + + +
+
+
+ + +
+ +
+ + +
+ +
+
+

Format Restrictions

Video format is limited to: MPEG-2, H.264, H.265, VP9, and AV1

@@ -582,5 +764,21 @@ $_SESSION['settings'] = $settings;

Made with from ShreeBhattJi

+ + \ No newline at end of file diff --git a/settings/logo.png b/settings/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..5ed0dbf59c956ca328ac5d93bce2057c0f680fb7 GIT binary patch literal 24342 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 VSJuHn>_Pwl002ovPDHLkV1ggR6pjD@ literal 0 HcmV?d00001 diff --git a/settings/settings.json b/settings/settings.json old mode 100644 new mode 100755 index edd2db1..df08af9 --- a/settings/settings.json +++ b/settings/settings.json @@ -1,9 +1,9 @@ { - "video_format": "mpeg2", - "audio_format": "mp3", - "video_bitrate": "1000k", + "video_format": "h264", + "audio_format": "mp2", + "video_bitrate": "2000k", "audio_bitrate": "128k", - "resolution": "1280x720", + "resolution": "720x576", "frame_rate": "30", "gop": "30" } \ No newline at end of file diff --git a/setup.sh b/setup.sh index 93ddab0..24a86b0 100755 --- a/setup.sh +++ b/setup.sh @@ -27,6 +27,7 @@ EOF sudo systemctl restart smbd nmbd sudo systemctl enable smbd nmbd +cp transcode.sh /var/www/transcode.sh cat << EOF | sudo tee -a /etc/systemd/system/transcode.service [Unit] @@ -38,7 +39,7 @@ Type=simple User=www-data Group=www-data WorkingDirectory=/var/www/ -ExecStart=/usr/bin/python3 /var/www/transcode.sh +ExecStart=/bin/bash /var/www/transcode.sh Restart=always RestartSec=10 StandardOutput=journal @@ -46,5 +47,4 @@ StandardError=journal [Install] WantedBy=multi-user.target -EOF - +EOF \ No newline at end of file diff --git a/transcode.sh b/transcode.sh old mode 100644 new mode 100755 index adeab3c..4a23550 --- a/transcode.sh +++ b/transcode.sh @@ -5,6 +5,7 @@ QUEUE_DIR="/var/www/download/queue" READY_DIR="/var/www/download/ready" SETTINGS_FILE="/path/to/settings/settings.json" LOG_FILE="/var/log/convert.log" +LOGO_FILE="/var/www/settings/logo.png" # Create directories if they don't exist mkdir -p "$QUEUE_DIR" @@ -40,6 +41,32 @@ sanitize_filename() { echo "$sanitized" } +# Function to get video resolution +get_video_resolution() { + local input_file="$1" + ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$input_file" +} + +# Function to calculate logo size based on video resolution +calculate_logo_size() { + local video_width="$1" + local video_height="$2" + + # Calculate 10% of video width/height for logo size + local logo_width=$((video_width / 10)) + local logo_height=$((video_height / 10)) + + # Ensure minimum size of 64x64 + if [ "$logo_width" -lt 64 ]; then logo_width=64; fi + if [ "$logo_height" -lt 64 ]; then logo_height=64; fi + + # Ensure maximum size of 128x128 + if [ "$logo_width" -gt 128 ]; then logo_width=128; fi + if [ "$logo_height" -gt 128 ]; then logo_height=128; fi + + echo "${logo_width}x${logo_height}" +} + # Main processing loop while true; do # Load settings at start of each loop @@ -62,22 +89,52 @@ while true; do # Set output path output_file="$READY_DIR/$sanitized_name" - # Convert file with ffmpeg using settings from JSON - if ffmpeg -i "$file" \ - -c:v "$VIDEO_FORMAT" \ - -b:v "$VIDEO_BITRATE" \ - -c:a "$AUDIO_FORMAT" \ - -b:a "$AUDIO_BITRATE" \ - -s "$RESOLUTION" \ - -r "$FRAME_RATE" \ - -g "$GOP" \ - "$output_file" 2>>"$LOG_FILE"; then - # If conversion successful, remove original file - rm "$file" - echo "$(date): Successfully converted $original_name to $sanitized_name" >> "$LOG_FILE" + # Check if logo file exists + if [ -f "$LOGO_FILE" ]; then + # Get video resolution + video_res=$(get_video_resolution "$file") + video_width=$(echo "$video_res" | cut -d'x' -f1) + video_height=$(echo "$video_res" | cut -d'x' -f2) + + # Calculate logo size + logo_size=$(calculate_logo_size "$video_width" "$video_height") + + # Convert file with ffmpeg using settings from JSON and logo overlay + if ffmpeg -i "$file" \ + -c:v "$VIDEO_FORMAT" \ + -b:v "$VIDEO_BITRATE" \ + -c:a "$AUDIO_FORMAT" \ + -b:a "$AUDIO_BITRATE" \ + -s "$RESOLUTION" \ + -r "$FRAME_RATE" \ + -g "$GOP" \ + -vf "scale=iw:ih,overlay=W-w-10:10" \ + "$output_file" 2>>"$LOG_FILE"; then + # If conversion successful, remove original file + rm "$file" + echo "$(date): Successfully converted $original_name to $sanitized_name" >> "$LOG_FILE" + else + # If conversion failed, log error + echo "$(date): Failed to convert $original_name" >> "$LOG_FILE" + fi else - # If conversion failed, log error - echo "$(date): Failed to convert $original_name" >> "$LOG_FILE" + # Convert file without logo if logo file doesn't exist + if ffmpeg -i "$file" \ + -c:v "$VIDEO_FORMAT" \ + -b:v "$VIDEO_BITRATE" \ + -c:a "$AUDIO_FORMAT" \ + -b:a "$AUDIO_BITRATE" \ + -s "$RESOLUTION" \ + -r "$FRAME_RATE" \ + -g "$GOP" \ + "$output_file" 2>>"$LOG_FILE"; then + # If conversion successful, remove original file + rm "$file" + echo "$(date): Successfully converted $original_name to $sanitized_name" >> "$LOG_FILE" + else + # If conversion failed, log error + echo "$(date): Failed to convert $original_name" >> "$LOG_FILE" + fi fi done