Merge latest cooker to my local cooker branch

This commit is contained in:
monkeyx-net 2024-11-25 15:06:26 +00:00
commit eb7d845868
30 changed files with 2495 additions and 641 deletions

300
.github/workflows/build_release.yml vendored Normal file
View file

@ -0,0 +1,300 @@
name: "Build RetroDECK"
on:
push:
branches:
- main
- cooker*
- feat*
- branch/cooker*
paths:
- '.github/workflows/**'
- 'automation_tools/**'
- 'config/**'
- 'functions/**'
- 'rd-submodules/**'
- '*.sh'
- 'net.retrodeck.retrodeck.yml'
- 'net.retrodeck.retrodeck.appdata.xml'
pull_request:
branches:
- main
- cooker*
workflow_dispatch:
permissions:
contents: write
jobs:
# Build RetroDECK Job
Build_RetroDECK:
runs-on: retrodeck
outputs:
TAG: ${{ steps.version-tag.outputs.TAG }}
RELEASE_BODY: ${{ steps.version-tag.outputs.RELEASE_BODY }}
MAKE_LATEST: ${{ steps.version-tag.outputs.MAKE_LATEST }}
steps:
# Remove Stuck Mounts
- name: Remove stuck mounts
run: |
sudo umount -f /home/ubuntu/actions-runner/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
sudo umount -f $HOME/actions-run/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
continue-on-error: true
# Clone Repository
- name: Clone RetroDECK repo
uses: actions/checkout@v4
with:
submodules: true
# Install Dependencies
- name: Install dependencies
run: curl "https://raw.githubusercontent.com/RetroDECK/components-template/main/automation_tools/install_dependencies.sh" | bash
# Generate Build ID for Cooker Branches
- name: Generate cooker build ID
if: github.ref != 'refs/heads/main'
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh"
# Getting branch name, this needs as PR should be managed in a different way
- name: Get Branch Name
run: |
if [[ "$GITHUB_EVENT_NAME" == "pull_request" || "$GITHUB_EVENT_NAME" == "pull_request_target" ]]; then
branch_name="$GITHUB_HEAD_REF"
else
branch_name="$GITHUB_REF_NAME"
fi
echo "Branch name: $branch_name"
echo "BRANCH_NAME=$branch_name" >> $GITHUB_ENV
# Generates a version tag based on the event type (main branch, PR, or cooker) and sets it as output.
- name: Generate Version Tag
id: version-tag
run: |
# Source the version extractor script and fetch the manifest version
source automation_tools/version_extractor.sh
MANIFEST_VERSION="$(fetch_manifest_version)"
# Ensure the manifest version was successfully extracted
if [[ -z "$MANIFEST_VERSION" ]]; then
echo "[ERROR] Failed to extract the manifest version."
exit 1
fi
# Determine the tag based on the GitHub event context
if [[ "$GITHUB_REF" == "refs/heads/main" ]]; then
# Main branch tag
TAG="$MANIFEST_VERSION"
MAKE_LATEST=true
elif [[ "$GITHUB_EVENT_NAME" == "pull_request" || "$GITHUB_EVENT_NAME" == "pull_request_target" ]]; then
# Pull request tag, sanitize the source branch
source_branch="${GITHUB_HEAD_REF//\//-}"
TAG="PR-$source_branch-${{ github.run_id }}"
MAKE_LATEST=false
else
# Other branches (cooker branches)
TAG="$MANIFEST_VERSION-${{ env.BUILD_ID }}"
MAKE_LATEST=true
fi
echo "TAG=$TAG" >> $GITHUB_ENV
echo "MAKE_LATEST=$MAKE_LATEST" >> $GITHUB_ENV
echo "TAG=$TAG" >> $GITHUB_OUTPUT
echo "MAKE_LATEST=$MAKE_LATEST" >> $GITHUB_OUTPUT
# backing up manifest in case download fails and hashes must be recalculated
- name: Manifest backup
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
- name: Run pre-build automation tasks
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
- name: "Adding flatpak portal for automated updates (Cooker only)"
if: github.ref != 'refs/heads/main'
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_flatpak_portal_add.sh"
- name: "Updating release notes in appdata"
run: "automation_tools/appdata_management.sh"
- name: "[DEBUG] Outputting manifest"
run: cat net.retrodeck.retrodeck.yml
# Get Commits Since Last Published Release (Cooker only)
- name: Get commits since last published release
id: get-commits
if: github.ref != 'refs/heads/main'
run: |
# Get the latest published release tag
LATEST_TAG=$(git describe --tags $(git rev-list --tags --max-count=1) 2>/dev/null || echo "")
if [ -z "$LATEST_TAG" ]; then
echo "[INFO] No previous release found. Using all commits."
COMMITS=$(git log HEAD --pretty=format:"- %s")
else
echo "[INFO] Latest published release tag: $LATEST_TAG"
COMMITS=$(git log ${LATEST_TAG}..HEAD --pretty=format:"- %s")
fi
# Debug: Print the commits list
echo "Commits since $LATEST_TAG:"
echo "$COMMITS"
# Export the commits list to the GitHub environment
echo "COMMITS=$COMMITS" >> $GITHUB_ENV
# - name: Extract XML Description
# uses: Mudlet/xmlstarlet-action@master
# id: extract-description
# with:
# args: sel -t -v "/component/releases/release[1]/description//text()" ./net.retrodeck.retrodeck.appdata.xml
# Generate Release Body
- name: Generate release body text
id: generate-body
run: |
# Initialize the release body text
RELEASE_BODY="# Release Notes\n"
RELEASE_BODY+="This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}."
RELEASE_BODY+="On branch [${{env.BRANCH_NAME}}](https://repo.retrodeck.net/RetroDECK/RetroDECK/src/branch/${{env.BRANCH_NAME}})."
RELEASE_BODY+="## Commits since last release\n"
RELEASE_BODY+="$COMMITS\n\n"
#raw_description="${{ steps.extract-description.outputs.result }}"
# Convert <p> tags to markdown headers using sed
markdown_description=$(echo "$raw_description" | sed -e 's|<p>|\n### |g' -e 's|</p>||g')
# Convert <li> tags to bullet points and trim spaces
markdown_description=$(echo "$markdown_description" | sed -e 's|<ul>||g' -e 's|</ul>||g' -e 's|<li>|- |g' -e 's|</li>||g' | awk '{$1=$1;print}')
# Remove any remaining XML tags
markdown_description=$(echo "$markdown_description" | sed -e 's/<[^>]*>//g')
# Debug: Print the markdown description
echo "Markdown Description:"
echo "$markdown_description"
# Append markdown content to the release body
RELEASE_BODY+="$markdown_description"
printf "RELEASE_BODY=%s\n" "$RELEASE_BODY" >> $GITHUB_ENV
printf "RELEASE_BODY=%s\n" "$RELEASE_BODY" >> $GITHUB_OUTPUT
echo "[DEBUG] CHECKPOINT 8"
- name: "Build flatpak: download only"
id: flatpak-download
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
# Sometimes flatpak download fails, in this case it tries a second time
- name: "Build flatpak: download only (retry)"
if: steps.flatpak-download.outcome == 'failure'
run: |
echo "Download failed, maybe some hash changed since the build start."
echo "Recalculating hashes and retrying download..."
rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
"${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
"${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
- name: Build flatpak
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh"
- name: Create Bundle
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle.sh"
# Upload artifacts for other jobs
- name: Upload Build Artifacts
uses: actions/upload-artifact@v4
with:
name: retrodeck-artifacts
include-hidden-files: true
path: |
RetroDECK*.flatpak
RetroDECK*.flatpak.sha
RetroDECK*Artifact.tar.gz
GitHub-publish:
runs-on: ubuntu-latest
needs: Build_RetroDECK
env:
TAG: ${{ needs.Build_RetroDECK.outputs.TAG }}
RELEASE_BODY: ${{ needs.Build_RetroDECK.outputs.RELEASE_BODY }}
MAKE_LATEST: ${{ needs.Build_RetroDECK.outputs.MAKE_LATEST }}
steps:
- name: Generate a token for Rekku
id: generate-rekku-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ vars.REKKU_APP_ID }}
private-key: ${{ secrets.REKKU_PRIVATE_KEY }}
repositories: "RetroDECK,Cooker"
owner: "RetroDECK"
- name: Download all workflow run artifacts
uses: actions/download-artifact@v4.1.8
# Determine if Target Repository is Main or not, in that case is a Cooker build
- name: Determine target repository
id: set-repo
run: |
if [[ "$GITHUB_REF" == "refs/heads/main" ]]; then
echo "REPO_NAME=RetroDECK" >> $GITHUB_ENV
else
echo "REPO_NAME=Cooker" >> $GITHUB_ENV
fi
# Publish Release
- name: Publish release
uses: ncipollo/release-action@v1
with:
tag: ${{ env.TAG }}
name: "RetroDECK ${{ env.TAG }}"
body: ${{ env.RELEASE_BODY }}
artifacts: "retrodeck-artifacts/*.flatpak,retrodeck-artifacts/*.flatpak.sha,retrodeck-artifacts/*Artifact.tar.gz"
allowUpdates: true
makeLatest: ${{ env.MAKE_LATEST }}
repo: ${{ env.REPO_NAME }}
token: ${{ steps.generate-rekku-token.outputs.token }}
# Rewrite Tag (for Main Branch Only)
- name: Rewrite Tag
if: github.ref == 'refs/heads/main'
run: |
git submodule deinit -f --all
git fetch --tags
if git rev-parse --verify "${{ env.TAG }}" >/dev/null 2>&1; then
git tag -d "${{ env.TAG }}"
git push --delete origin "${{ env.TAG }}"
fi
git tag "${{ env.TAG }}"
git push origin "${{ env.TAG }}"
env:
GITHUB_TOKEN: ${{ steps.generate-rekku-token.outputs.token }}
# As backup we're even publishing the build on our own selfhosted Fogejo instance
# Forgejo Publish Job if main branch
# Forgejo-publish:
# runs-on: ubuntu-latest
# needs: Build_RetroDECK
# env:
# TAG: ${{ needs.Build_RetroDECK.outputs.TAG }}
# RELEASE_BODY: ${{ needs.Build_RetroDECK.outputs.RELEASE_BODY }}
# MAKE_LATEST: ${{ needs.Build_RetroDECK.outputs.MAKE_LATEST }}
# steps:
#
# - name: Download all workflow run artifacts
# uses: actions/download-artifact@v4.1.8
#
# - name: Forgejo-publish
# if: github.ref == 'refs/heads/main'
# uses: RetroDECK/components-template/.github/workflows/fogejo_publish_release.yml@main
# with:
# release_body: ${{ env.RELEASE_BODY }}
# artifacts: "retrodeck-artifacts/*.flatpak,retrodeck-artifacts/*.flatpak.sha,retrodeck-artifacts/*Artifact.tar.gz"
# tag: ${{ env.TAG }}

View file

