karaoke-gen 0.73.1__tar.gz → 0.75.2__tar.gz

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 (286) hide show
  1. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/PKG-INFO +2 -1
  2. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/audio_fetcher.py +175 -11
  3. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/instrumental_review/server.py +56 -4
  4. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/instrumental_review/static/index.html +17 -1
  5. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/utils/remote_cli.py +57 -3
  6. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/pyproject.toml +2 -1
  7. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/LICENSE +0 -0
  8. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/README.md +0 -0
  9. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/__init__.py +0 -0
  10. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/audio_processor.py +0 -0
  11. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/config.py +0 -0
  12. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/file_handler.py +0 -0
  13. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/instrumental_review/__init__.py +0 -0
  14. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/instrumental_review/analyzer.py +0 -0
  15. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/instrumental_review/editor.py +0 -0
  16. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/instrumental_review/models.py +0 -0
  17. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/instrumental_review/waveform.py +0 -0
  18. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/karaoke_finalise/__init__.py +0 -0
  19. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/karaoke_finalise/karaoke_finalise.py +0 -0
  20. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/karaoke_gen.py +0 -0
  21. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/lyrics_processor.py +0 -0
  22. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/metadata.py +0 -0
  23. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/__init__.py +0 -0
  24. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/base.py +0 -0
  25. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/context.py +0 -0
  26. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/executors/__init__.py +0 -0
  27. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/executors/local.py +0 -0
  28. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/executors/remote.py +0 -0
  29. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/stages/__init__.py +0 -0
  30. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/stages/finalize.py +0 -0
  31. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/stages/render.py +0 -0
  32. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/stages/screens.py +0 -0
  33. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/stages/separation.py +0 -0
  34. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/pipeline/stages/transcription.py +0 -0
  35. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/resources/AvenirNext-Bold.ttf +0 -0
  36. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/resources/Montserrat-Bold.ttf +0 -0
  37. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/resources/Oswald-Bold.ttf +0 -0
  38. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/resources/Oswald-SemiBold.ttf +0 -0
  39. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/resources/Zurich_Cn_BT_Bold.ttf +0 -0
  40. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/style_loader.py +0 -0
  41. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/utils/__init__.py +0 -0
  42. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/utils/bulk_cli.py +0 -0
  43. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/utils/cli_args.py +0 -0
  44. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/utils/gen_cli.py +0 -0
  45. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/video_background_processor.py +0 -0
  46. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/karaoke_gen/video_generator.py +0 -0
  47. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/__init__.py +0 -0
  48. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/cli/__init__.py +0 -0
  49. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/cli/cli_main.py +0 -0
  50. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/core/__init__.py +0 -0
  51. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/core/config.py +0 -0
  52. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/core/controller.py +0 -0
  53. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/__init__.py +0 -0
  54. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/__init__.py +0 -0
  55. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/adapter.py +0 -0
  56. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/agent.py +0 -0
  57. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/feedback/aggregator.py +0 -0
  58. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/feedback/collector.py +0 -0
  59. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/feedback/retention.py +0 -0
  60. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/feedback/store.py +0 -0
  61. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/__init__.py +0 -0
  62. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/ambiguous.py +0 -0
  63. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/background_vocals.py +0 -0
  64. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/base.py +0 -0
  65. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/complex_multi_error.py +0 -0
  66. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/extra_words.py +0 -0
  67. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/no_error.py +0 -0
  68. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/punctuation.py +0 -0
  69. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/registry.py +0 -0
  70. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/repeated_section.py +0 -0
  71. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/sound_alike.py +0 -0
  72. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/__init__.py +0 -0
  73. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/ai_correction.py +0 -0
  74. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/correction_session.py +0 -0
  75. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/enums.py +0 -0
  76. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/human_feedback.py +0 -0
  77. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/learning_data.py +0 -0
  78. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/observability_metrics.py +0 -0
  79. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/schemas.py +0 -0
  80. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/utils.py +0 -0
  81. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/observability/__init__.py +0 -0
  82. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/observability/langfuse_integration.py +0 -0
  83. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/observability/metrics.py +0 -0
  84. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/observability/performance.py +0 -0
  85. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/prompts/__init__.py +0 -0
  86. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/prompts/classifier.py +0 -0
  87. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/__init__.py +0 -0
  88. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/base.py +0 -0
  89. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/circuit_breaker.py +0 -0
  90. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/config.py +0 -0
  91. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/constants.py +0 -0
  92. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/health.py +0 -0
  93. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/langchain_bridge.py +0 -0
  94. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/model_factory.py +0 -0
  95. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/response_cache.py +0 -0
  96. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/response_parser.py +0 -0
  97. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/retry_executor.py +0 -0
  98. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/router.py +0 -0
  99. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/workflows/__init__.py +0 -0
  100. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/workflows/consensus_workflow.py +0 -0
  101. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/workflows/correction_graph.py +0 -0
  102. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/workflows/feedback_workflow.py +0 -0
  103. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/anchor_sequence.py +0 -0
  104. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/corrector.py +0 -0
  105. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/feedback/__init__.py +0 -0
  106. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/feedback/schemas.py +0 -0
  107. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/feedback/store.py +0 -0
  108. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/__init__.py +0 -0
  109. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/base.py +0 -0
  110. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/extend_anchor.py +0 -0
  111. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/levenshtein.py +0 -0
  112. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/llm.py +0 -0
  113. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/llm_providers.py +0 -0
  114. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/no_space_punct_match.py +0 -0
  115. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/relaxed_word_count_match.py +0 -0
  116. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/repeat.py +0 -0
  117. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/sound_alike.py +0 -0
  118. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/syllables_match.py +0 -0
  119. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/word_count_match.py +0 -0
  120. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/word_operations.py +0 -0
  121. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/operations.py +0 -0
  122. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/phrase_analyzer.py +0 -0
  123. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/correction/text_utils.py +0 -0
  124. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/.gitignore +0 -0
  125. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/.yarn/releases/yarn-4.7.0.cjs +0 -0
  126. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/.yarnrc.yml +0 -0
  127. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/README.md +0 -0
  128. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/REPLACE_ALL_FUNCTIONALITY.md +0 -0
  129. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/__init__.py +0 -0
  130. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/eslint.config.js +0 -0
  131. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/index.html +0 -0
  132. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/package.json +0 -0
  133. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/android-chrome-192x192.png +0 -0
  134. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/android-chrome-512x512.png +0 -0
  135. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/apple-touch-icon.png +0 -0
  136. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/favicon-16x16.png +0 -0
  137. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/favicon-32x32.png +0 -0
  138. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/favicon.ico +0 -0
  139. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/nomad-karaoke-logo.png +0 -0
  140. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/App.tsx +0 -0
  141. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/api.ts +0 -0
  142. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/AIFeedbackModal.tsx +0 -0
  143. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/AddLyricsModal.tsx +0 -0
  144. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/AgenticCorrectionMetrics.tsx +0 -0
  145. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/AudioPlayer.tsx +0 -0
  146. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/CorrectedWordWithActions.tsx +0 -0
  147. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/CorrectionAnnotationModal.tsx +0 -0
  148. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/CorrectionDetailCard.tsx +0 -0
  149. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx +0 -0
  150. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/DurationTimelineView.tsx +0 -0
  151. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/EditActionBar.tsx +0 -0
  152. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/EditModal.tsx +0 -0
  153. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/EditTimelineSection.tsx +0 -0
  154. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/EditWordList.tsx +0 -0
  155. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/FileUpload.tsx +0 -0
  156. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/FindReplaceModal.tsx +0 -0
  157. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/Header.tsx +0 -0
  158. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx +0 -0
  159. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/LyricsSynchronizer/SyncControls.tsx +0 -0
  160. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/LyricsSynchronizer/TimelineCanvas.tsx +0 -0
  161. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/LyricsSynchronizer/UpcomingWordsBar.tsx +0 -0
  162. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/LyricsSynchronizer/index.tsx +0 -0
  163. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/MetricsDashboard.tsx +0 -0
  164. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ModeSelectionModal.tsx +0 -0
  165. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ModeSelector.tsx +0 -0
  166. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ModelSelector.tsx +0 -0
  167. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx +0 -0
  168. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ReferenceView.tsx +0 -0
  169. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ReplaceAllLyricsModal.tsx +0 -0
  170. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx +0 -0
  171. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/SegmentDetailsModal.tsx +0 -0
  172. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/TimelineEditor.tsx +0 -0
  173. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/TimingOffsetModal.tsx +0 -0
  174. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/TranscriptionView.tsx +0 -0
  175. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/WordDivider.tsx +0 -0
  176. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx +0 -0
  177. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx +0 -0
  178. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/components/Word.tsx +0 -0
  179. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/constants.ts +0 -0
  180. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/hooks/useWordClick.ts +0 -0
  181. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/styles.ts +0 -0
  182. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/types.js +0 -0
  183. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/types.ts +0 -0
  184. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts +0 -0
  185. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/localStorage.ts +0 -0
  186. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/referenceLineCalculator.ts +0 -0
  187. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts +0 -0
  188. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/timingUtils.ts +0 -0
  189. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/wordUtils.ts +0 -0
  190. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/hooks/useManualSync.ts +0 -0
  191. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/main.tsx +0 -0
  192. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/theme.ts +0 -0
  193. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/types/global.d.ts +0 -0
  194. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/types.js +0 -0
  195. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/types.ts +0 -0
  196. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/validation.ts +0 -0
  197. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/vite-env.d.ts +0 -0
  198. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/tsconfig.app.json +0 -0
  199. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/tsconfig.json +0 -0
  200. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/tsconfig.node.json +0 -0
  201. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/tsconfig.tsbuildinfo +0 -0
  202. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/update_version.js +0 -0
  203. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/vite.config.d.ts +0 -0
  204. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/vite.config.js +0 -0
  205. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/vite.config.ts +0 -0
  206. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/android-chrome-192x192.png +0 -0
  207. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/android-chrome-512x512.png +0 -0
  208. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/apple-touch-icon.png +0 -0
  209. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/assets/index-COYImAcx.js +0 -0
  210. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/assets/index-COYImAcx.js.map +0 -0
  211. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/favicon-16x16.png +0 -0
  212. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/favicon-32x32.png +0 -0
  213. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/favicon.ico +0 -0
  214. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/index.html +0 -0
  215. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/nomad-karaoke-logo.png +0 -0
  216. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/frontend/yarn.lock +0 -0
  217. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/__init__.py +0 -0
  218. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/base_lyrics_provider.py +0 -0
  219. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/file_provider.py +0 -0
  220. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/genius.py +0 -0
  221. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/lrclib.py +0 -0
  222. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/musixmatch.py +0 -0
  223. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/spotify.py +0 -0
  224. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/user_input_provider.py +0 -0
  225. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/__init__.py +0 -0
  226. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/__init__.py +0 -0
  227. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/ass.py +0 -0
  228. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/ass_specs.txt +0 -0
  229. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/config.py +0 -0
  230. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/constants.py +0 -0
  231. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/event.py +0 -0
  232. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/formatters.py +0 -0
  233. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/lyrics_line.py +0 -0
  234. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/lyrics_screen.py +0 -0
  235. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/section_detector.py +0 -0
  236. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/section_screen.py +0 -0
  237. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/style.py +0 -0
  238. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdg.py +0 -0
  239. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/__init__.py +0 -0
  240. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/cdg.py +0 -0
  241. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/composer.py +0 -0
  242. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/config.py +0 -0
  243. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/images/instrumental.png +0 -0
  244. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/images/intro.png +0 -0
  245. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/pack.py +0 -0
  246. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/render.py +0 -0
  247. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/centertexttoplogobottomtext.png +0 -0
  248. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/circlein.png +0 -0
  249. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/circleout.png +0 -0
  250. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/fizzle.png +0 -0
  251. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/largecentertexttoplogo.png +0 -0
  252. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/rectangle.png +0 -0
  253. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/spiral.png +0 -0
  254. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/topleftmusicalnotes.png +0 -0
  255. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/wipein.png +0 -0
  256. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/wipeleft.png +0 -0
  257. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/wipeout.png +0 -0
  258. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/wiperight.png +0 -0
  259. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/utils.py +0 -0
  260. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/countdown_processor.py +0 -0
  261. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/AvenirNext-Bold.ttf +0 -0
  262. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/DMSans-VariableFont_opsz,wght.ttf +0 -0
  263. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/DMSerifDisplay-Regular.ttf +0 -0
  264. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/Oswald-SemiBold.ttf +0 -0
  265. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/Zurich_Cn_BT_Bold.ttf +0 -0
  266. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/arial.ttf +0 -0
  267. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/georgia.ttf +0 -0
  268. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/verdana.ttf +0 -0
  269. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/generator.py +0 -0
  270. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/lrc_to_cdg.py +0 -0
  271. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/lyrics_file.py +0 -0
  272. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/plain_text.py +0 -0
  273. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/segment_resizer.py +0 -0
  274. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/subtitles.py +0 -0
  275. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/output/video.py +0 -0
  276. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/review/__init__.py +0 -0
  277. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/review/server.py +0 -0
  278. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/storage/__init__.py +0 -0
  279. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/storage/dropbox.py +0 -0
  280. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/transcribers/__init__.py +0 -0
  281. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/transcribers/audioshake.py +0 -0
  282. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/transcribers/base_transcriber.py +0 -0
  283. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/transcribers/whisper.py +0 -0
  284. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/types.py +0 -0
  285. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/utils/__init__.py +0 -0
  286. {karaoke_gen-0.73.1 → karaoke_gen-0.75.2}/lyrics_transcriber_temp/lyrics_transcriber/utils/word_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: karaoke-gen
