lyrics-transcriber 0.43.1__py3-none-any.whl → 0.45.0__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 (51) hide show
  1. lyrics_transcriber/core/controller.py +58 -24
  2. lyrics_transcriber/correction/anchor_sequence.py +22 -8
  3. lyrics_transcriber/correction/corrector.py +47 -3
  4. lyrics_transcriber/correction/handlers/llm.py +15 -12
  5. lyrics_transcriber/correction/handlers/llm_providers.py +60 -0
  6. lyrics_transcriber/frontend/.yarn/install-state.gz +0 -0
  7. lyrics_transcriber/frontend/dist/assets/{index-D0Gr3Ep7.js → index-ZCT0s9MG.js} +10174 -6197
  8. lyrics_transcriber/frontend/dist/assets/index-ZCT0s9MG.js.map +1 -0
  9. lyrics_transcriber/frontend/dist/index.html +1 -1
  10. lyrics_transcriber/frontend/src/App.tsx +5 -5
  11. lyrics_transcriber/frontend/src/api.ts +37 -0
  12. lyrics_transcriber/frontend/src/components/AddLyricsModal.tsx +114 -0
  13. lyrics_transcriber/frontend/src/components/AudioPlayer.tsx +14 -10
  14. lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx +62 -56
  15. lyrics_transcriber/frontend/src/components/EditActionBar.tsx +68 -0
  16. lyrics_transcriber/frontend/src/components/EditModal.tsx +467 -399
  17. lyrics_transcriber/frontend/src/components/EditTimelineSection.tsx +373 -0
  18. lyrics_transcriber/frontend/src/components/EditWordList.tsx +308 -0
  19. lyrics_transcriber/frontend/src/components/FindReplaceModal.tsx +467 -0
  20. lyrics_transcriber/frontend/src/components/Header.tsx +141 -101
  21. lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx +569 -107
  22. lyrics_transcriber/frontend/src/components/ModeSelector.tsx +22 -13
  23. lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx +1 -0
  24. lyrics_transcriber/frontend/src/components/ReferenceView.tsx +29 -12
  25. lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx +21 -4
  26. lyrics_transcriber/frontend/src/components/TimelineEditor.tsx +29 -15
  27. lyrics_transcriber/frontend/src/components/TranscriptionView.tsx +36 -18
  28. lyrics_transcriber/frontend/src/components/WordDivider.tsx +187 -0
  29. lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx +89 -41
  30. lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx +9 -2
  31. lyrics_transcriber/frontend/src/components/shared/components/Word.tsx +27 -3
  32. lyrics_transcriber/frontend/src/components/shared/types.ts +17 -2
  33. lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts +90 -19
  34. lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts +192 -0
  35. lyrics_transcriber/frontend/src/hooks/useManualSync.ts +267 -0
  36. lyrics_transcriber/frontend/src/main.tsx +7 -1
  37. lyrics_transcriber/frontend/src/theme.ts +177 -0
  38. lyrics_transcriber/frontend/src/types.ts +1 -1
  39. lyrics_transcriber/frontend/tsconfig.tsbuildinfo +1 -1
  40. lyrics_transcriber/lyrics/base_lyrics_provider.py +2 -2
  41. lyrics_transcriber/lyrics/user_input_provider.py +44 -0
  42. lyrics_transcriber/output/generator.py +40 -12
  43. lyrics_transcriber/review/server.py +238 -8
  44. {lyrics_transcriber-0.43.1.dist-info → lyrics_transcriber-0.45.0.dist-info}/METADATA +3 -2
  45. {lyrics_transcriber-0.43.1.dist-info → lyrics_transcriber-0.45.0.dist-info}/RECORD +48 -40
  46. lyrics_transcriber/frontend/dist/assets/index-D0Gr3Ep7.js.map +0 -1
  47. lyrics_transcriber/frontend/src/components/DetailsModal.tsx +0 -252
  48. lyrics_transcriber/frontend/src/components/WordEditControls.tsx +0 -110
  49. {lyrics_transcriber-0.43.1.dist-info → lyrics_transcriber-0.45.0.dist-info}/LICENSE +0 -0
  50. {lyrics_transcriber-0.43.1.dist-info → lyrics_transcriber-0.45.0.dist-info}/WHEEL +0 -0
  51. {lyrics_transcriber-0.43.1.dist-info → lyrics_transcriber-0.45.0.dist-info}/entry_points.txt +0 -0
@@ -2,8 +2,8 @@ import logging
2
2
  import socket
3
3
  from fastapi import FastAPI, Body, HTTPException
4
4
  from fastapi.middleware.cors import CORSMiddleware
5
- from typing import Dict, Any, List
6
- from lyrics_transcriber.types import CorrectionResult, WordCorrection, LyricsSegment
5
+ from typing import Dict, Any, List, Optional
6
+ from lyrics_transcriber.types import CorrectionResult, WordCorrection, LyricsSegment, LyricsData, LyricsMetadata, Word
7
7
  import time
8
8
  import os
9
9
  import urllib.parse
@@ -18,6 +18,7 @@ from lyrics_transcriber.output.generator import OutputGenerator
18
18
  import json
19
19
  from lyrics_transcriber.correction.corrector import LyricsCorrector
20
20
  from lyrics_transcriber.types import TranscriptionResult, TranscriptionData
21
+ from lyrics_transcriber.lyrics.user_input_provider import UserInputProvider
21
22
 
22
23
 
23
24
  class ReviewServer:
@@ -73,6 +74,7 @@ class ReviewServer:
73
74
  self.app.add_api_route("/api/audio/{audio_hash}", self.get_audio, methods=["GET"])
74
75
  self.app.add_api_route("/api/ping", self.ping, methods=["GET"])
75
76
  self.app.add_api_route("/api/handlers", self.update_handlers, methods=["POST"])
77
+ self.app.add_api_route("/api/add-lyrics", self.add_lyrics, methods=["POST"])
76
78
 
77
79
  async def get_correction_data(self):
78
80
  """Get the correction data."""
