File size: 4,173 Bytes
4450790
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#-----------------------------------------------------------------------------------------------------------#
# CR Animation Nodes by RockOfFire and Akatsuzi     https://github.com/Suzie1/CR-Animation-Nodes
# for ComfyUI                                       https://github.com/comfyanonymous/ComfyUI
#-----------------------------------------------------------------------------------------------------------#

#-----------------------------------------------------------------------------------------------------------#
# FUNCTIONS
#-----------------------------------------------------------------------------------------------------------#

def keyframe_scheduler(schedule, schedule_alias, current_frame):

    # Initialise
    schedule_lines = list()
    previous_params = ""
    
    # Loop through the schedule to find lines with matching schedule_alias
    for item in schedule:   
        alias = item[0]
        if alias == schedule_alias:
            schedule_lines.extend([(item)])

    # Loop through the filtered lines
    for i, item in enumerate(schedule_lines):
        # Get alias and schedule line
        alias, line = item
        
        # Skip empty lines
        if not line.strip():
            print(f"[Warning] Skipped blank line at line {i}")
            continue
            
        # Get parameters from the tuples
        frame_str, params = line.split(',', 1)
        frame = int(frame_str)
        
        # Strip spaces at start of params
        params = params.lstrip()
        
        # Return the params
        if frame < current_frame:
            previous_params = params
            continue
        if frame == current_frame:
            previous_params = params
        else:
            params = previous_params
        return params
            
    # Continue using the final params after the last schedule line has been evaluated     
    return previous_params
    
def prompt_scheduler(schedule, schedule_alias, current_frame):

    # Initialise
    schedule_lines = list()
    previous_prompt = ""
    previous_keyframe = 0
    
    #print(schedule, schedule_alias, current_frame) 
    
    # Loop through the schedule to find lines with matching schedule_alias
    for item in schedule:   
        alias = item[0]
        if alias == schedule_alias:
            schedule_lines.extend([(item)])

    # Loop through the filtered lines
    for i, item in enumerate(schedule_lines):
        # Get alias and schedule line
        alias, line = item
            
        # Get parameters from the tuples 
        frame_str, prompt = line.split(',', 1)
        frame_str = frame_str.strip('\"')
        frame = int(frame_str)
        
        # Strip leading spaces and quotes
        prompt = prompt.lstrip()
        prompt = prompt.replace('"', '')        
        
        # Return the parameters
        if frame < current_frame:
            previous_prompt = prompt
            previous_keyframe = frame
            #print(f"[Debug] frame < current_frame, frame {frame}, current frame {current_frame}")
            #print(f"[Debug] frame < current_frame, prompt {prompt}")
            continue
        if frame == current_frame:
            next_prompt = prompt
            next_keyframe = frame             
            previous_prompt = prompt
            previous_keyframe = frame
            #print(f"[Debug] frame = current_frame, frame {frame}, current frame {current_frame}, next keyframe {next_keyframe}")
            #print(f"[Debug] frame = current_frame, prompt {prompt}")            
        else:
            next_prompt = prompt
            next_keyframe = frame            
            prompt = previous_prompt
            #print(f"[Debug] frame > current_frame, frame {frame}, current frame {current_frame}, next keyframe {next_keyframe}")
            #print(f"[Debug] frame > current_frame, next prompt {next_prompt}")                
            
        return prompt, next_prompt, previous_keyframe, next_keyframe
            
    # Continue using the final params after the last schedule line has been evaluated     
    return previous_prompt, previous_prompt, previous_keyframe, previous_keyframe