Пример #1
0
        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"));
            }
        }
Пример #2
0
 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);
     }
 }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
            }
        }