aboutsummaryrefslogtreecommitdiff
path: root/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator')
-rw-r--r--devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/audFileDecode.py2
-rw-r--r--devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/audFileLib.py2
-rw-r--r--devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/quoteSpreadsheetCreator.py10
-rw-r--r--devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/sortBladeRunnerWavs02.py154
-rw-r--r--devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/treFileLib.py2
5 files changed, 107 insertions, 63 deletions
diff --git a/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/audFileDecode.py b/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/audFileDecode.py
index a46b3d8798..2c87108479 100644
--- a/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/audFileDecode.py
+++ b/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/audFileDecode.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python2.7
# -*- coding: UTF-8 -*-
#
import ctypes
diff --git a/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/audFileLib.py b/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/audFileLib.py
index 1adf4bc969..682a31e16c 100644
--- a/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/audFileLib.py
+++ b/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/audFileLib.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python2.7
# -*- coding: UTF-8 -*-
#
import os, sys, shutil
diff --git a/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/quoteSpreadsheetCreator.py b/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/quoteSpreadsheetCreator.py
new file mode 100644
index 0000000000..c1bdc84413
--- /dev/null
+++ b/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/quoteSpreadsheetCreator.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python2.7
+# -*- coding: UTF-8 -*-
+import sys
+if not (sys.version_info[0] == 2 and sys.version_info[1] == 7):
+ sys.stdout.write("Error:: Blade Runner Quotes Spreadsheet Creator script requires Python 2.7\n")
+ sys.exit(1)
+
+import sortBladeRunnerWavs02
+if __name__ == "__main__":
+ sortBladeRunnerWavs02.main(sys.argv[0:]) \ No newline at end of file
diff --git a/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/sortBladeRunnerWavs02.py b/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/sortBladeRunnerWavs02.py
index 4bc5bb7e23..b3f368ed40 100644
--- a/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/sortBladeRunnerWavs02.py
+++ b/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/sortBladeRunnerWavs02.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python2.7
# -*- coding: UTF-8 -*-
#
# Created by Praetorian (ShadowNate) for Classic Adventures in Greek
@@ -24,9 +24,12 @@ from treFileLib import *
#sys.setdefaultencoding('utf8')
company_email = "classic.adventures.in.greek@gmail.com"
-app_version = "0.50"
+app_version = "0.70"
app_name = "sortBladeRunnerWavs"
-app_name_spaced = "Sort Blade Runner Audio Speech Files"
+app_name_spaced = "Blade Runner Transcript Excel Creator (bare bones)"
+app_short_desc = "Create an Excel (.XLS) for transcribing Blade Runner. It can also extract TRE files and export WAV files for game's resources. "
+traceModeEnabled = False
+
stringReplacementForRootFolderWithExtractedFiles = ""
numReplaceStartingCharacters = 0
@@ -67,12 +70,18 @@ def calculateFoldHash(strFileName):
return hash
# Fill the actorPropertyEntries table
-def initActorPropertyEntries():
+def initActorPropertyEntries(thePathToActorNamesTxt):
global actorPropertyEntriesWasInit
global actorPropertyEntries
firstLine = True
# print "opening actornames"
- with open("./actornames.txt") as tsv:
+ if thePathToActorNamesTxt is None or not thePathToActorNamesTxt:
+
+ actorNamesTextFile = u'actornames.txt'
+ relPath = u'.'
+ thePathToActorNamesTxt = os.path.join(relPath, actorNamesTextFile)
+ print "Warning:: Actor names text file %s not found in arguments. Attempting to open local file if it exists" % (thePathToActorNamesTxt)
+ with open(thePathToActorNamesTxt) as tsv:
for line in csv.reader(tsv, dialect="excel-tab"):
#skip first line header
if firstLine == True:
@@ -122,7 +131,7 @@ def getActorShortNameAndLocalQuoteIdByAUDHashID(audHashId):
actorShortName = ''
actorLocalQuoteId = 0
if not actorPropertyEntriesWasInit:
- print "Error actor properties were not initialized!"
+ print "Error:: actor properties were not initialized!"
return (actorId, actorShortName, actorLocalQuoteId)
for actorEntryTmp in actorPropertyEntries:
@@ -155,7 +164,7 @@ def inputTLKsExtract(inputTLKpath, outputWAVpath):
# fileID
# segment offset
# file size
- print "Checking in %s for TLK files to extract to %s" % (inputTLKpath, outputWAVpath)
+ print "Info:: Checking in %s for TLK files to extract to %s" % (inputTLKpath, outputWAVpath)
inputTLKFilesFound = []
# breaking after first for loop yields only the top directory files, which is what we want
for (dirpath, dirnames, filenames) in walk(inputTLKpath):
@@ -165,18 +174,20 @@ def inputTLKsExtract(inputTLKpath, outputWAVpath):
inputTLKFilesFound.append(tlkTuple)
break
for tmpTLKfileTuple in inputTLKFilesFound:
- print "Found TLK: %s" % ('"' + inputTLKpath + tmpTLKfileTuple[0] + '"')
+ if traceModeEnabled:
+ print "Info:: Found TLK: %s" % ('"' + inputTLKpath + tmpTLKfileTuple[0] + '"')
errorFound = False
inTLKFile = None
#
# Create output folder if not exists at output path
- print "Ensuring output directory %s" % (os.path.join(outputWAVpath, tmpTLKfileTuple[1] ))
+ if traceModeEnabled:
+ print "Ensuring output directory %s" % (os.path.join(outputWAVpath, tmpTLKfileTuple[1] ))
ensure_dir(os.path.join(outputWAVpath, tmpTLKfileTuple[1] ) )
try:
inTLKFile = open(os.path.join(inputTLKpath,tmpTLKfileTuple[0]), 'rb')
except:
errorFound = True
- print "Unexpected error:", sys.exc_info()[0]
+ print "Error:: Unexpected error:", sys.exc_info()[0]
raise
if not errorFound:
tmpBuff = inTLKFile.read(2)
@@ -192,9 +203,10 @@ def inputTLKsExtract(inputTLKpath, outputWAVpath):
# 2 + 4 = 6 bytes short MIX header
# 12 bytes per TLK entry in entries table
# quick size validation
- print "Entries: %d, data segment %d bytes" % (numOfEntriesToExtract, allTlkFileSize)
+ if traceModeEnabled:
+ print "Entries: %d, data segment %d bytes" % (numOfEntriesToExtract, allTlkFileSize)
if allActualBytesInMixFile != 2 + 4 + 12 * numOfEntriesToExtract + allTlkFileSize:
- print "Error: TLK file size mismatch with reported size in header for %s!" % (tmpTLKfileTuple[0])
+ print "Error:: TLK file size mismatch with reported size in header for %s!" % (tmpTLKfileTuple[0])
else:
#
# 12 bytes per entry
@@ -213,7 +225,8 @@ def inputTLKsExtract(inputTLKpath, outputWAVpath):
tmpBuff = inTLKFile.read(4)
tmpRdTuple = struct.unpack('I', tmpBuff)
sizeOfAUDEntry = tmpRdTuple[0]
- print "Entry: %s, offset %s, data segment %s bytes" % (''.join('{:08X}'.format(idOfAUDEntry)), ''.join('{:08X}'.format(offsetOfAUDEntry)),''.join('{:08X}'.format(sizeOfAUDEntry)))
+ if traceModeEnabled:
+ print "Entry: %s, offset %s, data segment %s bytes" % (''.join('{:08X}'.format(idOfAUDEntry)), ''.join('{:08X}'.format(offsetOfAUDEntry)),''.join('{:08X}'.format(sizeOfAUDEntry)))
#
# put file in AUD object
# do we need AUD decode?
@@ -228,7 +241,7 @@ def inputTLKsExtract(inputTLKpath, outputWAVpath):
#
inTLKFile.seek(2 + 4 + 12*numOfEntriesToExtract + offsetOfAUDEntry)
if(offsetOfAUDEntry + sizeOfAUDEntry > allTlkFileSize):
- print "Error: AUD file size mismatch with reported size in entry header!"
+ print "Error:: AUD file size mismatch with reported size in entry header!"
else:
audFileBuffer = inTLKFile.read(sizeOfAUDEntry)
if (len(audFileBuffer) == sizeOfAUDEntry):
@@ -244,11 +257,12 @@ def inputTLKsExtract(inputTLKpath, outputWAVpath):
if not os.path.isfile(os.path.join(outputWAVpath, tmpTLKfileTuple[1], targetSimpleFileName) ):
thisAudFile.extract_as_wav(audFileBuffer, os.path.join(outputWAVpath, tmpTLKfileTuple[1], targetSimpleFileName) )
else:
- print "Output file %s already exists. Skipping..." % (os.path.join(outputWAVpath, tmpTLKfileTuple[1], targetSimpleFileName))
+ if traceModeEnabled:
+ print "Info:: Output file %s already exists. Skipping..." % (os.path.join(outputWAVpath, tmpTLKfileTuple[1], targetSimpleFileName))
else:
- print "Error while LOADING aud file!"
+ print "Error:: while LOADING aud file!"
else:
- print "Error while reading AUD file %s into mem buffer" % (''.join('{:08X}'.format(idOfAUDEntry)))
+ print "Error:: while reading AUD file %s into mem buffer" % (''.join('{:08X}'.format(idOfAUDEntry)))
inTLKFile.close()
@@ -257,7 +271,7 @@ def inputTLKsExtract(inputTLKpath, outputWAVpath):
return
def inputMIXExtractTREs(inputMIXpath, excelOutBook = None):
- print "Checking in %s for MIX files to extract TRE's from" % (inputMIXpath)
+ print "Info:: Checking in %s for MIX files to extract TRE's from" % (inputMIXpath)
inputMIXFilesFound = []
# breaking after first for loop yields only the top directory files, which is what we want
for (dirpath, dirnames, filenames) in walk(inputMIXpath):
@@ -267,7 +281,8 @@ def inputMIXExtractTREs(inputMIXpath, excelOutBook = None):
inputMIXFilesFound.append(mixFileName)
break
for tmpMIXfileName in inputMIXFilesFound:
- print "Found MIX: %s" % ('"' + inputMIXpath + tmpMIXfileName + '"')
+ if traceModeEnabled:
+ print "Found MIX: %s" % ('"' + inputMIXpath + tmpMIXfileName + '"')
errorFound = False
inMIXFile = None
#
@@ -275,7 +290,7 @@ def inputMIXExtractTREs(inputMIXpath, excelOutBook = None):
inMIXFile = open(os.path.join(inputMIXpath,tmpMIXfileName), 'rb')
except:
errorFound = True
- print "Unexpected error:", sys.exc_info()[0]
+ print "Error:: Unexpected error:", sys.exc_info()[0]
raise
if not errorFound:
totalTREs = 0
@@ -292,9 +307,10 @@ def inputMIXExtractTREs(inputMIXpath, excelOutBook = None):
# 2 + 4 = 6 bytes short MIX header
# 12 bytes per MIX entry in entries table
# quick size validation
- print "Entries: %d, data segment %d bytes" % (numOfEntriesToExtract, allMixFileSize)
+ if traceModeEnabled:
+ print "Entries: %d, data segment %d bytes" % (numOfEntriesToExtract, allMixFileSize)
if allActualBytesInMixFile != 2 + 4 + 12 * numOfEntriesToExtract + allMixFileSize:
- print "Error: MIX file size mismatch with reported size in header for %s!" % (tmpMIXfileName)
+ print "Error:: MIX file size mismatch with reported size in header for %s!" % (tmpMIXfileName)
else:
#
# 12 bytes per entry
@@ -323,7 +339,8 @@ def inputMIXExtractTREs(inputMIXpath, excelOutBook = None):
break
if (foundTREFile == True):
- print "Entry Name: %s, Entry ID: %s, offset %s, data segment %s bytes" % (currTreFileName, ''.join('{:08X}'.format(idOfMIXEntry)), ''.join('{:08X}'.format(offsetOfMIXEntry)),''.join('{:08X}'.format(sizeOfMIXEntry)))
+ if traceModeEnabled:
+ print "Entry Name: %s, Entry ID: %s, offset %s, data segment %s bytes" % (currTreFileName, ''.join('{:08X}'.format(idOfMIXEntry)), ''.join('{:08X}'.format(offsetOfMIXEntry)),''.join('{:08X}'.format(sizeOfMIXEntry)))
#
# IF TRE FILE:
# put file in TRE object
@@ -331,14 +348,15 @@ def inputMIXExtractTREs(inputMIXpath, excelOutBook = None):
#
inMIXFile.seek(2 + 4 + 12*numOfEntriesToExtract + offsetOfMIXEntry)
if(offsetOfMIXEntry + sizeOfMIXEntry > allMixFileSize):
- print "Error: TRE file size mismatch with reported size in entry header!"
+ print "Error:: TRE file size mismatch with reported size in entry header!"
else:
treFileBuffer = inMIXFile.read(sizeOfMIXEntry)
if (len(treFileBuffer) == sizeOfMIXEntry):
# load TRE file
thisTreFile = treFile()
if (thisTreFile.loadTreFile(treFileBuffer, allMixFileSize)):
- print "TRE file loaded"
+ if traceModeEnabled:
+ print "Info:: TRE file loaded"
if excelOutBook != None:
sh = excelOutBook.add_sheet(currTreFileName)
n = 0 # keeps track of rows
@@ -377,11 +395,11 @@ def inputMIXExtractTREs(inputMIXpath, excelOutBook = None):
# pass
totalTREs = totalTREs + 1
else:
- print "Error while LOADING TRE file!"
+ print "Error:: while LOADING TRE file!"
else:
- print "Error while reading TRE file %s into mem buffer" % (''.join('{:08X}'.format(idOfMIXEntry)))
+ print "Error:: while reading TRE file %s into mem buffer" % (''.join('{:08X}'.format(idOfMIXEntry)))
inMIXFile.close()
- print "Total TREs: %d " % (totalTREs)
+ print "Info:: Total TREs: %d " % (totalTREs)
return
@@ -494,15 +512,13 @@ def outputXLS(filename, sheet, list1, parseTREResourcesAlso = False, mixInputFol
#
# ########################
# main
-# 00_0000 -- DealsInInsects dupl TLK01, TLK0A
-# 00_0510 -- ThinkingOfChangingJobs-Leon dupl TLK02, TLK03
-# 00-8520 -- WhatDoYouKnow dupl TLK01, TLK0A
+def main(argsCL):
+ # TODO parse arguments using argparse? https://docs.python.org/3/library/argparse.html#module-argparse
+ global traceModeEnabled
+ traceModeEnabled = False
+
+ pathToActorNamesTxt = ""
-# Total unique quotes seems to be 5495!
-# TODO rename files in folders to conform to the underscore '_' and '-' format (a few don't -- let's have them all conforming!)
-# #########################
-#
-if __name__ == "__main__":
TMProotFolderWithExtractedFiles = ""
TMProotFolderWithInputTLKFiles = ""
@@ -510,50 +526,55 @@ if __name__ == "__main__":
extractTreFilesMode = False
invalidSyntax = False
-# print "Len of sysargv = %s" % (len(sys.argv))
- if len(sys.argv) == 2:
- if(sys.argv[1] == '--help'or sys.argv[1] == '-h'):
+ print "Running %s (%s)..." % (app_name_spaced, app_version)
+# print "Len of sysargv = %s" % (len(argsCL))
+ if len(argsCL) == 2:
+ if(argsCL[1] == '--help'or argsCL[1] == '-h'):
print "%s %s supports Blade Runner (English version, CD edition)." % (app_name_spaced, app_version)
+ print app_short_desc
print "Created by Praetorian of the classic adventures in Greek team."
print "Always keep backups!"
print "--------------------"
- print "Preparatory steps:"
- print "1. Put actornames.txt file in the same folder with this tool."
- print "--------------------"
- print "%s takes has one mandatory argument, the folder of the extracted WAV files:" % (app_name_spaced)
- print "Valid syntax: %s -ip [folderpath_for_TLK_Files] -op [folderpath_for_extracted_wav_Files] -m [stringPathToReplaceFolderpathInExcelLinks]" % (app_name)
+ print "%s takes has one mandatory argument, the folder of the extracted WAV files:" % (app_name)
+ print "Valid syntax: %s -op folderpath_for_extracted_wav_Files [-ip folderpath_for_TLK_Files] [-ian path_to_actornames_txt] [-m stringPathToReplaceFolderpathInExcelLinks] [-xwav] [-xtre] [--trace]" % (app_name)
print "The -op switch has an argument that is the path for extracted WAV files folder. The -op switch is REQUIRED always."
print "The -ip switch has an argument that is the path for the input (TLK or MIX) files folder (can be the same as the Blade Runner installation folder)."
print "The -m switch has an argument that is a replacement string for the path to the folder of extracted WAV files which will be used as a prefix for the links in the output XLS file."
print "The -xwav switch enables the WAV audio extract mode from the TLK files. It requires an INPUT path to be set with the -ip switch."
print "The -xtre switch enables the TRE parsing mode from the original MIX files. It requires an INPUT path to be set with the -ip switch."
+ print "The --trace switch enables more debug messages being printed during execution."
print "If the app finishes successfully a sortedWavs.xls file will be created in the same folder with the app."
print "--------------------"
print "Thank you for using this app."
print "Please provide any feedback to: %s " % (company_email)
sys.exit()
- elif(sys.argv[1] == '--version' or sys.argv[1] == '-v'):
+ elif(argsCL[1] == '--version' or argsCL[1] == '-v'):
print "%s %s supports Blade Runner (English version, CD edition)." % (app_name_spaced, app_version)
print "Please provide any feedback to: %s " % (company_email)
sys.exit()
else:
invalidSyntax = True
- elif len(sys.argv) > 2:
- for i in range(1, len(sys.argv)):
- if( i < (len(sys.argv) - 1) and sys.argv[i][:1] == '-' and sys.argv[i+1][:1] != '-'):
- if (sys.argv[i] == '-op'):
- TMProotFolderWithExtractedFiles = sys.argv[i+1]
+ elif len(argsCL) > 2:
+ for i in range(1, len(argsCL)):
+ if( i < (len(argsCL) - 1) and argsCL[i][:1] == '-' and argsCL[i+1][:1] != '-'):
+ if (argsCL[i] == '-op'):
+ TMProotFolderWithExtractedFiles = argsCL[i+1]
numReplaceStartingCharacters = len(TMProotFolderWithExtractedFiles)
- elif (sys.argv[i] == '-ip'):
- TMProotFolderWithInputTLKFiles = sys.argv[i+1]
- elif (sys.argv[i] == '-m'):
- stringReplacementForRootFolderWithExtractedFiles = sys.argv[i+1]
- elif (sys.argv[i] == '-xwav'):
+ elif (argsCL[i] == '-ip'):
+ TMProotFolderWithInputTLKFiles = argsCL[i+1]
+ elif (argsCL[i] == '-m'):
+ stringReplacementForRootFolderWithExtractedFiles = argsCL[i+1]
+ elif (argsCL[i] == '-ian'):
+ pathToActorNamesTxt = argsCL[i+1]
+ elif (argsCL[i] == '-xwav'):
print "Extract WAVs from TLK files mode enabled."
extractWavFilesMode = True
- elif (sys.argv[i] == '-xtre'):
+ elif (argsCL[i] == '-xtre'):
print "Extract TRE mode enabled."
extractTreFilesMode = True
+ elif argsCL[i] == '--trace':
+ print "Info:: Trace mode enabled (more debug messages)."
+ traceModeEnabled = True
if not TMProotFolderWithExtractedFiles: # this argument is mandatory
invalidSyntax = True
@@ -563,7 +584,7 @@ if __name__ == "__main__":
if not invalidSyntax:
# parse Actors files:
- initActorPropertyEntries()
+ initActorPropertyEntries(pathToActorNamesTxt)
# for actorEntryTmp in actorPropertyEntries:
# print "Found actor: %s %s %s" % (actorEntryTmp[0], actorEntryTmp[1], actorEntryTmp[2])
#
@@ -708,15 +729,28 @@ if __name__ == "__main__":
invalidSyntax = True
if invalidSyntax == True:
- print "Invalid syntax\n Try: \n %s -op [folderpath_for_extracted_wav_Files] \n %s --help for more info \n %s --version for version info " % (app_name, app_name, app_name)
+ print "Invalid syntax\n Try: \n %s --help for more info \n %s --version for version info " % (app_name, app_name)
+ print "Valid syntax: %s -op folderpath_for_extracted_wav_Files [-ip folderpath_for_TLK_Files] [-ian path_to_actornames_txt] [-m stringPathToReplaceFolderpathInExcelLinks] [-xwav] [-xtre] [--trace]" % (app_name)
tmpi = 0
- for tmpArg in sys.argv:
+ for tmpArg in argsCL:
if tmpi==0: #skip first argument
tmpi+=1
continue
print "\nArgument: %s" % (tmpArg)
tmpi+=1
+
+# 00_0000 -- DealsInInsects dupl TLK01, TLK0A
+# 00_0510 -- ThinkingOfChangingJobs-Leon dupl TLK02, TLK03
+# 00-8520 -- WhatDoYouKnow dupl TLK01, TLK0A
+
+# Total unique quotes seems to be 5495!
+# TODO rename files in folders to conform to the underscore '_' and '-' format (a few don't -- let's have them all conforming!)
+#
+# #########################
+#
+if __name__ == '__main__':
+ main(sys.argv[0:])
else:
## debug
- #print '%s was imported from another module' % (app_name_spaced,)
+ #print 'Debug:: %s was imported from another module' % (app_name)
pass
diff --git a/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/treFileLib.py b/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/treFileLib.py
index b9d147248d..29eac6a8e5 100644
--- a/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/treFileLib.py
+++ b/devtools/create_bladerunner/subtitles/quotesSpreadsheetCreator/treFileLib.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python2.7
# -*- coding: UTF-8 -*-
#
import os, sys, shutil