From 9e3bdeacc611d794facb1aa0aaba6d8e0be1e3f0 Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Tue, 17 Mar 2026 22:09:00 +0100 Subject: [PATCH] fixed mod having multiple files --- src/main.rs | 14 +++++++++----- src/nexus/api.rs | 2 +- src/nexus/downloader.rs | 17 +++++++---------- src/unpacker.rs | 5 ++++- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7e264ee..2d0efb6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use fomod_manager::{ cli::{self, Args}, instance::{self, files_to_install_mod, insert_mod_to_instance}, load_order, - nexus::{NexusAPI, download_nxm}, + nexus::{NXMUrl, NexusAPI, download_nxm}, types::RootConfig, unpacker::unpack, }; @@ -80,7 +80,7 @@ fn command_order(root_config: &RootConfig, instance_id: &str) -> anyhow::Result< 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 { 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")); }; - 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() { error!( "Generated mod id already exists. Pleas install downloaded mod manually. Downloaded at {}", &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)?; diff --git a/src/nexus/api.rs b/src/nexus/api.rs index e633e20..84fae05 100644 --- a/src/nexus/api.rs +++ b/src/nexus/api.rs @@ -145,6 +145,6 @@ impl ModInfo { if short_name.len() > MAX_CHARS { short_name.truncate(MAX_CHARS); } - format!("{}-{}-{}", short_name, self.mod_id, self.version) + format!("{}-{}", short_name, self.mod_id) } } diff --git a/src/nexus/downloader.rs b/src/nexus/downloader.rs index e350148..af0a8a6 100644 --- a/src/nexus/downloader.rs +++ b/src/nexus/downloader.rs @@ -14,21 +14,18 @@ use crate::nexus::{ pub fn download_nxm( api_key: &str, - link: &str, + nxm_url: &NXMUrl, target_dir: impl AsRef, ) -> anyhow::Result<(PathBuf, ModInfo)> { 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 links = api.generate_download_link_for_file(&parsed_url)?; + let mod_info = api.mod_info(&nxm_url.game, &nxm_url.mod_id)?; + let links = api.generate_download_link_for_file(nxm_url)?; let selected_mirror = links.first().unwrap(); let url = selected_mirror.parse_url()?; 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 download_path = target_dir.as_ref().join(parsed_url.game).join(filename); + let filename = gen_filename_for_mod(&mod_info, &nxm_url.file, original_filename); + let download_path = target_dir.as_ref().join(&nxm_url.game).join(filename); if let Some(parent) = download_path.parent() { create_dir_all(parent)?; @@ -58,12 +55,12 @@ fn download_mod(mod_dl_link: &DownloadLocation, target: impl AsRef) -> any 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 ext = filename_from_url .extension() .unwrap_or_default() .to_string_lossy(); - format!("{}-{}.{}", mod_info.mod_id, mod_info.version, ext) + format!("{}-{}.{}", mod_info.mod_id, file_id, ext) } diff --git a/src/unpacker.rs b/src/unpacker.rs index 01ac65a..c3f79aa 100644 --- a/src/unpacker.rs +++ b/src/unpacker.rs @@ -14,7 +14,10 @@ pub fn unpack( let extract_to = root_config.mod_location().join(id); 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()) {