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},
|
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)?;
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user