Skip to content

Commit 701ef18

Browse files
authored
Merge pull request #37 from hobbytp/feature/jimeng-api-support
Feature/jimeng api support
2 parents f6405f9 + 074a730 commit 701ef18

19 files changed

Lines changed: 2332 additions & 156 deletions

Makefile

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -167,25 +167,48 @@ generate-ai-covers:
167167
@echo "🤖 Using AI API to generate real cover images..."
168168
@echo ""
169169
@echo "📋 Supported AI services:"
170-
@echo " - ModelScope Qwen-image (default, recommended in China)"
170+
@echo " - Volcengine Jimeng (default, recommended in China)"
171+
@echo " - ModelScope Qwen-image"
171172
@echo " - OpenAI DALL-E (requires VPN)"
172173
@echo ""
173174
@echo "🔑 Environment variables:"
175+
@echo " # Volcengine (default):"
176+
@echo " export VOLCENGINE_ACCESS_KEY=\"your-access-key\""
177+
@echo " export VOLCENGINE_SECRET_KEY=\"your-secret-key\""
178+
@echo " export TEXT2IMAGE_PROVIDER=\"volcengine\" # optional, volcengine is default"
179+
@echo ""
180+
@echo " # ModelScope:"
174181
@echo " export MODELSCOPE_API_KEY=\"your-modelscope-key\""
175-
@echo " export TEXT2IMAGE_PROVIDER=\"modelscope\" # or \"openai\""
182+
@echo " export TEXT2IMAGE_PROVIDER=\"modelscope\""
183+
@echo ""
184+
@echo " # OpenAI:"
185+
@echo " export OPENAI_API_KEY=\"your-openai-key\""
186+
@echo " export TEXT2IMAGE_PROVIDER=\"openai\""
176187
@echo ""
177188
@echo "🚀 Execute generation:"
178189
@bash -lc '\
179190
set -a; \
180191
if [ -f .env ]; then . .env; echo "Environment variables loaded from .env"; else echo "No .env file found, using environment variables"; fi; \
181192
set +a; \
182-
if [ -n "$$MODELSCOPE_API_KEY" ] || [ -n "$$OPENAI_API_KEY" ]; then \
193+
if ([ -n "$$VOLCENGINE_ACCESS_KEY" ] && [ -n "$$VOLCENGINE_SECRET_KEY" ]) || [ -n "$$MODELSCOPE_API_KEY" ] || [ -n "$$OPENAI_API_KEY" ]; then \
183194
echo "Starting AI cover generation..."; \
184195
$(PYTHON_CMD) scripts/ai_cover_generator.py; \
185196
echo "✅ AI cover generation completed!"; \
186197
else \
187-
echo "⚠️ 警告: 未设置 MODELSCOPE_API_KEY 环境变量"; \
188-
echo "请在 .env 文件中添加: MODELSCOPE_API_KEY=your-key"; \
198+
echo "⚠️ 警告: 未设置必要的API密钥环境变量"; \
199+
echo "请在 .env 文件中添加以下任一配置:"; \
200+
echo ""; \
201+
echo " # Volcengine (默认):"; \
202+
echo " VOLCENGINE_ACCESS_KEY=your-access-key"; \
203+
echo " VOLCENGINE_SECRET_KEY=your-secret-key"; \
204+
echo ""; \
205+
echo " # 或 ModelScope:"; \
206+
echo " MODELSCOPE_API_KEY=your-key"; \
207+
echo " TEXT2IMAGE_PROVIDER=modelscope"; \
208+
echo ""; \
209+
echo " # 或 OpenAI:"; \
210+
echo " OPENAI_API_KEY=your-key"; \
211+
echo " TEXT2IMAGE_PROVIDER=openai"; \
189212
fi'
190213

191214
# 测试封面生成效果
@@ -226,13 +249,25 @@ generate-covers-for-directory:
226249
if [ "$(FORCE)" = "true" ] || [ "$(FORCE)" = "1" ]; then FORCE_FLAG="--force"; fi; \
227250
DRY_RUN_FLAG=""; \
228251
if [ "$(DRY_RUN)" = "true" ] || [ "$(DRY_RUN)" = "1" ]; then DRY_RUN_FLAG="--dry-run"; fi; \
229-
if [ -n "$$MODELSCOPE_API_KEY" ] || [ -n "$$OPENAI_API_KEY" ]; then \
252+
if ([ -n "$$VOLCENGINE_ACCESS_KEY" ] && [ -n "$$VOLCENGINE_SECRET_KEY" ]) || [ -n "$$MODELSCOPE_API_KEY" ] || [ -n "$$OPENAI_API_KEY" ]; then \
230253
echo "Starting AI cover generation for directory: $(DIRECTORY)..."; \
231254
$(PYTHON_CMD) scripts/generate_covers_for_directory.py $(DIRECTORY) $$RECURSIVE_FLAG $$FORCE_FLAG $$DRY_RUN_FLAG; \
232255
echo "✅ AI cover generation completed for directory: $(DIRECTORY)!"; \
233256
else \
234-
echo "⚠️ 警告: 未设置 MODELSCOPE_API_KEY 环境变量"; \
235-
echo "请在 .env 文件中添加: MODELSCOPE_API_KEY=your-key"; \
257+
echo "⚠️ 警告: 未设置必要的API密钥环境变量"; \
258+
echo "请在 .env 文件中添加以下任一配置:"; \
259+
echo ""; \
260+
echo " # Volcengine (默认):"; \
261+
echo " VOLCENGINE_ACCESS_KEY=your-access-key"; \
262+
echo " VOLCENGINE_SECRET_KEY=your-secret-key"; \
263+
echo ""; \
264+
echo " # 或 ModelScope:"; \
265+
echo " MODELSCOPE_API_KEY=your-key"; \
266+
echo " TEXT2IMAGE_PROVIDER=modelscope"; \
267+
echo ""; \
268+
echo " # 或 OpenAI:"; \
269+
echo " OPENAI_API_KEY=your-key"; \
270+
echo " TEXT2IMAGE_PROVIDER=openai"; \
236271
fi'
237272

