summaryrefslogtreecommitdiff
path: root/directory.py
diff options
context:
space:
mode:
Diffstat (limited to 'directory.py')
-rw-r--r--directory.py70
1 files changed, 33 insertions, 37 deletions
diff --git a/directory.py b/directory.py
index 2b79126..1518c7a 100644
--- a/directory.py
+++ b/directory.py
@@ -5,19 +5,15 @@ from config import config
class DirectoryEntry(object):
'''Base class for directory entries.'''
- def __init__(self, path, isabs = False, track = None, metadata = {}):
+ def __init__(self, path, track = None, metadata = {}):
self.path = path
self.track = track
self.metadata = metadata
- if isabs:
- self.abs_path = path
- else:
- path_list = os.path.split(config.get('music_root')) + os.path.split(self.path)
- if '..' in path_list:
- raise Exception('Invalid path')
+ if '..' in path.split():
+ raise Exception('Invalid path')
- self.abs_path = os.path.normpath(os.path.sep.join(path_list))
+ self.rel_path = os.path.relpath(path, config.get('music_root'))
def __cmp__(self, other):
return cmp(self.path, other.path)
@@ -26,10 +22,10 @@ class DirectoryEntry(object):
return self.path < other.path
def __str__(self):
- return '<a href="/files/{path}">{name}</a><br />'.format(path = self.path, name = os.path.basename(self.path))
+ return '<a href="/files/{path}">{name}</a><br />'.format(path = self.rel_path, name = os.path.basename(self.path))
def json(self):
- return {'type': self.entry_type, 'name': self.path, 'track': self.track, 'metadata': self.metadata}
+ return {'type': self.entry_type, 'name': self.rel_path, 'track': self.track, 'metadata': self.metadata}
class Directory(DirectoryEntry):
'''A directory entry inside a directory.'''
@@ -40,14 +36,13 @@ class Directory(DirectoryEntry):
directories = []
files = []
- for f in os.listdir(self.abs_path):
- abs_path = os.path.join(self.abs_path, f)
- rel_path = os.path.relpath(abs_path, config.get('music_root'))
- if os.path.isdir(abs_path):
- directories.append(Directory(rel_path))
- elif os.path.isfile(abs_path):
+ for f in os.listdir(self.path):
+ path = os.path.join(self.path, f)
+ if os.path.isdir(path):
+ directories.append(Directory(path))
+ elif os.path.isfile(path):
if os.path.splitext(f)[1] == '.cue':
- cue = cuesheet.Cuesheet(abs_path)
+ cue = cuesheet.Cuesheet(path)
for t in cue.tracks:
metadata = {}
info = cue.info[0]
@@ -57,10 +52,10 @@ class Directory(DirectoryEntry):
metadata['album'] = info.title
if t.title:
metadata['title'] = t.title
- files.append(File(rel_path, track = t.track[0], metadata = metadata))
+ files.append(File(path, track = t.track[0], metadata = metadata))
else:
metadata = {}
- tags = mutagen.File(abs_path) or []
+ tags = mutagen.File(path) or []
if isinstance(tags, mutagen.mp3.MP3):
for id3, tn in (('TPE1', 'artist'), ('TALB', 'album'), ('TIT2', 'title')):
if id3 in tags:
@@ -69,7 +64,7 @@ class Directory(DirectoryEntry):
for tn in ('artist', 'album', 'title'):
if tn in tags:
metadata[tn] = tags[tn][0].encode('utf-8')
- files.append(File(rel_path, metadata = metadata))
+ files.append(File(path, metadata = metadata))
return sorted(directories) + sorted(files)
class File(DirectoryEntry):
@@ -82,8 +77,8 @@ class File(DirectoryEntry):
if do_range:
file_range = environ['HTTP_RANGE'].split('bytes=')[1]
- mime = mimetypes.guess_type(self.abs_path, strict = False)[0] or 'application/octet-stream'
- size = os.path.getsize(self.abs_path)
+ mime = mimetypes.guess_type(self.path, strict = False)[0] or 'application/octet-stream'
+ size = os.path.getsize(self.path)
if do_range:
start, end = [int(x or 0) for x in file_range.split('-')]
if end == 0:
@@ -94,7 +89,7 @@ class File(DirectoryEntry):
('Content-Range', 'bytes {start}-{end}/{size}'.format(start = start, end = end, size = size)),
('Content-Length', str(end - start + 1))])
- f = open(self.abs_path, 'rb')
+ f = open(self.path, 'rb')
f.seek(start)
remaining = end-start+1
s = f.read(min(remaining, 1024))
@@ -107,22 +102,22 @@ class File(DirectoryEntry):
start_response('200 OK', [
('Content-Type', mime),
('Content-Length', str(size))])
- return open(self.abs_path, 'rb')
+ return open(self.path, 'rb')
def get_cache_path(self):
- cache_path = os.path.join(config.get('cache_dir'), self.path)
+ cache_path = os.path.join(config.get('cache_dir'), self.rel_path)
cache_path = os.path.splitext(cache_path)[0]
if self.track:
- cache_path += '.' + self.track
+ cache_path += '.' + str(self.track)
cache_path += '.ogg'
return cache_path
def get_cache_file(self):
- return File(self.get_cache_path(), True)
+ return File(self.get_cache_path())
def recode(self, decoder, encoder, sessionid = None):
if self.track:
- cue = cuesheet.Cuesheet(self.abs_path)
+ cue = cuesheet.Cuesheet(self.path)
t = cue.tracks[int(self.track)-1]
start_time = t.get_start_time()
next = cue.get_next(t)
@@ -130,9 +125,9 @@ class File(DirectoryEntry):
end_time = next.get_start_time()
else:
end_time = None
- path = os.path.join(os.path.dirname(self.abs_path), cue.info[0].file[0])
+ path = os.path.join(os.path.dirname(self.path), cue.info[0].file[0])
else:
- path = self.abs_path
+ path = self.path
start_time, end_time = None, None
decoder = recode.decoders[decoder]()
@@ -146,12 +141,12 @@ class File(DirectoryEntry):
os.makedirs(cache_path_dir)
# check if file is cached
if not os.path.exists(cache_path):
- events.event_pub.recoding(self.path, self.track)
+ events.event_pub.recoding(self.rel_path, self.track)
recoder.recode(path, cache_path, start_time = start_time, end_time = end_time)
- events.event_pub.cached(self.path, self.track)
+ events.event_pub.cached(self.rel_path, self.track)
if sessionid:
- events.event_pub.play(sessionid, '/cache/{0}'.format(self.path))
+ events.event_pub.play(sessionid, '/cache/{0}'.format(self.rel_path))
def start_recode(self, decoder, encoder, sessionid = None):
recode.RecodeThread.add((self.recode, decoder, encoder, sessionid))
@@ -162,13 +157,14 @@ class File(DirectoryEntry):
d.update({'cached': os.path.exists(cache_path)})
return d
-def rec_scan(session, root):
- directory = db.Directory.get(session, root)
+def rec_scan(session, root, parent_id = None):
+ directory = db.Directory.get(session, root, parent_id)
- d = Directory(root, isabs = True)
+ d = Directory(root)
for de in d.listdir():
if isinstance(de, Directory):
- rec_scan(session, de.abs_path)
+ print 'id:', directory.id
+ rec_scan(session, de.path, directory.id)
else:
print de.metadata
artist = db.Artist.get(session, de.metadata['artist']) if 'artist' in de.metadata else None