# coding: utf-8 import os.path, uuid from db import Folder, Artist, session class FolderManager: SUCCESS = 0 INVALID_ID = 1 NAME_EXISTS = 2 INVALID_PATH = 3 PATH_EXISTS = 4 NO_SUCH_FOLDER = 5 @staticmethod def get(uid): if isinstance(uid, basestring): try: uid = uuid.UUID(uid) except: return FolderManager.INVALID_ID, None elif type(uid) is uuid.UUID: pass else: return FolderManager.INVALID_ID, None folder = Folder.query.get(uid) if not folder: return FolderManager.NO_SUCH_FOLDER, None return FolderManager.SUCCESS, folder @staticmethod def add(path): if Folder.query.filter(Folder.path == path and Folder.root == True).first(): return FolderManager.NAME_EXISTS path = os.path.abspath(path) if not os.path.isdir(path): return FolderManager.INVALID_PATH folder = Folder.query.filter(Folder.path == path).first() if folder: return FolderManager.PATH_EXISTS folder = Folder(root = True, path = path) session.add(folder) session.commit() return FolderManager.SUCCESS @staticmethod def delete(uid, scanner): status, folder = FolderManager.get(uid) if status != FolderManager.SUCCESS: return status if not folder.root: return FolderManager.NO_SUCH_FOLDER session.delete(folder) paths = session.query(Folder.path.like(folder.path + os.sep + '%')).delete() #for f in paths: #if not any (p.path in f.path for p in paths) and not f.root: #app.logger.debug('Deleting path with no parent: ' + f.path) #self.__session.delete(f) scanner.prune(folder) session.commit() return FolderManager.SUCCESS @staticmethod def delete_by_name(path, scanner): folder = Folder.query.filter(Folder.path == path and Folder.root == True).first() if not folder: return FolderManager.NO_SUCH_FOLDER return FolderManager.delete(folder.id, scanner) @staticmethod def scan(uid, scanner): status, folder = FolderManager.get(uid) if status != FolderManager.SUCCESS: return status scanner.scan(folder) scanner.prune(folder) return FolderManager.SUCCESS @staticmethod def prune(uid, scanner): status, folder = FolderManager.get(uid) if status != FolderManager.SUCCESS: return status scanner.prune(folder) return FolderManager.SUCCESS @staticmethod def error_str(err): if err == FolderManager.SUCCESS: return 'No error' elif err == FolderManager.INVALID_ID: return 'Invalid folder id' elif err == FolderManager.NAME_EXISTS: return 'There is already a folder with that name. Please pick another one.' elif err == FolderManager.INVALID_PATH: return "The path doesn't exists or isn't a directory" elif err == FolderManager.PATH_EXISTS: return 'This path is already registered' elif err == FolderManager.NO_SUCH_FOLDER: return 'No such folder' return 'Unknown error'