From 43dec49e04347ff7b91f1d9308e572276ff6f3ba Mon Sep 17 00:00:00 2001 From: Kris Ka Date: Wed, 6 Aug 2025 17:51:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend.log | 272 +++++++ backend/api/v1/projects.py | 81 +- backend/api/v1/tasks.py | 13 +- backend/backend.log | 84 +++ backend/core/progress_manager.py | 8 +- ...损别甩锅,认知水平才是决定成败的关键_原文.srt | 703 ++++++++++++++++++ ...损别甩锅,认知水平才是决定成败的关键_原文.srt | 703 ++++++++++++++++++ backend/main.py | 14 +- backend/repositories/base.py | 2 +- backend/repositories/project_repository.py | 2 +- backend/repositories/task_repository.py | 2 +- backend/schemas/project.py | 1 + backend/schemas/task.py | 14 +- backend/services/base.py | 4 +- backend/services/config_manager.py | 4 +- backend/services/pipeline_adapter.py | 67 +- backend/services/processing_orchestrator.py | 34 +- backend/services/processing_service.py | 18 +- backend/services/project_service.py | 34 +- .../websocket_notification_service.py | 12 +- backend/tasks/processing.py | 8 +- data/autoclip.db | Bin 61440 -> 61440 bytes quick_start.sh | 4 +- scripts/start_backend.py | 2 +- start_autoclip.sh | 28 +- start_autoclip_minimal.sh | 4 +- start_celery_worker.sh | 5 +- 27 files changed, 1991 insertions(+), 132 deletions(-) create mode 100644 backend/data/projects/324a9c81-1b4f-4ce6-96d4-3b7a75e34b05/raw/投资亏损别甩锅,认知水平才是决定成败的关键_原文.srt create mode 100644 backend/data/projects/9e930785-38da-468c-b4f3-875e0c5eb501/raw/投资亏损别甩锅,认知水平才是决定成败的关键_原文.srt diff --git a/backend.log b/backend.log index 208d73e1..4a27e7ad 100644 --- a/backend.log +++ b/backend.log @@ -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密钥已加载到环境变量 diff --git a/backend/api/v1/projects.py b/backend/api/v1/projects.py index 3250420c..e58f6f0b 100644 --- a/backend/api/v1/projects.py +++ b/backend/api/v1/projects.py @@ -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}" ) diff --git a/backend/api/v1/tasks.py b/backend/api/v1/tasks.py index c745bf62..51d1dbcc 100644 --- a/backend/api/v1/tasks.py +++ b/backend/api/v1/tasks.py @@ -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"), diff --git a/backend/backend.log b/backend/backend.log index 2c21a9a5..6575643f 100644 --- a/backend/backend.log +++ b/backend/backend.log @@ -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密钥已加载到环境变量 diff --git a/backend/core/progress_manager.py b/backend/core/progress_manager.py index 41d726f1..bf2b0095 100644 --- a/backend/core/progress_manager.py +++ b/backend/core/progress_manager.py @@ -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__) diff --git a/backend/data/projects/324a9c81-1b4f-4ce6-96d4-3b7a75e34b05/raw/投资亏损别甩锅,认知水平才是决定成败的关键_原文.srt b/backend/data/projects/324a9c81-1b4f-4ce6-96d4-3b7a75e34b05/raw/投资亏损别甩锅,认知水平才是决定成败的关键_原文.srt new file mode 100644 index 00000000..481bbb62 --- /dev/null +++ b/backend/data/projects/324a9c81-1b4f-4ce6-96d4-3b7a75e34b05/raw/投资亏损别甩锅,认知水平才是决定成败的关键_原文.srt @@ -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 +是​‌​‌​​‌‌​​‌‌​​‌‌​‌​‌​​‌‌‌​‌‌‌‌​‌​​‌‌​​‌‌​​‌‌​​‌‌​​‌‌‌‌​‌‌​‌‌​​‌‌‌‌‌‌​​‌‌​‌​‌‌‌​‌​​‌‌‌‌​‌​‌‌​​​‌‌‌‌‌‌​​‌‌‌‌​‌‌‌​‌​‌​‌​​‌‌‌​‌‌​​‌‌​​​‌​​‌‌​​‌‌‌‌​‌​‌​‌​​‌‌​​‌‌‌‌​‌​‌‌‌‌‌​‌​‌‌‌‌‌​‌​‌​‌​​‌‌‌‌‌​​​‌‌‌​​‌‌‌​‌‌‌‌​​​‌‌‌​‌‌​​‌‌‌​‌‌‌‌​‌​​‌‌​​‌‌‌‌‌​​​‌‌​‌‌​​​‌‌​​‌‌​​‌‌​​‌‌‌‌​‌‌‌​‌​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​‌​‌​​‌‌​‌​‌​​‌‌‌​‌‌​​‌‌‌​‌‌‌‌​‌‌‌‌‌​​‌‌‌‌​‌​​‌‌‌​​‌‌‌​‌​‌‌‌​​‌‌‌​‌‌​​‌‌​‌​‌​​‌‌​‌‌‌‌‌​‌‌​​‌​​‌‌​​​‌​​‌‌​‌‌‌‌‌​‌​​‌‌‌‌​‌​‌‌‌​​‌‌‌‌‌​​​‌‌​‌‌‌‌‌​‌‌‌​‌​​‌‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌​‌​‌‌‌​‌​​‌‌​​‌‌​‌​‌​​‌‌‌​‌‌‌‌​‌‌‌​‌​​‌‌​​‌‌‌‌​‌​‌​‌‌‌​‌‌‌​‌‌‌​‌​‌‌​​​‌‌‌​‌‌‌‌​‌‌​​‌​​‌‌​‌​‌‌‌​‌​‌​‌‌‌​‌​‌‌‌‌‌​‌‌‌‌‌​​‌‌​‌​‌​​‌‌​‌​‌‌‌​‌‌​​‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌​​‌‌‌‌​‌​​‌‌‌​​‌‌‌​‌​​‌‌​​‌‌‌​​‌​​‌‌‌‌​‌​​‌‌​‌‌​​​‌‌‌‌‌‌​​‌‌​‌‌‌‌‌​‌‌‌‌​​​‌‌​​​‌​​‌‌​‌‌‌‌‌​‌‌‌​‌​​‌‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌​‌‌​​‌‌​​‌‌​​‌‌​‌‌‌​​‌‌​​‌‌‌‌​‌‌‌​‌‌‌​‌​‌​‌‌‌​‌‌​‌‌‌‌​‌​​‌‌‌‌​‌​​​‌​​‌‌​​‌‌​​‌‌‌​‌‌​​‌‌‌‌​‌​​‌‌​​‌‌​​‌‌‌‌​‌​​‌‌‌‌‌​​​‌‌‌​‌‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌​​‌​​‌‌​‌​‌‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌‌‌​‌‌‌​‌​‌‌‌​​‌‌‌‌‌​​​‌‌​‌​‌​​‌‌‌‌​‌​​‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌​‌‌‌‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌‌‌​​‌‌‌‌‌‌​​‌‌​‌‌‌​​‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​​‌​​‌‌​​‌‌​​‌‌‌​​‌​​‌‌‌​​‌​​‌‌​‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌不是 + +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一的止损整明白 diff --git a/backend/data/projects/9e930785-38da-468c-b4f3-875e0c5eb501/raw/投资亏损别甩锅,认知水平才是决定成败的关键_原文.srt b/backend/data/projects/9e930785-38da-468c-b4f3-875e0c5eb501/raw/投资亏损别甩锅,认知水平才是决定成败的关键_原文.srt new file mode 100644 index 00000000..481bbb62 --- /dev/null +++ b/backend/data/projects/9e930785-38da-468c-b4f3-875e0c5eb501/raw/投资亏损别甩锅,认知水平才是决定成败的关键_原文.srt @@ -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 +是​‌​‌​​‌‌​​‌‌​​‌‌​‌​‌​​‌‌‌​‌‌‌‌​‌​​‌‌​​‌‌​​‌‌​​‌‌​​‌‌‌‌​‌‌​‌‌​​‌‌‌‌‌‌​​‌‌​‌​‌‌‌​‌​​‌‌‌‌​‌​‌‌​​​‌‌‌‌‌‌​​‌‌‌‌​‌‌‌​‌​‌​‌​​‌‌‌​‌‌​​‌‌​​​‌​​‌‌​​‌‌‌‌​‌​‌​‌​​‌‌​​‌‌‌‌​‌​‌‌‌‌‌​‌​‌‌‌‌‌​‌​‌​‌​​‌‌‌‌‌​​​‌‌‌​​‌‌‌​‌‌‌‌​​​‌‌‌​‌‌​​‌‌‌​‌‌‌‌​‌​​‌‌​​‌‌‌‌‌​​​‌‌​‌‌​​​‌‌​​‌‌​​‌‌​​‌‌‌‌​‌‌‌​‌​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​‌​‌​​‌‌​‌​‌​​‌‌‌​‌‌​​‌‌‌​‌‌‌‌​‌‌‌‌‌​​‌‌‌‌​‌​​‌‌‌​​‌‌‌​‌​‌‌‌​​‌‌‌​‌‌​​‌‌​‌​‌​​‌‌​‌‌‌‌‌​‌‌​​‌​​‌‌​​​‌​​‌‌​‌‌‌‌‌​‌​​‌‌‌‌​‌​‌‌‌​​‌‌‌‌‌​​​‌‌​‌‌‌‌‌​‌‌‌​‌​​‌‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌​‌​‌‌‌​‌​​‌‌​​‌‌​‌​‌​​‌‌‌​‌‌‌‌​‌‌‌​‌​​‌‌​​‌‌‌‌​‌​‌​‌‌‌​‌‌‌​‌‌‌​‌​‌‌​​​‌‌‌​‌‌‌‌​‌‌​​‌​​‌‌​‌​‌‌‌​‌​‌​‌‌‌​‌​‌‌‌‌‌​‌‌‌‌‌​​‌‌​‌​‌​​‌‌​‌​‌‌‌​‌‌​​‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌​​‌‌‌‌​‌​​‌‌‌​​‌‌‌​‌​​‌‌​​‌‌‌​​‌​​‌‌‌‌​‌​​‌‌​‌‌​​​‌‌‌‌‌‌​​‌‌​‌‌‌‌‌​‌‌‌‌​​​‌‌​​​‌​​‌‌​‌‌‌‌‌​‌‌‌​‌​​‌‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌​‌‌​​‌‌​​‌‌​​‌‌​‌‌‌​​‌‌​​‌‌‌‌​‌‌‌​‌‌‌​‌​‌​‌‌‌​‌‌​‌‌‌‌​‌​​‌‌‌‌​‌​​​‌​​‌‌​​‌‌​​‌‌‌​‌‌​​‌‌‌‌​‌​​‌‌​​‌‌​​‌‌‌‌​‌​​‌‌‌‌‌​​​‌‌‌​‌‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌‌​‌‌​​‌​​‌‌​‌​‌‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌‌‌​‌‌‌​‌​‌‌‌​​‌‌‌‌‌​​​‌‌​‌​‌​​‌‌‌‌​‌​​‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌​‌‌‌‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌‌‌​​‌‌‌‌‌‌​​‌‌​‌‌‌​​‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​​‌​​‌‌​​‌‌​​‌‌‌​​‌​​‌‌‌​​‌​​‌‌​‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌不是 + +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一的止损整明白 diff --git a/backend/main.py b/backend/main.py index 6f136be5..e0f3e2f2 100644 --- a/backend/main.py +++ b/backend/main.py @@ -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( diff --git a/backend/repositories/base.py b/backend/repositories/base.py index 98ece1df..57162380 100644 --- a/backend/repositories/base.py +++ b/backend/repositories/base.py @@ -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) diff --git a/backend/repositories/project_repository.py b/backend/repositories/project_repository.py index 1da5344b..01b6caea 100644 --- a/backend/repositories/project_repository.py +++ b/backend/repositories/project_repository.py @@ -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类""" diff --git a/backend/repositories/task_repository.py b/backend/repositories/task_repository.py index 0948f270..600c0d55 100644 --- a/backend/repositories/task_repository.py +++ b/backend/repositories/task_repository.py @@ -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类""" diff --git a/backend/schemas/project.py b/backend/schemas/project.py index a45b8e5a..9b59a11f 100644 --- a/backend/schemas/project.py +++ b/backend/schemas/project.py @@ -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): diff --git a/backend/schemas/task.py b/backend/schemas/task.py index ffb160c1..acfdbe4b 100644 --- a/backend/schemas/task.py +++ b/backend/schemas/task.py @@ -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): diff --git a/backend/services/base.py b/backend/services/base.py index 05d7f097..f38ae128 100644 --- a/backend/services/base.py +++ b/backend/services/base.py @@ -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") diff --git a/backend/services/config_manager.py b/backend/services/config_manager.py index 0da0fbda..3d09a3d9 100644 --- a/backend/services/config_manager.py +++ b/backend/services/config_manager.py @@ -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__) diff --git a/backend/services/pipeline_adapter.py b/backend/services/pipeline_adapter.py index de12a436..1dc75630 100644 --- a/backend/services/pipeline_adapter.py +++ b/backend/services/pipeline_adapter.py @@ -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: diff --git a/backend/services/processing_orchestrator.py b/backend/services/processing_orchestrator.py index 54cbeac9..bd2f3946 100644 --- a/backend/services/processing_orchestrator.py +++ b/backend/services/processing_orchestrator.py @@ -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": [ diff --git a/backend/services/processing_service.py b/backend/services/processing_service.py index 4720f2a0..5bddf515 100644 --- a/backend/services/processing_service.py +++ b/backend/services/processing_service.py @@ -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 } } diff --git a/backend/services/project_service.py b/backend/services/project_service.py index 2e7571ef..6bddd8a8 100644 --- a/backend/services/project_service.py +++ b/backend/services/project_service.py @@ -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 \ No newline at end of file diff --git a/backend/services/websocket_notification_service.py b/backend/services/websocket_notification_service.py index 4124b369..5ab7f1ca 100644 --- a/backend/services/websocket_notification_service.py +++ b/backend/services/websocket_notification_service.py @@ -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() \ No newline at end of file diff --git a/backend/tasks/processing.py b/backend/tasks/processing.py index df09524f..7fe01807 100644 --- a/backend/tasks/processing.py +++ b/backend/tasks/processing.py @@ -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() # 发送完成通知 diff --git a/data/autoclip.db b/data/autoclip.db index fe0bb69617fb155f81a3d9eadd952298d8c98cde..372bda88d058a189192617868e5cbb4d2478d95c 100644 GIT binary patch literal 61440 zcmeI5ZEPIH8OQJJ`0X6~K$Meotq>9c!2`|e^# z2c(o7&q==9oo9A-<~RT6nU}j{Cm$cp7Nz3n@-uc((Ia<6qS45Y6eSXgOu=6q{;IDY zIM`7=fzN2o@pgw(k>rba^u_-Z>2Loy(*HpGZ+-vh{bAqb*yr89iGAGt{f<9(-_en6 z|G49U?FztjB!C2NPGG_9>qj{&xp7O-d#K9jAP3+f=L1k?Gs4_M+I(k3>`$ox`o8-#nJ(5;=@LB49XL1iL+C_RxL zJD8pf8&FX8XT3pXd`uZmkEWq*2ZtsP4h^SoxW2aL^`&fBwks<(_;7z`;_(Ngk+4mL z=cXZSX6#Zi7oKMtKxSw|Li~}Por%4P=+j~L?8!{gF8sUz1jEn1^-dWX8%{r^)L4T? zg*n0|F8(aml}IF_FYF0BIy8iDy>*?senG5f)}E0Y{itzX-;tgyxcTf{pb_P0`l+J< zu0qi+mI@o!i25snf-}WabDM?Ih8%PG-0{3D6qG}w<3nMIZYiIav&BrIDCaiHrG$jN zTg(;h>CjZDswAkzTt1u2XN#w5)1YSgqVzH_N)3a4kB&SR_OF|pnVXhd7-T-5%V%bw zF7|P`(LPsB%lxSjeyw@~Ho=X<2D-UfKYLvH$>jK0kOs{uO&2qsU9>mS!hAEbXxF7e zR_hS7Ptp=($~$ zkhbZcH95QMR9|BV!q`{VJ|zv}KOq~usiK(Ug-uz6a`sAjJ9Mh`xEEv#qCo+Ia%r|$ zE9zflJ(z3q*SO0A101vi(Mn{hlZA=J)5aiO+B zbatU;+_)t|4u^;ur`cZPMZ3o90^Z*isSkGCEId~f98Nt7on!5tiNW1bSq;zCKo1eO zdbp!ecjO-6j?Df zia!X`P;xb@Hp~L5_q-vbZaV?_8i)GW;6rVliG#bh3xU<%$k6IhJFF5jkN^@u07mzUlzFTb&J?!wxY zcUIq6ET4V<`fJNi1Pi&8@)b)-&djj`%4Eq2mkD3FxJ>!iZ>_xkt7IWxJTfs3yJeFj zV}~Cd8-H>%J$yKQ3+j4$pfZ(mVPoQWE`Mqur3`q|w_(3z;DEAj^t014FdQoxn&8Ju zmdDt!5|fq>DLRLDu4&G(lF2o3tRy&rJibp{$m!US(=;Wd7_JV-T$*}N4)fsM(1L5J z11a1Qc92dB&WbFDxAz8UfeZ@UW_Td^7ZR+j@YmF#mATSTh2b$( zcTC&lQfCg~^*ZM~rJG4hr&PCUEh0trltz=L$xO|{VE~7L|Np?$#5#sE%et<)jdgA-UuVG&B%jTVvQ%rtc?1{1ut_~l6aa{QC{5**+Q z2_OL^fCP{L5bb7UiEF6L6rSoxs>3>7xWY1g zOZp=CRsDox8=54#tx5;Ba+x80Rk*GNyS>bDJjq<5llGv*X7;Es- zrI;HDAOR$R1dsp{Kmter2_OL^fCP}h4Fqn3^?&gDfA~lL_(B3m00|%gB!C2v01`j~ zNB{{S0VIF~T9`oa{Xee%TeyRz+Ilcb&wbeJ5m1Z6csjR-S zSYAHAa`8%~yp56$4ULSZho2Z3PLF4fOpG5)Pfm`E9WI~yUHRRY%I9D2Y{*`@arx3; z)~>vhQuY;!`F%>xc~-hb<%C^OW^;;NEatOLsVJ3wb9P?N7WYvuJ<~UZ3U7|eT*Fm` zu%+rV+t+;ClnyhSX#=;oL72}~ru$Hi0}t19h^MR4wH+Y|p&mCiqHz_Tqe%>fh!oXR z8cmvpFc{g=VsgvS76x|S{mc3IF10(-1L(t7Bl%B1{ILAu+lty0>@U?j>;1fRw!D1p zNP27-dZDpbnt^0{+^3uaB*Ar+S@2*{oBBlcrL7CY@hro0w?ttGov>{!=EBL|R@J8` zEt_iaY*w2)1h^SowM;`-g~ga7b;s6Ss~PkLb2Z=7ebwO1R+&#YJn~ggkSlYzr4!S1 z8qkA8nUTsKCOO^d!T(AheWT*fq8QWyy=6W+MZf@zPf5{Oo=ZI})W3k@h( ziW^B{7y_hJ4{6f^kUClik_LWd`ovZ_(_y+|0wjyLRMmV<2N{_F}lo6BJ>Z+?NoL8pAV9QJOS}X=zpiqz#MC z=I?L+&V6)q-h1brkvOb4R<6FZcKKpu##?v%$}4Lhy|>NW^z@n2XDGECp=*{@4dTEI z9YUxoe2uBPVNufq3!K$f$4GH2MUAAvA?R*zvF7h@yR{Y799VQ%z>&eM7b+@r6>82^ zT?pwIx@$6nH&oP2aXo1;Zb1ucWCu;yv_M6px3;35Lv>xaM1_S4jQ!m4RmU^AN=@4& zFwvJ#&l{?v=}Dro2G0pAx^6LO@cn;Z-)E8j91&^adH5 z+3}AB8JpRk?g=tBvq#$D#&f$N&Go zY4^d5NB{{S0VIF~kN^@u0!RP}AOR$R1a4ab`2YXiwq1u6M*>Iy2_OL^fCP{L5f+C&*=MzxIzOZmAu|1j|Uvuk_@< zVy~H9{aiM`6W`33m}s78YM5$lsB3CunWAfwWMQnEWNB!mYi5yTW}0G_mXreI85o)B z8d&HWm?;=oSQ(pI8JX!Bn;Mx~7~_<&Xsu_&u