Fix SpigotMC plugin downloads by using direct URLs

This commit is contained in:
Rbanh 2025-03-30 19:52:47 -04:00
parent 1ebb16c15f
commit a5e7b766ac
2 changed files with 51 additions and 11 deletions

View File

@ -352,20 +352,39 @@ impl Repository for SpigotMCCrawler {
}
async fn download_plugin(&self, plugin_id: &str, version: &str, destination: &Path) -> Result<String, String> {
// Going with Option 1: Download latest version associated with the resource ID
// First, get the plugin details
let details = self.get_plugin_details(plugin_id).await?;
let download_url = &details.download_url;
if download_url.is_empty() {
return Err(format!("No download URL found for SpigotMC resource {}", plugin_id));
}
// Use the SpigotMC direct download URL instead of SpiGet
// SpigotMC has a direct download URL pattern for resources
let direct_download_url = format!("https://www.spigotmc.org/resources/{}/download", plugin_id);
// We ignore the 'version' parameter here because SpiGet usually only provides the latest download
println!("Warning: SpigotMC download via SpiGet usually fetches the LATEST version, requested version '{}' might be ignored.", version);
// Log the download attempt
println!("Attempting to download plugin from SpigotMC direct URL: {}", direct_download_url);
println!("Requested version: {} (Note: SpigotMC usually provides latest version only)", version);
match self.client.download(download_url, destination).await {
Ok(_) => Ok(destination.to_string_lossy().to_string()), // Restore returning path
Err(e) => Err(format!("Failed to download from SpiGet: {}", e))
// Try to download using direct SpigotMC URL
match self.client.download(&direct_download_url, destination).await {
Ok(_) => {
println!("Successfully downloaded plugin from SpigotMC direct URL");
Ok(destination.to_string_lossy().to_string())
},
Err(e) => {
// If direct download fails, try the SpiGet URL as fallback
println!("Direct SpigotMC download failed: {}. Trying SpiGet URL as fallback...", e);
let download_url = &details.download_url;
if download_url.is_empty() {
return Err(format!("No download URL found for SpigotMC resource {}", plugin_id));
}
println!("Falling back to SpiGet download URL: {}", download_url);
match self.client.download(download_url, destination).await {
Ok(_) => Ok(destination.to_string_lossy().to_string()),
Err(e) => Err(format!("Failed to download from SpiGet: {}", e))
}
}
}
}
}

View File

@ -154,7 +154,22 @@ impl HttpClient {
.build()?;
let mut headers = HeaderMap::new();
headers.insert(USER_AGENT, HeaderValue::from_static("PlugSnatcherApp/0.1.0"));
headers.insert(USER_AGENT, HeaderValue::from_static("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36")); // More browser-like
// Add Accept header for everything
headers.insert(ACCEPT, HeaderValue::from_static("*/*"));
// Add headers for better browser simulation when dealing with SpigotMC
if url.contains("spigotmc.org") {
headers.insert(ACCEPT, HeaderValue::from_static("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"));
// Add custom headers as strings
let _ = headers.insert("Sec-Fetch-Dest", HeaderValue::from_static("document"));
let _ = headers.insert("Sec-Fetch-Mode", HeaderValue::from_static("navigate"));
let _ = headers.insert("Sec-Fetch-Site", HeaderValue::from_static("none"));
let _ = headers.insert("Sec-Fetch-User", HeaderValue::from_static("?1"));
headers.insert(reqwest::header::UPGRADE_INSECURE_REQUESTS, HeaderValue::from_static("1"));
println!("Added browser simulation headers for SpigotMC download");
}
// Add GitHub token if URL is GitHub and we have a token
if url.contains("github.com") && self.github_token.is_some() {
@ -166,8 +181,12 @@ impl HttpClient {
}
// Get response
println!("Sending download request to: {}", url);
let response = client.get(url).headers(headers).send().await?;
// Log response status
println!("Download response status: {}", response.status());
// Check if request was successful
if !response.status().is_success() {
return Err(format!("Failed to download: Status {}", response.status()).into());
@ -175,6 +194,7 @@ impl HttpClient {
// Get response bytes
let bytes = response.bytes().await?;
println!("Downloaded {} bytes", bytes.len());
// Create parent directories if needed
if let Some(parent) = destination.parent() {
@ -185,6 +205,7 @@ impl HttpClient {
// Write to file
std::fs::write(destination, bytes)?;
println!("Successfully wrote file to: {}", destination.display());
Ok(())
}