Metadata-Version: 2.4
Name: pod-scribe
Version: 0.1.0
Summary: Download and transcribe podcasts locally using Whisper
Project-URL: Homepage, https://github.com/konami0328/pod-scribe
License: MIT License
        
        Copyright (c) 2026 Konami
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
License-File: LICENSE
Requires-Python: >=3.11
Requires-Dist: faster-whisper
Requires-Dist: feedparser
Requires-Dist: pyyaml
Requires-Dist: requests
Requires-Dist: tqdm
Description-Content-Type: text/markdown


# pod-scribe

Download and transcribe podcast episodes locally. No cloud ASR costs — just your CPU and time.

Built for generating transcripts that can be fed into your own LLM workflows (summarization, Q&A, notes, etc).

---

## How it works

```
RSS feed → download audio → local Whisper → transcript (.txt)
```

Transcripts are saved as plain text files, ready to paste into any LLM chat interface.

---

## Requirements

- Python 3.11+
- faster-whisper (model downloads on first run)
- Proxy (only if required by your network)

---

## Setup

```bash
conda create -n pod-scribe python=3.11
conda activate pod-scribe
pip install -r requirements.txt
cp config.example.yaml config.yaml
```

Edit `config.yaml` to configure RSS feeds and Whisper model settings.

---

## Usage

> **Tip:** use `--pod` to target a specific podcast by name (fuzzy match). Defaults to all feeds.

### Download episodes

```bash
# Download the 3 most recent episodes (all feeds)
python run.py --download --last 3

# Download episodes since a specific date
# Tip: add a one-day buffer to account for timezone differences
python run.py --download --since 2026-03-01

# Target a specific podcast
python run.py --pod "Invest" --download --last 3

# Download a specific episode by title keyword
python run.py --pod "Invest" --download "stock"
```

### Transcribe

```bash
# Transcribe all downloaded episodes that don't have a transcript yet
python run.py --transcribe

# Transcribe a specific episode by keyword
python run.py --transcribe "stock"
```

### Download and transcribe together

```bash
python run.py --download --transcribe --last 3
python run.py --pod "Invest" --download --transcribe --since 2026-03-01
```

---

## Whisper model sizes

| Model  | Size   | Speed (CPU)    | Quality |
| ------ | ------ | -------------- | ------- |
| small  | ~500MB | ~0.6-0.8× realtime | good   |

`small` is recommended for CPU-only environments — fast enough for most clean English audio.

Models are cached at `~/.cache/huggingface/hub/` after first download.

> **First run note:** the model will be downloaded automatically. If you're in a restricted network region, set proxy environment variables before running. E.g,:
> ```bash
> export https_proxy=http://127.0.0.1:7897
> export http_proxy=http://127.0.0.1:7897
> ```

---

## Configuration

```yaml
rss:
  feeds:
    - name: "Invest Like the Best"
      url: "https://feeds.megaphone.fm/CLS2859450455"

whisper:
  model: small        # small / medium / large-v3
  language: null      # null = auto-detect, or "en" / "zh"

proxy:
  http: null          # leave empty if not needed
  https: null

output:
  transcripts_dir: "./transcripts"
```

---

## Suggested analysis prompt

Once you have a transcript, paste it into any LLM chat interface with a prompt. Below is the one I use now — feel free to adapt it to your own thinking style.

