From 2c49a03494ec2cebf2c820efb257c950f170face Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Tue, 23 Aug 2011 13:54:59 +0200 Subject: Read tracks and directories from the database. --- directory.py | 70 ++++++++++++++++++++++++++++-------------------------------- 1 file changed, 33 insertions(+), 37 deletions(-) (limited to 'directory.py') 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 '{name}
'.format(path = self.path, name = os.path.basename(self.path)) + return '{name}
'.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 -- cgit v1.2.3