mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-11-12 01:30:49 +01:00
Add txtp_segmenter companion CLI tool
This commit is contained in:
parent
17a42caa21
commit
9a0b3e9261
135
cli/txtp_segmenter.py
Normal file
135
cli/txtp_segmenter.py
Normal file
@ -0,0 +1,135 @@
|
||||
# !/usr/bin/python
|
||||
|
||||
import os
|
||||
import sys
|
||||
import glob
|
||||
import argparse
|
||||
import re
|
||||
|
||||
|
||||
def parse():
|
||||
description = (
|
||||
"creates segmented .txtp from a list of files obtained using wildcards"
|
||||
)
|
||||
epilog = (
|
||||
"examples:\n"
|
||||
"%(prog)s bgm_*.ogg\n"
|
||||
"- get all files that start with bgm_ and end with .ogg\n"
|
||||
"%(prog)s bgm_??.* -n bgm_main.txtp -cls 2\n"
|
||||
"- get all files that start with bgm_ and end with 2 chars plus any extension\n"
|
||||
"%(prog)s files/bgm_*_all.ogg -s\n"
|
||||
"- create single .txtp per every bgm_(something)_all.ogg inside files dir\n"
|
||||
"%(prog)s **/*.ogg -l\n"
|
||||
"- find all .ogg in all subdirs but list only"
|
||||
"%(prog)s files/*.ogg -f .+(a|all)[.]ogg$\n"
|
||||
"- find all .ogg in files except those that end with 'a.ogg' or 'all.ogg'\n"
|
||||
)
|
||||
|
||||
parser = argparse.ArgumentParser(description=description, epilog=epilog, formatter_class=argparse.RawTextHelpFormatter)
|
||||
parser.add_argument("files", help="files to match")
|
||||
parser.add_argument("-n","--name", help="generated txtp name (adapts 'files' by default)")
|
||||
parser.add_argument("-f","--filter", help="filter matched files with regex")
|
||||
parser.add_argument("-s","--single", help="generate single files per list match", action='store_true')
|
||||
parser.add_argument("-l","--list", help="list only results and don't write", action='store_true')
|
||||
parser.add_argument("-cls","--command-loop-start", help="sets loop start segment")
|
||||
parser.add_argument("-cle","--command-loop-end", help="sets loop end segment")
|
||||
parser.add_argument("-cv","--command-volume", help="sets volume")
|
||||
parser.add_argument("-c","--command", help="sets any command (free text)")
|
||||
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def is_file_ok(args, glob_file):
|
||||
if not os.path.isfile(glob_file):
|
||||
return False
|
||||
|
||||
if glob_file.endswith(".py"):
|
||||
return False
|
||||
|
||||
if args.filter:
|
||||
filename_test = os.path.basename(glob_file)
|
||||
p = re.compile(args.filter)
|
||||
if (p.match(filename_test) != None):
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_txtp_name(args, segment):
|
||||
txtp_name = ''
|
||||
|
||||
if args.name:
|
||||
txtp_name = args.name
|
||||
|
||||
elif args.single:
|
||||
txtp_name = os.path.splitext(os.path.basename(segment))[0]
|
||||
|
||||
else:
|
||||
txtp_name = os.path.splitext(os.path.basename(args.files))[0]
|
||||
|
||||
txtp_name = txtp_name.replace('*', '')
|
||||
txtp_name = txtp_name.replace('?', '')
|
||||
|
||||
if txtp_name.endswith('_'):
|
||||
txtp_name = txtp_name[:-1]
|
||||
if txtp_name == '':
|
||||
txtp_name = 'bgm'
|
||||
|
||||
if not txtp_name.endswith(".txtp"):
|
||||
txtp_name += ".txtp"
|
||||
return txtp_name
|
||||
|
||||
def main():
|
||||
args = parse()
|
||||
|
||||
# get target files
|
||||
glob_files = glob.glob(args.files)
|
||||
|
||||
# process matches and add to output list
|
||||
files = []
|
||||
segments = []
|
||||
for glob_file in glob_files:
|
||||
if not is_file_ok(args, glob_file):
|
||||
continue
|
||||
|
||||
if args.single:
|
||||
name = get_txtp_name(args, glob_file)
|
||||
segments = [glob_file]
|
||||
files.append( (name,segments) )
|
||||
|
||||
else:
|
||||
segments.append(glob_file)
|
||||
|
||||
if not args.single:
|
||||
name = get_txtp_name(args, '')
|
||||
files.append( (name,segments) )
|
||||
|
||||
if not files or not segments:
|
||||
print("no files found")
|
||||
exit()
|
||||
|
||||
|
||||
# list info
|
||||
for name, segments in files:
|
||||
print("file: " + name)
|
||||
for segment in segments:
|
||||
print(" " + segment)
|
||||
|
||||
if args.list:
|
||||
exit()
|
||||
|
||||
# write resulting files
|
||||
for name, segments in files:
|
||||
with open(name,"w+") as ftxtp:
|
||||
for segment in segments:
|
||||
ftxtp.write(segment + "\n")
|
||||
if args.command_loop_start:
|
||||
ftxtp.write("loop_start_segment = " + args.command_loop_start + "\n")
|
||||
if args.command_loop_end:
|
||||
ftxtp.write("loop_end_segment = " + args.command_loop_end + "\n")
|
||||
if args.command_volume:
|
||||
ftxtp.write("commands = #@volume " + args.command_volume + "\n")
|
||||
if args.command:
|
||||
ftxtp.write(args.command + "\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user