diff --git a/ChangeLog b/ChangeLog index d75f957..4ff0dec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-05-01 Thomas Vander Stichele + + * morituri/common/common.py: + Create some common functions to parse MSF and back. + * morituri/image/toc.py: + Use it here. + 2009-05-01 Thomas Vander Stichele * examples/trm.py: diff --git a/morituri/common/common.py b/morituri/common/common.py new file mode 100644 index 0000000..6c6cdcb --- /dev/null +++ b/morituri/common/common.py @@ -0,0 +1,59 @@ +# -*- Mode: Python; test-case-name: morituri.test.test_common_common -*- +# vi:si:et:sw=4:sts=4:ts=4 + +# Morituri - for those about to RIP + +# Copyright (C) 2009 Thomas Vander Stichele + +# This file is part of morituri. +# +# morituri is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# morituri is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with morituri. If not, see . + +def msfToFrames(msf): + """ + Converts a string value in MM:SS:FF to frames + + @param msf: + @type msf: str + + @rtype int + @returns number of frames + """ + if not ':' in msf: + return int(msf) + + m, s, f = msf.split(':') + + return 60 * 75 * int(m) + 75 * int(s) + int(f) + +def framesToMSF(frames): + f = frames % 75 + frames -= f + s = (frames / 75) % 60 + frames -= s * 60 + m = frames / 75 / 60 + + return "%02d:%02d:%02d" % (m, s, f) + +def framesToHMSF(frames): + # cdparanoia style + f = frames % 75 + frames -= f + s = (frames / 75) % 60 + frames -= s * 75 + m = (frames / 75 / 60) % 60 + frames -= m * 75 * 60 + h = frames / 75 / 60 / 60 + + return "%02d:%02d:%02d.%02d" % (h, m, s, f) diff --git a/morituri/image/toc.py b/morituri/image/toc.py index 0d68f43..a2aa701 100644 --- a/morituri/image/toc.py +++ b/morituri/image/toc.py @@ -27,6 +27,8 @@ Reading .toc files import os import re +from morituri.common import common + # header _CATALOG_RE = re.compile(r'^CATALOG "(?P\d+)"$') @@ -115,7 +117,7 @@ class TOC: m = _SILENCE_RE.search(line) if m: length = m.group('length') - currentLength += self._parseMSF(length) + currentLength += common.msfToFrames(length) # look for FILE lines m = _FILE_RE.search(line) @@ -124,8 +126,8 @@ class TOC: start = m.group('start') length = m.group('length') currentFile = File(filePath, start, length) - #currentOffset += self._parseMSF(start) - currentLength += self._parseMSF(length) + #currentOffset += common.msfToFrames(start) + currentLength += common.msfToFrames(length) # look for START lines m = _START_RE.search(line) @@ -135,7 +137,7 @@ class TOC: print 'ouch' continue - length = self._parseMSF(m.group('length')) + length = common.msfToFrames(m.group('length')) currentTrack.index(0, currentOffset, currentFile) currentLength += length pregapLength = length @@ -146,7 +148,7 @@ class TOC: if not currentTrack: self.message(number, 'INDEX without preceding TRACK') indexNumber += 1 - offset = self._parseMSF(m.group('offset')) + offset = common.msfToFrames(m.group('offset')) currentTrack.index(indexNumber, offset, currentFile) # handle index 1 of final track, if any @@ -210,13 +212,6 @@ class TOC: raise KeyError, "Cannot find file for %s" % path - def _parseMSF(self, msf): - # parse str value in MM:SS:FF to frames - if not ':' in msf: - return int(msf) - m, s, f = msf.split(':') - return 60 * 75 * int(m) + 75 * int(s) + int(f) - class File: """ I represent a FILE line in a .toc file.