karaoke-gen 0.86.7__py3-none-any.whl → 0.96.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- backend/.coveragerc +20 -0
- backend/.gitignore +37 -0
- backend/Dockerfile +43 -0
- backend/Dockerfile.base +74 -0
- backend/README.md +242 -0
- backend/__init__.py +0 -0
- backend/api/__init__.py +0 -0
- backend/api/dependencies.py +457 -0
- backend/api/routes/__init__.py +0 -0
- backend/api/routes/admin.py +742 -0
- backend/api/routes/audio_search.py +903 -0
- backend/api/routes/auth.py +348 -0
- backend/api/routes/file_upload.py +2076 -0
- backend/api/routes/health.py +344 -0
- backend/api/routes/internal.py +435 -0
- backend/api/routes/jobs.py +1610 -0
- backend/api/routes/review.py +652 -0
- backend/api/routes/themes.py +162 -0
- backend/api/routes/users.py +1014 -0
- backend/config.py +172 -0
- backend/main.py +133 -0
- backend/middleware/__init__.py +5 -0
- backend/middleware/audit_logging.py +124 -0
- backend/models/__init__.py +0 -0
- backend/models/job.py +519 -0
- backend/models/requests.py +123 -0
- backend/models/theme.py +153 -0
- backend/models/user.py +254 -0
- backend/models/worker_log.py +164 -0
- backend/pyproject.toml +29 -0
- backend/quick-check.sh +93 -0
- backend/requirements.txt +29 -0
- backend/run_tests.sh +60 -0
- backend/services/__init__.py +0 -0
- backend/services/audio_analysis_service.py +243 -0
- backend/services/audio_editing_service.py +278 -0
- backend/services/audio_search_service.py +702 -0
- backend/services/auth_service.py +630 -0
- backend/services/credential_manager.py +792 -0
- backend/services/discord_service.py +172 -0
- backend/services/dropbox_service.py +301 -0
- backend/services/email_service.py +1093 -0
- backend/services/encoding_interface.py +454 -0
- backend/services/encoding_service.py +405 -0
- backend/services/firestore_service.py +512 -0
- backend/services/flacfetch_client.py +573 -0
- backend/services/gce_encoding/README.md +72 -0
- backend/services/gce_encoding/__init__.py +22 -0
- backend/services/gce_encoding/main.py +589 -0
- backend/services/gce_encoding/requirements.txt +16 -0
- backend/services/gdrive_service.py +356 -0
- backend/services/job_logging.py +258 -0
- backend/services/job_manager.py +842 -0
- backend/services/job_notification_service.py +271 -0
- backend/services/local_encoding_service.py +590 -0
- backend/services/local_preview_encoding_service.py +407 -0
- backend/services/lyrics_cache_service.py +216 -0
- backend/services/metrics.py +413 -0
- backend/services/packaging_service.py +287 -0
- backend/services/rclone_service.py +106 -0
- backend/services/storage_service.py +209 -0
- backend/services/stripe_service.py +275 -0
- backend/services/structured_logging.py +254 -0
- backend/services/template_service.py +330 -0
- backend/services/theme_service.py +469 -0
- backend/services/tracing.py +543 -0
- backend/services/user_service.py +721 -0
- backend/services/worker_service.py +558 -0
- backend/services/youtube_service.py +112 -0
- backend/services/youtube_upload_service.py +445 -0
- backend/tests/__init__.py +4 -0
- backend/tests/conftest.py +224 -0
- backend/tests/emulator/__init__.py +7 -0
- backend/tests/emulator/conftest.py +88 -0
- backend/tests/emulator/test_e2e_cli_backend.py +1053 -0
- backend/tests/emulator/test_emulator_integration.py +356 -0
- backend/tests/emulator/test_style_loading_direct.py +436 -0
- backend/tests/emulator/test_worker_logs_direct.py +229 -0
- backend/tests/emulator/test_worker_logs_subcollection.py +443 -0
- backend/tests/requirements-test.txt +10 -0
- backend/tests/requirements.txt +6 -0
- backend/tests/test_admin_email_endpoints.py +411 -0
- backend/tests/test_api_integration.py +460 -0
- backend/tests/test_api_routes.py +93 -0
- backend/tests/test_audio_analysis_service.py +294 -0
- backend/tests/test_audio_editing_service.py +386 -0
- backend/tests/test_audio_search.py +1398 -0
- backend/tests/test_audio_services.py +378 -0
- backend/tests/test_auth_firestore.py +231 -0
- backend/tests/test_config_extended.py +68 -0
- backend/tests/test_credential_manager.py +377 -0
- backend/tests/test_dependencies.py +54 -0
- backend/tests/test_discord_service.py +244 -0
- backend/tests/test_distribution_services.py +820 -0
- backend/tests/test_dropbox_service.py +472 -0
- backend/tests/test_email_service.py +492 -0
- backend/tests/test_emulator_integration.py +322 -0
- backend/tests/test_encoding_interface.py +412 -0
- backend/tests/test_file_upload.py +1739 -0
- backend/tests/test_flacfetch_client.py +632 -0
- backend/tests/test_gdrive_service.py +524 -0
- backend/tests/test_instrumental_api.py +431 -0
- backend/tests/test_internal_api.py +343 -0
- backend/tests/test_job_creation_regression.py +583 -0
- backend/tests/test_job_manager.py +339 -0
- backend/tests/test_job_manager_notifications.py +329 -0
- backend/tests/test_job_notification_service.py +443 -0
- backend/tests/test_jobs_api.py +273 -0
- backend/tests/test_local_encoding_service.py +423 -0
- backend/tests/test_local_preview_encoding_service.py +567 -0
- backend/tests/test_main.py +87 -0
- backend/tests/test_models.py +918 -0
- backend/tests/test_packaging_service.py +382 -0
- backend/tests/test_requests.py +201 -0
- backend/tests/test_routes_jobs.py +282 -0
- backend/tests/test_routes_review.py +337 -0
- backend/tests/test_services.py +556 -0
- backend/tests/test_services_extended.py +112 -0
- backend/tests/test_storage_service.py +448 -0
- backend/tests/test_style_upload.py +261 -0
- backend/tests/test_template_service.py +295 -0
- backend/tests/test_theme_service.py +516 -0
- backend/tests/test_unicode_sanitization.py +522 -0
- backend/tests/test_upload_api.py +256 -0
- backend/tests/test_validate.py +156 -0
- backend/tests/test_video_worker_orchestrator.py +847 -0
- backend/tests/test_worker_log_subcollection.py +509 -0
- backend/tests/test_worker_logging.py +365 -0
- backend/tests/test_workers.py +1116 -0
- backend/tests/test_workers_extended.py +178 -0
- backend/tests/test_youtube_service.py +247 -0
- backend/tests/test_youtube_upload_service.py +568 -0
- backend/validate.py +173 -0
- backend/version.py +27 -0
- backend/workers/README.md +597 -0
- backend/workers/__init__.py +11 -0
- backend/workers/audio_worker.py +618 -0
- backend/workers/lyrics_worker.py +683 -0
- backend/workers/render_video_worker.py +483 -0
- backend/workers/screens_worker.py +525 -0
- backend/workers/style_helper.py +198 -0
- backend/workers/video_worker.py +1277 -0
- backend/workers/video_worker_orchestrator.py +701 -0
- backend/workers/worker_logging.py +278 -0
- karaoke_gen/instrumental_review/static/index.html +7 -4
- karaoke_gen/karaoke_finalise/karaoke_finalise.py +6 -1
- karaoke_gen/style_loader.py +3 -1
- karaoke_gen/utils/__init__.py +163 -8
- karaoke_gen/video_background_processor.py +9 -4
- {karaoke_gen-0.86.7.dist-info → karaoke_gen-0.96.0.dist-info}/METADATA +2 -1
- {karaoke_gen-0.86.7.dist-info → karaoke_gen-0.96.0.dist-info}/RECORD +187 -42
- lyrics_transcriber/correction/agentic/providers/config.py +9 -5
- lyrics_transcriber/correction/agentic/providers/langchain_bridge.py +1 -51
- lyrics_transcriber/correction/corrector.py +192 -130
- lyrics_transcriber/correction/operations.py +24 -9
- lyrics_transcriber/frontend/package-lock.json +2 -2
- lyrics_transcriber/frontend/package.json +1 -1
- lyrics_transcriber/frontend/src/components/AIFeedbackModal.tsx +1 -1
- lyrics_transcriber/frontend/src/components/CorrectedWordWithActions.tsx +11 -7
- lyrics_transcriber/frontend/src/components/EditActionBar.tsx +31 -5
- lyrics_transcriber/frontend/src/components/EditModal.tsx +28 -10
- lyrics_transcriber/frontend/src/components/EditTimelineSection.tsx +123 -27
- lyrics_transcriber/frontend/src/components/EditWordList.tsx +112 -60
- lyrics_transcriber/frontend/src/components/Header.tsx +90 -76
- lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx +53 -31
- lyrics_transcriber/frontend/src/components/LyricsSynchronizer/SyncControls.tsx +44 -13
- lyrics_transcriber/frontend/src/components/LyricsSynchronizer/TimelineCanvas.tsx +66 -50
- lyrics_transcriber/frontend/src/components/LyricsSynchronizer/index.tsx +124 -30
- lyrics_transcriber/frontend/src/components/ReferenceView.tsx +1 -1
- lyrics_transcriber/frontend/src/components/TimelineEditor.tsx +12 -5
- lyrics_transcriber/frontend/src/components/TimingOffsetModal.tsx +3 -3
- lyrics_transcriber/frontend/src/components/TranscriptionView.tsx +1 -1
- lyrics_transcriber/frontend/src/components/WordDivider.tsx +11 -7
- lyrics_transcriber/frontend/src/components/shared/components/Word.tsx +4 -2
- lyrics_transcriber/frontend/src/hooks/useManualSync.ts +103 -1
- lyrics_transcriber/frontend/src/theme.ts +42 -15
- lyrics_transcriber/frontend/tsconfig.tsbuildinfo +1 -1
- lyrics_transcriber/frontend/vite.config.js +5 -0
- lyrics_transcriber/frontend/web_assets/assets/{index-BECn1o8Q.js → index-BSMgOq4Z.js} +6959 -5782
- lyrics_transcriber/frontend/web_assets/assets/index-BSMgOq4Z.js.map +1 -0
- lyrics_transcriber/frontend/web_assets/index.html +6 -2
- lyrics_transcriber/frontend/web_assets/nomad-karaoke-logo.svg +5 -0
- lyrics_transcriber/output/generator.py +17 -3
- lyrics_transcriber/output/video.py +60 -95
- lyrics_transcriber/frontend/web_assets/assets/index-BECn1o8Q.js.map +0 -1
- {karaoke_gen-0.86.7.dist-info → karaoke_gen-0.96.0.dist-info}/WHEEL +0 -0
- {karaoke_gen-0.86.7.dist-info → karaoke_gen-0.96.0.dist-info}/entry_points.txt +0 -0
- {karaoke_gen-0.86.7.dist-info → karaoke_gen-0.96.0.dist-info}/licenses/LICENSE +0 -0
backend/validate.py
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Quick validation script to catch common issues before deployment.
|
|
4
|
+
|
|
5
|
+
Run this before deploying to catch:
|
|
6
|
+
- Import errors
|
|
7
|
+
- Syntax errors
|
|
8
|
+
- Missing dependencies
|
|
9
|
+
- Configuration issues
|
|
10
|
+
"""
|
|
11
|
+
import sys
|
|
12
|
+
import importlib
|
|
13
|
+
import traceback
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
# Add project root to Python path
|
|
17
|
+
project_root = Path(__file__).parent.parent
|
|
18
|
+
sys.path.insert(0, str(project_root))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def validate_imports():
|
|
22
|
+
"""Test that all modules can be imported."""
|
|
23
|
+
print("🔍 Validating imports...")
|
|
24
|
+
|
|
25
|
+
modules_to_test = [
|
|
26
|
+
"backend.main",
|
|
27
|
+
"backend.config",
|
|
28
|
+
"backend.api.routes.health",
|
|
29
|
+
"backend.api.routes.jobs",
|
|
30
|
+
"backend.api.routes.internal",
|
|
31
|
+
"backend.api.routes.file_upload",
|
|
32
|
+
"backend.api.dependencies",
|
|
33
|
+
"backend.services.job_manager",
|
|
34
|
+
"backend.services.storage_service",
|
|
35
|
+
"backend.services.firestore_service",
|
|
36
|
+
"backend.services.worker_service",
|
|
37
|
+
"backend.services.auth_service",
|
|
38
|
+
"backend.workers.audio_worker",
|
|
39
|
+
"backend.workers.lyrics_worker",
|
|
40
|
+
"backend.workers.screens_worker",
|
|
41
|
+
"backend.workers.video_worker",
|
|
42
|
+
"backend.models.job",
|
|
43
|
+
"backend.models.requests",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
failed = []
|
|
47
|
+
|
|
48
|
+
for module_name in modules_to_test:
|
|
49
|
+
try:
|
|
50
|
+
importlib.import_module(module_name)
|
|
51
|
+
print(f" ✅ {module_name}")
|
|
52
|
+
except Exception as e:
|
|
53
|
+
print(f" ❌ {module_name}: {e}")
|
|
54
|
+
failed.append((module_name, e))
|
|
55
|
+
|
|
56
|
+
if failed:
|
|
57
|
+
print(f"\n❌ {len(failed)} modules failed to import:")
|
|
58
|
+
for module_name, error in failed:
|
|
59
|
+
print(f"\n {module_name}:")
|
|
60
|
+
print(f" {error}")
|
|
61
|
+
return False
|
|
62
|
+
|
|
63
|
+
print(f"\n✅ All {len(modules_to_test)} modules imported successfully")
|
|
64
|
+
return True
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def validate_syntax():
|
|
68
|
+
"""Check for syntax errors in all Python files."""
|
|
69
|
+
print("\n🔍 Checking Python syntax...")
|
|
70
|
+
|
|
71
|
+
backend_dir = Path(__file__).parent
|
|
72
|
+
python_files = list(backend_dir.rglob("*.py"))
|
|
73
|
+
|
|
74
|
+
failed = []
|
|
75
|
+
|
|
76
|
+
for py_file in python_files:
|
|
77
|
+
# Skip cache and venv directories
|
|
78
|
+
if any(skip in str(py_file) for skip in ["__pycache__", "venv/", ".venv/"]):
|
|
79
|
+
continue
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
with open(py_file, 'r') as f:
|
|
83
|
+
compile(f.read(), str(py_file), 'exec')
|
|
84
|
+
except SyntaxError as e:
|
|
85
|
+
failed.append((py_file, e))
|
|
86
|
+
print(f" ❌ {py_file.relative_to(backend_dir)}: {e}")
|
|
87
|
+
|
|
88
|
+
if not failed:
|
|
89
|
+
print(f" ✅ All {len(python_files)} Python files have valid syntax")
|
|
90
|
+
return True
|
|
91
|
+
|
|
92
|
+
print(f"\n❌ {len(failed)} files have syntax errors")
|
|
93
|
+
return False
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def validate_config():
|
|
97
|
+
"""Check that configuration can be loaded."""
|
|
98
|
+
print("\n🔍 Validating configuration...")
|
|
99
|
+
|
|
100
|
+
try:
|
|
101
|
+
from backend.config import get_settings
|
|
102
|
+
settings = get_settings()
|
|
103
|
+
print(f" ✅ Configuration loaded")
|
|
104
|
+
print(f" Environment: {settings.environment}")
|
|
105
|
+
print(f" Project: {settings.google_cloud_project or 'Not set (OK for local)'}")
|
|
106
|
+
return True
|
|
107
|
+
except Exception as e:
|
|
108
|
+
print(f" ❌ Configuration failed: {e}")
|
|
109
|
+
traceback.print_exc()
|
|
110
|
+
return False
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def validate_fastapi_app():
|
|
114
|
+
"""Check that FastAPI app can be created."""
|
|
115
|
+
print("\n🔍 Validating FastAPI application...")
|
|
116
|
+
|
|
117
|
+
try:
|
|
118
|
+
from backend.main import app
|
|
119
|
+
print(f" ✅ FastAPI app created successfully")
|
|
120
|
+
print(f" Title: {app.title}")
|
|
121
|
+
print(f" Version: {app.version}")
|
|
122
|
+
|
|
123
|
+
# List routes
|
|
124
|
+
routes = []
|
|
125
|
+
for route in app.routes:
|
|
126
|
+
if hasattr(route, 'methods') and hasattr(route, 'path'):
|
|
127
|
+
for method in route.methods:
|
|
128
|
+
routes.append(f"{method:6s} {route.path}")
|
|
129
|
+
|
|
130
|
+
print(f" Routes: {len(routes)} endpoints")
|
|
131
|
+
return True
|
|
132
|
+
except Exception as e:
|
|
133
|
+
print(f" ❌ FastAPI app creation failed: {e}")
|
|
134
|
+
traceback.print_exc()
|
|
135
|
+
return False
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def main():
|
|
139
|
+
"""Run all validations."""
|
|
140
|
+
print("=" * 60)
|
|
141
|
+
print("Backend Validation")
|
|
142
|
+
print("=" * 60)
|
|
143
|
+
|
|
144
|
+
results = []
|
|
145
|
+
|
|
146
|
+
# Run validations
|
|
147
|
+
results.append(("Syntax Check", validate_syntax()))
|
|
148
|
+
results.append(("Import Check", validate_imports()))
|
|
149
|
+
results.append(("Config Check", validate_config()))
|
|
150
|
+
results.append(("FastAPI Check", validate_fastapi_app()))
|
|
151
|
+
|
|
152
|
+
# Summary
|
|
153
|
+
print("\n" + "=" * 60)
|
|
154
|
+
print("Summary")
|
|
155
|
+
print("=" * 60)
|
|
156
|
+
|
|
157
|
+
for name, passed in results:
|
|
158
|
+
status = "✅ PASS" if passed else "❌ FAIL"
|
|
159
|
+
print(f"{status:8s} {name}")
|
|
160
|
+
|
|
161
|
+
all_passed = all(passed for _, passed in results)
|
|
162
|
+
|
|
163
|
+
if all_passed:
|
|
164
|
+
print("\n🎉 All validations passed! Safe to deploy.")
|
|
165
|
+
return 0
|
|
166
|
+
else:
|
|
167
|
+
print("\n❌ Some validations failed. Fix issues before deploying.")
|
|
168
|
+
return 1
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
if __name__ == "__main__":
|
|
172
|
+
sys.exit(main())
|
|
173
|
+
|
backend/version.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Version module for karaoke-gen backend.
|
|
3
|
+
|
|
4
|
+
Separated to avoid circular imports.
|
|
5
|
+
"""
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_version() -> str:
|
|
10
|
+
"""Get package version from environment variable, installed package, or fallback."""
|
|
11
|
+
# First check environment variable (set during deployment)
|
|
12
|
+
env_version = os.environ.get("KARAOKE_GEN_VERSION")
|
|
13
|
+
if env_version:
|
|
14
|
+
return env_version
|
|
15
|
+
|
|
16
|
+
# Try to get from installed package metadata
|
|
17
|
+
try:
|
|
18
|
+
from importlib.metadata import version
|
|
19
|
+
return version("karaoke-gen")
|
|
20
|
+
except Exception:
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
# Fallback if package not installed (e.g., during development)
|
|
24
|
+
return "dev"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
VERSION = get_version()
|