def run_scan(): remove_missing() prefs = settings.preferences prefix = os.path.join(os.path.expanduser(prefs['libraryPath']), 'Books' + os.sep) if not prefix[-1] == os.sep: prefix += os.sep assert isinstance(prefix, str) books = [] for root, folders, files in os.walk(prefix): for f in files: if not state.tasks.connected: return #if f.startswith('._') or f == '.DS_Store': if f.startswith('.'): continue f = os.path.join(root, f) ext = f.split('.')[-1] if ext in extensions: books.append(f) position = 0 added = 0 for f in ox.sorted_strings(books): if not state.tasks.connected: return position += 1 with db.session(): id = media.get_id(f) file = File.get(id) if not file: file = add_file(id, f, prefix, f) added += 1 trigger_event('change', {})
def run_scan(): remove_missing() prefs = settings.preferences prefix = os.path.join(os.path.expanduser(prefs["libraryPath"]), "Books" + os.sep) if not prefix[-1] == os.sep: prefix += os.sep assert isinstance(prefix, str) books = [] for root, folders, files in os.walk(prefix): for f in files: if not state.tasks.connected: return # if f.startswith('._') or f == '.DS_Store': if f.startswith("."): continue f = os.path.join(root, f) ext = f.split(".")[-1] if ext in extensions: books.append(f) position = 0 added = 0 for f in ox.sorted_strings(books): if not state.tasks.connected: return position += 1 with db.session(): id = media.get_id(f) file = File.get(id) if not file: file = add_file(id, f, prefix, f) added += 1 trigger_event("change", {})
def autocompleteFolder(data): ''' takes { path } returns { items } ''' path = data['path'] path = os.path.expanduser(path) if os.path.isdir(path): if path.endswith('/') and path != '/': path = path[:-1] folder = path name = '' else: folder, name = os.path.split(path) if os.path.exists(folder): prefix, folders, files = next(os.walk(folder)) folders = [ os.path.join(prefix, f) for f in folders if (not name or f.startswith(name)) and not f.startswith('.') ] if prefix == path: folders = [path] + folders else: folders = [] return {'items': ox.sorted_strings(folders)}
def autocompleteFolder(data): ''' takes { path } returns { items } ''' path = data['path'] path = os.path.expanduser(path) if os.path.isdir(path): if path.endswith('/') and path != '/': path = path[:-1] folder = path name = '' else: folder, name = os.path.split(path) if os.path.exists(folder): prefix, folders, files = next(os.walk(folder)) folders = [os.path.join(prefix, f) for f in folders if (not name or f.startswith(name)) and not f.startswith('.')] if prefix == path: folders = [path] + folders else: folders = [] return { 'items': ox.sorted_strings(folders) }
def average_color(prefix, start=0, end=0, mode='antialias'): height = 64 frames = 0 pixels = [] color = np.asarray([0, 0, 0], dtype=np.float32) if end: start = int(start * 25) end = int(end * 25) mode = 'timeline' + mode timelines = ox.sorted_strings( filter(lambda t: t != '%s%s%sp.jpg' % (prefix, mode, height), glob("%s%s%sp*.jpg" % (prefix, mode, height)))) for image in timelines: start_offset = 0 if start and frames + 1500 <= start: frames += 1500 continue timeline = Image.open(image) frames += timeline.size[0] if start and frames > start > frames - timeline.size[0]: start_offset = start - (frames - timeline.size[0]) box = (start_offset, 0, timeline.size[0], height) timeline = timeline.crop(box) if end and frames > end: end_offset = timeline.size[0] - (frames - end) box = (0, 0, end_offset, height) timeline = timeline.crop(box) p = np.asarray(timeline.convert('RGB'), dtype=np.float32) p = np.sum(p, axis=0) / height #average color per frame pixels.append(p) if end and frames >= end: break if end: frames = end - start if frames: for i in range(0, len(pixels)): p = np.sum(pixels[i], axis=0) / frames color += p color = list(map(float, color)) return ox.image.getHSL(color)
def average_color(prefix, start=0, end=0, mode='antialias'): height = 64 frames = 0 pixels = [] color = np.asarray([0, 0, 0], dtype=np.float32) if end: start = int(start * 25) end = int(end * 25) mode = 'timeline' + mode timelines = ox.sorted_strings(filter(lambda t: t!= '%s%s%sp.jpg'%(prefix, mode, height), glob("%s%s%sp*.jpg"%(prefix, mode, height)))) for image in timelines: start_offset = 0 if start and frames + 1500 <= start: frames += 1500 continue timeline = Image.open(image) frames += timeline.size[0] if start and frames > start > frames-timeline.size[0]: start_offset = start - (frames-timeline.size[0]) box = (start_offset, 0, timeline.size[0], height) timeline = timeline.crop(box) if end and frames > end: end_offset = timeline.size[0] - (frames - end) box = (0, 0, end_offset, height) timeline = timeline.crop(box) p = np.asarray(timeline.convert('RGB'), dtype=np.float32) p = np.sum(p, axis=0) / height #average color per frame pixels.append(p) if end and frames >= end: break if end: frames = end - start if frames: for i in range(0, len(pixels)): p = np.sum(pixels[i], axis=0) / frames color += p color = list(map(float, color)) return ox.image.getHSL(color)
def run_import(options=None): options = options or {} logger.debug('run_import') prefs = settings.preferences prefix = os.path.expanduser(options.get('path', prefs['importPath'])) if os.path.islink(prefix): prefix = os.path.realpath(prefix) if not prefix[-1] == os.sep: prefix += os.sep prefix_books = os.path.join(os.path.expanduser(prefs['libraryPath']), 'Books' + os.sep) prefix_imported = os.path.join(prefix_books, 'Imported' + os.sep) if prefix_books.startswith(prefix) or prefix.startswith(prefix_books): error = 'invalid path' elif not os.path.exists(prefix): error = 'path not found' elif not os.path.isdir(prefix): error = 'path must be a folder' else: error = None if error: trigger_event( 'activity', { 'activity': 'import', 'progress': [0, 0], 'status': { 'code': 404, 'text': error } }) state.activity = {} return listname = options.get('list') if listname: listitems = [] assert isinstance(prefix, str) books = [] count = 0 for root, folders, files in os.walk(prefix): for f in files: if not state.tasks.connected: return #if f.startswith('._') or f == '.DS_Store': if f.startswith('.'): continue f = os.path.join(root, f) ext = f.split('.')[-1] if ext in extensions: books.append(f) count += 1 if state.activity.get('cancel'): state.activity = {} return if count % 1000 == 0: state.activity = { 'activity': 'import', 'path': prefix, 'progress': [0, count], } trigger_event('activity', state.activity) state.activity = { 'activity': 'import', 'path': prefix, 'progress': [0, len(books)], } trigger_event('activity', state.activity) position = 0 added = 0 last = 0 for f in ox.sorted_strings(books): position += 1 if not os.path.exists(f): continue with db.session(): id = media.get_id(f) file = File.get(id) if not file: f_import = f f = f.replace(prefix, prefix_imported) ox.makedirs(os.path.dirname(f)) if options.get('mode') == 'move': shutil.move(f_import, f) else: shutil.copy(f_import, f) file = add_file(id, f, prefix_books, f_import) file.move() added += 1 if listname: listitems.append(file.item.id) if time.time() - last > 5: last = time.time() state.activity = { 'activity': 'import', 'progress': [position, len(books)], 'path': prefix, 'added': added, } trigger_event('activity', state.activity) if state.activity.get('cancel'): state.activity = {} return with db.session(): if listname and listitems: l = List.get(settings.USER_ID, listname) if l: l.add_items(listitems) trigger_event( 'activity', { 'activity': 'import', 'progress': [position, len(books)], 'path': prefix, 'status': { 'code': 200, 'text': '' }, 'added': added, }) state.activity = {} remove_empty_folders(prefix_books) if options.get('mode') == 'move': remove_empty_folders(prefix)
def run_import(options=None): options = options or {} logger.debug("run_import") prefs = settings.preferences prefix = os.path.expanduser(options.get("path", prefs["importPath"])) if os.path.islink(prefix): prefix = os.path.realpath(prefix) if not prefix[-1] == os.sep: prefix += os.sep prefix_books = os.path.join(os.path.expanduser(prefs["libraryPath"]), "Books" + os.sep) prefix_imported = os.path.join(prefix_books, "Imported" + os.sep) if prefix_books.startswith(prefix) or prefix.startswith(prefix_books): error = "invalid path" elif not os.path.exists(prefix): error = "path not found" elif not os.path.isdir(prefix): error = "path must be a folder" else: error = None if error: trigger_event("activity", {"activity": "import", "progress": [0, 0], "status": {"code": 404, "text": error}}) state.activity = {} return listname = options.get("list") if listname: listitems = [] assert isinstance(prefix, str) books = [] count = 0 for root, folders, files in os.walk(prefix): for f in files: if not state.tasks.connected: return # if f.startswith('._') or f == '.DS_Store': if f.startswith("."): continue f = os.path.join(root, f) ext = f.split(".")[-1] if ext in extensions: books.append(f) count += 1 if state.activity.get("cancel"): state.activity = {} return if count % 1000 == 0: state.activity = {"activity": "import", "path": prefix, "progress": [0, count]} trigger_event("activity", state.activity) state.activity = {"activity": "import", "path": prefix, "progress": [0, len(books)]} trigger_event("activity", state.activity) position = 0 added = 0 last = 0 for f in ox.sorted_strings(books): position += 1 if not os.path.exists(f): continue with db.session(): id = media.get_id(f) file = File.get(id) if not file: f_import = f f = f.replace(prefix, prefix_imported) ox.makedirs(os.path.dirname(f)) if options.get("mode") == "move": shutil.move(f_import, f) else: shutil.copy(f_import, f) file = add_file(id, f, prefix_books, f_import) file.move() added += 1 if listname: listitems.append(file.item.id) if time.time() - last > 5: last = time.time() state.activity = {"activity": "import", "progress": [position, len(books)], "path": prefix, "added": added} trigger_event("activity", state.activity) if state.activity.get("cancel"): state.activity = {} return with db.session(): if listname and listitems: l = List.get(settings.USER_ID, listname) if l: l.add_items(listitems) trigger_event( "activity", { "activity": "import", "progress": [position, len(books)], "path": prefix, "status": {"code": 200, "text": ""}, "added": added, }, ) state.activity = {} remove_empty_folders(prefix_books) if options.get("mode") == "move": remove_empty_folders(prefix)
level = 0 elif inside: if token['value'] == '(': level +=1 elif token['value'] == ')': level -= 1 inside = level > 0 if token['type'] == 'string' and len(token['value']) > 2: key = inside and 'inside Ox._()' or 'outside Ox._()' string = token['value'][1:-1].replace( "\\'", "'" ).replace( '\\]"', '\\"' ) #.replace(/\\'/g, '\'') #.replace(/([^\\]")/, '\\"') if not string in strings[key]: strings[key][string] = [] strings[key][string].append( f.replace(path, '') + ':%d' % token['line'] ) for key in ox.sorted_strings(strings): lines.append(key) for string in ox.sorted_strings(strings[key]): lines.append((' ' * 4) + '"%s"' % string) for f in ox.sorted_strings(strings[key][string]): lines.append((' ' * 8) + f) print (u'\n'.join(lines)).encode('utf-8')
for i, token in enumerate(tokens): if i >= 3 and tokens[i - 3]['value'] + tokens[i - 2]['value'] \ + tokens[i - 1]['value'] + tokens[i]['value'] == 'Ox._(': inside = True level = 1 elif inside: if token['value'] == '(': level += 1 elif token['value'] == ')': level -= 1 inside = level > 0 if token['type'] == 'string' and len(token['value']) > 2: key = inside and 'inside Ox._()' or 'outside Ox._()' string = token['value'][1:-1].replace("\\'", "'").replace( '\\]"', '\\"') #.replace(/\\'/g, '\'') #.replace(/([^\\]")/, '\\"') if not string in strings[key]: strings[key][string] = [] strings[key][string].append( f.replace(path, '') + ':%d' % token['line']) for key in ox.sorted_strings(strings): lines.append(key) for string in ox.sorted_strings(strings[key]): lines.append((' ' * 4) + '"%s"' % string) for f in ox.sorted_strings(strings[key][string]): lines.append((' ' * 8) + f) print(u'\n'.join(lines)).encode('utf-8')