def run(self, args, config): mdb = self.get_metadata_db(args.tree) mds = MovieDatasource(config.subsections('datasource'), args.tree, self.profile.object_class) if args.input is None: # Refresh all movies if printer.ask('Would you like to refresh all movies?', default=True): with printer.progress(mdb.count(), task=True) as update: for movie_hash, movie in list(mdb.itermovies()): movie = mds.refresh(movie) mdb.save(movie_hash, movie) printer.verbose('Saved {hash}', hash=movie_hash) update(1) else: movie_hash = get_hash(args.input) try: movie = mdb.get(movie_hash) except KeyError: printer.p('Unknown movie hash.') return else: movie = mds.refresh(movie) show(movie) if printer.ask('Would you like to save the movie?', default=True): mdb.save(movie_hash, movie) printer.p('Saved.')
def run(self, args, config): mdb = self.get_metadata_db(args.tree) with open(args.file) as fdump: dump = json.load(fdump) for movie in dump: mdb.save(movie['hash'], movie['movie']) printer.verbose('Loaded {hash}', hash=movie['hash']) printer.p('Loaded {nb} movies.', nb=len(dump))
def run(self, args, config): mdb = self.get_metadata_db(args.tree) db_files = set() for movie_hash, movie in mdb.itermovies(): db_files.add(movie_hash) db_files.update(movie.get("_externals", [])) printer.verbose("Found {nb} files in database", nb=len(db_files)) fs_files = set(os.listdir(os.path.join(args.tree, ".kolekto", "movies"))) printer.verbose("Found {nb} files in filesystem", nb=len(fs_files)) orphan_files = fs_files - db_files printer.p("Found {nb} orphan files to delete", nb=len(orphan_files)) if orphan_files: printer.verbose("Files to delete: {files}", files=", ".join(orphan_files)) if printer.ask("Would you like to delete orphans?"): for orphan_file in orphan_files: try: os.remove(os.path.join(args.tree, ".kolekto", "movies", orphan_file)) except OSError as err: printer.p("Unable to delete {file}: {err}", file=orphan_file, err=err) else: printer.verbose("Deleted {file}", file=orphan_file)
def run(self, args, config): mdb = self.get_metadata_db(args.tree) mds = MovieDatasource(config.subsections('datasource'), args.tree, self.profile.object_class) if args.dry_run: printer.p('Dry run: I will not create or delete any link') # Create the list of links that must exists on the fs: db_links = {} with printer.progress(mdb.count(), task=True) as update: for movie_hash, movie in mdb.itermovies(): movie = mds.attach(movie_hash, movie) for view in config.subsections('view'): for pattern in view.get('pattern'): for result in format_all(pattern, movie): filename = os.path.join(view.args, result) if filename in db_links: printer.p('Warning: duplicate link {link}', link=filename) else: db_links[filename] = movie_hash update(1) # Create the list of links already existing on the fs: fs_links = {} for view in config.subsections('view'): view_links = walk_links(os.path.join(args.tree, view.args), prefix=view.args, linkbase=os.path.join(args.tree, '.kolekto', 'movies')) fs_links.update(view_links) db_links = set(db_links.iteritems()) fs_links = set(fs_links.iteritems()) links_to_delete = fs_links - db_links links_to_create = db_links - fs_links printer.p('Found {rem} links to delete, {add} links to create', rem=len(links_to_delete), add=len(links_to_create)) dirs_to_cleanup = set() # Delete the old links: for filename, link in links_to_delete: printer.verbose('Deleting {file}', file=filename) if not args.dry_run: os.remove(os.path.join(args.tree, filename)) while filename: filename = os.path.split(filename)[0] dirs_to_cleanup.add(filename) dirs_to_cleanup.discard('') # Avoid to delete view roots # Delete empty directories: for directory in dirs_to_cleanup: if not args.dry_run: try: os.rmdir(os.path.join(args.tree, directory)) except OSError, err: if err.errno != 39: # Ignore "Directory not empty" error raise else: printer.verbose('Deleted directory {dir}', dir=directory)