summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2013-11-08 00:03:12 +0400
committerMikhail Osipov <mike.osipov@gmail.com>2013-11-08 00:48:48 +0400
commit3e13d3647c238f820428a66fc20049cf873510a0 (patch)
tree140212b96106c139ef20f86eda764e34977b6564
parentfb4b86da473f379fd5d389a6891a1cfe8a28d6c3 (diff)
code improvements
-rwxr-xr-xcutter.py14
-rw-r--r--cutter/cue.py66
-rw-r--r--cutter/formats/encoder.py8
3 files changed, 41 insertions, 47 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()
+ def parse_line(line):
+ data = line.split(None, 1)
+ cmd = data[0]
- nline = 0
+ if len(data) is 1:
+ 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)
- for line in cuefile.split("\n"):
- nline = nline + 1
- s = line.strip()
- if not len(s):
- continue
+ return False
- data = s.split(None, 1)
- if len(data) is 1:
- msg("invalid command \"%s\": arg missed", data[0])
- continue
+ cuefile = __read_file(filename, coding)
+ parser = CueParser()
- 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)
+ 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):