Loading forever usually means the chain never completed
The player can look busy while the real failure happens deeper in the HLS chain. That is why a spinner alone is useless unless you know what request or playback step never settled.
Check manifest, media playlist, and segment access separately
A stream may stall because the top manifest loads, the media playlist half-loads, or segments fail after a short burst of success. Treat these as different breakpoints, not one generic loading bug.
CORS and signed access often hide behind the spinner
A stream that keeps loading can still be an access-policy problem. CORS, short-lived signatures, allowlists, or referer rules often create a delay-shaped failure instead of an immediate hard stop.
Browser behavior can make the symptom look softer than it is
Autoplay policy, buffering strategy, and different HLS paths can make one browser spin while another shows a harder error. That difference is evidence, not noise.
Decode failure can also look like endless loading
If manifests and segments are reachable but playback never really starts, the deeper problem may be codec, timestamp, packaging, or MSE fragility rather than network denial.
How to use m3u8play.net here
Use the site to confirm whether the manifest is valid, whether the player attaches cleanly, and whether the failure feels like policy, stalled fetches, or media behavior. That sequence narrows the stall quickly.