def new_path(
        self,
        new_path=None, # type: Optional[str]
        new_fullpath=None, # type: Optional[str]
        force=False, # type: bool
        always_copy=False, # type: bool
        always_move=False, # type: bool
        leave_symlink=False, # type: bool
        get_path_preview=False, # type: bool
    ):
        # type: (...) -> Optional[str]
        """Moves the file to a new path.

        If it is on the same partition, it will be moved (unless always_copy is True)
        If it is on a different partition, it will be copied, and the original
        only deleted if always_move is True.
        If the target file already exists, it will raise OSError unless force is True.
        If it was moved, a symlink will be left behind with the original name
        pointing to the file's new destination if leave_symlink is True.
        """

        if always_copy and always_move:
            raise ValueError("Both always_copy and always_move cannot be specified")

        if (new_path is None and new_fullpath is None) or (
            new_path is not None and new_fullpath is not None
        ):
            raise ValueError("Specify only new_dir or new_fullpath")

        old_dir, old_filename = os.path.split(self.filename)
        if new_path is not None:
            # Join new filepath to old one (to handle realtive dirs)
            new_dir = os.path.abspath(os.path.join(old_dir, new_path))

            # Join new filename onto new filepath
            new_fullpath = os.path.join(new_dir, old_filename)

        else:
            # Join new filepath to old one (to handle realtive dirs)
            new_fullpath = os.path.abspath(os.path.join(old_dir, new_fullpath))

            new_dir = os.path.dirname(new_fullpath)

        if len(Config['move_files_fullpath_replacements']) > 0:
            print("Before custom full path replacements: %s" % (new_fullpath))
            new_fullpath = _apply_replacements_fullpath(new_fullpath)
            new_dir = os.path.dirname(new_fullpath)

        print("New path: %s" % new_fullpath)

        if get_path_preview:
            return new_fullpath

        if not os.path.exists(new_dir):
            os.makedirs(new_dir, exist_ok=True)
            print("Created directory %s" % new_dir)

        if os.path.isfile(new_fullpath):
            # If the destination exists, raise exception unless force is True
            if not force:
                raise OSError(
                    "File %s already exists, not forcefully moving %s"
                    % (new_fullpath, self.filename)
                )

        if always_copy:
            # Same partition, but forced to copy
            copy_file(self.filename, new_fullpath)
        else:
            # Same partition, just rename the file to move it
            rename_file(self.filename, new_fullpath)

            # Leave a symlink behind if configured to do so
            if leave_symlink:
                symlink_file(new_fullpath, self.filename)

        self.filename = new_fullpath

        return None # TODO: Remove get_path_preview argument
Moves the file to a new path.

        If it is on the same partition, it will be moved (unless always_copy is True)
        If it is on a different partition, it will be copied, and the original
        only deleted if always_move is True.
        If the target file already exists, it will raise OSError unless force is True.
        If it was moved, a symlink will be left behind with the original name
        pointing to the file's new destination if leave_symlink is True.
        
tvnamer/files.py