Every player button on our sites was device specific, and none of them was the URL
TipoffWatch, GenreWatch and WatchNews all let you play a channel in the page. Beside that button there were three more: VLC, Infuse and a .m3u download. Today they got a fourth, and the fourth is the only one that works everywhere.
The problem was that the buttons kept removing themselves
VLC and Infuse are deep links. vlc-x-callback:// and infuse:// are URL schemes the iOS and Android apps register, so a tap opens the app already on the stream. On a desktop they mean nothing. VLC opens, is handed the whole scheme string as its media address, and reports that it cannot open it. So the script removes both buttons on a desktop, because a button that looks live and then fails is worse than no button.
The .m3u download is the mirror image. On a desktop it is exactly right: it downloads, it opens in VLC, it plays. On iOS Safari either offers to save the playlist or follows it and offers to save a .ts file, and neither plays, because these are MPEG-2 transport streams and Safari has no demuxer for one. So the script removes that button on a phone.
Add those two rules together and you get the thing nobody noticed for months. On any given device, one of the two ways out of the site is already gone. A desktop reader has a download. A phone reader has two deep links. Neither has ever had the address.
And the address is what you actually need if the player you want is not one of the two we can name. mpv. ffmpeg. A set-top box. VLC on a second machine. A Plex box. The answer for all of those was: download the .m3u, open it in a text editor, and copy line three.
What we added
A Copy URL button, in four places.
Beside the player buttons on a channel row, where it copies the same address the VLC link beside it already carries. Under the inline player once something is playing, because by then the row has scrolled off on a phone and the video is fullscreen on a desktop. On every tile of the multiview grid. And under the house player on a WatchNews channel page, where the address is a public HLS playlist that takes no session at all, so what lands in your clipboard plays in VLC exactly as it plays in the page.
The rule that shaped all of it
The address is the credential.
On a line you bought yourself, the stream URL contains your provider username and password. That is why the VLC button hands it over: an external app holds no session with our server, so the only thing we can give it is the real address, and it is your own credential on your own signed in page.
But some rows are not yours. A channel from our own managed line is our reseller credential, not yours, so those rows have never had VLC, Infuse or a download, and they do not have Copy URL either. A channel from somebody else's shared list is their subscription, and the same applies. The new button appears under exactly the condition the old ones do, and disappears under exactly the condition they do.
The multiview grid needed a different answer
The grid is rendered from row ids and nothing else. That is deliberate: a grid is a link, so it survives a reload, it can be bookmarked, and it can be popped out into a picture in picture window that floats over whatever else you are doing. If a credential were in that markup it would travel with all three.
So the tile button does not carry an address. It asks for one on the press, from a route that answers only for the session that owns the row, with no-store and private on the response. Same shape as the "show me the address I gave you" button in settings, and for the same reason: a deliberate press is not the same as something every page view leaks into a screenshot.
The handler is delegated at the document rather than wired per tile, which means a tile you add to the grid after the page loaded works with no extra code. The grid component stamps those out of a template and knows nothing about the button.
And when the clipboard says no
navigator.clipboard does not exist outside a secure context, and even inside one a browser can refuse it. A dead button that swallowed the address would be the worst of the possible endings, so a refusal drops the URL into a field, selected, one keystroke from copied.
Three sites, one change. It is live on tipoffwatch.com, genrewatch.com and watchnews.now now.
Top comments (0)