3
- Version: 0.73.1
3
+ Version: 0.75.2
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
@@ -48,6 +48,7 @@ Requires-Dist: lyrics-converter (>=0.2.1)
48
48
  Requires-Dist: lyricsgenius (>=3)
49
49
  Requires-Dist: matplotlib (>=3)
50
50
  Requires-Dist: metaphone (>=0.6)
51
+ Requires-Dist: nest-asyncio (>=1.5)
51
52
  Requires-Dist: nltk (>=3.9)
52
53
  Requires-Dist: numpy (>=2)
53
54
  Requires-Dist: ollama (>=0.4.7)
@@ -270,6 +270,47 @@ class FlacFetchAudioFetcher(AudioFetcher):
270
270
  self._ops_api_key = ops_api_key or os.environ.get("OPS_API_KEY")
271
271
  self._provider_priority = provider_priority
272
272
  self._manager = None
273
+ self._transmission_available = None # Cached result of Transmission check
274
+
275
+ def _check_transmission_available(self) -> bool:
276
+ """
277
+ Check if Transmission daemon is available for torrent downloads.
278
+
279
+ This prevents adding tracker providers (Redacted/OPS) when Transmission
280
+ isn't running, which would result in search results that can't be downloaded.
281
+
282
+ Returns:
283
+ True if Transmission is available and responsive, False otherwise.
284
+ """
285
+ if self._transmission_available is not None:
286
+ self.logger.info(f"[Transmission] Using cached status: available={self._transmission_available}")
287
+ return self._transmission_available
288
+
289
+ host = os.environ.get("TRANSMISSION_HOST", "localhost")
290
+ port = int(os.environ.get("TRANSMISSION_PORT", "9091"))
291
+ self.logger.info(f"[Transmission] Checking availability at {host}:{port}")
292
+
293
+ try:
294
+ import transmission_rpc
295
+ self.logger.info(f"[Transmission] transmission_rpc imported successfully")
296
+
297
+ client = transmission_rpc.Client(host=host, port=port, timeout=5)
298
+ self.logger.info(f"[Transmission] Client created, calling session_stats()...")
299
+
300
+ # Simple test to verify connection works
301
+ stats = client.session_stats()
302
+ self.logger.info(f"[Transmission] Connected! Download dir: {getattr(stats, 'download_dir', 'unknown')}")
303
+
304
+ self._transmission_available = True
305
+ except ImportError as e:
306
+ self._transmission_available = False
307
+ self.logger.warning(f"[Transmission] transmission_rpc not installed: {e}")
308
+ except Exception as e:
309
+ self._transmission_available = False
310
+ self.logger.warning(f"[Transmission] Connection failed to {host}:{port}: {type(e).__name__}: {e}")
311
+
312
+ self.logger.info(f"[Transmission] Final status: available={self._transmission_available}")
313
+ return self._transmission_available
273
314
 
