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> {
|
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 details = self.get_plugin_details(plugin_id).await?;
|
||||||
let download_url = &details.download_url;
|
|
||||||
|
|
||||||
if download_url.is_empty() {
|
// Use the SpigotMC direct download URL instead of SpiGet
|
||||||
return Err(format!("No download URL found for SpigotMC resource {}", plugin_id));
|
// 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
|
// Log the download attempt
|
||||||
println!("Warning: SpigotMC download via SpiGet usually fetches the LATEST version, requested version '{}' might be ignored.", version);
|
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 {
|
// Try to download using direct SpigotMC URL
|
||||||
Ok(_) => Ok(destination.to_string_lossy().to_string()), // Restore returning path
|
match self.client.download(&direct_download_url, destination).await {
|
||||||
Err(e) => Err(format!("Failed to download from SpiGet: {}", e))
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -154,7 +154,22 @@ impl HttpClient {
|
|||||||
.build()?;
|
.build()?;
|
||||||
|
|
||||||
let mut headers = HeaderMap::new();
|
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
|
// Add GitHub token if URL is GitHub and we have a token
|
||||||
if url.contains("github.com") && self.github_token.is_some() {
|
if url.contains("github.com") && self.github_token.is_some() {
|
||||||
@ -166,8 +181,12 @@ impl HttpClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get response
|
// Get response
|
||||||
|
println!("Sending download request to: {}", url);
|
||||||
let response = client.get(url).headers(headers).send().await?;
|
let response = client.get(url).headers(headers).send().await?;
|
||||||
|
|
||||||
|
// Log response status
|
||||||
|
println!("Download response status: {}", response.status());
|
||||||
|
|
||||||
// Check if request was successful
|
// Check if request was successful
|
||||||
if !response.status().is_success() {
|
if !response.status().is_success() {
|
||||||
return Err(format!("Failed to download: Status {}", response.status()).into());
|
return Err(format!("Failed to download: Status {}", response.status()).into());
|
||||||
@ -175,6 +194,7 @@ impl HttpClient {
|
|||||||
|
|
||||||
// Get response bytes
|
// Get response bytes
|
||||||
let bytes = response.bytes().await?;
|
let bytes = response.bytes().await?;
|
||||||
|
println!("Downloaded {} bytes", bytes.len());
|
||||||
|
|
||||||
// Create parent directories if needed
|
// Create parent directories if needed
|
||||||
if let Some(parent) = destination.parent() {
|
if let Some(parent) = destination.parent() {
|
||||||
@ -185,6 +205,7 @@ impl HttpClient {
|
|||||||
|
|
||||||
// Write to file
|
// Write to file
|
||||||
std::fs::write(destination, bytes)?;
|
std::fs::write(destination, bytes)?;
|
||||||
|
println!("Successfully wrote file to: {}", destination.display());
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user