238273
# 帮助信息

assets/css/custom.css

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,3 +1013,98 @@ body.has-sidebar > .header {
10131013
margin-top: 0.5rem;
10141014
}
10151015
}
1016+
1017+
/* AI Generated Cover Styles */
1018+
.ai-generated-cover {
1019+
width: 100%;
1020+
height: 200px;
1021+
display: flex;
1022+
align-items: center;
1023+
justify-content: center;
1024+
padding: 1.5rem;
1025+
position: relative;
1026+
overflow: hidden;
1027+
1028+
/* Default Gradient using CSS Variables */
1029+
--hue-1: calc(var(--base-hue) + 1);
1030+
--hue-2: calc(var(--base-hue) + 2);
1031+
--hue-3: calc(var(--base-hue) + 3);
1032+
1033+
background: linear-gradient(135deg,
1034+
hsl(var(--hue-1), 70%, 75%),
1035+
hsl(var(--hue-2), 70%, 80%),
1036+
hsl(var(--hue-3), 70%, 85%)
1037+
);
1038+
}
1039+
1040+
[data-theme="dark"] .ai-generated-cover {
1041+
background: linear-gradient(135deg,
1042+
hsl(var(--hue-1), 60%, 30%),
1043+
hsl(var(--hue-2), 60%, 35%),
1044+
hsl(var(--hue-3), 60%, 40%)
1045+
);
1046+
}
1047+
1048+
.ai-generated-cover::before {
1049+
content: '';
1050+
position: absolute;
1051+
top: -50%;
1052+
left: -50%;
1053+
width: 200%;
1054+
height: 200%;
1055+
background: repeating-linear-gradient(
1056+
45deg,
1057+
transparent,
1058+
transparent 10px,
1059+
rgba(255, 255, 255, 0.03) 10px,
1060+
rgba(255, 255, 255, 0.03) 20px
1061+
);
1062+
animation: slide 20s linear infinite;
1063+
}
1064+
1065+
@keyframes slide {
1066+
0% { transform: translate(0, 0); }
1067+
100% { transform: translate(20px, 20px); }
1068+
}
1069+
1070+
.ai-generated-cover .cover-content {
1071+
text-align: center;
1072+
color: white;
1073+
z-index: 1;
1074+
position: relative;
1075+
text-shadow: 0 2px 4px rgba(0,0,0,0.3);
1076+
}
1077+
1078+
.ai-generated-cover .cover-category {
1079+
font-size: 0.75rem;
1080+
background: rgba(255, 255, 255, 0.2);
1081+
padding: 0.25rem 0.75rem;
1082+
border-radius: 1rem;
1083+
margin-bottom: 0.75rem;
1084+
backdrop-filter: blur(10px);
1085+
border: 1px solid rgba(255, 255, 255, 0.1);
1086+
display: inline-block;
1087+
}
1088+
1089+
.ai-generated-cover .cover-title {
1090+
font-size: 1.25rem;
1091+
font-weight: 700;
1092+
margin: 0 0 0.5rem 0;
1093+
line-height: 1.2;
1094+
}
1095+
1096+
.ai-generated-cover .cover-description {
1097+
font-size: 0.875rem;
1098+
opacity: 0.9;
1099+
line-height: 1.4;
1100+
max-width: 90%;
1101+
margin: 0 auto;
1102+
}
1103+
1104+
/* Category Specific Gradients */
1105+
.ai-generated-cover.category-papers { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important; }
1106+
.ai-generated-cover.category-technologies { background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%) !important; }
1107+
.ai-generated-cover.category-projects { background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%) !important; }
1108+
.ai-generated-cover.category-ai_tools { background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%) !important; }
1109+
.ai-generated-cover.category-mas { background: linear-gradient(135deg, #fa709a 0%, #fee140 100%) !important; }
1110+
.ai-generated-cover.category-training { background: linear-gradient(135deg, #30cfd0 0%, #330867 100%) !important; }

0 commit comments

Comments
 (0)