--- 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} Detected {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} Copy )) } Prefer the browser? Self-host the web app and open it as a PWA on any device.
{releaseDate && Released {releaseDate} ยท } Release notes
{pm.command}
Prefer the browser? Self-host the web app and open it as a PWA on any device.