274
315
  def _get_manager(self):
275
316
  """Lazily initialize and return the FetchManager."""
@@ -280,30 +321,46 @@ class FlacFetchAudioFetcher(AudioFetcher):
280
321
  from flacfetch.downloaders.youtube import YoutubeDownloader
281
322
 
282
323
  # Try to import TorrentDownloader (has optional dependencies)
324
+ TorrentDownloader = None
283
325
  try:
284
326
  from flacfetch.downloaders.torrent import TorrentDownloader
285
327
  except ImportError:
286
- TorrentDownloader = None
287
328
  self.logger.debug("TorrentDownloader not available (missing dependencies)")
288
329
 
289
330
  self._manager = FetchManager()
290
331
 
332
+ # Only add tracker providers if we can actually download from them
333
+ # This requires both TorrentDownloader and a running Transmission daemon
334
+ has_torrent_downloader = TorrentDownloader is not None
335
+ transmission_available = self._check_transmission_available()
336
+ can_use_trackers = has_torrent_downloader and transmission_available
337
+
338
+ self.logger.info(
339
+ f"[FlacFetcher] Provider setup: TorrentDownloader={has_torrent_downloader}, "
340
+ f"Transmission={transmission_available}, can_use_trackers={can_use_trackers}"
341
+ )
342
+
343
+ if not can_use_trackers and (self._redacted_api_key or self._ops_api_key):
344
+ self.logger.warning(
345
+ "[FlacFetcher] Tracker providers (Redacted/OPS) DISABLED: "
346
+ f"TorrentDownloader={has_torrent_downloader}, Transmission={transmission_available}. "
347
+ "Only YouTube sources will be used."
348
+ )
349
+
291
350
  # Add providers and downloaders based on available API keys
