Add flatpak metadata and script to keep versions in sync (#1215)

* Add flatpak metadata and script to keep versions in sync

* Split .desktop out of appimage install script

---------

Co-authored-by: Jeff <42182408+jeffvli@users.noreply.github.com>
This commit is contained in:
Adam
2025-10-29 17:09:54 +13:00
committed by GitHub
parent a9f2b083fa
commit 13f42df404
6 changed files with 267 additions and 86 deletions

13
feishin.desktop.tmpl Normal file
View File

@@ -0,0 +1,13 @@
[Desktop Entry]
Name=Feishin
GenericName=Music player
Exec=${FEISHIN_DESKTOP_EXECUTABLE} ${FEISHIN_DESKTOP_ARGS}
TryExec=${FEISHIN_DESKTOP_EXECUTABLE}
Terminal=false
Type=Application
Icon=org.jeffvli.feishin
StartupWMClass=feishin
SingleMainWindow=true
Categories=AudioVideo;Audio;Player;Music;
Keywords=Navidrome;Jellyfin;Subsonic;OpenSubsonic
Comment=A player for your self-hosted music server

View File

@@ -1,17 +1,33 @@
#!/bin/sh
dir=$1
arg=$2
arch=$(uname -m)
set -eu
if [ "$arch" != "x86_64" ] && [ "$arch" != "aarch64" ]; then
if [ "$#" -lt 1 ]; then
echo "Usage: $0 <installation-directory> <option>"
echo "Options:"
echo " wayland-native Enable native Wayland support"
echo " remove Remove Feishin AppImage and desktop entries"
exit 1
fi
dir="$(readlink -f "${1}")"
arg="${2:-""}"
arch="$(uname -m)"
if [ "$arg" != "wayland-native" ] && [ "$arg" != "remove" ] && [ "$arg" != "" ]; then
echo "Invalid option: $arg"
echo "Valid options are: wayland-native, remove"
exit 1
fi
if [ "${arch}" != "x86_64" ] && [ "${arch}" != "aarch64" ]; then
echo "CPU architecture not recognised (not x86_64 or aarch64). Aborting."
exit 1
fi
# workaround if we're not renaming the artifact
if [ "$arch" = "aarch64" ]; then
arch='arm64'
if [ "${arch}" = "aarch64" ]; then
arch="arm64"
fi
if [ ! -d "${dir}" ]; then
@@ -19,56 +35,45 @@ if [ ! -d "${dir}" ]; then
exit 1
fi
localShare="$HOME/.local/share"
localShare="${XDG_DATA_HOME:-$HOME/.local/share}"
localShareIcons="${localShare}/icons/hicolor"
if [ "${arg}" = "remove" ]; then
rm -v \
"${localShareIcons}"/512x512/apps/org.jeffvli.feishin.png \
"${localShareIcons}"/256x256/apps/org.jeffvli.feishin.png \
"${localShareIcons}"/128x128/apps/org.jeffvli.feishin.png \
"${localShareIcons}"/64x64/apps/org.jeffvli.feishin.png \
"${localShareIcons}"/32x32/apps/org.jeffvli.feishin.png \
"${localShare}"/applications/org.jeffvli.feishin.desktop \
"${localShareIcons}/512x512/apps/org.jeffvli.feishin.png" \
"${localShareIcons}/256x256/apps/org.jeffvli.feishin.png" \
"${localShareIcons}/128x128/apps/org.jeffvli.feishin.png" \
"${localShareIcons}/64x64/apps/org.jeffvli.feishin.png" \
"${localShareIcons}/32x32/apps/org.jeffvli.feishin.png" \
"${localShare}/applications/org.jeffvli.feishin.desktop" \
"${dir}/Feishin-linux-${arch}.AppImage"
exit 0
fi
curl -L --create-dirs --write-out '%{filename_effective}\n' \
curl --fail -L --create-dirs --write-out '%{filename_effective}\n' \
-o "${dir}/Feishin-linux-${arch}.AppImage" "https://github.com/jeffvli/feishin/releases/latest/download/Feishin-linux-${arch}.AppImage" \
-o "${localShareIcons}"/512x512/apps/org.jeffvli.feishin.png 'https://github.com/jeffvli/feishin/blob/development/assets/icons/512x512.png?raw=true' \
-o "${localShareIcons}"/256x256/apps/org.jeffvli.feishin.png 'https://github.com/jeffvli/feishin/blob/development/assets/icons/256x256.png?raw=true' \
-o "${localShareIcons}"/128x128/apps/org.jeffvli.feishin.png 'https://github.com/jeffvli/feishin/blob/development/assets/icons/128x128.png?raw=true' \
-o "${localShareIcons}"/64x64/apps/org.jeffvli.feishin.png 'https://github.com/jeffvli/feishin/blob/development/assets/icons/64x64.png?raw=true' \
-o "${localShareIcons}"/32x32/apps/org.jeffvli.feishin.png 'https://github.com/jeffvli/feishin/blob/development/assets/icons/32x32.png?raw=true'
-o "${localShareIcons}/512x512/apps/org.jeffvli.feishin.png" 'https://github.com/jeffvli/feishin/blob/development/assets/icons/512x512.png?raw=true' \
-o "${localShareIcons}/256x256/apps/org.jeffvli.feishin.png" 'https://github.com/jeffvli/feishin/blob/development/assets/icons/256x256.png?raw=true' \
-o "${localShareIcons}/128x128/apps/org.jeffvli.feishin.png" 'https://github.com/jeffvli/feishin/blob/development/assets/icons/128x128.png?raw=true' \
-o "${localShareIcons}/64x64/apps/org.jeffvli.feishin.png" 'https://github.com/jeffvli/feishin/blob/development/assets/icons/64x64.png?raw=true' \
-o "${localShareIcons}/32x32/apps/org.jeffvli.feishin.png" 'https://github.com/jeffvli/feishin/blob/development/assets/icons/32x32.png?raw=true'
chmod -v u+x "${dir}/Feishin-linux-${arch}.AppImage"
waylandFlags=''
waylandFlags=""
if [ "${arg}" = "wayland-native" ]; then
waylandFlags=' --enable-features=UseOzonePlatform,WaylandWindowDecorations --ozone-platform-hint=auto'
waylandFlags="--enable-features=UseOzonePlatform,WaylandWindowDecorations --ozone-platform-hint=auto"
fi
# this is for Debian-based kernels and ALT respectively
# https://unix.stackexchange.com/a/303214/145722
sandboxFlag=''
sandboxFlag=""
if [ "$(sysctl kernel.unprivileged_userns_clone 2>/dev/null)" = "0" ] \
|| [ "$(sysctl kernel.userns_restrict 2>/dev/null)" = "1" ]; then
sandboxFlag=' --no-sandbox'
sandboxFlag="--no-sandbox"
fi
mkdir -pv "${localShare}"/applications
cat > "${localShare}"/applications/org.jeffvli.feishin.desktop << EOL
[Desktop Entry]
Name=Feishin
GenericName=Music player
Exec=${dir}/Feishin-linux-${arch}.AppImage${sandboxFlag}${waylandFlags}
TryExec=${dir}/Feishin-linux-${arch}.AppImage
Terminal=false
Type=Application
Icon=org.jeffvli.feishin
StartupWMClass=feishin
SingleMainWindow=true
Categories=AudioVideo;Audio;Player;Music;
Keywords=Navidrome;Jellyfin;Subsonic;OpenSubsonic
Comment=A player for your self-hosted music server
EOL
mkdir -pv "${localShare}/applications"
export FEISHIN_DESKTOP_EXECUTABLE="${dir}/Feishin-linux-${arch}.AppImage"
export FEISHIN_DESKTOP_ARGS="${sandboxFlag} ${waylandFlags}"
curl --fail https://raw.githubusercontent.com/jeffvli/feishin/refs/heads/development/feishin.desktop.tmpl | envsubst > "${localShare}/applications/org.jeffvli.feishin.desktop"

View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<component type="desktop-application">
<id>org.jeffvli.feishin</id>
<name>Feishin</name>
<summary>Jellyfin, Navidrome, and OpenSubsonic Compatible Music Player</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0-only</project_license>
<content_rating type="oars-1.1"/>
<description>
<p>A modern, cross-platform music player for Jellyfin, Navidrome, and OpenSubsonic servers.</p>
<p>Features</p>
<ul>
<li>MPV player backend</li>
<li>Web player backend</li>
<li>Jellyfin server support</li>
<li>Navidrome server support</li>
<li>OpenSubsonic server support</li>
<li>Modern UI</li>
<li>Scrobble playback to your server</li>
<li>Smart playlist editor (Navidrome)</li>
<li>Synchronized and unsynchronized lyrics support</li>
</ul>
</description>
<developer id="org.jeffvli">
<name>jeffvli</name>
</developer>
<launchable type="desktop-id">org.jeffvli.feishin.desktop</launchable>
<url type="homepage">https://github.com/jeffvli/feishin</url>
<screenshots>
<screenshot type="default">
<caption>The main menu</caption>
<image type="source">https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_home.png</image>
</screenshot>
<screenshot>
<caption>Browsing an album</caption>
<image type="source">https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_album_detail.png</image>
</screenshot>
<screenshot>
<caption>Smart playlist creation</caption>
<image type="source">https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_smart_playlist.png</image>
</screenshot>
</screenshots>
<categories>
<category>AudioVideo</category>
<category>Audio</category>
<category>Player</category>
<category>Music</category>
</categories>
<releases>
<release date="2025-10-13" type="stable" version="0.21.2"></release>
<release date="2025-10-13" type="stable" version="0.21.1"></release>
<release date="2025-10-13" type="stable" version="0.21.0"></release>
<release date="2025-09-11" type="stable" version="0.20.1"></release>
<release date="2025-09-07" type="stable" version="0.20.0"></release>
<release date="2025-07-31" type="stable" version="0.19.0"></release>
<release date="2025-07-08" type="stable" version="0.18.0"></release>
<release date="2025-06-30" type="stable" version="0.17.0"></release>
<release date="2025-06-26" type="stable" version="0.16.0"></release>
<release date="2025-06-25" type="stable" version="0.15.1"></release>
<release date="2025-06-25" type="stable" version="0.15.0"></release>
<release date="2025-06-03" type="stable" version="0.14.0"></release>
<release date="2025-05-26" type="stable" version="0.13.0"></release>
<release date="2025-05-13" type="stable" version="0.12.7"></release>
<release date="2025-05-08" type="stable" version="0.12.6"></release>
<release date="2025-05-07" type="stable" version="0.12.5"></release>
<release date="2025-03-10" type="stable" version="0.12.3"></release>
<release date="2025-01-25" type="stable" version="0.12.2"></release>
<release date="2024-11-20" type="stable" version="0.12.1"></release>
<release date="2024-11-19" type="stable" version="0.12.0"></release>
<release date="2024-10-15" type="stable" version="0.11.1"></release>
<release date="2024-10-10" type="stable" version="0.11.0"></release>
<release date="2024-09-29" type="stable" version="0.10.1"></release>
<release date="2024-09-27" type="stable" version="0.10.0"></release>
<release date="2024-09-11" type="stable" version="0.9.0"></release>
<release date="2024-09-04" type="stable" version="0.8.1"></release>
<release date="2024-09-03" type="stable" version="0.8.0"></release>
<release date="2024-07-30" type="stable" version="0.7.3"></release>
<release date="2024-07-30" type="stable" version="0.7.2"></release>
<release date="2024-05-07" type="stable" version="0.7.1"></release>
<release date="2024-05-07" type="stable" version="0.7.0"></release>
<release date="2024-03-13" type="stable" version="0.6.1"></release>
<release date="2024-03-06" type="stable" version="0.6.0"></release>
<release date="2023-12-14" type="stable" version="0.5.3"></release>
<release date="2023-11-18" type="stable" version="0.5.2"></release>
<release date="2023-11-02" type="stable" version="0.5.1"></release>
<release date="2023-10-31" type="stable" version="0.5.0"></release>
<release date="2023-10-08" type="stable" version="0.4.1"></release>
<release date="2023-09-25" type="stable" version="0.4.0"></release>
<release date="2023-08-08" type="stable" version="0.3.0"></release>
<release date="2023-06-14" type="stable" version="0.2.0"></release>
<release date="2023-05-22" type="stable" version="0.1.1"></release>
<release date="2023-05-22" type="stable" version="0.1.0"></release>
<release date="2023-04-03" type="development" version="0.0.1-alpha6"></release>
<release date="2023-02-09" type="development" version="0.0.1-alpha5"></release>
<release date="2023-01-16" type="development" version="0.0.1-alpha4"></release>
<release date="2023-01-03" type="development" version="0.0.1-alpha3"></release>
<release date="2022-12-30" type="development" version="0.0.1-alpha2"></release>
<release date="2022-11-21" type="development" version="0.0.1-alpha1"></release>
</releases>
</component>

View File

@@ -55,7 +55,9 @@
"start": "electron-vite preview",
"typecheck": "pnpm run typecheck:node && pnpm run typecheck:web",
"typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
"typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false"
"typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false",
"version": "pnpm version --no-git-tag-version",
"postversion": "node ./scripts/update-app-stream.mjs"
},
"dependencies": {
"@ag-grid-community/client-side-row-model": "^28.2.1",
@@ -94,6 +96,7 @@
"electron-store": "^8.1.0",
"electron-updater": "^6.3.9",
"fast-average-color": "^9.3.0",
"fast-xml-parser": "^5.3.0",
"format-duration": "^2.0.0",
"fuse.js": "^6.6.2",
"i18next": "^21.10.0",

117
pnpm-lock.yaml generated
View File

@@ -116,6 +116,9 @@ importers:
fast-average-color:
specifier: ^9.3.0
version: 9.5.0
fast-xml-parser:
specifier: ^5.3.0
version: 5.3.0
format-duration:
specifier: ^2.0.0
version: 2.0.0
@@ -223,7 +226,7 @@ importers:
version: 3.25.23
zustand:
specifier: ^5.0.5
version: 5.0.5(@types/react@18.3.23)(immer@9.0.21)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0))
version: 5.0.8(@types/react@18.3.23)(immer@9.0.21)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0))
devDependencies:
'@electron-toolkit/eslint-config-prettier':
specifier: ^3.0.0
@@ -266,7 +269,7 @@ importers:
version: 8.18.1
'@vitejs/plugin-react':
specifier: ^4.3.4
version: 4.5.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2))
version: 4.5.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1))
concurrently:
specifier: ^7.1.0
version: 7.6.0
@@ -284,7 +287,7 @@ importers:
version: 3.2.1
electron-vite:
specifier: ^3.1.0
version: 3.1.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2))
version: 3.1.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1))
eslint:
specifier: ^9.24.0
version: 9.27.0
@@ -308,7 +311,7 @@ importers:
version: 9.3.0
postcss-preset-mantine:
specifier: ^1.17.0
version: 1.17.0(postcss@8.5.6)
version: 1.17.0(postcss@8.5.3)
prettier:
specifier: ^3.5.3
version: 3.5.3
@@ -335,7 +338,7 @@ importers:
version: 5.8.3
vite:
specifier: ^6.3.6
version: 6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2)
version: 6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1)
vite-plugin-conditional-import:
specifier: ^0.1.7
version: 0.1.7
@@ -344,10 +347,10 @@ importers:
version: 1.6.0
vite-plugin-ejs:
specifier: ^1.7.0
version: 1.7.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2))
version: 1.7.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1))
vite-plugin-pwa:
specifier: ^1.0.3
version: 1.0.3(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0)
version: 1.0.3(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0)
packages:
@@ -3042,6 +3045,10 @@ packages:
fast-uri@3.0.6:
resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==}
fast-xml-parser@5.3.0:
resolution: {integrity: sha512-gkWGshjYcQCF+6qtlrqBqELqNqnt4CxruY6UVAWWnqb3DQ6qaNFEIKqzYep1XzHLM/QtrHVCxyPOtTk4LTQ7Aw==}
hasBin: true
fastest-levenshtein@1.0.16:
resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
engines: {node: '>= 4.9.1'}
@@ -5094,6 +5101,9 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
strnum@2.1.1:
resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==}
stylelint-config-css-modules@4.4.0:
resolution: {integrity: sha512-J93MtxPjRzs/TjwbJ5y9SQy4iIqULXwL1CF1yx2tQCJfS/VZUcDAmoGOwqlLbhHXSQtZO5XQiA75NVWUR3KDCQ==}
peerDependencies:
@@ -5705,6 +5715,11 @@ packages:
yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
yaml@2.8.1:
resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
engines: {node: '>= 14.6'}
hasBin: true
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
@@ -5723,8 +5738,8 @@ packages:
zod@3.25.23:
resolution: {integrity: sha512-Od2bdMosahjSrSgJtakrwjMDb1zM1A3VIHCPGveZt/3/wlrTWBya2lmEh2OYe4OIu8mPTmmr0gnLHIWQXdtWBg==}
zustand@5.0.5:
resolution: {integrity: sha512-mILtRfKW9xM47hqxGIxCv12gXusoY/xTSHBYApXozR0HmQv299whhBeeAcRy+KrPPybzosvJBCOmVjq6x12fCg==}
zustand@5.0.8:
resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==}
engines: {node: '>=12.20.0'}
peerDependencies:
'@types/react': '>=18.0.0'
@@ -5892,7 +5907,7 @@ snapshots:
'@babel/helper-member-expression-to-functions@7.27.1':
dependencies:
'@babel/traverse': 7.28.4
'@babel/types': 7.27.1
'@babel/types': 7.28.4
transitivePeerDependencies:
- supports-color
@@ -5914,7 +5929,7 @@ snapshots:
'@babel/helper-optimise-call-expression@7.27.1':
dependencies:
'@babel/types': 7.27.1
'@babel/types': 7.28.4
'@babel/helper-plugin-utils@7.27.1': {}
@@ -5923,7 +5938,7 @@ snapshots:
'@babel/core': 7.27.1
'@babel/helper-annotate-as-pure': 7.27.3
'@babel/helper-wrap-function': 7.28.3
'@babel/traverse': 7.27.1
'@babel/traverse': 7.28.4
transitivePeerDependencies:
- supports-color
@@ -5938,8 +5953,8 @@ snapshots:
'@babel/helper-skip-transparent-expression-wrappers@7.27.1':
dependencies:
'@babel/traverse': 7.27.1
'@babel/types': 7.27.1
'@babel/traverse': 7.28.4
'@babel/types': 7.28.4
transitivePeerDependencies:
- supports-color
@@ -5974,7 +5989,7 @@ snapshots:
dependencies:
'@babel/core': 7.27.1
'@babel/helper-plugin-utils': 7.27.1
'@babel/traverse': 7.27.1
'@babel/traverse': 7.28.4
transitivePeerDependencies:
- supports-color
@@ -6153,7 +6168,7 @@ snapshots:
'@babel/core': 7.27.1
'@babel/helper-compilation-targets': 7.27.2
'@babel/helper-plugin-utils': 7.27.1
'@babel/traverse': 7.27.1
'@babel/traverse': 7.28.4
transitivePeerDependencies:
- supports-color
@@ -6199,7 +6214,7 @@ snapshots:
'@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1)
'@babel/helper-plugin-utils': 7.27.1
'@babel/helper-validator-identifier': 7.27.1
'@babel/traverse': 7.27.1
'@babel/traverse': 7.28.4
transitivePeerDependencies:
- supports-color
@@ -6448,7 +6463,7 @@ snapshots:
dependencies:
'@babel/core': 7.27.1
'@babel/helper-plugin-utils': 7.27.1
'@babel/types': 7.27.1
'@babel/types': 7.28.4
esutils: 2.0.3
'@babel/runtime@7.27.1': {}
@@ -7552,7 +7567,7 @@ snapshots:
'@typescript-eslint/types': 8.32.1
eslint-visitor-keys: 4.2.0
'@vitejs/plugin-react@4.5.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2))':
'@vitejs/plugin-react@4.5.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1))':
dependencies:
'@babel/core': 7.27.1
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1)
@@ -7560,7 +7575,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.9
'@types/babel__core': 7.20.5
react-refresh: 0.17.0
vite: 6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2)
vite: 6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1)
transitivePeerDependencies:
- supports-color
@@ -8504,7 +8519,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
electron-vite@3.1.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2)):
electron-vite@3.1.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1)):
dependencies:
'@babel/core': 7.27.1
'@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1)
@@ -8512,7 +8527,7 @@ snapshots:
esbuild: 0.25.4
magic-string: 0.30.17
picocolors: 1.1.1
vite: 6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2)
vite: 6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1)
transitivePeerDependencies:
- supports-color
@@ -8907,6 +8922,10 @@ snapshots:
fast-uri@3.0.6: {}
fast-xml-parser@5.3.0:
dependencies:
strnum: 2.1.1
fastest-levenshtein@1.0.16: {}
fastq@1.19.1:
@@ -10142,32 +10161,32 @@ snapshots:
possible-typed-array-names@1.1.0: {}
postcss-js@4.0.1(postcss@8.5.6):
postcss-js@4.0.1(postcss@8.5.3):
dependencies:
camelcase-css: 2.0.1
postcss: 8.5.6
postcss: 8.5.3
postcss-media-query-parser@0.2.3:
optional: true
postcss-mixins@9.0.4(postcss@8.5.6):
postcss-mixins@9.0.4(postcss@8.5.3):
dependencies:
fast-glob: 3.3.3
postcss: 8.5.6
postcss-js: 4.0.1(postcss@8.5.6)
postcss-simple-vars: 7.0.1(postcss@8.5.6)
sugarss: 4.0.1(postcss@8.5.6)
postcss: 8.5.3
postcss-js: 4.0.1(postcss@8.5.3)
postcss-simple-vars: 7.0.1(postcss@8.5.3)
sugarss: 4.0.1(postcss@8.5.3)
postcss-nested@6.2.0(postcss@8.5.6):
postcss-nested@6.2.0(postcss@8.5.3):
dependencies:
postcss: 8.5.6
postcss: 8.5.3
postcss-selector-parser: 6.1.2
postcss-preset-mantine@1.17.0(postcss@8.5.6):
postcss-preset-mantine@1.17.0(postcss@8.5.3):
dependencies:
postcss: 8.5.6
postcss-mixins: 9.0.4(postcss@8.5.6)
postcss-nested: 6.2.0(postcss@8.5.6)
postcss: 8.5.3
postcss-mixins: 9.0.4(postcss@8.5.3)
postcss-nested: 6.2.0(postcss@8.5.3)
postcss-resolve-nested-selector@0.1.6: {}
@@ -10185,9 +10204,9 @@ snapshots:
cssesc: 3.0.0
util-deprecate: 1.0.2
postcss-simple-vars@7.0.1(postcss@8.5.6):
postcss-simple-vars@7.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.6
postcss: 8.5.3
postcss-sorting@8.0.2(postcss@8.5.6):
dependencies:
@@ -10991,6 +11010,8 @@ snapshots:
strip-json-comments@3.1.1: {}
strnum@2.1.1: {}
stylelint-config-css-modules@4.4.0(stylelint@16.20.0(typescript@5.8.3)):
dependencies:
stylelint: 16.20.0(typescript@5.8.3)
@@ -11074,9 +11095,9 @@ snapshots:
- supports-color
- typescript
sugarss@4.0.1(postcss@8.5.6):
sugarss@4.0.1(postcss@8.5.3):
dependencies:
postcss: 8.5.6
postcss: 8.5.3
sumchecker@3.0.1:
dependencies:
@@ -11451,23 +11472,23 @@ snapshots:
fast-glob: 3.3.3
magic-string: 0.30.17
vite-plugin-ejs@1.7.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2)):
vite-plugin-ejs@1.7.0(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1)):
dependencies:
ejs: 3.1.10
vite: 6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2)
vite: 6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1)
vite-plugin-pwa@1.0.3(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0):
vite-plugin-pwa@1.0.3(vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0):
dependencies:
debug: 4.4.3
pretty-bytes: 6.1.1
tinyglobby: 0.2.15
vite: 6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2)
vite: 6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1)
workbox-build: 7.3.0(@types/babel__core@7.20.5)
workbox-window: 7.3.0
transitivePeerDependencies:
- supports-color
vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.2):
vite@6.3.6(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.1):
dependencies:
esbuild: 0.25.9
fdir: 6.5.0(picomatch@4.0.3)
@@ -11479,8 +11500,9 @@ snapshots:
'@types/node': 22.15.32
fsevents: 2.3.3
sass-embedded: 1.89.0
sugarss: 4.0.1(postcss@8.5.6)
sugarss: 4.0.1(postcss@8.5.3)
terser: 5.39.2
yaml: 2.8.1
void-elements@3.1.0: {}
@@ -11715,6 +11737,9 @@ snapshots:
yallist@4.0.0: {}
yaml@2.8.1:
optional: true
yargs-parser@21.1.1: {}
yargs@17.7.2:
@@ -11736,7 +11761,7 @@ snapshots:
zod@3.25.23: {}
zustand@5.0.5(@types/react@18.3.23)(immer@9.0.21)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)):
zustand@5.0.8(@types/react@18.3.23)(immer@9.0.21)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)):
optionalDependencies:
'@types/react': 18.3.23
immer: 9.0.21

