--- import type { ResolvedRelease } from '../lib/downloads'; import { formatReleaseDate, resolveDownloads } from '../lib/downloads'; import { DOWNLOAD_PLATFORMS, PLATFORM_ICON_PATHS, PLATFORM_LABELS, PLATFORM_PAGES } from '../lib/platforms'; interface Props { release: ResolvedRelease; } const { release } = Astro.props; const releaseDate = formatReleaseDate(release.publishedAt); /** * One row per platform, like the settings pages inside the app. The row lists * the files the release actually carries and sends the visitor to the * platform page, which has the direct links plus install and first-run notes. */ const rows = DOWNLOAD_PLATFORMS.map((platform) => { const downloads = resolveDownloads(release, platform); const shown = [...downloads.filter((d) => d.recommended), ...downloads.filter((d) => !d.recommended)].slice(0, 2); return { platform, label: PLATFORM_LABELS[platform], icon: PLATFORM_ICON_PATHS[platform], href: PLATFORM_PAGES[platform], files: shown.map((d) => ({ name: d.fileName, detail: d.detail })), more: Math.max(downloads.length - shown.length, 0), }; }); const packageManagers = [ { label: 'Homebrew', command: 'brew install --cask iptvnator' }, { label: 'Snap', command: 'sudo snap install iptvnator' }, { label: 'AUR', command: 'yay -S iptvnator-bin' }, ]; ---

Get IPTVnator {release.version}

{releaseDate && Released {releaseDate} ยท } Release notes

{ rows.map((row) => (
{row.label}
    {row.files.map((file) => (
  • {file.name}
  • ))} {row.more > 0 &&
  • + {row.more} more on the {row.label} page
  • }
Download for {row.label}
)) }
{ packageManagers.map((pm) => (
{pm.label} {pm.command}
)) }

Prefer the browser? Self-host the web app and open it as a PWA on any device.