Skip to main content

Library for analyzing and creating PS2 PSU game save files

Project description

pypsu

Installation

Use the following command to install the pypsu package with pip:

python -m pip install pypsu

Make sure the local bin path is in your path. If not, add it to ~/.bashrc or ~/.zshrc:

export PATH="$HOME/.local/bin:$PATH"

Usage

usage: psu [-h] [-v] {interactive,i,list,l,ls,create,c,import,im,export,e,rename,r,delete,d,del,rm} ...

Manipulate PS2 PSU game save files.

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit

Commands:
  {interactive,i,list,l,ls,create,c,import,im,export,e,rename,r,delete,d,del,rm}
    interactive (i)     Interactive command prompt.
    list (l, ls)        List the files and directories within the game save.
    create (c)          Create a PSU game save file.
    import (im)         Import a file from the local disk to the game save.
    export (e)          Export a file from the game save to the local disk.
    rename (r)          Rename a file within the game save.
    delete (d, del, rm)
                        Delete a file from within the game save.

List files

└─$ psu list BASCUS-97129.psu
total 9
d Dec 23 2022  0      BASCUS-97129
d Dec 23 2022  0      .
d Dec 23 2022  0      ..
- Dec 23 2022  964    icon.sys
- Dec 23 2022  44376  bkmo1.ico
- Dec 23 2022  44376  bkmo2.ico
- Dec 23 2022  44376  bkmo3.ico
- Dec 23 2022  3460   BASCUS-97129
- Dec 23 2022  3460   bkmo0.dat

Create PSU

└─$ psu create BASCUS-97129.psu
[+] PSU file "BASCUS-97129.psu" saved

Import file into PSU

└─$ psu import BASCUS-97129.psu bkmo0.dat
[+] bkmo0.dat imported to bkmo0.dat

Export file from PSU

└─$ psu export BASCUS-97129.psu bkmo0.dat
[+] bkmo0.dat exported to bkmo0.dat

Rename file in PSU

└─$ psu rename BASCUS-97129.psu bkmo0.dat bkmo1.dat
[+] bkmo0.dat renamed to bkmo1.dat

Delete file in PSU

└─$ psu delete BASCUS-97129.psu bkmo0.dat    
[+] bkmo0.dat deleted

Interactive mode

└─$ psu interactive BASCUS-97129.psu
# list
total 9
d Dec 23 2022  0      BASCUS-97129
d Dec 23 2022  0      .
d Dec 23 2022  0      ..
- Dec 23 2022  964    icon.sys        
- Dec 23 2022  44376  bkmo1.ico       
- Dec 23 2022  44376  bkmo2.ico       
- Dec 23 2022  44376  bkmo3.ico       
- Dec 23 2022  3460   BASCUS-97129    
- Dec 23 2022  3460   bkmo0.dat       

# export bkmo0.dat
[+] bkmo0.dat exported to bkmo0.dat
# import bkmo1.dat
[+] bkmo1.dat imported to bkmo1.dat
# rename bkmo3.ico bkmo4.ico
[+] bkmo3.ico renamed to bkmo4.ico
# list
total 10
d Dec 23 2022  0      BASCUS-97129
d Dec 23 2022  0      .
d Dec 23 2022  0      ..
- Dec 23 2022  964    icon.sys        
- Dec 23 2022  44376  bkmo1.ico       
- Dec 23 2022  44376  bkmo2.ico       
- Dec 23 2022  44376  bkmo4.ico       
- Dec 23 2022  3460   BASCUS-97129    
- Dec 23 2022  3460   bkmo0.dat       
- Jan 27 20:26 3460   bkmo1.dat       

# exit

API

PSU

Create a new file

psu = PSU.create('BASCUS-97129.psu')
psu.write('hello.txt', 'Hello World')
psu.save()

Read an existing file

psu = PSU.load('BASCUS-97129.psu')
print(psu.read('hello.txt').decode('UTF-8'))

Update an existing file

psu = PSU.load('BASCUS-97129.psu')
print(psu.read('hello.txt').decode('UTF-8'))
psu.write('hello.txt', 'Hello World New')
psu.save()

Import an existing file

psu = PSU.load('BASCUS-97129.psu')
psu.copy('/tmp/hello.txt', 'hello.txt')
psu.save()

Export an existing file

psu = PSU.load('BASCUS-97129.psu')
psu.export('hello.txt', '/tmp/hello.txt')
psu.save()

Remove an existing file

psu = PSU.load('BASCUS-97129.psu')
psu.delete('hello.txt')
psu.save()

Check if an entry exists by name

psu = PSU.load('BASCUS-97129.psu')
if psu.has('hello.txt'):
    print('hello.txt exists in BASCUS-97129.psu')
else:
    print('hello.txt does not exist in BASCUS-97129.psu')

Get an entry by name

psu = PSU.load('BASCUS-97129.psu')
entry = psu.get('hello.txt')
print(entry)

Check if an entry is a file

psu = PSU.load('BASCUS-97129.psu')
if psu.isFile('hello.txt'):
    print('hello.txt is a file')
else:
    print('hello.txt is not a file')

Check if an entry is a directory

psu = PSU.load('BASCUS-97129.psu')
if psu.isDirectory('.'):
    print('. is a file')
else:
    print('. is not a file')

Get a list of files / directories

psu = PSU.load('BASCUS-97129.psu')
for entry in psu.list():
    if entry.isFile():
        print(f'FILE: {entry.name: <16} ({entry.header.size} bytes)')
        continue
    if entry.isDirectory():
        print(f' DIR: {entry.name: <16} ({entry.header.size} entries)')
        continue

Reference

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pypsu-0.1.0.tar.gz (11.6 kB view details)

Uploaded Source

Built Distribution

pypsu-0.1.0-py2.py3-none-any.whl (11.5 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file pypsu-0.1.0.tar.gz.

File metadata

  • Download URL: pypsu-0.1.0.tar.gz
  • Upload date:
  • Size: 11.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.10

File hashes

Hashes for pypsu-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a0e80d1fd84c98a4f8935be0584dec303d17288cec2a96ff445267ee0d21fef9
MD5 884499f16ded1635fc7bdee52c17a6cf
BLAKE2b-256 7cdeb1f0fd956b9f5a8dfbe217f706349fcbfc0326827cf4845af173fd99486e

See more details on using hashes here.

File details

Details for the file pypsu-0.1.0-py2.py3-none-any.whl.

File metadata

  • Download URL: pypsu-0.1.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 11.5 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.10

File hashes

Hashes for pypsu-0.1.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 864fd2aff46f79c9a769c84e57740806a90980441723770f2f4a5ab3b4d27e01
MD5 37e024c7e2cacf68f7ae8968b9f93ebd
BLAKE2b-256 9a2132d1565ada14a571f4895fe03b15677c6001ee532f9d78fe1469fd2312a2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page