diff options
| -rwxr-xr-x | cutter.py | 40 | ||||
| -rw-r--r-- | cutter/formats/command.py | 2 | ||||
| -rw-r--r-- | cutter/formats/flac.py | 12 | ||||
| -rw-r--r-- | cutter/formats/ogg.py | 12 | ||||
| -rw-r--r-- | cutter/splitter.py | 31 |
5 files changed, 67 insertions, 30 deletions
@@ -5,7 +5,7 @@ from cutter.coding import to_unicode, to_bytes from cutter.splitter import Splitter, StreamInfo from cutter.tools import * -from optparse import OptionParser, OptionGroup +from optparse import OptionParser, OptionGroup, IndentedHelpFormatter import signal import sys @@ -56,7 +56,9 @@ def print_cue(cue): printf("\t\t%s: %s\n", k.upper(), quote(v)) def parse_args(): - parser = OptionParser(usage = u"Usage: %prog [options] cuefile") + parser = OptionParser(usage = u"Usage: %prog [options] cuefile", + formatter=IndentedHelpFormatter(max_help_position=40)) + parser.add_option("--ignore", action="store_true", default=False, dest="ignore", help="ignore cue parsing errors") @@ -64,7 +66,7 @@ def parse_args(): parser.add_option("--dump", dest="dump", choices=["cue", "tags", "tracks"], metavar="cue|tags|tracks", - help="print the cue sheet, file tags or track names") + help="print cue data, file tags or track names") parser.add_option("-n", "--dry-run", action="store_true", default=False, dest="dry_run") @@ -72,26 +74,36 @@ def parse_args(): parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False) - enc = OptionGroup(parser, "Encoding options") + general = OptionGroup(parser, "General options") - enc.add_option("-t", "--type", dest="type", - choices = formats.supported() + ["help"], - help="output file format") + general.add_option("--tag", + dest="tag", action="store_true", default=False, + help="tag existing files, do not split") - enc.add_option("--coding", dest="coding", + general.add_option("--coding", dest="coding", help="encoding of original text") - enc.add_option("-d", "--dir", + general.add_option("-d", "--dir", dest="dir", default=config.DIR, help="output directory") - enc.add_option("--use-tempdir", + general.add_option("--use-tempdir", dest="use_tempdir", action="store_true", help="use temporary directory for files") - enc.add_option("--no-tempdir", + general.add_option("--no-tempdir", dest="use_tempdir", action="store_false", help="do not use temporary directory") + general.add_option("--tracks", dest="tracks", help="select tracks") + + parser.add_option_group(general) + + enc = OptionGroup(parser, "Encoding options") + + enc.add_option("-t", "--type", dest="type", + choices = formats.supported() + ["help"], + help="output file format") + enc.add_option("-C", "--compression", type="int", dest="compression", metavar="FACTOR", help="compression factor for output format (used for flac, ogg)") @@ -100,8 +112,6 @@ def parse_args(): dest="bitrate", default=config.MP3_BITRATE, help="audio bitrate (used for mp3)") - enc.add_option("--tracks", dest="tracks", help="select tracks") - parser.add_option_group(enc) fname = OptionGroup(parser, "Filename options") @@ -143,8 +153,8 @@ def parse_args(): else: tag.add_option("--" + opt, dest=opt, default="") - tag.add_option("--track-total", type="int", dest="tracktotal") - tag.add_option("--track-start", type="int", dest="trackstart") + tag.add_option("--track-total", type="int", dest="tracktotal", metavar="TOTAL") + tag.add_option("--track-start", type="int", dest="trackstart", metavar="START") parser.add_option_group(tag) diff --git a/cutter/formats/command.py b/cutter/formats/command.py index 72f2e86..3641eae 100644 --- a/cutter/formats/command.py +++ b/cutter/formats/command.py @@ -20,7 +20,7 @@ class CommandError(Exception): class Command: def __init__(self, args, stdin=None, stdout=None, stderr=None): self.proc = None - self.status = 0 + self.status = None self.status_msg = "" try: diff --git a/cutter/formats/flac.py b/cutter/formats/flac.py index 6f47d94..46fde6d 100644 --- a/cutter/formats/flac.py +++ b/cutter/formats/flac.py @@ -1,8 +1,7 @@ from . sox import * +from . command import * from .. coding import to_bytes -import subprocess - class FlacHandler(SoxHandler): name = "flac" ext = "flac" @@ -20,13 +19,18 @@ class FlacHandler(SoxHandler): def tag(self, path, tags): args = ["metaflac", "--remove-all-tags", "--import-tags-from=-", path] - proc = subprocess.Popen(args, stdin = subprocess.PIPE) + proc = Command(args, stdin=PIPE) + if not proc.ready(): + return False + for k, v in tags.items(): if v is not "": proc.stdin.write(to_bytes("%s=%s\n" % (k.upper(), v))) + proc.stdin.close() + proc.close() - return proc.wait() is 0 + return proc.status is 0 def init(): return FlacHandler diff --git a/cutter/formats/ogg.py b/cutter/formats/ogg.py index dc6f9f3..cef7d20 100644 --- a/cutter/formats/ogg.py +++ b/cutter/formats/ogg.py @@ -1,8 +1,7 @@ from . sox import * +from . command import * from .. coding import to_bytes -import subprocess - class OggHandler(SoxHandler): name = "ogg" ext = "ogg" @@ -16,13 +15,18 @@ class OggHandler(SoxHandler): def tag(self, path, tags): args = ["vorbiscomment", "--raw", "--write", path] - proc = subprocess.Popen(args, stdin = subprocess.PIPE) + proc = Command(args, stdin=PIPE) + if not proc.ready(): + return False + for k, v in tags.items(): if v is not "": proc.stdin.write(to_bytes("%s=%s\n" % (k.upper(), v))) + proc.stdin.close() + proc.close() - return proc.wait() is 0 + return proc.status is 0 def init(): return OggHandler diff --git a/cutter/splitter.py b/cutter/splitter.py index 534815b..332ce50 100644 --- a/cutter/splitter.py +++ b/cutter/splitter.py @@ -205,6 +205,9 @@ class Splitter: def track_name(self, track): return self.track_info[track].name + def track_path(self, track): + return os.path.join(self.dest, self.track_name(track)) + def track_tags(self, track): return self.track_info[track].tags @@ -212,7 +215,17 @@ class Splitter: if not self.tag_supported: return - printf("tag %s: ", quote(self.track_name(track))) + trackname = path if self.opt.tag else self.track_name(track) + + printf("tag %s", quote(trackname)) + if not os.path.exists(path): + printf(": NOT EXISTS\n") + return + + printf("\n" if self.opt.dry_run else ": ") + if self.opt.dry_run: + return + if not self.encoder.tag(path, self.track_tags(track)): printf("FAILED\n") sys.exit(1) @@ -235,8 +248,7 @@ class Splitter: def copy_file(self, file): track = list(file.tracks())[0] - trackname = self.track_name(track) - path = os.path.join(self.dest, trackname) + path = self.track_path(track) printf("copy %s -> %s", quote(file.path), quote(path)) printf("\n" if self.opt.dry_run else ": ") @@ -335,7 +347,7 @@ class Splitter: continue trackname = self.track_name(track) - path = os.path.join(self.dest, trackname) + path = self.track_path(track) stream.seek(track.begin) reader = stream.get_reader(self.track_length(track)) @@ -388,6 +400,10 @@ class Splitter: def split(self): self.check_duplicates() + if self.opt.tag: + self.tag_files() + return + files = self.open_files() self.realpath = None @@ -409,6 +425,10 @@ class Splitter: printerr("rm %s failed: %s\n", self.dest, err) sys.exit(1) + def tag_files(self): + for track in self.all_tracks(): + self.tag(track, self.track_path(track)) + def all_tracks(self): if self.tracks: return self.tracks @@ -437,5 +457,4 @@ class Splitter: def dump_tracks(self): for track in self.all_tracks(): - trackname = self.track_name(track) - printf("%s\n", os.path.join(self.dest, trackname)) + printf("%s\n", self.track_path(track)) |
