mesh downloader

This commit is contained in:
Quaternions 2023-11-09 15:51:23 -08:00
parent 35b5aff9a7
commit 43115cbac6

View File

@ -15,6 +15,7 @@ enum Commands {
Download(MapList), Download(MapList),
DownloadTextures(PathBufList), DownloadTextures(PathBufList),
ConvertTextures, ConvertTextures,
DownloadMeshes(PathBufList),
Extract(PathBufList), Extract(PathBufList),
Interactive, Interactive,
Replace, Replace,
@ -97,6 +98,15 @@ fn get_texture_refs(dom:&rbx_dom_weak::WeakDom) -> Vec<rbx_dom_weak::types::Ref>
//next class //next class
objects objects
} }
fn get_mesh_refs(dom:&rbx_dom_weak::WeakDom) -> Vec<rbx_dom_weak::types::Ref>{
let mut objects = std::vec::Vec::new();
recursive_collect_superclass(&mut objects, dom, dom.root(),"FileMesh");
recursive_collect_superclass(&mut objects, dom, dom.root(),"MeshPart");
//get ids
//clear vec
//next class
objects
}
enum ReaderType<'a, R:Read+Seek>{ enum ReaderType<'a, R:Read+Seek>{
GZip(flate2::read::GzDecoder<&'a mut R>), GZip(flate2::read::GzDecoder<&'a mut R>),
@ -336,6 +346,51 @@ fn download_textures(paths: Vec<std::path::PathBuf>) -> AResult<()>{
} }
Ok(()) Ok(())
} }
fn download_meshes(paths: Vec<std::path::PathBuf>) -> AResult<()>{
println!("download_meshes paths:{:?}",paths);
let header=format!("Cookie: .ROBLOSECURITY={}",std::env::var("RBXCOOKIE")?);
let shared_args=&[
"-q",
"--header",
header.as_str(),
"-O",
];
let mut mesh_list=std::collections::HashSet::new();
for path in paths {
let mut input = std::io::BufReader::new(std::fs::File::open(path.clone())?);
match get_dom(&mut input){
Ok(dom)=>{
let object_refs = get_mesh_refs(&dom);
for &object_ref in object_refs.iter() {
if let Some(object)=dom.get_by_ref(object_ref){
if let Some(rbx_dom_weak::types::Variant::Content(content)) = object.properties.get("MeshId") {
println!("Mesh content:{:?}",content);
if let Ok(asset_id)=content.clone().into_string().parse::<RobloxAssetId>(){
mesh_list.insert(asset_id.0);
}
}
}
}
},
Err(e)=>println!("error loading map {:?}: {:?}",path.file_name(),e),
}
}
println!("Mesh list:{:?}",mesh_list);
let processes_result:Result<Vec<_>, _>=mesh_list.iter().map(|asset_id|{
std::process::Command::new("wget")
.args(shared_args)
.arg(format!("meshes/unprocessed/{}",asset_id))
.arg(format!("https://assetdelivery.roblox.com/v1/asset/?ID={}",asset_id))
.spawn()
}).collect();
//naively wait for all because idk how to make an async progress bar lmao
for child in processes_result?{
let output=child.wait_with_output()?;
println!("Mesh exit_success:{}",output.status.success());
}
Ok(())
}
fn load_image<R:Read+Seek+std::io::BufRead>(input:&mut R)->AResult<image::DynamicImage>{ fn load_image<R:Read+Seek+std::io::BufRead>(input:&mut R)->AResult<image::DynamicImage>{
let mut fourcc=[0u8;4]; let mut fourcc=[0u8;4];
@ -912,6 +967,7 @@ fn main() -> AResult<()> {
Commands::Download(map_list)=>download(map_list.maps), Commands::Download(map_list)=>download(map_list.maps),
Commands::DownloadTextures(pathlist)=>download_textures(pathlist.paths), Commands::DownloadTextures(pathlist)=>download_textures(pathlist.paths),
Commands::ConvertTextures=>convert_textures(), Commands::ConvertTextures=>convert_textures(),
Commands::DownloadMeshes(pathlist)=>download_meshes(pathlist.paths),
Commands::Extract(pathlist)=>extract(pathlist.paths), Commands::Extract(pathlist)=>extract(pathlist.paths),
Commands::Interactive=>interactive(), Commands::Interactive=>interactive(),
Commands::Replace=>replace(), Commands::Replace=>replace(),