Beispiel #1
0
    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.')
Beispiel #2
0
 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))
Beispiel #3
0
 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)
Beispiel #4
0
    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)