@@ -83,8 +85,8 @@ class ReviewServer:
83
85
  return CorrectionResult(
84
86
  corrections=[
85
87
  WordCorrection(
86
- original_word=c.get("original_word", ""),
87
- corrected_word=c.get("corrected_word", ""),
88
+ original_word=c.get("original_word", "").strip(),
89
+ corrected_word=c.get("corrected_word", "").strip(),
88
90
  original_position=c.get("original_position", 0),
89
91
  source=c.get("source", "review"),
90
92
  reason=c.get("reason", "manual_review"),
@@ -103,7 +105,26 @@ class ReviewServer:
103
105
  )
104
106
  for c in updated_data["corrections"]
105
107
  ],
106
- corrected_segments=[LyricsSegment.from_dict(s) for s in updated_data["corrected_segments"]],
108
+ corrected_segments=[
109
+ LyricsSegment(
110
+ id=s["id"],
111
+ text=s["text"].strip(),
112
+ words=[
113
+ Word(
114
+ id=w["id"],
115
+ text=w["text"].strip(),
116
+ start_time=w["start_time"],
117
+ end_time=w["end_time"],
118
+ confidence=w.get("confidence"),
119
+ created_during_correction=w.get("created_during_correction", False),
120
+ )
121
+ for w in s["words"]
122
+ ],
123
+ start_time=s["start_time"],
124
+ end_time=s["end_time"],
125
+ )
126
+ for s in updated_data["corrected_segments"]
127
+ ],
107
128
  # Copy existing fields from the base result
108
129
  original_segments=base_result.original_segments,
109
130
  corrections_made=len(updated_data["corrections"]),
@@ -166,7 +187,7 @@ class ReviewServer:
166
187
  styles=self.output_config.styles,
167
188
  max_line_length=self.output_config.max_line_length,
168
189
  )
169
- output_generator = OutputGenerator(config=preview_config, logger=self.logger)
190
+ output_generator = OutputGenerator(config=preview_config, logger=self.logger, preview_mode=True)
170
191
 
171
192
  # Generate preview outputs with unique prefix
172
193
  preview_outputs = output_generator.generate_outputs(
@@ -174,7 +195,6 @@ class ReviewServer:
174
195
  lyrics_results={}, # Empty dict since we don't need lyrics results for preview
175
196
  output_prefix=f"preview_{preview_hash}", # Include hash in filename
176
197
  audio_filepath=self.audio_filepath,
177
- preview_mode=True,
178
198
  )
179
199
 
180
200
  if not preview_outputs.video:
@@ -238,13 +258,58 @@ class ReviewServer:
238
258
  source="original",
239
259
  )
240
260
 
241
- # Run correction
261
+ # Get currently enabled handlers from metadata
262
+ enabled_handlers = None
263
+ if self.correction_result.metadata:
264
+ if "enabled_handlers" in self.correction_result.metadata:
265
+ enabled_handlers = self.correction_result.metadata["enabled_handlers"]
266
+ self.logger.info(f"Found existing enabled handlers in metadata: {enabled_handlers}")
267
+ elif "available_handlers" in self.correction_result.metadata:
268
+ # If no enabled_handlers but we have available_handlers, enable all default handlers
269
+ enabled_handlers = [
270
+ handler["id"] for handler in self.correction_result.metadata["available_handlers"] if handler.get("enabled", True)
271
+ ]
272
+ self.logger.info(f"No enabled handlers found in metadata, using default enabled handlers: {enabled_handlers}")
273
+ else:
274
+ self.logger.warning("No handler configuration found in metadata")
275
+
276
+ # Log reference sources before correction
277
+ for source, lyrics in self.correction_result.reference_lyrics.items():
278
+ word_count = sum(len(s.words) for s in lyrics.segments)
279
+ self.logger.info(f"Reference source '{source}': {word_count} words in {len(lyrics.segments)} segments")
280
+
281
+ # Rerun correction with updated reference lyrics
282
+ self.logger.info("Initializing LyricsCorrector for re-correction")
283
+ self.logger.info(f"Passing enabled handlers to corrector: {enabled_handlers or '[]'}")
284
+ corrector = LyricsCorrector(
285
+ cache_dir=self.output_config.cache_dir,
286
+ enabled_handlers=enabled_handlers, # Pass the preserved handlers or None to use defaults
287
+ logger=self.logger,
288
+ )
289
+
290
+ self.logger.info(f"Active correction handlers: {[h.__class__.__name__ for h in corrector.handlers]}")
291
+ self.logger.info("Running correction with updated reference lyrics")
242
292
  self.correction_result = corrector.run(
243
293
  transcription_results=[TranscriptionResult(name="original", priority=1, result=transcription_data)],
244
294
  lyrics_results=self.correction_result.reference_lyrics,
245
295
  metadata=self.correction_result.metadata,
246
296
  )
247
297
 
298
+ # Update metadata with the new handler state from corrector
299
+ if not self.correction_result.metadata:
300
+ self.correction_result.metadata = {}
301
+ self.correction_result.metadata.update(
302
+ {
303
+ "available_handlers": corrector.all_handlers,
304
+ "enabled_handlers": [getattr(handler, "name", handler.__class__.__name__) for handler in corrector.handlers],
305
+ }
306
+ )
307
+
308
+ self.logger.info("Correction process completed")
309
+ self.logger.info(
310
+ f"Updated metadata with {len(corrector.handlers)} enabled handlers: {self.correction_result.metadata['enabled_handlers']}"
311
+ )
312
+
248
313
  # Restore audio hash
249
314
  if audio_hash:
250
315
  if not self.correction_result.metadata:
@@ -256,6 +321,171 @@ class ReviewServer:
256
321
  self.logger.error(f"Failed to update handlers: {str(e)}")
257
322
  raise HTTPException(status_code=500, detail=str(e))
258
323
 
