IPTV-playlist: så funkar M3U-filen din player läser

Illustration av en playlist-fil med kodrader

Öppna din M3U-fil i en texteditor någon gång. Gör det – på riktigt. Där ser du exakt vad din player ser, och det är: en rad metadata per kanal, en rad med strömmens adress, om och om igen tills filen tar slut. Inget format att vara rädd för. Ren text. Men två-tre attribut i den där texten avgör om din EPG mappas rätt eller om tablån gapar tom, och det är dem den här artikeln plockar isär.

TL;DR: #EXTM3U överst, sen en #EXTINF-rad med attribut (tvg-id, tvg-name, group-title) följd av stream-URL:en – kanal för kanal, uppifrån och ner. tvg-id är kopplingen till EPG:n, och den jämförs tecken för tecken: minsta avvikelse och kanalen står utan tablå. Redigera i en ren texteditor. Aldrig, aldrig i Word.

Filen är enklare än ryktet

Så här ser en kanal ut i en M3U-playlist:

#EXTM3U url-tvg="https://exempel.se/epg.xml"
#EXTINF:-1 tvg-id="svt1.svt.se" tvg-name="SVT1" group-title="Sverige",SVT1
http://exempel.se/stream/svt1.m3u8

Rad ett: "det här är en M3U", plus eventuellt en pekare till EPG-källan. Rad två: kanalbeskrivningen. Rad tre: strömmens adress. Sen upprepas två och tre tills kanalerna är slut. Det är hela formatet – en lista med 200 kanaler är 400 rader plus en, och playern läser uppifrån och ner och bygger kanallistan i exakt den ordningen. Inget schema, ingen databas, ingen magi.

Formatet byggdes för musikspellistor på 90-talet och har i princip aldrig uppgraderats sedan dess, vilket låter som kritik men inte är det. IPTV-världen valde det för att det var enkelt, och enkelt är fortfarande dess bästa egenskap. Som adressbok mellan källa och player gör det precis vad det ska. Mer behöver en adressbok inte göra.

Attributen gör jobbet

Allt intressant bor på EXTINF-raden:

  • tvg-id – kanalens id i EPG-källan. Det viktigaste attributet i hela filen; mer om det strax.
  • tvg-name – kanalens namn som text. Vissa playerappar använder det som reservnyckel för EPG-matchning när tvg-id saknas. Opålitligt, men bättre än inget.
  • group-title – vilken grupp kanalen sorteras in i, till exempel "Sverige" eller "Sport". Det är detta playern bygger sina kategoriflikar av.
  • tvg-logo – en URL till kanalens logga.

Och om tvg-logo, eftersom någon alltid frågar: skippa den. Jag mätte en gång loggorna på en tablåsajt. 50 kB styck. 28 kanaler. 1,4 MB extra laddning – för cirklar du redan känner igen. Du vet vad K5 heter. Loggan vet inte när programmet börjar. Samma matematik gäller i din player, där varje logga är ännu en nedladdning, och du bläddrar ändå förbi listan på två sekunder.

tvg-id är bron till EPG:n

Playlisten vet var strömmarna finns. Tablån vet den ingenting om – den bor i en XMLTV-fil som playern hämtar separat, via url-tvg-attributet på rad ett eller via en EPG-URL du matat in själv. Sen sker matchningen, och den är brutalt bokstavlig: varje kanals tvg-id jämförs med XMLTV-filens kanal-id, tecken för tecken. svt1.svt.se och SVT1.svt.se? Två olika kanaler i playerns ögon. Den ena får tablå. Den andra får ingenting.

Det är hela kopplingen. Strängjämförelse, inget annat – vilket har en tröstande baksida: i stort sett varje EPG-problem går att läsa sig till i filerna, med blotta ögat. Mappningen i praktiken står i kopplingsguiden. Och tablådata bortom två dygn ska du inte vänta dig oavsett – källans gräns, inte playlistens.

Felen som återkommer

Sex år med egen backend, och det är fortfarande samma handfull fel jag ser i playlists. Samma. Handfull. I ungefär den här ordningen:

  • Tomt eller felstavat tvg-id. Kanalen spelar men tablån är tom. Vanligaste felet, tråkigaste orsaken.
  • Filen redigerad i ordbehandlare. Word byter raka citattecken mot typografiska, och parsningen går sönder på rad ett. Vill du redigera playlisten: ren texteditor.
  • Fel teckenkodning. Å, ä och ö blir skräptecken, och tvg-name slutar matcha. Spara som UTF-8 – det är det M3U8-ändelsen finns till för.
  • Dubbletter. Samma kanal tre gånger i olika kvalitet utan märkning. Playern klagar inte; du får tre SVT1 och gissar.
  • URL istället för fil. Inte ett fel i filen, men i hanteringen: när du ska lägga till en playlist i playern, klistra in playlistens URL istället för att ladda upp en sparad kopia. Då följer källans uppdateringar med av sig själva – en fil du laddade ner i mars är en fil från mars.

Ingen av punkterna kräver mer verktyg än en texteditor och tålamod. (Tålamodet är det som brukar ta slut först.)

Playlisten är tre rader per kanal. Är tablån tom är det nästan alltid rad två.

Vanliga frågor

Vad är en M3U-fil?

En radbaserad textlista över mediakällor. För IPTV: en metadata-rad per kanal, sen strömmens URL, om och om igen. Playern läser uppifrån och ner och bygger kanallistan av det den hittar.

Hur öppnar jag en M3U-fil?

Vill du läsa den: valfri texteditor, det är ren text. Vill du spela den: en player som VLC. Vill du förstöra den: Word – ordbehandlare byter tecken och knäcker parsningen på rad ett.

Vad gör tvg-id i playlisten?

Det är bron till EPG:n. Playern matchar värdet mot XMLTV-filens kanal-id, tecken för tecken, och minsta avvikelse lämnar kanalen utan tablå. Två strängar som ska vara identiska – hela mekaniken.

Vad är skillnaden mellan M3U och M3U8?

Samma format, UTF-8-kodning – det är det som räddar å, ä och ö. Ändelsen dyker också upp på HLS-manifest, strömfiler i samma syntax. Playern läser båda utan att blinka.

Varför är tablån tom fast playlisten funkar?

För att EPG:n är en helt separat fil. Bild utan tablå betyder nästan alltid att tvg-id:na inte matchar EPG-källans kanal-id – eller att playern aldrig fick någon EPG-URL alls.