karaoke-gen 0.57.0__py3-none-any.whl → 0.71.23__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 (268) hide show
  1. karaoke_gen/audio_fetcher.py +461 -0
  2. karaoke_gen/audio_processor.py +407 -30
  3. karaoke_gen/config.py +62 -113
  4. karaoke_gen/file_handler.py +32 -59
  5. karaoke_gen/karaoke_finalise/karaoke_finalise.py +148 -67
  6. karaoke_gen/karaoke_gen.py +270 -61
  7. karaoke_gen/lyrics_processor.py +13 -1
  8. karaoke_gen/metadata.py +78 -73
  9. karaoke_gen/pipeline/__init__.py +87 -0
  10. karaoke_gen/pipeline/base.py +215 -0
  11. karaoke_gen/pipeline/context.py +230 -0
  12. karaoke_gen/pipeline/executors/__init__.py +21 -0
  13. karaoke_gen/pipeline/executors/local.py +159 -0
  14. karaoke_gen/pipeline/executors/remote.py +257 -0
  15. karaoke_gen/pipeline/stages/__init__.py +27 -0
  16. karaoke_gen/pipeline/stages/finalize.py +202 -0
  17. karaoke_gen/pipeline/stages/render.py +165 -0
  18. karaoke_gen/pipeline/stages/screens.py +139 -0
  19. karaoke_gen/pipeline/stages/separation.py +191 -0
  20. karaoke_gen/pipeline/stages/transcription.py +191 -0
  21. karaoke_gen/style_loader.py +531 -0
  22. karaoke_gen/utils/bulk_cli.py +6 -0
  23. karaoke_gen/utils/cli_args.py +424 -0
  24. karaoke_gen/utils/gen_cli.py +26 -261
  25. karaoke_gen/utils/remote_cli.py +1815 -0
  26. karaoke_gen/video_background_processor.py +351 -0
  27. karaoke_gen-0.71.23.dist-info/METADATA +610 -0
  28. karaoke_gen-0.71.23.dist-info/RECORD +275 -0
  29. {karaoke_gen-0.57.0.dist-info → karaoke_gen-0.71.23.dist-info}/WHEEL +1 -1
  30. {karaoke_gen-0.57.0.dist-info → karaoke_gen-0.71.23.dist-info}/entry_points.txt +1 -0
  31. lyrics_transcriber/__init__.py +10 -0
  32. lyrics_transcriber/cli/__init__.py +0 -0
  33. lyrics_transcriber/cli/cli_main.py +285 -0
  34. lyrics_transcriber/core/__init__.py +0 -0
  35. lyrics_transcriber/core/config.py +50 -0
  36. lyrics_transcriber/core/controller.py +520 -0
  37. lyrics_transcriber/correction/__init__.py +0 -0
  38. lyrics_transcriber/correction/agentic/__init__.py +9 -0
  39. lyrics_transcriber/correction/agentic/adapter.py +71 -0
  40. lyrics_transcriber/correction/agentic/agent.py +313 -0
  41. lyrics_transcriber/correction/agentic/feedback/aggregator.py +12 -0
  42. lyrics_transcriber/correction/agentic/feedback/collector.py +17 -0
  43. lyrics_transcriber/correction/agentic/feedback/retention.py +24 -0
  44. lyrics_transcriber/correction/agentic/feedback/store.py +76 -0
  45. lyrics_transcriber/correction/agentic/handlers/__init__.py +24 -0
  46. lyrics_transcriber/correction/agentic/handlers/ambiguous.py +44 -0
  47. lyrics_transcriber/correction/agentic/handlers/background_vocals.py +68 -0
  48. lyrics_transcriber/correction/agentic/handlers/base.py +51 -0
  49. lyrics_transcriber/correction/agentic/handlers/complex_multi_error.py +46 -0
  50. lyrics_transcriber/correction/agentic/handlers/extra_words.py +74 -0
  51. lyrics_transcriber/correction/agentic/handlers/no_error.py +42 -0
  52. lyrics_transcriber/correction/agentic/handlers/punctuation.py +44 -0
  53. lyrics_transcriber/correction/agentic/handlers/registry.py +60 -0
  54. lyrics_transcriber/correction/agentic/handlers/repeated_section.py +44 -0
  55. lyrics_transcriber/correction/agentic/handlers/sound_alike.py +126 -0
  56. lyrics_transcriber/correction/agentic/models/__init__.py +5 -0
  57. lyrics_transcriber/correction/agentic/models/ai_correction.py +31 -0
  58. lyrics_transcriber/correction/agentic/models/correction_session.py +30 -0
  59. lyrics_transcriber/correction/agentic/models/enums.py +38 -0
  60. lyrics_transcriber/correction/agentic/models/human_feedback.py +30 -0
  61. lyrics_transcriber/correction/agentic/models/learning_data.py +26 -0
  62. lyrics_transcriber/correction/agentic/models/observability_metrics.py +28 -0
  63. lyrics_transcriber/correction/agentic/models/schemas.py +46 -0
  64. lyrics_transcriber/correction/agentic/models/utils.py +19 -0
  65. lyrics_transcriber/correction/agentic/observability/__init__.py +5 -0
  66. lyrics_transcriber/correction/agentic/observability/langfuse_integration.py +35 -0
  67. lyrics_transcriber/correction/agentic/observability/metrics.py +46 -0
  68. lyrics_transcriber/correction/agentic/observability/performance.py +19 -0
  69. lyrics_transcriber/correction/agentic/prompts/__init__.py +2 -0
  70. lyrics_transcriber/correction/agentic/prompts/classifier.py +227 -0
  71. lyrics_transcriber/correction/agentic/providers/__init__.py +6 -0
  72. lyrics_transcriber/correction/agentic/providers/base.py +36 -0
  73. lyrics_transcriber/correction/agentic/providers/circuit_breaker.py +145 -0
  74. lyrics_transcriber/correction/agentic/providers/config.py +73 -0
  75. lyrics_transcriber/correction/agentic/providers/constants.py +24 -0
  76. lyrics_transcriber/correction/agentic/providers/health.py +28 -0
  77. lyrics_transcriber/correction/agentic/providers/langchain_bridge.py +212 -0
  78. lyrics_transcriber/correction/agentic/providers/model_factory.py +209 -0
  79. lyrics_transcriber/correction/agentic/providers/response_cache.py +218 -0
  80. lyrics_transcriber/correction/agentic/providers/response_parser.py +111 -0
  81. lyrics_transcriber/correction/agentic/providers/retry_executor.py +127 -0
  82. lyrics_transcriber/correction/agentic/router.py +35 -0
  83. lyrics_transcriber/correction/agentic/workflows/__init__.py +5 -0
  84. lyrics_transcriber/correction/agentic/workflows/consensus_workflow.py +24 -0
  85. lyrics_transcriber/correction/agentic/workflows/correction_graph.py +59 -0
  86. lyrics_transcriber/correction/agentic/workflows/feedback_workflow.py +24 -0
  87. lyrics_transcriber/correction/anchor_sequence.py +1043 -0
  88. lyrics_transcriber/correction/corrector.py +760 -0
  89. lyrics_transcriber/correction/feedback/__init__.py +2 -0
  90. lyrics_transcriber/correction/feedback/schemas.py +107 -0
  91. lyrics_transcriber/correction/feedback/store.py +236 -0
  92. lyrics_transcriber/correction/handlers/__init__.py +0 -0
  93. lyrics_transcriber/correction/handlers/base.py +52 -0
  94. lyrics_transcriber/correction/handlers/extend_anchor.py +149 -0
  95. lyrics_transcriber/correction/handlers/levenshtein.py +189 -0
  96. lyrics_transcriber/correction/handlers/llm.py +293 -0
  97. lyrics_transcriber/correction/handlers/llm_providers.py +60 -0
  98. lyrics_transcriber/correction/handlers/no_space_punct_match.py +154 -0
  99. lyrics_transcriber/correction/handlers/relaxed_word_count_match.py +85 -0
  100. lyrics_transcriber/correction/handlers/repeat.py +88 -0
  101. lyrics_transcriber/correction/handlers/sound_alike.py +259 -0
  102. lyrics_transcriber/correction/handlers/syllables_match.py +252 -0
  103. lyrics_transcriber/correction/handlers/word_count_match.py +80 -0
  104. lyrics_transcriber/correction/handlers/word_operations.py +187 -0
  105. lyrics_transcriber/correction/operations.py +352 -0
  106. lyrics_transcriber/correction/phrase_analyzer.py +435 -0
  107. lyrics_transcriber/correction/text_utils.py +30 -0
  108. lyrics_transcriber/frontend/.gitignore +23 -0
  109. lyrics_transcriber/frontend/.yarn/releases/yarn-4.7.0.cjs +935 -0
  110. lyrics_transcriber/frontend/.yarnrc.yml +3 -0
  111. lyrics_transcriber/frontend/README.md +50 -0
  112. lyrics_transcriber/frontend/REPLACE_ALL_FUNCTIONALITY.md +210 -0
  113. lyrics_transcriber/frontend/__init__.py +25 -0
  114. lyrics_transcriber/frontend/eslint.config.js +28 -0
  115. lyrics_transcriber/frontend/index.html +18 -0
  116. lyrics_transcriber/frontend/package.json +42 -0
  117. lyrics_transcriber/frontend/public/android-chrome-192x192.png +0 -0
  118. lyrics_transcriber/frontend/public/android-chrome-512x512.png +0 -0
  119. lyrics_transcriber/frontend/public/apple-touch-icon.png +0 -0
  120. lyrics_transcriber/frontend/public/favicon-16x16.png +0 -0
  121. lyrics_transcriber/frontend/public/favicon-32x32.png +0 -0
  122. lyrics_transcriber/frontend/public/favicon.ico +0 -0
  123. lyrics_transcriber/frontend/public/nomad-karaoke-logo.png +0 -0
  124. lyrics_transcriber/frontend/src/App.tsx +212 -0
  125. lyrics_transcriber/frontend/src/api.ts +239 -0
  126. lyrics_transcriber/frontend/src/components/AIFeedbackModal.tsx +77 -0
  127. lyrics_transcriber/frontend/src/components/AddLyricsModal.tsx +114 -0
  128. lyrics_transcriber/frontend/src/components/AgenticCorrectionMetrics.tsx +204 -0
  129. lyrics_transcriber/frontend/src/components/AudioPlayer.tsx +180 -0
  130. lyrics_transcriber/frontend/src/components/CorrectedWordWithActions.tsx +167 -0
  131. lyrics_transcriber/frontend/src/components/CorrectionAnnotationModal.tsx +359 -0
  132. lyrics_transcriber/frontend/src/components/CorrectionDetailCard.tsx +281 -0
  133. lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx +162 -0
  134. lyrics_transcriber/frontend/src/components/DurationTimelineView.tsx +257 -0
  135. lyrics_transcriber/frontend/src/components/EditActionBar.tsx +68 -0
  136. lyrics_transcriber/frontend/src/components/EditModal.tsx +702 -0
  137. lyrics_transcriber/frontend/src/components/EditTimelineSection.tsx +496 -0
  138. lyrics_transcriber/frontend/src/components/EditWordList.tsx +379 -0
  139. lyrics_transcriber/frontend/src/components/FileUpload.tsx +77 -0
  140. lyrics_transcriber/frontend/src/components/FindReplaceModal.tsx +467 -0
  141. lyrics_transcriber/frontend/src/components/Header.tsx +387 -0
  142. lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx +1373 -0
  143. lyrics_transcriber/frontend/src/components/MetricsDashboard.tsx +51 -0
  144. lyrics_transcriber/frontend/src/components/ModeSelector.tsx +67 -0
  145. lyrics_transcriber/frontend/src/components/ModelSelector.tsx +23 -0
  146. lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx +144 -0
  147. lyrics_transcriber/frontend/src/components/ReferenceView.tsx +268 -0
  148. lyrics_transcriber/frontend/src/components/ReplaceAllLyricsModal.tsx +688 -0
  149. lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx +354 -0
  150. lyrics_transcriber/frontend/src/components/SegmentDetailsModal.tsx +64 -0
  151. lyrics_transcriber/frontend/src/components/TimelineEditor.tsx +376 -0
  152. lyrics_transcriber/frontend/src/components/TimingOffsetModal.tsx +131 -0
  153. lyrics_transcriber/frontend/src/components/TranscriptionView.tsx +256 -0
  154. lyrics_transcriber/frontend/src/components/WordDivider.tsx +187 -0
  155. lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx +379 -0
  156. lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx +56 -0
  157. lyrics_transcriber/frontend/src/components/shared/components/Word.tsx +87 -0
  158. lyrics_transcriber/frontend/src/components/shared/constants.ts +20 -0
  159. lyrics_transcriber/frontend/src/components/shared/hooks/useWordClick.ts +180 -0
  160. lyrics_transcriber/frontend/src/components/shared/styles.ts +13 -0
  161. lyrics_transcriber/frontend/src/components/shared/types.js +2 -0
  162. lyrics_transcriber/frontend/src/components/shared/types.ts +129 -0
  163. lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts +177 -0
  164. lyrics_transcriber/frontend/src/components/shared/utils/localStorage.ts +78 -0
  165. lyrics_transcriber/frontend/src/components/shared/utils/referenceLineCalculator.ts +75 -0
  166. lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts +360 -0
  167. lyrics_transcriber/frontend/src/components/shared/utils/timingUtils.ts +110 -0
  168. lyrics_transcriber/frontend/src/components/shared/utils/wordUtils.ts +22 -0
  169. lyrics_transcriber/frontend/src/hooks/useManualSync.ts +435 -0
  170. lyrics_transcriber/frontend/src/main.tsx +17 -0
  171. lyrics_transcriber/frontend/src/theme.ts +177 -0
  172. lyrics_transcriber/frontend/src/types/global.d.ts +9 -0
  173. lyrics_transcriber/frontend/src/types.js +2 -0
  174. lyrics_transcriber/frontend/src/types.ts +199 -0
  175. lyrics_transcriber/frontend/src/validation.ts +132 -0
  176. lyrics_transcriber/frontend/src/vite-env.d.ts +1 -0
  177. lyrics_transcriber/frontend/tsconfig.app.json +26 -0
  178. lyrics_transcriber/frontend/tsconfig.json +25 -0
  179. lyrics_transcriber/frontend/tsconfig.node.json +23 -0
  180. lyrics_transcriber/frontend/tsconfig.tsbuildinfo +1 -0
  181. lyrics_transcriber/frontend/update_version.js +11 -0
  182. lyrics_transcriber/frontend/vite.config.d.ts +2 -0
  183. lyrics_transcriber/frontend/vite.config.js +10 -0
  184. lyrics_transcriber/frontend/vite.config.ts +11 -0
  185. lyrics_transcriber/frontend/web_assets/android-chrome-192x192.png +0 -0
  186. lyrics_transcriber/frontend/web_assets/android-chrome-512x512.png +0 -0
  187. lyrics_transcriber/frontend/web_assets/apple-touch-icon.png +0 -0
  188. lyrics_transcriber/frontend/web_assets/assets/index-DdJTDWH3.js +42039 -0
  189. lyrics_transcriber/frontend/web_assets/assets/index-DdJTDWH3.js.map +1 -0
  190. lyrics_transcriber/frontend/web_assets/favicon-16x16.png +0 -0
  191. lyrics_transcriber/frontend/web_assets/favicon-32x32.png +0 -0
  192. lyrics_transcriber/frontend/web_assets/favicon.ico +0 -0
  193. lyrics_transcriber/frontend/web_assets/index.html +18 -0
  194. lyrics_transcriber/frontend/web_assets/nomad-karaoke-logo.png +0 -0
  195. lyrics_transcriber/frontend/yarn.lock +3752 -0
  196. lyrics_transcriber/lyrics/__init__.py +0 -0
  197. lyrics_transcriber/lyrics/base_lyrics_provider.py +211 -0
  198. lyrics_transcriber/lyrics/file_provider.py +95 -0
  199. lyrics_transcriber/lyrics/genius.py +384 -0
  200. lyrics_transcriber/lyrics/lrclib.py +231 -0
  201. lyrics_transcriber/lyrics/musixmatch.py +156 -0
  202. lyrics_transcriber/lyrics/spotify.py +290 -0
  203. lyrics_transcriber/lyrics/user_input_provider.py +44 -0
  204. lyrics_transcriber/output/__init__.py +0 -0
  205. lyrics_transcriber/output/ass/__init__.py +21 -0
  206. lyrics_transcriber/output/ass/ass.py +2088 -0
  207. lyrics_transcriber/output/ass/ass_specs.txt +732 -0
  208. lyrics_transcriber/output/ass/config.py +180 -0
  209. lyrics_transcriber/output/ass/constants.py +23 -0
  210. lyrics_transcriber/output/ass/event.py +94 -0
  211. lyrics_transcriber/output/ass/formatters.py +132 -0
  212. lyrics_transcriber/output/ass/lyrics_line.py +265 -0
  213. lyrics_transcriber/output/ass/lyrics_screen.py +252 -0
  214. lyrics_transcriber/output/ass/section_detector.py +89 -0
  215. lyrics_transcriber/output/ass/section_screen.py +106 -0
  216. lyrics_transcriber/output/ass/style.py +187 -0
  217. lyrics_transcriber/output/cdg.py +619 -0
  218. lyrics_transcriber/output/cdgmaker/__init__.py +0 -0
  219. lyrics_transcriber/output/cdgmaker/cdg.py +262 -0
  220. lyrics_transcriber/output/cdgmaker/composer.py +2260 -0
  221. lyrics_transcriber/output/cdgmaker/config.py +151 -0
  222. lyrics_transcriber/output/cdgmaker/images/instrumental.png +0 -0
  223. lyrics_transcriber/output/cdgmaker/images/intro.png +0 -0
  224. lyrics_transcriber/output/cdgmaker/pack.py +507 -0
  225. lyrics_transcriber/output/cdgmaker/render.py +346 -0
  226. lyrics_transcriber/output/cdgmaker/transitions/centertexttoplogobottomtext.png +0 -0
  227. lyrics_transcriber/output/cdgmaker/transitions/circlein.png +0 -0
  228. lyrics_transcriber/output/cdgmaker/transitions/circleout.png +0 -0
  229. lyrics_transcriber/output/cdgmaker/transitions/fizzle.png +0 -0
  230. lyrics_transcriber/output/cdgmaker/transitions/largecentertexttoplogo.png +0 -0
  231. lyrics_transcriber/output/cdgmaker/transitions/rectangle.png +0 -0
  232. lyrics_transcriber/output/cdgmaker/transitions/spiral.png +0 -0
  233. lyrics_transcriber/output/cdgmaker/transitions/topleftmusicalnotes.png +0 -0
  234. lyrics_transcriber/output/cdgmaker/transitions/wipein.png +0 -0
  235. lyrics_transcriber/output/cdgmaker/transitions/wipeleft.png +0 -0
  236. lyrics_transcriber/output/cdgmaker/transitions/wipeout.png +0 -0
  237. lyrics_transcriber/output/cdgmaker/transitions/wiperight.png +0 -0
  238. lyrics_transcriber/output/cdgmaker/utils.py +132 -0
  239. lyrics_transcriber/output/countdown_processor.py +267 -0
  240. lyrics_transcriber/output/fonts/AvenirNext-Bold.ttf +0 -0
  241. lyrics_transcriber/output/fonts/DMSans-VariableFont_opsz,wght.ttf +0 -0
  242. lyrics_transcriber/output/fonts/DMSerifDisplay-Regular.ttf +0 -0
  243. lyrics_transcriber/output/fonts/Oswald-SemiBold.ttf +0 -0
  244. lyrics_transcriber/output/fonts/Zurich_Cn_BT_Bold.ttf +0 -0
  245. lyrics_transcriber/output/fonts/arial.ttf +0 -0
  246. lyrics_transcriber/output/fonts/georgia.ttf +0 -0
  247. lyrics_transcriber/output/fonts/verdana.ttf +0 -0
  248. lyrics_transcriber/output/generator.py +257 -0
  249. lyrics_transcriber/output/lrc_to_cdg.py +61 -0
  250. lyrics_transcriber/output/lyrics_file.py +102 -0
  251. lyrics_transcriber/output/plain_text.py +96 -0
  252. lyrics_transcriber/output/segment_resizer.py +431 -0
  253. lyrics_transcriber/output/subtitles.py +397 -0
  254. lyrics_transcriber/output/video.py +544 -0
  255. lyrics_transcriber/review/__init__.py +0 -0
  256. lyrics_transcriber/review/server.py +676 -0
  257. lyrics_transcriber/storage/__init__.py +0 -0
  258. lyrics_transcriber/storage/dropbox.py +225 -0
  259. lyrics_transcriber/transcribers/__init__.py +0 -0
  260. lyrics_transcriber/transcribers/audioshake.py +290 -0
  261. lyrics_transcriber/transcribers/base_transcriber.py +157 -0
  262. lyrics_transcriber/transcribers/whisper.py +330 -0
  263. lyrics_transcriber/types.py +648 -0
  264. lyrics_transcriber/utils/__init__.py +0 -0
  265. lyrics_transcriber/utils/word_utils.py +27 -0
  266. karaoke_gen-0.57.0.dist-info/METADATA +0 -167
  267. karaoke_gen-0.57.0.dist-info/RECORD +0 -23
  268. {karaoke_gen-0.57.0.dist-info → karaoke_gen-0.71.23.dist-info/licenses}/LICENSE +0 -0
