name: Picture Health on: push: branches: [ master ] paths: - '.github/workflows/check_links.yml' - '**.xml' pull_request: branches: [ master ] paths: - '.github/workflows/check_links.yml' - '**.xml' pull_request_review: types: [ submitted ] workflow_dispatch: schedule: # Runs at the start of each month (UTC) - cron: '0 0 1 * *' jobs: check_urls: # Do not run the scheduled workflow on forks if: ( github.event_name != 'schedule' || github.repository_owner == 'Cockatrice' ) name: Check image links runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v5 # Restore cache - name: Restore lychee cache id: restore-cache uses: actions/cache/restore@v4 with: path: .lycheecache key: cache-lychee-${{ github.sha }} restore-keys: cache-lychee- # Extract picture URLs from tokens.xml - name: Extract URLs id: tokens_pic_urls uses: lycheeverse/lychee-action@v2 with: args: --dump -- tokens.xml output: url_list.md jobSummary: false # Check dumped URLs - name: Check token art URLs if: steps.tokens_pic_urls.outcome == 'success' uses: lycheeverse/lychee-action@v2 with: args: --no-progress --require-https --cache --max-cache-age 8h -- url_list.md jobSummary: true # List helpful stats on missing pictures - name: List missing image link counts shell: bash run: | { echo "❌ **Missing Image Links (master Branch)**" echo "| Count | Description |" echo "|------:|:------------|" echo "| [![](https://img.shields.io/badge/dynamic/xml?label=&colorB=white&query=count%28%2F%2Fcard%5Bnot%28set%29%5D%29&url=https%3A%2F%2Fraw.githubusercontent.com%2FCockatrice%2FMagic-Token%2Fmaster%2Ftokens.xml)](https://raw.githubusercontent.com/Cockatrice/Magic-Token/master/tokens.xml) | Tokens with missing \`set\` element |" echo "| [![](https://img.shields.io/badge/dynamic/xml?label=&colorB=white&query=count%28%2F%2Fset%29-count%28%2F%2Fset%5B%40picURL%5D%29&url=https%3A%2F%2Fraw.githubusercontent.com%2FCockatrice%2FMagic-Token%2Fmaster%2Ftokens.xml)](https://raw.githubusercontent.com/Cockatrice/Magic-Token/master/tokens.xml) | Set elements with missing picURL attribute (\`\`) |" echo "| [![](https://img.shields.io/badge/dynamic/xml?label=&colorB=white&query=count%28%2F%2Fset%5B%40picURL%3D%22%22%5D%29&url=https%3A%2F%2Fraw.githubusercontent.com%2FCockatrice%2FMagic-Token%2Fmaster%2Ftokens.xml)](https://raw.githubusercontent.com/Cockatrice/Magic-Token/master/tokens.xml) | Set elements with empty picURL value (\`\`) |" } >> $GITHUB_STEP_SUMMARY # Analyse extracted links (1/2) - name: List duplicated image links if: steps.tokens_pic_urls.outcome == 'success' shell: bash run: | { echo "🪞 **Duplicated Image Links**" echo "| Count | Image URL |" echo "|------:|:----------|" # Remove empty lines | trim trailing integers (Scryfall) | sort | count and list only duplicates with numbers | sort descending | print md table grep . url_list.md | sed 's/\.jpg?.*/.jpg/' | sort | uniq -cd | sort -nr | awk '{printf "| %5s | %s |\n", $1, $2}' } >> $GITHUB_STEP_SUMMARY # Analyse extracted links (2/2) - name: List image hosting sources if: steps.tokens_pic_urls.outcome == 'success' shell: bash run: | { echo "📶 **Image Hosting Statistics**" echo "| Count | Domain |" echo "|------:|:-------|" # Extract 3rd field (domain name) | remove empty lines | sort | count and list with numbers | sort descending | print md table awk -F/ '{print $3}' url_list.md | grep . | sort | uniq -c | sort -nr | awk '{printf "| %5s | %s |\n", $1, $2}' } >> $GITHUB_STEP_SUMMARY # Always save cache - name: Save lychee cache uses: actions/cache/save@v4 if: always() with: path: .lycheecache key: ${{ steps.restore-cache.outputs.cache-primary-key }}