예제 #1
0
        public void Extract(ExtractOptions options, CancellationToken cancellationToken)
        {
            using (var stream = new FileStream(options.SourcePbp, FileMode.Open, FileAccess.Read))
            {
                var pbpStreamReader = new PbpStreamReader(stream);


                var ext = ".bin";

                if (pbpStreamReader.Discs.Count > 1)
                {
                    foreach (var disc in pbpStreamReader.Discs.Where(d => options.Discs.Contains(d.Index)))
                    {
                        var gameInfo = options.GetGameInfo(disc.DiscID);

                        if (gameInfo == null)
                        {
                            //var mainGameId = (string)pbpStreamReader.SFOData.Entries.FirstOrDefault(x => x.Key == SFOKeys.DISC_ID)?.Value;
                            options.FileNameFormat = "%FILENAME%";
                            gameInfo = new GameInfo();
                        }

                        var title = GetFilename(options.FileNameFormat,
                                                options.SourcePbp,
                                                disc.DiscID,
                                                gameInfo.MainGameID,
                                                gameInfo.GameName,
                                                gameInfo.Title,
                                                gameInfo.Region
                                                );

                        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.GetGameInfo(disc.DiscID);

                    if (gameInfo == null)
                    {
                        //var mainGameId = (string)pbpStreamReader.SFOData.Entries.FirstOrDefault(x => x.Key == SFOKeys.DISC_ID)?.Value;
                        options.FileNameFormat = "%FILENAME%";
                        gameInfo = new GameInfo();
                    }

                    var title = GetFilename(options.FileNameFormat,
                                            options.SourcePbp,
                                            disc.DiscID,
                                            gameInfo.MainGameID,
                                            gameInfo.GameName,
                                            gameInfo.Title,
                                            gameInfo.Region
                                            );

                    var isoPath = Path.Combine(options.OutputPath, $"{title}{ext}");

                    ExtractISO(disc, isoPath, options, cancellationToken);
                }

                Notify?.Invoke(PopstationEventEnum.ExtractComplete, null);
            }
        }
예제 #2
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);
            }
        }