324
+ def _create_lyrics_data_from_text(self, text: str, source: str) -> LyricsData:
325
+ """Create LyricsData object from plain text lyrics."""
326
+ self.logger.info(f"Creating LyricsData for source '{source}'")
327
+
328
+ # Split text into lines and create segments
329
+ lines = [line.strip() for line in text.split("\n") if line.strip()]
330
+ self.logger.info(f"Found {len(lines)} non-empty lines in input text")
331
+
332
+ segments = []
333
+ for i, line in enumerate(lines):
334
+ # Split line into words
335
+ word_texts = line.strip().split()
336
+ words = []
337
+
338
+ for j, word_text in enumerate(word_texts):
339
+ word = Word(
340
+ id=f"manual_{source}_word_{i}_{j}", # Create unique ID for each word
341
+ text=word_text,
342
+ start_time=0.0, # Placeholder timing
343
+ end_time=0.0,
344
+ confidence=1.0, # Reference lyrics are considered ground truth
345
+ created_during_correction=False,
346
+ )
347
+ words.append(word)
348
+
349
+ segments.append(
350
+ LyricsSegment(
351
+ id=f"manual_{source}_{i}",
352
+ text=line,
353
+ words=words, # Now including the word objects
354
+ start_time=0.0, # Placeholder timing
355
+ end_time=0.0,
356
+ )
357
+ )
358
+
359
+ # Create metadata
360
+ self.logger.info("Creating metadata for LyricsData")
361
+ metadata = LyricsMetadata(
362
+ source=source,
363
+ track_name=self.correction_result.metadata.get("title", "") or "",
364
+ artist_names=self.correction_result.metadata.get("artist", "") or "",
365
+ is_synced=False,
366
+ lyrics_provider="manual",
367
+ lyrics_provider_id="",
368
+ album_name=None,
369
+ duration_ms=None,
370
+ explicit=None,
371
+ language=None,
372
+ provider_metadata={},
373
+ )
374
+ self.logger.info(f"Created metadata: {metadata}")
375
+
376
+ lyrics_data = LyricsData(segments=segments, metadata=metadata, source=source)
377
+ self.logger.info(f"Created LyricsData with {len(segments)} segments and {sum(len(s.words) for s in segments)} total words")
378
+
379
+ return lyrics_data
380
+
381
+ async def add_lyrics(self, data: Dict[str, str] = Body(...)):
382
+ """Add new lyrics source and rerun correction."""
383
+ try:
384
+ # Store existing audio hash
385
+ audio_hash = self.correction_result.metadata.get("audio_hash") if self.correction_result.metadata else None
386
+
387
+ source = data.get("source", "").strip()
388
+ lyrics_text = data.get("lyrics", "").strip()
389
+
390
+ self.logger.info(f"Received request to add lyrics source '{source}' with {len(lyrics_text)} characters")
391
+
392
+ if not source or not lyrics_text:
393
+ self.logger.warning("Invalid request: missing source or lyrics text")
394
+ raise HTTPException(status_code=400, detail="Source name and lyrics text are required")
395
+
396
+ # Validate source name isn't already used
397
+ if source in self.correction_result.reference_lyrics:
398
+ self.logger.warning(f"Source name '{source}' is already in use")
399
+ raise HTTPException(status_code=400, detail=f"Source name '{source}' is already in use")
400
+
401
+ # Create lyrics data using the provider
402
+ self.logger.info("Creating LyricsData using UserInputProvider")
403
+ provider = UserInputProvider(
404
+ lyrics_text=lyrics_text, source_name=source, metadata=self.correction_result.metadata or {}, logger=self.logger
405
+ )
406
+ lyrics_data = provider._convert_result_format({"text": lyrics_text, "metadata": self.correction_result.metadata or {}})
407
+ self.logger.info(f"Created LyricsData with {len(lyrics_data.segments)} segments")
408
+
409
+ # Add to reference lyrics
410
+ self.logger.info(f"Adding new source '{source}' to reference_lyrics")
411
+ self.correction_result.reference_lyrics[source] = lyrics_data
412
+ self.logger.info(f"Now have {len(self.correction_result.reference_lyrics)} total reference sources")
413
+
414
+ # Create TranscriptionData from original segments
415
+ self.logger.info("Creating TranscriptionData from original segments")
416
+ transcription_data = TranscriptionData(
417
+ segments=self.correction_result.original_segments,
418
+ words=[word for segment in self.correction_result.original_segments for word in segment.words],
419
+ text="\n".join(segment.text for segment in self.correction_result.original_segments),
420
+ source="original",
421
+ )
422
+
423
+ # Get currently enabled handlers from metadata
424
+ enabled_handlers = None
425
+ if self.correction_result.metadata:
426
+ if "enabled_handlers" in self.correction_result.metadata:
427
+ enabled_handlers = self.correction_result.metadata["enabled_handlers"]
428
+ self.logger.info(f"Found existing enabled handlers in metadata: {enabled_handlers}")
429
+ elif "available_handlers" in self.correction_result.metadata:
430
+ # If no enabled_handlers but we have available_handlers, enable all default handlers
431
+ enabled_handlers = [
432
+ handler["id"] for handler in self.correction_result.metadata["available_handlers"] if handler.get("enabled", True)
433
+ ]
434
+ self.logger.info(f"No enabled handlers found in metadata, using default enabled handlers: {enabled_handlers}")
435
+ else:
436
+ self.logger.warning("No handler configuration found in metadata")
437
+
438
+ # Log reference sources before correction
439
+ for source, lyrics in self.correction_result.reference_lyrics.items():
440
+ word_count = sum(len(s.words) for s in lyrics.segments)
441
+ self.logger.info(f"Reference source '{source}': {word_count} words in {len(lyrics.segments)} segments")
442
+
443
+ # Rerun correction with updated reference lyrics
444
+ self.logger.info("Initializing LyricsCorrector for re-correction")
445
+ self.logger.info(f"Passing enabled handlers to corrector: {enabled_handlers or '[]'}")
446
+ corrector = LyricsCorrector(
447
+ cache_dir=self.output_config.cache_dir,
448
+ enabled_handlers=enabled_handlers, # Pass the preserved handlers or None to use defaults
449
+ logger=self.logger,
450
+ )
451
+
452
+ self.logger.info(f"Active correction handlers: {[h.__class__.__name__ for h in corrector.handlers]}")
453
+ self.logger.info("Running correction with updated reference lyrics")
454
+ self.correction_result = corrector.run(
455
+ transcription_results=[TranscriptionResult(name="original", priority=1, result=transcription_data)],
456
+ lyrics_results=self.correction_result.reference_lyrics,
457
+ metadata=self.correction_result.metadata,
458
+ )
459
+
460
+ # Update metadata with the new handler state from corrector
461
+ if not self.correction_result.metadata:
462
+ self.correction_result.metadata = {}
463
+ self.correction_result.metadata.update(
464
+ {
465
+ "available_handlers": corrector.all_handlers,
466
+ "enabled_handlers": [getattr(handler, "name", handler.__class__.__name__) for handler in corrector.handlers],
467
+ }
468
+ )
469
+
470
+ # Restore audio hash
471
+ if audio_hash:
472
+ if not self.correction_result.metadata:
473
+ self.correction_result.metadata = {}
474
+ self.correction_result.metadata["audio_hash"] = audio_hash
475
+
476
+ self.logger.info("Correction process completed")
477
+ self.logger.info(
478
+ f"Updated metadata with {len(corrector.handlers)} enabled handlers: {self.correction_result.metadata['enabled_handlers']}"
479
+ )
480
+
481
+ return {"status": "success", "data": self.correction_result.to_dict()}
482
+
483
+ except HTTPException:
484
+ raise
485
+ except Exception as e:
486
+ self.logger.error(f"Failed to add lyrics: {str(e)}", exc_info=True)
487
+ raise HTTPException(status_code=500, detail=str(e))
488
+
259
489
  def start(self) -> CorrectionResult:
