karaoke-gen 0.101.0__py3-none-any.whl → 0.105.4__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 (41) hide show
  1. backend/Dockerfile.base +1 -0
  2. backend/api/routes/admin.py +226 -3
  3. backend/api/routes/audio_search.py +4 -32
  4. backend/api/routes/file_upload.py +18 -83
  5. backend/api/routes/jobs.py +2 -2
  6. backend/api/routes/push.py +238 -0
  7. backend/api/routes/rate_limits.py +428 -0
  8. backend/api/routes/users.py +79 -19
  9. backend/config.py +25 -1
  10. backend/exceptions.py +66 -0
  11. backend/main.py +26 -1
  12. backend/models/job.py +4 -0
  13. backend/models/user.py +20 -2
  14. backend/services/email_validation_service.py +646 -0
  15. backend/services/firestore_service.py +21 -0
  16. backend/services/gce_encoding/main.py +22 -8
  17. backend/services/job_defaults_service.py +113 -0
  18. backend/services/job_manager.py +109 -13
  19. backend/services/push_notification_service.py +409 -0
  20. backend/services/rate_limit_service.py +641 -0
  21. backend/services/stripe_service.py +2 -2
  22. backend/tests/conftest.py +8 -1
  23. backend/tests/test_admin_delete_outputs.py +352 -0
  24. backend/tests/test_audio_search.py +12 -8
  25. backend/tests/test_email_validation_service.py +298 -0
  26. backend/tests/test_file_upload.py +8 -6
  27. backend/tests/test_gce_encoding_worker.py +229 -0
  28. backend/tests/test_impersonation.py +18 -3
  29. backend/tests/test_made_for_you.py +6 -4
  30. backend/tests/test_push_notification_service.py +460 -0
  31. backend/tests/test_push_routes.py +357 -0
  32. backend/tests/test_rate_limit_service.py +396 -0
  33. backend/tests/test_rate_limits_api.py +392 -0
  34. backend/tests/test_stripe_service.py +205 -0
  35. backend/workers/video_worker_orchestrator.py +42 -0
  36. karaoke_gen/instrumental_review/static/index.html +35 -9
  37. {karaoke_gen-0.101.0.dist-info → karaoke_gen-0.105.4.dist-info}/METADATA +2 -1
  38. {karaoke_gen-0.101.0.dist-info → karaoke_gen-0.105.4.dist-info}/RECORD +41 -26
  39. {karaoke_gen-0.101.0.dist-info → karaoke_gen-0.105.4.dist-info}/WHEEL +0 -0
  40. {karaoke_gen-0.101.0.dist-info → karaoke_gen-0.105.4.dist-info}/entry_points.txt +0 -0
  41. {karaoke_gen-0.101.0.dist-info → karaoke_gen-0.105.4.dist-info}/licenses/LICENSE +0 -0
@@ -750,18 +750,44 @@
750
750
  const urlParams = new URLSearchParams(window.location.search);
751
751
  const encodedBaseApiUrl = urlParams.get('baseApiUrl');
752
752
  const instrumentalToken = urlParams.get('instrumentalToken');
753
-
753
+
754
+ // Check localStorage for full auth token (logged-in users)
755
+ // This takes priority over instrumentalToken which can expire
756
+ const fullAuthToken = localStorage.getItem('karaoke_access_token');
757
+
754
758
  // Determine API base URL - cloud mode uses provided URL, local mode uses default
755
- const API_BASE = encodedBaseApiUrl
759
+ const API_BASE = encodedBaseApiUrl
756
760
  ? decodeURIComponent(encodedBaseApiUrl)
757
761
  : '/api/jobs/local';
758
-
759
- // Helper to add token to URL if available
762
+
763
+ // Helper to add auth token to URL
764
+ // Priority: fullAuthToken (doesn't expire) > instrumentalToken (expires after 48h)
765
+ // This is essential for audio elements which can't use Bearer headers
760
766
  function addTokenToUrl(url) {
767
+ // Prefer full auth token - it doesn't have the short expiry that magic link tokens have
768
+ if (fullAuthToken) {
769
+ const separator = url.includes('?') ? '&' : '?';
770
+ return `${url}${separator}token=${encodeURIComponent(fullAuthToken)}`;
771
+ }
772
+ // Fall back to instrumental token for non-logged-in users
761
773
  if (!instrumentalToken) return url;
762
774
  const separator = url.includes('?') ? '&' : '?';
763
775
  return `${url}${separator}instrumental_token=${encodeURIComponent(instrumentalToken)}`;
764
776
  }
