修复数据库问题

This commit is contained in:
Kris Ka committed 2025-08-06 17:51:47 +08:00
1 parent b196cb62ad
commit 43dec49e04
27 files changed
+1991 -132

No files matched your search

+272
View File
@@ -270493,3 +270493,275 @@
2025-08-06 16:19:06,164 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:19:27,996 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:19:27,997 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:53:49,521 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:53:49,522 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:53:56,286 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:53:56,287 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:53:56,352 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 16:53:56,353 - backend.main - INFO - 数据库表创建完成
2025-08-06 16:53:56,354 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 16:54:03,376 - backend.main - INFO - 访问根端点
2025-08-06 16:54:44,485 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:54:44,485 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:54:44,535 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 16:54:44,536 - backend.main - INFO - 数据库表创建完成
2025-08-06 16:54:44,536 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 16:55:15,462 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:55:15,462 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:55:15,516 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 16:55:15,516 - backend.main - INFO - 数据库表创建完成
2025-08-06 16:55:15,517 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 16:56:42,843 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:56:42,843 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:56:42,895 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 16:56:42,896 - backend.main - INFO - 数据库表创建完成
2025-08-06 16:56:42,896 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 16:56:54,351 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:56:54,352 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:56:54,405 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 16:56:54,406 - backend.main - INFO - 数据库表创建完成
2025-08-06 16:56:54,406 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 16:57:22,469 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:57:22,469 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:57:22,521 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 16:57:22,521 - backend.main - INFO - 数据库表创建完成
2025-08-06 16:57:22,522 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 16:57:36,965 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
2025-08-06 16:57:56,741 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:57:56,742 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:57:56,819 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 16:57:56,820 - backend.main - INFO - 数据库表创建完成
2025-08-06 16:57:56,820 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 16:58:27,987 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:58:27,987 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:58:28,061 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 16:58:28,062 - backend.main - INFO - 数据库表创建完成
2025-08-06 16:58:28,062 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 16:59:05,440 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:59:05,441 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:59:05,510 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 16:59:05,511 - backend.main - INFO - 数据库表创建完成
2025-08-06 16:59:05,511 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 16:59:32,086 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
2025-08-06 16:59:49,979 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:59:49,980 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:59:50,064 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 16:59:50,065 - backend.main - INFO - 数据库表创建完成
2025-08-06 16:59:50,065 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:00:46,657 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:00:46,657 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:00:46,731 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:00:46,731 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:00:46,732 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:00:56,567 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:00:56,567 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:00:56,621 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:00:56,622 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:00:56,622 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:01:11,557 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
2025-08-06 17:03:16,672 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:03:16,672 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:03:16,741 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:03:16,742 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:03:16,742 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:03:31,861 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
2025-08-06 17:04:17,690 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:04:17,691 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:04:17,799 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:04:17,801 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:04:17,801 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:04:30,445 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:04:30,445 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:04:30,496 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:04:30,497 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:04:30,497 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:04:38,400 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:04:38,400 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:04:38,450 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:04:38,451 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:04:38,451 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:04:56,025 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
2025-08-06 17:05:47,870 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:05:47,870 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:05:47,921 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:05:47,922 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:05:47,922 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:06:01,190 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
2025-08-06 17:07:12,421 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
2025-08-06 17:08:12,568 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:08:12,569 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:08:12,634 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:08:12,634 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:08:12,634 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:08:28,320 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:08:28,320 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:08:28,369 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:08:28,369 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:08:28,370 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:08:45,319 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:08:45,319 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:08:45,387 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:08:45,388 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:08:45,388 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:08:57,474 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:08:57,474 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:08:57,524 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:08:57,524 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:08:57,524 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:09:09,929 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:09:09,930 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:09:09,980 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:09:09,980 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:09:09,981 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:09:22,037 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:09:22,037 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:09:22,101 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:09:22,102 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:09:22,102 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:09:42,110 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
2025-08-06 17:11:12,308 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:11:12,308 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:11:12,378 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:11:12,379 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:11:12,380 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:11:26,301 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:11:26,302 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:11:26,368 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:11:26,369 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:11:26,369 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:11:39,655 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:11:39,656 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:11:39,722 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:11:39,724 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:11:39,724 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:11:52,013 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:11:52,014 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:11:52,079 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:11:52,080 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:11:52,080 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:12:03,804 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:12:03,804 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:12:03,858 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:12:03,859 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:12:03,859 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:12:16,233 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:12:16,234 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:12:16,299 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:12:16,300 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:12:16,300 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:13:21,729 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
2025-08-06 17:15:16,083 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:15:16,083 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:15:16,149 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:15:16,150 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:15:16,150 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:19:13,816 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:19:13,816 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:19:13,880 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:19:13,881 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:19:13,881 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:22:20,920 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:22:20,921 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:22:20,986 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:22:20,986 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:22:20,987 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:22:44,864 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:22:44,864 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:22:44,913 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:22:44,914 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:22:44,914 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:23:11,778 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:23:11,778 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:23:11,829 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:23:11,830 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:23:11,830 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:23:24,307 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:23:24,307 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:23:24,358 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:23:24,358 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:23:24,359 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:23:41,578 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:23:41,578 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:23:41,626 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:23:41,627 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:23:41,627 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:23:55,750 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:23:55,750 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:23:55,800 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:23:55,801 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:23:55,801 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:25:11,212 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:25:11,215 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:25:11,280 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:25:11,281 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:25:11,281 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:25:28,388 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:25:28,390 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:25:28,439 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:25:28,440 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:25:28,440 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:25:55,127 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:25:55,129 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:25:55,179 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:25:55,179 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:25:55,179 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:26:15,561 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:26:15,563 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:26:15,633 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:26:15,634 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:26:15,634 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:26:31,018 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:26:31,020 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:26:31,087 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:26:31,087 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:26:31,087 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:26:48,110 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:26:48,112 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:26:48,179 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:26:48,180 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:26:48,180 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:27:56,784 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:27:56,784 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:27:56,833 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:27:56,834 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:27:56,834 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:28:52,954 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:28:52,954 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:28:53,003 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:28:53,003 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:28:53,004 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:29:06,568 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:29:06,569 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:29:06,616 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:29:06,617 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:29:06,617 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:29:31,221 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:29:31,221 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:29:31,270 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:29:31,271 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:29:31,271 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:29:47,491 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:29:47,491 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:29:47,540 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:29:47,541 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:29:47,541 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:30:09,544 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:30:09,544 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:30:09,593 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:30:09,593 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:30:09,594 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:30:25,831 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:30:25,831 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:30:25,882 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:30:25,882 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:30:25,882 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:30:45,521 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:30:45,521 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:30:45,587 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:30:45,588 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:30:45,588 - backend.main - INFO - API密钥已加载到环境变量
2025-08-06 17:31:01,178 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:31:01,180 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:31:01,244 - backend.main - INFO - 启动AutoClip API服务...
2025-08-06 17:31:01,245 - backend.main - INFO - 数据库表创建完成
2025-08-06 17:31:01,245 - backend.main - INFO - API密钥已加载到环境变量
+40 -41
View File
@@ -6,17 +6,18 @@ from typing import List, Optional
from datetime import datetime
from fastapi import APIRouter, Depends, HTTPException, Query, UploadFile, File, Form
from sqlalchemy.orm import Session
from backend.core.database import get_db
from backend.services.project_service import ProjectService
from backend.services.processing_service import ProcessingService
from backend.services.websocket_notification_service import WebSocketNotificationService
from backend.tasks.processing import process_video_pipeline
from backend.core.websocket_manager import manager as websocket_manager
from backend.schemas.project import (
from core.database import get_db
from services.project_service import ProjectService
from services.processing_service import ProcessingService
from services.websocket_notification_service import WebSocketNotificationService
from tasks.processing import process_video_pipeline
from core.websocket_manager import manager as websocket_manager
from schemas.project import (
ProjectCreate, ProjectUpdate, ProjectResponse, ProjectListResponse, ProjectFilter,
ProjectType, ProjectStatus
)
from backend.schemas.base import PaginationParams
from schemas.task import TaskType
from schemas.base import PaginationParams
from pathlib import Path
router = APIRouter()
@@ -95,8 +96,8 @@ async def upload_files(
id=str(project.id),
name=str(project.name),
description=str(project.description) if project.description else None,
project_type=ProjectType(project.project_type.value),
status=ProjectStatus(project.status.value),
project_type=ProjectType(project.project_type) if hasattr(project.project_type, 'value') else ProjectType(project.project_type),
status=ProjectStatus(project.status) if hasattr(project.status, 'value') else ProjectStatus(project.status),
source_url=project.project_metadata.get("source_url") if project.project_metadata else None,
source_file=project.project_metadata.get("source_file") if project.project_metadata else None,
settings=project.processing_config,
@@ -124,8 +125,8 @@ async def create_project(
id=str(project.id), # Use actual project ID
name=str(project.name),
description=str(project.description) if project.description else None,
project_type=ProjectType(project.project_type.value),
status=ProjectStatus(project.status.value),
project_type=ProjectType(project.project_type) if hasattr(project.project_type, 'value') else ProjectType(project.project_type),
status=ProjectStatus(project.status) if hasattr(project.status, 'value') else ProjectStatus(project.status),
source_url=project.project_metadata.get("source_url") if project.project_metadata else None,
source_file=str(project.video_path) if project.video_path else None,
settings=project.processing_config or {},
@@ -195,19 +196,19 @@ async def update_project(
if not project:
raise HTTPException(status_code=404, detail="Project not found")
# Convert to response (simplified)
# Convert to response using the updated project data
return ProjectResponse(
id=str(project_id), # Keep as string for UUID
name=project_data.name or "Updated Project",
description=project_data.description,
project_type=ProjectType.DEFAULT, # Use enum
status=ProjectStatus.PENDING, # Use enum
source_url=None,
source_file=None,
settings=project_data.settings or {},
created_at=datetime.utcnow(),
updated_at=datetime.utcnow(),
completed_at=None,
id=str(project_id),
name=project.name,
description=project.description,
project_type=ProjectType(project.project_type.value if hasattr(project.project_type, 'value') else project.project_type),
status=ProjectStatus(project.status.value if hasattr(project.status, 'value') else project.status),
source_url=project.project_metadata.get("source_url") if project.project_metadata else None,
source_file=str(project.video_path) if project.video_path else None,
settings=project.processing_config or {},
created_at=project.created_at,
updated_at=project.updated_at,
completed_at=project.completed_at,
total_clips=0,
total_collections=0,
total_tasks=0
@@ -250,7 +251,7 @@ async def start_processing(
raise HTTPException(status_code=404, detail="Project not found")
# 检查项目状态
if project.status.value not in ["pending", "failed"]:
if project.status not in ["pending", "failed"]:
raise HTTPException(status_code=400, detail="Project is not in pending or failed status")
# 获取视频和SRT文件路径
@@ -277,22 +278,21 @@ async def start_processing(
# 发送WebSocket通知:处理开始
await websocket_service.send_processing_started(
project_id=int(project_id),
project_id=project_id,
message="开始视频处理流程"
)
# 提交Celery任务
celery_task = process_video_pipeline.delay(
project_id=int(project_id),
project_id=project_id,
input_video_path=str(video_path),
input_srt_path=str(srt_path)
)
# 创建处理任务记录
task_result = processing_service._create_processing_task(
project_id=int(project_id),
task_type="video_pipeline",
celery_task_id=celery_task.id
project_id=project_id,
task_type=TaskType.VIDEO_PROCESSING
)
return {
@@ -309,7 +309,7 @@ async def start_processing(
# 发送错误通知
try:
await websocket_service.send_processing_error(
project_id=int(project_id),
project_id=project_id,
error=str(e),
step="initialization"
)
@@ -333,7 +333,7 @@ async def retry_processing(
raise HTTPException(status_code=404, detail="Project not found")
# 检查项目状态
if project.status.value not in ["failed", "completed"]:
if project.status not in ["failed", "completed"]:
raise HTTPException(status_code=400, detail="Project is not in failed or completed status")
# 重置项目状态
@@ -341,7 +341,7 @@ async def retry_processing(
# 发送WebSocket通知
await websocket_service.send_processing_started(
project_id=int(project_id),
project_id=project_id,
message="重新开始处理流程"
)
@@ -365,16 +365,15 @@ async def retry_processing(
# 提交Celery任务
celery_task = process_video_pipeline.delay(
project_id=int(project_id),
project_id=project_id,
input_video_path=str(video_path),
input_srt_path=str(srt_path)
)
# 创建新的处理任务记录
task_result = processing_service._create_processing_task(
project_id=int(project_id),
task_type="video_pipeline_retry",
celery_task_id=celery_task.id
project_id=project_id,
task_type="video_pipeline_retry"
)
return {
@@ -390,7 +389,7 @@ async def retry_processing(
except Exception as e:
try:
await websocket_service.send_processing_error(
project_id=int(project_id),
project_id=project_id,
error=str(e),
step="retry_initialization"
)
@@ -415,7 +414,7 @@ async def resume_processing(
raise HTTPException(status_code=404, detail="Project not found")
# 检查项目状态
if project.status.value not in ["failed", "processing", "pending"]:
if project.status not in ["failed", "processing", "pending"]:
raise HTTPException(status_code=400, detail="Project is not in failed, processing, or pending status")
# 验证步骤名称
@@ -447,7 +446,7 @@ async def resume_processing(
# 发送WebSocket通知
await websocket_service.send_processing_started(
project_id=int(project_id),
project_id=project_id,
message=f"从步骤 {start_step} 恢复处理流程"
)
@@ -471,7 +470,7 @@ async def resume_processing(
except Exception as e:
try:
await websocket_service.send_processing_error(
project_id=int(project_id),
project_id=project_id,
error=str(e),
step=f"resume_{start_step}"
)
+7 -6
View File
@@ -61,17 +61,18 @@ async def get_tasks(
task_responses.append(TaskResponse(
id=str(task.id),
project_id=task.project_id,
name=task.name, # 添加name字段
name=task.name,
task_type=task.task_type,
status=TaskStatus(task.status),
celery_task_id=task.celery_task_id,
current_step=task.current_step,
total_steps=task.total_steps,
progress=task.progress,
error_message=task.error_message,
task_config=task.task_config or {},
result=task.result_data,
error_message=task.error_message,
priority=task.priority,
metadata=task.task_metadata or {},
created_at=task.created_at,
updated_at=task.updated_at,
started_at=task.started_at,
completed_at=task.completed_at
))
@@ -335,7 +336,7 @@ async def retry_task(
@router.get("/project/{project_id}", response_model=TaskListResponse)
async def get_project_tasks(
project_id: int,
project_id: str,
page: int = Query(1, ge=1, description="Page number"),
size: int = Query(20, ge=1, le=100, description="Page size"),
status: Optional[str] = Query(None, description="Filter by task status"),
+84
View File
@@ -47,3 +47,87 @@
2025-08-06 16:27:17,506 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:27:17,506 - main - INFO - 数据库表创建完成
2025-08-06 16:27:17,507 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:37:34,139 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:37:34,140 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:37:34,207 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:37:34,208 - main - INFO - 数据库表创建完成
2025-08-06 16:37:34,208 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:38:47,321 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:38:47,322 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:38:47,374 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:38:47,375 - main - INFO - 数据库表创建完成
2025-08-06 16:38:47,375 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:39:43,400 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:39:43,400 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:39:43,453 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:39:43,454 - main - INFO - 数据库表创建完成
2025-08-06 16:39:43,454 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:41:37,870 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:41:37,870 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:41:37,937 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:41:37,938 - main - INFO - 数据库表创建完成
2025-08-06 16:41:37,938 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:41:49,381 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:41:49,381 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:41:49,434 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:41:49,435 - main - INFO - 数据库表创建完成
2025-08-06 16:41:49,435 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:42:12,124 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: f70ba71d-53e3-4162-acc0-c80da61a05eb - processing
2025-08-06 16:42:23,765 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:42:23,766 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:42:23,836 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:42:23,836 - main - INFO - 数据库表创建完成
2025-08-06 16:42:23,836 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:43:02,751 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: f70ba71d-53e3-4162-acc0-c80da61a05eb - processing
2025-08-06 16:43:25,482 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:43:25,482 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:43:25,536 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:43:25,537 - main - INFO - 数据库表创建完成
2025-08-06 16:43:25,537 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:43:40,539 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:43:40,539 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:43:40,591 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:43:40,592 - main - INFO - 数据库表创建完成
2025-08-06 16:43:40,592 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:44:07,516 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: f70ba71d-53e3-4162-acc0-c80da61a05eb - processing
2025-08-06 16:44:27,637 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:44:27,637 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:44:27,692 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:44:27,693 - main - INFO - 数据库表创建完成
2025-08-06 16:44:27,693 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:44:43,074 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:44:43,074 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:44:43,127 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:44:43,128 - main - INFO - 数据库表创建完成
2025-08-06 16:44:43,128 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:45:13,621 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 16:45:13,622 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 16:45:13,676 - main - INFO - 启动AutoClip API服务...
2025-08-06 16:45:13,677 - main - INFO - 数据库表创建完成
2025-08-06 16:45:13,677 - main - INFO - API密钥已加载到环境变量
2025-08-06 16:45:39,549 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 9e930785-38da-468c-b4f3-875e0c5eb501 - processing
2025-08-06 17:41:42,018 - services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:41:49,745 - services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:42:08,512 - services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:42:08,515 - services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:42:15,599 - services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:42:15,600 - services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:44:16,206 - services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:44:16,208 - services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:44:22,473 - services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:44:22,473 - services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:44:22,855 - services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:44:22,855 - services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:47:17,234 - services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:47:17,235 - services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:47:17,263 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:47:17,310 - main - INFO - 启动AutoClip API服务...
2025-08-06 17:47:17,311 - main - INFO - 数据库表创建完成
2025-08-06 17:47:17,311 - main - INFO - API密钥已加载到环境变量
2025-08-06 17:48:13,664 - main - INFO - 访问根端点
2025-08-06 17:50:59,350 - services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:50:59,351 - services.processing_orchestrator - INFO - 流水线模块导入成功
2025-08-06 17:50:59,386 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
2025-08-06 17:50:59,434 - main - INFO - 启动AutoClip API服务...
2025-08-06 17:50:59,434 - main - INFO - 数据库表创建完成
2025-08-06 17:50:59,435 - main - INFO - API密钥已加载到环境变量
+4 -4
View File
@@ -8,10 +8,10 @@ from typing import Dict, Any, Optional, Callable
from datetime import datetime
from sqlalchemy.orm import Session
from backend.models.task import Task
from backend.models.project import Project
from backend.services.websocket_notification_service import WebSocketNotificationService
from backend.core.websocket_manager import manager as websocket_manager
from models.task import Task
from models.project import Project
from services.websocket_notification_service import WebSocketNotificationService
from core.websocket_manager import manager as websocket_manager
logger = logging.getLogger(__name__)
@@ -0,0 +1,703 @@
1
00:00:00,210 --> 00:00:01,932
你们都是什么区块链
2
00:00:03,200 --> 00:00:04,500
我说一句话
3
00:00:04,500 --> 00:00:07,888
比你外面你自己或你自己瞎操作十年二十年都有用
4
00:00:08,780 --> 00:00:09,548
但是你听不懂
5
00:00:10,530 --> 00:00:11,280
配三个固态
6
00:00:11,280 --> 00:00:12,320
那哥们儿那你出来
7
00:00:12,500 --> 00:00:13,508
这不是你他妈又割了
8
00:00:14,050 --> 00:00:15,818
割了说因为Z哥说要控制风险
9
00:00:15,830 --> 00:00:16,565
所以我他妈割了
10
00:00:16,680 --> 00:00:18,090
所以我说傻逼叫你炒股
11
00:00:18,090 --> 00:00:19,034
你赚钱跟我没关系
12
00:00:19,040 --> 00:00:20,480
你他妈亏钱就是他让我买的
13
00:00:20,700 --> 00:00:21,663
我他妈从来没让你买
14
00:00:21,920 --> 00:00:22,390
对吗
15
00:00:22,870 --> 00:00:23,686
配置还是配置
16
00:00:23,770 --> 00:00:26,058
你他妈一个仓配配了三个固态
17
00:00:26,060 --> 00:00:27,360
你那赖谁
18
00:00:28,610 --> 00:00:29,780
所以这钱你认知不够
19
00:00:29,780 --> 00:00:30,650
你就赚不了
20
00:00:30,970 --> 00:00:31,579
很正常
21
00:00:31,580 --> 00:00:32,300
你就赚不了
22
00:00:34,760 --> 00:00:35,390
配三个固态
23
00:00:35,390 --> 00:00:37,040
哥们儿前天还发视频总结自己成绩
24
00:00:37,160 --> 00:00:37,680
是吗
25
00:00:37,680 --> 00:00:38,728
他觉得他行了是吗
26
00:00:39,110 --> 00:00:39,990
他不骂我了
27
00:00:40,240 --> 00:00:41,640
他他他他不卖门
28
00:00:41,640 --> 00:00:43,134
他妈的诋毁我了是吗
29
00:00:44,230 --> 00:00:45,210
人性人性
30
00:00:45,350 --> 00:00:47,950
我操这人人性人性
31
00:00:48,080 --> 00:00:50,790
我操没办法
32
00:00:50,790 --> 00:00:54,320
这他妈人性是不是人性
33
00:00:54,940 --> 00:00:58,056
我周三我说我说没准你下礼拜就ZGNB了
34
00:00:58,380 --> 00:00:58,880
对吗
35
00:01:01,000 --> 00:01:03,272
所以我说这个市场永远是有经验人赚
36
00:01:03,280 --> 00:01:05,247
没经验钱的地方
37
00:01:06,390 --> 00:01:07,720
就是说什么意思
38
00:01:07,720 --> 00:01:08,746
我不是吹牛逼
39
00:01:08,750 --> 00:01:11,846
咱上礼拜三我给你们举的那五个还是四个
40
00:01:11,860 --> 00:01:13,520
四个还是五个例子来着
41
00:01:13,690 --> 00:01:17,630
我忘了就那那哥们儿那个短线到后面周四周五接着涨
42
00:01:18,430 --> 00:01:21,334
康康又登了10% 10几
43
00:01:21,570 --> 00:01:24,882
一根涨停加一个6%还是7
44
00:01:25,140 --> 00:01:25,690
是吧
45
00:01:27,390 --> 00:01:30,030
某康俩涨停
46
00:01:31,160 --> 00:01:37,348
然后那个国某矿直接把周五登进来是吧
47
00:01:37,350 --> 00:01:38,294
然后还有什么来着
48
00:01:38,530 --> 00:01:39,610
我忘了记不清了
49
00:01:40,570 --> 00:01:43,658
然后那陈他没买买进去的又一根长阳
50
00:01:43,670 --> 00:01:44,230
对吧
51
00:01:44,890 --> 00:01:45,940
这他妈就是水平
52
00:01:46,080 --> 00:01:47,438
你别你还别不服
53
00:01:47,440 --> 00:01:53,936
我操就有那那你那黑子说听周三的跟大直播没还没比大直播要无聊
54
00:01:53,950 --> 00:01:58,010
他说那所以可能他妈是可能玩鞋或者喝喝酒的
55
00:01:58,010 --> 00:01:58,370
是​‌​‌​​‌‌​​‌‌​​‌‌​‌​‌​​‌‌‌​‌‌‌‌​‌​​‌‌​​‌‌​​‌‌​​‌‌​​‌‌‌‌​‌‌​‌‌​​‌‌‌‌‌‌​​‌‌​‌​‌‌‌​‌​​‌‌‌‌​‌​‌‌​​​‌‌‌‌‌‌​​‌‌‌‌​‌‌‌​‌​‌​‌​​‌‌‌​‌‌​​‌‌​​​‌​​‌‌​​‌‌‌‌​‌​‌​‌​​‌‌​​‌‌‌‌​‌​‌‌‌‌‌​‌​‌‌‌‌‌​‌​‌​‌​​‌‌‌‌‌​​​‌‌‌​​‌‌‌​‌‌‌‌​​​‌‌‌​‌‌​​‌‌‌​‌‌‌‌​‌​​‌‌​​‌‌‌‌‌​​​‌‌​‌‌​​​‌‌​​‌‌​​‌‌​​‌‌‌‌​‌‌‌​‌​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​‌​‌​​‌‌​‌​‌​​‌‌‌​‌‌​​‌‌‌​‌‌‌‌​‌‌‌‌‌​​‌‌‌‌​‌​​‌‌‌​​‌‌‌​‌​‌‌‌​​‌‌‌​‌‌​​‌‌​‌​‌​​‌‌​‌‌‌‌‌​‌‌​​‌​​‌‌​​​‌​​‌‌​‌‌‌‌‌​‌​​‌‌‌‌​‌​‌‌‌​​‌‌‌‌‌​​​‌‌​‌‌‌‌‌​‌‌‌​‌​​‌‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌​‌​‌‌‌​‌​​‌‌​​‌‌​‌​‌​​‌‌‌​‌‌‌‌​‌‌‌​‌​​‌‌​​‌‌‌‌​‌​‌​‌‌‌​‌‌‌​‌‌‌​‌​‌‌​​​‌‌‌​‌‌‌‌​‌‌​​‌​​‌‌​‌​‌‌‌​‌​‌​‌‌‌​‌​‌‌‌‌‌​‌‌‌‌‌​​‌‌​‌​‌​​‌‌​‌​‌‌‌​‌‌​​‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌​​‌‌‌‌​‌​​‌‌‌​​‌‌‌​‌​​‌‌​​‌‌‌​​‌​​‌‌‌‌​‌​​‌‌​‌‌​​​‌‌‌‌‌‌​​‌‌​‌‌‌‌‌​‌‌‌‌​​​‌‌​​​‌​​‌‌​‌‌‌‌‌​‌‌‌​‌​​‌‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌​‌‌​​‌‌​​‌‌​​‌‌​‌‌‌​​‌‌​​‌‌‌‌​‌‌‌​‌‌‌​‌​‌​‌‌‌​‌‌​‌‌‌‌​‌​​‌‌‌‌​‌​​​‌​​‌‌​​‌‌​​‌‌‌​‌‌​​‌‌‌‌​‌​​‌‌​​‌‌​​‌‌‌‌​‌​​‌‌‌‌‌​​​‌‌‌​‌‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌​​‌​​‌‌​‌​‌‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌‌‌​‌‌‌​‌​‌‌‌​​‌‌‌‌‌​​​‌‌​‌​‌​​‌‌‌‌​‌​​‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌​‌‌‌‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌‌‌​​‌‌‌‌‌‌​​‌‌​‌‌‌​​‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​​‌​​‌‌​​‌‌​​‌‌‌​​‌​​‌‌‌​​‌​​‌‌​‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌Line truncated
56
00:01:58,550 --> 00:01:59,378
就是你听不懂
57
00:02:00,230 --> 00:02:00,760
所以听不懂
58
00:02:00,760 --> 00:02:01,388
认知不够
59
00:02:01,390 --> 00:02:02,086
那么就没办法
60
00:02:02,090 --> 00:02:03,962
无知者无畏才会说出这种话
61
00:02:05,360 --> 00:02:07,592
踏踏实实看两个70%到是吧
62
00:02:07,600 --> 00:02:09,283
你这他妈实打实的吗
63
00:02:09,290 --> 00:02:10,958
傻逼续费对吗
64
00:02:11,440 --> 00:02:14,116
说如果说这哥们儿包括续费
65
00:02:14,120 --> 00:02:17,054
现在周三两万多同屏
66
00:02:18,040 --> 00:02:19,370
我诚惶诚恐
67
00:02:19,660 --> 00:02:20,050
真的
68
00:02:20,050 --> 00:02:22,294
咱家当时3000到5000特别自由
69
00:02:23,810 --> 00:02:25,079
现在充电视频两万多
70
00:02:25,080 --> 00:02:25,905
我诚惶诚恐
71
00:02:25,910 --> 00:02:27,080
说实话真的
72
00:02:30,080 --> 00:02:32,852
所以我还是这块儿我想告诉大家
73
00:02:33,430 --> 00:02:33,758
什么意思
74
00:02:33,760 --> 00:02:39,280
就是说咱们一保护咱们直播间不容易
75
00:02:39,590 --> 00:02:42,837
在B站能够有这样一个非常开心的地方
76
00:02:42,850 --> 00:02:43,898
我觉得非常不容易
77
00:02:44,200 --> 00:02:49,348
另外第二就是说也请你们珍惜
78
00:02:49,360 --> 00:02:55,022
我还愿意说真的虽然那几个杂毛不超过五个
79
00:02:55,430 --> 00:02:58,269
咱家他妈每每礼拜大大直播的十几万人
80
00:02:58,870 --> 00:02:59,927
咱们不超过五个
81
00:03:01,490 --> 00:03:06,950
但是人性我经历过人性你能明白吗
82
00:03:07,510 --> 00:03:11,386
就比如说咱们上礼拜大直播
83
00:03:12,500 --> 00:03:14,580
我说反内卷
84
00:03:14,720 --> 00:03:17,814
我专门讲了一晚上反内卷对吗
85
00:03:19,620 --> 00:03:20,868
周五是不是反内卷
86
00:03:22,800 --> 00:03:25,124
然后我之前说我上周说的是反对
87
00:03:25,130 --> 00:03:25,778
眼都瞪起来了
88
00:03:25,780 --> 00:03:26,770
别着急我等回来
89
00:03:26,770 --> 00:03:27,340
等下来
90
00:03:27,720 --> 00:03:28,300
等他下来
91
00:03:28,300 --> 00:03:28,789
等下来
92
00:03:29,410 --> 00:03:30,280
周五是什么
93
00:03:30,400 --> 00:03:32,688
煤炭对吧
94
00:03:33,100 --> 00:03:33,410
稀土
95
00:03:36,600 --> 00:03:39,336
然后水利就乱七八糟
96
00:03:39,340 --> 00:03:41,836
这些你们平时就咱们看不到
97
00:03:41,840 --> 00:03:43,465
我说我跟他讲的都是机构思维
98
00:03:44,470 --> 00:03:46,630
机构思维不是你那种抱着说
99
00:03:47,060 --> 00:03:48,660
说完以后马上就涨起来
100
00:03:48,820 --> 00:03:49,288
不一定
101
00:03:50,530 --> 00:03:54,273
但是概率足够大比你下芝麻轮那些要大很多
102
00:03:55,310 --> 00:03:56,949
就是我微信打开我那些群
103
00:03:57,850 --> 00:03:59,390
都是什么类的群
104
00:03:59,670 --> 00:04:01,778
跟你打开那些他妈小姐姐小妹妹的裙子
105
00:04:01,790 --> 00:04:02,665
他妈什么不一样
106
00:04:02,670 --> 00:04:06,058
哥们踏踏实实就是很简单
107
00:04:06,060 --> 00:04:08,418
你行你上对吗
108
00:04:08,610 --> 00:04:10,338
你你你行你上
109
00:04:11,580 --> 00:04:14,375
包括下礼拜上周反内卷没涨完
110
00:04:14,670 --> 00:04:16,713
没没没休息一礼拜了
111
00:04:16,920 --> 00:04:17,508
接着轮
112
00:04:18,230 --> 00:04:19,693
就是他妈的没准接着作业
113
00:04:19,700 --> 00:04:22,534
接着我就那些还没有轮动到的
114
00:04:22,540 --> 00:04:25,580
别着急踏踏实实那踏踏实实
115
00:04:35,320 --> 00:04:38,656
然后还有我我我我想到哪儿
116
00:04:38,660 --> 00:04:39,050
我说到哪儿
117
00:04:39,170 --> 00:04:41,686
因为咱们直播主要就是一个蛋逼直播间
118
00:04:43,750 --> 00:04:48,235
有有一些朋友大概我看了有七八个
119
00:04:48,590 --> 00:04:49,910
后台给我截图
120
00:04:50,280 --> 00:04:54,620
其中还有一个还还有一些是跟的时间比较长的
121
00:04:55,260 --> 00:04:59,385
我不知道周三录播你们都看没看啊
122
00:04:59,790 --> 00:05:06,612
就是这个我后来后面专门给你们讲的案例
123
00:05:06,780 --> 00:05:09,104
我讲第一选出来
124
00:05:09,110 --> 00:05:10,250
当天选完之后
125
00:05:10,250 --> 00:05:13,488
第二天比如那天比例选了217个
126
00:05:14,050 --> 00:05:16,258
第一第二天涨停的只有一个
127
00:05:16,580 --> 00:05:18,637
相当于是2百17分之1
128
00:05:19,130 --> 00:05:22,570
但是我给你们往上翻三个交易日前的
129
00:05:23,950 --> 00:05:25,358
我怀孕了什么意思
130
00:05:26,120 --> 00:05:27,896
哥们儿你怀孕了跟我说干嘛
131
00:05:28,310 --> 00:05:29,798
他老师该该找谁去
132
00:05:31,860 --> 00:05:32,540
说哪儿了
133
00:05:32,540 --> 00:05:35,428
对你往三天前一番
134
00:05:36,000 --> 00:05:41,814
然后周三的时候一看是单3到5个涨停
135
00:05:42,190 --> 00:05:42,568
是不是
136
00:05:42,880 --> 00:05:45,270
3到5个涨停什么意思
137
00:05:45,940 --> 00:05:46,930
再强调一遍
138
00:05:48,130 --> 00:05:52,882
第一叫潜伏好不好
139
00:05:53,930 --> 00:05:57,787
B一潜伏不是说B一一进去马上坑就掉下来
140
00:05:58,530 --> 00:06:01,346
那概率就是200分之1
141
00:06:03,020 --> 00:06:04,571
还是在市场不暴跌的时候
142
00:06:05,100 --> 00:06:08,976
B一进去绝大部分时间你要等2到3天
143
00:06:10,060 --> 00:06:12,293
甚至个别板块等3到5天
144
00:06:14,130 --> 00:06:15,618
这句话能不能明白
145
00:06:16,330 --> 00:06:21,270
而B2进去才是已经确认了B一牛逼的情况下
146
00:06:21,410 --> 00:06:22,450
B一成立的情况下
147
00:06:22,450 --> 00:06:23,647
他可能会快速蹬几根
148
00:06:24,630 --> 00:06:25,894
所以先不要管B2
149
00:06:25,900 --> 00:06:27,180
先说B1
150
00:06:27,410 --> 00:06:29,060
所以说你们第一轮进去的
151
00:06:29,140 --> 00:06:30,860
不要抱着不切实际幻想
152
00:06:30,860 --> 00:06:32,948
说我今天第一轮完明天就涨
153
00:06:33,300 --> 00:06:34,972
说有没有可能有2 1%
154
00:06:34,980 --> 00:06:36,079
你就记住这概率
155
00:06:36,080 --> 00:06:37,536
市场未来好多1%
156
00:06:38,530 --> 00:06:40,194
你100个票第一
157
00:06:40,460 --> 00:06:42,847
你虾芝麻轮忙忙忙选进去
158
00:06:43,060 --> 00:06:47,146
第二天也是1%的2 1%的涨停的概率
159
00:06:47,950 --> 00:06:51,910
5%以上可能是说50分之1或者80分之1就这样了
160
00:06:53,500 --> 00:06:55,130
但是你他妈三天后再看
161
00:06:55,630 --> 00:06:57,205
或者2到3天后再看
162
00:07:00,030 --> 00:07:01,260
所以这块能不能听明白
163
00:07:02,410 --> 00:07:04,160
第一叫潜伏
164
00:07:06,070 --> 00:07:09,271
B2才是买完之后必须的
165
00:07:10,370 --> 00:07:13,695
即使B2也有大概率是那天给你们看的案例
166
00:07:13,710 --> 00:07:15,208
一个是国某矿业
167
00:07:15,650 --> 00:07:17,762
我调了三天周五才定下来
168
00:07:18,010 --> 00:07:18,540
对吗
169
00:07:18,710 --> 00:07:20,355
不破止损就拿着
170
00:07:20,360 --> 00:07:21,018
但对于很多人讲
171
00:07:21,020 --> 00:07:23,561
B2那1根启动的太长了
172
00:07:23,790 --> 00:07:24,498
拿不了
173
00:07:24,500 --> 00:07:25,178
拿不住
174
00:07:25,470 --> 00:07:26,366
B一还没整明白
175
00:07:26,500 --> 00:07:28,489
所以先踏踏实实把B一整明白
176
00:07:29,330 --> 00:07:30,930
把B一的止损整明白
@@ -0,0 +1,703 @@
1
00:00:00,210 --> 00:00:01,932
你们都是什么区块链
2
00:00:03,200 --> 00:00:04,500
我说一句话
3
00:00:04,500 --> 00:00:07,888
比你外面你自己或你自己瞎操作十年二十年都有用
4
00:00:08,780 --> 00:00:09,548
但是你听不懂
5
00:00:10,530 --> 00:00:11,280
配三个固态
6
00:00:11,280 --> 00:00:12,320
那哥们儿那你出来
7
00:00:12,500 --> 00:00:13,508
这不是你他妈又割了
8
00:00:14,050 --> 00:00:15,818
割了说因为Z哥说要控制风险
9
00:00:15,830 --> 00:00:16,565
所以我他妈割了
10
00:00:16,680 --> 00:00:18,090
所以我说傻逼叫你炒股
11
00:00:18,090 --> 00:00:19,034
你赚钱跟我没关系
12
00:00:19,040 --> 00:00:20,480
你他妈亏钱就是他让我买的
13
00:00:20,700 --> 00:00:21,663
我他妈从来没让你买
14
00:00:21,920 --> 00:00:22,390
对吗
15
00:00:22,870 --> 00:00:23,686
配置还是配置
16
00:00:23,770 --> 00:00:26,058
你他妈一个仓配配了三个固态
17
00:00:26,060 --> 00:00:27,360
你那赖谁
18
00:00:28,610 --> 00:00:29,780
所以这钱你认知不够
19
00:00:29,780 --> 00:00:30,650
你就赚不了
20
00:00:30,970 --> 00:00:31,579
很正常
21
00:00:31,580 --> 00:00:32,300
你就赚不了
22
00:00:34,760 --> 00:00:35,390
配三个固态
23
00:00:35,390 --> 00:00:37,040
哥们儿前天还发视频总结自己成绩
24
00:00:37,160 --> 00:00:37,680
是吗
25
00:00:37,680 --> 00:00:38,728
他觉得他行了是吗
26
00:00:39,110 --> 00:00:39,990
他不骂我了
27
00:00:40,240 --> 00:00:41,640
他他他他不卖门
28
00:00:41,640 --> 00:00:43,134
他妈的诋毁我了是吗
29
00:00:44,230 --> 00:00:45,210
人性人性
30
00:00:45,350 --> 00:00:47,950
我操这人人性人性
31
00:00:48,080 --> 00:00:50,790
我操没办法
32
00:00:50,790 --> 00:00:54,320
这他妈人性是不是人性
33
00:00:54,940 --> 00:00:58,056
我周三我说我说没准你下礼拜就ZGNB了
34
00:00:58,380 --> 00:00:58,880
对吗
35
00:01:01,000 --> 00:01:03,272
所以我说这个市场永远是有经验人赚
36
00:01:03,280 --> 00:01:05,247
没经验钱的地方
37
00:01:06,390 --> 00:01:07,720
就是说什么意思
38
00:01:07,720 --> 00:01:08,746
我不是吹牛逼
39
00:01:08,750 --> 00:01:11,846
咱上礼拜三我给你们举的那五个还是四个
40
00:01:11,860 --> 00:01:13,520
四个还是五个例子来着
41
00:01:13,690 --> 00:01:17,630
我忘了就那那哥们儿那个短线到后面周四周五接着涨
42
00:01:18,430 --> 00:01:21,334
康康又登了10% 10几
43
00:01:21,570 --> 00:01:24,882
一根涨停加一个6%还是7
44
00:01:25,140 --> 00:01:25,690
是吧
45
00:01:27,390 --> 00:01:30,030
某康俩涨停
46
00:01:31,160 --> 00:01:37,348
然后那个国某矿直接把周五登进来是吧
47
00:01:37,350 --> 00:01:38,294
然后还有什么来着
48
00:01:38,530 --> 00:01:39,610
我忘了记不清了
49
00:01:40,570 --> 00:01:43,658
然后那陈他没买买进去的又一根长阳
50
00:01:43,670 --> 00:01:44,230
对吧
51
00:01:44,890 --> 00:01:45,940
这他妈就是水平
52
00:01:46,080 --> 00:01:47,438
你别你还别不服
53
00:01:47,440 --> 00:01:53,936
我操就有那那你那黑子说听周三的跟大直播没还没比大直播要无聊
54
00:01:53,950 --> 00:01:58,010
他说那所以可能他妈是可能玩鞋或者喝喝酒的
55
00:01:58,010 --> 00:01:58,370
是​‌​‌​​‌‌​​‌‌​​‌‌​‌​‌​​‌‌‌​‌‌‌‌​‌​​‌‌​​‌‌​​‌‌​​‌‌​​‌‌‌‌​‌‌​‌‌​​‌‌‌‌‌‌​​‌‌​‌​‌‌‌​‌​​‌‌‌‌​‌​‌‌​​​‌‌‌‌‌‌​​‌‌‌‌​‌‌‌​‌​‌​‌​​‌‌‌​‌‌​​‌‌​​​‌​​‌‌​​‌‌‌‌​‌​‌​‌​​‌‌​​‌‌‌‌​‌​‌‌‌‌‌​‌​‌‌‌‌‌​‌​‌​‌​​‌‌‌‌‌​​​‌‌‌​​‌‌‌​‌‌‌‌​​​‌‌‌​‌‌​​‌‌‌​‌‌‌‌​‌​​‌‌​​‌‌‌‌‌​​​‌‌​‌‌​​​‌‌​​‌‌​​‌‌​​‌‌‌‌​‌‌‌​‌​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​‌​‌​​‌‌​‌​‌​​‌‌‌​‌‌​​‌‌‌​‌‌‌‌​‌‌‌‌‌​​‌‌‌‌​‌​​‌‌‌​​‌‌‌​‌​‌‌‌​​‌‌‌​‌‌​​‌‌​‌​‌​​‌‌​‌‌‌‌‌​‌‌​​‌​​‌‌​​​‌​​‌‌​‌‌‌‌‌​‌​​‌‌‌‌​‌​‌‌‌​​‌‌‌‌‌​​​‌‌​‌‌‌‌‌​‌‌‌​‌​​‌‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌​‌​‌‌‌​‌​​‌‌​​‌‌​‌​‌​​‌‌‌​‌‌‌‌​‌‌‌​‌​​‌‌​​‌‌‌‌​‌​‌​‌‌‌​‌‌‌​‌‌‌​‌​‌‌​​​‌‌‌​‌‌‌‌​‌‌​​‌​​‌‌​‌​‌‌‌​‌​‌​‌‌‌​‌​‌‌‌‌‌​‌‌‌‌‌​​‌‌​‌​‌​​‌‌​‌​‌‌‌​‌‌​​‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌​​‌‌‌‌​‌​​‌‌‌​​‌‌‌​‌​​‌‌​​‌‌‌​​‌​​‌‌‌‌​‌​​‌‌​‌‌​​​‌‌‌‌‌‌​​‌‌​‌‌‌‌‌​‌‌‌‌​​​‌‌​​​‌​​‌‌​‌‌‌‌‌​‌‌‌​‌​​‌‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌​‌‌​​‌‌​​‌‌​​‌‌​‌‌‌​​‌‌​​‌‌‌‌​‌‌‌​‌‌‌​‌​‌​‌‌‌​‌‌​‌‌‌‌​‌​​‌‌‌‌​‌​​​‌​​‌‌​​‌‌​​‌‌‌​‌‌​​‌‌‌‌​‌​​‌‌​​‌‌​​‌‌‌‌​‌​​‌‌‌‌‌​​​‌‌‌​‌‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌​​‌​​‌‌​‌​‌‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌‌‌​‌‌‌​‌​‌‌‌​​‌‌‌‌‌​​​‌‌​‌​‌​​‌‌‌‌​‌​​‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌​‌‌‌‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌‌‌​​‌‌‌‌‌‌​​‌‌​‌‌‌​​‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​​‌​​‌‌​​‌‌​​‌‌‌​​‌​​‌‌‌​​‌​​‌‌​‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌Line truncated
56
00:01:58,550 --> 00:01:59,378
就是你听不懂
57
00:02:00,230 --> 00:02:00,760
所以听不懂
58
00:02:00,760 --> 00:02:01,388
认知不够
59
00:02:01,390 --> 00:02:02,086
那么就没办法
60
00:02:02,090 --> 00:02:03,962
无知者无畏才会说出这种话
61
00:02:05,360 --> 00:02:07,592
踏踏实实看两个70%到是吧
62
00:02:07,600 --> 00:02:09,283
你这他妈实打实的吗
63
00:02:09,290 --> 00:02:10,958
傻逼续费对吗
64
00:02:11,440 --> 00:02:14,116
说如果说这哥们儿包括续费
65
00:02:14,120 --> 00:02:17,054
现在周三两万多同屏
66
00:02:18,040 --> 00:02:19,370
我诚惶诚恐
67
00:02:19,660 --> 00:02:20,050
真的
68
00:02:20,050 --> 00:02:22,294
咱家当时3000到5000特别自由
69
00:02:23,810 --> 00:02:25,079
现在充电视频两万多
70
00:02:25,080 --> 00:02:25,905
我诚惶诚恐
71
00:02:25,910 --> 00:02:27,080
说实话真的
72
00:02:30,080 --> 00:02:32,852
所以我还是这块儿我想告诉大家
73
00:02:33,430 --> 00:02:33,758
什么意思
74
00:02:33,760 --> 00:02:39,280
就是说咱们一保护咱们直播间不容易
75
00:02:39,590 --> 00:02:42,837
在B站能够有这样一个非常开心的地方
76
00:02:42,850 --> 00:02:43,898
我觉得非常不容易
77
00:02:44,200 --> 00:02:49,348
另外第二就是说也请你们珍惜
78
00:02:49,360 --> 00:02:55,022
我还愿意说真的虽然那几个杂毛不超过五个
79
00:02:55,430 --> 00:02:58,269
咱家他妈每每礼拜大大直播的十几万人
80
00:02:58,870 --> 00:02:59,927
咱们不超过五个
81
00:03:01,490 --> 00:03:06,950
但是人性我经历过人性你能明白吗
82
00:03:07,510 --> 00:03:11,386
就比如说咱们上礼拜大直播
83
00:03:12,500 --> 00:03:14,580
我说反内卷
84
00:03:14,720 --> 00:03:17,814
我专门讲了一晚上反内卷对吗
85
00:03:19,620 --> 00:03:20,868
周五是不是反内卷
86
00:03:22,800 --> 00:03:25,124
然后我之前说我上周说的是反对
87
00:03:25,130 --> 00:03:25,778
眼都瞪起来了
88
00:03:25,780 --> 00:03:26,770
别着急我等回来
89
00:03:26,770 --> 00:03:27,340
等下来
90
00:03:27,720 --> 00:03:28,300
等他下来
91
00:03:28,300 --> 00:03:28,789
等下来
92
00:03:29,410 --> 00:03:30,280
周五是什么
93
00:03:30,400 --> 00:03:32,688
煤炭对吧
94
00:03:33,100 --> 00:03:33,410
稀土
95
00:03:36,600 --> 00:03:39,336
然后水利就乱七八糟
96
00:03:39,340 --> 00:03:41,836
这些你们平时就咱们看不到
97
00:03:41,840 --> 00:03:43,465
我说我跟他讲的都是机构思维
98
00:03:44,470 --> 00:03:46,630
机构思维不是你那种抱着说
99
00:03:47,060 --> 00:03:48,660
说完以后马上就涨起来
100
00:03:48,820 --> 00:03:49,288
不一定
101
00:03:50,530 --> 00:03:54,273
但是概率足够大比你下芝麻轮那些要大很多
102
00:03:55,310 --> 00:03:56,949
就是我微信打开我那些群
103
00:03:57,850 --> 00:03:59,390
都是什么类的群
104
00:03:59,670 --> 00:04:01,778
跟你打开那些他妈小姐姐小妹妹的裙子
105
00:04:01,790 --> 00:04:02,665
他妈什么不一样
106
00:04:02,670 --> 00:04:06,058
哥们踏踏实实就是很简单
107
00:04:06,060 --> 00:04:08,418
你行你上对吗
108
00:04:08,610 --> 00:04:10,338
你你你行你上
109
00:04:11,580 --> 00:04:14,375
包括下礼拜上周反内卷没涨完
110
00:04:14,670 --> 00:04:16,713
没没没休息一礼拜了
111
00:04:16,920 --> 00:04:17,508
接着轮
112
00:04:18,230 --> 00:04:19,693
就是他妈的没准接着作业
113
00:04:19,700 --> 00:04:22,534
接着我就那些还没有轮动到的
114
00:04:22,540 --> 00:04:25,580
别着急踏踏实实那踏踏实实
115
00:04:35,320 --> 00:04:38,656
然后还有我我我我想到哪儿
116
00:04:38,660 --> 00:04:39,050
我说到哪儿
117
00:04:39,170 --> 00:04:41,686
因为咱们直播主要就是一个蛋逼直播间
118
00:04:43,750 --> 00:04:48,235
有有一些朋友大概我看了有七八个
119
00:04:48,590 --> 00:04:49,910
后台给我截图
120
00:04:50,280 --> 00:04:54,620
其中还有一个还还有一些是跟的时间比较长的
121
00:04:55,260 --> 00:04:59,385
我不知道周三录播你们都看没看啊
122
00:04:59,790 --> 00:05:06,612
就是这个我后来后面专门给你们讲的案例
123
00:05:06,780 --> 00:05:09,104
我讲第一选出来
124
00:05:09,110 --> 00:05:10,250
当天选完之后
125
00:05:10,250 --> 00:05:13,488
第二天比如那天比例选了217个
126
00:05:14,050 --> 00:05:16,258
第一第二天涨停的只有一个
127
00:05:16,580 --> 00:05:18,637
相当于是2百17分之1
128
00:05:19,130 --> 00:05:22,570
但是我给你们往上翻三个交易日前的
129
00:05:23,950 --> 00:05:25,358
我怀孕了什么意思
130
00:05:26,120 --> 00:05:27,896
哥们儿你怀孕了跟我说干嘛
131
00:05:28,310 --> 00:05:29,798
他老师该该找谁去
132
00:05:31,860 --> 00:05:32,540
说哪儿了
133
00:05:32,540 --> 00:05:35,428
对你往三天前一番
134
00:05:36,000 --> 00:05:41,814
然后周三的时候一看是单3到5个涨停
135
00:05:42,190 --> 00:05:42,568
是不是
136
00:05:42,880 --> 00:05:45,270
3到5个涨停什么意思
137
00:05:45,940 --> 00:05:46,930
再强调一遍
138
00:05:48,130 --> 00:05:52,882
第一叫潜伏好不好
139
00:05:53,930 --> 00:05:57,787
B一潜伏不是说B一一进去马上坑就掉下来
140
00:05:58,530 --> 00:06:01,346
那概率就是200分之1
141
00:06:03,020 --> 00:06:04,571
还是在市场不暴跌的时候
142
00:06:05,100 --> 00:06:08,976
B一进去绝大部分时间你要等2到3天
143
00:06:10,060 --> 00:06:12,293
甚至个别板块等3到5天
144
00:06:14,130 --> 00:06:15,618
这句话能不能明白
145
00:06:16,330 --> 00:06:21,270
而B2进去才是已经确认了B一牛逼的情况下
146
00:06:21,410 --> 00:06:22,450
B一成立的情况下
147
00:06:22,450 --> 00:06:23,647
他可能会快速蹬几根
148
00:06:24,630 --> 00:06:25,894
所以先不要管B2
149
00:06:25,900 --> 00:06:27,180
先说B1
150
00:06:27,410 --> 00:06:29,060
所以说你们第一轮进去的
151
00:06:29,140 --> 00:06:30,860
不要抱着不切实际幻想
152
00:06:30,860 --> 00:06:32,948
说我今天第一轮完明天就涨
153
00:06:33,300 --> 00:06:34,972
说有没有可能有2 1%
154
00:06:34,980 --> 00:06:36,079
你就记住这概率
155
00:06:36,080 --> 00:06:37,536
市场未来好多1%
156
00:06:38,530 --> 00:06:40,194
你100个票第一
157
00:06:40,460 --> 00:06:42,847
你虾芝麻轮忙忙忙选进去
158
00:06:43,060 --> 00:06:47,146
第二天也是1%的2 1%的涨停的概率
159
00:06:47,950 --> 00:06:51,910
5%以上可能是说50分之1或者80分之1就这样了
160
00:06:53,500 --> 00:06:55,130
但是你他妈三天后再看
161
00:06:55,630 --> 00:06:57,205
或者2到3天后再看
162
00:07:00,030 --> 00:07:01,260
所以这块能不能听明白
163
00:07:02,410 --> 00:07:04,160
第一叫潜伏
164
00:07:06,070 --> 00:07:09,271
B2才是买完之后必须的
165
00:07:10,370 --> 00:07:13,695
即使B2也有大概率是那天给你们看的案例
166
00:07:13,710 --> 00:07:15,208
一个是国某矿业
167
00:07:15,650 --> 00:07:17,762
我调了三天周五才定下来
168
00:07:18,010 --> 00:07:18,540
对吗
169
00:07:18,710 --> 00:07:20,355
不破止损就拿着
170
00:07:20,360 --> 00:07:21,018
但对于很多人讲
171
00:07:21,020 --> 00:07:23,561
B2那1根启动的太长了
172
00:07:23,790 --> 00:07:24,498
拿不了
173
00:07:24,500 --> 00:07:25,178
拿不住
174
00:07:25,470 --> 00:07:26,366
B一还没整明白
175
00:07:26,500 --> 00:07:28,489
所以先踏踏实实把B一整明白
176
00:07:29,330 --> 00:07:30,930
把B一的止损整明白
+7 -7
View File
@@ -6,7 +6,7 @@ from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
# 导入配置管理
from backend.core.config import settings, get_logging_config, get_api_key
from core.config import settings, get_logging_config, get_api_key
# 配置日志
logging_config = get_logging_config()
@@ -21,12 +21,12 @@ logging.basicConfig(
logger = logging.getLogger(__name__)
# 使用绝对导入
from backend.api.v1 import health, projects, clips, collections, tasks as task_routes, settings as settings_routes
from backend.api.v1.tasks import router as tasks_router
from backend.api.v1 import websocket
from backend.core.database import engine
from backend.models.base import Base
# 使用相对导入
from api.v1 import health, projects, clips, collections, tasks as task_routes, settings as settings_routes
from api.v1.tasks import router as tasks_router
from api.v1 import websocket
from core.database import engine
from models.base import Base
# Create FastAPI app
app = FastAPI(
+1 -1
View File
@@ -6,7 +6,7 @@
from typing import TypeVar, Generic, Optional, List, Dict, Any, Type
from sqlalchemy.orm import Session
from sqlalchemy import and_, or_
from backend.models.base import BaseModel
from models.base import BaseModel
# 定义泛型类型
ModelType = TypeVar("ModelType", bound=BaseModel)
+1 -1
View File
@@ -7,7 +7,7 @@ from typing import List, Optional
from sqlalchemy.orm import Session
from sqlalchemy import desc, asc
from .base import BaseRepository
from backend.models.project import Project, ProjectStatus, ProjectType
from models.project import Project, ProjectStatus, ProjectType
class ProjectRepository(BaseRepository[Project]):
"""项目Repository类"""
+1 -1
View File
@@ -7,7 +7,7 @@ from typing import List, Optional
from sqlalchemy.orm import Session
from sqlalchemy import desc, asc, func
from .base import BaseRepository
from backend.models.task import Task, TaskStatus, TaskType
from models.task import Task, TaskStatus, TaskType
class TaskRepository(BaseRepository[Task]):
"""任务Repository类"""
+1
View File
@@ -47,6 +47,7 @@ class ProjectUpdate(BaseSchema):
description: Optional[str] = Field(default=None, max_length=1000, description="Project description")
status: Optional[ProjectStatus] = Field(default=None, description="Project status")
settings: Optional[dict] = Field(default=None, description="Project settings")
processing_config: Optional[dict] = Field(default=None, description="Processing configuration")
class ProjectResponse(BaseSchema):
+7 -7
View File
@@ -57,15 +57,15 @@ class TaskResponse(BaseSchema):
task_type: TaskType = Field(description="Task type")
status: TaskStatus = Field(description="Task status")
progress: float = Field(default=0, description="Task progress percentage")
task_config: dict = Field(description="Task configuration")
result: Optional[dict] = Field(description="Task result")
error_message: Optional[str] = Field(description="Error message if failed")
priority: int = Field(description="Task priority")
metadata: dict = Field(description="Additional metadata")
task_config: Optional[dict] = Field(default_factory=dict, description="Task configuration")
result: Optional[dict] = Field(default=None, description="Task result")
error_message: Optional[str] = Field(default=None, description="Error message if failed")
priority: int = Field(default=0, description="Task priority")
metadata: Optional[dict] = Field(default_factory=dict, description="Additional metadata")
created_at: datetime = Field(description="Creation timestamp")
updated_at: datetime = Field(description="Last update timestamp")
started_at: Optional[datetime] = Field(description="Start timestamp")
completed_at: Optional[datetime] = Field(description="Completion timestamp")
started_at: Optional[datetime] = Field(default=None, description="Start timestamp")
completed_at: Optional[datetime] = Field(default=None, description="Completion timestamp")
class TaskListResponse(BaseSchema):
+2 -2
View File
@@ -6,8 +6,8 @@
from typing import Generic, TypeVar, Type, Optional, List, Dict, Any
from sqlalchemy.orm import Session
from sqlalchemy import and_, or_
from backend.repositories.base import BaseRepository, ModelType as RepoModelType
from backend.schemas.base import BaseSchema, PaginationParams, PaginationResponse
from repositories.base import BaseRepository, ModelType as RepoModelType
from schemas.base import BaseSchema, PaginationParams, PaginationResponse
CreateSchemaType = TypeVar("CreateSchemaType")
+2 -2
View File
@@ -12,8 +12,8 @@ from typing import Dict, Any, Optional
from dataclasses import dataclass
from enum import Enum
from backend.models.project import ProjectType
from backend.core.database import get_db
from models.project import ProjectType
from core.database import get_db
logger = logging.getLogger(__name__)
+50 -17
View File
@@ -9,11 +9,11 @@ from pathlib import Path
from datetime import datetime
# 导入新架构的模型和服务
from backend.models.project import Project, ProjectStatus
from backend.models.task import Task, TaskStatus
from backend.core.database import get_db
from backend.core.progress_manager import get_progress_manager
from backend.core.config import get_project_root, get_data_directory, get_output_directory
from models.project import Project, ProjectStatus
from models.task import Task, TaskStatus
from core.database import get_db
from core.progress_manager import get_progress_manager
from core.config import get_project_root, get_data_directory, get_output_directory
from sqlalchemy.orm import Session
logger = logging.getLogger(__name__)
@@ -43,6 +43,11 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
# 确保父目录存在
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"outlines": [
@@ -62,6 +67,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"timeline": [
@@ -82,6 +91,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"scored_clips": [
@@ -101,6 +114,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"titles": [
@@ -120,6 +137,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"collections": [
@@ -139,6 +160,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"videos": [
@@ -171,7 +196,7 @@ class PipelineAdapter:
{"name": "video", "description": "生成视频", "weight": 15}
]
def process_project_sync(self, project_id: int, input_video_path: str, input_srt_path: str) -> Dict[str, Any]:
def process_project_sync(self, project_id: str, input_video_path: str, input_srt_path: str) -> Dict[str, Any]:
"""同步处理整个项目的Pipeline流程"""
try:
# 获取项目信息
@@ -256,35 +281,43 @@ class PipelineAdapter:
raise FileNotFoundError(f"SRT文件不存在: {srt_path}")
output_path = project_dir / "step1_outline.json"
result = run_step1_outline(srt_path=str(srt_file), output_path=str(output_path))
result = run_step1_outline(srt_file, output_path=output_path)
return result
def _step2_timeline_sync(self, outline_result: Dict[str, Any], project_dir: Path) -> Dict[str, Any]:
"""步骤2: 生成时间线"""
# 使用上一步的输出作为输入
outline_path = project_dir / "step1_outline.json"
output_path = project_dir / "step2_timeline.json"
result = run_step2_timeline(output_path=str(output_path))
result = run_step2_timeline(outline_path, output_path=output_path)
return result
def _step3_scoring_sync(self, timeline_result: Dict[str, Any], project_dir: Path) -> Dict[str, Any]:
"""步骤3: 内容评分"""
# 使用上一步的输出作为输入
timeline_path = project_dir / "step2_timeline.json"
output_path = project_dir / "step3_scored_clips.json"
result = run_step3_scoring(output_path=str(output_path))
result = run_step3_scoring(timeline_path, output_path=output_path)
return result
def _step4_title_sync(self, scoring_result: Dict[str, Any], project_dir: Path) -> Dict[str, Any]:
"""步骤4: 生成标题"""
# 使用上一步的输出作为输入
high_score_clips_path = project_dir / "step3_scored_clips.json"
output_path = project_dir / "step4_titles.json"
result = run_step4_title(output_path=str(output_path))
result = run_step4_title(high_score_clips_path, output_path=output_path)
return result
def _step5_clustering_sync(self, title_result: Dict[str, Any], project_dir: Path) -> Dict[str, Any]:
"""步骤5: 主题聚类"""
# 使用上一步的输出作为输入
clips_with_titles_path = project_dir / "step4_titles.json"
output_path = project_dir / "step5_collections.json"
result = run_step5_clustering(output_path=str(output_path))
result = run_step5_clustering(clips_with_titles_path, output_path=output_path)
return result
@@ -294,15 +327,15 @@ class PipelineAdapter:
if not input_video.exists():
raise FileNotFoundError(f"输入视频不存在: {input_video_path}")
# 使用上一步的输出作为输入
clips_with_titles_path = project_dir / "step4_titles.json"
collections_path = project_dir / "step5_collections.json"
output_path = project_dir / "step6_video_result.json"
result = run_step6_video(
video_path=str(input_video),
output_path=str(output_path)
)
result = run_step6_video(clips_with_titles_path, collections_path, input_video, output_path)
return result
def _update_progress_sync(self, project_id: int, progress: int, message: str, step_result: Optional[Dict[str, Any]] = None):
def _update_progress_sync(self, project_id: str, progress: int, message: str, step_result: Optional[Dict[str, Any]] = None):
"""同步更新项目进度"""
try:
# 更新数据库中的项目进度
@@ -322,7 +355,7 @@ class PipelineAdapter:
except Exception as e:
logger.error(f"更新进度失败: {str(e)}")
def get_project_status(self, project_id: int) -> Dict[str, Any]:
def get_project_status(self, project_id: str) -> Dict[str, Any]:
"""获取项目状态"""
project = self.db.query(Project).filter(Project.id == project_id).first()
if not project:
+29 -5
View File
@@ -10,11 +10,11 @@ from typing import Dict, Any, List, Optional, Callable
from pathlib import Path
from sqlalchemy.orm import Session
from backend.models.task import Task, TaskStatus, TaskType
from backend.repositories.task_repository import TaskRepository
from backend.services.config_manager import ProjectConfigManager, ProcessingStep
from backend.services.pipeline_adapter import PipelineAdapter
from backend.core.config import get_project_root
from models.task import Task, TaskStatus, TaskType
from repositories.task_repository import TaskRepository
from services.config_manager import ProjectConfigManager, ProcessingStep
from services.pipeline_adapter import PipelineAdapter
from core.config import get_project_root
logger = logging.getLogger(__name__)
@@ -43,6 +43,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"outlines": [
@@ -62,6 +66,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"timeline": [
@@ -82,6 +90,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"scored_clips": [
@@ -101,6 +113,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"titles": [
@@ -120,6 +136,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"collections": [
@@ -139,6 +159,10 @@ except ImportError as e:
output_path = kwargs.get('output_path')
if output_path:
import json
from pathlib import Path
# 确保output_path是Path对象
if isinstance(output_path, str):
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
mock_output = {
"videos": [
+9 -9
View File
@@ -8,14 +8,14 @@ from pathlib import Path
from typing import Dict, Any, Optional
from sqlalchemy.orm import Session
from backend.models.task import Task, TaskStatus, TaskType
from backend.repositories.task_repository import TaskRepository
from backend.services.config_manager import ProjectConfigManager, ProcessingStep
from backend.services.pipeline_adapter import PipelineAdapter
from backend.services.processing_orchestrator import ProcessingOrchestrator
from backend.services.processing_context import ProcessingContext
from backend.services.exceptions import ServiceError, ProcessingError, TaskError, ProjectError, handle_service_error
from backend.services.concurrency_manager import with_concurrency_control
from models.task import Task, TaskStatus, TaskType
from repositories.task_repository import TaskRepository
from services.config_manager import ProjectConfigManager, ProcessingStep
from services.pipeline_adapter import PipelineAdapter
from services.processing_orchestrator import ProcessingOrchestrator
from services.processing_context import ProcessingContext
from services.exceptions import ServiceError, ProcessingError, TaskError, ProjectError, handle_service_error
from services.concurrency_manager import with_concurrency_control
logger = logging.getLogger(__name__)
@@ -333,7 +333,7 @@ class ProcessingService:
"progress": 0.0,
"metadata": {
"project_id": project_id,
"task_type": task_type.value
"task_type": task_type.value if hasattr(task_type, 'value') else task_type
}
}
+27 -7
View File
@@ -6,12 +6,12 @@
from typing import Optional, List, Dict, Any
from sqlalchemy.orm import Session
from backend.services.base import BaseService
from backend.repositories.project_repository import ProjectRepository
from backend.models.project import Project
from backend.schemas.project import ProjectCreate, ProjectUpdate, ProjectResponse, ProjectListResponse, ProjectFilter
from backend.schemas.base import PaginationParams, PaginationResponse
from backend.schemas.project import ProjectType, ProjectStatus
from services.base import BaseService
from repositories.project_repository import ProjectRepository
from models.project import Project
from schemas.project import ProjectCreate, ProjectUpdate, ProjectResponse, ProjectListResponse, ProjectFilter
from schemas.base import PaginationParams, PaginationResponse
from schemas.project import ProjectType, ProjectStatus
class ProjectService(BaseService[Project, ProjectCreate, ProjectUpdate, ProjectResponse]):
@@ -46,7 +46,17 @@ class ProjectService(BaseService[Project, ProjectCreate, ProjectUpdate, ProjectR
if not update_data:
return self.get(project_id)
return self.update(project_id, **update_data)
# Map schema fields to ORM fields
orm_data = {}
for key, value in update_data.items():
if key == "settings":
orm_data["processing_config"] = value
elif key == "processing_config":
orm_data["processing_config"] = value
else:
orm_data[key] = value
return self.update(project_id, **orm_data)
def get_project_with_stats(self, project_id: str) -> Optional[ProjectResponse]:
"""Get project with statistics."""
@@ -144,4 +154,14 @@ class ProjectService(BaseService[Project, ProjectCreate, ProjectUpdate, ProjectR
settings["error_message"] = error_message
self.update(project_id, status="failed", settings=settings)
return True
def update_project_status(self, project_id: str, status: str) -> bool:
"""Update project status."""
project = self.get(project_id)
if not project:
return False
# Update status
self.update(project_id, status=status)
return True
@@ -8,7 +8,7 @@ import asyncio
from typing import Dict, Any, Optional
from datetime import datetime
from backend.core.websocket_manager import manager, WebSocketMessage
from core.websocket_manager import manager, WebSocketMessage
logger = logging.getLogger(__name__)
@@ -181,6 +181,16 @@ class WebSocketNotificationService:
f"项目 {project_id} 处理失败",
{"project_id": project_id, "task_id": task_id, "error": error}
)
@staticmethod
async def send_processing_started(project_id: str, message: str = "开始视频处理流程"):
"""发送处理开始通知(别名方法)"""
await WebSocketNotificationService.send_project_update(
project_id=project_id,
status="processing",
progress=0,
message=message
)
# 全局通知服务实例
notification_service = WebSocketNotificationService()
+4 -4
View File
@@ -16,7 +16,7 @@ from backend.services.pipeline_adapter import create_pipeline_adapter_sync
from backend.core.database import SessionLocal
from backend.core.progress_manager import get_progress_manager
from backend.models.project import Project, ProjectStatus
from backend.models.task import Task, TaskStatus
from backend.models.task import Task, TaskStatus, TaskType
logger = logging.getLogger(__name__)
@@ -31,7 +31,7 @@ def run_async_notification(coro):
return loop.run_until_complete(coro)
@celery_app.task(bind=True, name='backend.tasks.processing.process_video_pipeline')
def process_video_pipeline(self, project_id: int, input_video_path: str, input_srt_path: str) -> Dict[str, Any]:
def process_video_pipeline(self, project_id: str, input_video_path: str, input_srt_path: str) -> Dict[str, Any]:
"""
处理视频流水线任务 - 使用Pipeline适配器
@@ -55,7 +55,7 @@ def process_video_pipeline(self, project_id: int, input_video_path: str, input_s
task = Task(
name=f"视频处理流水线",
description=f"处理项目 {project_id} 的完整视频流水线",
type="pipeline",
task_type=TaskType.VIDEO_PROCESSING,
project_id=project_id,
celery_task_id=task_id,
status=TaskStatus.RUNNING,
@@ -85,7 +85,7 @@ def process_video_pipeline(self, project_id: int, input_video_path: str, input_s
task.status = TaskStatus.COMPLETED
task.progress = 100
task.current_step = "处理完成"
task.result = result
task.result_data = result
db.commit()
# 发送完成通知
BIN
View File
Binary file not shown.
+3 -1
View File
@@ -54,8 +54,10 @@ cd ..
# 启动Celery
echo -e "${BLUE}⚙️ 启动Celery...${NC}"
export PYTHONPATH=.:$PYTHONPATH
celery -A backend.core.celery_app worker --loglevel=info --concurrency=1 &
cd backend
celery -A core.celery_app worker --loglevel=info --concurrency=1 &
CELERY_PID=$!
cd ..
# 启动前端
echo -e "${BLUE}🎨 启动前端...${NC}"
+1 -1
View File
@@ -31,7 +31,7 @@ def main():
# 启动服务
uvicorn.run(
"app.main:app",
"main:app",
host="0.0.0.0",
port=8000,
reload=True,
+16 -12
View File
@@ -160,29 +160,29 @@ echo -e "${GREEN}✅ 前端依赖检查完成${NC}"
# 初始化数据库
echo -e "${BLUE}🗄️ 初始化数据库...${NC}"
cd backend || handle_error "进入backend目录失败"
# 设置环境变量
export PYTHONPATH=$PYTHONPATH:$(pwd)
# 检查并创建.env文件
if [ ! -f "../.env" ]; then
if [ ! -f ".env" ]; then
echo -e "${YELLOW}📝 创建.env配置文件...${NC}"
cp ../env.example ../.env
cp env.example .env
echo -e "${YELLOW}⚠️ 请编辑.env文件设置API密钥等配置${NC}"
fi
# 设置环境变量 - 从项目根目录设置
export PYTHONPATH=$PYTHONPATH:$(pwd)
# 初始化数据库表
python -c "
import sys
sys.path.insert(0, '.')
from core.database import create_tables, init_database
import os
# 添加项目根目录到Python路径
project_root = os.path.abspath('.')
sys.path.insert(0, project_root)
from backend.core.database import create_tables, init_database
create_tables()
init_database()
print('数据库初始化完成')
" || handle_error "数据库初始化失败"
cd .. || handle_error "返回根目录失败"
echo -e "${GREEN}✅ 数据库初始化完成${NC}"
# 启动服务
@@ -195,8 +195,10 @@ export PYTHONPATH=.:$PYTHONPATH
# 尝试启动完整版后端(从项目根目录启动)
echo "尝试启动完整版后端..."
python -m uvicorn backend.main:app --host 0.0.0.0 --port 8000 --reload &
cd backend
python -m uvicorn main:app --host 0.0.0.0 --port 8000 --reload &
BACKEND_PID=$!
cd ..
# 等待后端启动
echo "等待后端服务启动..."
@@ -216,8 +218,10 @@ fi
echo -e "${BLUE}⚙️ 启动Celery工作进程...${NC}"
source venv/bin/activate
export PYTHONPATH=.:$PYTHONPATH
celery -A backend.core.celery_app worker --loglevel=info --concurrency=1 &
cd backend
celery -A core.celery_app worker --loglevel=info --concurrency=1 &
CELERY_PID=$!
cd ..
echo -e "${GREEN}✅ Celery工作进程已启动 (PID: $CELERY_PID)${NC}"
# 3. 启动前端开发服务器
+3 -1
View File
@@ -112,8 +112,10 @@ cd ..
# 启动Celery (简化版)
echo -e "${BLUE}⚙️ 启动Celery (简化版)...${NC}"
export PYTHONPATH=.:$PYTHONPATH
celery -A backend.core.celery_simple worker --loglevel=info --concurrency=1 &
cd backend
celery -A core.celery_simple worker --loglevel=info --concurrency=1 &
CELERY_PID=$!
cd ..
# 启动前端
echo -e "${BLUE}🎨 启动前端...${NC}"
+3 -2
View File
@@ -6,5 +6,6 @@ export PYTHONPATH=.:$PYTHONPATH
# 激活虚拟环境
source venv/bin/activate
# 启动Celery worker (在项目根目录运行)
celery -A backend.core.celery_app worker --loglevel=info --concurrency=1
# 启动Celery worker (在backend目录运行)
cd backend
celery -A core.celery_app worker --loglevel=info --concurrency=1