diff --git a/.github/workflows/build-and-make.yaml b/.github/workflows/build-and-make.yaml index 4576a5ee1..056b9880f 100644 --- a/.github/workflows/build-and-make.yaml +++ b/.github/workflows/build-and-make.yaml @@ -49,7 +49,7 @@ jobs: if: matrix.os == 'linux' run: | sudo apt-get update - sudo apt-get install --no-install-recommends -y rpm libarchive-tools flatpak flatpak-builder + sudo apt-get install --no-install-recommends -y rpm libarchive-tools flatpak flatpak-builder appstream # Configure Flatpak # 1. Add the Flathub repository (source of runtimes) @@ -68,6 +68,27 @@ jobs: - name: Build backend run: pnpm run build:backend + - name: Validate AppStream metadata + if: matrix.os == 'linux' + run: appstreamcli validate --pedantic --no-net apps/electron-backend/linux/com.fourgray.iptvnator.metainfo.xml + + - name: Build website + if: matrix.os == 'linux' + run: pnpm nx build website --skip-nx-cache + + - name: Verify AppStream website assets + if: matrix.os == 'linux' + shell: bash + run: | + set -euo pipefail + + for screenshot in player playlists epg settings; do + if ! find dist/apps/website -path "*/appstream/${screenshot}.png" -print -quit | grep -q .; then + echo "::error::Missing AppStream website asset for ${screenshot}.png" + exit 1 + fi + done + - name: Override macOS arch in electron-builder.json if: matrix.os == 'macos' run: | @@ -241,6 +262,7 @@ jobs: fi flatpak install --user --noninteractive -y "${FLATPAK_BUNDLE}" + flatpak run --command=sh com.fourgray.iptvnator -c 'test -f /app/share/metainfo/com.fourgray.iptvnator.metainfo.xml' flatpak run --command=sh com.fourgray.iptvnator -c '/app/bin/iptvnator --version' - name: Upload artifacts (macOS) diff --git a/apps/electron-backend/linux/com.fourgray.iptvnator.metainfo.xml b/apps/electron-backend/linux/com.fourgray.iptvnator.metainfo.xml new file mode 100644 index 000000000..161e63e64 --- /dev/null +++ b/apps/electron-backend/linux/com.fourgray.iptvnator.metainfo.xml @@ -0,0 +1,63 @@ + + + com.fourgray.iptvnator + CC0-1.0 + MIT + IPTVnator + 4gray + fourgray@proton.me + Open-source IPTV player for M3U, Xtream Codes, and Stalker portals + com.fourgray.iptvnator.desktop + + +

IPTVnator is a cross-platform IPTV player for user-supplied playlists and portal connections.

+

It supports M3U and M3U8 playlists, Xtream Codes API, and Stalker portals with EPG, catch-up, favorites, and external player integration.

+

The app does not include channels, playlists, or media catalogs. Any IPTV sources, logos, metadata, and programme information come from services the user configures.

+
+ + + AudioVideo + Player + Video + + + + IPTV + M3U + M3U8 + EPG + Xtream + Stalker + + + https://4gray.github.io/iptvnator/ + https://github.com/4gray/iptvnator/issues + https://github.com/4gray/iptvnator + https://4gray.github.io/iptvnator/blog/ + https://github.com/sponsors/4gray + + + + + + Browse channels and watch live IPTV streams + https://4gray.github.io/iptvnator/appstream/player.png + + + Manage playlists and switch between sources + https://4gray.github.io/iptvnator/appstream/playlists.png + + + View programme schedules in the integrated EPG + https://4gray.github.io/iptvnator/appstream/epg.png + + + Adjust playback, interface, and provider settings + https://4gray.github.io/iptvnator/appstream/settings.png + + + + + iptvnator + +
diff --git a/apps/website/public/appstream/epg.png b/apps/website/public/appstream/epg.png new file mode 100644 index 000000000..5c7a857f3 Binary files /dev/null and b/apps/website/public/appstream/epg.png differ diff --git a/apps/website/public/appstream/player.png b/apps/website/public/appstream/player.png new file mode 100644 index 000000000..fa953d889 Binary files /dev/null and b/apps/website/public/appstream/player.png differ diff --git a/apps/website/public/appstream/playlists.png b/apps/website/public/appstream/playlists.png new file mode 100644 index 000000000..6fd4de312 Binary files /dev/null and b/apps/website/public/appstream/playlists.png differ diff --git a/apps/website/public/appstream/settings.png b/apps/website/public/appstream/settings.png new file mode 100644 index 000000000..e6a68a0dc Binary files /dev/null and b/apps/website/public/appstream/settings.png differ diff --git a/electron-builder.json b/electron-builder.json index 32ba5457f..1c1faadc1 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -70,6 +70,15 @@ "artifactName": "${name}-${version}-${os}-${arch}.${ext}", "icon": "apps/web/src/assets/icons" }, + "flatpak": { + "branch": "stable", + "files": [ + [ + "apps/electron-backend/linux/com.fourgray.iptvnator.metainfo.xml", + "/share/metainfo/com.fourgray.iptvnator.metainfo.xml" + ] + ] + }, "afterPack": "./tools/packaging/linux-after-pack.cjs", "snap": { "confinement": "strict", diff --git a/tools/packaging/verify-electron-package-layout.mjs b/tools/packaging/verify-electron-package-layout.mjs index 80f0295ac..830417751 100644 --- a/tools/packaging/verify-electron-package-layout.mjs +++ b/tools/packaging/verify-electron-package-layout.mjs @@ -16,6 +16,13 @@ const workspaceRoot = process.cwd(); const executablesRoot = path.join(workspaceRoot, 'dist', 'executables'); const packageJsonPath = path.join(workspaceRoot, 'package.json'); const electronBuilderConfigPath = path.join(workspaceRoot, 'electron-builder.json'); +const flatpakMetainfoPath = path.join( + workspaceRoot, + 'apps', + 'electron-backend', + 'linux', + 'com.fourgray.iptvnator.metainfo.xml' +); const packageMetadata = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); const electronBuilderConfig = JSON.parse( fs.readFileSync(electronBuilderConfigPath, 'utf8') @@ -197,6 +204,9 @@ function verifyResourceDir(resourceDir) { } if (platform === 'linux') { + if (!fileExists(flatpakMetainfoPath)) { + errors.push(`Missing Flatpak metainfo file: ${flatpakMetainfoPath}`); + } verifyLinuxLauncher(resourceDir, errors); }