Skill: fafeidou/rrrrr (version 1.0.1)

--- name: to-markdown-5555 description: 把srt字幕文件转换成markdown笔记333 --- 你是专业的字幕文本处理助手，任务是将 SRT 字幕完整转换为 Markdown 笔记，并添加标点、段落格式和必要的截图占位符。要求如下： 1. **内容完整保留**：禁止任何删减、总结或省略，必须逐字保留 SRT 所有文字。 2. **语言规则**：使用中文书写，保留必要的英文专有名词。 3. **段落结构**： - 仅使用一个层级的段落 - 每个段落标题使用 `## 标题` - 第一段为引言，不使用标题 - 只需要划分2-3个段落 4. **标点与排版**： - 为每句话添加合适标点 - 适当划分自然段 5. **截图占位符规则（按需插入）**： - 当某句符合以下任一条件时，在句末添加截图标记： - 代码讲解 - UI 交互操作 - 包含“这么、这里、这儿”等视觉指代词 - 提及网址/链接/地址（包括 GitHub、API endpoint 等） - 任何借助视觉材料更易理解的内容 - 形式必须严格为： ``` Screenshot-[hh:mm:ss] ``` - 仅在真正有助理解时插入，不可滥用 比如： ```原始SRT 00:02:08,600 --> 00:02:09,800 安装这个工具 ``` 截图标记方式： 安装这个工具 Screenshot-[00:02:09] 其中时间点应是这句话的末尾秒 6. **输出文件格式**： - 生成内容保存为单个 Markdown 文件，命名为： ``` 项目根目录/xxx.md ``` 7. **后续处理**： markdown生成完毕以后，调用 python scripts/screenshot.py 对视频进行截图，执行python脚本时不需要传递任何参数

path: scripts/screenshot.py
content: import argparse
import json
import logging
import os
import re
import subprocess
from pathlib import Path
from typing import Iterable, List, Optional, Tuple

def write_note(filename: str, markdown: str) -> Path:
    path = Path(f"output/{filename}.md")
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(markdown, encoding="utf-8")
    logging.info("Saved note backup: %s", path)
    return path


# ---------- 截图 ----------

def extract_screenshot_markers(markdown: str) -> List[Tuple[str, int]]:
    """
    找到 Screenshot-00:03:12 或 Screenshot-[00:03:12] 形式的标记。
    """
    pattern = r"(?:\*?)Screenshot-(?:\[(\d{2}):(\d{2}):(\d{2})\]|(\d{2}):(\d{2}):(\d{2}))"
    results: List[Tuple[str, int]] = []
    for match in re.finditer(pattern, markdown):
        hh = match.group(1) or match.group(4)
        mm = match.group(2) or match.group(5)
        ss = match.group(3) or match.group(6)
        total_seconds = int(mm) * 60 + int(ss)
        results.append((match.group(0), total_seconds))
    return results


def generate_screenshot(video_path: Path, output_dir: Path, timestamp: int) -> Path:
    """
    调用 ffmpeg 截图，返回图片路径。
    """
    output_dir.mkdir(parents=True, exist_ok=True)
    mm = timestamp // 60
    ss = timestamp % 60
    filename = f"screenshot_{mm:02d}_{ss:02d}.jpg"
    output_path = output_dir / filename

    cmd = [
        "ffmpeg",
        "-ss",
        str(timestamp),
        "-i",
        str(video_path),
        "-frames:v",
        "1",
        "-q:v",
        "2",
        str(output_path),
        "-y",
    ]
    logging.info("生成截图：time=%s, file=%s", timestamp, output_path)
    subprocess.run(cmd, check=False, capture_output=True)
    return output_path


def replace_screenshots(
    markdown: str,
    video_path: Optional[Path],
    output_dir: Path,
    image_base_url: str,
) -> str:
    """
    将 Screenshot 标记替换为实际图片链接；没有视频时保持原样。
    返回修改后的 markdown。
    """
    if not video_path:
        logging.info("未提供视频文件，保留 Screenshot 标记不变。")
        return markdown

    matches = extract_screenshot_markers(markdown)
    
    for idx, (marker, ts) in enumerate(matches):
        try:
            img_path = generate_screenshot(video_path, output_dir, ts)
            url = f"{image_base_url.rstrip('/')}/{img_path.name}"
            markdown = markdown.replace(marker, f"![]({url})", 1)
        except Exception as exc:  # pylint: disable=broad-except
            logging.warning("生成截图失败（%s）：%s", marker, exc)
    return markdown

def main():
    logging.basicConfig(
        level=logging.INFO,
        format="%(asctime)s [%(levelname)s] %(message)s",
    )
    parser = argparse.ArgumentParser(description="将 SRT/视频转换为 Markdown 笔记")
    args = parser.parse_args()

    logging.info("环境变量加载完成。")

    #从当前工作目录自动查找对应的 SRT 和 MP4 文件
    cwd = Path.cwd()
    md_path: Path
    video_path: Path
    # 附件文件夹
    image_base_url = "assets"
    screenshots_path = Path(f"output/{image_base_url}")

    md_candidates = sorted(cwd.glob("*.md"))
    if not md_candidates:
        raise RuntimeError("当前目录没有找到任何 .md 文件，请把字幕文件夹导出并且放到根目录下。")
    if len(md_candidates) > 1:
        logging.warning("当前目录中发现多个 .srt，将使用第一个：%s", md_candidates[0])
    md_path = md_candidates[0]

    mp4_candidates = sorted(cwd.glob("*.mp4"))
    if mp4_candidates:
        preferred: Optional[Path] = None
        video_path = preferred or mp4_candidates[0]
        if len(mp4_candidates) > 1 and preferred is None:
            logging.warning("当前目录中发现多个 .mp4，将使用第一个：%s", video_path)
    else:
        logging.info("当前目录未发现 .mp4，将保留 Markdown 中的 Screenshot 标记不变。")
        video_path = None

    # 读取 markdown 文件内容
    markdown = md_path.read_text(encoding="utf-8")
    logging.info("读取 Markdown 文件：%s", md_path)

    processed_md = replace_screenshots(markdown, video_path=video_path, output_dir=screenshots_path, image_base_url=image_base_url)

    logging.info("截图处理完成")
    
    # 备份替换后的 Markdown 内容
    output = write_note("note_processed", processed_md)

    info = {
        "output": str(output),
        "screenshots_dir": str(screenshots_path),
        "video_used_for_screenshot": str(video_path)
    }
    print(json.dumps(info, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()

Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)