jaxmetaverse's picture
Upload folder using huggingface_hub
82ea528 verified
####################################################################################################
# DinkLink is my method of sharing classes/functions between my nodes.
#
# My DinkLink-compatible nodes will inject comfy.hooks with a __DINKLINK attr
# that stores a dictionary, where any of my node packs can store their stuff.
#
# It is not intended to be accessed by node packs that I don't develop, so things may change
# at any time.
#
# DinkLink also serves as a proof-of-concept for a future ComfyUI implementation of
# purposely exposing node pack classes/functions with other node packs.
####################################################################################################
from __future__ import annotations
from typing import Union
from torch import Tensor, nn
from comfy.model_patcher import ModelPatcher
import comfy.hooks
DINKLINK = "__DINKLINK"
def init_dinklink():
create_dinklink()
prepare_dinklink()
def create_dinklink():
if not hasattr(comfy.hooks, DINKLINK):
setattr(comfy.hooks, DINKLINK, {})
def get_dinklink() -> dict[str, dict[str]]:
create_dinklink()
return getattr(comfy.hooks, DINKLINK)
class DinkLinkConst:
VERSION = "version"
# ADE
ADE = "ADE"
ADE_ANIMATEDIFFMODEL = "AnimateDiffModel"
ADE_ANIMATEDIFFINFO = "AnimateDiffInfo"
ADE_CREATE_MOTIONMODELPATCHER = "create_MotionModelPatcher"
def prepare_dinklink():
pass
class InterfaceAnimateDiffInfo:
'''Class only used for IDE type hints; interface of ADE's AnimateDiffInfo'''
def __init__(self, sd_type: str, mm_format: str, mm_version: str, mm_name: str):
self.sd_type = sd_type
self.mm_format = mm_format
self.mm_version = mm_version
self.mm_name = mm_name
class InterfaceAnimateDiffModel(nn.Module):
'''Class only used for IDE type hints; interface of ADE's AnimateDiffModel'''
def __init__(self, mm_state_dict: dict[str, Tensor], mm_info: InterfaceAnimateDiffInfo, init_kwargs: dict[str]={}):
pass
def set_video_length(self, video_length: int, full_length: int) -> None:
raise NotImplemented()
def set_scale(self, scale: Union[float, Tensor, None], per_block_list: Union[list, None]=None) -> None:
raise NotImplemented()
def set_effect(self, multival: Union[float, Tensor, None], per_block_list: Union[list, None]=None) -> None:
raise NotImplemented()
def cleanup(self):
raise NotImplemented()
def inject(self, model: ModelPatcher):
pass
def eject(self, model: ModelPatcher):
pass
def get_CreateMotionModelPatcher(throw_exception=True):
d = get_dinklink()
try:
link_ade = d[DinkLinkConst.ADE]
return link_ade[DinkLinkConst.ADE_CREATE_MOTIONMODELPATCHER]
except KeyError:
if throw_exception:
raise Exception("Could not get create_MotionModelPatcher function. AnimateDiff-Evolved nodes need to be installed to use SparseCtrl; " + \
"they are either not installed or are of an insufficient version.")
return None
def get_AnimateDiffModel(throw_exception=True):
d = get_dinklink()
try:
link_ade = d[DinkLinkConst.ADE]
return link_ade[DinkLinkConst.ADE_ANIMATEDIFFMODEL]
except KeyError:
if throw_exception:
raise Exception("Could not get AnimateDiffModel class. AnimateDiff-Evolved nodes need to be installed to use SparseCtrl; " + \
"they are either not installed or are of an insufficient version.")
return None
def get_AnimateDiffInfo(throw_exception=True) -> InterfaceAnimateDiffInfo:
d = get_dinklink()
try:
link_ade = d[DinkLinkConst.ADE]
return link_ade[DinkLinkConst.ADE_ANIMATEDIFFINFO]
except KeyError:
if throw_exception:
raise Exception("Could not get AnimateDiffInfo class - AnimateDiff-Evolved nodes need to be installed to use SparseCtrl; " + \
"they are either not installed or are of an insufficient version.")
return None