@@ -1,4 +1,10 @@
1
1
  #!/usr/bin/env python
2
+ # Suppress SyntaxWarnings from third-party dependencies (pydub, syrics)
3
+ # that have invalid escape sequences in regex patterns (not yet fixed for Python 3.12+)
4
+ import warnings
5
+ warnings.filterwarnings("ignore", category=SyntaxWarning, module="pydub")
6
+ warnings.filterwarnings("ignore", category=SyntaxWarning, module="syrics")
7
+
2
8
  import argparse
3
9
  import logging
4
10
  from importlib import metadata
@@ -11,16 +17,7 @@ import time
11
17
  import pyperclip
12
18
  from karaoke_gen import KaraokePrep
13
19
  from karaoke_gen.karaoke_finalise import KaraokeFinalise
14
-
15
-
16
- def is_url(string):
17
- """Simple check to determine if a string is a URL."""
18
- return string.startswith("http://") or string.startswith("https://")
19
-
20
-
21
- def is_file(string):
22
- """Check if a string is a valid file."""
23
- return os.path.isfile(string)
20
+ from .cli_args import create_parser, process_style_overrides, is_url, is_file
24
21
 
25
22
 
26
23
  async def async_main():
@@ -30,258 +27,15 @@ async def async_main():
30
27
  log_handler.setFormatter(log_formatter)
