From 3e13d3647c238f820428a66fc20049cf873510a0 Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Fri, 8 Nov 2013 00:03:12 +0400 Subject: code improvements --- cutter.py | 14 ++++------ cutter/cue.py | 68 +++++++++++++++++++++++------------------------ cutter/formats/encoder.py | 8 +++--- 3 files changed, 42 insertions(+), 48 deletions(-) diff --git a/cutter.py b/cutter.py index 498d93a..5dcad53 100755 --- a/cutter.py +++ b/cutter.py @@ -269,24 +269,19 @@ def main(): if not process_options(options): sys.exit(1) - def on_error(err): - printerr("%d: %s\n" % (err.line, err)) - if not options.ignore: - raise StopIteration - cuepath = to_unicode(options.cuefile) if os.path.isdir(cuepath): cuepath = find_cuefile(cuepath) if options.dry_run: debug("use cue file %s", quote(cuepath)) + cuesheet = None + cue_error = lambda line, msg: printerr("%d: %s\n", line, msg) + try: - cuesheet = cue.read(cuepath, options.coding, on_error=on_error) - except StopIteration: - return 1 + cuesheet = cue.read(cuepath, options.coding, cue_error, options.ignore) except IOError as err: printerr("open %s: %s", err.filename, err.strerror) - return 1 except Exception as err: msg = "%s (%s)" % (err, err.__class__.__name__) @@ -295,6 +290,7 @@ def main(): else: printerr("%s\n", msg) + if not cuesheet: return 1 cuesheet.dir = os.path.dirname(cuepath) diff --git a/cutter/cue.py b/cutter/cue.py index bfa6128..fdc712d 100644 --- a/cutter/cue.py +++ b/cutter/cue.py @@ -1,3 +1,4 @@ +import itertools import codecs import sys import re @@ -12,7 +13,7 @@ class Track: try: self.number = int(number) except ValueError: - raise InvalidCommand("invalid number \"%s\"" % number) + raise InvalidCommand("invalid number '%s'" % number) self.type = datatype self._indexes = {} @@ -196,7 +197,7 @@ class CueParser: @staticmethod def parse_timestamp(time): if not CueParser.re_timestamp.match(time): - raise InvalidCommand("invalid timestamp \"%s\"" % time) + raise InvalidCommand("invalid timestamp '%s'" % time) m, s, f = map(int, time.split(":")) return (m * 60 + s) * 75 + f @@ -223,7 +224,7 @@ class CueParser: try: number = int(number) except ValueError: - raise InvalidCommand("invalid number \"%s\"" % number) + raise InvalidCommand("invalid number '%s'" % number) if number is 0 and "pregap" in self.track._attrs: raise InvalidCommand("conflict with previous PREGAP") if number in self.track._indexes: @@ -259,7 +260,7 @@ class CueParser: cmd = opt.lower() if value and cmd in self.rem_commands: if len(args): - raise InvalidCommand("extra arguments for \"%s\"" % opt) + raise InvalidCommand("extra arguments for '%s'" % opt) self.set_attr(cmd, value, obj = self.cue) def parse_skip(self, *args): @@ -328,41 +329,38 @@ def __read_file(filename, coding = None): return encoded -def read(filename, coding = None, on_error = None): - if on_error: - def msg(fmt, *args): - err = CueParserError(fmt % args) - err.line = nline - on_error(err) - else: - msg = lambda *args: None +def read(filename, coding=None, error_handler=None, ignore_errors=False): + def report(fmt, *args): + if error_handler: + error_handler(lineno, fmt % args) - cuefile = __read_file(filename, coding) - parser = CueParser() - - nline = 0 - - for line in cuefile.split("\n"): - nline = nline + 1 - s = line.strip() - if not len(s): - continue + def parse_line(line): + data = line.split(None, 1) + cmd = data[0] - data = s.split(None, 1) if len(data) is 1: - msg("invalid command \"%s\": arg missed", data[0]) - continue + report("invalid command '%s': arg missed", cmd) + else: + try: + parser.parse(*data) + return True + except UnknownCommand: + report("unknown command '%s'", cmd) + except InvalidContext: + report("invalid context for command '%s'", cmd) + except InvalidCommand as err: + report("invalid command '%s': %s", cmd, err) + except CueParserError as err: + report("%s", err) + + return False - try: - parser.parse(*data) - except UnknownCommand: - msg("unknown command \"%s\"", data[0]) - except InvalidContext: - msg("invalid context for command \"%s\"", data[0]) - except InvalidCommand as err: - msg("invalid command \"%s\": %s", data[0], err) - except CueParserError as err: - msg("%s", err) + cuefile = __read_file(filename, coding) + parser = CueParser() + + for line, lineno in zip(cuefile.split("\n"), itertools.count(1)): + if line and not parse_line(line.strip()) and not ignore_errors: + return None parser.calc_offsets() return parser.get_cue() diff --git a/cutter/formats/encoder.py b/cutter/formats/encoder.py index 43670b5..3f236c0 100644 --- a/cutter/formats/encoder.py +++ b/cutter/formats/encoder.py @@ -80,14 +80,14 @@ class Encoder: progress.init(self.reader.size()) - while True: - data = self.reader.read(self.FRAME_BUFFER_SIZE) - if not len(data): - break + data = self.reader.read(self.FRAME_BUFFER_SIZE) + while len(data): self.writer.writeframesraw(data) progress.update(len(data)) + data = self.reader.read(self.FRAME_BUFFER_SIZE) + progress.finish() def get_command(self): -- cgit v1.2.3-70-g09d2