#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ B站视频提取脚本 提取视频信息、统计数据、字幕并生成Markdown笔记 """ import sys import os import json import re from datetime import datetime # 添加skills路径 sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'skills', 'obsidian-kb')) from src.extractors.bilibili_extractor import BilibiliExtractor from src.config import get_config def format_number(num): """格式化数字""" if num >= 100000000: return f"{num / 100000000:.1f}亿" elif num >= 10000: return f"{num / 10000:.1f}万" else: return f"{num:,}" def generate_markdown(result, bvid): """生成Markdown笔记""" metadata = result['metadata'] stats = result['stats'] description = result['description'] subtitle = result['subtitle'] # 获取当前时间 now = datetime.now().strftime('%Y-%m-%d %H:%M:%S') md = f"""# {metadata['title']} > **来源**: [B站](https://www.bilibili.com/video/{bvid}) > **作者**: {metadata['author']} > **发布时间**: {metadata['pubtime']} > **提取时间**: {now} > **时长**: {metadata['duration']} ## 📊 统计数据 | 指标 | 数量 | |------|------| | 👀 播放 | {format_number(stats['view'])} | | 💬 弹幕 | {format_number(stats['danmaku'])} | | 📝 评论 | {format_number(stats['reply'])} | | ⭐ 收藏 | {format_number(stats['favorite'])} | | 🪙 投币 | {format_number(stats['coin'])} | | 🔗 分享 | {format_number(stats['share'])} | | 👍 点赞 | {format_number(stats['like'])} | ## 📝 视频简介 {description if description else '(暂无简介)'} ## 📌 标签 {metadata['tags'] if metadata['tags'] else '(无标签)'} ## 🎬 字幕 {subtitle if subtitle else '(无字幕)'} --- **元数据**: - BV号: `{metadata['bvid']}` - AV号: `{metadata['aid']}` - UP主ID: `{metadata['mid']}` """ return md def main(): """主函数""" # BV号 bvid = "BV1N5foBjE5K" # 从 https://b23.tv/btMGoOi 解析得到 print(f"开始提取B站视频: {bvid}") print("=" * 60) # 获取配置 try: config = get_config() except Exception as e: print(f"⚠️ 获取配置失败,使用默认配置: {e}") config = None # 创建提取器 extractor = BilibiliExtractor(config=config) # 提取视频信息 try: result = extractor.extract(bvid) print("\n✅ 提取成功!\n") print("=" * 60) print("基本信息:") print("=" * 60) print(f"标题: {result['metadata']['title']}") print(f"作者: {result['metadata']['author']}") print(f"时长: {result['metadata']['duration']}") print(f"发布: {result['metadata']['pubtime']}") print("\n" + "=" * 60) print("统计数据:") print("=" * 60) print(f"播放: {format_number(result['stats']['view'])}") print(f"弹幕: {format_number(result['stats']['danmaku'])}") print(f"评论: {format_number(result['stats']['reply'])}") print(f"收藏: {format_number(result['stats']['favorite'])}") print(f"投币: {format_number(result['stats']['coin'])}") print(f"点赞: {format_number(result['stats']['like'])}") # 生成 Markdown 笔记 md_content = generate_markdown(result, bvid) # 确保 notes 目录存在 notes_dir = "/home/admin/.openclaw/workspace/notes" os.makedirs(notes_dir, exist_ok=True) # 生成文件名(使用BV号作为文件名) filename = f"{bvid}.md" filepath = os.path.join(notes_dir, filename) # 写入文件 with open(filepath, 'w', encoding='utf-8') as f: f.write(md_content) print("\n" + "=" * 60) print(f"✅ Markdown笔记已生成: {filepath}") print("=" * 60) # 返回笔记内容 return md_content except Exception as e: print(f"\n❌ 提取失败: {e}") import traceback traceback.print_exc() return None if __name__ == '__main__': main()