private void ExtractResources(Stream stream, Func <ResourceType, string, string> getResourcePath) { Stream resourceStream; var pbpStreamReader = new PbpReader(stream); if (pbpStreamReader.TryGetResourceStream(ResourceType.ICON0, stream, out resourceStream)) { ExtractResource(resourceStream, getResourcePath(ResourceType.ICON0, ".png")); } if (pbpStreamReader.TryGetResourceStream(ResourceType.ICON1, stream, out resourceStream)) { ExtractResource(resourceStream, getResourcePath(ResourceType.ICON1, ".pmf")); } if (pbpStreamReader.TryGetResourceStream(ResourceType.PIC0, stream, out resourceStream)) { ExtractResource(resourceStream, getResourcePath(ResourceType.PIC0, ".png")); } if (pbpStreamReader.TryGetResourceStream(ResourceType.PIC1, stream, out resourceStream)) { ExtractResource(resourceStream, getResourcePath(ResourceType.PIC1, ".png")); } if (pbpStreamReader.TryGetResourceStream(ResourceType.SND0, stream, out resourceStream)) { ExtractResource(resourceStream, getResourcePath(ResourceType.SND0, ".at3")); } }
static string GetPBPGameId(string srcPbp) { using (var stream = new FileStream(srcPbp, FileMode.Open, FileAccess.Read)) { var pbpStreamReader = new PbpReader(stream); return((string)pbpStreamReader.SFOData.Entries.First(e => e.Key == SFOKeys.DISC_ID).Value); } }
public void LoadPbp() { if (IsBusy) { MessageBox.Show(Window, "An operation is in progress. Please wait for the current operation to complete.", "PSXPackager", MessageBoxButton.OK, MessageBoxImage.Information); return; } var openFileDialog = new Ookii.Dialogs.Wpf.VistaOpenFileDialog(); openFileDialog.Filter = "PBP Files|*.pbp|All files|*.*"; var result = openFileDialog.ShowDialog(); if (!result.GetValueOrDefault(false)) { return; } var path = openFileDialog.FileName; try { using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { var pbpReader = new PbpReader(stream); var discs = pbpReader.Discs.Select((d, i) => { var game = _gameDb.GetEntryByScannerID(d.DiscID); var disc = new Disc() { Index = i, Title = game.GameName, Size = d.IsoSize, GameID = d.DiscID, IsRemoveEnabled = true, IsLoadEnabled = true, IsSaveAsEnabled = true, IsEmpty = false, SourceUrl = $"//pbp/disc{i}/{path}" }; disc.RemoveCommand = new RelayCommand((o) => Remove(disc)); return(disc); }).ToList(); var dummyDiscs = DummyDisc(discs.Count, 5 - discs.Count); Model.Discs = discs.Concat(dummyDiscs).ToList(); void LoadResource(ResourceType type, ResourceModel model) { if (pbpReader.TryGetResourceStream(type, stream, out var resourceStream)) { model.Icon = GetBitmapImage(resourceStream); model.IsLoadEnabled = true; model.IsSaveAsEnabled = true; model.IsRemoveEnabled = true; model.SourceUrl = $"//pbp/{type.ToString().ToLower()}/{path}"; } } LoadResource(ResourceType.ICON0, Model.Icon0); LoadResource(ResourceType.ICON1, Model.Icon1); LoadResource(ResourceType.PIC0, Model.Pic0); LoadResource(ResourceType.PIC1, Model.Pic1); Model.IsNew = false; } } catch (Exception e) { MessageBox.Show(Window, e.Message, "PSXPackager", MessageBoxButton.OK, MessageBoxImage.Warning); } }
public void Extract(ExtractOptions options, CancellationToken cancellationToken) { using (var stream = new FileStream(options.SourcePbp, FileMode.Open, FileAccess.Read)) { var pbpStreamReader = new PbpReader(stream); if (options.GenerateResourceFolders) { var disc = pbpStreamReader.Discs[0]; var gameInfo = options.FindGame(disc.DiscID); EnsureResourcePathExists(options, gameInfo); return; } if (options.ExtractResources) { var disc = pbpStreamReader.Discs[0]; var gameInfo = options.FindGame(disc.DiscID); EnsureResourcePathExists(options, gameInfo); if (string.IsNullOrEmpty(options.ResourceFoldersPath)) { options.ResourceFoldersPath = Path.GetDirectoryName(options.SourcePbp); } ExtractResources(stream, (type, extension) => GetResourcePath(options, gameInfo, type, extension)); return; } var ext = ".bin"; if (pbpStreamReader.Discs.Count > 1) { foreach (var disc in pbpStreamReader.Discs.Where(d => options.Discs.Contains(d.Index))) { var gameInfo = options.FindGame(disc.DiscID); if (gameInfo == null) { //var mainGameId = (string)pbpStreamReader.SFOData.Entries.FirstOrDefault(x => x.Key == SFOKeys.DISC_ID)?.Value; options.FileNameFormat = "%FILENAME%"; gameInfo = new GameEntry(); } var title = GetFilename(options.FileNameFormat, options.SourcePbp, disc.DiscID, gameInfo.SaveFolderName, gameInfo.GameName, gameInfo.SaveDescription, gameInfo.Format ); Notify?.Invoke(PopstationEventEnum.Info, $"Using Title '{title}'"); var discName = options.DiscName.Replace("{0}", disc.Index.ToString()); var isoPath = Path.Combine(options.OutputPath, $"{title} {discName}{ext}"); ExtractISO(disc, isoPath, options, cancellationToken); if (cancellationToken.IsCancellationRequested) { break; } } } else { var disc = pbpStreamReader.Discs[0]; var gameInfo = options.FindGame(disc.DiscID); if (gameInfo == null) { //var mainGameId = (string)pbpStreamReader.SFOData.Entries.FirstOrDefault(x => x.Key == SFOKeys.DISC_ID)?.Value; options.FileNameFormat = "%FILENAME%"; gameInfo = new GameEntry(); } var title = GetFilename(options.FileNameFormat, options.SourcePbp, disc.DiscID, gameInfo.SaveFolderName, gameInfo.GameName, gameInfo.SaveDescription, gameInfo.Format ); var isoPath = Path.Combine(options.OutputPath, $"{title}{ext}"); ExtractISO(disc, isoPath, options, cancellationToken); } Notify?.Invoke(PopstationEventEnum.ExtractComplete, null); } }