summaryrefslogtreecommitdiff
path: root/formats
diff options
context:
space:
mode:
Diffstat (limited to 'formats')
-rw-r--r--formats/__base__.py28
-rw-r--r--formats/__init__.py23
-rw-r--r--formats/flac.py33
-rw-r--r--formats/mp3.py116
-rw-r--r--formats/ogg.py33
-rw-r--r--formats/wav.py15
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