#!/bin/bash # # Copyright (C) 2024-20xx Poke! (https://codeberg.org/ashley/poke) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Function to generate a random Chrome version generate_random_chrome_version() { major=$((RANDOM % 100 + 1)) # Major version 1-99 minor=$((RANDOM % 100)) # Minor version 0-99 build=$((RANDOM % 10000)) # Build version 0-9999 patch=$((RANDOM % 100)) # Patch version 0-99 echo "$major.$minor.$build.$patch" } restart_services() { echo "Restarting services..." # Navigate to the script directory scriptDir=$(dirname "$(readlink -f "$0")") cd "$scriptDir/../services/invidious" || { echo "Error: Failed to navigate to $scriptDir/../services/invidious"; exit 1; } docker compose down echo "Services stopped. Restarting..." docker compose up -d echo "Services restarted successfully." /home/qt/globe/scripts/inv-update-token.sh } fetch_playlist() { local playlist_id="$1" response=$(curl -s -w "%{http_code}" -o /tmp/playlist_data.json "https://invid-api.poketube.fun/api/v1/playlists/${playlist_id}") if [ "$response" -eq 502 ] || [ "$response" -eq 500 ] || [ "$response" -eq 403 ]; then echo "Error: Failed to fetch playlist data. HTTP Status: $response" restart_services return 1 elif [ "$response" -ne 200 ]; then echo "Error: Failed to fetch playlist data. HTTP Status: $response" return 1 fi } extract_video_ids() { local json_data="$1" video_ids=$(jq -r '.videos[].videoId' "$json_data") if [ -z "$video_ids" ]; then echo "Error: Failed to extract video IDs from the playlist data." return 1 fi echo "$video_ids" } # Playlist IDs to fetch playlist_ids=("PLMws9SCqJ1JCeVMVPsdamuUM0HK0MbA6g") # Base URL for the API base_url="http://localhost:54301/latest_version?id=" # Pick a random playlist (without using invalid options in shuf) random_playlist_id="PLMC9KNkIncKvYin_USF1qoJQnIyMAfRxl" echo "Randomly selected playlist: $random_playlist_id" # Fetch playlist JSON data fetch_playlist "$random_playlist_id" if [ $? -ne 0 ]; then echo "Error: Playlist fetch failed. Restarting services..." restart_services # Restart services before exiting exit 1 fi # Extract video IDs from the playlist video_ids=($(extract_video_ids "/tmp/playlist_data.json")) if [ $? -ne 0 ]; then echo "Error: Failed to extract video IDs. Exiting..." exit 1 fi # Shuffle video IDs and pick 4 random videos shuffled_video_ids=($(shuf -e "${video_ids[@]}" | head -n 4)) error_count=0 all_errors=(500 502 403) for video_id in "${shuffled_video_ids[@]}"; do # Add a cache buster query (unique random number) unique_param=$RANDOM url="${base_url}${video_id}&itag=18&local=true&_=${unique_param}" # Generate a random Chrome version chrome_version=$(generate_random_chrome_version) user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/$chrome_version Safari/537.36" response_headers=$(curl -s -D - -H "Cache-Control: no-cache, no-store, must-revalidate" \ -H "Pragma: no-cache" -H "Expires: 0" -A "$user_agent" "$url" -o /dev/null) # Extract ETag and last modified info (if available) etag=$(echo "$response_headers" | grep -i ETag | awk '{print $2}' | tr -d '"') last_modified=$(echo "$response_headers" | grep -i Last-Modified | cut -d' ' -f2-) # Use conditional request if ETag is present if [ -n "$etag" ]; then status_code=$(curl -s -o /dev/null -w "%{http_code}" -H "If-None-Match: $etag" \ -H "Cache-Control: no-cache, no-store, must-revalidate" -A "$user_agent" "$url") else status_code=$(curl -s -o /dev/null -w "%{http_code}" -A "$user_agent" "$url") fi # Echo the status code for visibility echo "Checking URL: $url" echo "User Agent: $user_agent" echo "HTTP Status Code for ID $video_id: $status_code" if [[ " ${all_errors[@]} " =~ " ${status_code} " ]]; then echo "Error: Received $status_code for ID $video_id." error_count=$((error_count + 1)) # Run the token refresh script echo "Running inv-update-token.sh for ID $video_id..." /home/qt/globe/scripts/inv-update-token.sh /home/qt/globe/scripts/inv-update-token.sh echo "inv-update-token.sh script executed successfully." # Fetch the video again after token refresh status_code=$(curl -s -o /dev/null -w "%{http_code}" -A "$user_agent" "$url") echo "Post-token-refresh Status Code for ID $video_id: $status_code" # Check if it still results in 500/502/403 after refresh if [[ " ${all_errors[@]} " =~ " ${status_code} " ]]; then echo "Error: Received $status_code for ID $video_id after token refresh." else echo "Token refresh succeeded for ID $video_id." fi elif [ "$status_code" -eq 304 ]; then echo "Content is still fresh for ID $video_id. No action required." else echo "we are so barack (Status code for ID $video_id is neither 502, 500, nor 403.)" fi echo "----------------****************----------------" # Separator for readability done # If all videos still resulted in 500/502/403 errors even after running inv-update-token.sh, try restaring if [ "$error_count" -eq "${#shuffled_video_ids[@]}" ]; then echo "All videos failed to load after running inv-update-token.sh. Restarting services..." restart_services fi