mxivideo/scripts/debug_material_loading.py

253 lines
8.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
调试素材加载问题的脚本
检查数据文件、加载过程和过滤逻辑
"""
import sys
import os
import json
from pathlib import Path
# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from python_core.services.media_manager import MediaManager
from python_core.config import settings
def check_data_files():
"""检查数据文件的存在和内容"""
print("📁 检查数据文件...")
cache_dir = settings.temp_dir / "cache"
segments_file = cache_dir / "video_segments.json"
original_videos_file = cache_dir / "original_videos.json"
print(f"缓存目录: {cache_dir}")
print(f"片段文件: {segments_file}")
print(f"原始视频文件: {original_videos_file}")
# 检查目录
if cache_dir.exists():
print(f"✅ 缓存目录存在")
files = list(cache_dir.glob("*"))
print(f"目录内容: {[f.name for f in files]}")
else:
print(f"❌ 缓存目录不存在")
return False
# 检查片段文件
if segments_file.exists():
try:
with open(segments_file, 'r', encoding='utf-8') as f:
segments_data = json.load(f)
print(f"✅ 片段文件存在,包含 {len(segments_data)} 个片段")
if segments_data:
print("\n📋 片段数据示例:")
for i, segment in enumerate(segments_data[:3]):
print(f" {i+1}. {segment.get('filename', 'N/A')}")
print(f" ID: {segment.get('id', 'N/A')}")
print(f" 标签: {segment.get('tags', [])}")
print(f" 激活状态: {segment.get('is_active', 'N/A')}")
print(f" 使用次数: {segment.get('use_count', 'N/A')}")
print()
return True
except Exception as e:
print(f"❌ 读取片段文件失败: {e}")
return False
else:
print(f"❌ 片段文件不存在")
return False
def test_media_manager_loading():
"""测试MediaManager的加载过程"""
print("\n🔧 测试MediaManager加载...")
try:
# 创建MediaManager实例
media_manager = MediaManager()
print(f"✅ MediaManager创建成功")
print(f"加载的片段数量: {len(media_manager.video_segments)}")
print(f"加载的原始视频数量: {len(media_manager.original_videos)}")
# 检查内存中的数据
if media_manager.video_segments:
print("\n📊 内存中的片段数据:")
for i, segment in enumerate(media_manager.video_segments[:3]):
print(f" {i+1}. {segment.filename}")
print(f" ID: {segment.id}")
print(f" 标签: {segment.tags}")
print(f" 激活状态: {segment.is_active}")
print(f" 使用次数: {segment.use_count}")
print()
return media_manager
except Exception as e:
print(f"❌ MediaManager创建失败: {e}")
import traceback
traceback.print_exc()
return None
def test_get_all_segments(media_manager):
"""测试get_all_segments方法"""
print("\n🔍 测试get_all_segments方法...")
try:
segments = media_manager.get_all_segments()
print(f"✅ get_all_segments返回 {len(segments)} 个片段")
if segments:
print("\n📋 返回的片段数据:")
for i, segment in enumerate(segments[:3]):
print(f" {i+1}. {segment.get('filename', 'N/A')}")
print(f" ID: {segment.get('id', 'N/A')}")
print(f" 标签: {segment.get('tags', [])}")
print(f" 激活状态: {segment.get('is_active', 'N/A')}")
print()
else:
print("❌ 没有返回任何片段")
# 分析原因
print("\n🔍 分析原因:")
total_segments = len(media_manager.video_segments)
active_segments = [s for s in media_manager.video_segments if s.is_active]
inactive_segments = [s for s in media_manager.video_segments if not s.is_active]
print(f"总片段数: {total_segments}")
print(f"激活的片段: {len(active_segments)}")
print(f"未激活的片段: {len(inactive_segments)}")
if inactive_segments:
print("\n❌ 发现未激活的片段:")
for i, segment in enumerate(inactive_segments[:3]):
print(f" {i+1}. {segment.filename} (is_active: {segment.is_active})")
return segments
except Exception as e:
print(f"❌ get_all_segments调用失败: {e}")
import traceback
traceback.print_exc()
return []
def test_command_line_interface():
"""测试命令行接口"""
print("\n🖥️ 测试命令行接口...")
try:
import subprocess
import sys
# 调用Python命令
result = subprocess.run([
sys.executable, '-m', 'python_core.services.media_manager', 'get_all_segments'
], capture_output=True, text=True, cwd=project_root)
print(f"返回码: {result.returncode}")
print(f"标准输出: {result.stdout}")
print(f"标准错误: {result.stderr}")
if result.returncode == 0 and result.stdout:
try:
response = json.loads(result.stdout)
print(f"✅ 命令行接口返回: {response}")
if response.get('status') and response.get('data'):
segments = response['data']
print(f"通过命令行获取到 {len(segments)} 个片段")
else:
print(f"❌ 命令行返回状态: {response.get('status')}, 消息: {response.get('message')}")
except json.JSONDecodeError as e:
print(f"❌ 解析JSON响应失败: {e}")
else:
print(f"❌ 命令行调用失败")
except Exception as e:
print(f"❌ 测试命令行接口失败: {e}")
def check_file_permissions():
"""检查文件权限"""
print("\n🔐 检查文件权限...")
cache_dir = settings.temp_dir / "cache"
segments_file = cache_dir / "video_segments.json"
if segments_file.exists():
stat = segments_file.stat()
print(f"文件权限: {oct(stat.st_mode)}")
print(f"文件大小: {stat.st_size} 字节")
print(f"可读: {os.access(segments_file, os.R_OK)}")
print(f"可写: {os.access(segments_file, os.W_OK)}")
else:
print("文件不存在,无法检查权限")
def suggest_fixes():
"""建议修复方案"""
print("\n🔧 修复建议:")
print("1. 如果数据文件不存在:")
print(" - 尝试导入一些测试视频")
print(" - 检查导入过程是否有错误")
print("\n2. 如果数据文件存在但为空:")
print(" - 检查导入过程的保存逻辑")
print(" - 查看Python日志文件")
print("\n3. 如果片段存在但is_active为false:")
print(" - 检查片段删除逻辑")
print(" - 手动修改JSON文件中的is_active字段")
print("\n4. 如果命令行接口失败:")
print(" - 检查Python环境和依赖")
print(" - 查看错误日志")
print("\n5. 通用调试步骤:")
print(" - 启用详细日志记录")
print(" - 使用浏览器开发者工具查看网络请求")
print(" - 检查Tauri后端日志")
def main():
"""主函数"""
print("🔍 素材加载问题调试")
print("=" * 50)
# 1. 检查数据文件
files_ok = check_data_files()
if not files_ok:
print("\n❌ 数据文件检查失败,无法继续")
suggest_fixes()
return
# 2. 测试MediaManager加载
media_manager = test_media_manager_loading()
if not media_manager:
print("\n❌ MediaManager加载失败无法继续")
suggest_fixes()
return
# 3. 测试get_all_segments方法
segments = test_get_all_segments(media_manager)
# 4. 测试命令行接口
test_command_line_interface()
# 5. 检查文件权限
check_file_permissions()
# 6. 提供修复建议
suggest_fixes()
print("\n✅ 调试完成!")
if __name__ == "__main__":
main()