fixed mod having multiple files
This commit is contained in:
14
src/main.rs
14
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)?;
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user