From 656de62bdc034945be3f7a49261be2879243f44e Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Thu, 3 Apr 2025 12:29:12 -0700 Subject: [PATCH] asset-tool: add DownloadVersionV2 --- src/main.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main.rs b/src/main.rs index 272d5a4..8b944b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,6 +23,7 @@ enum Commands{ DownloadHistory(DownloadHistorySubcommand), Download(DownloadSubcommand), DownloadVersion(DownloadVersionSubcommand), + DownloadVersionV2(DownloadVersionSubcommand), DownloadDecompile(DownloadDecompileSubcommand), DownloadCreationsJson(DownloadCreationsJsonSubcommand), DownloadUserInventoryJson(DownloadUserInventoryJsonSubcommand), @@ -463,6 +464,23 @@ async fn main()->AResult<()>{ }, ).await }, + Commands::DownloadVersionV2(subcommand)=>{ + let output_folder=subcommand.output_folder.unwrap_or_else(||std::env::current_dir().unwrap()); + download_version_v2( + cookie_from_args( + subcommand.cookie_literal, + subcommand.cookie_envvar, + subcommand.cookie_file, + ).await?, + subcommand.asset_id, + subcommand.asset_version, + { + let mut path=output_folder.clone(); + path.push(subcommand.asset_id.to_string()); + path + }, + ).await + }, Commands::DownloadDecompile(subcommand)=>{ download_decompile(DownloadDecompileConfig{ cookie:cookie_from_args( @@ -947,6 +965,20 @@ async fn download_version(cookie:Cookie,asset_id:AssetID,version:Option<u64>,des Ok(()) } +async fn download_version_v2(cookie:Cookie,asset_id:AssetID,version:Option<u64>,dest:PathBuf)->AResult<()>{ + let context=CookieContext::new(cookie); + + // v2 has two steps + let info=context.get_asset_v2(rbx_asset::cookie::GetAssetRequest{asset_id,version}).await?; + println!("version:{}",info.version); + + let location=info.info.locations.first().ok_or(anyhow::Error::msg("No locations"))?; + let data=context.get_asset_v2_download(location).await?; + + tokio::fs::write(dest,data).await?; + Ok(()) +} + async fn download_list(cookie:Cookie,asset_id_file_map:AssetIDFileMap)->AResult<()>{ let context=CookieContext::new(cookie); futures::stream::iter(asset_id_file_map.into_iter()