karaoke-gen 0.75.53__py3-none-any.whl → 0.76.20__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 (36) hide show
  1. karaoke_gen/audio_fetcher.py +218 -0
  2. karaoke_gen/karaoke_gen.py +190 -25
  3. karaoke_gen/lyrics_processor.py +14 -25
  4. karaoke_gen/utils/__init__.py +26 -0
  5. karaoke_gen/utils/cli_args.py +9 -1
  6. karaoke_gen/utils/gen_cli.py +1 -1
  7. karaoke_gen/utils/remote_cli.py +33 -6
  8. {karaoke_gen-0.75.53.dist-info → karaoke_gen-0.76.20.dist-info}/METADATA +2 -2
  9. {karaoke_gen-0.75.53.dist-info → karaoke_gen-0.76.20.dist-info}/RECORD +36 -32
  10. lyrics_transcriber/frontend/index.html +5 -1
  11. lyrics_transcriber/frontend/package-lock.json +4553 -0
  12. lyrics_transcriber/frontend/package.json +3 -0
  13. lyrics_transcriber/frontend/playwright.config.ts +69 -0
  14. lyrics_transcriber/frontend/public/nomad-karaoke-logo.svg +5 -0
  15. lyrics_transcriber/frontend/src/App.tsx +88 -59
  16. lyrics_transcriber/frontend/src/components/AIFeedbackModal.tsx +55 -21
  17. lyrics_transcriber/frontend/src/components/AppHeader.tsx +65 -0
  18. lyrics_transcriber/frontend/src/components/CorrectedWordWithActions.tsx +5 -5
  19. lyrics_transcriber/frontend/src/components/DurationTimelineView.tsx +9 -9
  20. lyrics_transcriber/frontend/src/components/EditModal.tsx +1 -1
  21. lyrics_transcriber/frontend/src/components/EditWordList.tsx +1 -1
  22. lyrics_transcriber/frontend/src/components/Header.tsx +34 -48
  23. lyrics_transcriber/frontend/src/components/LyricsSynchronizer/TimelineCanvas.tsx +22 -21
  24. lyrics_transcriber/frontend/src/components/ReferenceView.tsx +1 -1
  25. lyrics_transcriber/frontend/src/components/TranscriptionView.tsx +1 -1
  26. lyrics_transcriber/frontend/src/components/WordDivider.tsx +3 -3
  27. lyrics_transcriber/frontend/src/components/shared/components/Word.tsx +2 -2
  28. lyrics_transcriber/frontend/src/components/shared/constants.ts +15 -5
  29. lyrics_transcriber/frontend/src/main.tsx +1 -7
  30. lyrics_transcriber/frontend/src/theme.ts +337 -135
  31. lyrics_transcriber/frontend/vite.config.ts +5 -0
  32. lyrics_transcriber/frontend/yarn.lock +1005 -1046
  33. lyrics_transcriber/review/server.py +1 -1
  34. {karaoke_gen-0.75.53.dist-info → karaoke_gen-0.76.20.dist-info}/WHEEL +0 -0
  35. {karaoke_gen-0.75.53.dist-info → karaoke_gen-0.76.20.dist-info}/entry_points.txt +0 -0
  36. {karaoke_gen-0.75.53.dist-info → karaoke_gen-0.76.20.dist-info}/licenses/LICENSE +0 -0
@@ -292,6 +292,8 @@ class RemoteKaraokeClient:
292
292
  # Two-phase workflow (Batch 6)
293
293
  prep_only: bool = False,
294
294
  keep_brand_code: Optional[str] = None,
295
+ # Theme system
296
+ theme_id: Optional[str] = None,
295
297
  ) -> Dict[str, Any]:
296
298
  """
297
299
  Submit a new karaoke generation job from a YouTube/online URL.
@@ -322,6 +324,7 @@ class RemoteKaraokeClient:
322
324
  clean_instrumental_model: Model for clean instrumental separation
323
325
  backing_vocals_models: List of models for backing vocals separation
324
326
  other_stems_models: List of models for other stems (bass, drums, etc.)
327
+ theme_id: Theme ID from GCS themes (e.g., 'nomad', 'default')
325
328
  """
326
329
  self.logger.info(f"Submitting URL-based job: {url}")
327
330
 
@@ -367,7 +370,10 @@ class RemoteKaraokeClient:
367
370
  create_request['prep_only'] = prep_only
368
371
  if keep_brand_code:
369
372
  create_request['keep_brand_code'] = keep_brand_code
370
-
373
+ # Theme system
374
+ if theme_id:
375
+ create_request['theme_id'] = theme_id
376
+
371
377
  self.logger.info(f"Creating URL-based job at {self.config.service_url}/api/jobs/create-from-url")
372
378
 
373
379
  response = self._request('POST', '/api/jobs/create-from-url', json=create_request)
@@ -396,9 +402,9 @@ class RemoteKaraokeClient:
396
402
  return result
397
403
 
