Dotfiles
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
3.8 KiB

10 years ago
#!/usr/bin/env python3
import os
import sys
import subprocess
import argparse
def main():
try:
return main_()
except SystemExit as e:
try:
return int(e.code)
except:
print(e.code)
return 1
def kvpair(x):
if x == "YES":
return True
elif x == "NO":
return False
elif x == "\\YES":
return "YES"
elif x == "\\NO":
return "NO"
else:
return x
def main_():
argp = argparse.ArgumentParser()
argp.add_argument("source", nargs="+")
argp.add_argument("destination")
argp.add_argument("-p", "--profile", choices=["aac", "m4a", "ogg", "wav", "wma"])
argp.add_argument("-u", "--update", help="Only process new files", action="store_true")
argp.add_argument("--avconv", default="avconv")
argp.add_argument("-m", nargs=2, action="append", type=kvpair, default=[])
argp.add_argument("-i", nargs=2, action="append", type=kvpair, default=[])
argp.add_argument("-o", nargs=2, action="append", type=kvpair, default=[])
args = argp.parse_args()
i_flags = dict()
o_flags = dict()
m_flags = dict()
# no video
o_flags["vn"] = True
m_flags["update"] = args.update
# capability checks
s = subprocess.check_output([args.avconv, "-codecs"], stderr=subprocess.DEVNULL)
if b"faac" in s:
aac = {"acodec": "faac"}
else:
aac = {"acodec": "aac", "strict": "experimental"}
if b"libvorbis" in s:
vorbis = {"acodec": "libvorbis"}
else:
vorbis = {"acodec": "vorbis", "strict": "experimental"}
# profiles
m_flags["fileext"] = "raw"
if args.profile == "aac":
m_flags["fileext"] = "aac"
o_flags.update(aac)
elif args.profile == "m4a":
m_flags["fileext"] = "m4a"
o_flags.update(aac)
elif args.profile == "ogg":
m_flags["fileext"] = "ogg"
o_flags.update(vorbis)
elif args.profile == "wav":
m_flags["fileext"] = "wav"
o_flags["acodec"] = "pcm_f32le"
elif args.profile == "wma":
m_flags["fileext"] = "wma"
o_flags["acodec"] = "wmav2"
o_flags["ac"] = 2
i_flags.update(dict(args.i))
o_flags.update(dict(args.o))
m_flags.update(dict(args.m))
if len(args.source) > 1:
run_multiple(m_flags, args.avconv, i_flags, args.source, o_flags, args.destination)
else:
run_once(m_flags, args.avconv, i_flags, args.source[0], o_flags, args.destination)
return 0
def make_destfile(source, m, destination):
if not os.path.isdir(destination):
return destination
stem, ext = os.path.splitext(source)
destfile = ".".join((stem, m["fileext"]))
return os.path.join(destination, destfile)
def add_args(argv, argdict):
for k,v in argdict.items():
argv.append("-%s" % k)
if v is not True:
argv.append(str(v))
def make_argv(m, avconv, i, source, o, destination):
argv = [avconv]
add_args(argv, i)
argv.append("-i")
argv.append(source)
add_args(argv, o)
argv.append(make_destfile(source, m, destination))
return argv
def run_once(m, avconv, i, source, o, destination):
dest = make_destfile(source, m, destination)
if m["update"] and os.path.exists(dest) and os.stat(dest).st_mtime >= os.stat(source).st_mtime:
return
try:
subprocess.check_call(make_argv(m, avconv, i, source, o, destination))
except subprocess.CalledProcessError as e:
raise SystemExit("Worker avconv process exited with nonzero return code: %i\nCommand was: %s\nAborting." % (e.returncode, e.cmd))
def run_multiple(m, avconv, i, sources, o, destination):
if not os.path.isdir(destination):
os.mkdir(destination)
for source in sources:
run_once(m, avconv, i, source, o, destination)
if __name__ == "__main__":
main()