Playlist will not load: the six causes we see most

Most of them can be told apart with one test outside the app. The one that fails on a single machine while every other device works takes the longest to find.

A playlist that will not load is usually one of 6 things. They are listed roughly in order of how often we see them, except the third, which is out of order because it wastes the most time.

1. The credentials expired, or the subscription was suspended

The dullest answer and the most common one. Providers expire accounts, and a rejected login and an unreachable host look alike from the outside, so the failure often reads as a network problem. Inside the app they are kept apart: when the provider does answer, an account it marks expired, disabled or banned, or a password it refuses, is reported as that rather than as a network failure.

Test it outside the app: open the provider address in a browser and see whether it answers. If it refuses you there too, nothing on your machine is at fault.

2. You are at your connection limit

An import or a refresh may need a connection of its own, and a subscription allowing 2 with 2 already in use has none to give. The failure is intermittent and follows no pattern you can see, because it depends on what everyone else in the house is doing. For a provider login the numbers are not hidden: the provider's login reply carries both the connections your subscription allows and the connections in use, and the app reads both when it first checks the account.

Stop every other stream and retry once. If it works, the diagnosis is settled. Provider connection limits covers the accounting, including why a connection can stay spent for a while after you stopped watching.

3. It fails on one machine and works everywhere else

This one is out of order because it is the expensive one.

The symptom is specific and misleading: the login or refresh call fails on one device, while the same account works on another. Same host, same credentials, same network. Everything about it says the provider is broken.

It took me a long time to see the first time, precisely because everything that normally indicates a working setup was working. I blamed the provider first. The test that identifies it: try the same account on a different machine on the same network. If that one logs in fine, the provider is not the cause, and the difference is in the software or settings of the first machine.

4. It is a URL, but not the right kind of URL

Providers hand out several addresses and they are not interchangeable. A provider login address, a playlist export URL and a guide URL look similar and do different things.

The three shapes, which providers rarely label:

provider login   https://provider.example.com          host + username + password
playlist         https://provider.example.com/playlist.m3u
guide            https://provider.example.com/guide.xml

If you have a username, a password and a host, add it as a provider login rather than pasting a generated playlist URL. You get categories, a connection count and catch-up that a flat export cannot express. M3U versus a provider login covers the difference.

URLs are accepted up to 2048 characters, so length is rarely the issue. Copy and paste rather than typing. A single wrong character in a token fails exactly like expired credentials.

5. The account is at 10 cloud playlists

The ceiling is 10, and the check runs when an upload starts rather than when it finishes, so you find out before spending the bandwidth. Remove one you no longer use.

6. The file itself is malformed

This is the case where "added successfully" and "works on your device" are two different events.

The server does not parse your playlist. A file import is stored encrypted and a URL import records the address; the parsing happens on the device that is going to play it. So a source can be added to your account without complaint and then fail on one machine. That is not a contradiction. One check does run before a file leaves your device: it must be named .m3u or .m3u8 and begin with #EXTM3U or #EXTINF, so a saved error page is refused at the upload rather than stored and broken later.

What goes wrong inside files is more mundane than people expect. A fixture pack of 51 real-world files turned up 3 distinct faults, each capable of losing an entire provider's data over a single byte: an unescaped ampersand, a file declaring UTF-8 while carrying Latin-1 bytes, and a stray control character. All 3 are now repaired rather than fatal, and the repairs are counted, so a file that needed patching says so. Compressed input is identified by its leading bytes rather than its name, and decompression stops at 2 GiB of output or 400 times the compressed size, so a URL that promises one thing and serves another still works, and a hostile archive does not fill a disk.

Slow is not the same as broken

Rule this out before concluding anything. A playlist from a provider can hold thousands of entries across many groups of very different sizes. Parsing and indexing that on first import takes real time, and a device that looks stuck may be working.

Give a first import a few minutes. Every launch after it is fast, because the index is built once.

If the source loads and the channels are there but the schedule is empty, that is a different problem: an empty guide. If channels load and will not play, fixing buffering and stuttering starts with the classification.

What this article measured21 claims, each with the evidence behind it
ClaimEvidenceCounted
Parsing happens on your device, not on our servers, so an import can succeed at the account level and still fail on one machine.n = 1Aug 31, 2026
A guide or playlist URL is accepted up to 2048 characters, which is long enough for the token-bearing URLs providers hand out.n = 1Aug 31, 2026
An account holds at most 10 cloud playlists, and the check runs when an upload is initialised rather than when it completes.n = 1Aug 31, 2026
Three distinct encoding faults, each able to lose an entire provider's data over one bad byte, were found by a 51 file fixture pack: an unescaped ampersand, UTF-8 declared over Latin-1 bytes, and a stray control character.n = 51Aug 16, 2026
A large production source can hold thousands of titles across many categories of very different sizes, so a slow first parse is not the same symptom as a failed one.n = 1Aug 31, 2026
Compressed input is identified by its leading bytes rather than its file name, so a URL whose extension promises one thing and serves another still works, and an HTML error page is rejected as not XML rather than as a decompression failure.n = 4Sep 1, 2026
Failures are classified into eight kinds rather than one error, keeping a size limit, a decompression limit and a security limit distinct from an ordinary network failure.n = 8Sep 1, 2026
A compressed source is bounded twice, at 2 GiB of output and at 400 times its compressed size, so an oversized or hostile archive stops early rather than filling a disk.n = 2Sep 1, 2026
A parse reports kept and dropped counts alongside compressed and uncompressed sizes, which is what distinguishes a truncated download from a file that simply had little in range.n = 7Sep 1, 2026
A stream that will not open at all is a distinct fault class from one that opens and then stalls, so a credential problem and a network stall are not reported the same way.n = 1Sep 1, 2026
A fault inside the first 15 seconds sends the recovery ladder straight to a source switch rather than a retry, on the grounds that the source never proved itself.n = 1Sep 1, 2026
Only 1 restart of a failing address is attempted before switching sources, because field data showed a second restart of a dead source never helps.n = 1Sep 1, 2026
Retries back off exponentially with jitter to a 30 second cap, then continue in the background every 60 seconds and stop entirely after 30 minutes, which protects a provider from a reconnect storm.n = 4Sep 1, 2026
Thirteen kinds of account state sync between devices and none of them is the playlist itself: what syncs is the source definition and your decisions about it.n = 13Sep 1, 2026
Combining providers is stored as a definition and resolved on the device, so a problem with a combined source is a local resolution problem rather than a server one.n = 1Sep 1, 2026
Measured across 2,203 entries, guide identifier coverage was 100 percent in one playlist and 73.5 percent in another, with 20 entries carrying an attribute that was present but empty.n = 2203Aug 31, 2026
An identifier attribute that is present and empty is a different state from an absent one, and treating it as a value would join every such entry to every other.n = 20Aug 31, 2026
A stream that will not open at all is classified separately from one that opens and stalls, so a failure to open is a distinct fault class rather than a generic error.n = 1Aug 31, 2026
Before a provider source syncs, the client reads the provider's login reply and names the rejection: an account marked expired, disabled or banned, an expiry date already past, and refused credentials are each a distinct failure kind rather than a generic network error.n = 5Oct 9, 2026
The provider's login reply carries both the number of connections the subscription allows and the number in use, and the first-run check of a new provider login reads both.n = 1Oct 9, 2026
A playlist file is checked before it is uploaded: it must be named .m3u or .m3u8 and, after an optional byte order mark and leading whitespace, begin with #EXTM3U or #EXTINF, so a saved error page is refused at upload instead of being stored and failing later.n = 1Oct 9, 2026