public LocalAssetsControl(MainWindow main, BoxartControl boxart, BackgroundControl background, IconBannerControl iconBanner, ScreenshotsControl screenshots) { InitializeComponent(); _main = main; _boxart = boxart; _background = background; _iconBanner = iconBanner; _screenshots = screenshots; FtpAssetsBox.ItemsSource = _assetsList; onlyNewSync.IsChecked = Settings.Default.OnlyNew; sliderScreens.Value = Settings.Default.NumScreens; #region Xbox.com Worker _xboxWorker.WorkerReportsProgress = true; _xboxWorker.WorkerSupportsCancellation = true; var xboxMarketDataResult = new ConcurrentBag<XboxTitleInfo>(); var omitedTitles = new ConcurrentBag<AuroraDbManager.ContentItem>(); _xboxWorker.DoWork += (sender, args) => { var bgWork = sender as BackgroundWorker; try { if(_assetsList.Count ==0) { Dispatcher.Invoke(new Action(() => Status.Text = "No games...")); return; } xboxMarketDataResult = new ConcurrentBag<XboxTitleInfo>(); omitedTitles = new ConcurrentBag<AuroraDbManager.ContentItem>(); XboxLocale loc = args.Argument as XboxLocale; var _assetsToGo = _assetsList.Where(p => p.TitleIdNumber > 0); Dispatcher.Invoke(new Action(() => _main.busyProgress.Visibility = Visibility.Visible)); Dispatcher.Invoke(new Action(() => _main.busyProgress.Text= "0 / " + _assetsToGo.Count())); var maxScreens = Settings.Default.NumScreens; int progressCount = 0; Object progressLock = new Object(); Ts.Parallel.ForEach(_assetsToGo, (contentItem) => { if(bgWork.CancellationPending) { args.Cancel = true; } XboxTitleInfo _titleResult = _xboxAssetDownloader.GetTitleInfoSingle(contentItem.TitleIdNumber, loc); if(_titleResult.AssetsInfo!= null) { var unityCovers = XboxUnity.GetUnityCoverInfo(contentItem.TitleId); if(unityCovers.Count() > 0) { var cover = unityCovers.FirstOrDefault(p => p._unityResponse.Official == true); if(cover!= null) { _titleResult.CoverAsset = cover; } } xboxMarketDataResult.Add(_titleResult); } else { omitedTitles.Add(contentItem); } lock (progressLock) { bgWork.ReportProgress(1, (++progressCount) + " / " + _assetsToGo.Count()); } }); progressCount = 0; Ts.Parallel.ForEach(xboxMarketDataResult, (titleItem) => { AuroraDbManager.ContentItem contentItem = _assetsToGo.FirstOrDefault(p => p.TitleId == titleItem.TitleId); if(contentItem!= null) { lock (progressLock) { bgWork.ReportProgress(1, (++progressCount) + " / " + xboxMarketDataResult.Count); } var itemWrap = new ContentItemLocal(contentItem); if(titleItem.CoverAsset!= null) { var assetFileC = new AuroraAsset.AssetFile(); assetFileC.SetBoxart(titleItem.CoverAsset.GetCover(), true); itemWrap.SaveAsBoxart(assetFileC.FileData); assetFileC.Dispose(); } int screenCount = 0; Ts.Parallel.ForEach(titleItem.AssetsInfo, (assetInfo) => { if(!assetInfo.HaveAsset) { if(assetInfo.AssetType == XboxTitleInfo.XboxAssetType.Screenshot && screenCount >= maxScreens) { return; } var XboxAsset = assetInfo.GetAsset(); var assetFile = new AuroraAsset.AssetFile(); switch(assetInfo.AssetType) { case XboxTitleInfo.XboxAssetType.Icon: assetFile.SetIcon(XboxAsset.Image, true); itemWrap.SaveAsIconBanner(assetFile.FileData); break; case XboxTitleInfo.XboxAssetType.Banner: assetFile.SetBanner(XboxAsset.Image, true); itemWrap.SaveAsIconBanner(assetFile.FileData); break; case XboxTitleInfo.XboxAssetType.Background: assetFile.SetBackground(XboxAsset.Image, true); itemWrap.SaveAsBackground(assetFile.FileData); break; case XboxTitleInfo.XboxAssetType.Screenshot: // _screenshots.Load(XboxAsset.Image, false); // itemWrap.SaveAsScreenshots(assetFile.FileData); screenCount++; break; default: break; } // XboxAsset.Dispose(); assetFile.Dispose(); } GC.Collect(); }); } titleItem.Dispose(); }); Dispatcher.Invoke(new Action(() => Status.Text = "Finished downloading asset information...")); } catch(Exception ex) { MainWindow.SaveError(ex); Dispatcher.Invoke(new Action(() => Status.Text = "An error has occured, check error.log for more information...")); } }; _xboxWorker.RunWorkerCompleted += (sender, args) => { _main.busyProgress.Visibility = Visibility.Collapsed; _main.BusyIndicator.Visibility = Visibility.Collapsed; syncDb.IsEnabled = true; if(omitedTitles.Count >0) { var logPath = Path.GetTempPath() + Path.DirectorySeparatorChar + "omittedTitlesLog.log"; string logcontent = ""; foreach(var item in omitedTitles) { logcontent += "Title name: " + item.TitleName + @" TitleID: " + item.TitleId + @" Title int: " + item.TitleIdNumber + @" MediaID: " + item.MediaId + @" ----------------------------------------------- "; } File.WriteAllText(logPath, logcontent); var msgresult = MessageBox.Show("Omitted titles " + omitedTitles.Count + @" Show log?", "Action", MessageBoxButton.OKCancel, MessageBoxImage.Information, MessageBoxResult.Cancel); if(msgresult == MessageBoxResult.OK) { try { Process.Start(logPath); } catch { } } } // var disp = new List<XboxTitleInfo.XboxAssetInfo>(); }; _xboxWorker.ProgressChanged+=_xboxWorker_ProgressChanged; #endregion }
private void ProcessAsset(Task task, bool shouldHideWhenDone = true) { _isError = false; AuroraDbManager.ContentItem asset = null; Dispatcher.InvokeIfRequired(() => asset = FtpAssetsBox.SelectedItem as AuroraDbManager.ContentItem, DispatcherPriority.Normal); if(asset == null) return; ContentItemLocal assetWrapper = new ContentItemLocal(asset); var bw = new BackgroundWorker(); bw.DoWork += (sender, args) => { try { switch(task) { case Task.GetBoxart: _buffer = assetWrapper.GetBoxart(); break; case Task.GetBackground: _buffer = assetWrapper.GetBackground(); break; case Task.GetIconBanner: _buffer = assetWrapper.GetIconBanner(); break; case Task.GetScreenshots: _buffer = assetWrapper.GetScreenshots(); break; case Task.SetBoxart: assetWrapper.SaveAsBoxart(_buffer); break; case Task.SetBackground: assetWrapper.SaveAsBackground(_buffer); break; case Task.SetIconBanner: assetWrapper.SaveAsIconBanner(_buffer); break; case Task.SetScreenshots: assetWrapper.SaveAsScreenshots(_buffer); break; } args.Result = true; } catch(Exception ex) { MainWindow.SaveError(ex); args.Result = false; } }; bw.RunWorkerCompleted += (sender, args) => { if(shouldHideWhenDone) Dispatcher.InvokeIfRequired(() => _main.BusyIndicator.Visibility = Visibility.Collapsed, DispatcherPriority.Normal); var isGet = true; if((bool)args.Result) { if(_buffer.Length > 0) { var aurora = new AuroraAsset.AssetFile(_buffer); switch(task) { case Task.GetBoxart: _boxart.Load(aurora); Dispatcher.InvokeIfRequired(() => _main.BoxartTab.IsSelected = true, DispatcherPriority.Normal); break; case Task.GetBackground: _background.Load(aurora); Dispatcher.InvokeIfRequired(() => _main.BackgroundTab.IsSelected = true, DispatcherPriority.Normal); break; case Task.GetIconBanner: _iconBanner.Load(aurora); Dispatcher.InvokeIfRequired(() => _main.IconBannerTab.IsSelected = true, DispatcherPriority.Normal); break; case Task.GetScreenshots: _screenshots.Load(aurora); Dispatcher.InvokeIfRequired(() => _main.ScreenshotsTab.IsSelected = true, DispatcherPriority.Normal); break; default: isGet = false; break; } } if(shouldHideWhenDone && isGet) Dispatcher.InvokeIfRequired(() => Status.Text = "Finished grabbing assets from FTP", DispatcherPriority.Normal); else if(shouldHideWhenDone) Dispatcher.InvokeIfRequired(() => Status.Text = "Finished saving assets to FTP", DispatcherPriority.Normal); } else { switch(task) { case Task.GetBoxart: case Task.GetBackground: case Task.GetIconBanner: case Task.GetScreenshots: break; default: isGet = false; break; } if(isGet) Dispatcher.InvokeIfRequired(() => Status.Text = "Failed getting asset data... See error.log for more information...", DispatcherPriority.Normal); else Dispatcher.InvokeIfRequired(() => Status.Text = "Failed saving asset data... See error.log for more information...", DispatcherPriority.Normal); _isError = true; } _isBusy = false; }; Dispatcher.InvokeIfRequired(() => _main.BusyIndicator.Visibility = Visibility.Visible, DispatcherPriority.Normal); _isBusy = true; bw.RunWorkerAsync(); }