MeiMei Player is a powerful all-in-one media player app that supports M3U/M3U8 playlists. To start using the app:
The home screen provides access to:
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
The #EXTM3U header can include these attributes:
x-tvg-url="URL" - EPG XML URL (can be comma-separated for multiple)billed-msg="Message" - Display message on home screenbg-url="URL" - Background image URL for the appvod_library="URL" - Separate playlist URL for movies/VOD contentrefresh="N" - Auto-refresh interval (see Auto Refresh section)refresh_at="datetime" - One-time refresh at specific time (see Auto Refresh section)tvg-id="id" - EPG channel ID for matching program guidetvg-logo="URL" - Channel logo image URLgroup-title="Group" - Category/group name for organizing channelsgroup-logo="URL" - Logo for the group/categorytype="tv|radio|movie|series" - Content typeKODIPROP is used to set DRM keys, headers, and other stream properties. Place KODIPROP lines before the stream URL.
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):
abc:def{"abc":"def","klm":"opq"}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
#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
#KODIPROP:http-user-agent=CustomUserAgent
#KODIPROP:http-referrer=http://example.com
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
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
MP4 MKV AVI WebM 3GP FLV MOV TS
MP3 WAV FLAC AAC OGG M4A WMA OPUS
Use the type attribute in #EXTINF to categorize content:
type="tv" - Live TV channelstype="radio" - Radio stationstype="movie" - Movies/VODtype="series" - TV seriesSends a unique device JWT (JSON Web Token) to your provider for authentication and access control.
Option 1: Global (All Playlists)
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
When the app sends a request, your provider receives this header:
X-Device-Fingerprint: eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJhbmRyb2lkSWQ...
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"
}
What's included:
Device info (Android ID, model, screen size)
App version and installation ID
No personal data (name, email, location)
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"
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.
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
Set a custom background image for the app home screen:
#EXTM3U bg-url="http://example.com/background.jpg"
Display a message on the home screen (useful for announcements):
#EXTM3U billed-msg="Hello World!"
Automatically update your playlist at scheduled times. Add to the first line of your playlist:
#EXTM3U refresh="6"
How the number works:
refresh="6" = every 6 hours)refresh="30" = every 30 minutes)refresh="300" = every 5 minutes)#EXTM3U refresh_at="2026-12-31T23:59:59Z"
Format: YYYY-MM-DDTHH:MM:SSZ (use 24-hour time)
#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
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.
#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
#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
#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.
#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
#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
#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
#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
In Settings, you can: