diff options
Diffstat (limited to 'formats')
| -rw-r--r-- | formats/__base__.py | 28 | ||||
| -rw-r--r-- | formats/__init__.py | 23 | ||||
| -rw-r--r-- | formats/flac.py | 33 | ||||
| -rw-r--r-- | formats/mp3.py | 116 | ||||
| -rw-r--r-- | formats/ogg.py | 33 | ||||
| -rw-r--r-- | formats/wav.py | 15 |
6 files changed, 0 insertions, 248 deletions
diff --git a/formats/__base__.py b/formats/__base__.py deleted file mode 100644 index f17748a..0000000 --- a/formats/__base__.py +++ /dev/null @@ -1,28 +0,0 @@ -class BaseHandler: - def __init__(self, logger = None): - self.logger = logger - self.buf = [] - - def log(self, fmt, *args): - if self.logger is not None: - self.logger(fmt, *args) - - def add(self, *args): - self.buf.extend(args) - - def build(self, join=True): - data = " ".join(self.buf) if join else self.buf - self.buf = [] - - return data - - def add_sox_args(self, opt, info): - if opt.sample_rate and opt.sample_rate != info.sample_rate: - self.add("-r %d" % opt.sample_rate) - if opt.bits_per_sample and opt.bits_per_sample != info.bits_per_sample: - self.add("-b %d" % opt.bits_per_sample) - if opt.channels and opt.channels != info.channels: - self.add("-c %d" % opt.channels) - - def is_tag_supported(self): - return hasattr(self, "tag") diff --git a/formats/__init__.py b/formats/__init__.py deleted file mode 100644 index 60a35fc..0000000 --- a/formats/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -import os - -path = os.path.dirname(__file__) or "." - -__formats = {} - -for entry in sorted(os.listdir(path)): - if not entry.endswith(".py") or entry.startswith("_"): - continue - - modname = entry.replace(".py", "") - mod = __import__(modname, globals(), locals(), ["init"], 1) - fmt = mod.init() - __formats[fmt.name] = fmt - -def supported(): - return sorted(__formats.keys()) - -def issupported(name): - return name in __formats - -def handler(name, logger = None): - return __formats.get(name)(logger) diff --git a/formats/flac.py b/formats/flac.py deleted file mode 100644 index 542aba2..0000000 --- a/formats/flac.py +++ /dev/null @@ -1,33 +0,0 @@ -from formats.__base__ import * -from coding import to_bytes - -import subprocess - -class FlacHandler(BaseHandler): - name = "flac" - ext = "flac" - - def encode(self, opt, info): - self.add("flac sox -") - - if opt.compression is not None: - self.add("-C %d" % opt.compression) - - self.add_sox_args(opt, info) - self.add("%f") - - return self.build() - - def tag(self, path, tags): - args = ["metaflac", "--remove-all-tags", "--import-tags-from=-", path] - - proc = subprocess.Popen(args, stdin = subprocess.PIPE) - for k, v in tags.items(): - if v is not "": - proc.stdin.write(to_bytes("%s=%s\n" % (k.upper(), v))) - proc.stdin.close() - - return proc.wait() is 0 - -def init(): - return FlacHandler diff --git a/formats/mp3.py b/formats/mp3.py deleted file mode 100644 index 67019cc..0000000 --- a/formats/mp3.py +++ /dev/null @@ -1,116 +0,0 @@ -from formats.__base__ import * -from coding import to_bytes - -import subprocess -import struct -import array - -def synchsafe(num): - if num <= 0x7f: - return num - - return synchsafe(num >> 7) << 8 | num & 0x7f - -class ID3Tagger: - # id3v2 frame mapping - __mapping = { - "album": "TALB", - "artist": "TPE1", - "composer": "TCOM", - "date": "TDRC", - "title": "TIT2", - "tracknumber": "TRCK", - } - - # id3v1 offsets - __offset = { - "title": 3, - "artist": 33, - "album": 63, - } - - @staticmethod - def header(size): - return struct.pack(">3s3BI", b"ID3", 4, 0, 0, synchsafe(size)) - - @staticmethod - def frame(name, data): - size = len(data) + 1 - hdr = struct.pack(">4sIHB", name, size, 0, 3) - return hdr + data - - def __init__(self): - self.frames = [] - - self.v1 = array.array("B", b"\x00" * 128) - struct.pack_into("3s", self.v1, 0, b"TAG") - struct.pack_into("B", self.v1, 127, 0xff) - - def frame_size(self): - return sum(map(len, self.frames)) - - def add(self, tag, value): - value = to_bytes(value) - - if tag in self.__mapping: - key = to_bytes(self.__mapping[tag]) - self.frames.append(self.frame(key, value)) - - off = self.__offset.get(tag) - if off: - struct.pack_into("30s", self.v1, off, value) - elif tag == "date": - struct.pack_into("4s", self.v1, 93, value) - elif tag == "tracknumber": - number = int(value.partition(b"/")[0]) - struct.pack_into("B", self.v1, 126, number) - - def write(self, path): - fp = open(path, "r+b") - data = fp.read() - - fp.seek(0) - fp.truncate(0) - - # save id3v2 - fp.write(self.header(self.frame_size())) - for frame in self.frames: - fp.write(frame) - - fp.write(data) - - # save id3v1 - self.v1.tofile(fp) - - fp.close() - -class Mp3Handler(BaseHandler): - name = "mp3" - ext = "mp3" - - def encode(self, opt, info): - self.add("cust ext=%s sox -" % self.ext) - - if opt.bitrate is not None: - self.add("-C %d" % opt.bitrate) - - self.add_sox_args(opt, info) - self.add("%f") - - return self.build() - - def tag(self, path, tags): - tagger = ID3Tagger() - - for k, v in tags.items(): - if v and k not in ("tracknumber", "tracktotal"): - tagger.add(k, v) - - number = "%d/%d" % (tags["tracknumber"], tags["tracktotal"]) - tagger.add("tracknumber", number) - - tagger.write(path) - return True - -def init(): - return Mp3Handler diff --git a/formats/ogg.py b/formats/ogg.py deleted file mode 100644 index 464ba8b..0000000 --- a/formats/ogg.py +++ /dev/null @@ -1,33 +0,0 @@ -from formats.__base__ import * -from coding import to_bytes - -import subprocess - -class OggHandler(BaseHandler): - name = "ogg" - ext = "ogg" - - def encode(self, opt, info): - self.add("cust ext=%s sox -" % self.ext) - - if opt.compression is not None: - self.add("-C %d" % opt.compression) - - self.add_sox_args(opt, info) - self.add("%f") - - return self.build() - - def tag(self, path, tags): - args = ["vorbiscomment", "--raw", "--write", path] - - proc = subprocess.Popen(args, stdin = subprocess.PIPE) - for k, v in tags.items(): - if v is not "": - proc.stdin.write(to_bytes("%s=%s\n" % (k.upper(), v))) - proc.stdin.close() - - return proc.wait() is 0 - -def init(): - return OggHandler diff --git a/formats/wav.py b/formats/wav.py deleted file mode 100644 index 66169fc..0000000 --- a/formats/wav.py +++ /dev/null @@ -1,15 +0,0 @@ -from formats.__base__ import * - -class WavHandler(BaseHandler): - name = "wav" - ext = "wav" - - def encode(self, opt, info): - self.add("wav sox -") - self.add_sox_args(opt, info) - self.add("%f") - - return self.build() - -def init(): - return WavHandler |