398
404
  def submit_job(
399
- self,
400
- filepath: str,
401
- artist: str,
405
+ self,
406
+ filepath: str,
407
+ artist: str,
402
408
  title: str,
403
409
  style_params_path: Optional[str] = None,
404
410
  enable_cdg: bool = True,
@@ -425,6 +431,8 @@ class RemoteKaraokeClient:
425
431
  # Two-phase workflow (Batch 6)
426
432
  prep_only: bool = False,
427
433
  keep_brand_code: Optional[str] = None,
434
+ # Theme system
435
+ theme_id: Optional[str] = None,
428
436
  ) -> Dict[str, Any]:
429
437
  """
430
438
  Submit a new karaoke generation job with optional style configuration.
@@ -456,6 +464,7 @@ class RemoteKaraokeClient:
456
464
  backing_vocals_models: List of models for backing vocals separation
457
465
  other_stems_models: List of models for other stems (bass, drums, etc.)
458
466
  existing_instrumental: Path to existing instrumental file to use instead of AI separation
467
+ theme_id: Theme ID from GCS themes (e.g., 'nomad', 'default')
459
468
  """
460
469
  file_path = Path(filepath)
461
470
 
@@ -574,7 +583,10 @@ class RemoteKaraokeClient:
574
583
  create_request['prep_only'] = prep_only
575
584
  if keep_brand_code:
576
585
  create_request['keep_brand_code'] = keep_brand_code
577
-
586
+ # Theme system
587
+ if theme_id:
588
+ create_request['theme_id'] = theme_id
589
+
578
590
  response = self._request('POST', '/api/jobs/create-with-upload-urls', json=create_request)
579
591
 
580
592
  if response.status_code != 200:
@@ -1195,6 +1207,8 @@ class RemoteKaraokeClient:
1195
1207
  clean_instrumental_model: Optional[str] = None,
1196
1208
  backing_vocals_models: Optional[list] = None,
1197
1209
  other_stems_models: Optional[list] = None,
1210
+ # Theme system
1211
+ theme_id: Optional[str] = None,
1198
1212
  ) -> Dict[str, Any]:
