Source code for dgenerate

# Copyright (c) 2023, Teriks
#
# dgenerate is distributed under the following BSD 3-Clause License
#
# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

__version__ = '3.4.3'

import collections.abc
import sys
import typing
import warnings

warnings.filterwarnings('ignore', module='dgenerate.extras.controlnet_aux')
warnings.filterwarnings('ignore', module='timm')
warnings.filterwarnings('ignore', module='diffusers')
warnings.filterwarnings('ignore', module='transformers')
warnings.filterwarnings('ignore', module='huggingface_hub')
warnings.filterwarnings('ignore', module='torch')

try:
    import diffusers
    import transformers

    from dgenerate.renderloop import \
        RenderLoop, \
        RenderLoopConfig, \
        RenderLoopConfigError, \
        RenderLoopEvent, \
        RenderLoopEventStream, \
        ImageGeneratedEvent, \
        ImageFileSavedEvent, \
        StartingAnimationFileEvent, \
        StartingAnimationEvent, \
        AnimationFinishedEvent, \
        AnimationFileFinishedEvent, \
        AnimationETAEvent, \
        StartingGenerationStepEvent, \
        gen_seeds

    from dgenerate.pipelinewrapper import \
        InvalidModelUriError, \
        InvalidSchedulerNameError, \
        UnsupportedPipelineConfigError, \
        ModelType, \
        DataType, \
        OutOfMemoryError, \
        ModelNotFoundError, \
        PipelineType

    from dgenerate.prompt import Prompt

    from dgenerate.batchprocess import \
        BatchProcessError, \
        ConfigRunner, \
        ConfigRunnerPlugin, \
        ConfigRunnerPluginLoader

    from dgenerate.invoker import \
        invoke_dgenerate, \
        invoke_dgenerate_events

    from dgenerate.arguments import \
        parse_args, \
        DgenerateUsageError, \
        DgenerateArguments, \
        DgenerateHelpException

    from dgenerate.mediainput import \
        ImageSeedError, \
        UnknownMimetypeError, \
        FrameStartOutOfBounds

    from dgenerate.imageprocessors import \
        ImageProcessorArgumentError, \
        ImageProcessorNotFoundError

    from dgenerate.plugin import \
        ModuleFileNotFoundError, \
        PluginNotFoundError, \
        PluginArgumentError

    import dgenerate.messages
    import dgenerate.types

    transformers.logging.set_verbosity(transformers.logging.CRITICAL)
    diffusers.logging.set_verbosity(diffusers.logging.CRITICAL)
except KeyboardInterrupt:
    print('Aborting due to keyboard interrupt!')
    sys.exit(1)


[docs] def main(args: typing.Optional[collections.abc.Sequence[str]] = None): """ Entry point for the dgenerate command line tool. :param args: program arguments, if ``None`` is provided they will be taken from ``sys.argv`` """ if args is None: args = sys.argv[1:] try: render_loop = RenderLoop() render_loop.config = DgenerateArguments() # ^ this is necessary for --templates-help to # render all the correct values if not sys.stdin.isatty(): # Not a terminal, batch process STDIN try: ConfigRunner(render_loop=render_loop, version=__version__, injected_args=args).run_file(sys.stdin) except ModuleFileNotFoundError as e: # missing plugin file parsed by ConfigRunner out of injected args dgenerate.messages.log(f'dgenerate: error: {str(e).strip()}', level=dgenerate.messages.ERROR) sys.exit(1) except BatchProcessError as e: dgenerate.messages.log(f'Config Error: {str(e).strip()}', level=dgenerate.messages.ERROR) sys.exit(1) else: sys.exit(invoke_dgenerate(args, render_loop=render_loop)) except KeyboardInterrupt: print('Aborting due to keyboard interrupt!', file=sys.stderr) sys.exit(1)
__all__ = dgenerate.types.module_all()