This commit is contained in:
2025-06-26 16:57:09 +03:00
parent c59deafcf7
commit 7bdd60177e
5 changed files with 102 additions and 45 deletions

102
app.py
View File

@@ -13,6 +13,7 @@ from pptx.util import Inches
from PIL import Image
import io
import threading
from PIL import Image, ImageDraw
app = Flask(__name__, instance_relative_config=True)
@@ -87,36 +88,7 @@ def add_image_to_playlist(file, filename, duration, target_type, target_id):
db.session.commit()
def convert_ppt_to_images(input_file, output_folder):
"""
Converts a PowerPoint file (.ppt or .pptx) to images using LibreOffice.
Each slide is saved as a separate image in the output folder.
"""
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# Convert the PowerPoint file to images using LibreOffice
command = [
'libreoffice',
'--headless',
'--convert-to', 'png',
'--outdir', output_folder,
input_file
]
try:
subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(f"PPT file converted to images: {input_file}")
except subprocess.CalledProcessError as e:
print(f"Error converting PPT to images: {e.stderr.decode()}")
return False
# Rename the generated images to follow the naming convention
base_name = os.path.splitext(os.path.basename(input_file))[0]
for i, file_name in enumerate(sorted(os.listdir(output_folder))):
if file_name.endswith('.png'):
new_name = f"{base_name}_{i + 1}.png"
os.rename(os.path.join(output_folder, file_name), os.path.join(output_folder, new_name))
return True
def convert_pdf_to_images(input_file, output_folder):
"""
@@ -210,6 +182,45 @@ def convert_video_and_update_playlist(file_path, original_filename, target_type,
else:
print(f"Video conversion failed for: {file_path}")
def convert_pptx_to_images(input_file, output_folder):
"""
Converts a PowerPoint file (.pptx) to images using python-pptx.
Each slide is saved as a separate image in the output folder.
"""
try:
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# Load the PowerPoint presentation
presentation = Presentation(input_file)
base_name = os.path.splitext(os.path.basename(input_file))[0]
for i, slide in enumerate(presentation.slides):
# Create a blank image for the slide
img = Image.new('RGB', (1920, 1080), color='white') # Adjust resolution as needed
draw = ImageDraw.Draw(img)
# Extract slide content (text, shapes, etc.)
for shape in slide.shapes:
if shape.has_text_frame:
text = shape.text_frame.text
draw.text((50, 50 + i * 20), text, fill='black') # Adjust position and styling
# Save the image
image_filename = f"{base_name}_slide_{i + 1}.jpg"
image_path = os.path.join(output_folder, image_filename)
img.save(image_path, 'JPEG')
print(f"Slide {i + 1} saved as image: {image_path}")
# Delete the original PPTX file after conversion
if os.path.exists(input_file):
os.remove(input_file)
print(f"Original PPTX file deleted: {input_file}")
return True
except Exception as e:
print(f"Error processing PPTX file: {e}")
return False
# Convert EMU to pixels
def emu_to_pixels(emu):
@@ -321,13 +332,13 @@ def upload_content():
# Handle PPT files
elif media_type == 'ppt':
print(f"Processing PPT file: {file_path}")
success = convert_ppt_to_images(file_path, app.config['UPLOAD_FOLDER'])
success = convert_pptx_to_images(file_path, app.config['UPLOAD_FOLDER'])
if success:
# Add each slide image to the playlist
base_name = os.path.splitext(filename)[0]
for slide_image in sorted(os.listdir(app.config['UPLOAD_FOLDER'])):
if slide_image.startswith(base_name) and slide_image.endswith('.png'):
if slide_image.startswith(base_name) and slide_image.endswith('.jpg'):
if target_type == 'group':
group = Group.query.get_or_404(target_id)
for player in group.players:
@@ -337,22 +348,12 @@ def upload_content():
new_content = Content(file_name=slide_image, duration=duration, player_id=target_id)
db.session.add(new_content)
# Commit the changes to the database
db.session.commit()
# Remove the original PPT file after processing
if os.path.exists(file_path):
os.remove(file_path)
print(f"Original PPT file deleted: {file_path}")
else:
print(f"Failed to process PPT file: {file_path}")
flash(f"Failed to process PPT file: {file_path}", 'danger')
except Exception as e:
print(f"Error processing file {filename}: {e}")
flash(f"Error processing file {filename}: {e}", 'danger')
print(f"Error processing file {file.filename}: {e}")
flash(f"Error processing file {file.filename}: {e}", 'danger')
db.session.commit()
return redirect(return_url)
# Handle GET request
@@ -366,6 +367,10 @@ def upload_content():
return render_template('upload_content.html', target_type=target_type, target_id=target_id, players=players, groups=groups, return_url=return_url)
# Define global variables for server version and build date
SERVER_VERSION = "1.0.0"
BUILD_DATE = "2025-06-25"
@app.route('/admin')
@login_required
@admin_required
@@ -373,7 +378,14 @@ def admin():
logo_exists = os.path.exists(os.path.join(app.config['UPLOAD_FOLDERLOGO'], 'logo.png'))
login_picture_exists = os.path.exists(os.path.join(app.config['UPLOAD_FOLDERLOGO'], 'login_picture.png'))
users = User.query.all()
return render_template('admin.html', users=users, logo_exists=logo_exists, login_picture_exists=login_picture_exists)
return render_template(
'admin.html',
users=users,
logo_exists=logo_exists,
login_picture_exists=login_picture_exists,
server_version=SERVER_VERSION,
build_date=BUILD_DATE
)
@app.route('/admin/change_role/<int:user_id>', methods=['POST'])
@login_required

Binary file not shown.

30
ppt Normal file
View File

@@ -0,0 +1,30 @@
def convert_ppt_to_images(input_file, output_folder):
"""
Converts a PowerPoint file (.ppt or .pptx) to images using LibreOffice.
Each slide is saved as a separate image in the output folder.
"""
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# Convert the PowerPoint file to images using LibreOffice
command = [
'libreoffice',
'--headless',
'--convert-to', 'png',
'--outdir', output_folder,
input_file
]
try:
subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(f"PPT file converted to images: {input_file}")
except subprocess.CalledProcessError as e:
print(f"Error converting PPT to images: {e.stderr.decode()}")
return False
# Rename the generated images to follow the naming convention
base_name = os.path.splitext(os.path.basename(input_file))[0]
for i, file_name in enumerate(sorted(os.listdir(output_folder))):
if file_name.endswith('.png'):
new_name = f"{base_name}_{i + 1}.png"
os.rename(os.path.join(output_folder, file_name), os.path.join(output_folder, new_name))
return True

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -195,6 +195,21 @@
</div>
</div>
<div class="row">
<div class="col-lg-6 col-12">
<!-- Server Info Card -->
<div class="card mb-4 {{ 'dark-mode' if theme == 'dark' else '' }}">
<div class="card-header">
<h2>Server Info</h2>
</div>
<div class="card-body">
<p><strong>Server Version:</strong> {{ server_version }}</p>
<p><strong>Date of Build:</strong> {{ build_date }}</p>
</div>
</div>
</div>
</div>
<div class="mt-4">
<a href="{{ url_for('dashboard') }}" class="btn btn-secondary">Back to Dashboard</a>
</div>