```
# ZH

- 你是一位批判性思维训练有素的分析师，擅长从对话性内容中提炼论证结构。

以下是一期播客的转录文稿。请按照以下4个步骤进行分析：

---

【第一步：论证结构梳理 + Fact Check（如适用）】

严格基于转录文本，不得添加未提及信息。

以表格呈现：

| 论点 | 支撑论据 | 论据类型 | 重要性 | 事实性核查 |
|------|--------|--------|------|------------|
| ... | ... | ... | 高/中/低 | ✅/⚠️/❌/🔍 |

要求：
- 每条尽量简洁（建议30–50字以内）
- 论据类型必须标注：（个人经验）（类比）（数据）（权威背书）（案例）
- 仅当涉及**明确可验证事实**时填写“事实性核查”：
  - ✅ 可确认 / ⚠️ 存疑 / ❌ 有误 / 🔍 建议核实
  - 并在单元格中简要说明依据（如：据领域共识 / 常识判断）
- 若该行无事实性内容，可留空或写“—”

---

【第二步：论证质量评估】

严格基于转录文本，不得添加文本中未提及的任何信息。

对每个论点逐一评估：
- 论据是否为直接证据，还是个人经验/类比/权威背书？
- 论证链条中是否存在跳跃或隐含假设？
- 样本是否有代表性？

---

【第三步：辩证反思】

允许调用训练知识，但须遵守以下规则：
- 反面论点须来自已知的学术争议、主流替代观点、或论证结构上的逻辑漏洞
- 必须注明来源类型，例如"据[领域]主流争议"或"从逻辑结构看"
- 不得凭空构造反例或捏造对立观点
- 推荐属于对立观点的不超过3个的高质量材料

---

【第四步：归纳总结】

在前三步的基础上，给出你对这期播客的整体判断。包含以下三点：
- 核心价值：这期播客最值得保留的洞见是什么？
- 最大局限：论证中的缺陷或盲点是什么？
- 你的建议：听完这期播客，听众最值得延伸阅读/思考的方向是什么？（不超过2个方向，须言之有据，不得泛泛而谈）


注意：
- 无论转录文本语言为何，所有输出均以中文呈现
```

```
# EN

You are an analyst highly trained in critical thinking, specializing in extracting and refining argumentative structures from conversational content.

Below is a transcript of a podcast episode. Please conduct an analysis following these 4 steps:

---

**【Step 1: Argumentative Structure Mapping + Fact Check (if applicable)】**

Strictly based on the transcript; do not add information not mentioned.

Present in a table:

| Argument | Supporting Evidence | Evidence Type | Importance | Fact Check |
| :--- | :--- | :--- | :--- | :--- |
| ... | ... | ... | High/Med/Low | ✅/⚠️/❌/🔍 |

Requirements:
- Each entry should be as concise as possible (suggested 30–50 words).
- Evidence types must be labeled: (Personal Experience), (Analogy), (Data), (Authority Endorsement), (Case Study).
- Only fill in the "Fact Check" column when **explicitly verifiable facts** are involved:
    - ✅ Confirmed / ⚠️ Questionable / ❌ Erroneous / 🔍 Verification Recommended.
    - Briefly state the basis in the cell (e.g., Based on field consensus / Common sense).
- If the row has no factual content, leave it blank or write "—".

---

**【Step 2: Argument Quality Assessment】**

Strictly based on the transcript; do not add any information not mentioned in the text.

Evaluate each argument individually:
- Is the evidence direct, or is it personal experience/analogy/authority endorsement?
- Are there leaps or hidden assumptions in the argumentative chain?
- Is the sample representative?

---

**【Step 3: Dialectical Reflection】**

Allowed to use trained knowledge, but must adhere to the following rules:
- Counter-arguments must come from known academic disputes, mainstream alternative views, or logical loopholes in the argumentative structure.
- Must specify the source type, e.g., "According to mainstream controversy in [Field]" or "From a logical structural perspective".
- Do not fabricate counter-examples or invent opposing views.
- Recommend no more than 3 high-quality materials belonging to opposing viewpoints.

---

**【Step 4: Summary & Conclusion】**

Based on the previous three steps, provide your overall judgment of this podcast. Include the following three points:
- Core Value: What is the most valuable insight to retain from this episode?
- Maximum Limitation: What are the flaws or blind spots in the argumentation?
- Your Suggestion: What are the most worthwhile directions for listeners to explore or reflect on after listening to this episode? (No more than 2 directions; must be evidence-based and not vague).

Note:
- Regardless of the language of the transcript, all final outputs must be presented in English.
```

---

## Notes

- Transcripts and audio files are saved to `transcripts/` (gitignored)
- RSS publish dates may differ from podcast apps — use `--since` with a one-day buffer to be safe
- This tool only handles downloading and transcription. Downstream processing is intentionally left to the user