View File

@@ -0,0 +1,35 @@
import { XMLBuilder, XMLParser } from 'fast-xml-parser';
import fs from 'fs';
import path from 'path';
const args = process.argv.slice(2);
if (args.length > 3) {
console.error('Usage: node update-app-stream.js [package-file] [date] [metainfo-file]');
process.exit(1);
}
const packageFile = args[0] || path.resolve(process.cwd(), 'package.json');
const packageContent = fs.readFileSync(packageFile, 'utf8');
const packageJson = JSON.parse(packageContent);
const version = packageJson.version;
const time = Math.floor((Date.parse(args[1]) || Date.now()) / 1000);
const metainfoFile = args[2] || path.resolve(process.cwd(), 'org.jeffvli.feishin.metainfo.xml');
const parser = new XMLParser({ ignoreAttributes: false });
const metainfoContent = fs.readFileSync(metainfoFile, 'utf8');
const metainfo = parser.parse(metainfoContent);
if (!metainfo.component.releases.release.find((release) => release['@_version'] === version)) {
metainfo.component.releases.release.unshift({
'@_date': new Date(time * 1000).toISOString().split('T')[0],
'@_type': version.includes('-') ? 'development' : 'stable',
'@_version': version,
});
}
const builder = new XMLBuilder({ format: true, ignoreAttributes: false, indentBy: ' ' });
fs.writeFileSync(metainfoFile, builder.build(metainfo), 'utf8');
console.log(`Updated ${metainfoFile} with version ${version}`);