Getting Started

MeiMei Player is a powerful all-in-one media player app that supports M3U/M3U8 playlists. To start using the app:

  1. Open the app and go to Settings
  2. Tap "Edit Playlist" to enter your playlist URL
  3. The app will load your channels, movies, and radio stations
Important: Only use this app with content you have proper rights and authorization to access.

The home screen provides access to:

Playlist Format (M3U/M3U8)

The app uses standard M3U/M3U8 playlist format. A basic playlist looks like this:

#EXTM3U
#EXTINF:-1 tvg-id="channel1" tvg-logo="http://example.com/logo.png" group-title="News",Channel Name
http://example.com/stream.m3u8

Header Attributes

The #EXTM3U header can include these attributes:

Channel Attributes (#EXTINF)

KODIPROP Directives

KODIPROP is used to set DRM keys, headers, and other stream properties. Place KODIPROP lines before the stream URL.

Important: Only use DRM features with content you have proper authorization and license to access.

DRM / License Keys

For streams with DRM protection that you are authorized to access:

#KODIPROP:inputstream.adaptive.license_type=clearkey
#KODIPROP:inputstream.adaptive.license_key=kid:key

Supported license key formats (use keys provided by your content provider):

DRM License Server

For streams that require a license server URL:

#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha
#KODIPROP:inputstream.adaptive.license_key=http://example.com/license

HTTP Headers

#KODIPROP:inputstream.adaptive.stream_headers=User-Agent=CustomAgent&Referer=http://example.com

Or use individual header properties:

#KODIPROP:inputstream.adaptive.http-user-agent=CustomUserAgent
#KODIPROP:inputstream.adaptive.http-referrer=http://example.com

Shorthand Headers

#KODIPROP:http-user-agent=CustomUserAgent
#KODIPROP:http-referrer=http://example.com

EXTVLCOPT Directives

Alternative to KODIPROP for setting HTTP headers (VLC-style):

#EXTVLCOPT:http-user-agent=CustomUserAgent
#EXTVLCOPT:http-referrer=http://example.com
#EXTVLCOPT:http-origin=http://example.com

URL Pipe Headers

Headers can also be appended to the URL using pipe separator:

#EXTINF:-1,Channel Name
http://example.com/stream.m3u8|User-Agent=CustomAgent&Referer=http://example.com

Supported Media Types

Stream Formats

Video Formats

MP4 MKV AVI WebM 3GP FLV MOV TS

Audio Formats

MP3 WAV FLAC AAC OGG M4A WMA OPUS

Content Types

Use the type attribute in #EXTINF to categorize content:

Device Fingerprint Guide

Overview

Sends a unique device JWT (JSON Web Token) to your provider for authentication and access control.

How to Use

Option 1: Global (All Playlists)

Settings → Enable "Send Device Fingerprint"

This will automatically add the device fingerprint header to all playlist and stream requests.

Option 2: Per-Stream (In Playlist)

Write x-device-fingerprint as header value — the app auto-replaces it with the real JWT.

Using URL Pipe Headers:

#EXTINF:-1,Program 1
https://stream.com/live.m3u8|X-Device-Fingerprint=x-device-fingerprint

Using KODIPROP:

#EXTINF:-1,Program 2
#KODIPROP:inputstream.adaptive.stream_headers=X-Device-Fingerprint=x-device-fingerprint
https://stream.com/live.m3u8

Using EXTVLCOPT:

#EXTINF:-1,Program 3
#EXTVLCOPT:http-user-agent=CustomAgent
#EXTVLCOPT:X-Device-Fingerprint=x-device-fingerprint
https://stream.com/live.m3u8

What Provider Receives

When the app sends a request, your provider receives this header:

X-Device-Fingerprint: eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJhbmRyb2lkSWQ...

Decoded JWT Payload

The JWT contains device information in this structure:

{
  "androidId": "a1b2c3d4e5f67890",
  "build": {
    "manufacturer": "Samsung",
    "model": "Galaxy S21",
    "brand": "samsung",
    "sdk": 34
  },
  "screen": {
    "width": 1080,
    "height": 2400
  },
  "app": {
    "name": "MeiMei Player",
    "version": "1.2.3"
  },
  "installationId": "unique-uuid"
}

Privacy

What's included:

Device info (Android ID, model, screen size)
App version and installation ID
No personal data (name, email, location)

EPG (Electronic Program Guide)

The app supports XMLTV format for EPG data. Specify EPG URL in the playlist header:

#EXTM3U x-tvg-url="http://example.com/epg.xml"

Multiple EPG sources can be comma-separated:

#EXTM3U x-tvg-url="http://example.com/epg1.xml,http://example.com/epg2.xml"

Matching Channels to EPG

Use tvg-id in your channel definition to match EPG program data:

#EXTINF:-1 tvg-id="news1.us" tvg-logo="http://example.com/logo.png" group-title="News",News Channel 1
http://example.com/news1.m3u8

The tvg-id must match the channel ID in your EPG XML file.

VOD / Movie Library

You can specify a separate playlist for movies using vod_library:

#EXTM3U vod_library="http://example.com/movies.m3u8"

Movie entries follow the same format as channels:

#EXTINF:-1 tvg-logo="http://example.com/poster.jpg" group-title="Action" type="movie",Movie Title
http://example.com/movie.mp4

Custom Background Image

Set a custom background image for the app home screen:

#EXTM3U bg-url="http://example.com/background.jpg"

Home Screen Message

Display a message on the home screen (useful for announcements):

#EXTM3U billed-msg="Hello World!"

Auto Refresh Playlist

Automatically update your playlist at scheduled times. Add to the first line of your playlist:

Method 1: Repeat Every X Time

#EXTM3U refresh="6"

How the number works:

Method 2: Refresh at Specific Time (One-Time)

#EXTM3U refresh_at="2026-12-31T23:59:59Z"

Format: YYYY-MM-DDTHH:MM:SSZ (use 24-hour time)

Examples

#EXTM3U refresh="6"
Refreshes every 6 hours

#EXTM3U refresh="45"
Refreshes every 45 minutes

#EXTM3U refresh_at="2026-03-15T15:30:00Z"
Refreshes once on March 15, 2026 at 3:30 PM
Note: Auto-refresh only works while the app is open.

External Attributes (Advanced)

Load channel attributes from an external URL (lazy-loaded when playing):

#EXTINF:-1,Channel Name
#EXTATTRFROMURL:http://example.com/channel-config.json
http://example.com/stream.m3u8

This is useful for dynamic stream URLs or DRM keys that change frequently.

Complete Playlist Examples

Basic Playlist

#EXTM3U x-tvg-url="http://example.com/epg.xml" billed-msg="Welcome!"

#EXTINF:-1 tvg-id="news1" tvg-logo="http://example.com/news1.png" group-title="News",News Channel 1
http://example.com/news1.m3u8

#EXTINF:-1 tvg-id="news2" tvg-logo="http://example.com/news2.png" group-title="News",News Channel 2
http://example.com/news2.m3u8

#EXTINF:-1 tvg-logo="http://example.com/radio1.png" group-title="Radio" type="radio",Radio Station 1
http://example.com/radio1.mp3

Playlist with Auto-Refresh Every 6 Hours

#EXTM3U refresh="6" x-tvg-url="http://example.com/epg.xml"

#EXTINF:-1 tvg-id="news1" group-title="News",News Channel 1
http://example.com/news1.m3u8

#EXTINF:-1 tvg-id="sports1" group-title="Sports",Sports Channel
http://example.com/sports.m3u8

Playing DRM Stream

#EXTM3U

#EXTINF:-1 tvg-id="premium" group-title="Premium",Premium Channel
#KODIPROP:inputstream.adaptive.license_type=clearkey
#KODIPROP:inputstream.adaptive.license_key=abc:def
http://example.com/stream.mpd

Replace with keys provided by your content provider.

With Custom Headers

#EXTM3U

#EXTINF:-1 group-title="group",Channel
#KODIPROP:inputstream.adaptive.stream_headers=User-Agent=IPTV-Player&Referer=http://provider.com
#EXTVLCOPT:http-origin=http://provider.com
http://example.com/channel.m3u8

With License Server

#EXTM3U

#EXTINF:-1 group-title="group",Channel
#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha
#KODIPROP:inputstream.adaptive.license_key=http://example.com/license
http://example.com/stream.mpd

VOD with Separate Library and Auto-Refresh

#EXTM3U refresh="12" x-tvg-url="http://example.com/epg.xml" vod_library="http://example.com/movies.m3u8" bg-url="http://example.com/bg.jpg"

#EXTINF:-1 tvg-id="ch1" group-title="Entertainment",Channel 1
http://example.com/ch1.m3u8

Radio Stations

#EXTM3U

#EXTINF:-1 tvg-logo="http://example.com/radio1.png" group-title="Music" type="radio",Music Radio 1
http://example.com/radio1.mp3

#EXTINF:-1 tvg-logo="http://example.com/radio2.png" group-title="Music" type="radio",Music Radio 2
http://example.com/radio2.aac

Troubleshooting

Reload Options

In Settings, you can: