Fix SpigotMC plugin downloads by using direct URLs
This commit is contained in:
parent
1ebb16c15f
commit
a5e7b766ac
@ -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;
|
||||
|
||||
// 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);
|
||||
|
||||
// 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);
|
||||
|
||||
// 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));
|
||||
}
|
||||
|
||||
// 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);
|
||||
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()), // Restore returning path
|
||||
Ok(_) => Ok(destination.to_string_lossy().to_string()),
|
||||
Err(e) => Err(format!("Failed to download from SpiGet: {}", e))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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(())
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user