feat: Initial v0.9 release with API Key authentication

## v0.9.20260325_144654

### Features
- API Key Authentication System
- Job Worker System
- V2 Backup Versioning

### Bug Fixes
- get_processor_results_by_job column mapping

Co-authored-by: OpenCode
This commit is contained in:
accusys
2026-03-25 14:52:51 +08:00
parent 47e86b696f
commit 383201cacd
193 changed files with 40268 additions and 422 deletions

View File

@@ -1,25 +1,31 @@
#!/opt/homebrew/bin/python3.11
import sys
import json
import tempfile
import os
import argparse
from faster_whisper import WhisperModel
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from redis_publisher import RedisPublisher
def run_asr(video_path, output_path):
print(f"ASR_START", file=sys.stderr)
print(f"Loading Whisper model...", file=sys.stderr)
def run_asr(video_path, output_path, uuid: str = ""):
publisher = RedisPublisher(uuid) if uuid else None
if publisher:
publisher.info("asr", "ASR_START")
if publisher:
publisher.info("asr", "Loading Whisper model...")
model = WhisperModel("tiny", device="cpu", compute_type="int8")
print(f"Transcribing: {video_path}", file=sys.stderr)
if publisher:
publisher.info("asr", f"Transcribing: {video_path}")
segments, info = model.transcribe(video_path, beam_size=5)
print(f"ASR_LANGUAGE:{info.language}", file=sys.stderr)
print(
f"Detected language: {info.language} (probability: {info.language_probability:.2f})",
file=sys.stderr,
)
if publisher:
publisher.info("asr", f"ASR_LANGUAGE:{info.language}")
results = []
total_segments = 0
@@ -30,7 +36,10 @@ def run_asr(video_path, output_path):
)
total_segments += 1
if total_segments % 100 == 0:
print(f"ASR_PROGRESS:{total_segments}", file=sys.stderr)
if publisher:
publisher.progress(
"asr", total_segments, 0, f"Segment {total_segments}"
)
output = {
"language": info.language,
@@ -41,13 +50,15 @@ def run_asr(video_path, output_path):
with open(output_path, "w") as f:
json.dump(output, f, indent=2)
print(f"ASR_COMPLETE:{total_segments}", file=sys.stderr)
print(f"ASR complete. {len(results)} segments.", file=sys.stderr)
if publisher:
publisher.complete("asr", f"{len(results)} segments")
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: asr_processor.py <video_path> <output_json_path>")
sys.exit(1)
parser = argparse.ArgumentParser(description="ASR Transcription")
parser.add_argument("video_path", help="Path to video file")
parser.add_argument("output_path", help="Output JSON path")
parser.add_argument("--uuid", "-u", help="UUID for Redis progress", default="")
args = parser.parse_args()
run_asr(sys.argv[1], sys.argv[2])
run_asr(args.video_path, args.output_path, args.uuid)