Skip to content
Merged
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
91 changes: 62 additions & 29 deletions .github/workflows/upload-nexus.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -414,52 +414,85 @@ jobs:
if: needs.prepare-nexus-matrix.outputs.dry_run != 'true' && needs.prepare-nexus-matrix.outputs.has_uploads == 'true'
run: |
python3 << 'PYEOF'
import json, os
import json, os, urllib.request, urllib.error

result = os.environ.get('UPLOAD_RESULT', '')
rows = json.loads(os.environ['UPLOAD_MATRIX']).get('include', [])
rows = [r for r in rows if not r.get('skip')]
version = os.environ.get('VERSION', '')
game_id = os.environ.get('NEXUS_GAME_ID', 'skyrimspecialedition')
api_key = os.environ.get('UNEX_APIKEY', '')
summary = open(os.environ['GITHUB_STEP_SUMMARY'], 'a')

def w(line=''):
summary.write(line + '\n')

if result == 'success':
w('✅ All Nexus uploads completed successfully')
w()
w('| Feature | Version | Nexus |')
w('|---------|---------|-------|')
for row in rows:
mod_id = str(row.get('nexus_mod_id', ''))
planned = row.get('mod_version') or version
label = row.get('mod_filename', row.get('name', ''))
url = f'https://www.nexusmods.com/{game_id}/mods/{mod_id}'
w(f'| [{label}]({url}) | `{planned}` | [View]({url}) |')
def nexus_versions(mod_id):
if not api_key or not mod_id:
return None
url = f'https://api.nexusmods.com/v1/games/{game_id}/mods/{mod_id}/files.json'
req = urllib.request.Request(url, headers={
'apikey': api_key,
'User-Agent': 'community-shaders-ci/1.0',
'Accept': 'application/json',
})
try:
with urllib.request.urlopen(req, timeout=15) as resp:
files = json.load(resp).get('files', [])
main = [f for f in files if f.get('category_name') == 'MAIN']
check = main if main else files
seen = []
for f in check:
v = f.get('version', '')
if v and v not in seen:
seen.append(v)
return seen
except Exception:
return None

succeeded, failed, unknowns = [], [], []
rows_status = []
for row in rows:
name = row.get('name', '')
mod_id = str(row.get('nexus_mod_id', ''))
planned = row.get('mod_version') or version
label = row.get('mod_filename', name)
url = f'https://www.nexusmods.com/{game_id}/mods/{mod_id}'
artifact = f'nexus-upload-{name}'
versions = nexus_versions(mod_id)
if versions is None:
status, icon = 'unknown', '❓'
unknowns.append(label)
elif planned in versions:
status, icon = 'uploaded', '✅'
succeeded.append(label)
else:
status, icon = 'failed', '❌'
failed.append(label)
rows_status.append((icon, label, planned, url, artifact, status))

if failed or unknowns:
parts = []
if failed:
parts.append(f'{len(failed)} failed')
if unknowns:
parts.append(f'{len(unknowns)} unknown')
w(f'⚠️ {", ".join(parts)} — {len(succeeded)} succeeded')
else:
w(f'⚠️ Some uploads may have failed (result: `{result}`)')
w()
w('The following uploads were planned. Re-run this workflow to retry,')
w('or download the artifact and upload manually to Nexus.')
w()
w('| Feature | Version | Nexus | Artifact |')
w('|---------|---------|-------|----------|')
for row in rows:
name = row.get('name', '')
mod_id = str(row.get('nexus_mod_id', ''))
planned = row.get('mod_version') or version
label = row.get('mod_filename', name)
url = f'https://www.nexusmods.com/{game_id}/mods/{mod_id}'
artifact = f'nexus-upload-{name}'
w(f'| [{label}]({url}) | `{planned}` | [View]({url}) | `{artifact}` |')
w(f'✅ All {len(succeeded)} Nexus upload(s) completed successfully')
w()
w('| Status | Feature | Version | Nexus | Artifact |')
w('|--------|---------|---------|-------|----------|')
for icon, label, planned, url, artifact, status in rows_status:
art = f'`{artifact}`' if status in ('failed', 'unknown') else '—'
w(f'| {icon} | [{label}]({url}) | `{planned}` | [View]({url}) | {art} |')
if failed or unknowns:
w()
w('Re-run is safe: already-uploaded versions will be automatically skipped.')

summary.close()
PYEOF
env:
UPLOAD_RESULT: ${{ needs.upload-to-nexus.result }}
UPLOAD_MATRIX: ${{ needs.prepare-nexus-matrix.outputs.upload_matrix }}
VERSION: ${{ needs.prepare-nexus-matrix.outputs.version }}
NEXUS_GAME_ID: ${{ inputs.nexus_game_id || 'skyrimspecialedition' }}
UNEX_APIKEY: ${{ secrets.UNEX_APIKEY }}
Loading