777
+
778
+ // Auth-aware fetch helper
779
+ // Priority: fullAuthToken (Bearer header) > instrumentalToken (query param)
780
+ function authFetch(url, options = {}) {
781
+ if (fullAuthToken) {
782
+ // Use Bearer auth for logged-in users
783
+ const headers = new Headers(options.headers || {});
784
+ headers.set('Authorization', `Bearer ${fullAuthToken}`);
785
+ return fetch(url, { ...options, headers });
786
+ } else {
787
+ // Fall back to instrumental token in URL
788
+ return fetch(addTokenToUrl(url), options);
789
+ }
790
+ }
765
791
 
766
792
  // HTML escape helper to prevent XSS
767
793
  function escapeHtml(str) {
@@ -780,8 +806,8 @@
780
806
  async function init() {
781
807
  try {
782
808
  const [analysisRes, waveformRes] = await Promise.all([
783
- fetch(addTokenToUrl(`${API_BASE}/instrumental-analysis`)),
784
- fetch(addTokenToUrl(`${API_BASE}/waveform-data?num_points=1000`))
809
+ authFetch(`${API_BASE}/instrumental-analysis`),
810
+ authFetch(`${API_BASE}/waveform-data?num_points=1000`)
785
811
  ]);
786
812
 
787
813
  if (!analysisRes.ok) throw new Error('Failed to load analysis');
@@ -1484,7 +1510,7 @@
1484
1510
  const formData = new FormData();
1485
1511
  formData.append('file', file);
1486
1512
 
1487
- const response = await fetch(addTokenToUrl(`${API_BASE}/upload-instrumental`), {
1513
+ const response = await authFetch(`${API_BASE}/upload-instrumental`, {
1488
1514
  method: 'POST',
1489
1515
  body: formData
1490
1516
  });
@@ -1543,7 +1569,7 @@
1543
1569
  }
1544
1570
 
1545
1571
  try {
1546
- const response = await fetch(addTokenToUrl(`${API_BASE}/create-custom-instrumental`), {
1572
+ const response = await authFetch(`${API_BASE}/create-custom-instrumental`, {
1547
1573
  method: 'POST',
1548
1574
  headers: { 'Content-Type': 'application/json' },
1549
1575
  body: JSON.stringify({ mute_regions: muteRegions })
@@ -1593,7 +1619,7 @@
1593
1619
  }
1594
1620
 
1595
1621
  try {
1596
- const response = await fetch(addTokenToUrl(`${API_BASE}/select-instrumental`), {
1622
+ const response = await authFetch(`${API_BASE}/select-instrumental`, {
1597
1623
  method: 'POST',
1598
1624
  headers: { 'Content-Type': 'application/json' },
1599
1625
  body: JSON.stringify({ selection: selectedOption })
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: karaoke-gen
3
- Version: 0.101.0
3
+ Version: 0.105.4
4
4
  Summary: Generate karaoke videos with synchronized lyrics. Handles the entire process from downloading audio and lyrics to creating the final video with title screens.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -77,6 +77,7 @@ Requires-Dist: python-dotenv (>=1.0.0)
77
77
  Requires-Dist: python-levenshtein (>=0.26)
78
78
  Requires-Dist: python-multipart (>=0.0.20,<0.0.21)
79
79
  Requires-Dist: python-slugify (>=8)
80
+ Requires-Dist: pywebpush (>=2.0.0)
80
81
  Requires-Dist: requests (>=2)
81
82
  Requires-Dist: sendgrid (>=6.10.0)
82
83
  Requires-Dist: shortuuid (>=1.0.13)
@@ -1,34 +1,37 @@
1
1
  backend/.coveragerc,sha256=6K16Sgg_YVmFSfMfMqr16cMxBz0fyIl8aFRXNu6y8zc,407
2
2
  backend/.gitignore,sha256=b0BmxHV4P22b_ougWcfPWJzHJDLyEqAxPTgHelmzd2U,318
3
3
  backend/Dockerfile,sha256=5RgRTTL_pbD5N7qswSpZwKSlr7ndvllc582Yyulkv0g,1774
4
- backend/Dockerfile.base,sha256=oy43qV1HwhPCwX0ix7K72hRfRAiZhtGV5OsbpIlsOdk,2976
4
+ backend/Dockerfile.base,sha256=tGX3rjtpCMpMJ5SkYpLBzHUta-xQ1ctfrQN7GlEi4Wc,3002
5
5
  backend/README.md,sha256=JdmvGRDX85qaDa4TLAn_7VF1O3_VOw62gUuQfYhkBd0,4771
6
6
  backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  backend/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  backend/api/dependencies.py,sha256=-61nHBhiihUDSVMQd3VuHLP7uvKrUbm1y-j9RmV6_zc,16871
9
9
  backend/api/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- backend/api/routes/admin.py,sha256=GI4ANzshBUfAzMdRH3M8cUBnzsCbrL1owRXmIY5HK8A,46506
11
- backend/api/routes/audio_search.py,sha256=CK2lVaM8RDP7i61XEtLeS0AJDfVJSy0ctnduK-ew-hQ,40129
10
+ backend/api/routes/admin.py,sha256=7UHOHw7P1pVJyrRxoXs58gI4hzaumQhJQ1nhoCqvufw,55149
11
+ backend/api/routes/audio_search.py,sha256=QxV3kIm_QYGFzrEdv0nrDIsC-X8ms-3ldOyvMwJ93RM,39267
12
12
  backend/api/routes/auth.py,sha256=G1U2KwS3uqBJpgvg2PIe_mZOWCJKPFhhewrmKbW3Z_s,11531
13
- backend/api/routes/file_upload.py,sha256=nEl06-ZqkKZNzyNZh0RRtuOBox54XvdEOFkYtnSqpv8,95828
13
+ backend/api/routes/file_upload.py,sha256=dGLWC7n3g9bUxwZ1UNxhW4gCEF-sogcIxYP0vByI-e4,93539
14
14
  backend/api/routes/health.py,sha256=iZlhJpmz4vminUy_qrzkyk_1tgG1gmITz4jEWaCWJnM,14010
15
15
  backend/api/routes/internal.py,sha256=yqzd5V8xGJQ_vTZL85vKIMwmBXf1MIp1nhder-kQEuA,15683
16
- backend/api/routes/jobs.py,sha256=7i3uAOL9p4cNk1vJHJIIYCBkcJFaJFl6o3iq92Z9KFo,61218
16
+ backend/api/routes/jobs.py,sha256=FBf5_YojNMFamd51lOd3MDdevfOZefGTyMrtZ9Q8BSU,61241
17
+ backend/api/routes/push.py,sha256=I0LgEis6y6jx-ukiZGS1MUdG3yqUMWjyxffEQI5N95g,7151
18
+ backend/api/routes/rate_limits.py,sha256=lda7gwQdT9-U80XKsRiXkdYtB1HfpSfH5EskbB1kCQI,13806
17
19
  backend/api/routes/review.py,sha256=BiaXZs-NXl7AVzGiwBzIhzm60fUslcQagSw4XuUByhU,28842
18
20
  backend/api/routes/tenant.py,sha256=sM0WVXWGKJeyBNMbPDnAKOD9-SkJBmH4RkMXVWz4dlM,4038
19
21
  backend/api/routes/themes.py,sha256=_fPZg9N2KN-yyr1YR2vAy8FIm8PqVowboQ4WEpFTYiQ,4721
20
- backend/api/routes/users.py,sha256=nKJKuGedzSMuJVLMU4-CXNc7GsM5c82JzjFYeZtzgsg,52771
21
- backend/config.py,sha256=-HsMaacaKuRftYXUXZJr8GBHPdmacFbrNnFDMk7DHNI,8187
22
- backend/main.py,sha256=yRIdnkv_iIyOiLc2btqomxlflym13A-b3ei3X8gI8Ac,5944
22
+ backend/api/routes/users.py,sha256=9RSZyQPBF2Zx8rYMp6cJZoZ4zQ2vskcW90lFx4FSegA,55339
23
+ backend/config.py,sha256=UixlMx0SA1U1-HIo5JFdOI0L565ga0yw9GlRrzcK48A,9859
24
+ backend/exceptions.py,sha256=tKu1YeAj0fmZsmGU_ZebHol-JqaGrGfauom8_DCrVys,1944
25
+ backend/main.py,sha256=ub6B4OAo1hwfC9oQPJ7_jd3ZSLBYpvdpdieqrUH8WM8,6880
23
26
  backend/middleware/__init__.py,sha256=usnVRHqfGW56bWJFqaIXz49pSW91uyciBfwO7ANCpIk,369
24
27
  backend/middleware/audit_logging.py,sha256=oGdgbfH_M_3hIMAGrS5HpRvri2jjLxGFnFuA6IiU9BU,4170
25
28
  backend/middleware/tenant.py,sha256=a-HEAhyvMUC4uFF6VptaNOO9O6YP64-ZoUitppl79PQ,6373
26
29
  backend/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- backend/models/job.py,sha256=B1Q12F6448okCOkmLmpBnlwGIKi16TqBjVkRttTmqi0,25663
30
+ backend/models/job.py,sha256=nQfzj1DWUa71-EFB-Feca5AeEJ1qd4j7xWytY3Hab2o,25919
28
31
  backend/models/requests.py,sha256=tCX7ss4to3rKAR_Wu92CZ8uPqNb2nnmCp1XepD4VR5s,4152
29
32
  backend/models/tenant.py,sha256=rhj6n7bsX8ClstoHQKCVcLWALI31l5Tepcf_N8IXDdM,7403
30
33
  backend/models/theme.py,sha256=cfNSHIigoAV4P41Jku6Sa1okHSRhUHjFpl1XBVF3kCY,4628
31
- backend/models/user.py,sha256=2Dl81Sa8_c0cuPJ3uddsLSOAN40mtv-5aUETtFZZK8c,8022
34
+ backend/models/user.py,sha256=bSm4qxY_8gWa8kUj3186BNumAZBP775ys70SozZXcec,8811
32
35
  backend/models/worker_log.py,sha256=QDgpdRarm00N1TdFoGhKJxZjP9GmiMjrTJb6msw7pHA,5547
33
36
  backend/pyproject.toml,sha256=LAvEXxQSRI94XQcwpBmuSoEu36341HOu53iigsN6dVs,577
34
37
  backend/quick-check.sh,sha256=PUvH0wXaGzWrgWwwJG5M4Bxxt3vVA4mmdEdL6VepVHY,2382
@@ -43,17 +46,19 @@ backend/services/credential_manager.py,sha256=VA--PwvL3gboJ21orQb7MIUiovX8n66Foh
43
46
  backend/services/discord_service.py,sha256=LnEasOgaSRlmebDKsVT2yKCdWNDmskUToP3o2wPmdus,5082
44
47
  backend/services/dropbox_service.py,sha256=R47MUKCqK2BEXXmQxMLG6zkPWw02htFoES9q9xiaYAw,10717
45
48
  backend/services/email_service.py,sha256=gpufwXhNWmdElpWCmKrTLtm2LB8S-0Y5wcyJ3n1i6Jg,52868
49
+ backend/services/email_validation_service.py,sha256=xblVdzieoNTDbkB8MJLOgV_hPsHP_iwO0m36l42QmQw,19102
46
50
  backend/services/encoding_interface.py,sha256=Y8hPskDyX9DOyAD557F3-SdHjymaBkGXcoC9E_OW7SE,15825
47
51
  backend/services/encoding_service.py,sha256=XAX4hyL2wIHdpBCTc8yglcjVJboZxRVAjc07lUTxgFg,18025
48
- backend/services/firestore_service.py,sha256=--Va-2lawugskepxo2p9w3ON2KsMGqacSOutCmU_CDQ,18801
52
+ backend/services/firestore_service.py,sha256=SQWwIelerFOADRG_ZMVqk8zPPR0-utwWhGXwkjtaPIo,19416
49
53
  backend/services/flacfetch_client.py,sha256=zj4VToKamR8bShXZifLvjDmUVa1HHvDhZuaw_b7g4lU,19901
50
54
  backend/services/gce_encoding/README.md,sha256=frTFrp7-ugFAvUd_K9EgE4ud8Xu4Qf1V7BNirQn6qJk,2515
51
55
  backend/services/gce_encoding/__init__.py,sha256=d2H6zM207NSc5afnfgkd3kwOXUu2gFBYjxBSS7tvX_s,571
52
- backend/services/gce_encoding/main.py,sha256=2A0Bd3zYzbV66ikShB3avpqfNoDFBxr8Ja6c36qJhRI,22203
56
+ backend/services/gce_encoding/main.py,sha256=7uS5QwqU-kcJbcw5c4zPX3CeOQQsf1HelSy0yWexLJQ,22956
53
57
  backend/services/gce_encoding/requirements.txt,sha256=-hW5ot-PnVoKkxrpY3yV6l68wx7AvzgnLYAWEgDGWNc,408
54
58
  backend/services/gdrive_service.py,sha256=3JTXmPBuxpKopAbWDrh6YhqR5L9BLop1R7caXBnIk2A,13266
59
+ backend/services/job_defaults_service.py,sha256=GHWkBeEsx97K86ffAdkDvw8PunpyIFuT2_ezgEoGbBM,4446
55
60
  backend/services/job_logging.py,sha256=theCkAlwMbqyqAbu7vCCRpVRscaIpkam3UrCs_4Yi1g,8052
56
- backend/services/job_manager.py,sha256=2vBp-a1r3kwOg-CvXRjjlgkBh9U5AlI6yLeCBAjKLMY,33214
61
+ backend/services/job_manager.py,sha256=JJGbOHHm6C97IpsXYyDw-WJjSiRutbo5CI0NUp_9O0k,37481
57
62
  backend/services/job_notification_service.py,sha256=ywGJUMUDqV23OSDsugOUufpXO6N_24bM9YVaPp8bOk4,9557
58
63
  backend/services/langfuse_preloader.py,sha256=t-Rt_ThjZm4K8W3jlyLn2H3cEy7KNUlhrvOPmdg-gYM,3100
59
64
  backend/services/local_encoding_service.py,sha256=Q6yK2-QL9tHM_pUBoxdyfT7ln2L5xMx82JB2nC5OfNQ,20680
@@ -62,10 +67,12 @@ backend/services/lyrics_cache_service.py,sha256=53EIZuDs5jIKr6QiOhIKJjE2mx1Jd1_x
62
67
  backend/services/metrics.py,sha256=hlEeLG4jOR1i_QbWaNQthoko9CSpe-Zn_LHJ2huEFeY,12728
63
68
  backend/services/nltk_preloader.py,sha256=TZFghQrpDTi6COcW_rkjL15SlzdRNvPmrdy690fq0hw,3579
64
69
  backend/services/packaging_service.py,sha256=MUuBk0jtG3vGQhuOWbDv9u1uIMwbBC4NknLpJYFcWhs,10259
70
+ backend/services/push_notification_service.py,sha256=hGWzyJhgZ4e8YhN0s5IxCTLpZdDQAVMY3lfr8zsEczU,14134
71
+ backend/services/rate_limit_service.py,sha256=KuLF9oWO44v-0zKYL3bFBwVq-_HejsQKbc0ojKJ1JSw,22907
65
72
  backend/services/rclone_service.py,sha256=Q6wRAjlBiMMh9FBbbFRp4SHK1ljOQBed9zUJaJgAuhU,3646
66
73
  backend/services/spacy_preloader.py,sha256=rpsMZB0CQWcoXjq8nyZCwJBkyjGheKaCFrfhxCOln5w,1836
67
74
  backend/services/storage_service.py,sha256=gA7Snz1pihzYpRKZjEZx3eDwyMUBezl3ccLuBdpTwE4,8573
68
- backend/services/stripe_service.py,sha256=YPBVE2_ZeBYWklcFCTGoRWOuO1UTI16_Un2NKAE-sqE,14825
75
+ backend/services/stripe_service.py,sha256=JQCKgl6jH3nKSoadCrOj2gKph2tEUj1HUn-ZHWRPaPQ,14821
69
76
  backend/services/structured_logging.py,sha256=daGgZUdc1xIiOdxL9-YtWHDy51hwZqd8ELpomkh2QH4,9063
70
77
  backend/services/template_service.py,sha256=5CdSxBGhdBtxIUz24AhvltUfSWcFqZzBIxb9MjlN4YU,11212
71
78
  backend/services/tenant_service.py,sha256=AlG5acJww-rpxGEQbw7eOWe1KaHLOcCn3fM95qDZMGw,9709
@@ -76,7 +83,7 @@ backend/services/worker_service.py,sha256=WRgh3kconWYmvraEIsx6eUto2frKacauKApFU1
76
83
  backend/services/youtube_service.py,sha256=L2jqcWkw6qIaKh4wEfX894mHaTU0m5qtgIX6TPi6uiQ,3828
77
84
  backend/services/youtube_upload_service.py,sha256=fvo4WxLQaKY_I75ViBMLk6vm87ym2ABHK0Fn_StYN6g,16694
78
85
  backend/tests/__init__.py,sha256=jTjELMqIzpgHG9dcXwwkszTAAC4Wf-c93C6D1k-toZg,44
79
- backend/tests/conftest.py,sha256=c4_jH0FIHsiKeUfo3ECPN78MlbW_IARTWwKr9RKLOSM,7843
86
+ backend/tests/conftest.py,sha256=drHy10O45kO2s23Snxlj1dg2VrhDp0Mz8FGE_dzzA1A,8301
80
87
  backend/tests/emulator/__init__.py,sha256=yOGPU5e0JPNYyUpy-u13jW4gEfWQs3dCJxfincptaCY,156
81
88
  backend/tests/emulator/conftest.py,sha256=VXhoJ3NZg3uiLzSAsushQtozFS7Lt6lmjk7ym-k6V8o,3844
82
89
  backend/tests/emulator/test_e2e_cli_backend.py,sha256=BTrWDv4sRTeOlheZ-d4R37tZsvJ2MhdFLbDb9tjbF08,41018
@@ -87,6 +94,7 @@ backend/tests/emulator/test_worker_logs_direct.py,sha256=96EeaSxeNQBtDiZ9ky1-CGE
87
94
  backend/tests/emulator/test_worker_logs_subcollection.py,sha256=whwUXW_-fF-nQp2Z791PNxi0nnvlRwLo87QacF-yMUI,16834
88
95
  backend/tests/requirements-test.txt,sha256=1ixGqdsXFG0hbqUPWUjNGPlKdQgYxo1GajXOiLhs66M,193
89
96
  backend/tests/requirements.txt,sha256=1526vDy39B1ZjJ5URZtoiDGnjvwuxiD9dNrjOLd6-gA,95
97
+ backend/tests/test_admin_delete_outputs.py,sha256=iDRKKOfZ8ikuaEx_7DHIiZWwT8EAbGW2KkKG3VA4wYc,13998
90
98
  backend/tests/test_admin_email_endpoints.py,sha256=C1mOX3K4P-_QqSWa8ZSH4gtMnUJ7hqq5rOi00zSKR8g,16592
91
99
  backend/tests/test_admin_job_files.py,sha256=LXeV08a4XuaipM-QFFVJKE02e83Muj-JrjtCPlgExuM,13348
92
100
  backend/tests/test_admin_job_reset.py,sha256=PsM6cBPeN5d6HO4pejaOQNyTh7OHTOFNPMTPuulcZCI,14292
@@ -95,7 +103,7 @@ backend/tests/test_api_integration.py,sha256=ps4dFoW69NCKJAWvPSr410fEILPxfQNME_Y
95
103
  backend/tests/test_api_routes.py,sha256=j6alBwXgtKspXxbOiDuNCCVMENk6yxdFJkakbife-rM,3193
96
104
  backend/tests/test_audio_analysis_service.py,sha256=bKIAgyxfdbUOr7atHH-WCbZcZFkWGmGOOn7IfvRF2ms,11373
97
105
  backend/tests/test_audio_editing_service.py,sha256=wXs82PRaxFQIji0CO1eKKYD2skHS4_VLK4aBnfj8CLE,15541
98
- backend/tests/test_audio_search.py,sha256=ukZjzsw7XjVM6jPoJRiLp98TDiBbdYCp22-7v0hqeMU,54285
106
+ backend/tests/test_audio_search.py,sha256=VKVqh52to01AdQp1I1sAIkHIdhSOXgk82utc-oKdheg,54505
99
107
  backend/tests/test_audio_services.py,sha256=mOF15i7IMtjM3mV-BNG0QBoMxW58cNPviEE6wka1pjQ,14607
100
108
  backend/tests/test_auth_firestore.py,sha256=2etzuL47Pu-xOtR1CpCxi075OTFsftqneHa09yNJKEk,10063
101
109
  backend/tests/test_config_extended.py,sha256=U2l9-wF28PmSllmRW5zNqRCNoYbBl3Nixb2SrmfGUOA,2475
@@ -105,12 +113,14 @@ backend/tests/test_discord_service.py,sha256=OU5mVzjukFtJd_H5e_HxJqSsf78B0TrNfjx
105
113
  backend/tests/test_distribution_services.py,sha256=8oB2vMq5T_4rvOs6BURoLLTQiDf0kUJ-jF8dzJzDYRk,33699
106
114
  backend/tests/test_dropbox_service.py,sha256=nDN1NjiCMS_f1bICWfe3maqbKT5FbhNuKCb1zjyjKq0,19198
107
115
  backend/tests/test_email_service.py,sha256=u1VSTBCZl7m3GYR-vKV84tu3q7zhMuIhNA5a4OiCDlE,25290
116
+ backend/tests/test_email_validation_service.py,sha256=AGtusq5fUiNQz4gpiT8DXmroNPD5bcYij0R787NDooE,12472
108
117
  backend/tests/test_emulator_integration.py,sha256=m4teGnKLBKQNe9UdFi0-0iR_unnotWs07VWgSd_atuw,10387
109
118
  backend/tests/test_encoding_interface.py,sha256=7q9mKX4QG8-bfkxQgZkmeirK_ynfL88UTbgWS0f097U,14609
110
- backend/tests/test_file_upload.py,sha256=mWEIVj6cK6ZzKf4X0D0JhSk6pmJeCO0dOawV2GED7tc,68038
119
+ backend/tests/test_file_upload.py,sha256=seFF8viLNTEqiuChRolD5gIiMevhhkawvcXMFPcmCHw,68226
111
120
  backend/tests/test_flacfetch_client.py,sha256=ZquMDLFVgORr9GoNfybOV9Z3eruborRgCvBRY6l-V8A,22614
121
+ backend/tests/test_gce_encoding_worker.py,sha256=8t_tWiFUEK0fz8p2xI9uOVIS5lQ6tDaafU7snBBlfYI,9015
112
122
  backend/tests/test_gdrive_service.py,sha256=fh02KPaFqLEWfPaDQvSehn6r6RLq0bgt6MdXenF1kxA,19762
113
- backend/tests/test_impersonation.py,sha256=vuCJaYmPOObLvFWuzxRvqadeRtFXgsbQxyOKd4TaxHg,9087
123
+ backend/tests/test_impersonation.py,sha256=1XhLZYIUuMay9mXzI1zOfAZTKzeGDm1Esq5xQVF1yhU,9498
114
124
  backend/tests/test_instrumental_api.py,sha256=2eWaoEAYVY02HZgY4esn5echuWGv_sznoO6FYWIgTbQ,17210
115
125
  backend/tests/test_internal_api.py,sha256=qMGSDCkYd5OY_Z85vQu10xjqJn1JtaQcaKSnSBpVijw,12980
116
126
  backend/tests/test_job_creation_regression.py,sha256=ydd97391bMq40MSTlTlvMn3_zjtFDWzSQLjYczoqR_U,22826
@@ -120,10 +130,14 @@ backend/tests/test_job_notification_service.py,sha256=YbXqCWbsK8O5WICItb3VCrEY8q
120
130
  backend/tests/test_jobs_api.py,sha256=z3pGTawTpt75a1bQ5x4ynw3pTlNihLA6vqktTc6mBAU,11092
121
131
  backend/tests/test_local_encoding_service.py,sha256=TbBaFOB-8Re09G-qXIQCl8mS9WlQMFNQF01V64IekyI,14638
122
132
  backend/tests/test_local_preview_encoding_service.py,sha256=VwxpcAjDdYaVauSsrJ609U575VWRZbLsXew8BqBXpJY,20228
123
- backend/tests/test_made_for_you.py,sha256=WNiJhmv_zse96Yg4scEXnpu66MMc0Hi4pNyiadfdlQ8,87628
133
+ backend/tests/test_made_for_you.py,sha256=Eanhp4v_dOgpQTxKQPHxHdLG4XiJ-kruVPWkR0iUnsg,87806
124
134
  backend/tests/test_main.py,sha256=BvzcadLUV0SEUO1ViKm0djgy_TEKXm8PPvgfcCCEJAY,3348
125
135
  backend/tests/test_models.py,sha256=buUjtm3TaiIff58SCpG0Du1Bnm-S9X8LyaW64zEhb4U,39606
126
136
  backend/tests/test_packaging_service.py,sha256=v4Bj8R61Fx0Kng6RoTj3SRN9jmxow5qCVtTJstTWNfE,13916
137
+ backend/tests/test_push_notification_service.py,sha256=h6uMHiZdEMViG6OlKE-T85kkvphVc_4iAClc_8gSesc,18226
138
+ backend/tests/test_push_routes.py,sha256=9Bw6erGLpaJD4d2ybsB6mq7IIJPdnQTF8h6xuhpEv9U,13091
139
+ backend/tests/test_rate_limit_service.py,sha256=1G-kskzv-5hcG_px78vZ9_J_X2Jj21s7l_wuUOWAOkY,16905
140
+ backend/tests/test_rate_limits_api.py,sha256=eFtdMzDMxhvI3MPhm60nRIWh-MVFCdpG0e-FwIVLn9I,14822
127
141
  backend/tests/test_requests.py,sha256=DI2IG67hHk2rhuzUfz_QNJCLRTy1NZPLsnSdZbIfPA8,6817
128
142
  backend/tests/test_routes_jobs.py,sha256=iqOZ93ACKpizSzLEJUx5hIo0vkKe2oIT7s7iZqQUJaE,11258
129
143
  backend/tests/test_routes_review.py,sha256=ENo6_wFUDcyXZhRy_NBqajan9dvqV_7f1rIQ7LLLS-U,14334
@@ -131,6 +145,7 @@ backend/tests/test_services.py,sha256=JSsZZSpa0HjNZBSIrXXzBxZfJewfdR9RC3P8tHV8M8
131
145
  backend/tests/test_services_extended.py,sha256=cBcaEicz4WdBo5WZB77AoGZTwWAOC6W4OslpT6VmFI8,4124
132
146
  backend/tests/test_spacy_preloader.py,sha256=uWpkrOPUOOcW1-fWClKMKVhXHGk30FXq537kQH5jpd0,4437
133
147
  backend/tests/test_storage_service.py,sha256=gorn3aFwKSr8lihxcG7kza7fYvDsTvxJhOxzuTtPK_o,19069
148
+ backend/tests/test_stripe_service.py,sha256=KcymsTeIftSje3uQx1qZgGe57DNlsPbmZCZ7OR6LTms,8560
134
149
  backend/tests/test_style_upload.py,sha256=8G2dGgvyMGXsh1jk8PcGpTlSdBQAlHn13kpZcKn6rTY,10491
135
150
  backend/tests/test_template_service.py,sha256=BKURQ1M-hXXgdBl9LqhPQKfpItWOYDRBSt1y5FXQzaM,10431
136
151
  backend/tests/test_tenant_api.py,sha256=P4395WYGldJIX7hYcbk96bIDW0Hogcj2McUG6iApNmc,13441
@@ -159,7 +174,7 @@ backend/workers/render_video_worker.py,sha256=L6-VCxSBY6MbXBBm0-wu_DXxcIWKfW6ynT
159
174
  backend/workers/screens_worker.py,sha256=vCS7j4dQRQ_tsWNhz-XH5nau7kGyUSzSp-dzyZpeJEo,21402
160
175
  backend/workers/style_helper.py,sha256=7-PM79dAUAZHTj-bnATy43ImqNdl_00E9pm94CYg1BM,6906
161
176
  backend/workers/video_worker.py,sha256=5r3PcYdoca16fjZtFzCwfKm-G7QjL98ZLMhw6qGVDNE,55670
162
- backend/workers/video_worker_orchestrator.py,sha256=NInZjFwztqcYneuxrkDqEFWV7z5BzGlaaoJxj812KA4,27510
177
+ backend/workers/video_worker_orchestrator.py,sha256=shkn7a_m9GxlPGtu-PUnqGX4FGc2VvwSpoVWu9_L1jI,29510
163
178
  backend/workers/worker_logging.py,sha256=nlbGsjDjdkv28Fm-95vKBumy6P47dGiNN5Zf3r0A480,9928
164
179
  karaoke_gen/__init__.py,sha256=wHpDbURJxmJAMNZ0uQjISv5MIT7KD9RWYi15xlYgEhU,1351
165
180
  karaoke_gen/audio_fetcher.py,sha256=EuMSO_wG0z0ldfQQ_xGC8kdoUCDB1Rr2_IuWIZ218lA,71380
@@ -171,7 +186,7 @@ karaoke_gen/instrumental_review/analyzer.py,sha256=Heg8TbrwM4g5IV7bavmO6EfVD4M0U
171
186
  karaoke_gen/instrumental_review/editor.py,sha256=_DGTjKMk5WhoGtLGtTvHzU522LJyQQ_DSY1r8fULuiA,11568
172
187
  karaoke_gen/instrumental_review/models.py,sha256=cUSb_JheJK0cGdKx9f59-9sRvRrhrgdTdKBzQN3lHto,5226
173
188
  karaoke_gen/instrumental_review/server.py,sha256=Ick90X77t2EeMRwtx2U08sSybadQyWH7G0tDG-4JqP4,19377
174
- karaoke_gen/instrumental_review/static/index.html,sha256=_MHZcgDQ98GyaDHq3pBW8Bt3MHYAcp-y9Nsu8YwCzIM,63432
189
+ karaoke_gen/instrumental_review/static/index.html,sha256=xGHlUYZ4NfJbduuC6ecxgyV4vj1sj2UcBvHgrQT6SII,64730
175
190
  karaoke_gen/instrumental_review/waveform.py,sha256=Q6LBPZrJAD6mzZ7TmRf3Tf4gwYhUYTHumJKytLs3hSg,12940
176
191
  karaoke_gen/karaoke_finalise/__init__.py,sha256=HqZ7TIhgt_tYZ-nb_NNCaejWAcF_aK-7wJY5TaW_keM,46
177
192
  karaoke_gen/karaoke_finalise/karaoke_finalise.py,sha256=uAx25TAOB5MGKw4bHCl5cqcvIfZMj4tjXMJurtRrbog,93895
@@ -450,8 +465,8 @@ lyrics_transcriber/transcribers/whisper.py,sha256=YcCB1ic9H6zL1GS0jD0emu8-qlcH0Q
450
465
  lyrics_transcriber/types.py,sha256=UJjaxhVd2o14AG4G8ToU598p0JeYdiTFjpG38jGCoYQ,27917
451
466
  lyrics_transcriber/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
452
467
  lyrics_transcriber/utils/word_utils.py,sha256=-cMGpj9UV4F6IsoDKAV2i1aiqSO8eI91HMAm_igtVMk,958
453
- karaoke_gen-0.101.0.dist-info/METADATA,sha256=zkFeEtygnskVvZLwCarJ9blhCd4pA60LV75aSZm8RaI,23116
454
- karaoke_gen-0.101.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
455
- karaoke_gen-0.101.0.dist-info/entry_points.txt,sha256=xIyLe7K84ZyjO8L0_AmNectz93QjGSs5AkApMtlAd4g,160
456
- karaoke_gen-0.101.0.dist-info/licenses/LICENSE,sha256=81R_4XwMZDODHD7JcZeUR8IiCU8AD7Ajl6bmwR9tYDk,1074
457
- karaoke_gen-0.101.0.dist-info/RECORD,,
468
+ karaoke_gen-0.105.4.dist-info/METADATA,sha256=OgyTNMu5A8560akFACt0BXdwu2cqcK10806TzKoNES8,23151
469
+ karaoke_gen-0.105.4.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
470
+ karaoke_gen-0.105.4.dist-info/entry_points.txt,sha256=xIyLe7K84ZyjO8L0_AmNectz93QjGSs5AkApMtlAd4g,160
471
+ karaoke_gen-0.105.4.dist-info/licenses/LICENSE,sha256=81R_4XwMZDODHD7JcZeUR8IiCU8AD7Ajl6bmwR9tYDk,1074
472
+ karaoke_gen-0.105.4.dist-info/RECORD,,