Skip to content

Commit 72199fc

Browse files
committed
Fix video count (use disk scan not stale manifest); add embedding progress bars and per-section API timing
1 parent 72d2e3a commit 72199fc

3 files changed

Lines changed: 18 additions & 21 deletions

File tree

electron/main.js

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -188,21 +188,13 @@ function getFilesStatus(courseId) {
188188
const outDir = getOutputDir();
189189
const courseDir = path.join(outDir, String(courseId));
190190

191-
// Videos from manifest (prefer OUTPUT_DIR, then DATA_DIR)
191+
// Videos: count mp4 files actually on disk (manifest can have stale/duplicate entries)
192+
const videosDir = path.join(courseDir, 'videos');
192193
let videoDone = 0, videoTotal = 0;
193-
for (const mp of [
194-
path.join(outDir, 'manifest.json'),
195-
path.join(DATA_DIR, 'manifest.json'),
196-
]) {
197-
if (fs.existsSync(mp)) {
198-
try {
199-
const m = JSON.parse(fs.readFileSync(mp, 'utf8'));
200-
const items = Object.values(m).filter(v => v.path && v.path.includes(String(courseId)));
201-
videoTotal = items.length;
202-
videoDone = items.filter(v => v.status === 'done').length;
203-
if (videoTotal > 0) break;
204-
} catch {}
205-
}
194+
if (fs.existsSync(videosDir)) {
195+
const mp4s = fs.readdirSync(videosDir).filter(f => f.toLowerCase().endsWith('.mp4'));
196+
videoTotal = mp4s.length;
197+
videoDone = mp4s.length; // present on disk = downloaded
206198
}
207199

208200
const countJson = (dir, excludePattern) => {

note_generation.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -808,9 +808,10 @@ def generate_section(
808808
return sec_file.read_text(encoding="utf-8")
809809

810810
chunk_title = _chunk_title(chunk)
811+
fi_tag = f"F{ld.file_idx} " if ld.file_idx > 1 else ""
811812
if bar:
812-
fi = f"F{ld.file_idx} " if ld.file_idx > 1 else ""
813-
bar.set_postfix_str(f"L{lec_num}{fi}§{ci}/{chunk_title[:22]} generating")
813+
bar.set_postfix_str(f"L{lec_num}{fi_tag}§{ci}/{chunk_title[:22]} generating")
814+
tqdm.write(f"L{lec_num}{fi_tag}§{ci} [{chunk_title[:40]}] slides {chunk[0].index+1}{chunk[-1].index+1} calling {NOTE_MODEL}")
814815

815816
# Render only this chunk's slide images (lazy, avoids OOM)
816817
img_map = ld.render_chunk_images([s.index for s in chunk])
@@ -830,7 +831,10 @@ def generate_section(
830831
has_transcript=has_transcript,
831832
)
832833

834+
import time as _time
835+
_t0 = _time.monotonic()
833836
draft = _call(NOTE_MODEL, _P("system"), user, _max_tokens(detail))
837+
tqdm.write(f" ✓ {len(draft):,} chars ({_time.monotonic()-_t0:.0f}s)")
834838

835839
if not draft:
836840
tqdm.write(f" [warn] Empty draft for L{lec_num} §{ci} — skipping")

semantic_alignment.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -398,14 +398,15 @@ def get_embedder():
398398
return model
399399

400400

401-
def embed_texts(model, texts: list[str]) -> np.ndarray:
401+
def embed_texts(model, texts: list[str], desc: str = " embedding") -> np.ndarray:
402402
"""Return L2-normalised float32 embeddings, shape (N, D)."""
403403
vecs = model.encode(
404404
texts,
405405
batch_size=BATCH_SIZE,
406-
show_progress_bar=False,
406+
show_progress_bar=True,
407407
normalize_embeddings=True, # cosine sim → inner product on unit sphere
408408
convert_to_numpy=True,
409+
tqdm_kwargs={"desc": desc, "unit": "text", "leave": False},
409410
)
410411
return vecs.astype(np.float32)
411412

@@ -663,15 +664,15 @@ def align(caption_path: Path, slide_path: Path,
663664

664665
slide_texts = _enrich_sparse_slides([s.text if s.text.strip() else s.label for s in slides])
665666
print(f" Embedding {len(slides)} slides...")
666-
slide_embs = embed_texts(embedder, slide_texts)
667+
slide_embs = embed_texts(embedder, slide_texts, desc=" slides")
667668
index = build_faiss_index(slide_embs)
668669

669670
# ── Embed transcript segments (with context window) ───────────────────────
670671
print(f" Building context windows (±{CONTEXT_SEC:.0f}s)...")
671672
window_texts = build_window_texts(segments, CONTEXT_SEC)
672673

673674
print(f" Embedding {len(window_texts)} transcript windows...")
674-
seg_embs = embed_texts(embedder, window_texts) # (T, D)
675+
seg_embs = embed_texts(embedder, window_texts, desc=" transcript") # (T, D)
675676

676677
# ── Raw similarity scores: each segment vs all slides ─────────────────────
677678
# faiss.search returns (scores, indices); with IndexFlatIP + normalised
@@ -849,7 +850,7 @@ def align_multi_slides(
849850
print(f" Building context windows (±{CONTEXT_SEC:.0f}s)...")
850851
window_texts = build_window_texts(segments, CONTEXT_SEC)
851852
print(f" Embedding {len(window_texts)} transcript windows...")
852-
seg_embs = embed_texts(embedder, window_texts)
853+
seg_embs = embed_texts(embedder, window_texts, desc=" transcript")
853854

854855
# ── FAISS search → log-likelihood matrix ──────────────────────────────────
855856
print(" Querying FAISS index...")

0 commit comments

Comments
 (0)