Skip to content

ardoviniandrea/ViniPlay

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ViniPlay

A powerful, self-hosted IPTV player with a modern web interface.

Stream your M3U playlists with EPG data, manage users, cast to your TV, and watch multiple channels at once.

Join my discord to talk with the community.

Docker Ready Node.js Backend


ViniPlay transforms your M3U and EPG files into a polished, high-performance streaming experience. It's a full-featured IPTV solution that runs in a Docker container, providing a robust Node.js backend to handle streams and a sleek, responsive frontend for an exceptional user experience.

The server-side backend resolves common CORS and browser compatibility issues by proxying or transcoding streams with FFMPEG, while the feature-rich frontend provides a user experience comparable to premium IPTV services.

Main User Interface Flow

Main User Interface Flow

Feature Snapshots

TV Guide Page Multi-View Page Direct Player
TV Guide page Multi-View page
View Animation
Direct player
DVR & Recording Admin Activity Monitoring Push Notifications
DVR
View Animation
Admin activity Notification
View Animation
Powerful Settings Responsive Mobile View Favorite Manager
Settings Mobile TV Guide view Favorite manager
View Animation

✨ Features

  • πŸ‘€ Multi-User Management: Secure the application with a dedicated admin account. Create, edit, and manage standard user accounts.
  • πŸ“Ί Modern TV Guide: A high-performance, virtualized EPG grid that handles thousands of channels and programs smoothly. Features include advanced search, channel favoriting, and a "Recents" category.
  • πŸ–ΌοΈ Multi-View: Drag, drop, and resize players on a grid to watch multiple streams simultaneously. Save and load custom layouts. "Immersive view" will hide all UI elements and only leave the players on the page to maximize the watching experience.
  • πŸ›œ Chromecast Support: Cast your streams directly to any Google Cast-enabled device on your network. (This will only work if your source signal is strong and correctly passed without package missing, due to Cast framework)
  • πŸ”” Push Notifications: Set reminders for upcoming programs and receive push notifications in your browser, even when the app is closed.
  • βš™οΈ Powerful Transcoding - even with GPUs: The backend uses FFMPEG to process streams, ensuring compatibility across all modern browsers and devices. Create custom stream profiles to tailor transcoding settings. GPU transcoding supported. (Nvidia, InterlQSV and Vaapi)
  • πŸ“‚ Flexible Source Management: Add M3U and EPG sources from either local files, XC code and remote URLs. Set automatic refresh intervals for URL-based sources to keep your guide data fresh.
  • πŸš€ High Performance UI: The frontend is built with performance in mind, using UI virtualization for the guide and efficient state management to ensure a fast and responsive experience.
  • 🐳 Dockerized Deployment: The entire application is packaged in a single Docker container for simple, one-command deployment using Docker or Docker Compose.
  • ▢️ Picture-in-Picture: Pop out the player to keep watching while you work on other things.
  • πŸŽ₯ DVR: Record programs using FFMPEG. Schedule recording via the TV Guide, or set specific channels and time with ease.
  • πŸ“½οΈ Single player: Play .m3u8 and .ts links directly from the browser, with detailed console logs and recorded history
  • πŸ‘₯ Admin monitoring page: Monitor users watch stream in real time, store historical plays, and broadcast messages to all users.
  • πŸ“Ί VODs support: Play your VODs from your provider, divided cleanly in the UI with a scalable grid, with filters and tabs for Movies and Series (IMPORTANT: this only workd with XC API log in)

πŸš€ Getting Started

ViniPlay is designed for easy deployment using Docker.

Prerequisites

  • Docker
  • Docker Compose (Recommended)