292
- if self._redacted_api_key:
351
+ if self._redacted_api_key and can_use_trackers:
293
352
  from flacfetch.providers.redacted import RedactedProvider
294
353
 
295
354
  self._manager.add_provider(RedactedProvider(api_key=self._redacted_api_key))
296
- if TorrentDownloader:
297
- self._manager.register_downloader("Redacted", TorrentDownloader())
298
- self.logger.debug("Added Redacted provider")
355
+ self._manager.register_downloader("Redacted", TorrentDownloader())
356
+ self.logger.info("[FlacFetcher] Added Redacted provider with TorrentDownloader")
299
357
 
300
- if self._ops_api_key:
358
+ if self._ops_api_key and can_use_trackers:
301
359
  from flacfetch.providers.ops import OPSProvider
302
360
 
303
361
  self._manager.add_provider(OPSProvider(api_key=self._ops_api_key))
304
- if TorrentDownloader:
305
- self._manager.register_downloader("OPS", TorrentDownloader())
306
- self.logger.debug("Added OPS provider")
362
+ self._manager.register_downloader("OPS", TorrentDownloader())
363
+ self.logger.info("[FlacFetcher] Added OPS provider with TorrentDownloader")
307
364
 
308
365
  # Always add YouTube as a fallback provider with its downloader
