Skip to content

Update AppStream metadata file #3190

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions .github/workflows/update-release-file.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: Update AppStream release file

on:
release:
types: [published, released, deleted]
workflow_dispatch:

jobs:
update-assets:
runs-on: ubuntu-latest

steps:
# 1. Checkout the repository
- name: Checkout Repository
uses: actions/checkout@v3
with:
# Disable automatic token usage to allow `create-pull-request` to handle authentication
persist-credentials: false
fetch-depth: 0 # Fetch all history for accurate diff detection

# 2. Set up Python environment
- name: Set Up Python
uses: actions/setup-python@v4
with:
python-version: '3.x' # Specify the Python version you need

# 3. Install dependencies
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r scripts/python/requirements.txt

# 4. Run the Python script
- name: Run Script
run: |
python scripts/python/releases-to-appstream.py

# 5. Configure Git for committing changes
- name: Configure Git
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'

# 6. Check for changes
- name: Check for Changes
id: changes
run: |
# Add all changes to staging
git add .

# Check if there are any staged changes
if git diff --cached --quiet; then
echo "no_changes=true" >> $GITHUB_OUTPUT
else
echo "no_changes=false" >> $GITHUB_OUTPUT
fi

# 7. Create Pull Request if changes exist
- name: Create Pull Request
if: steps.changes.outputs.no_changes == 'false'
uses: peter-evans/create-pull-request@v5
with:
# Use the default GITHUB_TOKEN provided by GitHub Actions
token: ${{ secrets.GITHUB_TOKEN }}

# Commit message for the changes
commit-message: Update AppStream release

# Branch name for the PR (includes run ID for uniqueness)
branch: update-appstream-release-${{ github.run_id }}

# Title of the Pull Request
title: "Update AppStream release"

# Body of the Pull Request
body: |
This PR updates AppStream metadata files on release.

# Labels to apply to the Pull Request (optional)
labels: automated-update

# Target branch for the PR (default is the repository's default branch)
# You can specify a different base branch if needed
# base: main

# Automatically delete the branch after the PR is merged (optional)
delete-branch: true

# If a PR already exists for the same changes, the action will add new commits to it
# To prevent duplicate PRs, ensure unique branch names or handle accordingly
72 changes: 72 additions & 0 deletions scripts/python/releases-to-appstream.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/usr/bin/python3
import sys
import requests
import xml.etree.ElementTree as ET
import xml.dom.minidom
from datetime import datetime

OWNER = "Nexus-Mods"
REPO = "NexusMods.App"
GITHUB_API = f"https://api.github.com/repos/{OWNER}/{REPO}/releases"

def fetch_releases():
releases = []
page = 1

while True:
response = requests.get(GITHUB_API, params={"per_page": 100, "page": page})
if response.status_code != 200:
raise Exception(f"GitHub API error: {response.status_code} - {response.text}")

page_releases = response.json()
if not page_releases:
break

releases.extend(page_releases)
page += 1

return releases

def generate_appstream_xml(releases):
root = ET.Element("releases")
for release in releases:
version = release["tag_name"].lstrip("v") # Remove leading 'v' if present
date = release["published_at"][:10] # YYYY-MM-DD
release_type = "development" if release.get("prerelease") else "stable"
release_url = release["html_url"]

rel = ET.SubElement(root, "release", version=version, date=date, type=release_type)
url_elem = ET.SubElement(rel, "url", type="details")
url_elem.text = release_url

return ET.ElementTree(root)

def save_xml(tree, output_file):
# Convert ElementTree to a byte string
rough_string = ET.tostring(tree.getroot(), encoding="utf-8")
# Parse and pretty-print with minidom
reparsed = xml.dom.minidom.parseString(rough_string)
pretty_xml = reparsed.toprettyxml(indent="\t")

lines = pretty_xml.splitlines()
lines.insert(1, "<!-- auto generated, don't edit manually -->")
modified = "\n".join(lines)

# Write to file
with open(output_file, "w", encoding="utf-8") as f:
f.write(modified)

print(f"Formatted AppStream XML saved to {output_file}")

def main():
if len(sys.argv) != 2:
print("Missing arg <output>")
sys.exit(1)

output_file = sys.argv[1]
releases = fetch_releases()
tree = generate_appstream_xml(releases)
save_xml(tree, output_file)

if __name__ == "__main__":
main()
3 changes: 3 additions & 0 deletions src/NexusMods.App/NexusMods.App.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@
<None Update="icon.svg">
<DependentUpon>app.pupnet.conf</DependentUpon>
</None>
<None Update="com.nexusmods.app.releases.xml">
<DependentUpon>app.pupnet.conf</DependentUpon>
</None>
</ItemGroup>