260
490
  """Start the review server and wait for completion."""
261
491
  # Generate audio hash if audio file exists
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lyrics-transcriber
3
- Version: 0.43.1
3
+ Version: 0.45.0
4
4
  Summary: Automatically create synchronised lyrics files in ASS and MidiCo LRC formats with word-level timestamps, using Whisper and lyrics from Genius and Spotify
5
5
  License: MIT
6
6
  Author: Andrew Beveridge
@@ -16,10 +16,11 @@ Requires-Dist: dropbox (>=12)
16
16
  Requires-Dist: fastapi (>=0.115)
17
17
  Requires-Dist: fonttools (>=4.55)
18
18
  Requires-Dist: karaoke-lyrics-processor (>=0.4)
19
- Requires-Dist: lyricsgenius (>=3)
19
+ Requires-Dist: lyricsgenius (>=0.1.0)
20
20
  Requires-Dist: metaphone (>=0.6)
21
21
  Requires-Dist: nltk (>=3.9)
22
22
  Requires-Dist: ollama (>=0.4.7,<0.5.0)
23
+ Requires-Dist: openai (>=1.63.2,<2.0.0)
23
24
  Requires-Dist: pydub (>=0.25)
24
25
  Requires-Dist: python-dotenv (>=1)
25
26
  Requires-Dist: python-levenshtein (>=0.26)
@@ -3,14 +3,15 @@ lyrics_transcriber/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
3
3
  lyrics_transcriber/cli/cli_main.py,sha256=MDgjIlgmKDfv3z6nK_j7TJKtcijfuLrB06hDMXXaZQY,10211
4
4
  lyrics_transcriber/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  lyrics_transcriber/core/config.py,sha256=euwOOtuNbXy4-a1xs8QKdjcf5jXZQle0zf6X1Wthurw,1229
6
- lyrics_transcriber/core/controller.py,sha256=YX4OsKSNAHQEGVjI9BjTpMGZk9h3Gvowb9IzbApRCuc,18529
7
- lyrics_transcriber/correction/anchor_sequence.py,sha256=xhXcREuPVVeGcrntDf7O8pa-CBqVGqU5GDym1Zdm0QA,29515
8
- lyrics_transcriber/correction/corrector.py,sha256=Lh--FtgXVFCDBzNe7mQzmEiZI85MgicKCpW63R6JZgw,18985
6
+ lyrics_transcriber/core/controller.py,sha256=66qwIv-2jEW94wU5RVFRIcfrTyszC-aC_Fcx5dCjG7k,20255
7
+ lyrics_transcriber/correction/anchor_sequence.py,sha256=QB9_74YsMTMRyEqNNqaSx-6MEO7mmkKstywfvkujT7g,30089
8
+ lyrics_transcriber/correction/corrector.py,sha256=cMraMRE27RtWN7BocM77NDNCLY1FV4ocKM8dP7bVcuQ,20848
9
9
  lyrics_transcriber/correction/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  lyrics_transcriber/correction/handlers/base.py,sha256=ZXYMFgbCmlD62dpqdFwFPlcePdHKEFrABffnG_Mu5mI,1687
11
11
  lyrics_transcriber/correction/handlers/extend_anchor.py,sha256=wGGEtVmcEdYOTNuQQFz7Afhpfnn4Su0soiPmnY0dIRo,5944
12
12
  lyrics_transcriber/correction/handlers/levenshtein.py,sha256=hMERQHVgiUDSHtamYrAjqZ3qMMok4VmQ_MYM2-nrX6w,7864
13
- lyrics_transcriber/correction/handlers/llm.py,sha256=Yq4kNwXExehUEOgotJ5ACwhgABA2vrUMSOgcMg7eLnM,14608
13
+ lyrics_transcriber/correction/handlers/llm.py,sha256=ufqHtohdU5dUXE3DikzbloAWGVgMu1wnw6P4WHRmpdk,14580
14
+ lyrics_transcriber/correction/handlers/llm_providers.py,sha256=MV-KCRseccg-DEimMS0D2bXJ2xhy59r2n8UZjICUoEY,2067
14
15
  lyrics_transcriber/correction/handlers/no_space_punct_match.py,sha256=jY2fa547Qc8B63xIhF9VyWMaq5jds6E6wBqyVq6KANw,7057
15
16
  lyrics_transcriber/correction/handlers/relaxed_word_count_match.py,sha256=x4k__6gav4-STk_TycLcg5Sw4x2vUFAj5fWmOv7Yd_w,3911
16
17
  lyrics_transcriber/correction/handlers/repeat.py,sha256=1PJADW44egYh7N9D2fN-gDIusWVglFjGHrCZuTQYNpA,4313
