Git Product home page Git Product logo

sng-format-python's Introduction

sng-format-python


Python implementation for parsing and handling .sng files. See the .sng format spec for information.

It is capable of reading SNG files, extracting metadata, encoding audio to .opus file indexes, and file data.

I have not tested this end-to-end, but I've had zero issues with it so far.

Instalation

From pip

pip install sng-parser

From repository

git clone https://github.com/joshrmcdaniel/sng-format-python.git
cd sng-format-python
pip install -e .

Usage

foo@bar:~$ sng_parser -h
usage: 
sng_parser encode [-h] [-o path/to/encoded.sng] [-i] [-f] [-V sng_version] [-e] song_dir
sng_parser decode [-h] [-o path/to/out/folder] [-i] [-d relative/to/out_dir] [-f] sng_file

Decode/encode sng files

options:
  -h, --help       show this help message and exit
  -v               Logging level to use, more log info is shown by adding more `v`'s

action:
  Encode to or decode from an sng file. For futher usage, run sng_parser {encode|decode} -h

  {encode|decode}

foo@bar:~$ sng_parser encode -h
usage: sng_parser encode [-h] [-o path/to/encoded.sng] [-i] [-f] [-V sng_version] [-e] song_dir

positional arguments:
  song_dir              Directory to encode in the sng format

options:
  -h, --help            show this help message and exit
  -o path/to/encoded.sng, --out-file path/to/encoded.sng
                        The output path of the SNG file. Defaults to the md5 sum of the containing files of the target dir.
  -i, --ignore-nonsng-files
                        Allow encoding of files not allowed by the sng standard. Default: True.
  -f, --force           Overwrite existing files or directories. Default: False.
  -V sng_version, --version sng_version
                        sng format version to use.
  -e, --encode-audio    Encode the audio files to opus. Default: False.
foo@bar:~$ sng_parser decode -h
usage: sng_parser decode [-h] [-o path/to/out/folder] [-i] [-d relative/to/out_dir] [-f] sng_file

positional arguments:
  sng_file              Directory to encode in the sng format

options:
  -h, --help            show this help message and exit
  -o path/to/out/folder, --out-dir path/to/out/folder
                        The output directory of sng file's directory. Default: /your/working/dir (current working dir)
  -i, --ignore-nonsng-files
                        Allow decoding of files not allowed by the sng standard. Default: True
  -d relative/to/out_dir, --sng-dir relative/to/out_dir
                        The output directory containing the decoded sng file contents. Generated from metadata if not specified
  -f, --force           Overwrite existing files or directories. Defaults: False

The only functions a user should use for deconding and encoding is decode_sng, and encode_sng. The other functions are internal helpers.

decode_sng takes the following arguments:

  • Keyword or passed arg:
    • sng_file: os.PathLike | str | BufferedReader
      • Can be the path to the sng file to parse, or a buffer
  • Keyword only:
    • outdir: Optional[os.PathLike | str]
      • Output directory to write the song file to, defaults to the working directory
    • allow_nonsng_files: bool
      • Allow files encoded not specified by the sng stardard to be decoded, defaults to False
    • sng_dir: Optional[os.PathLike | str]
      • Directory containing the decoded files when writing to outdir, generated from metadata if not specified (<artist_name> - <song_name> (<charter>))
    • overwrite : bool
      • Overwrite the existing directory if it already exists, defaults to False

encode_sng takes the following arguments:

  • Keyword or passed arg:
    • dir_to_encode (os.PathLike): The directory containing files to be encoded into the SNG format
  • Keyword only:
    • output_filename: Optional[os.PathLike]
      • The path to the output SNG file. Defaults to the md5 sum of the containing files of converted dir.
    • allow_nonsng_files: Optional[bool]
      • Allow encoding of files not allowed by the sng standard. Defaults to False.
    • overwrite: Optional[bool]
      • If True, existing files or directories will be overwritten. Defaults to False.
    • version: Optional[int]
      • The version of the SNG format to use. Defaults to 1.
    • xor_mask: Optional[bytes]
      • XOR mask for encryption. If not provided, a random one is generated.
    • metadata: Optional[SngMetadataInfo]:
      • Metadata for the SNG package. If not provided, it's read from a 'song.ini' file in the directory.

Example usage

from sng_parser import decode_sng, encode_sng

outdir = 'test'
# Basic usage
## Decoding
decode_sng('example.sng', sng_dir=outdir)

## Encoding
encode_sng(outdir)

# Decode to `/name` with contents under `jeff` (sng files located in /name/jeff/)
decode_sng('example.sng', outdir='/name', sng_dir='jeff')

# Decode with file handler
with open('example.sng', 'rb') as f:
    decode_sng(f)

# Decode ignoring non-standard .sng files
decode_sng('example.sng', allow_nonsng_files=True)

# Encode ignoring non-standard .sng files
encode_sng(outdir, allow_nonsng_files=True)

sng-format-python's People

Contributors

joshrmcdaniel avatar

Watchers

 avatar

sng-format-python's Issues

CLI implementation

I want to write a CLI script within the package so I can encode/decode songs without writing a script writing relevant imports and code

Requirements:

  • no 3rd party imports. unless determined this cannot be done (highly unlikely, see argparse)
  • minimal modification to library

Validation prior to reading buffer

I want to validate the data types (uint, not, char, byte, etc) being read/written to the binary file, so if data is larger than the data type specified it will not write.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.