private void ProgressChanged(WorkerItem workerItem) { ProgressBar.Value = workerItem.progress; CurrentCard = workerItem.card.Properties[workerItem.alt].Properties.First(x => x.Key.Name == "Name").Value.ToString(); if (workerItem.set != null && workerItem.local == null && workerItem.web != null) { workerItem.set.ImageCount += 1; } if (workerItem.local == null && workerItem.web == null) { return; } LocalImage.Source = null; WebImage.Source = null; if (workerItem.local != null) { BitmapImage local = StreamToBitmapImage(workerItem.local); LocalImage.Source = local; LocalDimensions.Text = local.PixelWidth.ToString() + " x " + local.PixelHeight.ToString(); } if (workerItem.web != null) { BitmapImage web = StreamToBitmapImage(workerItem.web); WebImage.Source = web; if (LocalImage.Source == null) { LocalImage.Source = web; } } }
private void ProgressChanged(object sender, ProgressChangedEventArgs e) { ProgressBar.Value = e.ProgressPercentage; WorkerItem workerItem = e.UserState as WorkerItem; CurrentCard.Text = workerItem.card.Name; LocalImage.Source = null; if (workerItem.local != null) { BitmapImage local = LoadImage(workerItem.local); LocalImage.Source = local; LocalDimensions.Text = local.PixelWidth.ToString() + " x " + local.PixelHeight.ToString(); } WebImage.Source = null; if (workerItem.web != null) { BitmapImage web = LoadImage(workerItem.web); WebImage.Source = web; } }
private void DownloadSet(object sender, DoWorkEventArgs e) { var i = 0; var cards = new List <Card>(); if ((bool)e.Argument) { cards.AddRange(selectedSet.Cards); } else { cards.Add(selectedSet.Cards.First(x => x.Properties.Count == 1)); } foreach (var c in cards) { i++; foreach (var alt in c.Properties) { if (alt.Key != "") { } var card = c.Clone(); card.Alternate = alt.Key; if (backgroundWorker.CancellationPending) { break; } var workerItem = new WorkerItem(); workerItem.card = card; // get local image info var imageUri = card.GetImageUri(); var files = Directory.GetFiles(selectedSet.ImagePackUri, imageUri + ".*") .Where(x => System.IO.Path.GetFileNameWithoutExtension(x).Equals(imageUri, StringComparison.InvariantCultureIgnoreCase)) .OrderBy(x => x.Length) .ToArray(); string Id; if (selectedSet.Name == "Tokens") { Id = card.Properties[card.Alternate].Properties.First(x => x.Key.Name == "Flags").Value.ToString().ToLower() + "/" + card.Properties[card.Alternate].Properties.First(x => x.Key.Name == "Number").Value.ToString(); } else { Id = card.Properties[""].Properties.First(x => x.Key.Name == "MultiverseId").Value.ToString(); } if (string.IsNullOrEmpty(Id.ToString()) || Id.Contains("?")) { //TOOD: handle cards that are missing their multiverseIds backgroundWorker.ReportProgress(i, workerItem); continue; } // get card's json data from web var webclient = new WebClient(); webclient.Encoding = Encoding.UTF8; JObject jsondata = new JObject(); try { jsondata = (JObject)JsonConvert.DeserializeObject(webclient.DownloadString("https://api.scryfall.com/cards/" + Id)); } catch { if (files.Count() > 0) { workerItem.local = new Uri(files.First()); } backgroundWorker.ReportProgress(i, workerItem); MessageBox.Show(String.Format("Cannot find image for card {0} with multiverseId {1}.", card.Name, Id)); continue; } if (!replace && !jsondata.Value <bool>("highres_image") && files.Length > 0 && (bool)e.Argument) { workerItem.local = new Uri(files.First()); backgroundWorker.ReportProgress(i, workerItem); continue; } var imageDownloadUrl = ""; var flipCard = false; switch (jsondata.Value <string>("layout")) { case "transform": { if (alt.Key == "transform") { imageDownloadUrl = jsondata["card_faces"][1]["image_uris"][xl ? "large" : "normal"].ToString(); } else { imageDownloadUrl = jsondata["card_faces"][0]["image_uris"][xl ? "large" : "normal"].ToString(); } break; } case "split": { if (alt.Key == "") { imageDownloadUrl = jsondata["image_uris"][xl ? "large" : "normal"].ToString(); } break; } case "flip": { if (alt.Key == "flip") { flipCard = true; } imageDownloadUrl = jsondata["image_uris"][xl ? "large" : "normal"].ToString(); break; } default: { imageDownloadUrl = jsondata["image_uris"][xl ? "large" : "normal"].ToString(); break; } } if (string.IsNullOrEmpty(imageDownloadUrl)) { backgroundWorker.ReportProgress(i, workerItem); continue; } if (!(bool)e.Argument) { workerItem.local = (files.Length == 0) ? null : new Uri(files.First()); workerItem.web = new Uri(imageDownloadUrl); backgroundWorker.ReportProgress(i, workerItem); continue; } // download image var garbage = Config.Instance.Paths.GraveyardPath; if (!Directory.Exists(garbage)) { Directory.CreateDirectory(garbage); } foreach (var f in files.Select(x => new FileInfo(x))) { f.MoveTo(Path.Combine(garbage, f.Name)); if (workerItem.local == null) { workerItem.local = new Uri(f.FullName); } } var newPath = Path.Combine(selectedSet.ImagePackUri, imageUri + ".jpg"); webclient.DownloadFile(new Uri(imageDownloadUrl), newPath); if (flipCard) { using (var newimg = System.Drawing.Image.FromFile(newPath)) { newimg.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); newimg.Save(newPath); } } else if (card.Size.Name == "Plane") { using (var newimg = System.Drawing.Image.FromFile(newPath)) { newimg.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipNone); newimg.Save(newPath); } } workerItem.web = new Uri(newPath); backgroundWorker.ReportProgress(i, workerItem); } } }
private void DownloadSet(SetItem setItem, IProgress <WorkerItem> progress) { var i = 0; var set = setItem.set; //TODO: remove this and use setItem var setSize = set.Cards.Count(); foreach (var c in set.Cards) { i++; foreach (var alt in c.Properties) { if (_cts.IsCancellationRequested) { break; } var cardInfo = GetCardInfo(setItem, c, alt.Key); var workerItem = new WorkerItem(); workerItem.set = setItem; workerItem.alt = alt.Key; workerItem.progress = (double)i / setSize; workerItem.card = c; // get local image info var files = FindLocalCardImages(set, c, workerItem.alt); if (cardInfo == null) { if (set.Id.ToString() != "a584b75b-266f-4378-bed5-9ffa96cd3961") { MessageBox.Show(String.Format("Cannot find scryfall data for card {0}.", c.Name)); } progress.Report(workerItem); continue; } workerItem.local = files.Length > 0 ? UriToStream(files.First()) : null; var imageDownloadUrl = ""; var flipCard = false; switch (cardInfo.Layout) { case "transform": { if (workerItem.alt == "transform") { imageDownloadUrl = xl ? cardInfo.LargeBackUrl : cardInfo.NormalBackUrl; } else { imageDownloadUrl = xl ? cardInfo.LargeUrl : cardInfo.NormalUrl; } break; } case "split": { if (workerItem.alt == "") { imageDownloadUrl = xl ? cardInfo.LargeUrl : cardInfo.NormalUrl; } break; } case "flip": { if (workerItem.alt == "flip") { flipCard = true; } imageDownloadUrl = xl ? cardInfo.LargeUrl : cardInfo.NormalUrl; break; } default: { imageDownloadUrl = xl ? cardInfo.LargeUrl : cardInfo.NormalUrl; break; } } // if the card has no web image if (string.IsNullOrEmpty(imageDownloadUrl)) { progress.Report(workerItem); continue; } // check if the web image has a newer timestamp var webTimestamp = Convert.ToInt32(imageDownloadUrl.Split('?')[1]); if (workerItem.local != null) { int localTimestamp; using (var image = Image.FromStream(workerItem.local)) { if (image.PropertyIdList.FirstOrDefault(x => x == 40092) == 0) { localTimestamp = 0; } else { localTimestamp = Convert.ToInt32(Encoding.Unicode.GetString(image.GetPropertyItem(40092).Value)); } if (localTimestamp > 0 && ((image.Width > 600 && xl) || (image.Width < 500 && !xl))) { if (webTimestamp <= localTimestamp) { progress.Report(workerItem); continue; } } } } // download image var garbage = Config.Instance.Paths.GraveyardPath; if (!Directory.Exists(garbage)) { Directory.CreateDirectory(garbage); } foreach (var f in files.Select(x => new FileInfo(x))) { f.MoveTo(Path.Combine(garbage, f.Name)); } var imageUri = String.IsNullOrWhiteSpace(workerItem.alt) ? c.ImageUri : c.ImageUri + "." + workerItem.alt; var newPath = Path.Combine(set.ImagePackUri, imageUri + ".jpg"); workerItem.web = UriToStream(imageDownloadUrl); using (var newimg = Image.FromStream(workerItem.web)) { if (flipCard) { newimg.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); } else if (cardInfo.Layout == "Planar") { newimg.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipNone); } var commentMetadata = (PropertyItem)FormatterServices.GetUninitializedObject(typeof(PropertyItem)); commentMetadata.Id = 40092; // this is the comments field commentMetadata.Value = Encoding.Unicode.GetBytes(webTimestamp.ToString()); commentMetadata.Len = commentMetadata.Value.Length; commentMetadata.Type = 1; newimg.SetPropertyItem(commentMetadata); newimg.Save(newPath, ImageFormat.Jpeg); } progress.Report(workerItem); } } }