@ -1,266 +0,0 @@
name: "Build cooker"
on:
push:
branches:
- cooker*
- feat*
- branch/cooker*
paths:
- '.github/workflows/**'
- 'automation_tools/**'
- 'config/**'
- 'functions/**'
- 'rd-submodules/**'
- '*.sh'
- 'net.retrodeck.retrodeck.yml'
- 'net.retrodeck.retrodeck.appdata.xml'
pull_request:
# Italy (CET): 11:00 PM
# Japan (JST): 7:00 AM
# schedule:
# - cron: '0 22 * * *'
workflow_dispatch:
permissions:
contents: write
jobs:
Building_RetroDECK:
runs-on: retrodeck
steps:
# Circumventing this bug: https://github.com/flatpak/flatpak-builder/issues/317
- name: Remove stuck mounts
run: |
sudo umount -f /home/ubuntu/actions-runner/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
sudo umount -f $HOME/actions-run/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
continue-on-error: true
- name: Generate a token for Rekku
if: ${{ github.repository == 'RetroDECK/RetroDECK' }}
id: generate-rekku-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ vars.REKKU_APP_ID }}
private-key: ${{ secrets.REKKU_PRIVATE_KEY }}
repositories: "RetroDECK,Cooker"
owner: "RetroDECK"
- name: Clone RetroDECK repo
uses: actions/checkout@v4
with:
submodules: 'true'
- name: "Install dependencies"
run: "automation_tools/install_dependencies.sh"
- name: Generate cooker build ID
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh"
- name: Get branch name
id: branch_name
run: |
if [[ "$GITHUB_EVENT_NAME" == "pull_request" || "$GITHUB_EVENT_NAME" == "pull_request_target" ]]; then
source_branch="${{ github.head_ref }}"
echo "BRANCH_NAME=$source_branch" >> $GITHUB_ENV
else
branch_name=$(echo $GITHUB_REF | sed 's|refs/heads/||')
echo "BRANCH_NAME=$branch_name" >> $GITHUB_ENV
fi
# if the branch is coming from a PR the tag should be manually built
- name: "Generate version tag and evaluating latest tag"
run: |
# Source the version extractor script to get the manifest version
source automation_tools/version_extractor.sh
MANIFEST_VERSION="$(fetch_manifest_version)"
echo "MANIFEST_VERSION=$MANIFEST_VERSION" >> $GITHUB_ENV
# Check if the event is related to a pull request
if [[ "$GITHUB_EVENT_NAME" == "pull_request" || "$GITHUB_EVENT_NAME" == "pull_request_target" ]]; then
# Use GITHUB_HEAD_REF to get the source branch
source_branch="${GITHUB_HEAD_REF}"
# Replace '/' with '-' in the branch name
source_branch=${source_branch//\//-}
# Use GITHUB_HEAD_REF to get the source branch
source_branch="${GITHUB_HEAD_REF}"
# Replace '/' with '-' in the branch name
source_branch=${source_branch//\//-}
echo "[DEBUG] source branch is: $source_branch"
# Generate the tag for a pull request
echo "TAG=PR-$source_branch-${{ env.buildid }}" >> $GITHUB_ENV
echo "MAKE_LATEST=false" >> $GITHUB_ENV # Not marked as the latest cooker version if it's a feature branch
else
# Generate the tag for non-pull request branches
# Generate the tag for non-pull request branches
TAG="$MANIFEST_VERSION-${{ env.buildid }}"
echo "TAG=$TAG" >> $GITHUB_ENV
echo "MAKE_LATEST=true" >> $GITHUB_ENV
fi
# Output the manifest version and generated tag for debugging
echo "MANIFEST_VERSION: $MANIFEST_VERSION"
echo "Version TAG: $TAG"
echo "MAKE_LATEST: $MAKE_LATEST"
# backing up manifest in case download fails and hashes must be recalculated
- name: Manifest backup
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
- name: Run pre-build automation tasks
run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
- name: "Adding flatpak portal for automated updates (cooker only)"
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_flatpak_portal_add.sh"
- name: "Updating release notes in appdata"
run: "automation_tools/appdata_management.sh"
- name: "[DEBUG] Outputting manifest"
run: cat net.retrodeck.retrodeck.yml
- name: "Build flatpak: download only"
id: "flatpak-download"
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
continue-on-error: true
# Sometimes flatpak download fails, in this case it tries a second time
- name: "Build flatpak: download only (retry)"
if: steps.flatpak-download.outcome == 'failure'
run: |
echo "Download failed, maybe some hash changed since the build start."
echo "Recalculating hashes and retrying download..."
rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
"${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
"${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
- name: Build flatpak
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh"
- name: Create Bundle
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle.sh"
- name: Set environment variable with current branch name
run: echo "GITHUB_REF_SLUG=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV
- name: Get commits since last release
run: |
# Get the latest release tag
LATEST_TAG=$(git describe --tags --abbrev=0)
# Get all commits since the latest release tag
COMMITS=$(git log $LATEST_TAG..HEAD --pretty=format:"- %s")
# Set the output variable
echo "::set-output name=commits::$COMMITS"
id: commits
continue-on-error: true
- name: Publish the flatpak in a new cooker release
uses: ncipollo/release-action@v1
with:
tag: "${{env.TAG}}"
body: |
# Release Notes (Cooker)
This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}.
On branch [${{env.BRANCH_NAME}}](https://github.com/RetroDECK/RetroDECK/tree/${{env.BRANCH_NAME}}).
## Commits since last release
${{ steps.commits.outputs.commits }}
For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server.
Cooker channel is provided for the community to test fixes and explore new functionality.
Please DO NOT open issues or ask support on this build.
artifacts: "RetroDECK-cooker.flatpak,RetroDECK-cooker.flatpak.sha,RetroDECK-Artifact.tar.gz"
allowUpdates: true
makeLatest: ${{env.MAKE_LATEST}} # if it's a feat branch is not considered the latest build
token: ${{ steps.generate-rekku-token.outputs.token }}
repo: ${{ github.repository_owner == 'RetroDECK' && 'Cooker' || github.event.repository.name }} # "Cooker" if we are in RetroDECK Org, else "this repo"
continue-on-error: true
- name: Rewrite Tag
if: ${{ github.repository == 'RetroDECK/RetroDECK' }}
run: |
git submodule deinit -f --all
git fetch --tags
git config --global user.name "Rekku"
git config --global user.email "rekku@retrodeck.net"
if git rev-parse --verify "${{ env.TAG }}" >/dev/null 2>&1; then # if the tag exists
git tag -d "${{ env.TAG }}" # remove it from local repo
git push --delete origin "${{ env.TAG }}" # and from remote
fi
git tag "${{ env.TAG }}" # Create the tag locally
git push origin "${{ env.TAG }}" # Push the new tag in the remote repo
env:
GITHUB_TOKEN: ${{ steps.generate-rekku-token.outputs.token }}
# In case it cannot publish the release at least it's providing the flatpak file for creating a manual release
- name: Upload RetroDECK-cooker.flatpak
uses: actions/upload-artifact@v4
with:
name: retrodeck-flatpak
path: RetroDECK-cooker.flatpak
continue-on-error: true
# - name: Upload RetroDECK-cooker.flatpak to Gitea Release
# run: |
# # Set variables for Gitea host, organization, repository, access token, and release details
# GITEA_HOST="repo.retrodeck.net"
# UPLOAD_HOST="upload.retrodeck.net"
# ORGANIZATION="RetroDECK"
# REPO="RetroDECK-cooker"
# GITEA_TOKEN="${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}"
# RELEASE_NAME="RetroDECK ${{env.TAG}}"
# TAG="${{env.TAG}}"
# RELEASE_BODY="# Release Notes (Cooker)
# This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}.
# On branch [${{env.BRANCH_NAME}}](https://repo.retrodeck.net/RetroDECK/RetroDECK/src/branch/${{env.BRANCH_NAME}}).
# ## Commits since last release
# ${{ steps.commits.outputs.commits }}
# For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server.
# Cooker channel is provided for the community to test fixes and explore new functionality.
# Please DO NOT open issues or ask support on this build."
# # Create a release using curl and capture the release ID
# release_response=$(curl -X POST \
# -H "Authorization: token ${GITEA_TOKEN}" \
# -H "Content-Type: application/json" \
# -d "{\"tag_name\":\"$TAG\",\"name\":\"$RELEASE_NAME\",\"body\":\"$RELEASE_BODY\"}" \
# "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases")
# # Extract the release ID from the response
# release_id=$(echo $release_response | jq -r '.id')
# # Upload artifacts
# curl -X POST \
# -H "Authorization: token ${GITEA_TOKEN}" \
# -H "X-GitHub-Token: ${{ secrets.UPLOAD_TOKEN }}" \
# -H "Content-Type: multipart/form-data" \
# -F "attachment=@RetroDECK-cooker.flatpak" \
# "http://$UPLOAD_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak"
# # Upload artifacts sha
# curl -X POST \
# -H "Authorization: token ${GITEA_TOKEN}" \
# -H "X-GitHub-Token: ${{ secrets.UPLOAD_TOKEN }}" \
# -H "Content-Type: multipart/form-data" \
# -F "attachment=@RetroDECK-cooker.flatpak.sha" \
# "http://$UPLOAD_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak.sha"
# curl -X POST \
# -H "Authorization: token ${GITEA_TOKEN}" \
# -H "X-GitHub-Token: ${{ secrets.UPLOAD_TOKEN }}" \
# -H "Content-Type: multipart/form-data" \
# -F "attachment=@RetroDECK-Artifact.tar.gz" \
# "http://$UPLOAD_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-Artifact.tar.gz"

26
.github/workflows/godot.yml vendored Normal file
View file

@ -0,0 +1,26 @@
name: Building a mOnKeyX Project
on:
push:
branches: [ feat/godot-uk ]
pull_request:
branches: [ feat/godot-uk ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name : exportGame
uses: firebelley/godot-export@v5.2.1
with:
godot_executable_download_url: https://download.tuxfamily.org/godotengine/4.2.2/Godot_v4.2.2-stable_linux.x86_64.zip
godot_export_templates_download_url: https://download.tuxfamily.org/godotengine/4.2.2/Godot_v4.2.2-stable_export_templates.tpz
relative_project_path: tools/rd-config-test/
create_release: true
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

View file

@ -1,191 +0,0 @@
name: "Build main"
on:
push:
branches:
- main
paths:
- '.github/workflows/**'
- 'automation_tools/**'
- 'config/**'
- 'config/es-de/**'
- 'functions/**'
- 'rd-submodules/**'
- '*.sh'
- 'net.retrodeck.retrodeck.yml'
- 'net.retrodeck.retrodeck.appdata.xml'
pull_request:
branches:
- main
workflow_dispatch:
jobs:
Building_RetroDECK:
runs-on: retrodeck
steps:
# Circumventing this bug: https://github.com/flatpak/flatpak-builder/issues/317
- name: Remove stuck mounts
run: sudo umount -f /home/ubuntu/actions-runner/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
continue-on-error: true
- name: Clone RetroDECK repo
uses: actions/checkout@v4
with:
submodules: 'true'
- name: "Install dependencies"
run: "automation_tools/install_dependencies.sh"
# backing up manifest in case download fails and hashes must be recalculated
- name: Manifest backup
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
- name: Run pre-build automation tasks
run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
- name: Read manifest content
id: read_manifest
run: echo "::set-output name=file_content::$(cat net.retrodeck.retrodeck.yml)"
# - name: "Updating release notes in appdata"
# run: "automation_tools/appdata_management.sh"
- name: Check versions (main only)
id: check_version_string
run: "automation_tools/main_version_checker.sh"
- name: "[DEBUG] Outputting manifest"
run: cat net.retrodeck.retrodeck.yml
- name: "Build flatpak: download only"
id: "flatpak-download"
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
continue-on-error: true
# Sometimes flatpak download fails, in this case it tries a second time
- name: "Build flatpak: download only (retry)"
if: steps.flatpak-download.outcome == 'failure'
run: |
echo "Download failed, maybe some hash changed since the build start."
echo "Recalculating hashes and retrying download..."
rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
"${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
"${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
- name: Build flatpak
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh"
- name: Create Artifact for flathub
run: |
tar -czf ${GITHUB_WORKSPACE}/RetroDECK-Artifact.tar.gz -C ${GITHUB_WORKSPACE}/retrodeck-flatpak-main .
hash=($(sha256sum ${GITHUB_WORKSPACE}/RetroDECK-Artifact.tar.gz))
echo $hash > ${GITHUB_WORKSPACE}/RetroDECK-Artifact.sha
mv -f RetroDECK-Artifact.* ${{ secrets.ARTIFACT_REPO }}
- name: Create Bundle
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle.sh"
- name: Getting version info
id: version
run: |
appdata="https://raw.githubusercontent.com/RetroDECK/RetroDECK/main/net.retrodeck.retrodeck.appdata.xml"
REL_VER=$(curl -s $appdata | xmlstarlet sel -t -v "//release/@version" | head -1)
DES="$(curl -s $appdata | xmlstarlet sel -t -m "//release[1]" -v "description" -n | sed '1,2d;$d;s/^ */- /;/^- $/d')"
echo "REL_VER=$REL_VER" >> $GITHUB_ENV
echo -e "# Release Notes\n" >> "body.md"
echo "$DES" >> "body.md"
- name: Publish the flatpak in a new release
uses: ncipollo/release-action@v1
env:
REL_VER: ${{ env.REL_VER }}
with:
tag: ${{ env.REL_VER }}
name: "RetroDECK v${{ env.REL_VER }}"
bodyFile: "body.md"
artifacts: "RetroDECK.flatpak,RetroDECK.flatpak.sha,RetroDECK-Artifact.tar.gz"
allowUpdates: true
makeLatest: true
token: ${{ secrets.TRIGGER_BUILD_TOKEN }}
repo: RetroDECK
continue-on-error: true
- name: Rewrite Tag
run: |
git submodule deinit -f --all
git fetch --tags
if git rev-parse --verify "${{ env.REL_VER }}" >/dev/null 2>&1; then # if the tag exists
git tag -d "${{ env.REL_VER }}" # remove it from local repo
git push --delete origin "${{ env.REL_VER }}" # and from remote
fi
git tag "${{ env.REL_VER }}" # Create the tag locally
git push origin "${{ env.REL_VER }}" # Push the new tag in the remote repo
# In case it cannot publish the release at least it's providing the flatpak file for creating a manual release
- name: Upload RetroDECK.flatpak
uses: actions/upload-artifact@v4
with:
name: retrodeck-flatpak
path: RetroDECK.flatpak
continue-on-error: true
- name: Publish release on Gitea
run: |
# Set variables for Gitea host, organization, repository, access token, and release details
GITEA_HOST="repo.retrodeck.net"
UPLOAD_HOST="upload.retrodeck.net"
ORGANIZATION="RetroDECK"
REPO="RetroDECK"
GITEA_TOKEN="${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}"
RELEASE_NAME="RetroDECK v${{ env.REL_VER }}"
TAG="${{ env.REL_VER }}"
payload=$(jq -cn \
--arg tag_name "$TAG" \
--arg name "$RELEASE_NAME" \
--arg body "$(cat body.md)" \
'{$tag_name, $name, $body}'
)
# Create a release using curl and capture the release ID
release_response=$(curl -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
-d "$payload" \
"http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases"
)
# Extract the release ID from the response
release_id=$(echo $release_response | jq -r '.id')
# Upload artifacts
curl -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "X-GitHub-Token: ${{ secrets.UPLOAD_TOKEN }}" \
-H "Content-Type: multipart/form-data" \
-F "attachment=@RetroDECK.flatpak" \
"http://$UPLOAD_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak"
curl -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "X-GitHub-Token: ${{ secrets.UPLOAD_TOKEN }}" \
-H "Content-Type: multipart/form-data" \
-F "attachment=@RetroDECK-Artifact.tar.gz" \
"http://$UPLOAD_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-Artifact.tar.gz"
continue-on-error: true # this will be in place until we reate an artifacts website that bypasses cloudflare limit
- name: Upload RetroDECK.flatpak.sha to Gitea Release
run: |
curl -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "X-GitHub-Token: ${{ secrets.UPLOAD_TOKEN }}" \
-F "file=@RetroDECK.flatpak.sha" \
"https://$UPLOAD_HOST/RetroDECK/RetroDECK/releases/${{ env.REL_VER }}/assets?name=RetroDECK.flatpak.sha"
env:
GITEA_TOKEN: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}
continue-on-error: true # this will be in place until we reate an artifacts website that bypasses cloudflare limit

View file

@ -7,24 +7,24 @@ source automation_tools/version_extractor.sh
# Fetch appdata version
appdata_version=$(fetch_appdata_version)
log i "Appdata:\t\t$appdata_version"
echo -e "Appdata:\t\t$appdata_version"
# Defining manifest file location
appdata_file="net.retrodeck.retrodeck.appdata.xml"
# Check if release with appdata_version already exists
if grep -q "version=\"$appdata_version\"" "$appdata_file"; then
log i "Deleting existing release version $appdata_version..."
echo -e "Deleting existing release version $appdata_version..."
# Remove the existing release entry
sed -i "/<release version=\"$appdata_version\"/,/<\/release>/d" "$appdata_file"
fi
log i "Adding new release version $appdata_version..."
echo -e "Adding new release version $appdata_version..."
# Get today's date in the required format (YYYY-MM-DD)
today_date=$(date +"%Y-%m-%d")
log i "Today is $today_date"
echo -e "Today is $today_date"
# Construct the release snippet
release_snippet="\
@ -41,6 +41,7 @@ xml_content=$(cat "$appdata_file")
# Replace RELEASE_NOTES_PLACEHOLDER with the actual release notes
# TODO
rm -rf /tmp/wiki
git clone https://github.com/RetroDECK/RetroDECK.wiki.git /tmp/wiki
# Path to the markdown file

View file

@ -8,7 +8,7 @@ outside_file^VERSIONPLACEHOLDER^${GITHUB_WORKSPACE}/buildid
branch^THISBRANCH
THISREPO^THISREPO
hash^RASHAPLACEHOLDER^https://buildbot.libretro.com/nightly/linux/x86_64/RetroArch.7z
#hash^RASHAPLACEHOLDER^https://buildbot.libretro.com/nightly/linux/x86_64/RetroArch.7z
hash^SAMEDUCKSHAPLACEHOLDER^https://buildbot.libretro.com/nightly/linux/x86_64/latest/sameduck_libretro.so.zip
hash^PPSSPPBIOSHASHPLACEHOLDER^https://github.com/hrydgard/ppsspp/archive/refs/heads/master.zip
hash^MSXBIOSHASHPLACEHOLDER^http://bluemsx.msxblue.com/rel_download/blueMSXv282full.zip
@ -24,4 +24,6 @@ hash^RETRODECKMELONDSLATEST^https://github.com/RetroDECK/net.kuribo64.melonDS/re
hash^RETRODECKSOLARUSLATEST^https://github.com/RetroDECK/org.solarus_games.solarus.Launcher/releases/latest/download/RetroDECK-solarus-Artifact.tar.gz
hash^RETRODECKGZDOOMLATEST^https://github.com/RetroDECK/org.zdoom.GZDoom/releases/latest/download/RetroDECK-gzdoom-Artifact.tar.gz
hash^RETRODECKMAMELATEST^https://github.com/RetroDECK/MAME/releases/latest/download/RetroDECK-MAME-Artifact.tar.gz
hash^PORTMASTERLATESTSHA^https://github.com/PortsMaster/PortMaster-GUI/releases/latest/download/retrodeck.portmaster.zip
hash^PORTMASTERLATESTSHA^https://github.com/PortsMaster/PortMaster-GUI/releases/latest/download/retrodeck.portmaster.zip
hash^RACITRAPLACEHOLDER^https://buildbot.libretro.com/nightly/linux/x86_64/latest/citra_libretro.so.zip
hash^RETRODECKRPCS3LATEST^https://github.com/RetroDECK/net.rpcs3.RPCS3/releases/latest/download/RetroDECK-Artifact.tar.gz

View file

@ -6,5 +6,5 @@ word2=$(shuf -n 1 ${GITHUB_WORKSPACE}/automation_tools/codename_wordlist.txt)
capitalized_word2="$(tr '[:lower:]' '[:upper:]' <<< ${word2:0:1})${word2:1}"
result=$capitalized_word1$capitalized_word2
echo $result > ${GITHUB_WORKSPACE}/buildid
echo "buildid=$result" >> $GITHUB_ENV
echo "BUILD_ID=$result" >> $GITHUB_ENV
echo "VersionID is $result"

View file

@ -1,31 +0,0 @@
#!/bin/bash
# This script is installing the required dependencies to correctly run the pipeline and build the flatpak
unset pkg_mgr
# rpm-ostree must be checked before dnf because a dnf (wrapper) command also works on rpm-ostree distros (not what we want)
for potential_pkg_mgr in apt pacman rpm-ostree dnf; do
command -v "$potential_pkg_mgr" &> /dev/null && pkg_mgr="$potential_pkg_mgr" && break
done
case "$pkg_mgr" in
apt)
sudo apt install -y flatpak flatpak-builder p7zip-full xmlstarlet bzip2 curl jq
;;
pacman)
sudo pacman -S --noconfirm flatpak flatpak-builder p7zip xmlstarlet bzip2
;;
rpm-ostree)
echo "When using a distro with rpm-ostree, you shouldn't build directly on the host. Try using a distrobox."
exit 1
;;
dnf)
sudo dnf install -y flatpak flatpak-builder p7zip p7zip-plugins xmlstarlet bzip2 curl
;;
*)
echo "Package manager $pkg_mgr not supported. Please open an issue."
;;
esac
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo

View file

@ -42,7 +42,7 @@ FastmemMode = true
[GPU]
Renderer = Vulkan
Renderer = OpenGL
Adapter = AMD RADV VANGOGH
ResolutionScale = 3
Multisamples = 1

View file

@ -1132,6 +1132,11 @@
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_es_de/esde-guide/.",
"launch": "es-de"
},
"steam-rom-manager": {
"description": "Steam ROM Manager (used to sync RetroDECK favorites with Steam)",
"name": "Steam ROM Manager",
"launch": "steam-rom-manager"
},
"portmaster": {
"description": "PortMaster",
"name": "PortMaster",

View file

@ -31,10 +31,12 @@ default_user=
developer_options=false
kiroi_ponzu=false
akai_ponzu=false
steam_sync=false
sound_effects=true
volume_effects=10
font=1
cheevos_login=false
logging_level=none
[cheevos]
duckstation=false

View file

@ -0,0 +1,111 @@
[
{
"parserType": "Glob",
"configTitle": "RetroDECK",
"steamDirectory": "${steamdirglobal}",
"steamCategory": "RetroDECK",
"romDirectory": "${romsdirglobal}",
"executableArgs": "",
"executableModifier": "\"${exePath}\"",
"startInDirectory": "",
"titleModifier": "${fuzzyTitle}",
"imageProviders": [
"SteamGridDB"
],
"onlineImageQueries": "${${fuzzyTitle}}",
"imagePool": "${fuzzyTitle}",
"userAccounts": {
"specifiedAccounts": ""
},
"executable": {
"path": "",
"shortcutPassthrough": false,
"appendArgsToExecutable": true
},
"parserInputs": {
"glob": "${title}.sh"
},
"titleFromVariable": {
"limitToGroups": "",
"caseInsensitiveVariables": false,
"skipFileIfVariableWasNotFound": false,
"tryToMatchTitle": false
},
"fuzzyMatch": {
"replaceDiacritics": true,
"removeCharacters": true,
"removeBrackets": true
},
"controllers": {
"ps4": {
"title": "RetroDECK Controller",
"mappingId": "RetroDECK_controller_ps4.vdf",
"profileType": "template"
},
"ps5": {
"title": "RetroDECK Controller",
"mappingId": "RetroDECK_controller_ps5.vdf",
"profileType": "template"
},
"xbox360": {
"title": "RetroDECK Controller",
"mappingId": "RetroDECK_controller_xbox360_simple.vdf",
"profileType": "template"
},
"xboxone": {
"title": "RetroDECK Controller",
"mappingId": "RetroDECK_controller_xboxone_simple.vdf",
"profileType": "template"
},
"switch_joycon_left": {
"title": "Controller",
"mappingId": "controller_switch_joycon_left_gamepad_joystick.vdf",
"profileType": "template"
},
"switch_joycon_right": {
"title": "Controller",
"mappingId": "controller_switch_joycon_right_gamepad_joystick.vdf",
"profileType": "template"
},
"switch_pro": {
"title": "RetroDECK Controller",
"mappingId": "RetroDECK_controller_switchpro.vdf",
"profileType": "template"
},
"neptune": {
"title": "RetroDECK Controller",
"mappingId": "RetroDECK_controller_steamdeck_neptune_full.vdf",
"profileType": "template"
}
},
"imageProviderAPIs": {
"SteamGridDB": {
"nsfw": false,
"humor": false,
"styles": [],
"stylesHero": [],
"stylesLogo": [],
"stylesIcon": [],
"imageMotionTypes": [
"static"
]
}
},
"defaultImage": {
"tall": null,
"long": null,
"hero": null,
"logo": null,
"icon": null
},
"localImages": {
"tall": null,
"long": null,
"hero": null,
"logo": null,
"icon": null
},
"parserId": "1725539138664815",
"version": 15
}
]

View file

@ -0,0 +1,30 @@
{
"fuzzyMatcher": {
"verbose": false,
"filterProviders": true
},
"environmentVariables": {
"steamDirectory": "",
"userAccounts": "${steamlogin}",
"romsDirectory": "",
"retroarchPath": "",
"raCoresDirectory": "",
"localImagesDirectory": ""
},
"previewSettings": {
"retrieveCurrentSteamImages": true,
"deleteDisabledShortcuts": false,
"imageZoomPercentage": 30,
"preload": false
},
"enabledProviders": [
"SteamGridDB"
],
"batchDownloadSize": 50,
"language": "en-US",
"theme": "Deck",
"offlineMode": false,
"navigationWidth": 0,
"clearLogOnTest": false,
"version": 6
}

View file

@ -17,82 +17,91 @@
# log i "par" rekku.log -> logs an information with message in the specified log file inside the logs folder retrodeck/logs/rekku.log
log() {
if [[ ! $logging_level == "none" ]]; then
local level="$1"
local message="$2"
local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S.%3N])"
local colorize_terminal
local level="$1"
local message="$2"
local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S.%3N])"
local colorize_terminal
# Use specified logfile or default to retrodeck.log
local logfile
if [ -n "$3" ]; then
logfile="$3"
else
logfile="$rd_logs_folder/retrodeck.log"
# Use specified logfile or default to retrodeck.log
local logfile
if [ -n "$3" ]; then
logfile="$3"
else
logfile="$rd_logs_folder/retrodeck.log"
fi
# Check if the shell is sh (not bash or zsh) to avoid colorization
if [ "${SHELL##*/}" = "sh" ]; then
colorize_terminal=false
else
colorize_terminal=true
fi
case "$level" in
d)
if [[ $logging_level == "debug" ]]; then
if [ "$colorize_terminal" = true ]; then
# Debug (green) for terminal
colored_message="\e[32m[DEBUG] $message\e[0m"
else
# Debug (no color for sh) for terminal
colored_message="$timestamp [DEBUG] $message"
fi
# Write to log file without colorization
log_message="$timestamp [DEBUG] $message"
fi
;;
e)
if [[ $logging_level == "debug" || $logging_level == "error" ]]; then
if [ "$colorize_terminal" = true ]; then
# Error (red) for terminal
colored_message="\e[31m[ERROR] $message\e[0m"
else
# Error (no color for sh) for terminal
colored_message="$timestamp [ERROR] $message"
fi
# Write to log file without colorization
log_message="$timestamp [ERROR] $message"
fi
;;
w)
if [[ $logging_level == "debug" || $logging_level == "error" || $logging_level == "warn" ]]; then
if [ "$colorize_terminal" = true ]; then
# Warning (yellow) for terminal
colored_message="\e[33m[WARN] $message\e[0m"
else
# Warning (no color for sh) for terminal
colored_message="$timestamp [WARN] $message"
fi
# Write to log file without colorization
log_message="$timestamp [WARN] $message"
fi
;;
i)
if [[ $logging_level == "debug" || $logging_level == "error" || $logging_level == "warn" || $logging_level == "info" ]]; then
# Write to log file without colorization for info message
log_message="$timestamp [INFO] $message"
colored_message=$log_message
fi
;;
*)
# Default (no color for other shells) for terminal
colored_message="$timestamp $message"
# Write to log file without colorization
log_message="$timestamp $message"
;;
esac
# Display the message in the terminal
echo -e "$colored_message" >&2
# Write the log message to the log file
if [ ! -f "$logfile" ]; then
echo "$timestamp [WARN] Log file not found in \"$logfile\", creating it" >&2
touch "$logfile"
fi
echo "$log_message" >> "$logfile"
fi
# Check if the shell is sh (not bash or zsh) to avoid colorization
if [ "${SHELL##*/}" = "sh" ]; then
colorize_terminal=false
else
colorize_terminal=true
fi
case "$level" in
w)
if [ "$colorize_terminal" = true ]; then
# Warning (yellow) for terminal
colored_message="\e[33m[WARN] $message\e[0m"
else
# Warning (no color for sh) for terminal
colored_message="$timestamp [WARN] $message"
fi
# Write to log file without colorization
log_message="$timestamp [WARN] $message"
;;
e)
if [ "$colorize_terminal" = true ]; then
# Error (red) for terminal
colored_message="\e[31m[ERROR] $message\e[0m"
else
# Error (no color for sh) for terminal
colored_message="$timestamp [ERROR] $message"
fi
# Write to log file without colorization
log_message="$timestamp [ERROR] $message"
;;
i)
# Write to log file without colorization for info message
log_message="$timestamp [INFO] $message"
colored_message=$log_message
;;
d)
if [ "$colorize_terminal" = true ]; then
# Debug (green) for terminal
colored_message="\e[32m[DEBUG] $message\e[0m"
else
# Debug (no color for sh) for terminal
colored_message="$timestamp [DEBUG] $message"
fi
# Write to log file without colorization
log_message="$timestamp [DEBUG] $message"
;;
*)
# Default (no color for other shells) for terminal
colored_message="$timestamp $message"
# Write to log file without colorization
log_message="$timestamp $message"
;;
esac
# Display the message in the terminal
echo -e "$colored_message" >&2
# Write the log message to the log file
if [ ! -f "$logfile" ]; then
echo "$timestamp [WARN] Log file not found in \"$logfile\", creating it" >&2
touch "$logfile"
fi
echo "$log_message" >> "$logfile"
}

View file

@ -913,8 +913,25 @@ release_selector() {
quit_retrodeck() {
log i "Quitting ES-DE"
pkill -f "es-de"
# if steam sync is on do the magic
if [[ $steam_sync == "true" ]]; then
(
source /app/libexec/steam_sync.sh
add_to_steam "$(ls "$rdhome/ES-DE/gamelists/")"
) |
zenity --progress \
--title="Syncing with Steam" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--text="Syncing favorite games with Steam, please wait." \
--percentage=25 \
--pulsate \
--auto-close \
--auto-kill
fi
log i "Shutting down RetroDECK's framework"
pkill -f "retrodeck"
log i "See you next time"
}
@ -923,4 +940,4 @@ start_retrodeck() {
ponzu
log i "Starting RetroDECK v$version"
es-de
}
}

View file