<Target Name="CopyCustomContentOnPublish" AfterTargets="Publish"
Expand Down
2 changes: 1 addition & 1 deletion src/NexusMods.App/app.pupnet.conf
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ PackageName = NexusMods.App
OutputDirectory = Deploy/OUT

# APPIMAGE OPTIONS
AppImageArgs =
AppImageArgs = --no-appstream
AppImageVersionOutput = false

# WINDOWS SETUP OPTIONS
Expand Down
14 changes: 12 additions & 2 deletions src/NexusMods.App/com.nexusmods.app.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
<p>The Nexus Mods App is a mod manager for your games and the successor to Vortex with native support for Linux.</p>
</description>

<branding>
<color type="primary" scheme_preference="light">#fafafa</color>
<color type="primary" scheme_preference="dark">#1d1d21</color>
</branding>

<launchable type="desktop-id">com.nexusmods.app.desktop</launchable>

<url type="homepage">https://github.com/Nexus-Mods/NexusMods.App</url>
Expand All @@ -29,7 +34,7 @@
<url type="contribute">https://nexus-mods.github.io/NexusMods.App/developers/Contributing/</url>

<content_rating type="oars-1.0">
<content_attribute id="social-info">moderate</content_attribute>
<content_attribute id="social-info">intense</content_attribute>
</content_rating>

<categories>
Expand All @@ -46,7 +51,12 @@
</recommends>

<supports>
<id version="1.0" compare="ge">com.usebottles.bottles</id>
<id version="1.0" compare="ge">com.heroicgameslauncher.hgl</id>

<control>gamepad</control>
</supports>

<!-- NOTE(erri120): we use a script to turn GitHub releases into a supported format -->
<releases type="external"/>

</component>
97 changes: 97 additions & 0 deletions src/NexusMods.App/com.nexusmods.app.releases.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
<?xml version="1.0" ?>
<!-- auto generated, don't edit manually -->
<releases>
<release version="0.11.1" date="2025-05-20" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.11.1</url>
</release>
<release version="0.10.2" date="2025-04-30" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.10.2</url>
</release>
<release version="0.9.2" date="2025-04-07" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.9.2</url>
</release>
<release version="0.9.1" date="2025-04-07" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.9.1</url>
</release>
<release version="0.8.3" date="2025-03-24" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.8.3</url>
</release>
<release version="0.8.2" date="2025-03-17" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.8.2</url>
</release>
<release version="0.7.3" date="2025-02-03" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.7.3</url>
</release>
<release version="0.7.2" date="2025-01-21" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.7.2</url>
</release>
<release version="0.7.1" date="2024-12-17" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.7.1</url>
</release>
<release version="0.7.0" date="2024-11-27" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.7.0</url>
</release>
<release version="0.6.3" date="2024-11-06" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.6.3</url>
</release>
<release version="0.6.2" date="2024-10-16" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.6.2</url>
</release>
<release version="0.6.1" date="2024-09-25" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.6.1</url>
</release>
<release version="0.6.0" date="2024-09-03" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.6.0</url>
</release>
<release version="0.5.3" date="2024-07-15" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.5.3</url>
</release>
<release version="0.5.2" date="2024-06-19" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.5.2</url>
</release>
<release version="0.5.1" date="2024-06-03" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.5.1</url>
</release>
<release version="0.5" date="2024-05-29" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.5</url>
</release>
<release version="0.4.9.3" date="2024-05-22" type="development">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.4.9.3</url>
</release>
<release version="0.4.1" date="2024-04-17" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.4.1</url>
</release>
<release version="0.4" date="2024-03-28" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.4</url>
</release>
<release version="0.3" date="2024-02-13" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.3</url>
</release>
<release version="0.2.1" date="2023-11-09" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.2.1</url>
</release>
<release version="0.2" date="2023-11-09" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.2</url>
</release>
<release version="0.1" date="2023-08-03" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.1</url>
</release>
<release version="0.0.6" date="2023-06-29" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.0.6</url>
</release>
<release version="0.0.5" date="2023-06-13" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.0.5</url>
</release>
<release version="0.0.4" date="2023-05-08" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.0.4</url>
</release>
<release version="0.0.3" date="2023-05-08" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.0.3</url>
</release>
<release version="0.0.2" date="2023-05-08" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.0.2</url>
</release>
<release version="0.0.1" date="2023-05-08" type="stable">
<url type="details">https://github.com/Nexus-Mods/NexusMods.App/releases/tag/v0.0.1</url>
</release>
</releases>
Loading