              type=int,
              dest='num_bins',
              group="output",
              default=5,
              help="Integer value. Number of folders that will be used to group by blur and "
                   "face-yaw. For blur folder 0 will be the least blurry, while the last folder "
                   "will be the blurriest. For face-yaw the number of bins is by how much 180 "
                   "degrees is divided. So if you use 18, then each folder will be a 10 degree "
                   "increment. Folder 0 will contain faces looking the most to the left whereas the "
                   "last folder will contain the faces looking the most to the right. If the number "
                   "of images doesn't divide evenly into the number of bins, the remaining images "
                   "get put in the last bin. Default value: 5"))
          argument_list.append(dict(
              opts=('-l', '--log-changes'),
              action='store_true',
              group="settings",
              default=False,
 
</s> remove             group="output",
 </s> add             group=_("output"), </s> remove             group="settings",
 </s> add             group=_("settings"), </s> remove         argument_list.append({"opts": ('-a', '--action'),
                              "action": Radio,
                              "dest": "action",
                              "choices": ("extract", "gen-vid", "get-fps",
                                          "get-info", "mux-audio", "rescale",
                                          "rotate", "slice"),
                              "default": "extract",
                              "help": "R|Choose which action you want ffmpeg "
                                      "ffmpeg to do."
                                      "\nL|'extract': turns videos into images "
                                      "\nL|'gen-vid': turns images into videos "
                                      "\nL|'get-fps' returns the chosen video's fps."
                                      "\nL|'get-info' returns information about a video."
                                      "\nL|'mux-audio' add audio from one video to another."
                                      "\nL|'rescale' resize video."
                                      "\nL|'rotate' rotate video."
                                      "\nL|'slice' cuts a portion of the video into a separate "
                                      "video file."})
        argument_list.append({"opts": ('-i', '--input'),
                              "action": ContextFullPaths,
                              "dest": "input",
                              "default": "input",
                              "help": "Input file.",
                              "group": "data",
                              "required": True,
                              "action_option": "-a",
                              "filetypes": "video"})
        argument_list.append({"opts": ('-o', '--output'),
                              "action": ContextFullPaths,
                              "group": "data",
                              "default": "",
                              "dest": "output",
                              "help": "Output file. If no output is "
                                      "specified then: if the output is "
                                      "meant to be a video then a video "
                                      "called 'out.mkv' will be created in "
                                      "the input directory; if the output is "
                                      "meant to be a directory then a "
                                      "directory called 'out' will be "
                                      "created inside the input "
                                      "directory."
                                      "Note: the chosen output file "
                                      "extension will determine the file "
                                      "encoding.",
                              "action_option": "-a",
                              "filetypes": "video"})
        argument_list.append({"opts": ('-r', '--reference-video'),
                              "action": FileFullPaths,
                              "dest": "ref_vid",
                              "group": "data",
                              "default": None,
                              "help": "Path to reference video if 'input' "
                                      "was not a video.",
                              "filetypes": "video"})
        argument_list.append({"opts": ('-fps', '--fps'),
                              "type": str,
                              "dest": "fps",
                              "group": "output",
                              "default": "-1.0",
                              "help": "Provide video fps. Can be an integer, "
                                      "float or fraction. Negative values "
                                      "will make the program try to get the "
                                      "fps from the input or reference "
                                      "videos."})
        argument_list.append({"opts": ("-ef", "--extract-filetype"),
                              "action": Radio,
                              "choices": _image_extensions,
                              "dest": "extract_ext",
                              "group": "output",
                              "default": ".png",
                              "help": "Image format that extracted images "
                                      "should be saved as. '.bmp' will offer "
                                      "the fastest extraction speed, but "
                                      "will take the most storage space. "
                                      "'.png' will be slower but will take "
                                      "less storage."})
        argument_list.append({"opts": ('-s', '--start'),
                              "type": str,
                              "dest": "start",
                              "group": "clip",
                              "default": "00:00:00",
                              "help": "Enter the start time from which an "
                                      "action is to be applied. "
                                      "Default: 00:00:00, in HH:MM:SS "
                                      "format. You can also enter the time "
                                      "with or without the colons, e.g. "
                                      "00:0000 or 026010."})
        argument_list.append({"opts": ('-e', '--end'),
                              "type": str,
                              "dest": "end",
                              "group": "clip",
                              "default": "00:00:00",
                              "help": "Enter the end time to which an action "
                                      "is to be applied. If both an end time "
                                      "and duration are set, then the end "
                                      "time will be used and the duration "
                                      "will be ignored. "
                                      "Default: 00:00:00, in HH:MM:SS."})
        argument_list.append({"opts": ('-d', '--duration'),
                              "type": str,
                              "dest": "duration",
                              "group": "clip",
                              "default": "00:00:00",
                              "help": "Enter the duration of the chosen "
                                      "action, for example if you enter "
                                      "00:00:10 for slice, then the first 10 "
                                      "seconds after and including the start "
                                      "time will be cut out into a new "
                                      "video. "
                                      "Default: 00:00:00, in HH:MM:SS "
                                      "format. You can also enter the time "
                                      "with or without the colons, e.g. "
                                      "00:0000 or 026010."})
        argument_list.append({"opts": ('-m', '--mux-audio'),
                              "action": "store_true",
                              "dest": "mux_audio",
                              "group": "output",
                              "default": False,
                              "help": "Mux the audio from the reference "
                                      "video into the input video. This "
                                      "option is only used for the 'gen-vid' "
                                      "action. 'mux-audio' action has this "
                                      "turned on implicitly."})
        argument_list.append(
            {"opts": ('-tr', '--transpose'),
             "choices": ("(0, 90CounterClockwise&VerticalFlip)",
                         "(1, 90Clockwise)",
                         "(2, 90CounterClockwise)",
                         "(3, 90Clockwise&VerticalFlip)"),
             "type": lambda v: self.__parse_transpose(v),
             "dest": "transpose",
             "group": "rotate",
             "default": None,
             "help": "Transpose the video. If transpose is "
                     "set, then degrees will be ignored. For "
                     "cli you can enter either the number "
                     "or the long command name, "
                     "e.g. to use (1, 90Clockwise) "
                     "-tr 1 or -tr 90Clockwise"})
        argument_list.append({"opts": ('-de', '--degrees'),
                              "type": str,
                              "dest": "degrees",
                              "default": None,
                              "group": "rotate",
                              "help": "Rotate the video clockwise by the "
                                      "given number of degrees."})
        argument_list.append({"opts": ('-sc', '--scale'),
                              "type": str,
                              "dest": "scale",
                              "group": "output",
                              "default": "1920x1080",
                              "help": "Set the new resolution scale if the "
                                      "chosen action is 'rescale'."})
        argument_list.append({"opts": ('-q', '--quiet'),
                              "action": "store_true",
                              "dest": "quiet",
                              "group": "settings",
                              "default": False,
                              "help": "Reduces output verbosity so that only "
                                      "serious errors are printed. If both "
                                      "quiet and verbose are set, verbose "
                                      "will override quiet."})
        argument_list.append({"opts": ('-v', '--verbose'),
                              "action": "store_true",
                              "dest": "verbose",
                              "group": "settings",
                              "default": False,
                              "help": "Increases output verbosity. If both "
                                      "quiet and verbose are set, verbose "
                                      "will override quiet."})
 </s> add         argument_list.append(dict(
            opts=('-a', '--action'),
            action=Radio,
            dest="action",
            choices=("extract", "gen-vid", "get-fps", "get-info", "mux-audio", "rescale", "rotate",
                     "slice"),
            default="extract",
            help=_("R|Choose which action you want ffmpeg ffmpeg to do."
                   "\nL|'extract': turns videos into images "
                   "\nL|'gen-vid': turns images into videos "
                   "\nL|'get-fps' returns the chosen video's fps."
                   "\nL|'get-info' returns information about a video."
                   "\nL|'mux-audio' add audio from one video to another."
                   "\nL|'rescale' resize video."
                   "\nL|'rotate' rotate video."
                   "\nL|'slice' cuts a portion of the video into a separate video file.")))
        argument_list.append(dict(
            opts=('-i', '--input'),
            action=ContextFullPaths,
            dest="input",
            default="input",
            help=_("Input file."),
            group=_("data"),
            required=True,
            action_option="-a",
            filetypes="video"))
        argument_list.append(dict(
            opts=('-o', '--output'),
            action=ContextFullPaths,
            group=_("data"),
            default="",
            dest="output",
            help=_("Output file. If no output is specified then: if the output is meant to be a "
                   "video then a video called 'out.mkv' will be created in the input directory; "
                   "if the output is meant to be a directory then a directory called 'out' will "
                   "be created inside the input directory. Note: the chosen output file extension "
                   "will determine the file encoding."),
            action_option="-a",
            filetypes="video"))
        argument_list.append(dict(
            opts=('-r', '--reference-video'),
            action=FileFullPaths,
            dest="ref_vid",
            group=_("data"),
            default=None,
            help=_("Path to reference video if 'input' was not a video."),
            filetypes="video"))
        argument_list.append(dict(
            opts=('-fps', '--fps'),
            type=str,
            dest="fps",
            group=_("output"),
            default="-1.0",
            help=_("Provide video fps. Can be an integer, float or fraction. Negative values will "
                   "will make the program try to get the fps from the input or reference "
                   "videos.")))
        argument_list.append(dict(
            opts=("-ef", "--extract-filetype"),
            action=Radio,
            choices=_image_extensions,
            dest="extract_ext",
            group=_("output"),
            default=".png",
            help=_("Image format that extracted images should be saved as. '.bmp' will offer the "
                   "fastest extraction speed, but will take the most storage space. '.png' will "
                   "be slower but will take less storage.")))
        argument_list.append(dict(
            opts=('-s', '--start'),
            type=str,
            dest="start",
            group=_("clip"),
            default="00:00:00",
            help=_("Enter the start time from which an action is to be applied. Default: "
                   "00:00:00, in HH:MM:SS format. You can also enter the time with or without the "
                   "colons, e.g. 00:0000 or 026010.")))
        argument_list.append(dict(
            opts=('-e', '--end'),
            type=str,
            dest="end",
            group=_("clip"),
            default="00:00:00",
            help=_("Enter the end time to which an action is to be applied. If both an end time "
                   "and duration are set, then the end time will be used and the duration will be "
                   "ignored. Default: 00:00:00, in HH:MM:SS.")))
        argument_list.append(dict(
            opts=('-d', '--duration'),
            type=str,
            dest="duration",
            group=_("clip"),
            default="00:00:00",
            help=_("Enter the duration of the chosen action, for example if you enter 00:00:10 "
                   "for slice, then the first 10 seconds after and including the start time will "
                   "be cut out into a new video. Default: 00:00:00, in HH:MM:SS format. You can "
                   "also enter the time with or without the colons, e.g. 00:0000 or 026010.")))
        argument_list.append(dict(
            opts=('-m', '--mux-audio'),
            action="store_true",
            dest="mux_audio",
            group=_("output"),
            default=False,
            help=_("Mux the audio from the reference video into the input video. This option is "
                   "only used for the 'gen-vid' action. 'mux-audio' action has this turned on "
                   "implicitly.")))
        argument_list.append(dict(
            opts=('-tr', '--transpose'),
            choices=("(0, 90CounterClockwise&VerticalFlip)",
                     "(1, 90Clockwise)",
                     "(2, 90CounterClockwise)",
                     "(3, 90Clockwise&VerticalFlip)"),
            type=lambda v: self.__parse_transpose(v),  # pylint:disable=unnecessary-lambda
            dest="transpose",
            group=_("rotate"),
            default=None,
            help=_("Transpose the video. If transpose is set, then degrees will be ignored. For "
                   "cli you can enter either the number or the long command name, e.g. to use (1, "
                   "90Clockwise) -tr 1 or -tr 90Clockwise")))
        argument_list.append(dict(
            opts=('-de', '--degrees'),
            type=str,
            dest="degrees",
            default=None,
            group=_("rotate"),
            help=_("Rotate the video clockwise by the given number of degrees.")))
        argument_list.append(dict(
            opts=('-sc', '--scale'),
            type=str,
            dest="scale",
            group=_("output"),
            default="1920x1080",
            help=_("Set the new resolution scale if the chosen action is 'rescale'.")))
        argument_list.append(dict(
            opts=('-q', '--quiet'),
            action="store_true",
            dest="quiet",
            group=_("settings"),
            default=False,
            help=_("Reduces output verbosity so that only serious errors are printed. If both "
                   "quiet and verbose are set, verbose will override quiet.")))
        argument_list.append(dict(
            opts=('-v', '--verbose'),
            action="store_true",
            dest="verbose",
            group=_("settings"),
            default=False,
            help=_("Increases output verbosity. If both quiet and verbose are set, verbose will "
                   "override quiet."))) </s> remove             group="timelapse",
            help="Optional for creating a timelapse. Timelapse will save an image of your "
                 "selected faces into the timelapse-output folder at every save iteration. "
                 "This should be the input folder of 'A' faces that you would like to use for "
                 "creating the timelapse. You must also supply a --timelapse-output and a "
                 "--timelapse-input-B parameter."))
 </s> add             group=_("timelapse"),
            help=_("Optional for creating a timelapse. Timelapse will save an image of your "
                   "selected faces into the timelapse-output folder at every save iteration. "
                   "This should be the input folder of 'A' faces that you would like to use for "
                   "creating the timelapse. You must also supply a --timelapse-output and a "
                   "--timelapse-input-B parameter."))) </s> remove             group="timelapse",
            help="Optional for creating a timelapse. Timelapse will save an image of your "
                 "selected faces into the timelapse-output folder at every save iteration. "
                 "This should be the input folder of 'B' faces that you would like to use for "
                 "creating the timelapse. You must also supply a --timelapse-output and a "
                 "--timelapse-input-A parameter."))
 </s> add             group=_("timelapse"),
            help=_("Optional for creating a timelapse. Timelapse will save an image of your "
                   "selected faces into the timelapse-output folder at every save iteration. "
                   "This should be the input folder of 'B' faces that you would like to use for "
                   "creating the timelapse. You must also supply a --timelapse-output and a "
                   "--timelapse-input-A parameter.")))
            help=_("Integer value. Number of folders that will be used to group by blur and "
                   "face-yaw. For blur folder 0 will be the least blurry, while the last folder "
                   "will be the blurriest. For face-yaw the number of bins is by how much 180 "
                   "degrees is divided. So if you use 18, then each folder will be a 10 degree "
                   "increment. Folder 0 will contain faces looking the most to the left whereas "
                   "the last folder will contain the faces looking the most to the right. If the "
                   "number of images doesn't divide evenly into the number of bins, the remaining "
                   "images get put in the last bin. Default value: 5")))
              type=int,
              dest='num_bins',
              group="output",
              default=5,
            help=_("Integer value. Number of folders that will be used to group by blur and "
                   "face-yaw. For blur folder 0 will be the least blurry, while the last folder "
                   "will be the blurriest. For face-yaw the number of bins is by how much 180 "
                   "degrees is divided. So if you use 18, then each folder will be a 10 degree "
                   "increment. Folder 0 will contain faces looking the most to the left whereas "
                   "the last folder will contain the faces looking the most to the right. If the "
                   "number of images doesn't divide evenly into the number of bins, the remaining "
                   "images get put in the last bin. Default value: 5")))
            help=_("Integer value. Number of folders that will be used to group by blur and "
                   "face-yaw. For blur folder 0 will be the least blurry, while the last folder "
                   "will be the blurriest. For face-yaw the number of bins is by how much 180 "
                   "degrees is divided. So if you use 18, then each folder will be a 10 degree "
                   "increment. Folder 0 will contain faces looking the most to the left whereas "
                   "the last folder will contain the faces looking the most to the right. If the "
                   "number of images doesn't divide evenly into the number of bins, the remaining "
                   "images get put in the last bin. Default value: 5")))
            help=_("Integer value. Number of folders that will be used to group by blur and "
                   "face-yaw. For blur folder 0 will be the least blurry, while the last folder "
                   "will be the blurriest. For face-yaw the number of bins is by how much 180 "
                   "degrees is divided. So if you use 18, then each folder will be a 10 degree "
                   "increment. Folder 0 will contain faces looking the most to the left whereas "
                   "the last folder will contain the faces looking the most to the right. If the "
                   "number of images doesn't divide evenly into the number of bins, the remaining "
                   "images get put in the last bin. Default value: 5")))
            help=_("Integer value. Number of folders that will be used to group by blur and "
                   "face-yaw. For blur folder 0 will be the least blurry, while the last folder "
                   "will be the blurriest. For face-yaw the number of bins is by how much 180 "
                   "degrees is divided. So if you use 18, then each folder will be a 10 degree "
                   "increment. Folder 0 will contain faces looking the most to the left whereas "
                   "the last folder will contain the faces looking the most to the right. If the "
                   "number of images doesn't divide evenly into the number of bins, the remaining "
                   "images get put in the last bin. Default value: 5")))
            help=_("Integer value. Number of folders that will be used to group by blur and "
                   "face-yaw. For blur folder 0 will be the least blurry, while the last folder "
                   "will be the blurriest. For face-yaw the number of bins is by how much 180 "
                   "degrees is divided. So if you use 18, then each folder will be a 10 degree "
                   "increment. Folder 0 will contain faces looking the most to the left whereas "
                   "the last folder will contain the faces looking the most to the right. If the "
                   "number of images doesn't divide evenly into the number of bins, the remaining "
                   "images get put in the last bin. Default value: 5")))
            help=_("Integer value. Number of folders that will be used to group by blur and "
                   "face-yaw. For blur folder 0 will be the least blurry, while the last folder "
                   "will be the blurriest. For face-yaw the number of bins is by how much 180 "
                   "degrees is divided. So if you use 18, then each folder will be a 10 degree "
                   "increment. Folder 0 will contain faces looking the most to the left whereas "
                   "the last folder will contain the faces looking the most to the right. If the "
                   "number of images doesn't divide evenly into the number of bins, the remaining "
                   "images get put in the last bin. Default value: 5")))
            help=_("Integer value. Number of folders that will be used to group by blur and "
                   "face-yaw. For blur folder 0 will be the least blurry, while the last folder "
                   "will be the blurriest. For face-yaw the number of bins is by how much 180 "
                   "degrees is divided. So if you use 18, then each folder will be a 10 degree "
                   "increment. Folder 0 will contain faces looking the most to the left whereas "
                   "the last folder will contain the faces looking the most to the right. If the "
                   "number of images doesn't divide evenly into the number of bins, the remaining "
                   "images get put in the last bin. Default value: 5")))
            help=_("Integer value. Number of folders that will be used to group by blur and "
                   "face-yaw. For blur folder 0 will be the least blurry, while the last folder "
                   "will be the blurriest. For face-yaw the number of bins is by how much 180 "
                   "degrees is divided. So if you use 18, then each folder will be a 10 degree "
                   "increment. Folder 0 will contain faces looking the most to the left whereas "
                   "the last folder will contain the faces looking the most to the right. If the "
                   "number of images doesn't divide evenly into the number of bins, the remaining "
                   "images get put in the last bin. Default value: 5")))
          argument_list.append(dict(
              opts=('-l', '--log-changes'),
              action='store_true',
              group="settings",
              default=False,
keep keep keep keep replace replace replace replace replace replace replace replace keep keep keep keep keep
 Add Locale support for cli arguments 
tools/sort/cli.py