From db4246a3b219ef65fe6bfada1df2015bc13d2fd9 Mon Sep 17 00:00:00 2001 From: dseditor Date: Thu, 19 Jun 2025 23:46:46 +0800 Subject: [PATCH] dailypromptnode --- README.md | 64 ++++++++++- __init__.py | 43 ++++++-- prompt/Example.txt | 12 +++ readme/demo3.jpg | Bin 0 -> 83254 bytes scheduler.py | 178 +++++++++++++++++++++++++++++++ schedules.json | 6 +- workflow/ExmapleDailyPrompt.json | 136 +++++++++++++++++++++++ 7 files changed, 425 insertions(+), 14 deletions(-) create mode 100644 prompt/Example.txt create mode 100644 readme/demo3.jpg create mode 100644 workflow/ExmapleDailyPrompt.json diff --git a/README.md b/README.md index 58366eb..022608f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ A powerful workflow scheduling extension for ComfyUI that enables automated dail ## 🚀 Installation 安裝方式 ### Method 1: ComfyUI Manager (Recommended) -### 方法 1:ComfyUI 管理器(推薦/稍後可用) +### 方法 1:ComfyUI 管理器(推薦) 1. Open ComfyUI Manager 開啟 ComfyUI 管理器 2. Search for "ComfyUI-ScheduledTask" 搜尋 "ComfyUI-ScheduledTask" 3. Click Install 點擊安裝 @@ -114,6 +114,65 @@ A special utility node that generates time-based random seeds: - Ensures different results for each scheduled run 確保每次排程運行都有不同結果 - Setting this for create large image list and run 在設定時間內進行大規模隨機排程 +### Daily Prompt Scheduler Node / 每日提示詞排程節點 + +![Demo](readme/demo3.jpg) + +A ComfyUI node that provides time-based prompt management with daily rotation capabilities. +提供基於時間的提示詞管理和每日輪換功能。 + +####Features / 功能特色 + +- **Daily Rotation / 每日輪換**: Automatically selects different prompts each day / 每天自動選擇不同的提示詞 +- **Two Operation Modes / 兩種運作模式**: + - **Scheduled Mode / 排程模式**: Sequential selection with time seed (predictable daily progression) / 使用時間種子的順序選擇(可預測的每日進展) + - **Random Mode / 隨機模式**: Random selection with daily seed (random but consistent per day) / 使用每日種子的隨機選擇(隨機但每天一致) +- **File-based Management / 檔案管理**: Load prompts from text files in the `Prompt` folder / 從Prompt資料夾中的文字檔載入提示詞 +- **Individual Time Seeds / 獨立時間種子**: Each text file maintains its own scheduling timeline / 每個文字檔維護自己的排程時間線 +- **List Output / 列表輸出**: Returns prompts as a connectable string list for workflow integration / 返回可連接的字串列表用於工作流程整合 +- **Loop Integration / 迴圈整合**: Provides count output for easy loop control / 提供計數輸出便於迴圈控制 + +#### Setup / 設置 + +1. Visit`Prompt` folder in your node directory: `/ComfyUI-ScheduledTask/Prompt/` / 在節點目錄中訪問`Prompt`資料夾:`/ComfyUI-ScheduledTask/Prompt/` +2. Place your text files (`.txt`) in this folder / 將文字檔(`.txt`)放置在此資料夾中 +3. Each line in the text file represents one prompt (empty lines are ignored) / 文字檔中每一行代表一個提示詞(空行會被忽略) + +#### Inputs / 輸入參數 + +- **txt_file / 文字檔**: Dropdown selection of available text files in the Prompt folder / 下拉選單選擇Prompt資料夾中的可用文字檔 +- **daily_count / 每日數量**: Number of prompts to select each day (1-5000) / 每天選擇的提示詞數量(1-5000) +- **scheduled / 排程**: Toggle between Scheduled and Random modes (Default is Random Mode)/ 在排程模式和隨機模式之間切換,預設為隨機模式,每天隨機抽選提示組數 + +#### Outputs / 輸出參數 + +- **daily_prompts / 每日提示詞**: List of selected prompts (STRING list, connectable to other nodes) / 選中的提示詞列表(字串列表,可連接到其他節點) +- **total_index / 總數索引**: Number of prompts actually returned (INT, useful for loop control) / 實際返回的提示詞數量(整數,用於迴圈控制) + +#### Operation Modes / 運作模式 + +#### Scheduled Mode / 排程模式 +- **First Run / 首次運行**: Creates a time seed based on current date / 基於當前日期創建時間種子 +- **Daily Progression / 每日進展**: Selects prompts sequentially / 按順序選擇提示詞 +- **Example / 範例**: With 12 prompts, selecting 3 per day / 有12個提示詞,每天選擇3個: + - Day 1 / 第1天: Prompts 1, 2, 3 / 提示詞1, 2, 3 + - Day 2 / 第2天: Prompts 4, 5, 6 / 提示詞4, 5, 6 + - Day 3 / 第3天: Prompts 7, 8, 9 / 提示詞7, 8, 9 + - Day 4 / 第4天: Prompts 10, 11, 12 / 提示詞10, 11, 12 + - Day 5 / 第5天: Prompts 1, 2, 3 (cycles back) / 提示詞1, 2, 3(循環回到開頭) + +#### Random Mode / 隨機模式 +- **Daily Random / 每日隨機**: Uses date-based seed for random selection / 使用基於日期的種子進行隨機選擇 +- **Consistent / 一致性**: Same random selection throughout the day / 整天保持相同的隨機選擇 +- **Example / 範例**: Random but fixed selection per day (e.g., prompts 3, 7, 11) / 每天隨機但固定的選擇(例如:提示詞3, 7, 11) + +#### File Management / 檔案管理 + +- **Multiple Files / 多檔案**: Each `.txt` file has independent scheduling / 每個`.txt`檔案都有獨立的排程 +- **Time Seeds / 時間種子**: Stored as `{filename}_time_seed.json` in the Prompt folder(If Scheduled) / 以`{檔名}_time_seed.json`的形式儲存在Prompt資料夾中,假使是使用排程模式 +- **Auto-wrapping / 自動循環**: Never causes index errors, automatically wraps around (With Time Seed) / 永不會造成索引錯誤,自動循環,但可能會因此採樣到相同的圖片,請配合時間種子使用 +- **UTF-8 Support / UTF-8支援**: Handles international characters and languages / 支援國際字符和多種語言 + ### File Structure 檔案結構 ``` @@ -121,12 +180,15 @@ ComfyUI-ScheduledTask/ ├── __init__.py # Extension entry point 擴展入口點 ├── scheduler.py # Core scheduling logic & TimeToSeedList node 核心排程邏輯和時間種子節點 ├── web_handler.py # API endpoints API 端點 +├── Prompt/ # 提示詞檔案庫 +│ ├── Example.txt # 範例檔案 ├── web/ │ └── scheduled_task.js # Frontend interface 前端介面 ├── Workflow/ # Saved workflow files (auto-created) 保存的工作流程檔案(自動創建) │ ├── workflow1.json │ └── workflow2.json └── schedules.json # Schedule configuration (auto-created) 排程配置(自動創建) + ``` ### Workflow Format 工作流程格式 Saved workflows are stored in ComfyUI API format: diff --git a/__init__.py b/__init__.py index 43825ab..e40e845 100644 --- a/__init__.py +++ b/__init__.py @@ -4,10 +4,20 @@ ComfyUI-ScheduledTask """ import os -from .scheduler import SchedulerManager, TimeToSeedList -from .web_handler import setup_routes import threading import time +import atexit + +# 匯入節點類別和排程管理器 +from .scheduler import SchedulerManager, TimeToSeedList, DailyPromptScheduler + +# 匯入web處理器 (如果存在的話) +try: + from .web_handler import setup_routes + HAS_WEB_HANDLER = True +except ImportError: + HAS_WEB_HANDLER = False + print("Warning: web_handler not found, web interface will be disabled") # 全域排程管理器 scheduler_manager = None @@ -20,35 +30,48 @@ def get_scheduler(): # 延遲初始化 def delayed_init(): - time.sleep(3) # 等待ComfyUI完全啟動 - get_scheduler() + try: + time.sleep(3) # 等待ComfyUI完全啟動 + get_scheduler() + except Exception as e: + print(f"Error in delayed initialization: {e}") # 啟動初始化執行緒 init_thread = threading.Thread(target=delayed_init, daemon=True) init_thread.start() -# 設定web路由 -setup_routes() +# 設定web路由 (如果可用) +if HAS_WEB_HANDLER: + try: + setup_routes() + except Exception as e: + print(f"Error setting up web routes: {e}") # 清理函數 -import atexit def cleanup(): global scheduler_manager if scheduler_manager: - scheduler_manager.stop() + try: + scheduler_manager.stop() + except Exception as e: + print(f"Error during cleanup: {e}") atexit.register(cleanup) -# ComfyUI節點映射 +# 節點類別映射 - 這是關鍵! NODE_CLASS_MAPPINGS = { "TimeToSeedList": TimeToSeedList, + "DailyPromptScheduler": DailyPromptScheduler, } +# 節點顯示名稱映射 NODE_DISPLAY_NAME_MAPPINGS = { "TimeToSeedList": "Time to Seed List", + "DailyPromptScheduler": "Daily Prompt Scheduler", } -# Web擴展映射 - 這是關鍵! +# Web擴展映射 WEB_DIRECTORY = "./web" +# 確保必要的匯出 __all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS', 'WEB_DIRECTORY'] \ No newline at end of file diff --git a/prompt/Example.txt b/prompt/Example.txt new file mode 100644 index 0000000..1e6e849 --- /dev/null +++ b/prompt/Example.txt @@ -0,0 +1,12 @@ +Ancient magical laboratory filled with glowing potions, floating books, crystal orbs, wooden shelves lined with mysterious bottles, candlelight illumination, mystical atmosphere, detailed fantasy art style +Wizard's underground laboratory with bubbling cauldrons, spell circles carved in stone floor, hanging herbs and ingredients, magical apparatus, dim torchlight, medieval fantasy setting +Modern witch's laboratory combining magical and scientific elements, glass beakers with swirling colorful potions, digital displays showing magical formulas, LED lighting mixed with candles, contemporary fantasy aesthetic +Alchemist's tower laboratory with spiral staircases, floating magical instruments, golden light streaming through stained glass windows, ancient tomes, transmutation circles, Renaissance-inspired magical workshop +Steampunk magical laboratory with brass pipes, mechanical magical devices, steam-powered cauldrons, copper and bronze equipment, Victorian-era magical engineering, gear-driven spell apparatus +Enchanted forest laboratory built inside a giant tree, bioluminescent plants as light sources, natural wooden surfaces, magical mushrooms, fairy lights, organic magical equipment, nature-integrated magic workshop +Crystal cave magical laboratory with towering crystal formations, prismatic light effects, levitating gemstones, magical energy coursing through crystal networks, ethereal glow, crystalline magical apparatus +Underwater magical laboratory in an air bubble, aquatic magical creatures swimming outside, coral-based equipment, bioluminescent sea plants, magical water manipulation devices, oceanic fantasy setting +Celestial magical observatory laboratory on a floating platform, star charts and astronomical instruments, magical telescopes, cosmic energy collectors, nebula views through windows, space-themed magical research facility +Miniature magical laboratory inside a snow globe, tiny detailed magical equipment, microscopic potions, doll-house scale magical apparatus, whimsical and intricate design, magical realism aesthetic +Dark gothic magical laboratory with ornate iron fixtures, dramatic shadows, purple and green magical flames, ancient grimoires bound in leather, gargoyle statues, gothic arches, ominous magical energy +Bright cheerful magical bakery laboratory, pastel-colored potions that look like cupcakes, magical mixing bowls, enchanted ovens, candy-colored magical ingredients, whimsical cartoon style, sweet magical atmosphere \ No newline at end of file diff --git a/readme/demo3.jpg b/readme/demo3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8561a0fab2d2770d44cb158d08124f134a482b6 GIT binary patch literal 83254 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