@@ -21,66 +22,73 @@ lyrics_transcriber/correction/handlers/word_operations.py,sha256=410xhyO9tiqezV5
21
22
  lyrics_transcriber/correction/phrase_analyzer.py,sha256=dtO_2LjxnPdHJM7De40mYIdHCkozwhizVVQp5XGO7x0,16962
22
23
  lyrics_transcriber/correction/text_utils.py,sha256=z4eiTBCmkNeTUvxG_RpR1Zwg0cbMPKFyxVaKAvLAk88,761
23
24
  lyrics_transcriber/frontend/.gitignore,sha256=lgGIPiVpFVUNSZl9oNQLelLOWUzpF7sikLW8xmsrrqI,248
24
- lyrics_transcriber/frontend/.yarn/install-state.gz,sha256=ZEa-uz3UAehu8JjLeLqwdfq5dWme7h9fgx34Cj-3xVU,347949
25
+ lyrics_transcriber/frontend/.yarn/install-state.gz,sha256=kcgQ-S9HvdNHexkXQVt18LWUpqtP2mdyRfjJV1htFAc,345895
25
26
  lyrics_transcriber/frontend/.yarn/releases/yarn-4.6.0.cjs,sha256=6vHuq8FkpEygtl29zNVK9-VfP_kpSz_zGNWq7JLysgs,2764946
26
27
  lyrics_transcriber/frontend/.yarnrc.yml,sha256=RIUAbDBlfdQoS1V4MjkeMHzQqi4cvIWSzY5T3gEB_1I,66
27
28
  lyrics_transcriber/frontend/README.md,sha256=-D6CAfKTT7Y0V3EjlZ2fMy7fyctFQ4x2TJ9vx6xtccM,1607
28
- lyrics_transcriber/frontend/dist/assets/index-D0Gr3Ep7.js,sha256=-CMhaK4a-smrqgohFvrGS72TOS4Q-pP8v1tQsT0ZjGM,1093227
29
- lyrics_transcriber/frontend/dist/assets/index-D0Gr3Ep7.js.map,sha256=wkhUiBST5zOJ1dz-o6UTgg2Cs7N65nXJiN9td7RaL2U,2303152
30
- lyrics_transcriber/frontend/dist/index.html,sha256=sQMaEZMXzB1lbVjvprL_yqWlYLZQ7mRvbtaVmadAZGQ,400
29
+ lyrics_transcriber/frontend/dist/assets/index-ZCT0s9MG.js,sha256=Rl82XsEWOv8jyFj_UEUxz0El7e4CUtl8L6XDgOqTQC8,1226756
30
+ lyrics_transcriber/frontend/dist/assets/index-ZCT0s9MG.js.map,sha256=o3ZQgVCSvTs0LQu7brg461BHRgCPwCRI0TjxyC99uKM,2606491
31
+ lyrics_transcriber/frontend/dist/index.html,sha256=va-nSC0PuQHN4j6ZDgCoDsUG7W2DOklJTrH5Vtczmmg,400
31
32
  lyrics_transcriber/frontend/dist/vite.svg,sha256=SnSK_UQ5GLsWWRyDTEAdrjPoeGGrXbrQgRw6O0qSFPs,1497
32
33
  lyrics_transcriber/frontend/eslint.config.js,sha256=3ADH23ANA4NNBKFy6nCVk65e8bx1DrVd_FIaYNnhuqA,734
33
34
  lyrics_transcriber/frontend/index.html,sha256=KfqJVONzpUyPIwV73nZRiCWlwLnFWeB3z0vzxDPNudU,376
34
35
  lyrics_transcriber/frontend/package.json,sha256=kQ0_UiU4xp8wnu-hbTBTAxUB6S_cQMzHM83Dmm5x70s,1181
35
36
  lyrics_transcriber/frontend/public/vite.svg,sha256=SnSK_UQ5GLsWWRyDTEAdrjPoeGGrXbrQgRw6O0qSFPs,1497
36
- lyrics_transcriber/frontend/src/App.tsx,sha256=GzXtocjM-4mJSjMomnsbDiQjqtWx9ShbyroGy9SLJts,6588
37
- lyrics_transcriber/frontend/src/api.ts,sha256=HlzMA5LhwUn-0VAZYDH9QYCm1NDcy0mNcy_E1AWZ_AI,5596
38
- lyrics_transcriber/frontend/src/components/AudioPlayer.tsx,sha256=Q_nvNRaBNY46GwCLXgFnxypsBz2zcwkpi7c8VZJFO88,5112
39
- lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx,sha256=mKCvGuEWXOXw24djUqZlq4dfhFal7tpA6BQX9QzZ-OI,5730
40
- lyrics_transcriber/frontend/src/components/DetailsModal.tsx,sha256=JI-IngUICmRU9GL_IWlIYzpf__c78XskDDJWQodTt8U,10999
41
- lyrics_transcriber/frontend/src/components/EditModal.tsx,sha256=EOF8PPNkNqx6LuvKuk8exTLk9XJ0lATyijVYTqjDwro,23770
37
+ lyrics_transcriber/frontend/src/App.tsx,sha256=f1-dp-MU8vap18eAXacwVDO5P4eE2iG9zSvjau-7NJs,6533
38
+ lyrics_transcriber/frontend/src/api.ts,sha256=UgqPc1jo8DEVgxh3_9Lyf9GBsHYpqMAqsPEE5BzTV4w,6640
39
+ lyrics_transcriber/frontend/src/components/AddLyricsModal.tsx,sha256=ubJwQewryjUrXwpBkITQNu4POhoUtDbNA93cqa-yJKY,3416
40
+ lyrics_transcriber/frontend/src/components/AudioPlayer.tsx,sha256=amjYyYW6HZ9TD5RwqQLSmGbwk-5Ec9mtXza3F3045n4,5337
41
+ lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx,sha256=CoTZS9Z3pf4lfPrzpQ2hZvLqFvt-IarSGBSCxFxD-y4,6274
42
+ lyrics_transcriber/frontend/src/components/EditActionBar.tsx,sha256=nLRVA3m3bQFqLtqlYasn7WeZNXvPvpG0sXuIv5QXvDc,2174
43
+ lyrics_transcriber/frontend/src/components/EditModal.tsx,sha256=f2JUYKvFmREElhlmHY545HQinwTtE5aTyQ_9x_qmKQY,24541
44
+ lyrics_transcriber/frontend/src/components/EditTimelineSection.tsx,sha256=74dKgUv_Z9DxlHx2xiR-gShFehGUaMNG2XWsH-SUEOM,15165
45
+ lyrics_transcriber/frontend/src/components/EditWordList.tsx,sha256=hJPXdpW3vur9OFnnIS8xk79yWWTsOuQgy2FdWNQ8vLg,10465
42
46
  lyrics_transcriber/frontend/src/components/FileUpload.tsx,sha256=fwn2rMWtMLPTZLREMb3ps4prSf9nzxGwnjmeC6KYsJA,2383
