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.
- 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 +835 -0
- backend/api/routes/audio_search.py +913 -0
- backend/api/routes/auth.py +348 -0
- backend/api/routes/file_upload.py +2112 -0
- backend/api/routes/health.py +409 -0
- backend/api/routes/internal.py +435 -0
- backend/api/routes/jobs.py +1629 -0
- backend/api/routes/review.py +652 -0
- backend/api/routes/themes.py +162 -0
- backend/api/routes/users.py +1513 -0
- backend/config.py +172 -0
- backend/main.py +157 -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 +502 -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 +853 -0
- backend/services/job_notification_service.py +271 -0
- backend/services/langfuse_preloader.py +98 -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/nltk_preloader.py +122 -0
- backend/services/packaging_service.py +287 -0
- backend/services/rclone_service.py +106 -0
- backend/services/spacy_preloader.py +65 -0
- backend/services/storage_service.py +209 -0
- backend/services/stripe_service.py +371 -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 +109 -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 +356 -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 +283 -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_spacy_preloader.py +119 -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/utils/test_data.py +27 -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 +535 -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/utils/__init__.py +163 -8
- karaoke_gen/video_background_processor.py +9 -4
- {karaoke_gen-0.90.1.dist-info → karaoke_gen-0.99.3.dist-info}/METADATA +1 -1
- {karaoke_gen-0.90.1.dist-info → karaoke_gen-0.99.3.dist-info}/RECORD +196 -46
- lyrics_transcriber/correction/agentic/agent.py +17 -6
- lyrics_transcriber/correction/agentic/providers/config.py +9 -5
- lyrics_transcriber/correction/agentic/providers/langchain_bridge.py +96 -93
- lyrics_transcriber/correction/agentic/providers/model_factory.py +27 -6
- lyrics_transcriber/correction/anchor_sequence.py +151 -37
- lyrics_transcriber/correction/corrector.py +192 -130
- lyrics_transcriber/correction/handlers/syllables_match.py +44 -2
- lyrics_transcriber/correction/operations.py +24 -9
- lyrics_transcriber/correction/phrase_analyzer.py +18 -0
- 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.90.1.dist-info → karaoke_gen-0.99.3.dist-info}/WHEEL +0 -0
- {karaoke_gen-0.90.1.dist-info → karaoke_gen-0.99.3.dist-info}/entry_points.txt +0 -0
- {karaoke_gen-0.90.1.dist-info → karaoke_gen-0.99.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Fixtures for emulator integration tests.
|
|
3
|
+
|
|
4
|
+
These tests use REAL Firestore and GCS emulators, so we DON'T mock google.cloud modules.
|
|
5
|
+
Run with: scripts/run-emulator-tests.sh
|
|
6
|
+
"""
|
|
7
|
+
import pytest
|
|
8
|
+
import os
|
|
9
|
+
import requests
|
|
10
|
+
from unittest.mock import AsyncMock, patch
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def emulators_running() -> bool:
|
|
14
|
+
"""Check if GCP emulators are running."""
|
|
15
|
+
try:
|
|
16
|
+
# Check Firestore emulator
|
|
17
|
+
requests.get("http://127.0.0.1:8080", timeout=1)
|
|
18
|
+
# Check GCS emulator
|
|
19
|
+
requests.get("http://127.0.0.1:4443", timeout=1)
|
|
20
|
+
return True
|
|
21
|
+
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
|
|
22
|
+
return False
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# Skip all tests in this module if emulators aren't running
|
|
26
|
+
pytestmark = pytest.mark.skipif(
|
|
27
|
+
not emulators_running(),
|
|
28
|
+
reason="GCP emulators not running. Start with: scripts/start-emulators.sh"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# Set emulator environment variables (use 127.0.0.1 to force IPv4)
|
|
32
|
+
os.environ["FIRESTORE_EMULATOR_HOST"] = "127.0.0.1:8080"
|
|
33
|
+
os.environ["STORAGE_EMULATOR_HOST"] = "http://127.0.0.1:4443"
|
|
34
|
+
os.environ["GOOGLE_CLOUD_PROJECT"] = "test-project"
|
|
35
|
+
os.environ["GCS_BUCKET_NAME"] = "test-bucket"
|
|
36
|
+
os.environ["FIRESTORE_COLLECTION"] = "test-jobs"
|
|
37
|
+
os.environ["ENVIRONMENT"] = "test"
|
|
38
|
+
os.environ["ADMIN_TOKENS"] = "test-admin-token"
|
|
39
|
+
|
|
40
|
+
# Only import app if emulators are running
|
|
41
|
+
if emulators_running():
|
|
42
|
+
from unittest.mock import Mock
|
|
43
|
+
|
|
44
|
+
# Mock theme service BEFORE importing app to ensure all jobs get theme_id="nomad"
|
|
45
|
+
_mock_theme_service = Mock()
|
|
46
|
+
_mock_theme_service.get_default_theme_id.return_value = "nomad"
|
|
47
|
+
_mock_theme_service.get_theme.return_value = None
|
|
48
|
+
|
|
49
|
+
# Apply patch at module load time (before app imports the service)
|
|
50
|
+
_theme_patches = [
|
|
51
|
+
patch("backend.services.theme_service.get_theme_service", return_value=_mock_theme_service),
|
|
52
|
+
patch("backend.api.routes.audio_search.get_theme_service", return_value=_mock_theme_service),
|
|
53
|
+
patch("backend.api.routes.file_upload.get_theme_service", return_value=_mock_theme_service),
|
|
54
|
+
patch("backend.api.routes.users.get_theme_service", return_value=_mock_theme_service),
|
|
55
|
+
patch("backend.api.routes.jobs.get_theme_service", return_value=_mock_theme_service),
|
|
56
|
+
]
|
|
57
|
+
for p in _theme_patches:
|
|
58
|
+
p.start()
|
|
59
|
+
|
|
60
|
+
from fastapi.testclient import TestClient
|
|
61
|
+
from backend.main import app
|
|
62
|
+
else:
|
|
63
|
+
TestClient = None
|
|
64
|
+
app = None
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@pytest.fixture(scope="session", autouse=True)
|
|
68
|
+
def setup_gcs_bucket():
|
|
69
|
+
"""Create GCS bucket in emulator before all tests."""
|
|
70
|
+
try:
|
|
71
|
+
response = requests.post(
|
|
72
|
+
"http://127.0.0.1:4443/storage/v1/b",
|
|
73
|
+
json={"name": "test-bucket"},
|
|
74
|
+
params={"project": "test-project"},
|
|
75
|
+
timeout=5
|
|
76
|
+
)
|
|
77
|
+
if response.status_code in [200, 409]:
|
|
78
|
+
print("✅ GCS bucket 'test-bucket' ready in emulator")
|
|
79
|
+
except Exception as e:
|
|
80
|
+
print(f"⚠️ GCS bucket setup failed: {e}")
|
|
81
|
+
yield
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@pytest.fixture(scope="session")
|
|
85
|
+
def mock_worker_service():
|
|
86
|
+
"""Mock worker service to prevent background tasks."""
|
|
87
|
+
with patch("backend.api.routes.jobs.worker_service") as mock:
|
|
88
|
+
mock.trigger_audio_worker = AsyncMock(return_value=True)
|
|
89
|
+
mock.trigger_lyrics_worker = AsyncMock(return_value=True)
|
|
90
|
+
mock.trigger_screens_worker = AsyncMock(return_value=True)
|
|
91
|
+
mock.trigger_video_worker = AsyncMock(return_value=True)
|
|
92
|
+
yield mock
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@pytest.fixture(scope="session")
|
|
96
|
+
def client(mock_worker_service):
|
|
97
|
+
"""Create FastAPI test client with mocked workers.
|
|
98
|
+
|
|
99
|
+
Theme service is mocked at module load time (see above).
|
|
100
|
+
"""
|
|
101
|
+
with patch("backend.api.routes.file_upload.worker_service", mock_worker_service):
|
|
102
|
+
return TestClient(app)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@pytest.fixture
|
|
106
|
+
def auth_headers():
|
|
107
|
+
"""Auth headers for testing."""
|
|
108
|
+
return {"Authorization": "Bearer test-admin-token"}
|
|
109
|
+
|