Method 1: Using docker-compose (Recommended)

  1. Create Project Files: Create a directory for your ViniPlay setup and add a docker-compose.yml and a .env file.

    • docker-compose.yml:

      version: "3.8"
      services:
        viniplay:
          image: ardovini/viniplay:latest
          container_name: viniplay
          ports:
            - "8998:8998"
          restart: unless-stopped
          volumes:
            - ./viniplay-data:/data
          env_file:
            - ./.env
      
      
    • .env:

      # Replace this with a long, random, and secret string
      SESSION_SECRET=your_super_secret_session_key_here
      
      

      Security Note: Your SESSION_SECRET should be a long, random string to properly secure user sessions.

  2. Build and Run the Container:

    docker-compose up --build -d
    
    

Method 2: Using docker

  1. Build the Image:

    docker build -t viniplay .
    
    
  2. Run the Container: Create a volume directory (mkdir viniplay-data) and a .env file first. Then run the container:

    docker run -d \
      -p 8998:8998 \
      --name viniplay \
      --env-file ./.env \
      -v "$(pwd)/viniplay-data":/data \
      viniplay
    
    

First-Time Setup

Once the container is running, open your browser and navigate to http://localhost:8998. You will be prompted to create your initial admin account. After creating the admin account, you can log in and start configuring your sources in the Settings tab.


πŸ”§ Configuration

All configuration is done via the web interface in the Settings tab.

  • Data Sources: Add your M3U and EPG sources from remote URLs, XC Codes, uploaded files.
  • Processing: After adding sources, click the Process Sources & View Guide button to download, parse, and merge all your data.
  • Player Settings: Manage User-Agent strings and define ffmpeg stream profiles.
  • User Management (Admin): Admins can create, edit, and delete user accounts.

πŸ—οΈ Project Structure

The project is organized into a Node.js backend and a modular vanilla JavaScript frontend.

/
β”œβ”€β”€ public/                          # Frontend static files
β”‚   β”œβ”€β”€ js/
β”‚   β”‚   β”œβ”€β”€ main.js                  # Main application entry point
β”‚   β”‚   └── modules/                 # Modular JS components for each feature
β”‚   β”‚       β”œβ”€β”€ api.js               # Backend API communication
β”‚   β”‚       β”œβ”€β”€ auth.js              # Authentication flow
β”‚   β”‚       β”œβ”€β”€ cast.js              # Google Cast logic
β”‚   β”‚       β”œβ”€β”€ dvr.js               # DVR logic
β”‚   β”‚       β”œβ”€β”€ guide.js             # TV Guide logic & rendering
β”‚   β”‚       β”œβ”€β”€ multiview.js         # Multi-View grid and players
β”‚   β”‚       β”œβ”€β”€ notification.js      # Push notification management
β”‚   β”‚       β”œβ”€β”€ player.js            # Video player (mpegts.js)
β”‚   β”‚       β”œβ”€β”€ settings.js          # Settings page logic
β”‚   β”‚       β”œβ”€β”€ state.js             # Shared application state
β”‚   β”‚       β”œβ”€β”€ ui.js                # Global UI functions (modals, etc.)
β”‚   β”‚       └── utils.js             # Utility functions (parsers)
β”‚   β”œβ”€β”€ sw.js                        # Service Worker for push notifications
β”‚   └── index.html                   # Main HTML file
β”‚
β”œβ”€β”€ server.js                        # Node.js backend (Express.js)
β”œβ”€β”€ Dockerfile                       # Docker build instructions
β”œβ”€β”€ docker-compose.yml               # Docker Compose configuration
β”œβ”€β”€ package.json                     # Node.js dependencies
└── .env                             # Environment variables (e.g., SESSION_SECRET)


πŸ—οΈ Roadmap

Upcoming features and fixes include:

  • Add VODs support for M3U links and File uploads
  • Making DVR .ts files seekable during recording.
  • Storing logos to improve load time.
  • Implementing full horizontal scroll in the TV Guide.

βš–οΈ License

ViniPlay is licensed under CC BY-NC-SA 4.0:

  • BY: Give credit where credit’s due.
  • NC: No commercial use.
  • SA: Share alike if you remix.

For full license details, see LICENSE.