43
- lyrics_transcriber/frontend/src/components/Header.tsx,sha256=h74nCQNUHes21LJaxkNS5Uwt9cXCf6w7EQI0Hi9_H9M,9979
44
- lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx,sha256=N-7_6kMo2VFgA6cuA6iZXQ5_Cm0phXYMO70jMkYwZUo,21814
45
- lyrics_transcriber/frontend/src/components/ModeSelector.tsx,sha256=bHtjmj5DQx2CwkdL5A4fgLP3XEifu-QecPsMZVdMTmU,1422
46
- lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx,sha256=XU7CG0XXA4fc_XT-aa3CgfnGM41bs24cjx0vudTRlNE,4133
47
- lyrics_transcriber/frontend/src/components/ReferenceView.tsx,sha256=ZEjadr4eaMQPsiHyOk1FnyG5iwVY9l84A0QwXZ0-wos,8710
48
- lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx,sha256=oHJBhCjC2UZrXpzZik8HBr2A2wmiWYYWa-dRj1XEDjU,12413
47
+ lyrics_transcriber/frontend/src/components/FindReplaceModal.tsx,sha256=U7duKns4IqNXwbWFbQfdyaswnvkSRpfsU0UG__-Serc,20192
48
+ lyrics_transcriber/frontend/src/components/Header.tsx,sha256=T07R_OjHRVhodr1eq1U2lS4Ge_FuoHDd62qTbVrMEYo,12296
49
+ lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx,sha256=hsqkHwRYFGmKgsIZ-qjJ4pgckpX2Un7R-_Twtwill1g,40598
50
+ lyrics_transcriber/frontend/src/components/ModeSelector.tsx,sha256=OuCOqePGs5JC3NxZxrR-rDu5W5WSObuxrLVOIaqHDOs,1941
51
+ lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx,sha256=-9_ljoaadHjAAvia_vhEUgCajPv2jFnRDVR6VWN_a0w,4166
52
+ lyrics_transcriber/frontend/src/components/ReferenceView.tsx,sha256=QfK-VzpPcS4iUcYN6iAWE3yQK4rWQJJ-D80DzgixI3I,9436
53
+ lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx,sha256=zcGoIu5Iqs4ZXpGr3yeMIEKPf8FRLCP2i1TzNOmKzg0,13048
49
54
  lyrics_transcriber/frontend/src/components/SegmentDetailsModal.tsx,sha256=6ME02FkFwCgDAxW49yW260N4vbr80eAJ332Ex811GOo,1643
50
- lyrics_transcriber/frontend/src/components/TimelineEditor.tsx,sha256=slSBZPen_NecSogavs3sKh66y8UrPjqA6ssGd9efKDI,12275
51
- lyrics_transcriber/frontend/src/components/TranscriptionView.tsx,sha256=H_5Jivlyvd39KCvQEtUwHaRqh07fDA-EHvIlNcaabRA,6551
52
- lyrics_transcriber/frontend/src/components/WordEditControls.tsx,sha256=YrUW92E5oj-C5fgyW_W0I5U-bVvmkf16ZetjUfFTabI,3094
53
- lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx,sha256=BMLuBo5tLN3UZASexuJAYPVnTrpXHCm1pqAh9Uq4pKQ,14286
54
- lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx,sha256=i6qIEx7mv6lE111oSeonarlOvb97Z1cthvqq7xM2Lig,853
55
- lyrics_transcriber/frontend/src/components/shared/components/Word.tsx,sha256=XfshAUV6Dvnp_ktaIaSQWYNA3lrbgq-TbQt2a0eqF0A,1333
55
+ lyrics_transcriber/frontend/src/components/TimelineEditor.tsx,sha256=Aa6ykDRVhWUNHcJ14KGzmUCPDCAltw9gXpdR5ogVQpc,12842
56
+ lyrics_transcriber/frontend/src/components/TranscriptionView.tsx,sha256=It9alDqvlp3zu9ceEjFpqBOKDa2BFxP4AHm7v2K4AI0,7399
57
+ lyrics_transcriber/frontend/src/components/WordDivider.tsx,sha256=tOs_4WZGlJQ1o7sZFGLhwUoyX2jSKMa6vLZqa-1vzKY,6590
58
+ lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx,sha256=GHEpj6Hw_cUP4xKmg7sEfV4qiS0dVAVU28u2sCm8nTc,16085
59
+ lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx,sha256=zZpnQd6RlcGlr2v6T90Eva1cdEkiWzIVE78xAaQPObA,1144
60
+ lyrics_transcriber/frontend/src/components/shared/components/Word.tsx,sha256=mP88txgdG47VhYJrn3QqexZYxdmsNCGuBgNrK8mUvhM,2086
56
61
  lyrics_transcriber/frontend/src/components/shared/constants.ts,sha256=25q1qjCwzV-hR72wSb_rJSe4dVuQ0l-piLMoZSpynGQ,488
57
62
  lyrics_transcriber/frontend/src/components/shared/hooks/useWordClick.ts,sha256=aRDzH144FYuK9N3Y0wyTp2c1-DJOT_Y3HWQHHGqiUsY,6196
58
63
  lyrics_transcriber/frontend/src/components/shared/styles.ts,sha256=J1jCSuRqpk1mOFYAqJudhxeozH-q1bi-dsOibLukBJU,411
