5 ms·
Show HN: I pipe free sports streams into Jellyfin – no ads, just HLS
- deleted 6mo ago[deleted]
- pruz 6mo agoI self-host Jellyfin on my homelab and got frustrated opening a laptop every time there was a football match just to deal with popup-infested streaming sites. The actual video underneath is just a standard HLS stream, but getting it into Jellyfin turned out to be harder than expected. Three problems: (1) the m3u8 URL is buried behind iframes and obfuscated JS, (2) tokens expire every few hours, and (3) the upstream server checks User-Agent and Referer headers on both the playlist and .ts segments — Jellyfin doesn't send these, so you get 403. I ended up writing three scripts: - detect-headers.sh: give it a page URL, it follows the iframe chain, extracts the m3u8, then brute-forces header combinations on both .m3u8 and .ts requests. Tells you exactly what the stream needs. - hls-proxy.py: single-file Python reverse proxy (stdlib only, zero pip dependencies). Injects the required headers and rewrites the m3u8 so segment requests also go through the proxy. - refresh-m3u.sh: extracts fresh URLs before tokens expire, outputs a Jellyfin-ready M3U with logos and channel groups. Runs on a systemd timer. ~200 lines of Python, ~100 lines of bash. The proxy is the interesting part technically — it has to handle relative and absolute segment URLs, rewrite URI= in EXT tags (for encryption keys), and add CORS headers since Jellyfin's web client makes cross-origin requests. Happy to answer questions about the approach or implementation.
- originalvichy 6mo agoCool implementation. Never occurred to me Jellyfin could serve as a streaming platform on its own! I’ll probably find the answer after sending this reply (may be helpful to others), but does it come with this functionality out of the box, or is any plug-in needed? How probable is it that this kind of method can be patched or obfuscated further? I assume that since the HLS stream is always at the core, it’s a matter of just finding alternative ways to dig through it. Any quirks this implementation has wrt. things like quality or additional delay? Thanks! I’d like to try out if your methods could be used to make some sort of snippet that could be sent to VLC that’s running on a TV or streaming device.
- c-hendricks 6mo agoAdjacent, but back when Plex supported plugins all your plugin had to do was eventually give it a link to a video / stream and bam, you could watch the content on any device. I built a fairly popular plugin around the idea of deduplicating tv / movie listings and letting people watch now or direct download.
- gibsonsmog 6mo agoI'm curious if there is a particular technical reason you chose to make this as a separate script rather than some kind of Jellyfin plugin? I actually appreciate that you did it in this fashion (more useful for me personally), just curious if there were limitations within the Jellyfin/dotNet system. Either way, gonna make my World Cup viewing experience this year a lot easier haha
- dharbin 6mo ago[dead]
- dchuk 6mo agoVery cool. I’ve used a paid service for years now that gets me all sorts of sports and channels very reliably, I would assume they’re doing something similar to make this work. Might try this though with my home server setup. Think it could be ran from within a docker container so I could add it to an existing docker compose media server setup?
- theappsecguy 6mo agoany chance you'd be willing to share what the service is? I use streameast all the time but it's not reliable enough
- FatherOfCurses 6mo agoseconded
- Handy-Man 6mo agoNot OP, but I have used iptvore[dot]net previously
- rockostrich 6mo agoYou will want to search for IPTV services. It's a bit of a wild west out there but I'd recommend finding one that has a Discord. Most will offer a free trial for 24 hours or a week for you to try them out.
- dchuk 6mo agoIt's one of those sites where they don't really like to be advertised, but if you really like *seasons* that are just *4* *u*, try adding a .com
- the_real_cher 6mo agogoogle 'free media heck yeah' and follow the rabbit hole.
- chatmasta 6mo ago
- dewey 6mo agoIt's a cool hack...but also a bit unethical as the reason they are free is that there's ads. I almost feel it's more ethical to sign up for a paid pirated IPTV service and then use that, with the benefit of that being more stable and probably with higher quality.
- kaan_keskin 6mo agoI totally needed something like this. Looks very good.
- kstrauser 6mo agoI love it. I’m willing to pay for streaming sports services, to a point, but all of them are freaking insane. For example, my wife and I like watching baseball. So let’s do the right thing and pay for it, right? LOL, as if that were possible. For $120[0] we can watch the Giants games, or for $220, all games… but subject to blackout. For $120, we can’t actually watch home games. We’d have to pay for a separate streaming service for those. It’s similar for NFL, and I assume NHL and NBA, too. I’d pay to watch the stuff I watch if it were possible, but it’s not! [0] https://www.mlb.com/live-stream-games/subscribe/giants https://www.mlb.com/live-stream-games/subscribe/giants
- dewey 6mo agoSport streaming is the one where I don't feel bad about using unofficial services, they are reasonably priced, I can watch the broadcast of the country that I prefer (Sky UK over the German coverage for example) and I can use an app like https://www.uhfapp.com https://www.uhfapp.com which is more polished and works better than all the official streaming apps combined.
- deleted 6mo ago[deleted]
- wombat-man 6mo agofor NFL it hugely depends on whether you want to follow the local team. So far, if you're in the local market the NFL generally shows the games on broadcast for free, and that you can get to with an antenna and a TV card depending on where you are. MLB, I haven't tried for a few years but I could watch any out of market game on mlb.tv, but not any that involved the local team, so it was the opposite. For that there was a special regional sports channel that I'd have to subscribe to. No way to do it directly with the network, I'd have to get satellite or something.
- kstrauser 6mo ago> for NFL it hugely depends on whether you want to follow the local team. That's the situation for probably 95% of viewers, though. Others might want to watch games from where they grew up, but most people typically follow the local teams. We don't even have a great way to get an antenna feed into our TV, and that also means we have one way to watch everything except local games, and another, worse way to watch them (for example, by not having a way to pause them). I get why the streaming apps don't show local games from their business POV, but as a potential subscriber, that's a them-problem, not a me-problem. There's no way I'm paying that much money without being able to watch the home games.
- amusingimpala75 6mo agoSince this works on the raw data streams from the official distributor, this is legal, correct?
- neko_ranger 6mo agoSports should be free to watch, the product itself is covered in ads already
- js2 6mo agoThis works with Jellyfin because it supports m3u: https://jellyfin.org/docs/general/server/live-tv/setup-guide/#m3u-tuner-specific-options https://jellyfin.org/docs/general/server/live-tv/setup-guide... Channels DVR also supports m3u: https://getchannels.com/docs/channels-dvr-server/how-to/custom-channels/ https://getchannels.com/docs/channels-dvr-server/how-to/cust... The README mentions Plex and Emby, but those don't support m3u, so you need to use a proxy which makes an m3u source appear like a local tuner such as: https://github.com/Threadfin/Threadfin https://github.com/Threadfin/Threadfin https://github.com/xteve-project/xTeVe https://github.com/xteve-project/xTeVe https://github.com/vorghahn/iptv4plex https://github.com/vorghahn/iptv4plex
- skippyboxedhero 6mo agoThere is also threadfin, which I found a bit more friendly than XTeVe. Above system works pretty well but had trouble with encode/decode speed somewhere. Tried with N100 cpu and still had the same result...probably user error somewhere but none of the options seemed to work. No issues with UHF so kept using that.
- js2 6mo agoThanks, just added it.
- evulhotdog 6mo agoAdd Dispatcharr to the list! https://github.com/Dispatcharr/Dispatcharr https://github.com/Dispatcharr/Dispatcharr
- js2 6mo agoNice! Too late to edit.
- hybirdss 6mo agoSmart approach to the header problem. I hit something similar building a Netflix episode resolver — the data is all there in the HTML but you need the right headers or you get nothing. Ended up just wrapping curl with the right User-Agent and it worked without needing a full browser. The auto-learned Referer per upstream host is a nice touch. How often do the upstream sources change their header requirements on you?
- mugseller26 6mo agoInteresting I had the exact same problem, wonder how you handle searching / playing the specific game you wanna watch (in jellyfin I suppose?) The way I solved it is write a small server process that 1. Takes in a game keyword I want to watch (eg Celtics) 2. Go on to stream site, scrape the game and follow to the video URL 3. Launch a chromium docker instance w. URL and send JS to click on the play button lol (CDP) 4. The stream site sometimes get stuck, so there's also refresh endpoint to relaunch the above process ^ I installed Wayland display server (kiosk mode) in Homelab and use HDMI to play on TV. And the frontend I use home assistant for entering the game