opened in error - please delete

Resolved 💬 2 comments Opened Sep 21, 2025 by jduncan-rva Closed Sep 21, 2025

Enhancement: PowerPoint/PPTX Upload and Display Support

Overview

Add support for uploading PowerPoint presentations (.ppt/.pptx) to the library and displaying them on digital signage displays with animation preservation.

Context

Currently, the platform only supports Google Slides via API integration (GOOGLE_SLIDES integration type). This enhancement would allow users to upload PowerPoint files directly to their library and display them with preserved animations and transitions.

Requirements

  • Primary Goal: Preserve animations and transitions from PowerPoint presentations
  • Target Environment: Digital signage displays (no mobile optimization needed)
  • File Types: .ppt and .pptx support
  • Quality: High fidelity rendering for professional displays

Current Architecture Analysis

Existing Google Slides Implementation

  • Uses Google Slides API for metadata extraction and thumbnail generation
  • Supports both iframe embedding and static image slideshow fallback
  • Has sophisticated aspect ratio handling (apps/backend/src/services/slidesRenderer.ts)
  • Frontend components: GoogleSlidesDisplay.tsx, EnhancedGoogleSlidesDisplay.tsx

Current Library Constraints

  • Only supports IMAGE and VIDEO in LibraryType enum
  • File upload middleware limited to image/video MIME types (apps/backend/src/routes/library.ts)
  • No document processing pipeline for presentations

Proposed Implementation

1. Database Schema Updates

-- Add SLIDES to LibraryType enum
enum LibraryType {
  IMAGE
  VIDEO
  SLIDES  -- New type
}

-- Add POWERPOINT_PRESENTATION to IntegrationType
enum IntegrationType {
  // ... existing types
  POWERPOINT_PRESENTATION
}

2. Processing Pipeline Options

Option A: LibreOffice HTML Export (Recommended)
  • Convert PowerPoint to HTML with animation preservation
  • Generate static image fallbacks
  • Overhead: 200-500MB memory, 30-60s processing time per file
  • Implementation: Docker container or cloud service
Option B: Cloud-Based Conversion
  • Use Google Cloud Document AI or AWS Textract
  • Lower server overhead, network dependency
  • Overhead: 2-5s processing, minimal local resources
Option C: Video Export
  • Convert presentations to MP4 with timing preservation
  • Leverage existing video display infrastructure
  • Overhead: Similar to LibreOffice but different output format

3. Code Changes Required

Backend Changes
  1. File Upload: Extend MIME type support in apps/backend/src/routes/library.ts
  2. Processing Service: New PowerPointProcessor class
  3. Content Source: Add support for POWERPOINT_PRESENTATION integration type
  4. Database: Update Prisma schema with new enums
Frontend Changes
  1. Upload UI: Accept .ppt/.pptx files in library upload
  2. Display Component: New PowerPointDisplay.tsx component
  3. Content Source Form: Support for PowerPoint library items

4. Metadata Structure

// Library.metadata for PowerPoint files
{
  "slideCount": 20,
  "aspectRatio": "16:9", 
  "duration": 180000, // Total estimated duration in ms
  "hasAnimations": true,
  "renderType": "html", // "html", "images", or "video"
  "htmlPath": "/presentations/abc123/index.html",
  "fallbackImages": ["/presentations/abc123/slide1.jpg", ...],
  "autoAdvanceTimings": [5000, 3000, 7000, ...] // Per-slide timings
}

Implementation Phases

Phase 1: Basic Upload and Image Conversion

  • [ ] Update database schema (LibraryType.SLIDES)
  • [ ] Extend file upload to accept PowerPoint files
  • [ ] Implement basic LibreOffice image conversion
  • [ ] Create static slideshow display component

Phase 2: Animation Preservation

  • [ ] Implement HTML export with LibreOffice
  • [ ] Create PowerPoint-specific display component
  • [ ] Add iframe rendering with fallback to images
  • [ ] Extract and preserve slide timing data

Phase 3: Production Optimization

  • [ ] Add cloud-based conversion option
  • [ ] Implement caching for processed presentations
  • [ ] Add video export alternative for complex animations
  • [ ] Performance monitoring and optimization

Phase 4: Integration and Polish

  • [ ] Integrate with existing Google Slides workflow
  • [ ] Unified presentation management interface
  • [ ] Comprehensive error handling and logging
  • [ ] Documentation and user guides

Technical Considerations

Resource Overhead

  • LibreOffice: 200-500MB memory per conversion, 3-5s startup time
  • Processing Time: 30-60s for complex presentations
  • Storage: Original file + converted outputs + thumbnails
  • Scaling: Consider queue-based processing for multiple uploads

Alternative Approaches Evaluated

  1. PDF Conversion: Lower fidelity, loses animations
  2. WebAssembly: Large bundle sizes, browser compatibility issues
  3. Third-party Services: External dependencies, cost considerations
  4. Office Online Embedding: Highest fidelity but requires Office 365 integration

Files to Modify

Backend

  • apps/backend/prisma/schema.prisma - Add enums and types
  • apps/backend/src/routes/library.ts - File upload support
  • apps/backend/src/services/powerPointProcessor.ts - New processing service
  • packages/shared-backend/src/types/contentSource.ts - Type definitions

Frontend

  • packages/shared-frontend/src/components/PowerPointDisplay.tsx - New component
  • apps/brandcast-frontend/src/components/admin/LibraryManager.tsx - Upload UI
  • packages/shared-frontend/src/constants/contentTypes.ts - Content type support

Acceptance Criteria

  • [ ] Users can upload .ppt/.pptx files to library
  • [ ] Presentations display with preserved animations on digital signage
  • [ ] Fallback to static images when animations fail to load
  • [ ] Processing completes within reasonable time (< 2 minutes)
  • [ ] Supports standard PowerPoint features (transitions, animations, embedded media)
  • [ ] Integration with existing content source and layout system

Related Issues

  • Extends existing Google Slides functionality
  • Builds on current library upload infrastructure
  • Integrates with display rendering pipeline

---

Priority: High
Estimated Effort: 3-4 sprints
Dependencies: Cloud service evaluation, LibreOffice containerization

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