309
366
  self._manager.add_provider(YoutubeProvider())
@@ -520,13 +577,15 @@ class FlacFetchAudioFetcher(AudioFetcher):
520
577
  self.logger.info(f"Downloading from {getattr(selected, 'source_name', 'Unknown')}...")
521
578
 
522
579
  try:
523
- filepath = manager.download(
580
+ # Use interruptible download so Ctrl+C works during torrent downloads
581
+ filepath = self._interruptible_download(
582
+ manager,
524
583
  selected,
525
584
  output_path=output_dir,
526
585
  output_filename=output_filename,
527
586
  )
528
587
 
529
- if filepath is None:
588
+ if not filepath:
530
589
  raise DownloadError(f"Download returned no file path for: {artist} - {title}")
531
590
 
532
591
  self.logger.info(f"Downloaded to: {filepath}")
@@ -612,6 +671,111 @@ class FlacFetchAudioFetcher(AudioFetcher):
612
671
  signal.signal(signal.SIGINT, original_handler)
613
672
  _interrupt_requested = False
614
673
 
674
+ def _interruptible_download(self, manager, selected, output_path: str, output_filename: str) -> str:
675
+ """
676
+ Run download in a way that can be interrupted by Ctrl+C.
677
+
678
+ The flacfetch/transmission download is a blocking operation that doesn't
679
+ respond to SIGINT while running (especially for torrent downloads).
680
+ This method runs it in a background thread and periodically checks for interrupts.
681
+
682
+ Args:
683
+ manager: The FetchManager instance
684
+ selected: The selected result to download
685
+ output_path: Directory to save the file
686
+ output_filename: Filename to save as
687
+
688
+ Returns:
689
+ Path to the downloaded file
690
+
691
+ Raises:
692
+ UserCancelledError: If user presses Ctrl+C during download
693
+ DownloadError: If download fails
694
+ """
695
+ global _interrupt_requested
696
+ _interrupt_requested = False
697
+ result_container = {"filepath": None, "error": None}
698
+ was_cancelled = False
699
+
700
+ def do_download():
701
+ try:
702
+ result_container["filepath"] = manager.download(
703
+ selected,
704
+ output_path=output_path,
705
+ output_filename=output_filename,
706
+ )
707
+ except Exception as e:
708
+ result_container["error"] = e
709
+
710
+ # Set up signal handler for immediate response to Ctrl+C
711
+ original_handler = signal.getsignal(signal.SIGINT)
712
+
713
+ def interrupt_handler(signum, frame):
714
+ global _interrupt_requested
715
+ _interrupt_requested = True
716
+ # Print immediately so user knows it was received
717
+ print("\nCancelling download... please wait (may take a few seconds)", file=sys.stderr)
718
+
719
+ signal.signal(signal.SIGINT, interrupt_handler)
720
+
721
+ try:
722
+ # Start download in background thread
723
+ download_thread = threading.Thread(target=do_download, daemon=True)
724
+ download_thread.start()
725
+
726
+ # Wait for completion with periodic interrupt checks
727
+ while download_thread.is_alive():
728
+ download_thread.join(timeout=0.2) # Check every 200ms
729
+ if _interrupt_requested:
730
+ was_cancelled = True
731
+ # Clean up any pending torrents before raising
732
+ self._cleanup_transmission_torrents(selected)
733
+ raise UserCancelledError("Download cancelled by user (Ctrl+C)")
734
+
735
+ # Check for errors from the download
736
+ if result_container["error"] is not None:
737
+ raise result_container["error"]
738
+
739
+ return result_container["filepath"]
740
+
741
+ finally:
742
+ # Restore original signal handler
743
+ signal.signal(signal.SIGINT, original_handler)
744
+ _interrupt_requested = False
745
+
746
+ def _cleanup_transmission_torrents(self, selected) -> None:
747
+ """
748
+ Clean up any torrents in Transmission that were started for this download.
749
+
750
+ Called when a download is cancelled to remove incomplete torrents and their data.
751
+
752
+ Args:
753
+ selected: The selected result that was being downloaded
754
+ """
755
+ try:
756
+ import transmission_rpc
757
+ host = os.environ.get("TRANSMISSION_HOST", "localhost")
758
+ port = int(os.environ.get("TRANSMISSION_PORT", "9091"))
759
+ client = transmission_rpc.Client(host=host, port=port, timeout=5)
760
+
761
+ # Get the release name to match against torrents
762
+ release_name = getattr(selected, 'name', None) or getattr(selected, 'title', None)
763
+ if not release_name:
764
+ self.logger.debug("[Transmission] No release name to match for cleanup")
765
+ return
766
+
767
+ # Find and remove matching incomplete torrents
768
+ torrents = client.get_torrents()
769
+ for torrent in torrents:
770
+ # Match by name similarity and incomplete status
771
+ if torrent.progress < 100 and release_name.lower() in torrent.name.lower():
772
+ self.logger.info(f"[Transmission] Removing cancelled torrent: {torrent.name}")
773
+ client.remove_torrent(torrent.id, delete_data=True)
774
+
775
+ except Exception as e:
776
+ # Don't fail the cancellation if cleanup fails
777
+ self.logger.debug(f"[Transmission] Cleanup failed (non-fatal): {e}")
778
+
615
779
  def _interactive_select(self, results: list, artist: str, title: str) -> object:
616
780
  """
617
781
  Present search results to the user for interactive selection.
@@ -11,6 +11,7 @@ Similar pattern to LyricsTranscriber's ReviewServer.
11
11
  import logging
12
12
  import os
13
13
  from pathlib import Path
14
+ import socket
14
15
  import threading
15
16
  import webbrowser
16
17
  from typing import List, Optional
@@ -358,23 +359,74 @@ class InstrumentalReviewServer:
358
359
  </body>
359
360
  </html>"""
360
361
 
362
+ @staticmethod
363
+ def _is_port_available(host: str, port: int) -> bool:
364
+ """Check if a port is available for binding."""
365
+ try:
366
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
367
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
368
+ sock.bind((host, port))
369
+ return True
370
+ except OSError:
371
+ return False
372
+
373
+ @staticmethod
374
+ def _find_available_port(host: str, preferred_port: int, max_attempts: int = 100) -> int:
375
+ """
376
+ Find an available port, starting with the preferred port.
377
+
378
+ Args:
379
+ host: Host to bind to
380
+ preferred_port: The preferred port to try first
381
+ max_attempts: Maximum number of ports to try
382
+
383
+ Returns:
384
+ An available port number
385
+
386
+ Raises:
387
+ RuntimeError: If no available port could be found
388
+ """
389
+ # Try the preferred port first
390
+ if InstrumentalReviewServer._is_port_available(host, preferred_port):
391
+ return preferred_port
392
+
393
+ # Try subsequent ports
394
+ for offset in range(1, max_attempts):
395
+ port = preferred_port + offset
396
+ if port > 65535:
397
+ break
398
+ if InstrumentalReviewServer._is_port_available(host, port):
399
+ return port
400
+
401
+ # Last resort: let the OS assign a port
402
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
403
+ sock.bind((host, 0))
404
+ return sock.getsockname()[1]
405
+
361
406
  def start_and_open_browser(self, port: int = 8765) -> str:
362
407
  """
363
408
  Start server, open browser, and block until selection is submitted.
364
409
 
365
410
  Args:
366
- port: Port to run the server on
411
+ port: Preferred port to run the server on. If unavailable, will
412
+ automatically find an available port.
367
413
 
368
414
  Returns:
369
415
  The user's selection ("clean", "with_backing", or "custom")
370
416
  """
371
417
  self._app = self._create_app()
372
418
 
419
+ # Find an available port (handles concurrent CLI instances)
420
+ host = "127.0.0.1"
421
+ actual_port = self._find_available_port(host, port)
422
+ if actual_port != port:
423
+ logger.info(f"Port {port} in use, using port {actual_port} instead")
424
+
373
425
  # Run uvicorn in a separate thread
374
426
  config = uvicorn.Config(
375
427
  self._app,
376
- host="127.0.0.1",
377
- port=port,
428
+ host=host,
429
+ port=actual_port,
378
430
  log_level="warning",
379
431
  )
380
432
  server = uvicorn.Server(config)
@@ -389,7 +441,7 @@ class InstrumentalReviewServer:
389
441
  import time
390
442
  time.sleep(0.5)
391
443
 
392
- url = f"http://localhost:{port}/"
444
+ url = f"http://localhost:{actual_port}/"
393
445
  logger.info(f"Instrumental review server started at {url}")
394
446
 
395
447
  # Open browser
@@ -1428,9 +1428,25 @@
1428
1428
  <div class="success-screen">
1429
1429
  <h2>✓ Selection Submitted</h2>
1430
1430
  <p>You selected: <strong>${escapeHtml(selectionLabel)}</strong></p>
1431
- <p style="color: var(--text-muted);">You can close this window now.</p>
1431
+ <p id="close-msg" style="color: var(--text-muted);">Closing in <span id="countdown">2</span>s...</p>
1432
1432
  </div>
1433
1433
  `;
1434
+
1435
+ // Auto-close window after 2 seconds
1436
+ let countdown = 2;
1437
+ const countdownEl = document.getElementById('countdown');
1438
+ const countdownInterval = setInterval(() => {
1439
+ countdown--;
1440
+ if (countdownEl) countdownEl.textContent = countdown;
1441
+ if (countdown <= 0) {
1442
+ clearInterval(countdownInterval);
1443
+ // Try to close the window (works for windows opened by script)
1444
+ window.close();
1445
+ // If window.close() didn't work, update message
1446
+ const msg = document.getElementById('close-msg');
1447
+ if (msg) msg.textContent = 'You can close this window now.';
1448
+ }
1449
+ }, 1000);
1434
1450
  } catch (error) {
1435
1451
  showError(error.message);
1436
1452
  if (btn) {
@@ -1331,6 +1331,54 @@ class JobMonitor:
1331
1331
  """Get user-friendly description for a status."""
1332
1332
  return self.STATUS_DESCRIPTIONS.get(status, status)
1333
1333
 
1334
+ def _show_download_progress(self, job_data: Dict[str, Any]) -> None:
1335
+ """Show detailed download progress during audio download."""
1336
+ try:
1337
+ # Get provider from job state_data
1338
+ state_data = job_data.get('state_data', {})
1339
+ provider = state_data.get('selected_audio_provider', 'unknown')
1340
+
1341
+ # For non-torrent providers (YouTube), just show simple message
1342
+ if provider.lower() == 'youtube':
1343
+ self.logger.info(f" [Downloading from YouTube...]")
1344
+ return
1345
+
1346
+ # Query health endpoint for transmission status (torrent providers)
1347
+ health_url = f"{self.config.service_url}/api/health/detailed"
1348
+ response = requests.get(health_url, timeout=5)
1349
+
1350
+ if response.status_code == 200:
1351
+ health = response.json()
1352
+ transmission = health.get('dependencies', {}).get('transmission', {})
1353
+
1354
+ if transmission.get('available'):
1355
+ torrents = transmission.get('torrents', [])
1356
+ if torrents:
1357
+ # Show info about active torrents
1358
+ for t in torrents:
1359
+ progress = t.get('progress', 0)
1360
+ peers = t.get('peers', 0)
1361
+ speed = t.get('download_speed', 0)
1362
+ stalled = t.get('stalled', False)
1363
+
1364
+ if stalled:
1365
+ self.logger.info(f" [Downloading from {provider}] {progress:.1f}% - STALLED (no peers)")
1366
+ elif progress < 100:
1367
+ self.logger.info(f" [Downloading from {provider}] {progress:.1f}% @ {speed:.1f} KB/s ({peers} peers)")
1368
+ else:
1369
+ self.logger.info(f" [Downloading from {provider}] Complete, processing...")
1370
+ else:
1371
+ # No torrents - might be starting or YouTube download
1372
+ self.logger.info(f" [Downloading from {provider}] Starting download...")
1373
+ else:
1374
+ self.logger.info(f" [Downloading from {provider}] Transmission not available - download may fail")
1375
+ else:
1376
+ self.logger.info(f" [Downloading from {provider}]...")
1377
+
1378
+ except Exception as e:
1379
+ # Fall back to simple message
1380
+ self.logger.info(f" [Downloading audio...]")
1381
+
1334
1382
  def open_browser(self, url: str) -> None:
1335
1383
  """Open URL in the default browser."""
1336
1384
  system = platform.system()
@@ -2067,9 +2115,15 @@ class JobMonitor:
2067
2115
  self._polls_without_updates = 0
2068
2116
  else:
2069
2117
  self._polls_without_updates += 1
2070
- if self._polls_without_updates >= self._heartbeat_interval:
2071
- description = self._get_status_description(status)
2072
- self.logger.info(f" [Still processing: {description}]")
2118
+ # More frequent updates during audio download (every poll)
2119
+ heartbeat_threshold = 1 if status == 'downloading_audio' else self._heartbeat_interval
2120
+ if self._polls_without_updates >= heartbeat_threshold:
2121
+ if status == 'downloading_audio':
2122
+ # Show detailed download progress including transmission status
2123
+ self._show_download_progress(job_data)
2124
+ else:
2125
+ description = self._get_status_description(status)
2126
+ self.logger.info(f" [Still processing: {description}]")
2073
2127
  self._polls_without_updates = 0
2074
2128
 
2075
2129
  # Handle human interaction points
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "karaoke-gen"
3
- version = "0.73.1"
3
+ version = "0.75.2"
4
4
  description = "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
  authors = ["Andrew Beveridge <andrew@beveridge.uk>"]
6
6
  license = "MIT"
@@ -57,6 +57,7 @@ syllables = ">=1"
57
57
  fonttools = ">=4.55"
58
58
  ollama = ">=0.4.7"
59
59
  shortuuid = ">=1.0.13"
60
+ nest-asyncio = ">=1.5"
60
61
  openai = ">=1.63.2"
61
62
  langgraph = ">=0.2.0"
62
63
  langchain = ">=0.3.0"
File without changes
File without changes