31
28
  logger.addHandler(log_handler)
32
29
 
33
- parser = argparse.ArgumentParser(
34
- description="Generate karaoke videos with synchronized lyrics. Handles the entire process from downloading audio and lyrics to creating the final video.",
35
- formatter_class=lambda prog: argparse.RawTextHelpFormatter(prog, max_help_position=54),
36
- )
37
-
38
- # Basic information
39
- parser.add_argument(
40
- "args",
41
- nargs="*",
42
- help="[Media or playlist URL] [Artist] [Title] of song to process. If URL is provided, Artist and Title are optional but increase chance of fetching the correct lyrics. If Artist and Title are provided with no URL, the top YouTube search result will be fetched.",
43
- )
30
+ # Use shared CLI parser
31
+ parser = create_parser(prog="karaoke-gen")
32
+ args = parser.parse_args()
44
33
 
45
- # Get version using importlib.metadata
34
+ # Process style overrides
46
35
  try:
47
- package_version = metadata.version("karaoke-gen")
48
- except metadata.PackageNotFoundError:
49
- package_version = "unknown"
50
-
51
- parser.add_argument("-v", "--version", action="version", version=f"%(prog)s {package_version}")
52
-
53
- # Workflow control
54
- workflow_group = parser.add_argument_group("Workflow Control")
55
- workflow_group.add_argument(
56
- "--prep-only",
57
- action="store_true",
58
- help="Only run the preparation phase (download audio, lyrics, separate stems, create title screens). Example: --prep-only",
59
- )
60
- workflow_group.add_argument(
61
- "--finalise-only",
62
- action="store_true",
63
- help="Only run the finalisation phase (remux, encode, organize). Must be run in a directory prepared by the prep phase. Example: --finalise-only",
64
- )
65
- workflow_group.add_argument(
66
- "--skip-transcription",
67
- action="store_true",
68
- help="Skip automatic lyrics transcription/synchronization. Use this to fall back to manual syncing. Example: --skip-transcription",
69
- )
70
- workflow_group.add_argument(
71
- "--skip-separation",
72
- action="store_true",
73
- help="Skip audio separation process. Example: --skip-separation",
74
- )
75
- workflow_group.add_argument(
76
- "--skip-lyrics",
77
- action="store_true",
78
- help="Skip fetching and processing lyrics. Example: --skip-lyrics",
79
- )
80
- workflow_group.add_argument(
81
- "--lyrics-only",
82
- action="store_true",
83
- help="Only process lyrics, skipping audio separation and title/end screen generation. Example: --lyrics-only",
84
- )
85
- workflow_group.add_argument(
86
- "--edit-lyrics",
87
- action="store_true",
88
- help="Edit lyrics of an existing track. This will backup existing outputs, re-run the lyrics transcription process, and update all outputs. Example: --edit-lyrics",
89
- )
90
-
91
- # Logging & Debugging
92
- debug_group = parser.add_argument_group("Logging & Debugging")
93
- debug_group.add_argument(
94
- "--log_level",
95
- default="info",
96
- help="Optional: logging level, e.g. info, debug, warning (default: %(default)s). Example: --log_level=debug",
97
- )
98
- debug_group.add_argument(
99
- "--dry_run",
100
- action="store_true",
101
- help="Optional: perform a dry run without making any changes. Example: --dry_run",
102
- )
103
- debug_group.add_argument(
104
- "--render_bounding_boxes",
105
- action="store_true",
106
- help="Optional: render bounding boxes around text regions for debugging. Example: --render_bounding_boxes",
107
- )
108
-
109
- # Input/Output Configuration
110
- io_group = parser.add_argument_group("Input/Output Configuration")
111
- io_group.add_argument(
112
- "--filename_pattern",
113
- help="Required if processing a folder: Python regex pattern to extract track names from filenames. Must contain a named group 'title'. Example: --filename_pattern='(?P<index>\\d+) - (?P<title>.+).mp3'",
114
- )
115
- io_group.add_argument(
116
- "--output_dir",
117
- default=".",
118
- help="Optional: directory to write output files (default: <current dir>). Example: --output_dir=/app/karaoke",
119
- )
120
- io_group.add_argument(
121
- "--no_track_subfolders",
122
- action="store_false",
123
- dest="no_track_subfolders",
124
- help="Optional: do NOT create a named subfolder for each track. Example: --no_track_subfolders",
125
- )
126
- io_group.add_argument(
127
- "--lossless_output_format",
128
- default="FLAC",
129
- help="Optional: lossless output format for separated audio (default: FLAC). Example: --lossless_output_format=WAV",
130
- )
131
- io_group.add_argument(
132
- "--output_png",
133
- type=lambda x: (str(x).lower() == "true"),
134
- default=True,
135
- help="Optional: output PNG format for title and end images (default: %(default)s). Example: --output_png=False",
136
- )
137
- io_group.add_argument(
138
- "--output_jpg",
139
- type=lambda x: (str(x).lower() == "true"),
140
- default=True,
141
- help="Optional: output JPG format for title and end images (default: %(default)s). Example: --output_jpg=False",
142
- )
143
-
144
- # Audio Processing Configuration
145
- audio_group = parser.add_argument_group("Audio Processing Configuration")
146
- audio_group.add_argument(
147
- "--clean_instrumental_model",
148
- default="model_bs_roformer_ep_317_sdr_12.9755.ckpt",
149
- help="Optional: Model for clean instrumental separation (default: %(default)s).",
150
- )
151
- audio_group.add_argument(
152
- "--backing_vocals_models",
153
- nargs="+",
154
- default=["mel_band_roformer_karaoke_aufr33_viperx_sdr_10.1956.ckpt"],
155
- help="Optional: List of models for backing vocals separation (default: %(default)s).",
156
- )
157
- audio_group.add_argument(
158
- "--other_stems_models",
159
- nargs="+",
160
- default=["htdemucs_6s.yaml"],
161
- help="Optional: List of models for other stems separation (default: %(default)s).",
162
- )
163
-
164
- default_model_dir_unix = "/tmp/audio-separator-models/"
165
- if os.name == "posix" and os.path.exists(default_model_dir_unix):
166
- default_model_dir = default_model_dir_unix
167
- else:
168
- # Use tempfile to get the platform-independent temp directory
169
- default_model_dir = os.path.join(tempfile.gettempdir(), "audio-separator-models")
170
-
171
- audio_group.add_argument(
172
- "--model_file_dir",
173
- default=default_model_dir,
174
- help="Optional: model files directory (default: %(default)s). Example: --model_file_dir=/app/models",
175
- )
176
- audio_group.add_argument(
177
- "--existing_instrumental",
178
- help="Optional: Path to an existing instrumental audio file. If provided, audio separation will be skipped.",
179
- )
180
- audio_group.add_argument(
181
- "--instrumental_format",
182
- default="flac",
183
- help="Optional: format / file extension for instrumental track to use for remux (default: %(default)s). Example: --instrumental_format=mp3",
184
- )
185
-
186
- # Lyrics Configuration
187
- lyrics_group = parser.add_argument_group("Lyrics Configuration")
188
- lyrics_group.add_argument(
189
- "--lyrics_artist",
190
- help="Optional: Override the artist name used for lyrics search. Example: --lyrics_artist='The Beatles'",
191
- )
192
- lyrics_group.add_argument(
193
- "--lyrics_title",
194
- help="Optional: Override the song title used for lyrics search. Example: --lyrics_title='Hey Jude'",
195
- )
196
- lyrics_group.add_argument(
197
- "--lyrics_file",
198
- help="Optional: Path to a file containing lyrics to use instead of fetching from online. Example: --lyrics_file='/path/to/lyrics.txt'",
199
- )
200
- lyrics_group.add_argument(
201
- "--subtitle_offset_ms",
202
- type=int,
203
- default=0,
204
- help="Optional: Adjust subtitle timing by N milliseconds (+ve delays, -ve advances). Example: --subtitle_offset_ms=500",
205
- )
206
- lyrics_group.add_argument(
207
- "--skip_transcription_review",
208
- action="store_true",
209
- help="Optional: Skip the review step after transcription. Example: --skip_transcription_review",
210
- )
211
-
212
- # Style Configuration
213
- style_group = parser.add_argument_group("Style Configuration")
214
- style_group.add_argument(
215
- "--style_params_json",
216
- help="Optional: Path to JSON file containing style configuration. Example: --style_params_json='/path/to/style_params.json'",
217
- )
218
-
219
- # Finalisation Configuration
220
- finalise_group = parser.add_argument_group("Finalisation Configuration")
221
- finalise_group.add_argument(
222
- "--enable_cdg",
223
- action="store_true",
224
- help="Optional: Enable CDG ZIP generation during finalisation. Example: --enable_cdg",
225
- )
226
- finalise_group.add_argument(
227
- "--enable_txt",
228
- action="store_true",
229
- help="Optional: Enable TXT ZIP generation during finalisation. Example: --enable_txt",
230
- )
231
- finalise_group.add_argument(
232
- "--brand_prefix",
233
- help="Optional: Your brand prefix to calculate the next sequential number. Example: --brand_prefix=BRAND",
234
- )
235
- finalise_group.add_argument(
236
- "--organised_dir",
237
- help="Optional: Target directory where the processed folder will be moved. Example: --organised_dir='/path/to/Tracks-Organized'",
238
- )
239
- finalise_group.add_argument(
240
- "--organised_dir_rclone_root",
241
- help="Optional: Rclone path which maps to your organised_dir. Example: --organised_dir_rclone_root='dropbox:Media/Karaoke/Tracks-Organized'",
242
- )
243
- finalise_group.add_argument(
244
- "--public_share_dir",
245
- help="Optional: Public share directory for final files. Example: --public_share_dir='/path/to/Tracks-PublicShare'",
246
- )
247
- finalise_group.add_argument(
248
- "--youtube_client_secrets_file",
249
- help="Optional: Path to youtube client secrets file. Example: --youtube_client_secrets_file='/path/to/client_secret.json'",
250
- )
251
- finalise_group.add_argument(
252
- "--youtube_description_file",
253
- help="Optional: Path to youtube description template. Example: --youtube_description_file='/path/to/description.txt'",
254
- )
255
- finalise_group.add_argument(
256
- "--rclone_destination",
257
- help="Optional: Rclone destination for public_share_dir sync. Example: --rclone_destination='googledrive:KaraokeFolder'",
258
- )
259
- finalise_group.add_argument(
260
- "--discord_webhook_url",
261
- help="Optional: Discord webhook URL for notifications. Example: --discord_webhook_url='https://discord.com/api/webhooks/...'",
262
- )
263
- finalise_group.add_argument(
264
- "--email_template_file",
265
- help="Optional: Path to email template file. Example: --email_template_file='/path/to/template.txt'",
266
- )
267
- finalise_group.add_argument(
268
- "--keep-brand-code",
269
- action="store_true",
270
- help="Optional: Use existing brand code from current directory instead of generating new one. Example: --keep-brand-code",
271
- )
272
- finalise_group.add_argument(
273
- "-y",
274
- "--yes",
275
- action="store_true",
276
- help="Optional: Run in non-interactive mode, assuming yes to all prompts. Example: -y",
277
- )
278
- finalise_group.add_argument(
279
- "--test_email_template",
280
- action="store_true",
281
- help="Optional: Test the email template functionality with fake data. Example: --test_email_template",
282
- )
283
-
284
- args = parser.parse_args()
36
+ style_overrides = process_style_overrides(args.style_override, logger)
37
+ except ValueError:
38
+ sys.exit(1)
285
39
 