1199
1213
  """
1200
1214
  Search for audio by artist and title (Batch 5 - Flacfetch integration).
@@ -1247,7 +1261,10 @@ class RemoteKaraokeClient:
1247
1261
  request_data['backing_vocals_models'] = backing_vocals_models
1248
1262
  if other_stems_models:
1249
1263
  request_data['other_stems_models'] = other_stems_models
1250
-
1264
+ # Theme system
1265
+ if theme_id:
1266
+ request_data['theme_id'] = theme_id
1267
+
1251
1268
  # Prepare style files for upload if provided
1252
1269
  style_files = []
1253
1270
  local_style_files: Dict[str, str] = {} # file_type -> local_path
@@ -3029,6 +3046,8 @@ def main():
3029
3046
  logger.info(f"Searching for: {artist} - {title}")
3030
3047
  if getattr(args, 'auto_download', False) or config.non_interactive:
3031
3048
  logger.info(f"Auto-download: enabled (will auto-select best source)")
3049
+ if getattr(args, 'theme', None):
3050
+ logger.info(f"Theme: {args.theme}")
3032
3051
  if args.style_params_json:
3033
3052
  logger.info(f"Style: {args.style_params_json}")
3034
3053
  logger.info(f"CDG: {args.enable_cdg}, TXT: {args.enable_txt}")
@@ -3070,6 +3089,8 @@ def main():
3070
3089
  clean_instrumental_model=getattr(args, 'clean_instrumental_model', None),
3071
3090
  backing_vocals_models=getattr(args, 'backing_vocals_models', None),
3072
3091
  other_stems_models=getattr(args, 'other_stems_models', None),
3092
+ # Theme system
3093
+ theme_id=getattr(args, 'theme', None),
3073
3094
  )
3074
3095
 
3075
3096
  job_id = result.get('job_id')
@@ -3106,6 +3127,8 @@ def main():
3106
3127
  logger.info(f"Title: {title}")
3107
3128
  if not artist and not title and is_url_input:
3108
3129
  logger.info(f"Artist/Title: (will be auto-detected from URL)")
3130
+ if getattr(args, 'theme', None):
3131
+ logger.info(f"Theme: {args.theme}")
3109
3132
  if args.style_params_json:
3110
3133
  logger.info(f"Style: {args.style_params_json}")
3111
3134
  logger.info(f"CDG: {args.enable_cdg}, TXT: {args.enable_txt}")
@@ -3206,6 +3229,8 @@ def main():
3206
3229
  # Two-phase workflow (Batch 6)
3207
3230
  prep_only=getattr(args, 'prep_only', False),
3208
3231
  keep_brand_code=keep_brand_code_value,
3232
+ # Theme system
3233
+ theme_id=getattr(args, 'theme', None),
3209
3234
  )
3210
3235
  else:
3211
3236
  # File-based job submission
@@ -3238,6 +3263,8 @@ def main():
3238
3263
  # Two-phase workflow (Batch 6)
3239
3264
  prep_only=getattr(args, 'prep_only', False),
3240
3265
  keep_brand_code=keep_brand_code_value,
3266
+ # Theme system
3267
+ theme_id=getattr(args, 'theme', None),
3241
3268
  )
3242
3269
  job_id = result.get('job_id')
3243
3270
  style_assets = result.get('style_assets_uploaded', [])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: karaoke-gen
3
- Version: 0.75.53
3
+ Version: 0.76.20
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
@@ -308,7 +308,7 @@ karaoke-gen-remote \
308
308
  |----------|-------------|---------|
309
309
  | `KARAOKE_GEN_URL` | Backend service URL | Required |
310
310
  | `KARAOKE_GEN_AUTH_TOKEN` | Admin auth token (for protected endpoints) | Optional |
311
- | `REVIEW_UI_URL` | Lyrics review UI URL | `https://lyrics.nomadkaraoke.com` |
311
+ | `REVIEW_UI_URL` | Lyrics review UI URL | `https://gen.nomadkaraoke.com/lyrics/` |
312
312
  | `POLL_INTERVAL` | Seconds between status polls | `5` |
313
313
 
314
314
  **Note:** The `REVIEW_UI_URL` defaults to the hosted lyrics review UI. For local development, set it to `http://localhost:5173` if you're running the frontend dev server.
@@ -1,5 +1,5 @@
1
1
  karaoke_gen/__init__.py,sha256=wHpDbURJxmJAMNZ0uQjISv5MIT7KD9RWYi15xlYgEhU,1351
2
- karaoke_gen/audio_fetcher.py,sha256=A1c7HxUbV4inhGuj9SySr3zkOSGKfAFovXu2TKzodSA,63811
2
+ karaoke_gen/audio_fetcher.py,sha256=EuMSO_wG0z0ldfQQ_xGC8kdoUCDB1Rr2_IuWIZ218lA,71380
3
3
  karaoke_gen/audio_processor.py,sha256=YCMsxh-OSzC6h1Oqht8gh48j4KaRDuRIMUUsNNQxJeY,39913
4
4
  karaoke_gen/config.py,sha256=LBZKpvwSgta8YoVX2GFFW-4CP22AyRtqsBn-KCeh8eg,2499
5
5
  karaoke_gen/file_handler.py,sha256=jnPc4kFtG-PX-IVPHYWa7maXd4lNmbkKd1HogDNzgN8,16674
@@ -12,8 +12,8 @@ karaoke_gen/instrumental_review/static/index.html,sha256=EjMFxCQJOUSrsgwIXAW3R4b
12
12
  karaoke_gen/instrumental_review/waveform.py,sha256=Q6LBPZrJAD6mzZ7TmRf3Tf4gwYhUYTHumJKytLs3hSg,12940
13
13
  karaoke_gen/karaoke_finalise/__init__.py,sha256=HqZ7TIhgt_tYZ-nb_NNCaejWAcF_aK-7wJY5TaW_keM,46
14
14
  karaoke_gen/karaoke_finalise/karaoke_finalise.py,sha256=Wn1KcdRyINT63UxKUPT9uB-bsrFVih0Im_cjXtequS0,93534
15
- karaoke_gen/karaoke_gen.py,sha256=tfoywlSEI9qOi1krHTBafumXl3bcWxn6w0AN2vQ1nHs,57048
16
- karaoke_gen/lyrics_processor.py,sha256=JrbTLmMR_jvcpuxsPihLXlCBKkFNKqYHvraw3_3KCPI,23263
15
+ karaoke_gen/karaoke_gen.py,sha256=-kmv26iqF36OXHoKAdFCXqaLPhrqk-aH958v-cPbTWM,65694
16
+ karaoke_gen/lyrics_processor.py,sha256=IzwscxBtDe2l7NhmWY8PdglYeMfIXhh2AWHQMY-ro1M,22829
17
17
  karaoke_gen/metadata.py,sha256=SZW6TuUpkGGU98gRdjPfrR8F4vWXjnfCSGry2XD5_A4,6689
18
18
  karaoke_gen/pipeline/__init__.py,sha256=-MZnba4qobr1qGDamG9CieLl2pWCZMEB5_Yur62RKeM,2106
19
19
  karaoke_gen/pipeline/base.py,sha256=yg4LIm7Mc9ER0zCmZcUv4huEkotSSXK_0OAFio-TSNI,6235
@@ -33,11 +33,11 @@ karaoke_gen/resources/Oswald-Bold.ttf,sha256=S_2mLpNkBsDTe8FQRzrj1Qr-wloGETMJgoA
33
33
  karaoke_gen/resources/Oswald-SemiBold.ttf,sha256=G-vSJeeyEVft7D4s7FZQtGfXAViWPjzGCImV2a4u9d8,87608
34
34
  karaoke_gen/resources/Zurich_Cn_BT_Bold.ttf,sha256=WNG5LOQ-uGUF_WWT5aQHzVbyWvQqGO5sZ4E-nRmvPuI,37780
35
35
  karaoke_gen/style_loader.py,sha256=13010BVxwVgamRn8K8Z9fNgLBdPs9LFmWMRMLyBdits,17908
36
- karaoke_gen/utils/__init__.py,sha256=FpOHyeBRB06f3zMoLBUJHTDZACrabg-DoyBTxNKYyNY,722
36
+ karaoke_gen/utils/__init__.py,sha256=zAb4sG4GMkBlkD2G1EDu-GsMbjcjFT127lFBwh0xVPI,1875
37
37
  karaoke_gen/utils/bulk_cli.py,sha256=s2SXTnnQf7TM8Fk8yz9Cfd3Xl08uHBnve_rTkf4wE5g,19337
38
- karaoke_gen/utils/cli_args.py,sha256=Td8fE1FisY1fcQuOoKlAQ6B3NF4bxGvSPDaQlpfY3T0,18172
39
- karaoke_gen/utils/gen_cli.py,sha256=ahoVp_n298O8yUmFOBDsm4mLXgTuEb80mBnz4_mo4SM,44137
40
- karaoke_gen/utils/remote_cli.py,sha256=l1iHUz_hrsbAfTvGDhA4gzr2g1CFBFc9np0nQ1jk1tQ,144629
38
+ karaoke_gen/utils/cli_args.py,sha256=4m2EOaxg-bYzXmlSOkpQUoVSi2Q9Xr3VtBZA7z3quBk,18515
39
+ karaoke_gen/utils/gen_cli.py,sha256=5ydiudcIOmNvA-YHe7x6QZepoQGg1dtW4bOkNOBhXhY,44142
40
+ karaoke_gen/utils/remote_cli.py,sha256=sWlbu29fQwoqNtIYUeC9nipux36sFJAUe-aMbGCGv_c,145647
41
41
  karaoke_gen/video_background_processor.py,sha256=p3sryMxmkori4Uy2MYgmlk5_QQ7Uh9IoVJLAdkdLIUI,15124
42
42
  karaoke_gen/video_generator.py,sha256=B7BQBrjkyvk3L3sctnPXnvr1rzkw0NYx5UCAl0ZiVx0,18464
43
43
  lyrics_transcriber/__init__.py,sha256=g9ZbJg9U1qo7XzrC25J3bTKcNzzwUJWDVdi_7-hjcM4,412
@@ -124,8 +124,10 @@ lyrics_transcriber/frontend/README.md,sha256=-D6CAfKTT7Y0V3EjlZ2fMy7fyctFQ4x2TJ9
124
124
  lyrics_transcriber/frontend/REPLACE_ALL_FUNCTIONALITY.md,sha256=iRZbicW5satHel9gbG-uLyZ7oq3xdp87KQlJEL1ZhK8,8384
125
125
  lyrics_transcriber/frontend/__init__.py,sha256=nW8acRSWTjXoRwGqcTU4w-__X7tMAE0iXL0uihBN3CU,836
126
126
  lyrics_transcriber/frontend/eslint.config.js,sha256=3ADH23ANA4NNBKFy6nCVk65e8bx1DrVd_FIaYNnhuqA,734
127
- lyrics_transcriber/frontend/index.html,sha256=u1m7042a1kLWZVIElYQ9y-lzfIAdYJGtQE-i4Zjc3xY,806
128
- lyrics_transcriber/frontend/package.json,sha256=5krvXBc9deVYXREN9Pxw5N6ohiAsSCnPXnXlcb6p-U0,1182
127
+ lyrics_transcriber/frontend/index.html,sha256=hcVQvxU1yITMrMS4vVLwn4YwvnlXsfl4XY9UNtXvWAw,1135
128
+ lyrics_transcriber/frontend/package-lock.json,sha256=gQekpsz4CAKMJ8Fi331Q3Pv5yqhZlQ-nbGoDNnF35WE,159262
129
+ lyrics_transcriber/frontend/package.json,sha256=ttlZ0EqPSz0HIkjyCt_3szk1CsFrLR-uNtyhdxsc30w,1278
130
+ lyrics_transcriber/frontend/playwright.config.ts,sha256=7AtyWuAP193WVbFDqzqKMYZwE1dZ7TZ_QKzNfP8hIB0,1520
129
131
  lyrics_transcriber/frontend/public/android-chrome-192x192.png,sha256=lg-6aPF5mGLiuG7LyftZk_0RI41srmpA8wj-NkaaQms,17632
130
132
  lyrics_transcriber/frontend/public/android-chrome-512x512.png,sha256=x-zuKT3NYsTqAWzhKRTZeD4-0uYoUjqMPZpKTChqNJ8,123447
131
133
  lyrics_transcriber/frontend/public/apple-touch-icon.png,sha256=6y5vGra54w5oc8VP6sn2JjoQtN9hWTKn0YPhmdlmfU0,16188
@@ -133,27 +135,29 @@ lyrics_transcriber/frontend/public/favicon-16x16.png,sha256=2wy_7ZmVS4d7umByJVHQ
133
135
  lyrics_transcriber/frontend/public/favicon-32x32.png,sha256=6TyrRMIw6G8dpG4_QWVTY8DMxo0bIGzc_9aOJrkiJKM,1297
134
136
  lyrics_transcriber/frontend/public/favicon.ico,sha256=ZK7QvdBuZp0QxPkluCW4IKxfleFmFLp1KkG_d5xmx7E,15406
135
137
  lyrics_transcriber/frontend/public/nomad-karaoke-logo.png,sha256=jTTBFXV6hGJGolZYQ-dIjgQQbMsehk5XGtsllhLrdzg,212641
136
- lyrics_transcriber/frontend/src/App.tsx,sha256=XI93-pX2p76ID45XUQTitDclUZHZ1kxhZZB2VriMV8k,6747
138
+ lyrics_transcriber/frontend/public/nomad-karaoke-logo.svg,sha256=0LOH346_a-1JeYquMWd1v2A3XMN8zLDBeujfWAOeNYk,9185
139
+ lyrics_transcriber/frontend/src/App.tsx,sha256=STVmqN3xtXambV_5X4M0MNuwYjARHBQfn1cuCqxNGkw,7979
137
140
  lyrics_transcriber/frontend/src/api.ts,sha256=GcjbOrlU7EdUpZ7MUPFqE1rtH-ckdw8wHtgyQxWateY,8648
138
- lyrics_transcriber/frontend/src/components/AIFeedbackModal.tsx,sha256=N-M8LNKE3nCjrSkWTf8ObWSdBqD0Cv3Xiz_wVv9OtFo,3133
141
+ lyrics_transcriber/frontend/src/components/AIFeedbackModal.tsx,sha256=kDmfdTgPzqNVPMbh6ztkVod5iXE7QAfgkMMyseO07ww,5602
139
142
  lyrics_transcriber/frontend/src/components/AddLyricsModal.tsx,sha256=ubJwQewryjUrXwpBkITQNu4POhoUtDbNA93cqa-yJKY,3416
140
143
  lyrics_transcriber/frontend/src/components/AgenticCorrectionMetrics.tsx,sha256=Yg6FG0LtrneRfAYeBu3crt_RdN-_o7FojtYhDMDKi0o,8595
144
+ lyrics_transcriber/frontend/src/components/AppHeader.tsx,sha256=5KUVADDv9cAs2WNX9M31utQIYHKMi81unzrCW3j1fl0,2396
141
145
  lyrics_transcriber/frontend/src/components/AudioPlayer.tsx,sha256=XOCz0VtGiAIBs1qnCwrAixwfgHbTSGpjEb1jQg8wqzc,5441
142
- lyrics_transcriber/frontend/src/components/CorrectedWordWithActions.tsx,sha256=4FK9vqjTMxnwlqxZ2E349H1S-X6SqLAYfj5U5AyuGtI,4764
146
+ lyrics_transcriber/frontend/src/components/CorrectedWordWithActions.tsx,sha256=lcOQhSQBuTBv-adGB4uOb66qR-uX4OuN5P0CfFMxmHo,4941
143
147
  lyrics_transcriber/frontend/src/components/CorrectionAnnotationModal.tsx,sha256=XtF5XNLL2ztm714tXql7rKi2BX4k_bsizpZ_ZCvpu8s,13368
144
148
  lyrics_transcriber/frontend/src/components/CorrectionDetailCard.tsx,sha256=Hp-i1iSB3pzrpPH2wIREtEHHaReimBaYi8vcSUUArlg,9512
145
149
  lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx,sha256=CoTZS9Z3pf4lfPrzpQ2hZvLqFvt-IarSGBSCxFxD-y4,6274
146
- lyrics_transcriber/frontend/src/components/DurationTimelineView.tsx,sha256=eylYwAKHTK_5n54njn9bfMkXTGvrqsXlu9tETqAlMtA,9815
150
+ lyrics_transcriber/frontend/src/components/DurationTimelineView.tsx,sha256=d950EHJ52ODkygUkdlO4QNta5Ru8h7DRZIqR8IjOlvQ,10121
147
151
  lyrics_transcriber/frontend/src/components/EditActionBar.tsx,sha256=nLRVA3m3bQFqLtqlYasn7WeZNXvPvpG0sXuIv5QXvDc,2174
148
- lyrics_transcriber/frontend/src/components/EditModal.tsx,sha256=sv-NCKMvso3UF1_fJKbzt_wAcDLAyLqRq_D24uQRrRw,24649
152
+ lyrics_transcriber/frontend/src/components/EditModal.tsx,sha256=4smUvxF-45k-SAGXwkoBJmV37-nWWkE7HsR9w1OS6x8,24687
149
153
  lyrics_transcriber/frontend/src/components/EditTimelineSection.tsx,sha256=VQy5fpzKBG_9ZLyWHB8b8Ii61YwckCOjnYf1oezY0d4,19586
150
- lyrics_transcriber/frontend/src/components/EditWordList.tsx,sha256=atl-9Z-24U-KWojwo0apTy1Y9DbQGoVo2dFX4P-1Z9E,13681
154
+ lyrics_transcriber/frontend/src/components/EditWordList.tsx,sha256=XN59JnNPYNI4KrSenW7cYC6zUIlK7GvlyRbj9eg-Eac,13716
151
155
  lyrics_transcriber/frontend/src/components/FileUpload.tsx,sha256=fwn2rMWtMLPTZLREMb3ps4prSf9nzxGwnjmeC6KYsJA,2383
152
156
  lyrics_transcriber/frontend/src/components/FindReplaceModal.tsx,sha256=U7duKns4IqNXwbWFbQfdyaswnvkSRpfsU0UG__-Serc,20192
153
- lyrics_transcriber/frontend/src/components/Header.tsx,sha256=KE8TirDEUgojgHjP9R4HTtCxaVr_CWumky-Es7xAGsE,18754
157
+ lyrics_transcriber/frontend/src/components/Header.tsx,sha256=UmQzQpsdLrtzi9U5HFDtvtr6vq9qZu3cnPDnT_T3QuI,18151
154
158
  lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx,sha256=TFo2HCr6k9bENsQm-AfT797ZyFLqvKDa8g5W-pw1v24,54256
155
159
  lyrics_transcriber/frontend/src/components/LyricsSynchronizer/SyncControls.tsx,sha256=j4rQjBQVbaPsp1ra_rvEoCqmX3JFJdfNnFvj3BvfsgQ,6069
156
- lyrics_transcriber/frontend/src/components/LyricsSynchronizer/TimelineCanvas.tsx,sha256=h-sAfDFm-DfayZbKuNJmbAqxmMr89oC26xI4WB45bxA,26896
160
+ lyrics_transcriber/frontend/src/components/LyricsSynchronizer/TimelineCanvas.tsx,sha256=DuQBAdF8bYcAYKNEWVklXSAlEykhIDQKbELq_4SEPCg,27415
157
161
  lyrics_transcriber/frontend/src/components/LyricsSynchronizer/UpcomingWordsBar.tsx,sha256=BXkEeo5yMgHkeOCBcZKqxMb1rspjXH-X5_6X9Hl7z3E,2588
158
162
  lyrics_transcriber/frontend/src/components/LyricsSynchronizer/index.tsx,sha256=jOAmlkodaGzceQLG11ihprFMcARVbeJ_qjMcUkQj5Oo,34275
159
163
  lyrics_transcriber/frontend/src/components/MetricsDashboard.tsx,sha256=33XpyHj0siBQivE8vLgliyiwmdsAfnNQh5Py4mnhXi8,1724
@@ -161,18 +165,18 @@ lyrics_transcriber/frontend/src/components/ModeSelectionModal.tsx,sha256=eihGI49
161
165
  lyrics_transcriber/frontend/src/components/ModeSelector.tsx,sha256=HnBAK_gFgNBJLtMC_ESMVdUapDjmqmoLX8pQeyHfpOw,2651
162
166
  lyrics_transcriber/frontend/src/components/ModelSelector.tsx,sha256=lfG_B5VAzSfrU0FqJl8XptN6DVt2kSljU96HMXo8mf4,559
163
167
  lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx,sha256=59ZhG5XsxUZ_dkK8BjTQhYmYP5Wv86uRR-xtuwFRK8c,5582
164
- lyrics_transcriber/frontend/src/components/ReferenceView.tsx,sha256=2ugpkVtxZLS6Al-lmYbMZj7d3w9e2qNNYKJjkSxZ_X8,10494
168
+ lyrics_transcriber/frontend/src/components/ReferenceView.tsx,sha256=_9idlSTHQ8YZqPslhpuW8R_6kAHGWPMC9GvikpwH-AY,10532
165
169
  lyrics_transcriber/frontend/src/components/ReplaceAllLyricsModal.tsx,sha256=pVlqHrSloxXZV_Ib8cbk1invF7WA3uge5b7pnFPe9Pc,12290
166
170
  lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx,sha256=VQg_gBFViAxQu9Z75o6rOsvmH5DZBjKq9FkU8aB_7mI,13790
167
171
  lyrics_transcriber/frontend/src/components/SegmentDetailsModal.tsx,sha256=6ME02FkFwCgDAxW49yW260N4vbr80eAJ332Ex811GOo,1643
168
172
  lyrics_transcriber/frontend/src/components/TimelineEditor.tsx,sha256=gJRCxdmJo80g0h5hq5AtDHK-HbOoYhMaQYvP2WgOuRI,13201
169
173
  lyrics_transcriber/frontend/src/components/TimingOffsetModal.tsx,sha256=aivGi6ehI6cDqwtoKBb6Eif8gpPqi0t3mJT8i5Feu7Q,4803
170
- lyrics_transcriber/frontend/src/components/TranscriptionView.tsx,sha256=LDGK-Ac4sNMoLNofAdSsZAnCOdlPk4k9Fse6ulhgjYM,11299
171
- lyrics_transcriber/frontend/src/components/WordDivider.tsx,sha256=tOs_4WZGlJQ1o7sZFGLhwUoyX2jSKMa6vLZqa-1vzKY,6590
174
+ lyrics_transcriber/frontend/src/components/TranscriptionView.tsx,sha256=SK5nVjey4Eg2_JiVAnJbOtNwDEmrKYlNb529F7Q0nLY,11337
175
+ lyrics_transcriber/frontend/src/components/WordDivider.tsx,sha256=ynib_j0w0q4iOYAk7D4IyZJCq71LykX7SaD9haGlZeI,6695
172
176
  lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx,sha256=ZVZ61rwrKLdlmhlNuSNR7-sgdl7JdBxVTeSeKO6K-3w,16321
173
177
  lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx,sha256=FpMn-0i1NFxdIHZN0dxHkWzIIsOEi9CJc_rQMpLyxVw,2031
174
- lyrics_transcriber/frontend/src/components/shared/components/Word.tsx,sha256=EcLslnFE-BIOm_7FwRxKEOnIDVoWpTrDz6MQGoH_SVg,2596
175
- lyrics_transcriber/frontend/src/components/shared/constants.ts,sha256=25q1qjCwzV-hR72wSb_rJSe4dVuQ0l-piLMoZSpynGQ,488
178
+ lyrics_transcriber/frontend/src/components/shared/components/Word.tsx,sha256=CXzepxI3Negx2cqdfqLNGgesNbbIcczomXed71FupNw,2676
179
+ lyrics_transcriber/frontend/src/components/shared/constants.ts,sha256=GByG5KFLJOX0iCs80_PLXxZKQ5FBX5Qw0Mg05Xf8Faw,1142
176
180
  lyrics_transcriber/frontend/src/components/shared/hooks/useWordClick.ts,sha256=eEgBHiKIWOzFK8eBzBgcQRv7StKpaPchqh3k2kFlwgY,6253
177
181
  lyrics_transcriber/frontend/src/components/shared/styles.ts,sha256=J1jCSuRqpk1mOFYAqJudhxeozH-q1bi-dsOibLukBJU,411
178
182
  lyrics_transcriber/frontend/src/components/shared/types.js,sha256=1DqoH1vIn6o1ng-XyBS6JRVVkf8Hj7ub_UD4x8loMjA,77
@@ -184,8 +188,8 @@ lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts,sha
184
188
  lyrics_transcriber/frontend/src/components/shared/utils/timingUtils.ts,sha256=s3xdwGPg6ltZEcQ4AzgpznAR-fLhCTCYW7pfXaD60JY,4597
185
189
  lyrics_transcriber/frontend/src/components/shared/utils/wordUtils.ts,sha256=bZbsvEgY3JoI15l4SdB51tHE33OkUxDH-WSG8doLcCQ,721
186
190
  lyrics_transcriber/frontend/src/hooks/useManualSync.ts,sha256=cP19QsK-o5uz-Udq8m5d4NhMaPupHEQQz7uf0aE4Hs8,19403
187
- lyrics_transcriber/frontend/src/main.tsx,sha256=qNDmjgzD2Dd4d9J42o1z0JcKBElsMWHpFIgEvI8kNi8,543
188
- lyrics_transcriber/frontend/src/theme.ts,sha256=9F2xyLct_gJmvLEZEhrYdKIahUsBzi5kgnydSWJHphE,3864
191
+ lyrics_transcriber/frontend/src/main.tsx,sha256=bd2cO-7CSbqQwJ-8N3p_xPJvTFmg5lcJi2I-WgkIb6k,337
192
+ lyrics_transcriber/frontend/src/theme.ts,sha256=bVq-h3lYZhqHbM9yE0Le6DmpJS9n_u76xe-bQ_SjGE8,12498
189
193
  lyrics_transcriber/frontend/src/types/global.d.ts,sha256=NvltPF-n4_1oRLfihD3oHXbdT7txMC8B6fhCgvNY-jk,191
190
194
  lyrics_transcriber/frontend/src/types.js,sha256=1DqoH1vIn6o1ng-XyBS6JRVVkf8Hj7ub_UD4x8loMjA,77
191
195
  lyrics_transcriber/frontend/src/types.ts,sha256=gQBu13DDbSBUtbI-TwzAlmlIYfOehXar4WuvZ9GkziE,4880
@@ -198,7 +202,7 @@ lyrics_transcriber/frontend/tsconfig.tsbuildinfo,sha256=TGnTUZG3ScMXJTHpm1GmyxtE
198
202
  lyrics_transcriber/frontend/update_version.js,sha256=PxkqCnsucXnXiIqutsanVcx00Gq4k7pgCYj_uXCa4qw,411
199
203
  lyrics_transcriber/frontend/vite.config.d.ts,sha256=S5bdGf0pSdKM6A6RNBKwAm3EIeW_bDHYfHtesRtXU7Q,76
200
204
  lyrics_transcriber/frontend/vite.config.js,sha256=P4GuPgRZzwEWPQZpyujUe7eA3mjPoFAe2CgE5sQAXg8,232
201
- lyrics_transcriber/frontend/vite.config.ts,sha256=8FdW0dN8zDFqfhQSxX5h7sIu72X2piLYlp_TZYRQvBQ,216
205
+ lyrics_transcriber/frontend/vite.config.ts,sha256=EgliYm4wf_nx1mZOx6xx2Hu4aVAgoJ4jdbtsaXfawqI,306
202
206
  lyrics_transcriber/frontend/web_assets/android-chrome-192x192.png,sha256=lg-6aPF5mGLiuG7LyftZk_0RI41srmpA8wj-NkaaQms,17632
203
207
  lyrics_transcriber/frontend/web_assets/android-chrome-512x512.png,sha256=x-zuKT3NYsTqAWzhKRTZeD4-0uYoUjqMPZpKTChqNJ8,123447
204
208
  lyrics_transcriber/frontend/web_assets/apple-touch-icon.png,sha256=6y5vGra54w5oc8VP6sn2JjoQtN9hWTKn0YPhmdlmfU0,16188
@@ -209,7 +213,7 @@ lyrics_transcriber/frontend/web_assets/favicon-32x32.png,sha256=6TyrRMIw6G8dpG4_
209
213
  lyrics_transcriber/frontend/web_assets/favicon.ico,sha256=ZK7QvdBuZp0QxPkluCW4IKxfleFmFLp1KkG_d5xmx7E,15406
210
214
  lyrics_transcriber/frontend/web_assets/index.html,sha256=qqHYlM3VAy_3YJn3QgETGjR94XTWL3Ci_S-5_lHYgxw,830
211
215
  lyrics_transcriber/frontend/web_assets/nomad-karaoke-logo.png,sha256=jTTBFXV6hGJGolZYQ-dIjgQQbMsehk5XGtsllhLrdzg,212641
212
- lyrics_transcriber/frontend/yarn.lock,sha256=wtImLsCO1P1Lpkhc1jAN6IiHQ0As4xn39n0cwKoh4LM,131996
216
+ lyrics_transcriber/frontend/yarn.lock,sha256=baEFTcZVRQBGZGUKDvzTutfipBZcmoBQvHlM5wxguuc,130621
213
217
  lyrics_transcriber/lyrics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
214
218
  lyrics_transcriber/lyrics/base_lyrics_provider.py,sha256=SskR5RIKorLcHhNSpHV35_kCnSA027_OOO9E45Jbv88,9168
215
219
  lyrics_transcriber/lyrics/file_provider.py,sha256=WNd6mHMV2FhrnHiWBvxUxPkdVi47mbLE4hXaTYqStTM,4290
@@ -270,7 +274,7 @@ lyrics_transcriber/output/segment_resizer.py,sha256=rrgcQC28eExSAmGnm6ytkF-E-nH4
270
274
  lyrics_transcriber/output/subtitles.py,sha256=TW8IFTedj7-jHDyKKLYk1rFSFmuk8qysrI83Lkc3x-o,19555
271
275
  lyrics_transcriber/output/video.py,sha256=n6QtT3ljtx1t8CT9jmVTKSpdezF2gC0FJsYDDtkP5fE,24084
272
276
  lyrics_transcriber/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
273
- lyrics_transcriber/review/server.py,sha256=_05ul0MsddKf8iTIg-NASVYkl9kBRo0M3WhWBxp79i8,29462
277
+ lyrics_transcriber/review/server.py,sha256=pTeTniQWAeiPxH-I0lnPuAWNY9DyJjFvLIS7nUOYkxk,29459
274
278
  lyrics_transcriber/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
275
279
  lyrics_transcriber/storage/dropbox.py,sha256=Dyam1ULTkoxD1X5trkZ5dGp5XhBGCn998moC8IS9-68,9804
276
280
  lyrics_transcriber/transcribers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -280,8 +284,8 @@ lyrics_transcriber/transcribers/whisper.py,sha256=YcCB1ic9H6zL1GS0jD0emu8-qlcH0Q
280
284
  lyrics_transcriber/types.py,sha256=UJjaxhVd2o14AG4G8ToU598p0JeYdiTFjpG38jGCoYQ,27917
281
285
  lyrics_transcriber/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
282
286
  lyrics_transcriber/utils/word_utils.py,sha256=-cMGpj9UV4F6IsoDKAV2i1aiqSO8eI91HMAm_igtVMk,958
283
- karaoke_gen-0.75.53.dist-info/METADATA,sha256=DR2eCSIs1DM9Xudkimpy66AgxZRfYSYyzpBX-sxkhgE,20662
284
- karaoke_gen-0.75.53.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
285
- karaoke_gen-0.75.53.dist-info/entry_points.txt,sha256=xIyLe7K84ZyjO8L0_AmNectz93QjGSs5AkApMtlAd4g,160
286
- karaoke_gen-0.75.53.dist-info/licenses/LICENSE,sha256=81R_4XwMZDODHD7JcZeUR8IiCU8AD7Ajl6bmwR9tYDk,1074
287
- karaoke_gen-0.75.53.dist-info/RECORD,,
287
+ karaoke_gen-0.76.20.dist-info/METADATA,sha256=LuFlyEoDv5uHvTPpoUcAQChjNC1QdHnRBQzmdZRUPIw,20667
288
+ karaoke_gen-0.76.20.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
289
+ karaoke_gen-0.76.20.dist-info/entry_points.txt,sha256=xIyLe7K84ZyjO8L0_AmNectz93QjGSs5AkApMtlAd4g,160
290
+ karaoke_gen-0.76.20.dist-info/licenses/LICENSE,sha256=81R_4XwMZDODHD7JcZeUR8IiCU8AD7Ajl6bmwR9tYDk,1074
291
+ karaoke_gen-0.76.20.dist-info/RECORD,,
@@ -2,6 +2,10 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
+ <!-- Load Inter font to match karaoke-gen styling -->
6
+ <link rel="preconnect" href="https://fonts.googleapis.com">
7
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
8
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
5
9
  <link rel="icon" type="image/x-icon" href="/favicon.ico" />
6
10
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
7
11
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
@@ -9,7 +13,7 @@
9
13
  <link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png" />
10
14
  <link rel="icon" type="image/png" sizes="512x512" href="/android-chrome-512x512.png" />
11
15
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
12
- <title>Nomad Karaoke: Lyrics Review</title>
16
+ <title>Nomad Karaoke: Lyrics Transcription Review</title>
13
17
  </head>
14
18
  <body>
15
19
  <div id="root"></div>