59
64
  lyrics_transcriber/frontend/src/components/shared/types.js,sha256=1DqoH1vIn6o1ng-XyBS6JRVVkf8Hj7ub_UD4x8loMjA,77
60
- lyrics_transcriber/frontend/src/components/shared/types.ts,sha256=P-W7oXPvOCTAVmwmDB7BW4HaZe_RFt9GfzPnZ_-_rto,3334
61
- lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts,sha256=zO4bk2iuBlkrpbghz03hg1YX-zBOFtY5IbLEp9LBjgY,2389
65
+ lyrics_transcriber/frontend/src/components/shared/types.ts,sha256=-HniySfrxsjmciMvtXu_bSNAyVHbVAZynRDTC90S5L4,3840
66
+ lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts,sha256=qtXin35bdVlitJSOmgju-WZP4QkwAJqjlYH3DuwfFPg,4522
62
67
  lyrics_transcriber/frontend/src/components/shared/utils/localStorage.ts,sha256=jpLT65Rk_toaB-8X2lRGyYZ9EoMQDI45GviUT7N9Bp0,3240
63
68
  lyrics_transcriber/frontend/src/components/shared/utils/referenceLineCalculator.ts,sha256=TJ2oHDitFFVxm83eFEhdlwvhx--mIt3054YbET2RiXs,2575
64
- lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts,sha256=QGxjh_uQ0vciAd6YVo5RQRXmFakiUQZb5X95oCzNAwo,3782
69
+ lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts,sha256=m1pUrjZcAch85Xqm9EX43BuoHQjdvBjY5BZ70LWa1hk,11074
65
70
  lyrics_transcriber/frontend/src/components/shared/utils/wordUtils.ts,sha256=bZbsvEgY3JoI15l4SdB51tHE33OkUxDH-WSG8doLcCQ,721
66
- lyrics_transcriber/frontend/src/main.tsx,sha256=gKJOIr1laz68BhgxWz0JXb1LNacA2oxfbypxW_B1USo,139
71
+ lyrics_transcriber/frontend/src/hooks/useManualSync.ts,sha256=fTAtHeO1Ca6o0n01DtietCHNgBFfvFEsXtQQO2orRWI,10775
72
+ lyrics_transcriber/frontend/src/main.tsx,sha256=UXPXUc2HeDuGtW5GVzP312RjCo3TdnpBal7SWild-k4,345
73
+ lyrics_transcriber/frontend/src/theme.ts,sha256=9F2xyLct_gJmvLEZEhrYdKIahUsBzi5kgnydSWJHphE,3864
67
74
  lyrics_transcriber/frontend/src/types/global.d.ts,sha256=NvltPF-n4_1oRLfihD3oHXbdT7txMC8B6fhCgvNY-jk,191
68
75
  lyrics_transcriber/frontend/src/types.js,sha256=1DqoH1vIn6o1ng-XyBS6JRVVkf8Hj7ub_UD4x8loMjA,77
69
- lyrics_transcriber/frontend/src/types.ts,sha256=WOxPW6QDB-KOfaSXq9gOD_kg_Yd9hRYG2Go0ltSbnDQ,3516
76
+ lyrics_transcriber/frontend/src/types.ts,sha256=FdPWw0QEm43MigcAIhRtyHUNqk6-mOUzM8bIV7hCzSU,3504
70
77
  lyrics_transcriber/frontend/src/validation.ts,sha256=Pv_FtySk6q3a1z_W0-ItxiEX8OIYkgCDwXKGUds4Lx4,4275
71
78
  lyrics_transcriber/frontend/src/vite-env.d.ts,sha256=ZZlpNvuwQpFfe3SiAPzd5-QQ8ypmmxq5WXz6pLD63bU,38
72
79
  lyrics_transcriber/frontend/tsconfig.app.json,sha256=7aUBVcaBqEtmtfQXsbwsgBxSUng06xzQi5t4QCgWQ3E,665
73
80
  lyrics_transcriber/frontend/tsconfig.json,sha256=AOS5v1AsNPL3wGc8bt58Ybh8HHpbYrlK91q0KIzaSgs,627
74
81
  lyrics_transcriber/frontend/tsconfig.node.json,sha256=oMBhK5xufBrVE7SkbADRxA3pxm8_L9m5YwtCOZSafsc,536
75
- lyrics_transcriber/frontend/tsconfig.tsbuildinfo,sha256=tcmXkmOCO1Pfep-CwJwEVs0okthy4DQSIn91aQ15qdU,1304
82
+ lyrics_transcriber/frontend/tsconfig.tsbuildinfo,sha256=F18wGtPeHvjZE8X3QcEFSzWXwT1zQP7dpWh8hpnFiHU,1505
76
83
  lyrics_transcriber/frontend/vite.config.d.ts,sha256=S5bdGf0pSdKM6A6RNBKwAm3EIeW_bDHYfHtesRtXU7Q,76
77
84
  lyrics_transcriber/frontend/vite.config.js,sha256=P4GuPgRZzwEWPQZpyujUe7eA3mjPoFAe2CgE5sQAXg8,232
78
85
  lyrics_transcriber/frontend/vite.config.ts,sha256=8FdW0dN8zDFqfhQSxX5h7sIu72X2piLYlp_TZYRQvBQ,216
79
86
  lyrics_transcriber/frontend/yarn.lock,sha256=wtImLsCO1P1Lpkhc1jAN6IiHQ0As4xn39n0cwKoh4LM,131996
80
- lyrics_transcriber/lyrics/base_lyrics_provider.py,sha256=YW83gs0rGUM_q6oLRfObx_tIfJYcKRkgKBo4WVLqe9I,9071
87
+ lyrics_transcriber/lyrics/base_lyrics_provider.py,sha256=mqlqssKG2AofvqEU48nCwLnz0FhO9Ee6MNixF6GBnYY,9133
81
88
  lyrics_transcriber/lyrics/file_provider.py,sha256=ksjVCtzzyK1lhKrYBed0P61wR3TV998Em2Dr7raqWwk,4086