286
40
  # Handle test email template case first
287
41
  if args.test_email_template:
@@ -354,6 +108,10 @@ async def async_main():
354
108
  skip_transcription_review=args.skip_transcription_review,
355
109
  subtitle_offset_ms=args.subtitle_offset_ms,
356
110
  style_params_json=args.style_params_json,
111
+ style_overrides=style_overrides,
112
+ background_video=args.background_video,
113
+ background_video_darkness=args.background_video_darkness,
114
+ auto_download=getattr(args, 'auto_download', False),
357
115
  )
358
116
  # No await needed for constructor
359
117
  kprep = kprep_coroutine
@@ -625,7 +383,10 @@ async def async_main():
625
383
  elif len(args.args) > 1:
626
384
  artist = args.args[0]
627
385
  title = args.args[1]
628
- logger.warning(f"No input media provided, the top YouTube search result for {artist} - {title} will be used.")
386
+ if getattr(args, 'auto_download', False):
387
+ logger.info(f"No input media provided, flacfetch will automatically search and download: {artist} - {title}")
388
+ else:
389
+ logger.info(f"No input media provided, flacfetch will search for: {artist} - {title} (interactive selection)")
629
390
 
630
391
  else:
631
392
  parser.print_help()
@@ -671,6 +432,10 @@ async def async_main():
671
432
  skip_transcription_review=args.skip_transcription_review,
672
433
  subtitle_offset_ms=args.subtitle_offset_ms,
673
434
  style_params_json=args.style_params_json,
435
+ style_overrides=style_overrides,
436
+ background_video=args.background_video,
437
+ background_video_darkness=args.background_video_darkness,
438
+ auto_download=getattr(args, 'auto_download', False),
674
439
  )
675
440
  # No await needed for constructor
676
441
  kprep = kprep_coroutine