fixed mod having multiple files

This commit is contained in:
2026-03-17 22:09:00 +01:00
parent aacc9795d9
commit 9e3bdeacc6
4 changed files with 21 additions and 17 deletions

View File

@@ -8,7 +8,7 @@ use fomod_manager::{
cli::{self, Args}, cli::{self, Args},
instance::{self, files_to_install_mod, insert_mod_to_instance}, instance::{self, files_to_install_mod, insert_mod_to_instance},
load_order, load_order,
nexus::{NexusAPI, download_nxm}, nexus::{NXMUrl, NexusAPI, download_nxm},
types::RootConfig, types::RootConfig,
unpacker::unpack, unpacker::unpack,
}; };
@@ -80,7 +80,7 @@ fn command_order(root_config: &RootConfig, instance_id: &str) -> anyhow::Result<
Ok(()) Ok(())
} }
fn command_download(root_config: &mut RootConfig, nxm_url: &str) -> anyhow::Result<()> { fn command_download(root_config: &mut RootConfig, raw_url: &str) -> anyhow::Result<()> {
let Some(dl_location) = root_config.download_location() else { let Some(dl_location) = root_config.download_location() else {
return Err(anyhow!("No download location set")); return Err(anyhow!("No download location set"));
}; };
@@ -89,15 +89,19 @@ fn command_download(root_config: &mut RootConfig, nxm_url: &str) -> anyhow::Resu
return Err(anyhow!("No API key provided")); return Err(anyhow!("No API key provided"));
}; };
let (dl_file, mod_info) = download_nxm(api_key, nxm_url, dl_location)?; let Some(nxm_url) = NXMUrl::parse_url(raw_url) else {
return Err(anyhow!("Failed to parse URL"));
};
let mod_id = mod_info.generate_id(); let (dl_file, mod_info) = download_nxm(api_key, &nxm_url, dl_location)?;
let mod_id = format!("{}-{}", mod_info.generate_id(), nxm_url.file);
if root_config.game_by_id(&mod_id).is_some() { if root_config.game_by_id(&mod_id).is_some() {
error!( error!(
"Generated mod id already exists. Pleas install downloaded mod manually. Downloaded at {}", "Generated mod id already exists. Pleas install downloaded mod manually. Downloaded at {}",
&dl_file.to_string_lossy() &dl_file.to_string_lossy()
); );
return Err(anyhow!("Mod with generated already exists")); return Err(anyhow!("Mod with generated id already exists"));
} }
let new_mod = unpack(root_config, &mod_id, dl_file)?; let new_mod = unpack(root_config, &mod_id, dl_file)?;

View File

@@ -145,6 +145,6 @@ impl ModInfo {
if short_name.len() > MAX_CHARS { if short_name.len() > MAX_CHARS {
short_name.truncate(MAX_CHARS); short_name.truncate(MAX_CHARS);
} }
format!("{}-{}-{}", short_name, self.mod_id, self.version) format!("{}-{}", short_name, self.mod_id)
} }
} }

View File

@@ -14,21 +14,18 @@ use crate::nexus::{
pub fn download_nxm( pub fn download_nxm(
api_key: &str, api_key: &str,
link: &str, nxm_url: &NXMUrl,
target_dir: impl AsRef<Path>, target_dir: impl AsRef<Path>,
) -> anyhow::Result<(PathBuf, ModInfo)> { ) -> anyhow::Result<(PathBuf, ModInfo)> {
let api = NexusAPI::new(api_key); let api = NexusAPI::new(api_key);
let Some(parsed_url) = NXMUrl::parse_url(link) else {
return Err(anyhow!("Failed to parse url"));
};
let mod_info = api.mod_info(&parsed_url.game, &parsed_url.mod_id)?; let mod_info = api.mod_info(&nxm_url.game, &nxm_url.mod_id)?;
let links = api.generate_download_link_for_file(&parsed_url)?; let links = api.generate_download_link_for_file(nxm_url)?;
let selected_mirror = links.first().unwrap(); let selected_mirror = links.first().unwrap();
let url = selected_mirror.parse_url()?; let url = selected_mirror.parse_url()?;
let original_filename = url.path_segments().and_then(|mut e| e.next_back()).unwrap(); let original_filename = url.path_segments().and_then(|mut e| e.next_back()).unwrap();
let filename = gen_filename_for_mod(&mod_info, original_filename); let filename = gen_filename_for_mod(&mod_info, &nxm_url.file, original_filename);
let download_path = target_dir.as_ref().join(parsed_url.game).join(filename); let download_path = target_dir.as_ref().join(&nxm_url.game).join(filename);
if let Some(parent) = download_path.parent() { if let Some(parent) = download_path.parent() {
create_dir_all(parent)?; create_dir_all(parent)?;
@@ -58,12 +55,12 @@ fn download_mod(mod_dl_link: &DownloadLocation, target: impl AsRef<Path>) -> any
Ok(()) Ok(())
} }
fn gen_filename_for_mod(mod_info: &ModInfo, dl_filename: &str) -> String { fn gen_filename_for_mod(mod_info: &ModInfo, file_id: &str, dl_filename: &str) -> String {
let filename_from_url = PathBuf::from(dl_filename); let filename_from_url = PathBuf::from(dl_filename);
let ext = filename_from_url let ext = filename_from_url
.extension() .extension()
.unwrap_or_default() .unwrap_or_default()
.to_string_lossy(); .to_string_lossy();
format!("{}-{}.{}", mod_info.mod_id, mod_info.version, ext) format!("{}-{}.{}", mod_info.mod_id, file_id, ext)
} }

View File

@@ -14,7 +14,10 @@ pub fn unpack(
let extract_to = root_config.mod_location().join(id); let extract_to = root_config.mod_location().join(id);
if fs::exists(&extract_to)? { if fs::exists(&extract_to)? {
return Err(anyhow!("File already exists")); return Err(anyhow!(
"File already exists: {}",
extract_to.to_string_lossy()
));
} }
match path.as_ref().extension().and_then(|e| e.to_str()) { match path.as_ref().extension().and_then(|e| e.to_str()) {