* morituri/common/common.py:

Add shrinkPath to write shorter path names.
	* morituri/test/test_common_common.py (added):
	  Add test.
	* morituri/program/cdparanoia.py:
	  Catch ENAMETOOLONG and shrink path.
	* morituri/common/program.py:
	  Update track result's filename if it was shrunk.
	* morituri/rip/cd.py:
	  set the possibly shrunk path on the result.
This commit is contained in:
Thomas Vander Stichele
2011-09-18 15:19:45 +00:00
parent 4fdfb7f58c
commit 2c27b73d09
6 changed files with 78 additions and 4 deletions

View File

@@ -21,6 +21,7 @@
# along with morituri. If not, see <http://www.gnu.org/licenses/>.
import os
import math
import tempfile
import shutil
@@ -254,3 +255,34 @@ class MissingDependencyException(Exception):
class EmptyError(Exception):
pass
def shrinkPath(path):
"""
Shrink a full path to a shorter version.
Used to handle ENAMETOOLONG
"""
parts = list(os.path.split(path))
length = len(parts[-1])
target = 127
if length <= target:
target = pow(2, int(math.log(length, 2))) - 1
name, ext = os.path.splitext(parts[-1])
target -= len(ext) + 1
# split on space, then reassemble
words = name.split(' ')
length = 0
pieces = []
for word in words:
if length + 1 + len(word) <= target:
pieces.append(word)
length += 1 + len(word)
else:
break
name = " ".join(pieces)
# ext includes period
parts[-1] = u'%s%s' % (name, ext)
path = os.path.join(*parts)
return path

View File

@@ -550,6 +550,9 @@ class Program(log.Loggable):
def ripTrack(self, runner, trackResult, offset, device, profile, taglist,
what=None):
"""
Ripping the track may change the track's filename as stored in
trackResult.
@param trackResult: the object to store information in.
@type trackResult: L{result.TrackResult}
@param number: track number (1-based)
@@ -583,6 +586,10 @@ class Program(log.Loggable):
trackResult.peak = t.peak
trackResult.quality = t.quality
if trackResult.filename != t.path:
trackResult.filename = t.path
self.info('Filename changed to %r', trackResult.filename)
def retagImage(self, runner, taglists):
cueImage = image.Image(self.cuePath)
t = image.ImageRetagTask(cueImage, taglists)