82
89
  lyrics_transcriber/lyrics/genius.py,sha256=SIMFEmD_QbXUB8hpDhRU7AAyVrJbRvKyTWsShA9jecE,5693
83
90
  lyrics_transcriber/lyrics/spotify.py,sha256=K7aL_OHdQjhI8ydnHUq8-PUvkyDu2s-et7njiLIBVgY,5457
91
+ lyrics_transcriber/lyrics/user_input_provider.py,sha256=oNzwjk2bOQYyUXvVqPcbrF8vJU7LLtwTvJTXxtPaQto,1798
84
92
  lyrics_transcriber/output/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
93
  lyrics_transcriber/output/ass/__init__.py,sha256=EYQ45gI7_-vclVgzISL0ML8VgxCdB0odqEyPyiPCIw0,578
86
94
  lyrics_transcriber/output/ass/ass.py,sha256=xHId7Rv5gqmdQ7ZrWQSy46JX7vZcB_BzpZC800DwQk8,74315
@@ -124,7 +132,7 @@ lyrics_transcriber/output/fonts/Zurich_Cn_BT_Bold.ttf,sha256=WNG5LOQ-uGUF_WWT5aQ
124
132
  lyrics_transcriber/output/fonts/arial.ttf,sha256=NcDzVZ2NtWnjbDEJW4pg1EFkPZX1kTneQOI_ragZuDM,275572
125
133
  lyrics_transcriber/output/fonts/georgia.ttf,sha256=fQuyDGMrtZ6BoIhfVzvSFz9x9zIE3pBY_raM4DIicHI,142964
126
134
  lyrics_transcriber/output/fonts/verdana.ttf,sha256=lu0UlJyktzks_yNbnEHVXBJTgqu-DA08K53WaJfK4Ms,139640
127
- lyrics_transcriber/output/generator.py,sha256=taEV4coTlvYF2JLLiIug0CKv5S0hb11lFZRDDzUYHxM,8884
135
+ lyrics_transcriber/output/generator.py,sha256=dpEIqdX0Dc0_kpfOoZMxGryVIopSRSgnV7EjVEB7YZw,10916
128
136
  lyrics_transcriber/output/lrc_to_cdg.py,sha256=2pi5tvreD_ADAR4RF5yVwj7OJ4Pf5Zo_EJ7rt4iH3k0,2063
129
137
  lyrics_transcriber/output/lyrics_file.py,sha256=_KQyQjCOMIwQdQ0115uEAUIjQWTRmShkSfQuINPKxaw,3741
130
138
  lyrics_transcriber/output/plain_text.py,sha256=XARaWcy6MeQeQCUoz0PV_bHoBw5dba-u79bjS7XucnE,3867
@@ -132,7 +140,7 @@ lyrics_transcriber/output/segment_resizer.py,sha256=R2Z15F7aa7DQwgAf0EMNIQ-aYQhj
132
140
  lyrics_transcriber/output/subtitles.py,sha256=yQCR7YO3aitKnGRjfAtSwsdi6byfpEZgnCumJO16M2E,19085
133
141
  lyrics_transcriber/output/video.py,sha256=L_KB33YM4X-EQBRcLIPO4ZqlNEcVwqTWKjaJZVtkN-4,13751
134
142
  lyrics_transcriber/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
- lyrics_transcriber/review/server.py,sha256=6_eVJfCSuP5bHvoKyIfMwnTeByWb8YkaMOcutBoF5P0,15380
143
+ lyrics_transcriber/review/server.py,sha256=D5wMRdwdjW7Y1KnL4dON1rIrZpJg7jhqU_lK1q4ssqg,27445
136
144
  lyrics_transcriber/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
145
  lyrics_transcriber/storage/dropbox.py,sha256=Dyam1ULTkoxD1X5trkZ5dGp5XhBGCn998moC8IS9-68,9804
138
146
  lyrics_transcriber/transcribers/audioshake.py,sha256=pUR--5DgpYyJ-RFqdoLDf_2cHXI5CO239r5deDZRXVc,8938
@@ -140,8 +148,8 @@ lyrics_transcriber/transcribers/base_transcriber.py,sha256=T3m4ZCwZ9Bpv6Jvb2hNcn
140
148
  lyrics_transcriber/transcribers/whisper.py,sha256=YcCB1ic9H6zL1GS0jD0emu8-qlcH0QVEjjjYB4aLlIQ,13260
141
149
  lyrics_transcriber/types.py,sha256=d73cDstrEI_tVgngDYYYFwjZNs6OVBuAB_QDkga7dWA,19841
142
150
  lyrics_transcriber/utils/word_utils.py,sha256=-cMGpj9UV4F6IsoDKAV2i1aiqSO8eI91HMAm_igtVMk,958
143
- lyrics_transcriber-0.43.1.dist-info/LICENSE,sha256=BiPihPDxhxIPEx6yAxVfAljD5Bhm_XG2teCbPEj_m0Y,1069
144
- lyrics_transcriber-0.43.1.dist-info/METADATA,sha256=lHgcbB3j-X8-R7MVc6sbUADN3U-ND49WefleCSIjAlM,5973
145
- lyrics_transcriber-0.43.1.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
146
- lyrics_transcriber-0.43.1.dist-info/entry_points.txt,sha256=kcp-bSFkCACAEA0t166Kek0HpaJUXRo5SlF5tVrqNBU,216
147
- lyrics_transcriber-0.43.1.dist-info/RECORD,,
151
+ lyrics_transcriber-0.45.0.dist-info/LICENSE,sha256=BiPihPDxhxIPEx6yAxVfAljD5Bhm_XG2teCbPEj_m0Y,1069
152
+ lyrics_transcriber-0.45.0.dist-info/METADATA,sha256=KswMnIPwmJrw597OpS6L7-Hnqny8I4KtncvK4MiPhxI,6017
153
+ lyrics_transcriber-0.45.0.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
154
+ lyrics_transcriber-0.45.0.dist-info/entry_points.txt,sha256=kcp-bSFkCACAEA0t166Kek0HpaJUXRo5SlF5tVrqNBU,216
155
+ lyrics_transcriber-0.45.0.dist-info/RECORD,,