Update avatar URLs in manifest and workflow files; enhance direct reset button functionality on settings page

This commit is contained in:
Admin9705
2025-06-15 12:37:23 -04:00
parent 32aed9e759
commit 07a3aff21e
5 changed files with 86 additions and 57 deletions

View File

@@ -71,9 +71,9 @@ jobs:
"category": "featured"
},
{
"login": "simplytoast1",
"name": "simplytoast1",
"avatarUrl": "https://avatars.githubusercontent.com/u/simplytoast1?v=4",
"login": "simplytoast1",
"name": "simplytoast1",
"avatarUrl": "https://avatars.githubusercontent.com/u/4954230?v=4",
"url": "https://github.com/simplytoast1",
"tier": "Tier II - Sponsor",
"monthlyAmount": 20,
@@ -81,9 +81,9 @@ jobs:
"category": "active"
},
{
"login": "TheOnlyLite",
"name": "TheOnlyLite",
"avatarUrl": "https://avatars.githubusercontent.com/u/TheOnlyLite?v=4",
"login": "TheOnlyLite",
"name": "TheOnlyLite",
"avatarUrl": "https://avatars.githubusercontent.com/u/1551675?v=4",
"url": "https://github.com/TheOnlyLite",
"tier": "Tier II - Sponsor",
"monthlyAmount": 20,
@@ -91,9 +91,9 @@ jobs:
"category": "active"
},
{
"login": "tcconnally",
"name": "tcconnally",
"avatarUrl": "https://avatars.githubusercontent.com/u/tcconnally?v=4",
"login": "tcconnally",
"name": "tcconnally",
"avatarUrl": "https://avatars.githubusercontent.com/u/51974392?v=4",
"url": "https://github.com/tcconnally",
"tier": "Tier I - Sponsor",
"monthlyAmount": 10,

View File

@@ -6,14 +6,24 @@ window.justCompletedStatefulReset = false;
// Keep track of the current stateful hours value to detect real changes
window.lastStatefulHoursValue = null;
// Run this code as soon as this script is loaded
// Run this code as soon as this script is loaded, but only on settings page
(function() {
// Exit early if not on settings page
function isOnSettingsPage() {
return window.location.hash === '#settings' || window.location.pathname.includes('/settings');
}
// Don't run any of this code unless we're on the settings page
if (!isOnSettingsPage()) {
return;
}
function insertDirectResetButton() {
// Look for the stateful header row
const headerRow = document.querySelector('.stateful-header-row');
if (!headerRow) {
// If we can't find it, try again soon
// If we can't find it, try again soon (we're already on settings page)
console.log('Stateful header not found, will try again in 1 second');
setTimeout(insertDirectResetButton, 1000);
return;
@@ -114,7 +124,7 @@ window.lastStatefulHoursValue = null;
// And again when everything is fully loaded
window.addEventListener('load', insertDirectResetButton);
// Also check periodically to make sure the button exists
// Also check periodically to make sure the button exists (we're already on settings page)
setInterval(function() {
const headerRow = document.querySelector('.stateful-header-row');
if (headerRow && !document.getElementById('emergency_reset_btn')) {

View File

@@ -1962,7 +1962,6 @@ document.addEventListener('DOMContentLoaded', function() {
document.querySelector('.dashboard-grid').style.opacity = '1';
}, 25);
const sponsorContainer = document.getElementById('rotating-sponsor-content');
console.log('sponsorContainer:', sponsorContainer);
let sponsors = [];
let weightedSponsorPool = [];
let currentSponsorIndex = 0;
@@ -1988,8 +1987,6 @@ document.addEventListener('DOMContentLoaded', function() {
// Apply transition styles for smooth sponsor changes
const avatarContainer = document.getElementById('sponsor-avatar-container');
const descContainer = document.getElementById('rotating-sponsor-content');
console.log('avatarContainer:', avatarContainer);
console.log('descContainer:', descContainer);
// Add transition effects but keep them faster
avatarContainer.style.transition = 'opacity 0.15s ease';
@@ -2079,19 +2076,36 @@ document.addEventListener('DOMContentLoaded', function() {
// Helper function to update sponsor content
function updateSponsorContent(sponsor, avatarContainer, descContainer) {
// Update avatar with enhanced styling
avatarContainer.innerHTML = `
<a href="${sponsor.url || '#'}" target="_blank" title="Visit ${sponsor.name}'s GitHub profile">
<img src="${sponsor.avatarUrl}" alt="${sponsor.name}'s avatar" style="width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block;">
</a>
`;
// Create elements without href to prevent prefetching, add click handlers instead
const avatarDiv = document.createElement('div');
avatarDiv.style.cssText = 'width: 100%; height: 100%; cursor: pointer; border-radius: 50%;';
avatarDiv.title = `Visit ${sponsor.name}'s GitHub profile`;
avatarDiv.onclick = function(e) {
e.preventDefault();
window.open(sponsor.url || '#', '_blank', 'noopener,noreferrer');
};
// Update name in the description area
descContainer.innerHTML = `
<a href="${sponsor.url || '#'}" target="_blank" title="Visit ${sponsor.name}'s GitHub profile">
${sponsor.name}
</a>
`;
const avatarImg = document.createElement('img');
avatarImg.src = sponsor.avatarUrl;
avatarImg.alt = `${sponsor.name}'s avatar`;
avatarImg.style.cssText = 'width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block;';
avatarDiv.appendChild(avatarImg);
avatarContainer.innerHTML = '';
avatarContainer.appendChild(avatarDiv);
// Create name element without href to prevent prefetching
const nameDiv = document.createElement('div');
nameDiv.textContent = sponsor.name;
nameDiv.style.cssText = 'cursor: pointer; color: inherit;';
nameDiv.title = `Visit ${sponsor.name}'s GitHub profile`;
nameDiv.onclick = function(e) {
e.preventDefault();
window.open(sponsor.url || '#', '_blank', 'noopener,noreferrer');
};
descContainer.innerHTML = '';
descContainer.appendChild(nameDiv);
// Add sponsor-icon class
avatarContainer.classList.add('sponsor-icon');
@@ -2121,19 +2135,29 @@ document.addEventListener('DOMContentLoaded', function() {
// Style the container directly and apply the styling immediately
document.getElementById('sponsor-widget-container').style.visibility = 'visible';
// Create a solid orange-red circle with gold border exactly like image #2
avatarContainer.innerHTML = `
<a href="${placeholderSponsor.url}" target="_blank" title="Support ${placeholderSponsor.name}" class="sponsor-icon">
<div style="width: 100%; height: 100%; border-radius: 50%; background-color: #FF6347; border: 3px solid #ffb700; box-sizing: border-box;">
</div>
</a>
`;
// Create a solid orange-red circle with gold border exactly like image #2 (no href to prevent prefetching)
const placeholderDiv = document.createElement('div');
placeholderDiv.style.cssText = 'width: 100%; height: 100%; border-radius: 50%; background-color: #FF6347; border: 3px solid #ffb700; box-sizing: border-box; cursor: pointer;';
placeholderDiv.title = `Support ${placeholderSponsor.name}`;
placeholderDiv.onclick = function(e) {
e.preventDefault();
window.open(placeholderSponsor.url, '_blank', 'noopener,noreferrer');
};
descContainer.innerHTML = `
<a href="${placeholderSponsor.url}" target="_blank" title="Support us">
${placeholderSponsor.name}
</a>
`;
avatarContainer.innerHTML = '';
avatarContainer.appendChild(placeholderDiv);
const placeholderNameDiv = document.createElement('div');
placeholderNameDiv.textContent = placeholderSponsor.name;
placeholderNameDiv.style.cssText = 'cursor: pointer; color: inherit;';
placeholderNameDiv.title = 'Support us';
placeholderNameDiv.onclick = function(e) {
e.preventDefault();
window.open(placeholderSponsor.url, '_blank', 'noopener,noreferrer');
};
descContainer.innerHTML = '';
descContainer.appendChild(placeholderNameDiv);
// Add sponsor-icon class and show immediately
avatarContainer.classList.add('sponsor-icon');
@@ -2144,16 +2168,12 @@ document.addEventListener('DOMContentLoaded', function() {
}
// Show placeholder immediately
console.log('About to display placeholder sponsor');
displayPlaceholderSponsor();
console.log('Placeholder sponsor displayed');
// Fetch sponsors from the API
async function fetchSponsors() {
console.log('fetchSponsors function called');
try {
// Fetch in the background without waiting for visual updates
console.log('About to call HuntarrUtils.fetchWithTimeout');
const response = await HuntarrUtils.fetchWithTimeout('/api/github_sponsors');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
@@ -2187,7 +2207,6 @@ document.addEventListener('DOMContentLoaded', function() {
}
// Initialize sponsors on page load
console.log('About to fetch sponsors');
fetchSponsors();
});
</script>

View File

@@ -15,7 +15,7 @@
{
"login": "simplytoast1",
"name": "simplytoast1",
"avatarUrl": "https://avatars.githubusercontent.com/u/simplytoast1?v=4",
"avatarUrl": "https://avatars.githubusercontent.com/u/4954230?v=4",
"url": "https://github.com/simplytoast1",
"tier": "Tier II - Sponsor",
"monthlyAmount": 20,
@@ -25,7 +25,7 @@
{
"login": "TheOnlyLite",
"name": "TheOnlyLite",
"avatarUrl": "https://avatars.githubusercontent.com/u/TheOnlyLite?v=4",
"avatarUrl": "https://avatars.githubusercontent.com/u/1551675?v=4",
"url": "https://github.com/TheOnlyLite",
"tier": "Tier II - Sponsor",
"monthlyAmount": 20,
@@ -35,7 +35,7 @@
{
"login": "tcconnally",
"name": "tcconnally",
"avatarUrl": "https://avatars.githubusercontent.com/u/tcconnally?v=4",
"avatarUrl": "https://avatars.githubusercontent.com/u/51974392?v=4",
"url": "https://github.com/tcconnally",
"tier": "Tier I - Sponsor",
"monthlyAmount": 10,
@@ -45,7 +45,7 @@
{
"login": "feinhorn",
"name": "feinhorn",
"avatarUrl": "https://avatars.githubusercontent.com/u/feinhorn?v=4",
"avatarUrl": "https://avatars.githubusercontent.com/u/53579799?v=4",
"url": "https://github.com/feinhorn",
"tier": "Supporter",
"monthlyAmount": 5,
@@ -55,7 +55,7 @@
{
"login": "jimmyza-cpu",
"name": "jimmyza-cpu",
"avatarUrl": "https://avatars.githubusercontent.com/u/jimmyza-cpu?v=4",
"avatarUrl": "https://avatars.githubusercontent.com/u/211182673?v=4",
"url": "https://github.com/jimmyza-cpu",
"tier": "Supporter",
"monthlyAmount": 5,
@@ -65,7 +65,7 @@
{
"login": "pozd5995",
"name": "pozd5995",
"avatarUrl": "https://avatars.githubusercontent.com/u/pozd5995?v=4",
"avatarUrl": "https://avatars.githubusercontent.com/u/210923654?v=4",
"url": "https://github.com/pozd5995",
"tier": "Supporter",
"monthlyAmount": 5,
@@ -75,7 +75,7 @@
{
"login": "NumNuts101",
"name": "NumNuts101",
"avatarUrl": "https://avatars.githubusercontent.com/u/NumNuts101?v=4",
"avatarUrl": "https://avatars.githubusercontent.com/u/84128224?v=4",
"url": "https://github.com/NumNuts101",
"tier": "Supporter",
"monthlyAmount": 5,
@@ -85,7 +85,7 @@
{
"login": "xtamtamx",
"name": "xtamtamx",
"avatarUrl": "https://avatars.githubusercontent.com/u/xtamtamx?v=4",
"avatarUrl": "https://avatars.githubusercontent.com/u/30088598?v=4",
"url": "https://github.com/xtamtamx",
"tier": "Supporter",
"monthlyAmount": 5,

View File

@@ -1186,24 +1186,24 @@ def get_github_sponsors():
'monthlyAmount': sponsor.get('monthly_amount', 0)
})
current_app.logger.info(f"Returning {len(formatted_sponsors)} sponsors from database")
current_app.logger.debug(f"Returning {len(formatted_sponsors)} sponsors from database")
return jsonify(formatted_sponsors)
# If no sponsors in database, try to populate from manifest
current_app.logger.info("No sponsors in database, attempting to populate from manifest")
current_app.logger.debug("No sponsors in database, attempting to populate from manifest")
# Try to use local manifest.json first, then fallback to GitHub
local_manifest_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'manifest.json')
manifest_data = None
if os.path.exists(local_manifest_path):
current_app.logger.info(f"Using local manifest.json from {local_manifest_path}")
current_app.logger.debug(f"Using local manifest.json from {local_manifest_path}")
with open(local_manifest_path, 'r') as f:
manifest_data = json.load(f)
else:
# Fallback to GitHub raw content
manifest_url = "https://raw.githubusercontent.com/plexguide/Huntarr.io/main/manifest.json"
current_app.logger.info(f"Local manifest not found, fetching from {manifest_url}")
current_app.logger.debug(f"Local manifest not found, fetching from {manifest_url}")
response = requests.get(manifest_url, timeout=10)
response.raise_for_status()
manifest_data = response.json()
@@ -1213,7 +1213,7 @@ def get_github_sponsors():
if sponsors_list:
# Save sponsors to database
db.save_sponsors(sponsors_list)
current_app.logger.info(f"Populated database with {len(sponsors_list)} sponsors from manifest")
current_app.logger.debug(f"Populated database with {len(sponsors_list)} sponsors from manifest")
# Return the sponsors (recursively call this function to get formatted data)
return get_github_sponsors()