private void CoverEditForm_Shown(object sender, System.EventArgs e)
        {
            UseWaitCursor = true;

            var    keyParts        = releaseKey.Split(MainForm.Separator);
            var    galaxyCacheRoot = Path.Combine(parent.galaxyRootPath, keyParts[0], keyParts[1]);
            string bannerFilename;
            string iconFilename;

            using (var db = new GalaxyDb())
            {
                bannerFilename = db.WebCacheResources
                                 .Where(r => r.WebCache.ReleaseKey == releaseKey &&
                                        r.WebCache.UserId == userId &&
                                        r.WebCacheResourceTypeId == WebCacheResourceType.Background
                                        )
                                 .Select(r => r.Filename)
                                 .FirstOrDefault();
                iconFilename = db.WebCacheResources
                               .Where(r => r.WebCache.ReleaseKey == releaseKey &&
                                      r.WebCache.UserId == userId &&
                                      r.WebCacheResourceTypeId == WebCacheResourceType.SquareIcon
                                      )
                               .Select(r => r.Filename)
                               .FirstOrDefault();
            }
            using (var imgFactory = new ImageProcessor.ImageFactory())
            {
                // cover 342x482, ~7:5
                galaxyCoverPicture.Image = pictureBox.Image;
                var coverPath = Path.Combine(parent.steamRootPath, $"{keyParts[1]}_library_600x900.jpg");
                if (File.Exists(coverPath))
                {
                    try
                    {
                        using (var img = imgFactory.Load(coverPath).Resize(new ResizeLayer(new Size(342, 482), ResizeMode.Crop)))                         // 600x900
                            steamCoverPicture.Image = (Image)img.Image.Clone();
                    }
                    catch { }
                }

                // banner 1600x650
                if (!string.IsNullOrEmpty(bannerFilename))
                {
                    bannerFilename = Path.Combine(galaxyCacheRoot, bannerFilename);
                    if (File.Exists(bannerFilename))
                    {
                        try
                        {
                            using (var img = imgFactory.Load(bannerFilename))
                                galaxyBackgroundPicture.Image = (Image)img.Image.Clone();
                        }
                        catch { }
                    }
                }
                var steamBannerPath = Path.Combine(parent.steamRootPath, $"{keyParts[1]}_library_hero.jpg");
                if (File.Exists(steamBannerPath))
                {
                    try
                    {
                        using (var img = imgFactory.Load(steamBannerPath).Resize(new ResizeLayer(new Size(1600, 650), ResizeMode.Crop)))                         // 1920x620
                            steamBackgroundPicture.Image = (Image)img.Image.Clone();
                    }
                    catch { }
                }

                // icon 112x112
                if (!string.IsNullOrEmpty(iconFilename))
                {
                    iconFilename = Path.Combine(galaxyCacheRoot, iconFilename);
                    if (File.Exists(iconFilename))
                    {
                        try
                        {
                            using (var img = imgFactory.Load(iconFilename))
                                galaxyIconPicture.Image = (Image)img.Image.Clone();
                        }
                        catch { }
                    }
                }
                var steamIconPath = Path.Combine(parent.steamRootPath, $"{keyParts[1]}_library_600x900.jpg");
                if (File.Exists(steamIconPath))
                {
                    try
                    {
                        using (var img = imgFactory.Load(steamIconPath).EntropyCrop().Resize(new ResizeLayer(new Size(112, 112), ResizeMode.Crop)))                         // 1920x620
                            steamIconPicture.Image = (Image)img.Image.Clone();
                    }
                    catch { }
                }
            }
            UseWaitCursor = false;
        }
        private void okButton_Click(object sender, System.EventArgs e)
        {
            var keyParts        = releaseKey.Split(MainForm.Separator);
            var galaxyCacheRoot = Path.Combine(parent.galaxyRootPath, keyParts[0], keyParts[1]);

            if (!Directory.Exists(galaxyCacheRoot))
            {
                Directory.CreateDirectory(galaxyCacheRoot);
            }
            const int  defaultQuality = 90;
            const bool deleteOldFiles = false;

            using (var imgFactory = new ImageProcessor.ImageFactory())
            {
                if (steamCoverSelect.Checked)
                {
                    pictureBox.Image = steamCoverPicture.Image;
                    string filename;
                    using (var stream = new MemoryStream())
                    {
                        using (var img = imgFactory.Load(steamCoverPicture.Image).Format(new WebPFormat {
                            Quality = defaultQuality
                        }))
                            img.Save(stream);
                        stream.Seek(0, SeekOrigin.Begin);
                        using (var sha = SHA256.Create())
                            filename = string.Concat(sha.ComputeHash(stream).Select(b => b.ToString("x2")));
                        filename += "_glx_vertical_cover.webp";
                        stream.Seek(0, SeekOrigin.Begin);
                        var outputFilename = Path.Combine(galaxyCacheRoot, filename);
                        File.WriteAllBytes(outputFilename, stream.ToArray());
                    }
                    using (var db = new GalaxyDb())
                    {
                        var existingCover = db.WebCacheResources.FirstOrDefault(r => r.WebCache.ReleaseKey == releaseKey && r.WebCache.UserId == userId && r.WebCacheResourceTypeId == WebCacheResourceType.VerticalCover);
                        if (existingCover == null)
                        {
                            var webCache = db.WebCache.FirstOrDefault(r => r.ReleaseKey == releaseKey && r.UserId == userId);
                            if (webCache == null)
                            {
                                webCache = db.Add(new WebCache
                                {
                                    ReleaseKey = releaseKey,
                                    UserId     = userId,
                                }).Entity;
                            }
                            db.WebCacheResources.Add(new WebCacheResources
                            {
                                WebCacheId             = webCache.Id,
                                WebCacheResourceTypeId = WebCacheResourceType.VerticalCover,
                                Filename = filename,
                            });
                        }
                        else
                        {
                            var existingImg = Path.Combine(galaxyCacheRoot, existingCover.Filename);
                            if (deleteOldFiles && File.Exists(existingImg))
                            {
                                try { File.Delete(existingImg); } catch { }
                            }
                            existingCover.Filename = filename;
                        }
                        db.SaveChanges();
                    }
                }
                if (steamBackgroundSelect.Checked)
                {
                    galaxyBackgroundPicture.Image = steamBackgroundPicture.Image;
                    string filename;
                    using (var stream = new MemoryStream())
                    {
                        using (var img = imgFactory.Load(steamBackgroundPicture.Image).Format(new WebPFormat {
                            Quality = defaultQuality
                        }))
                            img.Save(stream);
                        stream.Seek(0, SeekOrigin.Begin);
                        using (var sha = SHA256.Create())
                            filename = string.Concat(sha.ComputeHash(stream).Select(b => b.ToString("x2")));
                        filename += "_glx_bg_top_padding_7.webp";
                        stream.Seek(0, SeekOrigin.Begin);
                        var outputFilename = Path.Combine(galaxyCacheRoot, filename);
                        File.WriteAllBytes(outputFilename, stream.ToArray());
                    }
                    using (var db = new GalaxyDb())
                    {
                        var existingBackground = db.WebCacheResources
                                                 .FirstOrDefault(r => r.WebCache.ReleaseKey == releaseKey && r.WebCache.UserId == userId && r.WebCacheResourceTypeId == WebCacheResourceType.Background);
                        if (existingBackground == null)
                        {
                            var webCache = db.WebCache.FirstOrDefault(r => r.ReleaseKey == releaseKey && r.UserId == userId);
                            if (webCache == null)
                            {
                                webCache = db.Add(new WebCache
                                {
                                    ReleaseKey = releaseKey,
                                    UserId     = userId,
                                }).Entity;
                            }
                            db.WebCacheResources.Add(new WebCacheResources
                            {
                                WebCacheId             = webCache.Id,
                                WebCacheResourceTypeId = WebCacheResourceType.Background,
                                Filename = filename,
                            });
                        }
                        else
                        {
                            var existingImg = Path.Combine(galaxyCacheRoot, existingBackground.Filename);
                            if (deleteOldFiles && File.Exists(existingImg))
                            {
                                try { File.Delete(existingImg); } catch { }
                            }
                            existingBackground.Filename = filename;
                        }
                        db.SaveChanges();
                    }
                }
                if (steamIconSelect.Checked)
                {
                    galaxyIconPicture.Image = steamIconPicture.Image;
                    string filename;
                    using (var stream = new MemoryStream())
                    {
                        using (var img = imgFactory.Load(steamIconPicture.Image).Format(new WebPFormat {
                            Quality = defaultQuality
                        }))
                            img.Save(stream);
                        stream.Seek(0, SeekOrigin.Begin);
                        using (var sha = SHA256.Create())
                            filename = string.Concat(sha.ComputeHash(stream).Select(b => b.ToString("x2")));
                        filename += "_glx_square_icon_v2.webp";
                        stream.Seek(0, SeekOrigin.Begin);
                        var outputFilename = Path.Combine(galaxyCacheRoot, filename);
                        File.WriteAllBytes(outputFilename, stream.ToArray());
                    }
                    using (var db = new GalaxyDb())
                    {
                        var existingIcon = db.WebCacheResources
                                           .FirstOrDefault(r => r.WebCache.ReleaseKey == releaseKey && r.WebCache.UserId == userId && r.WebCacheResourceTypeId == WebCacheResourceType.SquareIcon);
                        if (existingIcon == null)
                        {
                            var webCache = db.WebCache.FirstOrDefault(r => r.ReleaseKey == releaseKey && r.UserId == userId);
                            if (webCache == null)
                            {
                                webCache = db.Add(new WebCache
                                {
                                    ReleaseKey = releaseKey,
                                    UserId     = userId,
                                }).Entity;
                            }
                            db.WebCacheResources.Add(new WebCacheResources
                            {
                                WebCacheId             = webCache.Id,
                                WebCacheResourceTypeId = WebCacheResourceType.SquareIcon,
                                Filename = filename,
                            });
                        }
                        else
                        {
                            var existingImg = Path.Combine(galaxyCacheRoot, existingIcon.Filename);
                            if (deleteOldFiles && File.Exists(existingImg))
                            {
                                try { File.Delete(existingImg); } catch { }
                            }
                            existingIcon.Filename = filename;
                        }
                        db.SaveChanges();
                    }
                }
            }

            DialogResult = DialogResult.OK;
            Close();
        }