commit b981d15594b94498ecd429c69ecda7d72d6bc643 Author: Boris Yumankulov Date: Wed Jul 23 13:04:52 2025 +0500 first commit diff --git a/.gitea/metadata.yml b/.gitea/metadata.yml new file mode 100644 index 0000000..ec898c0 --- /dev/null +++ b/.gitea/metadata.yml @@ -0,0 +1,44 @@ +name: Update Wine Metadata + +on: + schedule: + # Запускаем каждый день в 3:00 UTC + - cron: '0 3 * * *' + workflow_dispatch: + +jobs: + update-metadata: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: https://gitea.com/actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y jq curl + + - name: Make script executable + run: chmod +x generate_wine_metadata.sh + + - name: Generate wine metadata + run: bash generate_wine_metadata.sh + + - name: Check if metadata changed + id: check_changes + run: | + if git diff --quiet wine_metadata.json; then + echo "changed=false" >> $GITHUB_OUTPUT + else + echo "changed=true" >> $GITHUB_OUTPUT + fi + + - name: Commit and push changes + if: steps.check_changes.outputs.changed == 'true' + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + GITEA_ACTOR: ${{ gitea.actor }} + GITEA_SERVER: "git.linux-gaming.ru" + GITEA_REPOSITORY: ${{ gitea.repository }} + run: bash push-to-gitea.sh diff --git a/generate_wine_metadata.sh b/generate_wine_metadata.sh new file mode 100755 index 0000000..529576e --- /dev/null +++ b/generate_wine_metadata.sh @@ -0,0 +1,210 @@ +#!/usr/bin/env bash + +OUTPUT_FILE="wine_metadata.json" +TEMP_DIR="/tmp/wine_metadata_$$" +mkdir -p "$TEMP_DIR" + +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >&2 +} + +cleanup() { + rm -rf "$TEMP_DIR" +} +trap cleanup EXIT + +fetch_github_releases() { + local repo="$1" + local output_file="$2" + + log "Получение релизов из $repo..." + + local page=1 + local temp_file="$TEMP_DIR/$(basename "$output_file" .json)_page" + + > "$output_file" + + local all_releases="$TEMP_DIR/all_$(basename "$output_file")" + echo "[]" > "$all_releases" + + while true; do + local url="https://api.github.com/repos/$repo/releases?page=$page&per_page=100" + local response="$temp_file$page" + + if ! curl -s -H "Accept: application/vnd.github.v3+json" "$url" > "$response"; then + log "Ошибка при получении страницы $page для $repo" + break + fi + + if ! jq -e '. | length > 0' "$response" >/dev/null 2>&1; then + break + fi + + jq -s '.[0] + .[1]' "$all_releases" "$response" > "$all_releases.tmp" && mv "$all_releases.tmp" "$all_releases" + + ((page++)) + + if [[ $page -gt 50 ]]; then + log "Предупреждение: достигнут лимит страниц (50) для $repo" + break + fi + + sleep 0.5 + done + + cp "$all_releases" "$output_file" + + local count=$(jq '. | length' "$output_file" 2>/dev/null || echo "0") + log "Получено данных для $repo: $count релизов" +} + +create_wine_entries() { + local input_file="$1" + local file_extension="$2" + local exclude_patterns="$3" + + jq -r --arg ext "$file_extension" ' + .[] | + .assets[] | + select(.browser_download_url | test($ext)) | + { + name: (.name | gsub($ext; "")), + url: .browser_download_url, + size: .size, + created_at: .created_at + } + ' "$input_file" | \ + if [[ -n "$exclude_patterns" ]]; then + jq -c --arg patterns "$exclude_patterns" ' + select(.name | test($patterns) | not) + ' + else + jq -c '.' + fi +} + +log "Начало генерации метаданных..." + +# PROTON_GE +fetch_github_releases "GloriousEggroll/proton-ge-custom" "$TEMP_DIR/proton_ge_releases.json" +create_wine_entries "$TEMP_DIR/proton_ge_releases.json" "\\.tar\\.gz$" "Proton-6\\.5-GE-2|github-action" > "$TEMP_DIR/proton_ge.json" + +# WINE_KRON4EK +fetch_github_releases "Kron4ek/Wine-Builds" "$TEMP_DIR/wine_kron4ek_releases.json" +create_wine_entries "$TEMP_DIR/wine_kron4ek_releases.json" "\\.tar\\.xz$" "6\\.3|-x86|-wow64" > "$TEMP_DIR/wine_kron4ek.json" + +# WINE_GE_CUSTOM +fetch_github_releases "GloriousEggroll/wine-ge-custom" "$TEMP_DIR/wine_ge_custom_releases.json" +create_wine_entries "$TEMP_DIR/wine_ge_custom_releases.json" "\\.tar\\.xz$" "6\\.23" > "$TEMP_DIR/wine_ge_custom.json" + +# PROTON_LG +fetch_github_releases "Castro-Fidel/wine_builds" "$TEMP_DIR/proton_lg_releases.json" +create_wine_entries "$TEMP_DIR/proton_lg_releases.json" "\\.tar\\.xz$" "plugins" > "$TEMP_DIR/proton_lg.json" + +# PROTON_CACHYOS +fetch_github_releases "CachyOS/proton-cachyos" "$TEMP_DIR/proton_cachyos_releases.json" +create_wine_entries "$TEMP_DIR/proton_cachyos_releases.json" "\\.tar\\.xz$" "v3|znver4" > "$TEMP_DIR/proton_cachyos.json" + +# PROTON_SAREK +fetch_github_releases "pythonlover02/Proton-Sarek" "$TEMP_DIR/proton_sarek_releases.json" +create_wine_entries "$TEMP_DIR/proton_sarek_releases.json" "\\.tar\\.gz$" "" > "$TEMP_DIR/proton_sarek.json" + +# PROTON_EM +fetch_github_releases "Etaash-mathamsetty/Proton" "$TEMP_DIR/proton_em_releases.json" +create_wine_entries "$TEMP_DIR/proton_em_releases.json" "\\.tar\\.xz$" "" > "$TEMP_DIR/proton_em.json" + +# Создание итогового JSON файла +log "Создание итогового JSON файла..." + +{ + cat << 'JSON_START' +{ + "metadata": { + "generated_at": "TIMESTAMP_PLACEHOLDER", + "description": "PortProton Wine versions metadata" + }, + "proton_ge": [ +JSON_START + + if [[ -s "$TEMP_DIR/proton_ge.json" ]]; then + sed '$!s/$/,/' "$TEMP_DIR/proton_ge.json" | sed 's/^/ /' + fi + + cat << 'JSON_CONTINUE' + ], + "wine_kron4ek": [ +JSON_CONTINUE + + if [[ -s "$TEMP_DIR/wine_kron4ek.json" ]]; then + sed '$!s/$/,/' "$TEMP_DIR/wine_kron4ek.json" | sed 's/^/ /' + fi + + cat << 'JSON_CONTINUE2' + ], + "wine_ge_custom": [ +JSON_CONTINUE2 + + if [[ -s "$TEMP_DIR/wine_ge_custom.json" ]]; then + sed '$!s/$/,/' "$TEMP_DIR/wine_ge_custom.json" | sed 's/^/ /' + fi + + cat << 'JSON_CONTINUE3' + ], + "proton_lg": [ +JSON_CONTINUE3 + + if [[ -s "$TEMP_DIR/proton_lg.json" ]]; then + sed '$!s/$/,/' "$TEMP_DIR/proton_lg.json" | sed 's/^/ /' + fi + + cat << 'JSON_CONTINUE4' + ], + "proton_cachyos": [ +JSON_CONTINUE4 + + if [[ -s "$TEMP_DIR/proton_cachyos.json" ]]; then + sed '$!s/$/,/' "$TEMP_DIR/proton_cachyos.json" | sed 's/^/ /' + fi + + cat << 'JSON_CONTINUE5' + ], + "proton_sarek": [ +JSON_CONTINUE5 + + if [[ -s "$TEMP_DIR/proton_sarek.json" ]]; then + sed '$!s/$/,/' "$TEMP_DIR/proton_sarek.json" | sed 's/^/ /' + fi + + cat << 'JSON_CONTINUE6' + ], + "proton_em": [ +JSON_CONTINUE6 + + if [[ -s "$TEMP_DIR/proton_em.json" ]]; then + sed '$!s/$/,/' "$TEMP_DIR/proton_em.json" | sed 's/^/ /' + fi + + cat << 'JSON_END' + ] +} +JSON_END + +} > "$OUTPUT_FILE" + +sed -i "s/TIMESTAMP_PLACEHOLDER/$(date -u +%Y-%m-%dT%H:%M:%SZ)/" "$OUTPUT_FILE" + +if jq empty "$OUTPUT_FILE" 2>/dev/null; then + log "JSON файл создан успешно и валиден: $OUTPUT_FILE" +else + log "ОШИБКА: Созданный JSON файл невалиден!" + exit 1 +fi + +echo +log "Статистика созданного файла:" +for category in proton_ge wine_kron4ek wine_ge_custom proton_lg proton_cachyos proton_sarek proton_em; do + count=$(jq -r ".${category} | length" "$OUTPUT_FILE" 2>/dev/null || echo "0") + log " $category: $count версий" +done + +log "Генерация метаданных завершена: $OUTPUT_FILE" diff --git a/push-to-gitea.sh b/push-to-gitea.sh new file mode 100755 index 0000000..fe0b21b --- /dev/null +++ b/push-to-gitea.sh @@ -0,0 +1,28 @@ +#!/bin/sh +set -e + +timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ") + +AUTHOR_EMAIL='gitea-actions@users.noreply.gitea.com' +AUTHOR_NAME='Gitea Actions' +MESSAGE="chore: metadata list ${timestamp}" +BRANCH=main + +echo "Push to branch $BRANCH" +[ -z "${GITEA_TOKEN}" ] && { + echo 'Missing input "gitea_token: bcde86030adcb863b8ff96f994ecf248ced607e4".' + exit 1 +} + +cd "." + +remote_repo="https://${GITEA_ACTOR}:${GITEA_TOKEN}@${GITEA_SERVER}/${GITEA_REPOSITORY}.git" + +git config http.sslVerify false +git config --local user.email "${AUTHOR_EMAIL}" +git config --local user.name "${AUTHOR_NAME}" + +git add -A +git commit -m "${MESSAGE}" || exit 0 + +git push "${remote_repo}" HEAD:"${BRANCH}"