diff --git a/rslib/src/import_export/package/apkg/import/media.rs b/rslib/src/import_export/package/apkg/import/media.rs index 29e144cc8..14d23d55e 100644 --- a/rslib/src/import_export/package/apkg/import/media.rs +++ b/rslib/src/import_export/package/apkg/import/media.rs @@ -32,20 +32,41 @@ pub(super) struct MediaUseMap { unchecked: Vec, } +struct ProgressHandler Result<()>> { + progress_fn: F, + counter: usize, +} + +impl Result<()>> ProgressHandler { + fn new(progress_fn: F) -> Self { + Self { + progress_fn, + counter: 0, + } + } + + fn increment(&mut self) -> Result<()> { + self.counter += 1; + if self.counter % 17 == 0 { + (self.progress_fn)(self.counter) + } else { + Ok(()) + } + } +} + impl Context<'_> { pub(super) fn prepare_media(&mut self) -> Result { let progress_fn = |u| (&mut self.progress_fn)(ImportProgress::MediaCheck(u)).is_ok(); let existing_sha1s = self.target_col.all_existing_sha1s(progress_fn)?; - prepare_media(&mut self.archive, &existing_sha1s) + prepare_media(&mut self.archive, &existing_sha1s, &mut self.progress_fn) } pub(super) fn copy_media(&mut self, media_map: &mut MediaUseMap) -> Result<()> { - let mut counter = 0; + let mut progress = + ProgressHandler::new(|u| (&mut self.progress_fn)(ImportProgress::Media(u))); for entry in media_map.used_entries() { - counter += 1; - if counter % 10 == 0 { - (self.progress_fn)(ImportProgress::Media(counter))?; - } + progress.increment()?; entry.copy_from_archive(&mut self.archive, &self.target_col.media_folder)?; } Ok(()) @@ -65,9 +86,14 @@ impl Collection { fn prepare_media( archive: &mut ZipArchive, existing_sha1s: &HashMap, + progress_fn: &mut impl FnMut(ImportProgress) -> Result<()>, ) -> Result { let mut media_map = MediaUseMap::default(); + let mut progress = ProgressHandler::new(|u| progress_fn(ImportProgress::MediaCheck(u))); + for mut entry in extract_media_entries(&Meta::new_legacy(), archive)? { + progress.increment()?; + if entry.is_static() { if !existing_sha1s.contains_key(&entry.name) { media_map.unchecked.push(entry); diff --git a/rslib/src/import_export/package/apkg/import/mod.rs b/rslib/src/import_export/package/apkg/import/mod.rs index bb5dc7d9f..7f41235df 100644 --- a/rslib/src/import_export/package/apkg/import/mod.rs +++ b/rslib/src/import_export/package/apkg/import/mod.rs @@ -40,6 +40,7 @@ impl Collection { path: impl AsRef, progress_fn: &mut ProgressFn, ) -> Result> { + progress_fn(ImportProgress::Collection)?; let file = File::open(path)?; let archive = ZipArchive::new(file)?;