9j6wNKVy^JtFMxVEkv&!gD^11 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 literal 0 HcmV?d00001 diff --git a/scheduler.py b/scheduler.py index 8128b50..4cdc8e8 100644 --- a/scheduler.py +++ b/scheduler.py @@ -14,6 +14,184 @@ import random from datetime import datetime import hashlib +class DailyPromptScheduler: + def __init__(self): + self.node_dir = os.path.dirname(os.path.abspath(__file__)) + self.prompt_dir = os.path.join(self.node_dir, "Prompt") + + # Ensure Prompt folder exists + if not os.path.exists(self.prompt_dir): + os.makedirs(self.prompt_dir) + + def get_txt_files(self): + """Get all txt files in the Prompt folder""" + if not os.path.exists(self.prompt_dir): + return ["Please place txt files in Prompt folder"] + + # Only get .txt files, exclude .json files + txt_files = [f for f in os.listdir(self.prompt_dir) + if f.endswith('.txt') and not f.endswith('_time_seed.json')] + if not txt_files: + return ["Please place txt files in Prompt folder"] + + return txt_files + + def get_seed_file_path(self, txt_filename): + """Get the seed file path for specific txt file""" + # Remove .txt extension and add _time_seed.json + base_name = os.path.splitext(txt_filename)[0] + seed_filename = f"{base_name}_time_seed.json" + return os.path.join(self.prompt_dir, seed_filename) + + def load_time_seed(self, txt_filename): + """Load time seed for specific txt file""" + seed_file = self.get_seed_file_path(txt_filename) + if os.path.exists(seed_file): + try: + with open(seed_file, 'r', encoding='utf-8') as f: + seed_data = json.load(f) + return seed_data.get('seed_date', None) + except: + return None + return None + + def save_time_seed(self, txt_filename, seed_date): + """Save time seed for specific txt file""" + seed_file = self.get_seed_file_path(txt_filename) + seed_data = {'seed_date': seed_date} + with open(seed_file, 'w', encoding='utf-8') as f: + json.dump(seed_data, f, ensure_ascii=False) + + @classmethod + def INPUT_TYPES(cls): + instance = cls() + txt_files = instance.get_txt_files() + + return { + "required": { + "txt_file": (txt_files, {"default": txt_files[0] if txt_files else ""}), + "daily_count": ("INT", { + "default": 3, + "min": 1, + "max": 5000, + "step": 1 + }), + "scheduled": ("BOOLEAN", { + "default": False, + "label_on": "Set Time Seed", + "label_off": "Random Mode" + }), + } + } + + RETURN_TYPES = ("STRING", "INT") + RETURN_NAMES = ("daily_prompts", "total_index") + OUTPUT_IS_LIST = (True, False) + FUNCTION = "get_daily_prompts" + CATEGORY = "text/scheduled" + + def IS_CHANGED(self, txt_file, daily_count, scheduled): + """Ensure node is not cached""" + current_time = datetime.now() + current_date = current_time.strftime("%Y%m%d") + + # If file doesn't exist, return current timestamp + txt_path = os.path.join(self.prompt_dir, txt_file) + if not os.path.exists(txt_path): + return str(current_time.timestamp()) + + # Combine file modification time, current date and settings to generate identifier + try: + file_mtime = os.path.getmtime(txt_path) + unique_id = f"{file_mtime}_{current_date}_{daily_count}_{scheduled}_{txt_file}" + return hashlib.md5(unique_id.encode()).hexdigest() + except: + return str(current_time.timestamp()) + + def read_txt_file(self, filename): + """Read and parse txt file""" + txt_path = os.path.join(self.prompt_dir, filename) + + if not os.path.exists(txt_path): + return [] + + try: + with open(txt_path, 'r', encoding='utf-8') as f: + content = f.read() + + # Split by newlines, filter empty lines + lines = [line.strip() for line in content.split('\n') if line.strip()] + return lines + except Exception as e: + logger.error(f"Error reading file: {e}") + return [] + + def get_daily_prompts(self, txt_file, daily_count, scheduled): + # Check if file exists + if txt_file == "Please place txt files in Prompt folder": + return (["Error: Please place txt files in Prompt folder"], 0) + + # Read prompt list + all_prompts = self.read_txt_file(txt_file) + + if not all_prompts: + error_msg = f"Error: Unable to read file {txt_file} or file is empty" + return ([error_msg], 0) + + current_time = datetime.now() + current_date = current_time.strftime("%Y%m%d") + + # Ensure not exceeding available prompts count + actual_count = min(daily_count, len(all_prompts)) + + # Handle scheduling logic + if scheduled: + # Scheduled mode with time seed + seed_date = self.load_time_seed(txt_file) + + if seed_date is None: + # First time setting seed + self.save_time_seed(txt_file, current_date) + seed_date = current_date + status = f"Time seed set: {seed_date} for {txt_file}" + else: + status = f"Using time seed: {seed_date} for {txt_file}" + + # Calculate days difference from seed date + try: + seed_datetime = datetime.strptime(seed_date, "%Y%m%d") + current_datetime = datetime.strptime(current_date, "%Y%m%d") + days_diff = (current_datetime - seed_datetime).days + except: + days_diff = 0 + + # Calculate starting index for sequential selection + total_prompts = len(all_prompts) + start_index = (days_diff * actual_count) % total_prompts + + # Sequential selection with wrapping + selected_prompts = [] + for i in range(actual_count): + index = (start_index + i) % total_prompts + selected_prompts.append(all_prompts[index]) + + else: + # Random mode: use different random seed each day + random_seed = int(current_date) + hash(txt_file) + random.seed(random_seed) + status = f"Random mode - Date seed: {current_date} for {txt_file}" + + # Randomly select prompts without replacement + selected_prompts = random.sample(all_prompts, actual_count) + + # Output debug information + logger.info(f"DailyPromptScheduler: {status}") + logger.info(f"DailyPromptScheduler: Selected {actual_count} from {len(all_prompts)} prompts") + logger.info(f"DailyPromptScheduler: Selected prompts: {selected_prompts}") + + return (selected_prompts, actual_count) + + class TimeToSeedList: """ Generate random seed list based on current time diff --git a/schedules.json b/schedules.json index 2c371e3..d415846 100644 --- a/schedules.json +++ b/schedules.json @@ -1,11 +1,11 @@ { "schedules": [ { - "time": "09:09", - "workflow": "Exmaple.json", + "time": "23:22", + "workflow": "ExmapleDailyPrompt.json", "enabled": true } ], "globalEnabled": true, - "updated_at": "2025-06-19T09:07:21.402267" + "updated_at": "2025-06-20T23:20:23.382801" } \ No newline at end of file diff --git a/workflow/ExmapleDailyPrompt.json b/workflow/ExmapleDailyPrompt.json new file mode 100644 index 0000000..ee63d6a --- /dev/null +++ b/workflow/ExmapleDailyPrompt.json @@ -0,0 +1,136 @@ +{ + "3": { + "inputs": { + "seed": [ + "31", + 0 + ], + "steps": 20, + "cfg": 8, + "sampler_name": "euler", + "scheduler": "normal", + "denoise": 1, + "model": [ + "4", + 0 + ], + "positive": [ + "6", + 0 + ], + "negative": [ + "7", + 0 + ], + "latent_image": [ + "5", + 0 + ] + }, + "class_type": "KSampler", + "_meta": { + "title": "KSampler" + } + }, + "4": { + "inputs": { + "ckpt_name": "dreamshaper_8.safetensors" + }, + "class_type": "CheckpointLoaderSimple", + "_meta": { + "title": "Load Checkpoint" + } + }, + "5": { + "inputs": { + "width": 512, + "height": 512, + "batch_size": 1 + }, + "class_type": "EmptyLatentImage", + "_meta": { + "title": "Empty Latent Image" + } + }, + "6": { + "inputs": { + "text": [ + "30", + 0 + ], + "clip": [ + "4", + 1 + ] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "7": { + "inputs": { + "text": "text, watermark", + "clip": [ + "4", + 1 + ] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "8": { + "inputs": { + "samples": [ + "3", + 0 + ], + "vae": [ + "4", + 2 + ] + }, + "class_type": "VAEDecode", + "_meta": { + "title": "VAE Decode" + } + }, + "9": { + "inputs": { + "filename_prefix": "ComfyUI", + "images": [ + "8", + 0 + ] + }, + "class_type": "SaveImage", + "_meta": { + "title": "Save Image" + } + }, + "30": { + "inputs": { + "txt_file": "Example.txt", + "daily_count": 3, + "scheduled": false + }, + "class_type": "DailyPromptScheduler", + "_meta": { + "title": "Daily Prompt Scheduler" + } + }, + "31": { + "inputs": { + "count": [ + "30", + 1 + ] + }, + "class_type": "TimeToSeedList", + "_meta": { + "title": "Time to Seed List" + } + } +} \ No newline at end of file