diff --git a/picard/file.py b/picard/file.py index 82f80de33..c0e858d47 100644 --- a/picard/file.py +++ b/picard/file.py @@ -373,7 +373,8 @@ class File(LockableObject, Item): return False def _info(self, metadata, file): - metadata.length = int(file.info.length * 1000) + if hasattr(file.info, 'length'): + metadata.length = int(file.info.length * 1000) if hasattr(file.info, 'bitrate') and file.info.bitrate: metadata['~#bitrate'] = file.info.bitrate / 1000.0 if hasattr(file.info, 'sample_rate') and file.info.sample_rate: diff --git a/picard/formats/__init__.py b/picard/formats/__init__.py index 56bff0f89..5b01493cd 100644 --- a/picard/formats/__init__.py +++ b/picard/formats/__init__.py @@ -150,11 +150,13 @@ from picard.formats.apev2 import ( MusepackFile, OptimFROGFile, WavPackFile, + TAKFile, ) register_format(MusepackFile) register_format(WavPackFile) register_format(OptimFROGFile) register_format(MonkeysAudioFile) +register_format(TAKFile) from picard.formats.vorbis import ( FLACFile, diff --git a/picard/formats/apev2.py b/picard/formats/apev2.py index 0a9beaabd..e1532ab43 100644 --- a/picard/formats/apev2.py +++ b/picard/formats/apev2.py @@ -22,6 +22,7 @@ import mutagen.monkeysaudio import mutagen.musepack import mutagen.wavpack import mutagen.optimfrog +import mutagenext.tak from picard.file import File from picard.metadata import Metadata from picard.util import encode_filename, sanitize_date @@ -161,3 +162,12 @@ class MonkeysAudioFile(APEv2File): def _info(self, metadata, file): super(MonkeysAudioFile, self)._info(metadata, file) metadata['~format'] = self.NAME + +class TAKFile(APEv2File): + """TAK file.""" + EXTENSIONS = [".tak"] + NAME = "Tom's lossless Audio Kompressor" + _File = mutagenext.tak.TAK + def _info(self, metadata, file): + super(TAKFile, self)._info(metadata, file) + metadata['~format'] = self.NAME diff --git a/picard/formats/mutagenext/tak.py b/picard/formats/mutagenext/tak.py new file mode 100644 index 000000000..b4568cb8f --- /dev/null +++ b/picard/formats/mutagenext/tak.py @@ -0,0 +1,48 @@ +# Tom's lossless Audio Kompressor (TAK) reader/tagger +# +# Copyright 2008 Lukas Lalinsky +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# $$ + +"""Tom's lossless Audio Kompressor streams with APEv2 tags. + +TAK is a lossless audio compressor developed by Thomas Becker. + +For more information, see http://wiki.hydrogenaudio.org/index.php?title=TAK +and http://en.wikipedia.org/wiki/TAK_(audio_codec) +""" + +__all__ = ["TAK", "Open", "delete"] + +from mutagen.apev2 import APEv2File, error, delete + +class TAKHeaderError(error): pass + +class TAKInfo(object): + """TAK stream information. + + Attributes: + (none at the moment) + """ + + def __init__(self, fileobj): + header = fileobj.read(4) + if len(header) != 4 or not header.startswith("tBaK"): + raise TAKHeaderError("not a TAK file") + + def pprint(self): + return "Tom's lossless Audio Kompressor" + +class TAK(APEv2File): + _Info = TAKInfo + _mimes = ["audio/x-tak"] + + def score(filename, fileobj, header): + return header.startswith("tBaK") + filename.lower().endswith(".tak") + score = staticmethod(score) + +Open = TAK