public static async Task ApplyPreviewsAsync(string acRoot, string carName, string source, bool resize, IProgress<Tuple<string, double?>> progress = null,
CancellationToken cancellation = default(CancellationToken)) {
var files = Directory.GetFiles(source, "*.bmp");
for (var i = 0; i < files.Length; i++) {
var file = files[i];
var id = Path.GetFileNameWithoutExtension(file);
var skinDirectory = FileUtils.GetCarSkinDirectory(acRoot, carName, id);
if (!Directory.Exists(skinDirectory)) continue;
progress?.Report(new Tuple<string, double?>(id, (double)i / files.Length));
await Task.Run(() => { ApplyPreview(file, Path.Combine(skinDirectory, "preview.jpg"), resize); }, cancellation);
if (cancellation.IsCancellationRequested) return;
}
try {
Directory.Delete(source);
} catch (Exception) {
// ignored
}
}