summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2013-11-06 00:45:32 +0400
committerMikhail Osipov <mike.osipov@gmail.com>2013-11-06 00:45:32 +0400
commit1c899a6f29e1fb65b26eb553162d13b63353c1ea (patch)
tree4e6601eb7d5e6c71e0ec0799265dd8a296e0e2cf
parent9562ccd81e1e77e41e9fc66fc367bd46baf3ff6b (diff)
new options --tag: tag existing files, do not split
-rwxr-xr-xcutter.py40
-rw-r--r--cutter/formats/command.py2
-rw-r--r--cutter/formats/flac.py12
-rw-r--r--cutter/formats/ogg.py12
-rw-r--r--cutter/splitter.py31
5 files changed, 67 insertions, 30 deletions
diff --git a/cutter.py b/cutter.py
index 2ed235b..0cc5b64 100755
--- a/cutter.py
+++ b/cutter.py
@@ -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))