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},
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)?;

View File

@@ -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)
}
}

View File

@@ -14,21 +14,18 @@ use crate::nexus::{
pub fn download_nxm(
api_key: &str,
link: &str,
nxm_url: &NXMUrl,
target_dir: impl AsRef<Path>,
) -> 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<Path>) -> 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)
}

View File

@@ -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()) {