karaoke-gen 0.57.0__py3-none-any.whl → 0.71.27__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.
- karaoke_gen/audio_fetcher.py +461 -0
- karaoke_gen/audio_processor.py +407 -30
- karaoke_gen/config.py +62 -113
- karaoke_gen/file_handler.py +32 -59
- karaoke_gen/karaoke_finalise/karaoke_finalise.py +148 -67
- karaoke_gen/karaoke_gen.py +270 -61
- karaoke_gen/lyrics_processor.py +13 -1
- karaoke_gen/metadata.py +78 -73
- karaoke_gen/pipeline/__init__.py +87 -0
- karaoke_gen/pipeline/base.py +215 -0
- karaoke_gen/pipeline/context.py +230 -0
- karaoke_gen/pipeline/executors/__init__.py +21 -0
- karaoke_gen/pipeline/executors/local.py +159 -0
- karaoke_gen/pipeline/executors/remote.py +257 -0
- karaoke_gen/pipeline/stages/__init__.py +27 -0
- karaoke_gen/pipeline/stages/finalize.py +202 -0
- karaoke_gen/pipeline/stages/render.py +165 -0
- karaoke_gen/pipeline/stages/screens.py +139 -0
- karaoke_gen/pipeline/stages/separation.py +191 -0
- karaoke_gen/pipeline/stages/transcription.py +191 -0
- karaoke_gen/style_loader.py +531 -0
- karaoke_gen/utils/bulk_cli.py +6 -0
- karaoke_gen/utils/cli_args.py +424 -0
- karaoke_gen/utils/gen_cli.py +26 -261
- karaoke_gen/utils/remote_cli.py +1965 -0
- karaoke_gen/video_background_processor.py +351 -0
- karaoke_gen-0.71.27.dist-info/METADATA +610 -0
- karaoke_gen-0.71.27.dist-info/RECORD +275 -0
- {karaoke_gen-0.57.0.dist-info → karaoke_gen-0.71.27.dist-info}/WHEEL +1 -1
- {karaoke_gen-0.57.0.dist-info → karaoke_gen-0.71.27.dist-info}/entry_points.txt +1 -0
- lyrics_transcriber/__init__.py +10 -0
- lyrics_transcriber/cli/__init__.py +0 -0
- lyrics_transcriber/cli/cli_main.py +285 -0
- lyrics_transcriber/core/__init__.py +0 -0
- lyrics_transcriber/core/config.py +50 -0
- lyrics_transcriber/core/controller.py +520 -0
- lyrics_transcriber/correction/__init__.py +0 -0
- lyrics_transcriber/correction/agentic/__init__.py +9 -0
- lyrics_transcriber/correction/agentic/adapter.py +71 -0
- lyrics_transcriber/correction/agentic/agent.py +313 -0
- lyrics_transcriber/correction/agentic/feedback/aggregator.py +12 -0
- lyrics_transcriber/correction/agentic/feedback/collector.py +17 -0
- lyrics_transcriber/correction/agentic/feedback/retention.py +24 -0
- lyrics_transcriber/correction/agentic/feedback/store.py +76 -0
- lyrics_transcriber/correction/agentic/handlers/__init__.py +24 -0
- lyrics_transcriber/correction/agentic/handlers/ambiguous.py +44 -0
- lyrics_transcriber/correction/agentic/handlers/background_vocals.py +68 -0
- lyrics_transcriber/correction/agentic/handlers/base.py +51 -0
- lyrics_transcriber/correction/agentic/handlers/complex_multi_error.py +46 -0
- lyrics_transcriber/correction/agentic/handlers/extra_words.py +74 -0
- lyrics_transcriber/correction/agentic/handlers/no_error.py +42 -0
- lyrics_transcriber/correction/agentic/handlers/punctuation.py +44 -0
- lyrics_transcriber/correction/agentic/handlers/registry.py +60 -0
- lyrics_transcriber/correction/agentic/handlers/repeated_section.py +44 -0
- lyrics_transcriber/correction/agentic/handlers/sound_alike.py +126 -0
- lyrics_transcriber/correction/agentic/models/__init__.py +5 -0
- lyrics_transcriber/correction/agentic/models/ai_correction.py +31 -0
- lyrics_transcriber/correction/agentic/models/correction_session.py +30 -0
- lyrics_transcriber/correction/agentic/models/enums.py +38 -0
- lyrics_transcriber/correction/agentic/models/human_feedback.py +30 -0
- lyrics_transcriber/correction/agentic/models/learning_data.py +26 -0
- lyrics_transcriber/correction/agentic/models/observability_metrics.py +28 -0
- lyrics_transcriber/correction/agentic/models/schemas.py +46 -0
- lyrics_transcriber/correction/agentic/models/utils.py +19 -0
- lyrics_transcriber/correction/agentic/observability/__init__.py +5 -0
- lyrics_transcriber/correction/agentic/observability/langfuse_integration.py +35 -0
- lyrics_transcriber/correction/agentic/observability/metrics.py +46 -0
- lyrics_transcriber/correction/agentic/observability/performance.py +19 -0
- lyrics_transcriber/correction/agentic/prompts/__init__.py +2 -0
- lyrics_transcriber/correction/agentic/prompts/classifier.py +227 -0
- lyrics_transcriber/correction/agentic/providers/__init__.py +6 -0
- lyrics_transcriber/correction/agentic/providers/base.py +36 -0
- lyrics_transcriber/correction/agentic/providers/circuit_breaker.py +145 -0
- lyrics_transcriber/correction/agentic/providers/config.py +73 -0
- lyrics_transcriber/correction/agentic/providers/constants.py +24 -0
- lyrics_transcriber/correction/agentic/providers/health.py +28 -0
- lyrics_transcriber/correction/agentic/providers/langchain_bridge.py +212 -0
- lyrics_transcriber/correction/agentic/providers/model_factory.py +209 -0
- lyrics_transcriber/correction/agentic/providers/response_cache.py +218 -0
- lyrics_transcriber/correction/agentic/providers/response_parser.py +111 -0
- lyrics_transcriber/correction/agentic/providers/retry_executor.py +127 -0
- lyrics_transcriber/correction/agentic/router.py +35 -0
- lyrics_transcriber/correction/agentic/workflows/__init__.py +5 -0
- lyrics_transcriber/correction/agentic/workflows/consensus_workflow.py +24 -0
- lyrics_transcriber/correction/agentic/workflows/correction_graph.py +59 -0
- lyrics_transcriber/correction/agentic/workflows/feedback_workflow.py +24 -0
- lyrics_transcriber/correction/anchor_sequence.py +1043 -0
- lyrics_transcriber/correction/corrector.py +760 -0
- lyrics_transcriber/correction/feedback/__init__.py +2 -0
- lyrics_transcriber/correction/feedback/schemas.py +107 -0
- lyrics_transcriber/correction/feedback/store.py +236 -0
- lyrics_transcriber/correction/handlers/__init__.py +0 -0
- lyrics_transcriber/correction/handlers/base.py +52 -0
- lyrics_transcriber/correction/handlers/extend_anchor.py +149 -0
- lyrics_transcriber/correction/handlers/levenshtein.py +189 -0
- lyrics_transcriber/correction/handlers/llm.py +293 -0
- lyrics_transcriber/correction/handlers/llm_providers.py +60 -0
- lyrics_transcriber/correction/handlers/no_space_punct_match.py +154 -0
- lyrics_transcriber/correction/handlers/relaxed_word_count_match.py +85 -0
- lyrics_transcriber/correction/handlers/repeat.py +88 -0
- lyrics_transcriber/correction/handlers/sound_alike.py +259 -0
- lyrics_transcriber/correction/handlers/syllables_match.py +252 -0
- lyrics_transcriber/correction/handlers/word_count_match.py +80 -0
- lyrics_transcriber/correction/handlers/word_operations.py +187 -0
- lyrics_transcriber/correction/operations.py +352 -0
- lyrics_transcriber/correction/phrase_analyzer.py +435 -0
- lyrics_transcriber/correction/text_utils.py +30 -0
- lyrics_transcriber/frontend/.gitignore +23 -0
- lyrics_transcriber/frontend/.yarn/releases/yarn-4.7.0.cjs +935 -0
- lyrics_transcriber/frontend/.yarnrc.yml +3 -0
- lyrics_transcriber/frontend/README.md +50 -0
- lyrics_transcriber/frontend/REPLACE_ALL_FUNCTIONALITY.md +210 -0
- lyrics_transcriber/frontend/__init__.py +25 -0
- lyrics_transcriber/frontend/eslint.config.js +28 -0
- lyrics_transcriber/frontend/index.html +18 -0
- lyrics_transcriber/frontend/package.json +42 -0
- lyrics_transcriber/frontend/public/android-chrome-192x192.png +0 -0
- lyrics_transcriber/frontend/public/android-chrome-512x512.png +0 -0
- lyrics_transcriber/frontend/public/apple-touch-icon.png +0 -0
- lyrics_transcriber/frontend/public/favicon-16x16.png +0 -0
- lyrics_transcriber/frontend/public/favicon-32x32.png +0 -0
- lyrics_transcriber/frontend/public/favicon.ico +0 -0
- lyrics_transcriber/frontend/public/nomad-karaoke-logo.png +0 -0
- lyrics_transcriber/frontend/src/App.tsx +212 -0
- lyrics_transcriber/frontend/src/api.ts +239 -0
- lyrics_transcriber/frontend/src/components/AIFeedbackModal.tsx +77 -0
- lyrics_transcriber/frontend/src/components/AddLyricsModal.tsx +114 -0
- lyrics_transcriber/frontend/src/components/AgenticCorrectionMetrics.tsx +204 -0
- lyrics_transcriber/frontend/src/components/AudioPlayer.tsx +180 -0
- lyrics_transcriber/frontend/src/components/CorrectedWordWithActions.tsx +167 -0
- lyrics_transcriber/frontend/src/components/CorrectionAnnotationModal.tsx +359 -0
- lyrics_transcriber/frontend/src/components/CorrectionDetailCard.tsx +281 -0
- lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx +162 -0
- lyrics_transcriber/frontend/src/components/DurationTimelineView.tsx +257 -0
- lyrics_transcriber/frontend/src/components/EditActionBar.tsx +68 -0
- lyrics_transcriber/frontend/src/components/EditModal.tsx +702 -0
- lyrics_transcriber/frontend/src/components/EditTimelineSection.tsx +496 -0
- lyrics_transcriber/frontend/src/components/EditWordList.tsx +379 -0
- lyrics_transcriber/frontend/src/components/FileUpload.tsx +77 -0
- lyrics_transcriber/frontend/src/components/FindReplaceModal.tsx +467 -0
- lyrics_transcriber/frontend/src/components/Header.tsx +387 -0
- lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx +1373 -0
- lyrics_transcriber/frontend/src/components/MetricsDashboard.tsx +51 -0
- lyrics_transcriber/frontend/src/components/ModeSelector.tsx +67 -0
- lyrics_transcriber/frontend/src/components/ModelSelector.tsx +23 -0
- lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx +144 -0
- lyrics_transcriber/frontend/src/components/ReferenceView.tsx +268 -0
- lyrics_transcriber/frontend/src/components/ReplaceAllLyricsModal.tsx +688 -0
- lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx +354 -0
- lyrics_transcriber/frontend/src/components/SegmentDetailsModal.tsx +64 -0
- lyrics_transcriber/frontend/src/components/TimelineEditor.tsx +376 -0
- lyrics_transcriber/frontend/src/components/TimingOffsetModal.tsx +131 -0
- lyrics_transcriber/frontend/src/components/TranscriptionView.tsx +256 -0
- lyrics_transcriber/frontend/src/components/WordDivider.tsx +187 -0
- lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx +379 -0
- lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx +56 -0
- lyrics_transcriber/frontend/src/components/shared/components/Word.tsx +87 -0
- lyrics_transcriber/frontend/src/components/shared/constants.ts +20 -0
- lyrics_transcriber/frontend/src/components/shared/hooks/useWordClick.ts +180 -0
- lyrics_transcriber/frontend/src/components/shared/styles.ts +13 -0
- lyrics_transcriber/frontend/src/components/shared/types.js +2 -0
- lyrics_transcriber/frontend/src/components/shared/types.ts +129 -0
- lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts +177 -0
- lyrics_transcriber/frontend/src/components/shared/utils/localStorage.ts +78 -0
- lyrics_transcriber/frontend/src/components/shared/utils/referenceLineCalculator.ts +75 -0
- lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts +360 -0
- lyrics_transcriber/frontend/src/components/shared/utils/timingUtils.ts +110 -0
- lyrics_transcriber/frontend/src/components/shared/utils/wordUtils.ts +22 -0
- lyrics_transcriber/frontend/src/hooks/useManualSync.ts +435 -0
- lyrics_transcriber/frontend/src/main.tsx +17 -0
- lyrics_transcriber/frontend/src/theme.ts +177 -0
- lyrics_transcriber/frontend/src/types/global.d.ts +9 -0
- lyrics_transcriber/frontend/src/types.js +2 -0
- lyrics_transcriber/frontend/src/types.ts +199 -0
- lyrics_transcriber/frontend/src/validation.ts +132 -0
- lyrics_transcriber/frontend/src/vite-env.d.ts +1 -0
- lyrics_transcriber/frontend/tsconfig.app.json +26 -0
- lyrics_transcriber/frontend/tsconfig.json +25 -0
- lyrics_transcriber/frontend/tsconfig.node.json +23 -0
- lyrics_transcriber/frontend/tsconfig.tsbuildinfo +1 -0
- lyrics_transcriber/frontend/update_version.js +11 -0
- lyrics_transcriber/frontend/vite.config.d.ts +2 -0
- lyrics_transcriber/frontend/vite.config.js +10 -0
- lyrics_transcriber/frontend/vite.config.ts +11 -0
- lyrics_transcriber/frontend/web_assets/android-chrome-192x192.png +0 -0
- lyrics_transcriber/frontend/web_assets/android-chrome-512x512.png +0 -0
- lyrics_transcriber/frontend/web_assets/apple-touch-icon.png +0 -0
- lyrics_transcriber/frontend/web_assets/assets/index-DdJTDWH3.js +42039 -0
- lyrics_transcriber/frontend/web_assets/assets/index-DdJTDWH3.js.map +1 -0
- lyrics_transcriber/frontend/web_assets/favicon-16x16.png +0 -0
- lyrics_transcriber/frontend/web_assets/favicon-32x32.png +0 -0
- lyrics_transcriber/frontend/web_assets/favicon.ico +0 -0
- lyrics_transcriber/frontend/web_assets/index.html +18 -0
- lyrics_transcriber/frontend/web_assets/nomad-karaoke-logo.png +0 -0
- lyrics_transcriber/frontend/yarn.lock +3752 -0
- lyrics_transcriber/lyrics/__init__.py +0 -0
- lyrics_transcriber/lyrics/base_lyrics_provider.py +211 -0
- lyrics_transcriber/lyrics/file_provider.py +95 -0
- lyrics_transcriber/lyrics/genius.py +384 -0
- lyrics_transcriber/lyrics/lrclib.py +231 -0
- lyrics_transcriber/lyrics/musixmatch.py +156 -0
- lyrics_transcriber/lyrics/spotify.py +290 -0
- lyrics_transcriber/lyrics/user_input_provider.py +44 -0
- lyrics_transcriber/output/__init__.py +0 -0
- lyrics_transcriber/output/ass/__init__.py +21 -0
- lyrics_transcriber/output/ass/ass.py +2088 -0
- lyrics_transcriber/output/ass/ass_specs.txt +732 -0
- lyrics_transcriber/output/ass/config.py +180 -0
- lyrics_transcriber/output/ass/constants.py +23 -0
- lyrics_transcriber/output/ass/event.py +94 -0
- lyrics_transcriber/output/ass/formatters.py +132 -0
- lyrics_transcriber/output/ass/lyrics_line.py +265 -0
- lyrics_transcriber/output/ass/lyrics_screen.py +252 -0
- lyrics_transcriber/output/ass/section_detector.py +89 -0
- lyrics_transcriber/output/ass/section_screen.py +106 -0
- lyrics_transcriber/output/ass/style.py +187 -0
- lyrics_transcriber/output/cdg.py +619 -0
- lyrics_transcriber/output/cdgmaker/__init__.py +0 -0
- lyrics_transcriber/output/cdgmaker/cdg.py +262 -0
- lyrics_transcriber/output/cdgmaker/composer.py +2260 -0
- lyrics_transcriber/output/cdgmaker/config.py +151 -0
- lyrics_transcriber/output/cdgmaker/images/instrumental.png +0 -0
- lyrics_transcriber/output/cdgmaker/images/intro.png +0 -0
- lyrics_transcriber/output/cdgmaker/pack.py +507 -0
- lyrics_transcriber/output/cdgmaker/render.py +346 -0
- lyrics_transcriber/output/cdgmaker/transitions/centertexttoplogobottomtext.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/circlein.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/circleout.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/fizzle.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/largecentertexttoplogo.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/rectangle.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/spiral.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/topleftmusicalnotes.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/wipein.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/wipeleft.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/wipeout.png +0 -0
- lyrics_transcriber/output/cdgmaker/transitions/wiperight.png +0 -0
- lyrics_transcriber/output/cdgmaker/utils.py +132 -0
- lyrics_transcriber/output/countdown_processor.py +267 -0
- lyrics_transcriber/output/fonts/AvenirNext-Bold.ttf +0 -0
- lyrics_transcriber/output/fonts/DMSans-VariableFont_opsz,wght.ttf +0 -0
- lyrics_transcriber/output/fonts/DMSerifDisplay-Regular.ttf +0 -0
- lyrics_transcriber/output/fonts/Oswald-SemiBold.ttf +0 -0
- lyrics_transcriber/output/fonts/Zurich_Cn_BT_Bold.ttf +0 -0
- lyrics_transcriber/output/fonts/arial.ttf +0 -0
- lyrics_transcriber/output/fonts/georgia.ttf +0 -0
- lyrics_transcriber/output/fonts/verdana.ttf +0 -0
- lyrics_transcriber/output/generator.py +257 -0
- lyrics_transcriber/output/lrc_to_cdg.py +61 -0
- lyrics_transcriber/output/lyrics_file.py +102 -0
- lyrics_transcriber/output/plain_text.py +96 -0
- lyrics_transcriber/output/segment_resizer.py +431 -0
- lyrics_transcriber/output/subtitles.py +397 -0
- lyrics_transcriber/output/video.py +544 -0
- lyrics_transcriber/review/__init__.py +0 -0
- lyrics_transcriber/review/server.py +676 -0
- lyrics_transcriber/storage/__init__.py +0 -0
- lyrics_transcriber/storage/dropbox.py +225 -0
- lyrics_transcriber/transcribers/__init__.py +0 -0
- lyrics_transcriber/transcribers/audioshake.py +290 -0
- lyrics_transcriber/transcribers/base_transcriber.py +157 -0
- lyrics_transcriber/transcribers/whisper.py +330 -0
- lyrics_transcriber/types.py +648 -0
- lyrics_transcriber/utils/__init__.py +0 -0
- lyrics_transcriber/utils/word_utils.py +27 -0
- karaoke_gen-0.57.0.dist-info/METADATA +0 -167
- karaoke_gen-0.57.0.dist-info/RECORD +0 -23
- {karaoke_gen-0.57.0.dist-info → karaoke_gen-0.71.27.dist-info/licenses}/LICENSE +0 -0
karaoke_gen/utils/gen_cli.py
CHANGED
|
@@ -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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
#
|
|
34
|
+
# Process style overrides
|
|
46
35
|
try:
|
|
47
|
-
|
|
48
|
-
except
|
|
49
|
-
|
|
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
|
-
|
|
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
|