@ -437,7 +437,10 @@ post_update() {
prepare_component "reset" "es-de"
prepare_component "reset" "portmaster"
prepare_component "reset" "ruffle"
log d "Steam Rom Manager was added, we need to prepare it"
update_rd_conf
prepare_component "reset" "steam-rom-manager"
# TODO: check this
# rm /var/config/emulationstation/.emulationstation # remving the old symlink to .emulationstation as it might be not needed anymore

View file

@ -81,6 +81,22 @@ prepare_component() {
fi
fi
if [[ "$component" =~ ^(steam-rom-manager|all)$ ]]; then
component_found="true"
log i "-----------------------------"
log i "Prepearing Steam ROM Manager"
log i "-----------------------------"
local srm_userdata="/var/config/steam-rom-manager/userData"
create_dir -d "/var/config/steam-rom-manager"
create_dir -d "$srm_userdata"
cp -fv "$config/steam-rom-manager/"*.json $srm_userdata
log i "Updating steamDirectory and romDirectory lines in $srm_userdata/userSettings.json"
jq '.environmentVariables.steamDirectory = "'$HOME'/.steam/steam"' "$srm_userdata/userSettings.json" > "$srm_userdata/tmp.json" && mv -f "$srm_userdata/tmp.json" "$srm_userdata/userSettings.json"
jq '.environmentVariables.romsDirectory = "'$rdhome'/.sync"' "$srm_userdata/userSettings.json" > "$srm_userdata/tmp.json" && mv -f "$srm_userdata/tmp.json" "$srm_userdata/userSettings.json"
fi
if [[ "$component" =~ ^(retroarch|all)$ ]]; then
component_found="true"
log i "--------------------------------"

View file

@ -4,7 +4,18 @@ change_preset_dialog() {
# This function will build a list of all systems compatible with a given preset, their current enable/disabled state and allow the user to change one or more
# USAGE: change_preset_dialog "$preset"
build_preset_list_options "$1"
preset="$1"
pretty_preset_name=${preset//_/ } # Preset name prettification
pretty_preset_name=$(echo $pretty_preset_name | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1') # Preset name prettification
current_preset_settings=()
local section_results=$(sed -n '/\['"$preset"'\]/, /\[/{ /\['"$preset"'\]/! { /\[/! p } }' $rd_conf | sed '/^$/d')
while IFS= read -r config_line
do
system_name=$(get_setting_name "$config_line" "retrodeck")
system_value=$(get_setting_value "$rd_conf" "$system_name" "retrodeck" "$preset")
current_preset_settings=("${current_preset_settings[@]}" "$system_value" "$(make_name_pretty $system_name)" "$system_name")
done < <(printf '%s\n' "$section_results")
choice=$(rd_zenity \
--list --width=1200 --height=720 \
@ -21,7 +32,7 @@ change_preset_dialog() {
if [[ ! -z $choice || "$rc" == 0 ]]; then
(
make_preset_changes
make_preset_changes "$1" "$choice"
) |
rd_zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
@ -35,6 +46,8 @@ change_preset_dialog() {
build_preset_list_options() {
# This function will build a list of all the systems available for a given preset
# The list will be generated into a Godot temp file and the variable $current_preset_settings
# The other arrays built (all_systems, changed_systems etc.) are also used in the make_preset_changes() function, so this needs to be called in the same memory space as that function at least once
# USAGE: build_preset_list_options "$preset"
if [[ -f "$godot_current_preset_settings" ]]; then
rm -f "$godot_current_preset_settings" # Godot data transfer temp files
@ -49,6 +62,7 @@ build_preset_list_options() {
current_disabled_systems=()
changed_systems=()
changed_presets=()
all_systems=()
local section_results=$(sed -n '/\['"$preset"'\]/, /\[/{ /\['"$preset"'\]/! { /\[/! p } }' $rd_conf | sed '/^$/d')
while IFS= read -r config_line
@ -68,7 +82,9 @@ build_preset_list_options() {
make_preset_changes() {
# This function will take an array $choices, which contains the names of systems that have been enabled for this preset and enable them in the backend
# This function will take a preset name $preset and a CSV list $choice, which contains the names of systems that have been enabled for this preset and enable them in the backend
# Any systems which are currently enabled and not in the CSV list $choice will instead be disabled in the backend
# USAGE: make_preset_changes $preset $choice
# Fetch incompatible presets from JSON and create a lookup list
incompatible_presets=$(jq -r '
@ -79,6 +95,11 @@ make_preset_changes() {
] | join("\n")
' $features)
preset="$1"
choice="$2"
build_preset_list_options "$preset"
IFS="," read -ra choices <<< "$choice"
for emulator in "${all_systems[@]}"; do
if [[ " ${choices[*]} " =~ " ${emulator} " && ! " ${current_enabled_systems[*]} " =~ " ${emulator} " ]]; then

View file

@ -0,0 +1,404 @@
"""Sync RetroDECK favorites games with steam shortcuts"""
import binascii
import os
import re
import shlex
import shutil
import glob
import sys
import time
import hashlib
import xml.etree.ElementTree as ET
from resetsync import resetfun
command_list_default={
"3do": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/opera_libretro.so",
"amiga": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/puae_libretro.so",
"amiga1200": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/puae_libretro.so",
"amiga600": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/puae_libretro.so",
"amigacd32": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/puae_libretro.so",
"amstradcpc": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/cap32_libretro.so",
"arcade": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame_libretro.so",
"arduboy": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/arduous_libretro.so",
"astrocde": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame_libretro.so",
"atari2600": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/stella_libretro.so",
"atari5200": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/a5200_libretro.so",
"atari7800": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/prosystem_libretro.so",
"atari800": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/atari800_libretro.so",
"atarijaguar": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/virtualjaguar_libretro.so",
"atarijaguarcd": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/virtualjaguar_libretro.so",
"atarilynx": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/handy_libretro.so",
"atarist": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/hatari_libretro.so",
"atarixe": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/atari800_libretro.so",
"atomiswave": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/flycast_libretro.so",
"c64": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vice_x64sc_libretro.so",
"cavestory": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/nxengine_libretro.so",
"cdimono1": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/same_cdi_libretro.so",
"cdtv": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/puae_libretro.so",
"chailove": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/chailove_libretro.so",
"channelf": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/freechaf_libretro.so",
"colecovision": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/bluemsx_libretro.so",
"cps": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame_libretro.so",
"cps1": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame_libretro.so",
"cps2": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame_libretro.so",
"cps3": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame_libretro.so",
"doom": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/prboom_libretro.so",
"dos": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/dosbox_pure_libretro.so",
"dreamcast": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/flycast_libretro.so",
"easyrpg": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/easyrpg_libretro.so",
"famicom": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mesen_libretro.so",
"flash": "TODO: I have to catch how it works", #TODO
"fba": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fbalpha2012_libretro.so",
"fbneo": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fbneo_libretro.so",
"fds": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mesen_libretro.so",
"gameandwatch": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/gw_libretro.so",
"gamegear": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/genesis_plus_gx_libretro.so",
"gb": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/gambatte_libretro.so",
"gba": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mgba_libretro.so",
"gbc": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/gambatte_libretro.so",
"genesis": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/genesis_plus_gx_libretro.so",
"gx4000": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/cap32_libretro.so",
"intellivision": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/freeintv_libretro.so",
"j2me": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/squirreljme_libretro.so",
"lcdgames": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/gw_libretro.so",
"lutro": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/lutro_libretro.so",
"mame": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame_libretro.so",
"mastersystem": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/genesis_plus_gx_libretro.so",
"megacd": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/genesis_plus_gx_libretro.so",
"megacdjp": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/genesis_plus_gx_libretro.so",
"megadrive": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/genesis_plus_gx_libretro.so",
"megaduck": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/sameduck_libretro.so",
"mess": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mess2015_libretro.so",
"model2": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame_libretro.so",
"moto": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/theodore_libretro.so",
"msx": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/bluemsx_libretro.so",
"msx1": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/bluemsx_libretro.so",
"msx2": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/bluemsx_libretro.so",
"msxturbor": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/bluemsx_libretro.so",
"multivision": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/gearsystem_libretro.so",
"n64": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mupen64plus_next_libretro.so",
"n64dd": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/parallel_n64_libretro.so",
"naomi": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/flycast_libretro.so",
"naomigd": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/flycast_libretro.so",
"nds": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/desmume_libretro.so",
"neogeo": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fbneo_libretro.so",
"neogeocd": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/neocd_libretro.so",
"neogeocdjp": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/neocd_libretro.so",
"nes": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mesen_libretro.so",
"ngp": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_ngp_libretro.so",
"ngpc": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_ngp_libretro.so",
"odyssey2": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/o2em_libretro.so",
"palm": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mu_libretro.so",
"pc88": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/quasi88_libretro.so",
"pc98": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/np2kai_libretro.so",
"pcengine": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_pce_libretro.so",
"pcenginecd": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_pce_libretro.so",
"pcfx": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_pcfx_libretro.so",
"pokemini": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/pokemini_libretro.so",
"psx": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/swanstation_libretro.so",
"quake": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/tyrquake_libretro.so",
"satellaview": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/snes9x_libretro.so",
"saturn": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_saturn_libretro.so",
"saturnjp": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_saturn_libretro.so",
"scummvm": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/scummvm_libretro.so",
"sega32x": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/picodrive_libretro.so",
"sega32xjp": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/picodrive_libretro.so",
"sega32xna": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/picodrive_libretro.so",
"segacd": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/genesis_plus_gx_libretro.so",
"sfc": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/snes9x_libretro.so",
"sg-1000": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/genesis_plus_gx_libretro.so",
"sgb": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mesen-s_libretro.so",
"snes": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/snes9x_libretro.so",
"snesna": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/snes9x_libretro.so",
"spectravideo": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/bluemsx_libretro.so",
"sufami": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/snes9x_libretro.so",
"supergrafx": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_supergrafx_libretro.so",
"supervision": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/potator_libretro.so",
"tg16": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_pce_libretro.so",
"tg-cd": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_pce_libretro.so",
"tic80": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/tic80_libretro.so",
"to8": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/theodore_libretro.so",
"uzebox": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/uzem_libretro.so",
"vectrex": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vecx_libretro.so",
"vic20": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vice_xvic_libretro.so",
"videopac": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/o2em_libretro.so",
"virtualboy": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_vb_libretro.so",
"wasm4": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/wasm4_libretro.so",
"wonderswan": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_wswan_libretro.so",
"wonderswancolor": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_wswan_libretro.so",
"x1": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/x1_libretro.so",
"x68000": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/px68k_libretro.so",
"zx81": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/81_libretro.so",
"zxspectrum": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fuse_libretro.so",
"switch": "flatpak run --command=/var/data/ponzu/Yuzu/bin/yuzu net.retrodeck.retrodeck -f -g",
"n3ds": "flatpak run --command=/var/data/ponzu/Citra/bin/citra-qt net.retrodeck.retrodeck",
"ps2": "flatpak run --command=pcsx2-qt net.retrodeck.retrodeck -batch",
"wiiu": "flatpak run --command=Cemu-wrapper net.retrodeck.retrodeck -g",
"gc": "flatpak run --command=dolphin-emu-wrapper net.retrodeck.retrodeck -b -e",
"wii": "flatpak run --command=dolphin-emu-wrapper net.retrodeck.retrodeck -b -e",
"xbox": "flatpak run --command=xemu net.retrodeck.retrodeck -dvd_path",
"ps3": "flatpak run --command=pcsx3 net.retrodeck.retrodeck --no-gui",
"psp": "flatpak run --command=PPSSPPSDL net.retrodeck.retrodeck",
"pico8": "flatpak run --command=pico8 net.retrodeck.retrodeck -desktop_path ~/retrodeck/screenshots -root_path {GAMEDIR} -run"
}
alt_command_list={
"PUAE": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/puae_libretro.so",
"Caprice32": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/cap32_libretro.so",
"MAME - CURRENT": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame_libretro.so",
"Stella": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/stella_libretro.so",
"a5200": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/a5200_libretro.so",
"Atari800": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/atari800_libretro.so",
"Handy": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/handy_libretro.so",
"VICE x64sc Accurate": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vice_x64sc_libretro.so",
"SAME CDi": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/same_cdi_libretro.so",
"blueMSX": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/bluemsx_libretro.so",
"MAME - CURRENT": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame_libretro.so",
"PrBoom": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/prboom_libretro.so",
"DOSBox-Pure": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/dosbox_pure_libretro.so",
"Mesen": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mesen_libretro.so",
"Genesis Plus GX": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/genesis_plus_gx_libretro.so",
"Gamebatte": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/gambatte_libretro.so",
"mGBA": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mgba_libretro.so",
"ParaLLEI N64": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/parallel_n64_libretro.so",
"DeSmuME": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/desmume_libretro.so",
"NeoCD": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/neocd_libretro.so",
"Beetle NeoPop": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_ngp_libretro.so",
"Neko Project II Kai": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/np2kai_libretro.so",
"Beetle PCE": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_pce_libretro.so",
"Swanstation": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/swanstation_libretro.so",
"TyrQuake": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/tyrquake_libretro.so",
"Beetle Saturn": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_saturn_libretro.so",
"Snes 9x - Current": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/snes9x_libretro.so",
"Beetle SuperGrafx": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_supergrafx_libretro.so",
"Yuzu (Standalone)": "flatpak run --command=yuzu net.retrodeck.retrodeck -f -g",
"Citra (Standalone)": "flatpak run --command=citra net.retrodeck.retrodeck",
"PCSX2 (Standalone)": "flatpak run --command=pcsx2-qt net.retrodeck.retrodeck -batch",
"Dolphin (Standalone)": "flatpak run --command=dolphin-emu-wrapper net.retrodeck.retrodeck -b -e",
"RPCS3 Directory (Standalone)": "flatpak run --command=pcsx3 net.retrodeck.retrodeck --no-gui",
"PPSSPP (Standalone)": "flatpak run --command=PPSSPPSDL net.retrodeck.retrodeck",
"PICO-8 (Standalone)": "flatpak run --command=pico8 net.retrodeck.retrodeck -desktop_path ~/retrodeck/screenshots -root_path {GAMEDIR} -run",
"PUAE 2021": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/puae2021_libretro.so",
"CrocoDS": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/crocods_libretro.so",
"CPCemu (Standalone)": "NYI", #NYI
"MAME 2010": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame2010_libretro.so",
"MAME 2003-Plus": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame2003_plus_libretro.so",
"MAME 2000": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mame2000_libretro.so",
"MAME (Standalone)": "NYI", #NYI
"FinalBurn Neo": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fbneo_libretro.so",
"FinalBurn Neo (Standalone)": "NYI", #NYI
"FB Alpha 2012": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fbalpha2012_libretro.so",
"Flycast": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/flycast_libretro.so",
"Flycast (Standalone)": "NYI", #NYI
"Kronos": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/kronos_libretro.so",
"Supermodel (Standalone)": "NYI", #NYI
"Supermodel [Fullscreen] (Standalone)": "NYI", #NYI
"Shortcut or script": "TODO: I have to catch how it works", #TODO
"Atari800 (Standalone)": "NYI", #NYI
"Stella 2014": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/stella2014_libretro.so",
"Atari800": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/atari800_libretro.so",
"Beetle Lynx": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_lynx_libretro.so",
"VICE x64 Fast": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vice_x64_libretro.so",
"VICE x64 SuperCPU": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vice_xscpu64_libretro.so",
"VICE x128": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vice_x128_libretro.so",
"Frodo": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/frodo_libretro.so",
"CDi 2015": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/cdi2015_libretro.so",
"Gearcoleco": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/gearcoleco_libretro.so",
"FB Alpha 2012 CPS-1": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fbalpha2012_cps1_libretro.so",
"FB Alpha 2012 CPS-2": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fbalpha2012_cps2_libretro.so",
"FB Alpha 2012 CPS-3": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fbalpha2012_cps3_libretro.so",
"Boom 3": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/boom3_libretro.so",
"Boom 3 xp": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/boom3_libretro_xp.so",
"DOSBox-Core": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/dosbox_core_libretro.so",
"DOSBox-SVN": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/dosbox_svn_libretro.so",
"Keep ES-DE running": "TODO: I have to catch how it works", #TODO
"AppImage (Suspend ES-DE)": "TODO: I have to catch how it works", #TODO
"AppImage (Keep ES-DE running)": "TODO: I have to catch how it works", #TODO
"Nestopia UE": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/nestopia_libretro.so",
"FCEUmm": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fceumm_libretro.so",
"QuickNES": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/quicknes_libretro.so",
"Genesis Plus GX Wide": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/genesis_plus_gx_wide_libretro.so",
"Gearsystem": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/gearsystem_libretro.so",
"SMS Plus GX": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/smsplus_libretro.so",
"SameBoy": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/sameboy_libretro.so",
"Gearboy": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/gearboy_libretro.so",
"TGB Dual": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/tgbdual_libretro.so",
"Mesen-S": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mesen-s_libretro.so",
"VBA-M": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vbam_libretro.so",
"bsnes": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/bsnes_libretro.so",
"mGBA": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mgba_libretro.so",
"VBA Next": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vba_next_libretro.so",
"gpSP": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/gpsp_libretro.so",
"Dolphin": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/dolphin_libretro.so",
"PrimeHack (Standalone)": "flatpak run --command=primehack-wrapper net.retrodeck.retrodeck -b -e",
"PicoDrive": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/picodrive_libretro.so",
"BlastEm": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/blastem_libretro.so",
"CrocoDS": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/crocods_libretro.so",
"fMSX": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fmsx_libretro.so",
"Citra": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/citra_libretro.so",
"Citra 2018": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/citra2018_libretro.so",
"Mupen64Plus-Next": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mupen64plus_next_libretro.so",
"DeSmuME 2015": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/desmume2015_libretro.so",
"melonDS": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/melonds_libretro.so",
"melonDS (Standalone)": "flatpak run --command=melonDS net.retrodeck.retrodeck",
"FinalBurn Neo neogeocd": "flatpak run --command=retroarch net.retrodeck.retrodeck --subsystem neocd -L /var/config/retroarch/cores/fbneo_libretro.so",
"RACE": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/race_libretro.so",
"Neko Project II": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/nekop2_libretro.so",
"Beetle PCE FAST": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_pce_fast_libretro.so",
"PICO-8 Splore (Standalone)": "flatpak run --command=pico8 net.retrodeck.retrodeck -desktop_path ~/retrodeck/screenshots -root_path {GAMEDIR} -splore",
"AppImage": "TODO: I have to catch how it works", #TODO
"LRPS2": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/pcsx2_libretro.so",
"PCSX2": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/pcsx2_libretro.so",
"RPCS3 Shortcut (Standalone)": "TODO: I have to catch how it works", #TODO
"PPSSPP": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/ppsspp_libretro.so",
"Beetle PSX": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_psx_libretro.so",
"Beetle PSX HW": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_psx_hw_libretro.so",
"PCSX ReARMed": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/pcsx_rearmed_libretro.so",
"DuckStation (Standalone)": "flatpak run --command=duckstation-qt net.retrodeck.retrodeck -batch",
"vitaQuake 2": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vitaquake2_libretro.so",
"vitaQuake 2 [Rogue]": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vitaquake2-rogue_libretro.so",
"vitaQuake 2 [Xatrix]": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vitaquake2-xatrix_libretro.so",
"vitaQuake 2 [Zaero]": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vitaquake2-zaero_libretro.so",
"vitaQuake 3": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/vitaquake3_libretro.so",
"YabaSanshiro": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/yabasanshiro_libretro.so",
"Yabause": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/yabause_libretro.so",
"Snes9x 2010": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/snes9x2010_libretro.so",
"bsnes-hd": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/bsnes_hd_beta_libretro.so",
"bsnes-mercury Accuracy": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/bsnes_mercury_accuracy_libretro.so",
"Beetle Supafaust": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_supafaust_libretro.so",
"Beetle PCE": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_pce_libretro.so"
}
exit_file="/tmp/retrodeck_steam_sync_exit"
rdhome=""
roms_folder=""
def create_shortcut_new_new(games):
ignore_game=rdhome+"/.sync/IGNORE.sh"
old_games=os.listdir(rdhome+"/.sync/").copy()
for game in games:
try:
i=old_games.index(game[0]+".sh")
old_games[i]=0
except ValueError:
print(game[0]+" is a new game!")
path=rdhome+"/.sync/"+game[0]+".sh"
print("Go to path: "+path)
fl=open(path,"w")
fl.write("#!/bin/bash\n\n")
fl.write('if test "$(whereis flatpak)" = "flatpak:"\n')
fl.write("then\n")
fl.write("flatpak-spawn --host "+game[1]+"\n")
fl.write("else\n")
fl.write(game[1]+"\n")
fl.write("fi\n")
fl.close()
st=os.stat(path)
os.chmod(path, st.st_mode | 0o0111)
print("Start removing")
print(old_games)
for game in old_games:
if game:
os.remove(rdhome+"/.sync/"+game)
dir=os.listdir(rdhome+"/.sync/")
if len(dir)==0:
print("No game found, removing all")
fl=open(ignore_game,"w")
fl.close()
os.system("/app/bin/zypak-wrapper /app/srm/steam-rom-manager remove")
os.remove(ignore_game)
else:
print("Adding the games")
os.system("/app/bin/zypak-wrapper /app/srm/steam-rom-manager add")
def addToSteam(systems):
games=[]
for system in systems:
print("Start parsing system: {}".format(system))
f=open(rdhome+"/ES-DE/gamelists/"+system+"/gamelist.xml","r")
f.readline()
parser=ET.XMLParser()
parser.feed(b'<root>')
parser.feed(f.read())
parser.feed(b'</root>')
root=parser.close()
f.close()
globalAltEmu=""
for subroot in root:
if subroot.tag=="alternativeEmulator":
for alt in subroot:
globalAltEmu=alt.text
else:
for game in subroot:
path=""
name=""
favorite=""
altemulator=globalAltEmu
for tag in game:
if tag.tag=="path":
path=tag.text
elif tag.tag=="name":
name=tag.text
elif tag.tag=="favorite":
favorite=tag.text
elif tag.tag=="altemulator":
altemulator=tag.text
if favorite=="true" and altemulator=="":
print("Find favorite game: {}".format(name))
games.append([name,command_list_default[system]+" '"+roms_folder+"/"+system+path[1:]+"'"])
elif favorite=="true":
print("Find favorite game with alternative emulator: {}, {}".format(name,altemulator))
if ("neogeocd" in system) and altemulator=="FinalBurn Neo":
games.append([name,alt_command_list[altemulator+" neogeocd"]+" '"+roms_folder+"/"+system+path[1:]+"'"])
print(alt_command_list[altemulator+" neogeocd"]+" '"+roms_folder+"/"+system+path[1:]+"'")
elif system=="pico8" and altemulator=="PICO-8 Splore (Standalone)":
games.append([name,alt_command_list[altemulator]])
print(alt_command_list[altemulator])
else:
games.append([name,alt_command_list[altemulator]+" '"+roms_folder+"/"+system+path[1:]+"'"])
print(alt_command_list[altemulator]+" '"+roms_folder+"/"+system+path[1:]+"'")
create_shortcut_new_new(games)
def start_config():
global rdhome
global roms_folder
global command_list_default
global alt_command_list
print("Open RetroDECK config file: {}".format(os.path.expanduser("~/.var/app/net.retrodeck.retrodeck/config/retrodeck/retrodeck.cfg")))
fl=open(os.path.expanduser("~/.var/app/net.retrodeck.retrodeck/config/retrodeck/retrodeck.cfg"),"r")
lines=fl.readlines()
for line in lines:
if "rdhome" in line:
rdhome=line[7:-1]
elif "roms_folder" in line:
roms_folder=line[12:-1]
fl.close()
command_list_default["pico8"]=command_list_default["pico8"].replace("{GAMEDIR}",roms_folder+"/pico8")
alt_command_list["PICO-8 Splore (Standalone)"]=alt_command_list["PICO-8 Splore (Standalone)"].replace("{GAMEDIR}",roms_folder+"/pico8")
srm_path=os.path.expanduser("~/.var/app/net.retrodeck.retrodeck/config/steam-rom-manager/userData/userConfigurations.json")
if not os.path.isfile(srm_path):
print("Steam ROM Manager configuration not initialized! Initializing now.")
resetfun(rdhome)
if not os.path.exists(rdhome+"/.sync/"):
os.makedirs(rdhome+"/.sync/")
if __name__=="__main__":
start_config()
addToSteam(os.listdir(rdhome+"/ES-DE/gamelists/"))
print("Finished!")

148
functions/steam_sync.sh Normal file
View file

@ -0,0 +1,148 @@
#!/bin/bash
# Add games to Steam function
add_to_steam() {
log "i" "Starting Steam Sync"
steamsync_folder="$rdhome/.sync"
steamsync_folder_tmp="$rdhome/.sync-tmp"
create_dir $steamsync_folder
mv $steamsync_folder $steamsync_folder_tmp
create_dir $steamsync_folder
local srm_path="/var/config/steam-rom-manager/userData/userConfigurations.json"
if [ ! -f "$srm_path" ]; then
log "e" "Steam ROM Manager configuration not initialized! Initializing now."
prepare_component "reset" "steam-rom-manager"
fi
# Build the systems array from space-separated systems
local systems_string=$(jq -r '.system | keys[]' "$features" | paste -sd' ')
IFS=' ' read -r -a systems <<< "$systems_string" # TODO: do we need this line?
local games=()
for system in "${systems[@]}"; do
local gamelist="$rdhome/ES-DE/gamelists/$system/gamelist.xml"
if [ -f "$gamelist" ]; then
# Extract all <game> elements that are marked as favorite="true"
game_blocks=$(xmllint --recover --xpath '//game[favorite="true"]' "$gamelist" 2>/dev/null)
log d "Extracted favorite game blocks:\n\n$game_blocks\n\n"
# Split the game_blocks into an array, where each element is a full <game> block
IFS=$'\n' read -r -d '' -a game_array <<< "$(echo "$game_blocks" | xmllint --recover --format - | sed -n '/<game>/,/<\/game>/p' | tr '\n' ' ')"
# Iterate over each full <game> block in the array
for game_block in "${game_array[@]}"; do
log "d" "Processing game block:\n$game_block"
# Extract the game's name and path from the full game block
local name=$(echo "$game_block" | xmllint --xpath 'string(//game/name)' - 2>/dev/null)
local path=$(echo "$game_block" | xmllint --xpath 'string(//game/path)' - 2>/dev/null | sed 's|^\./||') # removing the ./
log "d" "Game name: $name"
log "d" "Game path: $path"
# Ensure the extracted name and path are valid
if [ -n "$name" ] && [ -n "$path" ]; then
# Check for an alternative emulator if it exists
# local emulator=$(echo "$game_block" | xmllint --xpath 'string(//game/altemulator)' - 2>/dev/null)
# if [ -z "$emulator" ]; then
# games+=("$name ${command_list_default[$system]} '$roms_folder/$system/$path'")
# else
# games+=("$name ${alt_command_list[$emulator]} '$roms_folder/$system/$path'")
# fi
log "d" "Steam Sync: found favorite game: $name"
else
log "w" "Steam Sync: failed to find valid name or path for favorite game"
fi
# Sanitize the game name for the filename: replace special characters with underscores
local sanitized_name=$(echo "$name" | sed -e 's/^A-Za-z0-9._-/ /g')
local sanitized_name=$(echo "$sanitized_name" | sed -e 's/:/ -/g')
local sanitized_name=$(echo "$sanitized_name" | sed -e 's/&/and/g')
local sanitized_name=$(echo "$sanitized_name" | sed -e 's%/%and%g')
local sanitized_name=$(echo "$sanitized_name" | sed -e 's/ / - /g')
local sanitized_name=$(echo "$sanitized_name" | sed -e 's/ / /g')
log d "File Path: $path"
log d "Game Name: $name"
# If the filename is too long, shorten it
if [ ${#sanitized_name} -gt 100 ]; then
sanitized_name=$(echo "$sanitized_name" | cut -c 1-100)
fi
log d "Sanitized Name: $sanitized_name"
local launcher="$steamsync_folder/${sanitized_name}.sh"
local launcher_tmp="$steamsync_folder_tmp/${sanitized_name}.sh"
if [ ! -e "$launcher_tmp" ]; then
log d "Creating desktop file: $launcher"
# if [[ -v command_list_default[$system] ]]; then
# command="${command_list_default[$system]}"
# else
# log e "$system is not included in the commands array."
# continue
# fi
# Populate the .sync script with the correct command
# TODO: if there is any emulator defined in the xml we use that, else... how we can know which is the default one?
# TODO: if steam is flatpak the command wrapping will change in .desktop
local command="flatpak run net.retrodeck.retrodeck start '$roms_folder/$system/$path'"
# Create the launcher file using a heredoc - if you enable .desktp this remember to edit .desktop in SRM userConfigurations.json and the above launcher variable (and vice versa)
# cat <<EOF > "$launcher"
# [Desktop Entry]
# Version=1.0
# Name=$name
# Comment=$name via RetroDECK
# Exec=$command
# Icon=net.retrodeck.retrodeck
# Terminal=false
# Type=Application
# Categories=Game;Emulator;
# EOF
cat <<EOF > "$launcher"
#!/bin/bash
if [ test "\$(whereis flatpak)" = "flatpak:" ]; then
flatpak-spawn --host $command
else
$command
fi
EOF
chmod +x "$launcher"
else
log d "$launcher desktop file already exists"
mv "$launcher_tmp" "$launcher"
fi
done
fi
done
rm -r $steamsync_folder_tmp
if [ -z "$( ls -A $steamsync_folder )" ]; then
log d "No games found, cleaning shortcut"
remove_from_steam
else
log d "Updating game list"
steam-rom-manager add
fi
log i "Steam Sync: completed"
}
remove_from_steam() {
log d "Creating fake game"
cat "" > "$steamsync_folder/CUL0.sh"
log d "Cleaning the shortcut"
steam-rom-manager remove
log d "Removing fake game"
rm "$steamsync_folder/CUL0.sh"
}

View file

@ -72,18 +72,26 @@
<description>
<p>Changes:</p>
<ul>
<li>WELCOME TO cooker-0.9.0b!</li>
<li>RetroDECK is on a diet: we saved around 600mb</li>
<li>RetroDECK is on a diet: we saved around 600mb on the final build</li>
<li>Updated all the outdated emulators</li>
<li>Duckstation due to licensing changes is frozen at the latest possible build becoming de facto: Legacy</li>
<li>Duckstation configured to use OpenGL as Vulkan seems to be broken in some cases</li>
<li>New Flash system via the new emulator: Ruffle</li>
<li>PortMaster is now included in RetroDECK!</li>
<li>Steam Sync is now a thing: favorite your games and enable the Steam Sync in the Configurator to find them as a Steam standalone games thank to Steam Rom Manager acting like an engine</li>
<li>New Configurator completely written in GODOT, now with controller support and many more features for you to discover</li>
<li>New run game engine added to run games via cli, just run `flatpak run net.retrodeck.retrodeck start retrodeck/roms/system/game.ext`, `--help` for more info</li>
</ul>
<p>Developers, developers, developers:</p>
<ul>
<li>Manifest was completely redone, more on that on the MONTH blog post</li>
<li>RetroDECK now is migrated to an organization on GitHub, as before, please check the MONTH blog post</li>
<li>Manifest was completely redone, more on that on the October blog post</li>
<li>RetroDECK now is migrated to an organization on GitHub, as before, please check the October blog post</li>
<li>pre_build_automation script weas reworked and additional functions are added</li>
<li>Contributing is now easier and the manifest build time is down to about 40m (was 3h30)</li>
<li>Contributing is now easier and the manifest build time is down to about 1h (was 3h30)</li>
</ul>
<p>Known issues:</p>
<ul>
<li>Ryujinx temporary removed until we figure out the situation</li>
<li>Please check the know issues in the Wiki under General Information.</li>
</ul>
</description>

View file

@ -1,11 +1,11 @@
[Desktop Entry]
Name=RetroDECK
GenericName=Emulation bundle for Steam Deck
GenericName=Universal Emulator Platform
Type=Application
Comment=All you need for emulation on Steam Deck
Comment=All-in-one emulation solution for Steam Deck and Linux desktops, making emulation easy and accessible
Icon=net.retrodeck.retrodeck
Exec=
Terminal=false
StartupNotify=false
Keywords=multi;engine;emulator;standalone;steam;deck
Keywords=multi;engine;emulator;standalone;steam;deck;retro;games;roms;console;classic;gamepad;arcade
Categories=Game;Emulator;

View file

@ -2,6 +2,8 @@ app-id: net.retrodeck.retrodeck
runtime: org.kde.Platform
runtime-version: "6.7"
sdk: org.kde.Sdk
base: org.electronjs.Electron2.BaseApp # Needed for Steam ROM Manager
base-version: "22.08"
command: retrodeck.sh
finish-args:
@ -27,7 +29,7 @@ finish-args:
- --env=SDL_VIDEO_WAYLAND_WMCLASS=net.retrodeck.retrodeck
# XEMU - Fixes issues with openSUSE systems, QEMU_AUDIO_DRV is defined as "pa" causing xemu to not launch
- --unset-env=QEMU_AUDIO_DRV
# BoilR
# Steam ROM Manager
- --filesystem=xdg-data/Steam:rw #Steam (flatpak)
- --filesystem=~/.steam:rw # Steam (Non-flatpak)
- --filesystem=~/.var/app/com.valvesoftware.Steam:rw # Steam (Flatpak)
@ -46,6 +48,7 @@ cleanup:
- /bin/zstd*
- /lib/pkg-config
- /share/doc
- /share/gtk-doc # Steam ROM Manager
- /share/man
- /src
- '*.a'
@ -143,6 +146,48 @@ modules:
- type: file
url: https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
sha256: af986793a515d500ab2d35f8d2aecd656e764504b789b66d7e1a0b727a124c44
# Steam ROM Manager - START
# https://github.com/flathub/com.steamgriddb.steam-rom-manager
- name: zypak
sources:
- type: git
url: https://github.com/refi64/zypak
tag: v2022.03
commit: 8424c6bcf909ca2031ebc6537d324bb64772266e
- name: steam-rom-manager
buildsystem: simple
env:
IN_FLATPAK: 1
build-commands:
- install -D run.sh ${FLATPAK_DEST}/bin/steam-rom-manager
- bsdtar -xf srm.deb data.tar.xz
- tar xf data.tar.xz
- mv "opt/Steam ROM Manager" "${FLATPAK_DEST}/srm"
- rm -rf "usr/share/icons/hicolor/1024x1024"
- cd usr; find share/icons/hicolor -type f -exec install -Dm644 "{}"
"${FLATPAK_DEST}/{}" \;
- rm -r srm.deb data.tar.xz usr opt
sources:
- type: script
dest-filename: run.sh
commands:
- /app/bin/zypak-wrapper.sh /app/srm/steam-rom-manager "${@}"
- type: file
dest-filename: srm.deb
url: https://github.com/SteamGridDB/steam-rom-manager/releases/download/v2.5.29/steam-rom-manager_2.5.29_amd64.deb
sha256: a85369ad8b758551b74755ddb712c6bd72311693971065c9bcec1dcdec53f54a
x-checker-data:
type: json
url: https://api.github.com/repos/SteamGridDB/steam-rom-manager/releases/latest
url-query: >-
.assets[] | select(.name=="steam-rom-manager_" + $version +
"_amd64.deb") | .browser_download_url
version-query: .tag_name | sub("^v"; "")
# Steam ROM Manager - END
- name: yq
buildsystem: simple
@ -193,8 +238,9 @@ modules:
- cp -r squashfs-root/usr/* "${FLATPAK_DEST}"
sources:
- type: archive
url: https://buildbot.libretro.com/nightly/linux/x86_64/RetroArch.7z
sha256: RASHAPLACEHOLDER
url: https://buildbot.libretro.com/stable/1.19.1/linux/x86_64//RetroArch.7z
#sha256: RASHAPLACEHOLDER
sha256: f98e954e99aef7b4b1a3334d710856b997c3f97c5451d33af9e5c88bf63213f8
# Not part of the offical RetroArch AppImage
@ -226,6 +272,16 @@ modules:
url: https://buildbot.libretro.com/nightly/linux/x86_64/RetroArch_cores.7z
sha256: RANIGHTLYCORESPLACEHOLDER
# Citra is removed from the LibretroCores but is still available in Libretro repo
- name: citra-libretro-core
buildsystem: simple
build-commands:
- cp citra_libretro.so ${FLATPAK_DEST}/share/libretro/cores/
sources:
- type: archive
url: https://buildbot.libretro.com/nightly/linux/x86_64/latest/citra_libretro.so.zip
sha256: RACITRAPLACEHOLDER
- name: retroarch-cores
buildsystem: simple
build-commands:
@ -233,8 +289,8 @@ modules:
- cp -rf ./RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores/* ${FLATPAK_DEST}/share/libretro/cores/
sources:
- type: archive
url: https://buildbot.libretro.com/stable/1.17.0/linux/x86_64/RetroArch_cores.7z
sha256: 1c1d61f86b196e9f89c1a93d0756fba95b60ef3ba57a7cd1d1e86dfd419c766b
url: https://buildbot.libretro.com/stable/1.19.1/linux/x86_64/RetroArch_cores.7z
sha256: fe75e7e796e29933ab31e4a58f072a1a47ea155b477988a48f33b0f4addc9d49
- name: retroarch-sameduck-core
buildsystem: simple
@ -309,8 +365,8 @@ modules:
- cp -r squashfs-root/usr/* "${FLATPAK_DEST}"
sources:
- type: file
url: https://github.com/PCSX2/pcsx2/releases/download/v2.1.55/pcsx2-v2.1.55-linux-appimage-x64-Qt.AppImage
sha256: d08ae2fdfc1bc3a4bd264b62ceda02f1e2de87c704ee1f464e5ce52073998e33
url: https://github.com/PCSX2/pcsx2/releases/download/v2.1.231/pcsx2-v2.1.231-linux-appimage-x64-Qt.AppImage
sha256: 227c8f5a38bd0ae9c565b9350868b4f4bd27ae00cde0a598738c2bdd8ca97e88
# Dolphin
# why from source: AppImage not provided, only Flatpak
@ -353,26 +409,39 @@ modules:
# RPCS3
# https://rpcs3.net/download
- name: rpcs3
# - name: rpcs3
# buildsystem: simple
# build-commands:
# - chmod +x *.AppImage
# - ./*.AppImage --appimage-extract
# - mkdir -p "${FLATPAK_DEST}/retrodeck/tmplib" "${FLATPAK_DEST}/retrodeck/tmplib/debug"
# - mkdir -p ${FLATPAK_DEST}/lib/ffmpeg # Needed for a ffmpeg bufgix
# - mv "squashfs-root/usr/lib/"* "${FLATPAK_DEST}/retrodeck/tmplib"
# - cp -r "squashfs-root/usr/bin/"* "${FLATPAK_DEST}/bin/"
# - cp -r "squashfs-root/usr/share/"* "${FLATPAK_DEST}/share/"
# #TODO: - cp -r squashfs-root/usr/optional* # maybe already included in flatpak runtime
# #TODO: - cp -r squashfs-root/usr/plugins* # maybe already included in qt
# #TODO: Do we need this wrapper? squashfs-root/apprun-hooks/linuxdeploy-plugin-qt-hook.sh
# sources:
# - type: file
# url: https://github.com/RPCS3/rpcs3-binaries-linux/releases/download/build-cd8954db140855101d94a33c0dd7f4d72bdf5a35/rpcs3-v0.0.33-17066-cd8954db_linux64.AppImage
# sha256: 2d258b557c17ebba4bea927be4032cfcbc230c26b8f090b796daa5935faa4a8b
- name: retrodeck-rpcs3
buildsystem: simple
build-commands:
- chmod +x *.AppImage
- ./*.AppImage --appimage-extract
- mkdir -p "${FLATPAK_DEST}/retrodeck/tmplib" "${FLATPAK_DEST}/retrodeck/tmplib/debug"
- mkdir -p ${FLATPAK_DEST}/lib/ffmpeg # Needed for a ffmpeg bufgix
- mv "squashfs-root/usr/lib/"* "${FLATPAK_DEST}/retrodeck/tmplib"
- cp -r "squashfs-root/usr/bin/"* "${FLATPAK_DEST}/bin/"
- cp -r "squashfs-root/usr/share/"* "${FLATPAK_DEST}/share/"
#TODO: - cp -r squashfs-root/usr/optional* # maybe already included in flatpak runtime
#TODO: - cp -r squashfs-root/usr/plugins* # maybe already included in qt
#TODO: Do we need this wrapper? squashfs-root/apprun-hooks/linuxdeploy-plugin-qt-hook.sh
- mkdir -p "${FLATPAK_DEST}/retrodeck/tmplib" "${FLATPAK_DEST}/retrodeck/tmplib/debug"
- cp -rL "files/lib/"* "${FLATPAK_DEST}/retrodeck/tmplib"
- rm -rf "files/lib"
- cp -r files/* "${FLATPAK_DEST}"
- chmod +x "${FLATPAK_DEST}/bin/"*
sources:
- type: file
url: https://github.com/RPCS3/rpcs3-binaries-linux/releases/download/build-ebcb4034119955991a17210af2a45a672fc9533d/rpcs3-v0.0.32-16685-ebcb4034_linux64.AppImage
sha256: 2553d56e01a3e3058fa9ceb4e1d61a07eaf2c5bba9e96b29e8923914d89f6e17
- type: archive
url: https://github.com/RetroDECK/net.rpcs3.RPCS3/releases/latest/download/RetroDECK-Artifact.tar.gz
sha256: RETRODECKRPCS3LATEST
# MELONDS
# https://github.com/melonDS-emu/melonDS/releases/latest
# https://github.com/RetroDECK/net.kuribo64.melonDS
- name: melonds
buildsystem: simple
@ -389,7 +458,8 @@ modules:
sha256: RETRODECKMELONDSLATEST
# Duckstation
# https://github.com/stenzek/duckstation/releases/tag/preview
# Do not update: Legacy
# https://github.com/RetroDECK/Duckstation
- name: duckstation
buildsystem: simple
@ -401,8 +471,8 @@ modules:
- cp -r squashfs-root/usr/* "${FLATPAK_DEST}"
sources:
- type: file
url: https://github.com/stenzek/duckstation/releases/download/v0.1-6937/DuckStation-x64.AppImage
sha256: 8a16f034cc8b11341ed9ad382226549301736794582bdec46a5e19b3ca981e07
url: https://github.com/RetroDECK/Duckstation/releases/download/preview/DuckStation-x64.AppImage
sha256: 84777a8d0fce9acfc2ffe6a8aea352bd68a8a37f5c793d328dbaa4ff5ada5e6d
# Cemu
# https://github.com/cemu-project/Cemu/releases
@ -420,8 +490,8 @@ modules:
#TODO: do we need this wrapper? squashfs-root/apprun-hooks/linuxdeploy-plugin-gtk.sh
sources:
- type: file
url: https://github.com/cemu-project/Cemu/releases/download/v2.0-88/Cemu-2.0-88-x86_64.AppImage
sha256: 1af1ad5322df5fa0e2a97588c7486604daf42deb8c4d07a2b885047d9701fed0
url: https://github.com/cemu-project/Cemu/releases/download/v2.2/Cemu-2.2-x86_64.AppImage
sha256: 05ad07e3b2fb60f9c19f84c7d65c4e978bc2cf58b4b53d39fca0376227900c27
- type: script
commands:
- |
@ -488,10 +558,12 @@ modules:
url: https://github.com/RetroDECK/org.zdoom.GZDoom/releases/latest/download/RetroDECK-gzdoom-Artifact.tar.gz
sha256: RETRODECKGZDOOMLATEST
# TEMPORARLY DISABLED
# Ryujinx Appimage
# https://ryujinx.org/download
# This version was reported as working with symlinks: https://discord.com/channels/951662718102962256/951715885968654418/1264882000658169866
<<<<<<< HEAD
#- name: Ryujinx-reported-working-version
# buildsystem: simple
# build-commands:
@ -503,6 +575,19 @@ modules:
# - type: file
# url: https://github.com/Ryujinx/release-channel-master/releases/download/1.1.1297/ryujinx-1.1.1297-linux_x64.tar.gz
# sha256: 28b38754e7d2e92083b313b23278c180ae54ac025edbbd0276ec03baec0cec0f
=======
# - name: Ryujinx-reported-working-version
# buildsystem: simple
# build-commands:
# - |
# tar -zxvf *.tar.gz
# mv -v publish ${FLATPAK_DEST}/ryujinx
# ln -sv ${FLATPAK_DEST}/ryujinx/Ryujinx ${FLATPAK_DEST}/bin/Ryujinx.sh
# sources:
# - type: file
# url: https://github.com/Ryujinx/release-channel-master/releases/download/1.1.1297/ryujinx-1.1.1297-linux_x64.tar.gz
# sha256: 28b38754e7d2e92083b313b23278c180ae54ac025edbbd0276ec03baec0cec0f
>>>>>>> 8cc13786cbd63482a8481e6739ba86e0416008e6
# XEMU
# https://xemu.app/docs/download/#download-for-linux
@ -517,8 +602,8 @@ modules:
- cp -r squashfs-root/usr/* "${FLATPAK_DEST}/"
sources:
- type: file
url: https://github.com/xemu-project/xemu/releases/download/v0.7.129/xemu-v0.7.129-x86_64.AppImage
sha256: f680774d96a66bf1195cd133497755d43be5eda5f178457a6df32bc691dd8c74
url: https://github.com/xemu-project/xemu/releases/download/v0.7.132/xemu-v0.7.132-x86_64.AppImage
sha256: c11821d6d0632da3c51a354e9101f68e5ab2ae0e2512c6aa6c8453aef56cedba
- name: xemu-dummy-hdd
buildsystem: simple
@ -580,7 +665,6 @@ modules:
- cp -r files/* "${FLATPAK_DEST}"
- chmod +x "${FLATPAK_DEST}/bin/"*
sources:
# Testing the new feat/update-3.1.0
- type: archive
url: https://github.com/RetroDECK/ES-DE/releases/latest/download/RetroDECK-ES-DE-Artifact.tar.gz
sha256: RETRODECKESDELATEST
@ -597,6 +681,7 @@ modules:
# RUFFLE - START
# https://github.com/ruffle-rs/ruffle/releases
- name: ruffle
buildsystem: simple
build-commands:
@ -606,51 +691,65 @@ modules:
sources:
- type: archive
strip-components: 0
url: https://github.com/ruffle-rs/ruffle/releases/download/nightly-2024-08-09/ruffle-nightly-2024_08_09-linux-x86_64.tar.gz
sha256: d2c4c77d8426da6df8dc8b2a57565c151146464a8eec605d5faa68a297d8cad6
url: https://github.com/ruffle-rs/ruffle/releases/download/nightly-2024-10-29/ruffle-nightly-2024_10_29-linux-x86_64.tar.gz
sha256: 5ab0fc46b07d022d4b0ff355e88175cd77b8bb1663612f31d160f8001dc472bb
- name: fetch-missing-libs
buildsystem: simple
build-commands:
- |
# Search for missingl ibraries in our libtmp folder
# Search for missing libraries in our libtmp folder
missing_libs=$(find "${FLATPAK_DEST}/bin" -type f -exec ldd {} + 2>/dev/null | grep "not found" | awk '{print $1}' | sort | uniq)
# for some reason these libraries are not recognized as missing so we mantain this list
manually_imported="libpostproc.so.56 libswscale.so.6 libshaderc_shared.so.1 libbz2.so.1.0 libaio.so.1 ld-linux.so.2"
# Manually specified libraries that are not automatically detected
manually_imported="libpostproc.so.56 libswscale.so.6 libshaderc_shared.so.1 libbz2.so.1.0 libaio.so.1 ld-linux.so.2 libvpx.so.9 libzmusic.so.1 libicuuc.so.73 libLLVM.so.18.1"
# Combine detected missing libraries and manually specified ones
missing_libs="$missing_libs $manually_imported"
# Origin paths
# Source paths
src_dir="${FLATPAK_DEST}/retrodeck/tmplib"
src_debug_dir="${FLATPAK_DEST}/retrodeck/tmplib/debug"
# Destionation paths
# Destination paths
dest_dir="${FLATPAK_DEST}/lib"
dest_debug_dir="${FLATPAK_DEST}/retrodeck/lib/debug"
mkdir -p "$dest_dir" "dest_debug_dir"
mkdir -p "$dest_dir" "$dest_debug_dir"
copy_missing_libs() {
local src=$1
local dest=$2
local src_debug=$2
local dest=$3
for lib in $missing_libs; do
if [[ -f "$src/$lib" ]]; then
cp "$src/$lib" "$dest"
echo "Copied \"$lib\" to \"$dest\""
cp "$src/$lib" "$dest" && echo "Copied \"$lib\" to \"$dest\"" || echo "Error copying \"$lib\""
elif [[ -f "$src_debug/$lib.debug" ]]; then
cp "$src_debug/$lib.debug" "$dest" && echo "Copied debug version of \"$lib\" to \"$dest\"" || echo "Error copying debug version of \"$lib\""
else
echo "Library \"$lib\" not found in \"$src\" or \"$src_debug\""
fi
done
}
copy_missing_libs "$src_dir" "$dest_dir"
# Copy libraries from source to destination
copy_missing_libs "$src_dir" "$src_debug_dir" "$dest_dir"
copy_missing_libs "$src_debug_dir" "$dest_debug_dir"
# Remove temporary source directory to free up space
rm -rf "$src_dir"
- name: retrodeck
buildsystem: simple
build-commands:
# This prevents appstream-compose to fail
- |
if [ -d ${FLATPAK_DEST}/usr ]; then
mv -n ${FLATPAK_DEST}/usr/** ${FLATPAK_DEST}/share
rm -rf ${FLATPAK_DEST}/usr
fi
# Initializing RO retrodeck config folder
- mkdir -p ${FLATPAK_DEST}/retrodeck

View file

@ -26,6 +26,7 @@ Arguments:
-h, --help \t Print this help
-v, --version \t Print RetroDECK version
--info-msg \t Print paths and config informations
--debug \t Enable debug logging for this launch of RetroDECK (This may miss errors very early in the launch process)
--configurator \t Starts the RetroDECK Configurator
--compress-one <file> \t Compresses target file to a compatible format
--compress-all <format> \t Compresses all supported games into a compatible format.\n\t\t\t\t\t\t Available formats are \"chd\", \"zip\", \"rvz\" and \"all\"
@ -60,6 +61,10 @@ https://retrodeck.net
cat $rd_conf
exit
;;
--debug*)
logging_level="debug"
shift
;;
--compress-one*)
cli_compress_single_game "$2"
exit
@ -210,4 +215,5 @@ fi
# Normal Startup
start_retrodeck
# After everything is closed we run the quit function
quit_retrodeck

View file

@ -156,6 +156,10 @@ configurator_welcome_dialog() {
configurator_about_retrodeck_dialog
;;
"Sync with Steam" )
configurator_add_steam
;;
"Developer Options" )
log i "Configurator: opening \"$choice\" menu"
configurator_generic_dialog "RetroDECK Configurator - Developer Options" "The following features and options are potentially VERY DANGEROUS for your RetroDECK install!\n\nThey should be considered the bleeding-edge of upcoming RetroDECK features, and never used when you have important saves/states/roms that are not backed up!\n\nYOU HAVE BEEN WARNED!"
@ -1152,12 +1156,13 @@ configurator_reset_dialog() {
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
--text="Which component do you want to reset to default settings?" \
--column="Component" --column="Action" \
"Steam ROM Manager" "Reset SRM that manages the sync and scraping toward Steam library" \
"ES-DE" "Reset the ES-DE frontend" \ )
# TODO: "GyroDSU" "Reset the gyroscope manager GyroDSU"
case $component_to_reset in
"ES-DE" ) # TODO: GyroDSU
"Steam ROM Manager" | "ES-DE" ) # TODO: GyroDSU
if [[ $(configurator_reset_confirmation_dialog "$component_to_reset" "Are you sure you want to reset $component_to_reset to default settings?\n\nThis process cannot be undone.") == "true" ]]; then
prepare_component "reset" "$component_to_reset" "configurator"
configurator_process_complete_dialog "resetting $component_to_reset"
@ -1250,6 +1255,48 @@ configurator_about_retrodeck_dialog() {
esac
}
configurator_add_steam() {
if [[ $(get_setting_value $rd_conf "steam_sync" retrodeck "options") == "true" ]]; then
zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - RetroDECK Steam Syncronization" \
--text="Steam syncronization is currently enabled. Do you want to disable it?\n\nThe already added shortcut will not be removed.\n"
if [ $? == 0 ] # User clicked "Yes"
then
disable_steam_sync
else # User clicked "Cancel"
configurator_welcome_dialog
fi
else
zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - RetroDECK Steam Syncronization" \
--text="Steam syncronization is currently disabled. Do you want to enable it?\n\nAll the games marked as favorites will be syncronized with Steam ROM Manager.\nRemember to restart Steam each time to see the changes.\n"
if [ $? == 0 ]
then
enable_steam_sync
else
configurator_welcome_dialog
fi
fi
}
enable_steam_sync() {
set_setting_value $rd_conf "steam_sync" "true" retrodeck "options"
zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="OK" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - RetroDECK Steam Syncronization" \
--text="Steam syncronization enabled."
configurator_welcome_dialog
}
disable_steam_sync() {
set_setting_value $rd_conf "steam_sync" "false" retrodeck "options"
configurator_welcome_dialog
}
configurator_version_history_dialog() {
local version_array=($(xml sel -t -v '//component/releases/release/@version' -n $rd_appdata))
local all_versions_list=()

View file

@ -118,6 +118,8 @@ quit2={
[internationalization]
locale/translation_remaps={}
locale/translations=PackedStringArray("res://translations/en_US.po")
locale/translations_pot_files=PackedStringArray("res://main.tscn", "res://scripts/TabContainer.gd")
[rendering]

View file

@ -1,6 +1,10 @@
class_name ClassFunctions
extends Control
# Test comment
@onready var main_scene = get_tree().root.get_node("Control")
var log_result: Dictionary
var log_parameters: Array
const globals_sh_file_path: String = "/app/libexec/global.sh"
@ -97,21 +101,70 @@ func multi_state(section: String, state: String) -> String:
else:
state = "mixed"
return state
func logger(log_type: String, log_text: String) -> void:
# Type of log messages:
# log d - debug message: maybe in the future we can decide to hide them in main builds or if an option is toggled
# log i - normal informational message
# log w - waring: something is not expected but it's not a big deal
# log e - error: something broke
var log_header_text = "gdc_"
log_header_text+=log_text
log_parameters = ["log", log_type, log_header_text]
log_result = await run_thread_command(wrapper_command,log_parameters, false)
#log_result = await run_thread_command("find",["$HOME", "-name", "*.xml","-print"], false)
#print (log_result["exit_code"])
#print (log_result["output"])
func logger_godot(log_type: String, log_text: String) -> void:
var log_dir_path: String = "/var/config/retrodeck/logs/"
var log_path: String = '/var/config/retrodeck/logs/gd_logs.log'
var log_dir: DirAccess = DirAccess.open(log_dir_path)
var log_file: FileAccess
var log_header: String = " GD "
var datetime: Dictionary = Time.get_datetime_dict_from_system()
var unixtime: float = Time.get_unix_time_from_system()
var msec: int = (unixtime - floor(unixtime)) * 1000 # finally, real ms! Thanks, monkeyx
var timestamp: String = "[%d-%02d-%02d %02d:%02d:%02d.%03d]" % [
datetime.year, datetime.month, datetime.day,
datetime.hour, datetime.minute, datetime.second, msec] # real ms!!
var log_line: String = timestamp + log_header
match log_type:
'w':
log_line += "[Warning] "
# print("Warning, mate")
'e':
log_line += "[Error] "
# print("Error, mate")
'i':
log_line += "[Info] "
# print("Info, mate")
'd':
log_line += "[Debug] "
# print("Debug, mate")
_:
log_line += " "
print("No idea, mate")
log_line += log_text
# print(log_line)
if not log_dir:
log_dir = DirAccess.open("res://") #open something valid to create an instance
print(log_dir.make_dir_recursive(log_dir_path))
if log_dir.make_dir_recursive(log_dir_path) != OK:
print("Something wrong with log directory")
return
if not FileAccess.open(log_path, FileAccess.READ):
log_file = FileAccess.open(log_path, FileAccess.WRITE_READ) # to create a file if not there
else:
log_file = FileAccess.open(log_path, FileAccess.READ_WRITE) # to not truncate
if log_file:
log_file.seek_end()
log_file.store_line(log_line)
log_file.close()
else:
print("Something wrong with log file")
func array_to_string(arr: Array) -> String:
var text: String
for line in arr:
@ -314,13 +367,17 @@ func update_global(button: Button, preset: String, state: bool) -> void:
if ask_to_exit_state != "mixed":
ask_to_exit_state = str(state)
result.append_array(data_handler.change_all_cfg_values(config_file_path, config_section, preset, str(state)))
change_global(result, button, ask_to_exit_state)
await change_global(result, button, ask_to_exit_state)
"border_button":
if border_state != "mixed":
border_state = str(state)
result.append_array(data_handler.change_all_cfg_values(config_file_path, config_section, preset, str(state)))
change_global(result, button, border_state)
await change_global(result, button, border_state)
if widescreen_state == "true" or widescreen_state == "mixed":
var button_tmp = main_scene.get_node("%widescreen_button")
#Remove last array item or tries to append again
result.clear()
result.append("build_preset_config")
config_section = data_handler.get_elements_in_section(config_file_path, "widescreen")
widescreen_state = "false"
result.append_array(data_handler.change_all_cfg_values(config_file_path, config_section, "widescreen", widescreen_state))
@ -329,12 +386,16 @@ func update_global(button: Button, preset: String, state: bool) -> void:
if widescreen_state != "mixed":
widescreen_state = str(state)
result.append_array(data_handler.change_all_cfg_values(config_file_path, config_section, preset, str(state)))
change_global(result, button, widescreen_state)
await change_global(result, button, widescreen_state)
if border_state == "true" or border_state == "mixed":
var button_tmp = main_scene.get_node("%border_button")
#Remove last array item or tries to append again
result.clear()
result.append("build_preset_config")
config_section = data_handler.get_elements_in_section(config_file_path, "borders")
border_state = "false"
result.append_array(data_handler.change_all_cfg_values(config_file_path, config_section, "borders", border_state))
change_global(result, button, border_state)
change_global(result, button_tmp, border_state)
"quick_rewind_button":
if quick_rewind_state != "mixed":
quick_rewind_state = str(state)

Binary file not shown.

View file

@ -0,0 +1,515 @@
# LANGUAGE translation for RetroDECKConfigurator for the following files:
# res://main.tscn
# res://scripts/TabContainer.gd
#
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: RetroDECKConfigurator\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: en_US\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.4.2\n"
#: main.tscn
msgid "GLOBALS"
msgstr ""
#: main.tscn
msgid "ASK TO EXIT"
msgstr "Ask to EXit"
#: main.tscn
msgid "BORDERS"
msgstr ""
#: main.tscn
msgid "BUTTON SWAP\n"
msgstr ""
#: main.tscn
msgid "MODS"
msgstr ""
#: main.tscn
msgid "QUICK RESUME"
msgstr ""
#: main.tscn
msgid "REWIND"
msgstr ""
#: main.tscn
msgid "TATE MODE"
msgstr ""
#: main.tscn
msgid "SHADERS"
msgstr ""
#: main.tscn
msgid "WIDESCREEN"
msgstr ""
#: main.tscn
msgid "SYSTEMS"
msgstr ""
#: main.tscn
msgid "RETROARCH"
msgstr ""
#: main.tscn
msgid "MAME"
msgstr ""
#: main.tscn
msgid "RUFFLE"
msgstr ""
#: main.tscn
msgid "MELONDS"
msgstr ""
#: main.tscn
msgid "PCSX2"
msgstr ""
#: main.tscn
msgid "DUCKSTATION"
msgstr ""
#: main.tscn
msgid "PPSSPP"
msgstr ""
#: main.tscn
msgid "VITA3K"
msgstr ""
#: main.tscn
msgid "RPCS3"
msgstr ""
#: main.tscn
msgid "RYUJINX"
msgstr ""
#: main.tscn
msgid "DOLPHIN"
msgstr ""
#: main.tscn
msgid "PRIMEHACK"
msgstr ""
#: main.tscn
msgid "CEMU"
msgstr ""
#: main.tscn
msgid "XEMU"
msgstr ""
#: main.tscn
msgid "ES-DE"
msgstr ""
#: main.tscn
msgid "HELP"
msgstr ""
#: main.tscn
msgid "LAUNCH"
msgstr ""
#: main.tscn
msgid "RESET"
msgstr ""
#: main.tscn
msgid "INSTALL FIRMWARE"
msgstr ""
#: main.tscn
msgid "TOOLS"
msgstr ""
#: main.tscn
msgid "CHECK CONNECTION"
msgstr ""
#: main.tscn
msgid "LOGS"
msgstr ""
#: main.tscn
msgid "RetroDECK Log"
msgstr ""
#: main.tscn
msgid "ES_DE Log"
msgstr ""
#: main.tscn
msgid "Retroarch"
msgstr ""
#: main.tscn
msgid "BIOS STANDARD"
msgstr ""
#: main.tscn
msgid "BIOS EXPERT"
msgstr ""
#: main.tscn
msgid "BACKUP USER DATA"
msgstr ""
#: main.tscn
msgid "TK_CONTROLS"
msgstr ""
#: main.tscn
msgid "TK_STEAMCONTEMP"
msgstr ""
#: main.tscn
msgid "TK_INSTALL"
msgstr ""
#: main.tscn
msgid "TK_FILETOOLS"
msgstr ""
#: main.tscn
msgid "TK_USBTOOL"
msgstr ""
#: main.tscn
msgid "TK_COMPRESSGAMES"
msgstr ""
#: main.tscn
msgid "TK_MOVEFILES"
msgstr ""
#: main.tscn
msgid "TK_GENTOOLS"
msgstr ""
#: main.tscn
msgid "TK_GRIDINSTALL"
msgstr ""
#: main.tscn
msgid "TK_FAVSTEAM"
msgstr ""
#: main.tscn
msgid "TK_SCAN"
msgstr ""
#: main.tscn
msgid "TK_SCUMMVMSCAN"
msgstr ""
#: main.tscn
msgid "TK_MULTIFILE"
msgstr ""
#: main.tscn
msgid "SETTINGS"
msgstr ""
#: main.tscn
msgid "SYSTEM SETTINGS"
msgstr ""
#: main.tscn
msgid "SOUND EFFECTS"
msgstr ""
#: main.tscn
msgid "AUTO UPDATES"
msgstr ""
#: main.tscn
msgid "CHOOSE FONT"
msgstr ""
#: main.tscn
msgid "Default"
msgstr ""
#: main.tscn
msgid "Modern"
msgstr ""
#: main.tscn
msgid "OpenDyslexic3"
msgstr ""
#: main.tscn
msgid "DEFAULT LANGUAGE"
msgstr ""
#: main.tscn
msgid "RESET RETRODECK"
msgstr ""
#: main.tscn
msgid "RESET ALL EMULATORS"
msgstr ""
#: main.tscn
msgid "ACHIEVEMENTS"
msgstr ""
#: main.tscn
msgid "RETRO ACHIEVEMENTS"
msgstr ""
#: main.tscn
msgid "RETRO ACHIEVMENTS USERNAME"
msgstr ""
#: main.tscn
msgid "username"
msgstr ""
#: main.tscn
msgid "RETRO ACHIEVMENTS PASSWORD"
msgstr ""
#: main.tscn
msgid "password"
msgstr ""
#: main.tscn
msgid "LOGIN"
msgstr ""
#: main.tscn
msgid "RETRO ACHIEVEMENTS HARDCORE"
msgstr ""
#: main.tscn
msgid "NETPLAY"
msgstr ""
#: main.tscn
msgid "TK_NETPLAY"
msgstr ""
#: main.tscn
msgid "TK_NETPLAYID"
msgstr ""
#: main.tscn
msgid "RetroDECK"
msgstr ""
#: main.tscn
msgid "TK_NETPLAYADDRESS"
msgstr ""
#: main.tscn
msgid "127.0.0.1"
msgstr ""
#: main.tscn
msgid "TK_NETPLAYCONNECT"
msgstr ""
#: main.tscn
msgid "FUTURE FEATURES"
msgstr ""
#: main.tscn
msgid "TK_MULTIUSR"
msgstr ""
#: main.tscn
msgid "TK_CUSTOMUSR"
msgstr ""
#: main.tscn
msgid "TK_OFF"
msgstr ""
#: main.tscn
msgid "TK_STEAMUSR"
msgstr ""
#: main.tscn
msgid "TK_SAVESSYNC"
msgstr ""
#: main.tscn
msgid "TK_FTPBTN"
msgstr ""
#: main.tscn
msgid "TK_MUSIC"
msgstr ""
#: main.tscn
msgid "TK_EASTEREGGS"
msgstr ""
#: main.tscn
msgid "ABOUT"
msgstr ""
#: main.tscn
msgid "ABOUT RETRODECK"
msgstr ""
#: main.tscn
msgid "WIP"
msgstr ""
#: main.tscn
msgid "DECORATIONS - Borders, Widescreen"
msgstr ""
#: main.tscn
msgid "TK_WSCREEN"
msgstr ""
#: main.tscn
msgid "TK_SHADERS"
msgstr ""
#: main.tscn
msgid "TK_MODS"
msgstr ""
#: main.tscn
msgid "TK_TATE"
msgstr ""
#: main.tscn
msgid "TK_BORDERS"
msgstr ""
#: main.tscn
msgid "TK_HOTKEYSOUND"
msgstr ""
#: main.tscn
msgid "TK_BTNLAYOUT"
msgstr ""
#: main.tscn
msgid "TK_QRESUME"
msgstr ""
#: main.tscn
msgid "TK_REWIND"
msgstr ""
#: main.tscn
msgid "TK_CONFIRMEXIT"
msgstr ""
#: main.tscn
msgid "TK_CHEATS"
msgstr ""
#: main.tscn
msgid "SAVE OR SELECT ALL?"
msgstr ""
#: main.tscn
msgid "SYSTEMS - Emulators, Console, Computers"
msgstr ""
#: main.tscn
msgid "RetroARCH"
msgstr ""
#: main.tscn
msgid "RetroArch"
msgstr ""
#: main.tscn
msgid "Dolphin"
msgstr ""
#: main.tscn
msgid "CITRA"
msgstr ""
#: main.tscn
msgid "PSPSSPP"
msgstr ""
#: main.tscn
msgid "Duckstation"
msgstr ""
#: main.tscn
msgid "DuckStation"
msgstr ""
#: main.tscn
msgid "Melon DS"
msgstr ""
#: main.tscn
msgid "MelonDS"
msgstr ""
#: main.tscn
msgid "CONFIRM"
msgstr ""
#: main.tscn
msgid "BACK"
msgstr ""
#: main.tscn
msgid "INFO"
msgstr ""
#: main.tscn
msgid "REKKU"
msgstr ""
#: main.tscn
msgid "QUIT"
msgstr ""
#: scripts/TabContainer.gd
msgid " GLOBALS "
msgstr " Globals "
#: scripts/TabContainer.gd
msgid " SYSTEMS "
msgstr ""
#: scripts/TabContainer.gd
msgid " TOOLS "
msgstr ""
#: scripts/TabContainer.gd
msgid " SETTINGS "
msgstr ""
#: scripts/TabContainer.gd
msgid " ABOUT "
msgstr ""
#: scripts/TabContainer.gd
msgid "Hey, there's no description"
msgstr ""

View file

@ -0,0 +1,509 @@
# LANGUAGE translation for RetroDECKConfigurator for the following files:
# res://main.tscn
# res://scripts/TabContainer.gd
#
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: RetroDECKConfigurator\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8-bit\n"
#: main.tscn
msgid "GLOBALS"
msgstr ""
#: main.tscn
msgid "ASK TO EXIT"
msgstr ""
#: main.tscn
msgid "BORDERS"
msgstr ""
#: main.tscn
msgid "BUTTON SWAP\n"
msgstr ""
#: main.tscn
msgid "MODS"
msgstr ""
#: main.tscn
msgid "QUICK RESUME"
msgstr ""
#: main.tscn
msgid "REWIND"
msgstr ""
#: main.tscn
msgid "TATE MODE"
msgstr ""
#: main.tscn
msgid "SHADERS"
msgstr ""
#: main.tscn
msgid "WIDESCREEN"
msgstr ""
#: main.tscn
msgid "SYSTEMS"
msgstr ""
#: main.tscn
msgid "RETROARCH"
msgstr ""
#: main.tscn
msgid "MAME"
msgstr ""
#: main.tscn
msgid "RUFFLE"
msgstr ""
#: main.tscn
msgid "MELONDS"
msgstr ""
#: main.tscn
msgid "PCSX2"
msgstr ""
#: main.tscn
msgid "DUCKSTATION"
msgstr ""
#: main.tscn
msgid "PPSSPP"
msgstr ""
#: main.tscn
msgid "VITA3K"
msgstr ""
#: main.tscn
msgid "RPCS3"
msgstr ""
#: main.tscn
msgid "RYUJINX"
msgstr ""
#: main.tscn
msgid "DOLPHIN"
msgstr ""
#: main.tscn
msgid "PRIMEHACK"
msgstr ""
#: main.tscn
msgid "CEMU"
msgstr ""
#: main.tscn
msgid "XEMU"
msgstr ""
#: main.tscn
msgid "ES-DE"
msgstr ""
#: main.tscn
msgid "HELP"
msgstr ""
#: main.tscn
msgid "LAUNCH"
msgstr ""
#: main.tscn
msgid "RESET"
msgstr ""
#: main.tscn
msgid "INSTALL FIRMWARE"
msgstr ""
#: main.tscn
msgid "TOOLS"
msgstr ""
#: main.tscn
msgid "CHECK CONNECTION"
msgstr ""
#: main.tscn
msgid "LOGS"
msgstr ""
#: main.tscn
msgid "RetroDECK Log"
msgstr ""
#: main.tscn
msgid "ES_DE Log"
msgstr ""
#: main.tscn
msgid "Retroarch"
msgstr ""
#: main.tscn
msgid "BIOS STANDARD"
msgstr ""
#: main.tscn
msgid "BIOS EXPERT"
msgstr ""
#: main.tscn
msgid "BACKUP USER DATA"
msgstr ""
#: main.tscn
msgid "TK_CONTROLS"
msgstr ""
#: main.tscn
msgid "TK_STEAMCONTEMP"
msgstr ""
#: main.tscn
msgid "TK_INSTALL"
msgstr ""
#: main.tscn
msgid "TK_FILETOOLS"
msgstr ""
#: main.tscn
msgid "TK_USBTOOL"
msgstr ""
#: main.tscn
msgid "TK_COMPRESSGAMES"
msgstr ""
#: main.tscn
msgid "TK_MOVEFILES"
msgstr ""
#: main.tscn
msgid "TK_GENTOOLS"
msgstr ""
#: main.tscn
msgid "TK_GRIDINSTALL"
msgstr ""
#: main.tscn
msgid "TK_FAVSTEAM"
msgstr ""
#: main.tscn
msgid "TK_SCAN"
msgstr ""
#: main.tscn
msgid "TK_SCUMMVMSCAN"
msgstr ""
#: main.tscn
msgid "TK_MULTIFILE"
msgstr ""
#: main.tscn
msgid "SETTINGS"
msgstr ""
#: main.tscn
msgid "SYSTEM SETTINGS"
msgstr ""
#: main.tscn
msgid "SOUND EFFECTS"
msgstr ""
#: main.tscn
msgid "AUTO UPDATES"
msgstr ""
#: main.tscn
msgid "CHOOSE FONT"
msgstr ""
#: main.tscn
msgid "Default"
msgstr ""
#: main.tscn
msgid "Modern"
msgstr ""
#: main.tscn
msgid "OpenDyslexic3"
msgstr ""
#: main.tscn
msgid "DEFAULT LANGUAGE"
msgstr ""
#: main.tscn
msgid "RESET RETRODECK"
msgstr ""
#: main.tscn
msgid "RESET ALL EMULATORS"
msgstr ""
#: main.tscn
msgid "ACHIEVEMENTS"
msgstr ""
#: main.tscn
msgid "RETRO ACHIEVEMENTS"
msgstr ""
#: main.tscn
msgid "RETRO ACHIEVMENTS USERNAME"
msgstr ""
#: main.tscn
msgid "username"
msgstr ""
#: main.tscn
msgid "RETRO ACHIEVMENTS PASSWORD"
msgstr ""
#: main.tscn
msgid "password"
msgstr ""
#: main.tscn
msgid "LOGIN"
msgstr ""
#: main.tscn
msgid "RETRO ACHIEVEMENTS HARDCORE"
msgstr ""
#: main.tscn
msgid "NETPLAY"
msgstr ""
#: main.tscn
msgid "TK_NETPLAY"
msgstr ""
#: main.tscn
msgid "TK_NETPLAYID"
msgstr ""
#: main.tscn
msgid "RetroDECK"
msgstr ""
#: main.tscn
msgid "TK_NETPLAYADDRESS"
msgstr ""
#: main.tscn
msgid "127.0.0.1"
msgstr ""
#: main.tscn
msgid "TK_NETPLAYCONNECT"
msgstr ""
#: main.tscn
msgid "FUTURE FEATURES"
msgstr ""
#: main.tscn
msgid "TK_MULTIUSR"
msgstr ""
#: main.tscn
msgid "TK_CUSTOMUSR"
msgstr ""
#: main.tscn
msgid "TK_OFF"
msgstr ""
#: main.tscn
msgid "TK_STEAMUSR"
msgstr ""
#: main.tscn
msgid "TK_SAVESSYNC"
msgstr ""
#: main.tscn
msgid "TK_FTPBTN"
msgstr ""
#: main.tscn
msgid "TK_MUSIC"
msgstr ""
#: main.tscn
msgid "TK_EASTEREGGS"
msgstr ""
#: main.tscn
msgid "ABOUT"
msgstr ""
#: main.tscn
msgid "ABOUT RETRODECK"
msgstr ""
#: main.tscn
msgid "WIP"
msgstr ""
#: main.tscn
msgid "DECORATIONS - Borders, Widescreen"
msgstr ""
#: main.tscn
msgid "TK_WSCREEN"
msgstr ""
#: main.tscn
msgid "TK_SHADERS"
msgstr ""
#: main.tscn
msgid "TK_MODS"
msgstr ""
#: main.tscn
msgid "TK_TATE"
msgstr ""
#: main.tscn
msgid "TK_BORDERS"
msgstr ""
#: main.tscn
msgid "TK_HOTKEYSOUND"
msgstr ""
#: main.tscn
msgid "TK_BTNLAYOUT"
msgstr ""
#: main.tscn
msgid "TK_QRESUME"
msgstr ""
#: main.tscn
msgid "TK_REWIND"
msgstr ""
#: main.tscn
msgid "TK_CONFIRMEXIT"
msgstr ""
#: main.tscn
msgid "TK_CHEATS"
msgstr ""
#: main.tscn
msgid "SAVE OR SELECT ALL?"
msgstr ""
#: main.tscn
msgid "SYSTEMS - Emulators, Console, Computers"
msgstr ""
#: main.tscn
msgid "RetroARCH"
msgstr ""
#: main.tscn
msgid "RetroArch"
msgstr ""
#: main.tscn
msgid "Dolphin"
msgstr ""
#: main.tscn
msgid "CITRA"
msgstr ""
#: main.tscn
msgid "PSPSSPP"
msgstr ""
#: main.tscn
msgid "Duckstation"
msgstr ""
#: main.tscn
msgid "DuckStation"
msgstr ""
#: main.tscn
msgid "Melon DS"
msgstr ""
#: main.tscn
msgid "MelonDS"
msgstr ""
#: main.tscn
msgid "CONFIRM"
msgstr ""
#: main.tscn
msgid "BACK"
msgstr ""
#: main.tscn
msgid "INFO"
msgstr ""
#: main.tscn
msgid "REKKU"
msgstr ""
#: main.tscn
msgid "QUIT"
msgstr ""
#: scripts/TabContainer.gd
msgid " GLOBALS "
msgstr ""
#: scripts/TabContainer.gd
msgid " SYSTEMS "
msgstr ""
#: scripts/TabContainer.gd
msgid " TOOLS "
msgstr ""
#: scripts/TabContainer.gd
msgid " SETTINGS "
msgstr ""
#: scripts/TabContainer.gd
msgid " ABOUT "
msgstr ""
#: scripts/TabContainer.gd
msgid "Hey, there's no description"
msgstr ""