Exemplo n.º 1
0
        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;
                }
            }
        }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 4
0
        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);
                }
            }
        }