Files
iptvnator/apps/website/src/lib/features.ts
T
4grayandClaude Fable 5.1 98da686cea feat(website): add the phone remote control guide
New guide at /blog/remote-control-guide/: enabling the remote in Settings,
opening it on a phone from the QR code, what each control does and which
list it navigates, a checklist for a page that does not load, and why the
remote must stay on the local network. Eight FAQ entries. The remote-control
feature page now links to it instead of the M3U guide.

Both screenshots are mock-backed. The phone view is the first "browser" shot:
a manifest entry names a loopback URL and a mobile viewport, and the capture
frames it in a separate Chromium page behind the same network and content
guards, with the manifest validator accepting loopback origins only. The
setup saves the remote-control setting so the app's own server answers, then
selects a live channel; the Xtream mock's marketing scenario now serves live
stream URLs from local bytes so that selection never leaves the machine.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 22:06:23 +02:00

96 lines
3.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Registry of the feature landing pages under `/features/`. The hub, the
* per-page switcher, the homepage cards and the build test all read from
* here, so adding a page means adding one entry and one `.astro` file.
*/
export type FeatureSlug =
| 'm3u-player'
| 'xtream-codes-player'
| 'stalker-portal-player'
| 'epg'
| 'remote-control';
export interface FeatureGuide {
href: string;
label: string;
}
export interface FeatureEntry {
slug: FeatureSlug;
/** Short name used in breadcrumbs, cards and the switcher. */
label: string;
/** Mono eyebrow above the page title. */
eyebrow: string;
/** One sentence for cards. */
summary: string;
/** Site-relative href including the GitHub Pages base. */
href: string;
/** 24×24 stroke icon path (Heroicons outline style). */
icon: string;
guide: FeatureGuide;
}
export const FEATURES: readonly FeatureEntry[] = [
{
slug: 'm3u-player',
label: 'M3U playlist player',
eyebrow: 'Feature · M3U playlists',
summary:
'Load M3U and M3U8 playlists from a link, a file or text, and browse tens of thousands of channels with groups, favorites and search.',
href: '/iptvnator/features/m3u-player/',
icon: 'M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z',
guide: { href: '/iptvnator/blog/m3u-playlist-epg-setup-guide/', label: 'M3U and EPG setup guide' },
},
{
slug: 'xtream-codes-player',
label: 'Xtream Codes player',
eyebrow: 'Feature · Xtream Codes API',
summary:
'Sign in with server URL, username and password for live TV, movies and series with posters, details, catch-up and offline downloads.',
href: '/iptvnator/features/xtream-codes-player/',
icon: 'M13 10V3L4 14h7v7l9-11h-7z',
guide: { href: '/iptvnator/blog/xtream-codes-setup-guide/', label: 'Xtream Codes setup guide' },
},
{
slug: 'stalker-portal-player',
label: 'Stalker portal player',
eyebrow: 'Feature · Stalker / Ministra portals',
summary:
'Connect Stalker and Ministra portals by MAC address, the way a MAG box does, with live TV, radio, movies, series and an account page.',
href: '/iptvnator/features/stalker-portal-player/',
icon: 'M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01m-7.08-7.071c3.904-3.905 10.236-3.905 14.141 0M1.394 9.393c5.857-5.858 15.355-5.858 21.213 0',
guide: { href: '/iptvnator/blog/stalker-portal-setup-guide/', label: 'Stalker portal setup guide' },
},
{
slug: 'epg',
label: 'TV guide (EPG)',
eyebrow: 'Feature · Program guide',
summary:
'XMLTV files and portal schedules become a program guide: now and next in every list, a timeline under the player, and catch-up for archived programs.',
href: '/iptvnator/features/epg/',
icon: 'M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z',
guide: { href: '/iptvnator/blog/m3u-playlist-epg-setup-guide/', label: 'M3U and EPG setup guide' },
},
{
slug: 'remote-control',
label: 'Phone remote control',
eyebrow: 'Feature · Remote control',
summary:
'The desktop app serves a web remote to any phone on your network: channel up and down, direct numbers, volume, and a now-playing panel.',
href: '/iptvnator/features/remote-control/',
icon: 'M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z',
guide: { href: '/iptvnator/blog/remote-control-guide/', label: 'Phone remote control guide' },
},
];
export const FEATURES_HUB_HREF = '/iptvnator/features/';
export function featureBySlug(slug: FeatureSlug): FeatureEntry {
const entry = FEATURES.find((feature) => feature.slug === slug);
if (!entry) {
throw new Error(`Unknown feature slug: ${slug}`);
}
return entry;
}