Files
providers/.github/workflows/main.yml
2025-04-18 18:44:38 +05:30

115 lines
5.0 KiB
YAML

name: Check Website URLs
on:
schedule:
# Runs daily at 03:00 UTC
- cron: '0 3 * * *'
workflow_dispatch: # Allows manual triggering
permissions:
contents: write # Needed to commit changes back to the repo
jobs:
check-urls:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
# Fetch full history to be able to compare changes if needed (optional)
fetch-depth: 0
- name: Install jq
run: sudo apt-get update && sudo apt-get install -y jq
- name: Check URLs and update modflix.json
id: check_urls
run: |
echo "Starting URL check process..."
cp modflix.json modflix.json.bak # Backup original file
updated_json=$(cat modflix.json)
changes_made=false
# Iterate over each key in the JSON object
for key in $(echo "$updated_json" | jq -r 'keys_unsorted[]'); do
original_url=$(echo "$updated_json" | jq -r --arg k "$key" '.[$k].url')
echo "Checking key: $key, URL: $original_url"
# Use curl to follow redirects (-L), get final URL (-w '%{url_effective}'),
# suppress output (-s), discard body (-o /dev/null), get status code (-w '%{http_code}')
# Set timeouts to prevent hanging
response=$(curl -Lso /dev/null -w "%{http_code} %{url_effective}" --max-time 15 --connect-timeout 7 "$original_url")
http_code=$(echo "$response" | awk '{print $1}')
final_url=$(echo "$response" | awk '{print $2}')
echo " -> Status: $http_code, Final URL: $final_url"
# Check if it was a redirect (3xx) and the final URL is different
if [[ "$http_code" =~ ^3[0-9]{2}$ ]] && [[ "$original_url" != "$final_url" ]]; then
echo " -> Redirect detected. Original: $original_url, New Effective: $final_url"
# Extract the scheme and host from the final URL
new_scheme_host=$(echo "$final_url" | sed -E 's|^(https?://[^/]+).*|\1|')
# Extract the path, query, and fragment from the original URL
# This preserves things like trailing slashes or specific paths
original_path_etc=$(echo "$original_url" | sed -E 's|https?://[^/]+(.*)|\1|')
if [[ -z "$original_path_etc" ]]; then
# Handle cases where the original URL might just be the domain (e.g., https://example.com)
# Check if the original URL ended with a slash
if [[ "$original_url" == */ ]]; then
original_path_etc="/"
else
# If final URL has a path and original didn't, maybe use final's path?
# For now, keeping it simple: if original had no path, new one has no path unless original ended with /
: # Keep original_path_etc empty or "/" based on above check
fi
fi
# Construct the new URL using the new scheme/host and original path/query/fragment
new_url="${new_scheme_host}${original_path_etc}"
echo " -> Constructing new URL: $new_url"
# Update the JSON content in the variable
updated_json=$(echo "$updated_json" | jq --arg k "$key" --arg nu "$new_url" '.[$k].url = $nu')
changes_made=true
echo " -> Updated JSON for key $key"
elif [[ "$http_code" == "200" ]]; then
echo " -> URL OK (200)."
else
echo " -> URL check failed or returned non-redirect/non-200 status ($http_code). No changes made for this URL."
fi
done
if $changes_made; then
echo "Changes were made. Writing updated modflix.json"
echo "$updated_json" | jq '.' > modflix.json # Write updated content back, pretty-printed
# Set output for the next step
echo "changes_detected=true" >> $GITHUB_OUTPUT
else
echo "No changes detected in URLs."
# Restore original file to avoid timestamp changes if only formatting changed
mv modflix.json.bak modflix.json
echo "changes_detected=false" >> $GITHUB_OUTPUT
fi
- name: Commit and push changes
if: steps.check_urls.outputs.changes_detected == 'true'
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git add modflix.json
# Check if there are staged changes before committing
if ! git diff --staged --quiet; then
git commit -m "chore: Update redirected URLs in modflix.json
Automatically updated URLs based on HTTP redirects."
git push
echo "Changes committed and pushed."
else
echo "No effective changes to commit after writing file (might be formatting only)."
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Use the default token