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/config.py
CHANGED
|
@@ -1,130 +1,79 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Configuration utilities for karaoke generation.
|
|
3
|
+
|
|
4
|
+
This module provides configuration loading and setup functions.
|
|
5
|
+
Style loading is delegated to the unified style_loader module.
|
|
6
|
+
"""
|
|
1
7
|
import os
|
|
2
8
|
import sys
|
|
3
|
-
import json
|
|
4
9
|
import logging
|
|
5
10
|
|
|
6
|
-
#
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"extra_text": None,
|
|
21
|
-
"extra_text_color": "#ffffff",
|
|
22
|
-
"extra_text_gradient": None,
|
|
23
|
-
"extra_text_region": "370, 1200, 3100, 480",
|
|
24
|
-
"title_text_transform": None, # none, uppercase, lowercase, propercase
|
|
25
|
-
"artist_text_transform": None, # none, uppercase, lowercase, propercase
|
|
26
|
-
},
|
|
27
|
-
"end": {
|
|
28
|
-
"video_duration": 5,
|
|
29
|
-
"existing_image": None,
|
|
30
|
-
"background_color": "#000000",
|
|
31
|
-
"background_image": None,
|
|
32
|
-
"font": "Montserrat-Bold.ttf",
|
|
33
|
-
"artist_color": "#ffdf6b",
|
|
34
|
-
"artist_gradient": None,
|
|
35
|
-
"title_color": "#ffffff",
|
|
36
|
-
"title_gradient": None,
|
|
37
|
-
"title_region": None,
|
|
38
|
-
"artist_region": None,
|
|
39
|
-
"extra_text": "THANK YOU FOR SINGING!",
|
|
40
|
-
"extra_text_color": "#ff7acc",
|
|
41
|
-
"extra_text_gradient": None,
|
|
42
|
-
"extra_text_region": None,
|
|
43
|
-
"title_text_transform": None, # none, uppercase, lowercase, propercase
|
|
44
|
-
"artist_text_transform": None, # none, uppercase, lowercase, propercase
|
|
45
|
-
},
|
|
46
|
-
}
|
|
11
|
+
# Import from the unified style loader module
|
|
12
|
+
from .style_loader import (
|
|
13
|
+
# Re-export defaults for backwards compatibility
|
|
14
|
+
DEFAULT_STYLE_PARAMS,
|
|
15
|
+
DEFAULT_INTRO_STYLE as _DEFAULT_INTRO,
|
|
16
|
+
DEFAULT_END_STYLE as _DEFAULT_END,
|
|
17
|
+
# Functions
|
|
18
|
+
load_style_params_from_file,
|
|
19
|
+
apply_style_overrides,
|
|
20
|
+
get_intro_format as _get_intro_format,
|
|
21
|
+
get_end_format as _get_end_format,
|
|
22
|
+
get_video_durations,
|
|
23
|
+
get_existing_images,
|
|
24
|
+
)
|
|
47
25
|
|
|
48
26
|
|
|
49
|
-
def load_style_params(style_params_json, logger):
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
27
|
+
def load_style_params(style_params_json, style_overrides, logger):
|
|
28
|
+
"""
|
|
29
|
+
Loads style parameters from a JSON file or uses defaults.
|
|
30
|
+
|
|
31
|
+
This is the main entry point for the local CLI to load styles.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
style_params_json: Path to style JSON file, or None for defaults.
|
|
35
|
+
style_overrides: Dict of "section.key" -> value overrides.
|
|
36
|
+
logger: Logger for messages.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Dictionary of style parameters.
|
|
40
|
+
"""
|
|
41
|
+
style_params = load_style_params_from_file(
|
|
42
|
+
style_params_json,
|
|
43
|
+
logger=logger,
|
|
44
|
+
exit_on_error=True,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
if style_overrides:
|
|
48
|
+
apply_style_overrides(style_params, style_overrides, logger)
|
|
49
|
+
|
|
50
|
+
return style_params
|
|
51
|
+
|
|
70
52
|
|
|
71
53
|
def setup_title_format(style_params):
|
|
72
|
-
"""
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"artist_gradient": intro_params.get("artist_gradient"),
|
|
80
|
-
"title_color": intro_params.get("title_color", DEFAULT_STYLE_PARAMS["intro"]["title_color"]),
|
|
81
|
-
"title_gradient": intro_params.get("title_gradient"),
|
|
82
|
-
"extra_text": intro_params.get("extra_text"),
|
|
83
|
-
"extra_text_color": intro_params.get("extra_text_color", DEFAULT_STYLE_PARAMS["intro"]["extra_text_color"]),
|
|
84
|
-
"extra_text_gradient": intro_params.get("extra_text_gradient"),
|
|
85
|
-
"extra_text_region": intro_params.get("extra_text_region", DEFAULT_STYLE_PARAMS["intro"]["extra_text_region"]),
|
|
86
|
-
"title_region": intro_params.get("title_region", DEFAULT_STYLE_PARAMS["intro"]["title_region"]),
|
|
87
|
-
"artist_region": intro_params.get("artist_region", DEFAULT_STYLE_PARAMS["intro"]["artist_region"]),
|
|
88
|
-
"title_text_transform": intro_params.get("title_text_transform"),
|
|
89
|
-
"artist_text_transform": intro_params.get("artist_text_transform"),
|
|
90
|
-
}
|
|
54
|
+
"""
|
|
55
|
+
Sets up the title format dictionary from style parameters.
|
|
56
|
+
|
|
57
|
+
This is a thin wrapper around style_loader.get_intro_format()
|
|
58
|
+
for backwards compatibility.
|
|
59
|
+
"""
|
|
60
|
+
return _get_intro_format(style_params)
|
|
91
61
|
|
|
92
|
-
def setup_end_format(style_params):
|
|
93
|
-
"""Sets up the end format dictionary from style parameters."""
|
|
94
|
-
end_params = style_params.get("end", DEFAULT_STYLE_PARAMS["end"])
|
|
95
|
-
return {
|
|
96
|
-
"background_color": end_params.get("background_color", DEFAULT_STYLE_PARAMS["end"]["background_color"]),
|
|
97
|
-
"background_image": end_params.get("background_image"),
|
|
98
|
-
"font": end_params.get("font", DEFAULT_STYLE_PARAMS["end"]["font"]),
|
|
99
|
-
"artist_color": end_params.get("artist_color", DEFAULT_STYLE_PARAMS["end"]["artist_color"]),
|
|
100
|
-
"artist_gradient": end_params.get("artist_gradient"),
|
|
101
|
-
"title_color": end_params.get("title_color", DEFAULT_STYLE_PARAMS["end"]["title_color"]),
|
|
102
|
-
"title_gradient": end_params.get("title_gradient"),
|
|
103
|
-
"extra_text": end_params.get("extra_text", DEFAULT_STYLE_PARAMS["end"]["extra_text"]),
|
|
104
|
-
"extra_text_color": end_params.get("extra_text_color", DEFAULT_STYLE_PARAMS["end"]["extra_text_color"]),
|
|
105
|
-
"extra_text_gradient": end_params.get("extra_text_gradient"),
|
|
106
|
-
"extra_text_region": end_params.get("extra_text_region"),
|
|
107
|
-
"title_region": end_params.get("title_region"),
|
|
108
|
-
"artist_region": end_params.get("artist_region"),
|
|
109
|
-
"title_text_transform": end_params.get("title_text_transform"),
|
|
110
|
-
"artist_text_transform": end_params.get("artist_text_transform"),
|
|
111
|
-
}
|
|
112
62
|
|
|
113
|
-
def
|
|
114
|
-
"""
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
63
|
+
def setup_end_format(style_params):
|
|
64
|
+
"""
|
|
65
|
+
Sets up the end format dictionary from style parameters.
|
|
66
|
+
|
|
67
|
+
This is a thin wrapper around style_loader.get_end_format()
|
|
68
|
+
for backwards compatibility.
|
|
69
|
+
"""
|
|
70
|
+
return _get_end_format(style_params)
|
|
118
71
|
|
|
119
|
-
def get_existing_images(style_params):
|
|
120
|
-
"""Gets existing title and end images from style parameters."""
|
|
121
|
-
existing_title_image = style_params.get("intro", {}).get("existing_image")
|
|
122
|
-
existing_end_image = style_params.get("end", {}).get("existing_image")
|
|
123
|
-
return existing_title_image, existing_end_image
|
|
124
72
|
|
|
125
73
|
def setup_ffmpeg_command(log_level):
|
|
126
74
|
"""Sets up the base ffmpeg command string based on log level."""
|
|
127
|
-
# Path to the Windows PyInstaller frozen bundled ffmpeg.exe,
|
|
75
|
+
# Path to the Windows PyInstaller frozen bundled ffmpeg.exe,
|
|
76
|
+
# or the system-installed FFmpeg binary on Mac/Linux
|
|
128
77
|
ffmpeg_path = os.path.join(sys._MEIPASS, "ffmpeg.exe") if getattr(sys, "frozen", False) else "ffmpeg"
|
|
129
78
|
ffmpeg_base_command = f"{ffmpeg_path} -hide_banner -nostats"
|
|
130
79
|
if log_level == logging.DEBUG:
|
karaoke_gen/file_handler.py
CHANGED
|
@@ -3,7 +3,6 @@ import glob
|
|
|
3
3
|
import logging
|
|
4
4
|
import shutil
|
|
5
5
|
import tempfile
|
|
6
|
-
import yt_dlp.YoutubeDL as ydl
|
|
7
6
|
from .utils import sanitize_filename
|
|
8
7
|
|
|
9
8
|
|
|
@@ -39,64 +38,38 @@ class FileHandler:
|
|
|
39
38
|
|
|
40
39
|
return copied_file_name
|
|
41
40
|
|
|
42
|
-
def
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
f.write(cookies_str)
|
|
75
|
-
ydl_opts['cookiefile'] = f.name
|
|
76
|
-
else:
|
|
77
|
-
self.logger.info("No cookies provided for download - attempting standard download")
|
|
78
|
-
|
|
79
|
-
try:
|
|
80
|
-
with ydl(ydl_opts) as ydl_instance:
|
|
81
|
-
ydl_instance.download([url])
|
|
82
|
-
|
|
83
|
-
# Search for the file with any extension
|
|
84
|
-
downloaded_files = glob.glob(f"{output_filename_no_extension}.*")
|
|
85
|
-
if downloaded_files:
|
|
86
|
-
downloaded_file_name = downloaded_files[0] # Assume the first match is the correct one
|
|
87
|
-
self.logger.info(f"Download finished, returning downloaded filename: {downloaded_file_name}")
|
|
88
|
-
return downloaded_file_name
|
|
89
|
-
else:
|
|
90
|
-
self.logger.error("No files found matching the download pattern.")
|
|
91
|
-
return None
|
|
92
|
-
finally:
|
|
93
|
-
# Clean up temporary cookie file if it was created
|
|
94
|
-
if cookies_str and 'cookiefile' in ydl_opts:
|
|
95
|
-
try:
|
|
96
|
-
import os
|
|
97
|
-
os.unlink(ydl_opts['cookiefile'])
|
|
98
|
-
except:
|
|
99
|
-
pass
|
|
41
|
+
def download_audio_from_fetcher_result(self, filepath, output_filename_no_extension):
|
|
42
|
+
"""
|
|
43
|
+
Handle audio that was downloaded via the AudioFetcher.
|
|
44
|
+
|
|
45
|
+
This method copies/moves the downloaded file to the expected location
|
|
46
|
+
and returns the path with the correct naming convention.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
filepath: Path to the downloaded audio file from AudioFetcher
|
|
50
|
+
output_filename_no_extension: Desired output filename without extension
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
Path to the renamed/copied audio file
|
|
54
|
+
"""
|
|
55
|
+
if not os.path.isfile(filepath):
|
|
56
|
+
self.logger.error(f"Downloaded file not found: {filepath}")
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
# Get the extension from the downloaded file
|
|
60
|
+
ext = os.path.splitext(filepath)[1]
|
|
61
|
+
target_path = f"{output_filename_no_extension}{ext}"
|
|
62
|
+
|
|
63
|
+
# If source and target are the same, no action needed
|
|
64
|
+
if os.path.abspath(filepath) == os.path.abspath(target_path):
|
|
65
|
+
self.logger.debug(f"Downloaded file already at target location: {target_path}")
|
|
66
|
+
return target_path
|
|
67
|
+
|
|
68
|
+
# Copy the file to the target location
|
|
69
|
+
self.logger.debug(f"Copying downloaded file from {filepath} to {target_path}")
|
|
70
|
+
shutil.copy2(filepath, target_path)
|
|
71
|
+
|
|
72
|
+
return target_path
|
|
100
73
|
|
|
101
74
|
def extract_still_image_from_video(self, input_filename, output_filename_no_extension):
|
|
102
75
|
output_filename = output_filename_no_extension + ".png"
|