karaoke-gen 0.90.1__py3-none-any.whl → 0.99.3__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.
Files changed (197) hide show
  1. backend/.coveragerc +20 -0
  2. backend/.gitignore +37 -0
  3. backend/Dockerfile +43 -0
  4. backend/Dockerfile.base +74 -0
  5. backend/README.md +242 -0
  6. backend/__init__.py +0 -0
  7. backend/api/__init__.py +0 -0
  8. backend/api/dependencies.py +457 -0
  9. backend/api/routes/__init__.py +0 -0
  10. backend/api/routes/admin.py +835 -0
  11. backend/api/routes/audio_search.py +913 -0
  12. backend/api/routes/auth.py +348 -0
  13. backend/api/routes/file_upload.py +2112 -0
  14. backend/api/routes/health.py +409 -0
  15. backend/api/routes/internal.py +435 -0
  16. backend/api/routes/jobs.py +1629 -0
  17. backend/api/routes/review.py +652 -0
  18. backend/api/routes/themes.py +162 -0
  19. backend/api/routes/users.py +1513 -0
  20. backend/config.py +172 -0
  21. backend/main.py +157 -0
  22. backend/middleware/__init__.py +5 -0
  23. backend/middleware/audit_logging.py +124 -0
  24. backend/models/__init__.py +0 -0
  25. backend/models/job.py +519 -0
  26. backend/models/requests.py +123 -0
  27. backend/models/theme.py +153 -0
  28. backend/models/user.py +254 -0
  29. backend/models/worker_log.py +164 -0
  30. backend/pyproject.toml +29 -0
  31. backend/quick-check.sh +93 -0
  32. backend/requirements.txt +29 -0
  33. backend/run_tests.sh +60 -0
  34. backend/services/__init__.py +0 -0
  35. backend/services/audio_analysis_service.py +243 -0
  36. backend/services/audio_editing_service.py +278 -0
  37. backend/services/audio_search_service.py +702 -0
  38. backend/services/auth_service.py +630 -0
  39. backend/services/credential_manager.py +792 -0
  40. backend/services/discord_service.py +172 -0
  41. backend/services/dropbox_service.py +301 -0
  42. backend/services/email_service.py +1093 -0
  43. backend/services/encoding_interface.py +454 -0
  44. backend/services/encoding_service.py +502 -0
  45. backend/services/firestore_service.py +512 -0
  46. backend/services/flacfetch_client.py +573 -0
  47. backend/services/gce_encoding/README.md +72 -0
  48. backend/services/gce_encoding/__init__.py +22 -0
  49. backend/services/gce_encoding/main.py +589 -0
  50. backend/services/gce_encoding/requirements.txt +16 -0
  51. backend/services/gdrive_service.py +356 -0
  52. backend/services/job_logging.py +258 -0
  53. backend/services/job_manager.py +853 -0
  54. backend/services/job_notification_service.py +271 -0
  55. backend/services/langfuse_preloader.py +98 -0
  56. backend/services/local_encoding_service.py +590 -0
  57. backend/services/local_preview_encoding_service.py +407 -0
  58. backend/services/lyrics_cache_service.py +216 -0
  59. backend/services/metrics.py +413 -0
  60. backend/services/nltk_preloader.py +122 -0
  61. backend/services/packaging_service.py +287 -0
  62. backend/services/rclone_service.py +106 -0
  63. backend/services/spacy_preloader.py +65 -0
  64. backend/services/storage_service.py +209 -0
  65. backend/services/stripe_service.py +371 -0
  66. backend/services/structured_logging.py +254 -0
  67. backend/services/template_service.py +330 -0
  68. backend/services/theme_service.py +469 -0
  69. backend/services/tracing.py +543 -0
  70. backend/services/user_service.py +721 -0
  71. backend/services/worker_service.py +558 -0
  72. backend/services/youtube_service.py +112 -0
  73. backend/services/youtube_upload_service.py +445 -0
  74. backend/tests/__init__.py +4 -0
  75. backend/tests/conftest.py +224 -0
  76. backend/tests/emulator/__init__.py +7 -0
  77. backend/tests/emulator/conftest.py +109 -0
  78. backend/tests/emulator/test_e2e_cli_backend.py +1053 -0
  79. backend/tests/emulator/test_emulator_integration.py +356 -0
  80. backend/tests/emulator/test_style_loading_direct.py +436 -0
  81. backend/tests/emulator/test_worker_logs_direct.py +229 -0
  82. backend/tests/emulator/test_worker_logs_subcollection.py +443 -0
  83. backend/tests/requirements-test.txt +10 -0
  84. backend/tests/requirements.txt +6 -0
  85. backend/tests/test_admin_email_endpoints.py +411 -0
  86. backend/tests/test_api_integration.py +460 -0
  87. backend/tests/test_api_routes.py +93 -0
  88. backend/tests/test_audio_analysis_service.py +294 -0
  89. backend/tests/test_audio_editing_service.py +386 -0
  90. backend/tests/test_audio_search.py +1398 -0
  91. backend/tests/test_audio_services.py +378 -0
  92. backend/tests/test_auth_firestore.py +231 -0
  93. backend/tests/test_config_extended.py +68 -0
  94. backend/tests/test_credential_manager.py +377 -0
  95. backend/tests/test_dependencies.py +54 -0
  96. backend/tests/test_discord_service.py +244 -0
  97. backend/tests/test_distribution_services.py +820 -0
  98. backend/tests/test_dropbox_service.py +472 -0
  99. backend/tests/test_email_service.py +492 -0
  100. backend/tests/test_emulator_integration.py +322 -0
  101. backend/tests/test_encoding_interface.py +412 -0
  102. backend/tests/test_file_upload.py +1739 -0
  103. backend/tests/test_flacfetch_client.py +632 -0
  104. backend/tests/test_gdrive_service.py +524 -0
  105. backend/tests/test_instrumental_api.py +431 -0
  106. backend/tests/test_internal_api.py +343 -0
  107. backend/tests/test_job_creation_regression.py +583 -0
  108. backend/tests/test_job_manager.py +356 -0
  109. backend/tests/test_job_manager_notifications.py +329 -0
  110. backend/tests/test_job_notification_service.py +443 -0
  111. backend/tests/test_jobs_api.py +283 -0
  112. backend/tests/test_local_encoding_service.py +423 -0
  113. backend/tests/test_local_preview_encoding_service.py +567 -0
  114. backend/tests/test_main.py +87 -0
  115. backend/tests/test_models.py +918 -0
  116. backend/tests/test_packaging_service.py +382 -0
  117. backend/tests/test_requests.py +201 -0
  118. backend/tests/test_routes_jobs.py +282 -0
  119. backend/tests/test_routes_review.py +337 -0
  120. backend/tests/test_services.py +556 -0
  121. backend/tests/test_services_extended.py +112 -0
  122. backend/tests/test_spacy_preloader.py +119 -0
  123. backend/tests/test_storage_service.py +448 -0
  124. backend/tests/test_style_upload.py +261 -0
  125. backend/tests/test_template_service.py +295 -0
  126. backend/tests/test_theme_service.py +516 -0
  127. backend/tests/test_unicode_sanitization.py +522 -0
  128. backend/tests/test_upload_api.py +256 -0
  129. backend/tests/test_validate.py +156 -0
  130. backend/tests/test_video_worker_orchestrator.py +847 -0
  131. backend/tests/test_worker_log_subcollection.py +509 -0
  132. backend/tests/test_worker_logging.py +365 -0
  133. backend/tests/test_workers.py +1116 -0
  134. backend/tests/test_workers_extended.py +178 -0
  135. backend/tests/test_youtube_service.py +247 -0
  136. backend/tests/test_youtube_upload_service.py +568 -0
  137. backend/utils/test_data.py +27 -0
  138. backend/validate.py +173 -0
  139. backend/version.py +27 -0
  140. backend/workers/README.md +597 -0
  141. backend/workers/__init__.py +11 -0
  142. backend/workers/audio_worker.py +618 -0
  143. backend/workers/lyrics_worker.py +683 -0
  144. backend/workers/render_video_worker.py +483 -0
  145. backend/workers/screens_worker.py +535 -0
  146. backend/workers/style_helper.py +198 -0
  147. backend/workers/video_worker.py +1277 -0
  148. backend/workers/video_worker_orchestrator.py +701 -0
  149. backend/workers/worker_logging.py +278 -0
  150. karaoke_gen/instrumental_review/static/index.html +7 -4
  151. karaoke_gen/karaoke_finalise/karaoke_finalise.py +6 -1
  152. karaoke_gen/utils/__init__.py +163 -8
  153. karaoke_gen/video_background_processor.py +9 -4
  154. {karaoke_gen-0.90.1.dist-info → karaoke_gen-0.99.3.dist-info}/METADATA +1 -1
  155. {karaoke_gen-0.90.1.dist-info → karaoke_gen-0.99.3.dist-info}/RECORD +196 -46
  156. lyrics_transcriber/correction/agentic/agent.py +17 -6
  157. lyrics_transcriber/correction/agentic/providers/config.py +9 -5
  158. lyrics_transcriber/correction/agentic/providers/langchain_bridge.py +96 -93
  159. lyrics_transcriber/correction/agentic/providers/model_factory.py +27 -6
  160. lyrics_transcriber/correction/anchor_sequence.py +151 -37
  161. lyrics_transcriber/correction/corrector.py +192 -130
  162. lyrics_transcriber/correction/handlers/syllables_match.py +44 -2
  163. lyrics_transcriber/correction/operations.py +24 -9
  164. lyrics_transcriber/correction/phrase_analyzer.py +18 -0
  165. lyrics_transcriber/frontend/package-lock.json +2 -2
  166. lyrics_transcriber/frontend/package.json +1 -1
  167. lyrics_transcriber/frontend/src/components/AIFeedbackModal.tsx +1 -1
  168. lyrics_transcriber/frontend/src/components/CorrectedWordWithActions.tsx +11 -7
  169. lyrics_transcriber/frontend/src/components/EditActionBar.tsx +31 -5
  170. lyrics_transcriber/frontend/src/components/EditModal.tsx +28 -10
  171. lyrics_transcriber/frontend/src/components/EditTimelineSection.tsx +123 -27
  172. lyrics_transcriber/frontend/src/components/EditWordList.tsx +112 -60
  173. lyrics_transcriber/frontend/src/components/Header.tsx +90 -76
  174. lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx +53 -31
  175. lyrics_transcriber/frontend/src/components/LyricsSynchronizer/SyncControls.tsx +44 -13
  176. lyrics_transcriber/frontend/src/components/LyricsSynchronizer/TimelineCanvas.tsx +66 -50
  177. lyrics_transcriber/frontend/src/components/LyricsSynchronizer/index.tsx +124 -30
  178. lyrics_transcriber/frontend/src/components/ReferenceView.tsx +1 -1
  179. lyrics_transcriber/frontend/src/components/TimelineEditor.tsx +12 -5
  180. lyrics_transcriber/frontend/src/components/TimingOffsetModal.tsx +3 -3
  181. lyrics_transcriber/frontend/src/components/TranscriptionView.tsx +1 -1
  182. lyrics_transcriber/frontend/src/components/WordDivider.tsx +11 -7
  183. lyrics_transcriber/frontend/src/components/shared/components/Word.tsx +4 -2
  184. lyrics_transcriber/frontend/src/hooks/useManualSync.ts +103 -1
  185. lyrics_transcriber/frontend/src/theme.ts +42 -15
  186. lyrics_transcriber/frontend/tsconfig.tsbuildinfo +1 -1
  187. lyrics_transcriber/frontend/vite.config.js +5 -0
  188. lyrics_transcriber/frontend/web_assets/assets/{index-BECn1o8Q.js → index-BSMgOq4Z.js} +6959 -5782
  189. lyrics_transcriber/frontend/web_assets/assets/index-BSMgOq4Z.js.map +1 -0
  190. lyrics_transcriber/frontend/web_assets/index.html +6 -2
  191. lyrics_transcriber/frontend/web_assets/nomad-karaoke-logo.svg +5 -0
  192. lyrics_transcriber/output/generator.py +17 -3
  193. lyrics_transcriber/output/video.py +60 -95
  194. lyrics_transcriber/frontend/web_assets/assets/index-BECn1o8Q.js.map +0 -1
  195. {karaoke_gen-0.90.1.dist-info → karaoke_gen-0.99.3.dist-info}/WHEEL +0 -0
  196. {karaoke_gen-0.90.1.dist-info → karaoke_gen-0.99.3.dist-info}/entry_points.txt +0 -0
  197. {karaoke_gen-0.90.1.dist-info → karaoke_gen-0.99.3.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()