fix: marker labels show actual m-number from filename instead of time order
Extract the manual export counter (m1, m2, ...) from the output path so timeline markers match their filenames. Falls back to sequential numbering for old-format paths without m-prefix. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+15
-6
@@ -1,4 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import threading
|
import threading
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
@@ -7,6 +8,12 @@ from pathlib import Path
|
|||||||
from .paths import _log
|
from .paths import _log
|
||||||
|
|
||||||
|
|
||||||
|
def _extract_m_number(output_path: str) -> int | None:
|
||||||
|
"""Extract the manual export number from a path like clip_001_m3_0.mp4."""
|
||||||
|
m = re.search(r'_m(\d+)[_.]', os.path.basename(output_path))
|
||||||
|
return int(m.group(1)) if m else None
|
||||||
|
|
||||||
|
|
||||||
class ProcessedDB:
|
class ProcessedDB:
|
||||||
_SCHEMA_VERSION = 4 # bump when schema changes
|
_SCHEMA_VERSION = 4 # bump when schema changes
|
||||||
|
|
||||||
@@ -378,12 +385,13 @@ class ProcessedDB:
|
|||||||
(match, profile),
|
(match, profile),
|
||||||
).fetchall()
|
).fetchall()
|
||||||
seen_times: dict[float, tuple[float, int, str, float]] = {}
|
seen_times: dict[float, tuple[float, int, str, float]] = {}
|
||||||
n = 0
|
seq = 0
|
||||||
for t, p, dur, cnt, spr in rows:
|
for t, p, dur, cnt, spr in rows:
|
||||||
if t not in seen_times:
|
if t not in seen_times:
|
||||||
n += 1
|
seq += 1
|
||||||
|
num = _extract_m_number(p) or seq
|
||||||
span = (dur or 8.0) + ((cnt or 1) - 1) * (spr or 3.0)
|
span = (dur or 8.0) + ((cnt or 1) - 1) * (spr or 3.0)
|
||||||
seen_times[t] = (t, n, p, span)
|
seen_times[t] = (t, num, p, span)
|
||||||
return list(seen_times.values())
|
return list(seen_times.values())
|
||||||
|
|
||||||
def get_markers(self, filename: str, profile: str = "default",
|
def get_markers(self, filename: str, profile: str = "default",
|
||||||
@@ -424,12 +432,13 @@ class ProcessedDB:
|
|||||||
result: dict[str, list[tuple[float, int, str, float]]] = {}
|
result: dict[str, list[tuple[float, int, str, float]]] = {}
|
||||||
for folder, folder_rows in by_folder.items():
|
for folder, folder_rows in by_folder.items():
|
||||||
seen: dict[float, tuple[float, int, str, float]] = {}
|
seen: dict[float, tuple[float, int, str, float]] = {}
|
||||||
n = 0
|
seq = 0
|
||||||
for t, p, dur, cnt, spr in folder_rows:
|
for t, p, dur, cnt, spr in folder_rows:
|
||||||
if t not in seen:
|
if t not in seen:
|
||||||
n += 1
|
seq += 1
|
||||||
|
num = _extract_m_number(p) or seq
|
||||||
span = (dur or 8.0) + ((cnt or 1) - 1) * (spr or 3.0)
|
span = (dur or 8.0) + ((cnt or 1) - 1) * (spr or 3.0)
|
||||||
seen[t] = (t, n, p, span)
|
seen[t] = (t, num, p, span)
|
||||||
name = os.path.basename(folder)
|
name = os.path.basename(folder)
|
||||||
result[name] = list(seen.values())
|
result[name] = list(seen.values())
|
||||||
return result
|
return result
|
||||||
|
|||||||
Reference in New Issue
Block a user