lyrics-transcriber 0.30.0__py3-none-any.whl → 0.32.1__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 (88) hide show
  1. lyrics_transcriber/__init__.py +2 -1
  2. lyrics_transcriber/cli/{main.py → cli_main.py} +47 -14
  3. lyrics_transcriber/core/config.py +35 -0
  4. lyrics_transcriber/core/controller.py +164 -166
  5. lyrics_transcriber/correction/anchor_sequence.py +471 -0
  6. lyrics_transcriber/correction/corrector.py +256 -0
  7. lyrics_transcriber/correction/handlers/__init__.py +0 -0
  8. lyrics_transcriber/correction/handlers/base.py +30 -0
  9. lyrics_transcriber/correction/handlers/extend_anchor.py +91 -0
  10. lyrics_transcriber/correction/handlers/levenshtein.py +147 -0
  11. lyrics_transcriber/correction/handlers/no_space_punct_match.py +98 -0
  12. lyrics_transcriber/correction/handlers/relaxed_word_count_match.py +55 -0
  13. lyrics_transcriber/correction/handlers/repeat.py +71 -0
  14. lyrics_transcriber/correction/handlers/sound_alike.py +223 -0
  15. lyrics_transcriber/correction/handlers/syllables_match.py +182 -0
  16. lyrics_transcriber/correction/handlers/word_count_match.py +54 -0
  17. lyrics_transcriber/correction/handlers/word_operations.py +135 -0
  18. lyrics_transcriber/correction/phrase_analyzer.py +426 -0
  19. lyrics_transcriber/correction/text_utils.py +30 -0
  20. lyrics_transcriber/lyrics/base_lyrics_provider.py +125 -0
  21. lyrics_transcriber/lyrics/genius.py +73 -0
  22. lyrics_transcriber/lyrics/spotify.py +82 -0
  23. lyrics_transcriber/output/ass/__init__.py +21 -0
  24. lyrics_transcriber/output/{ass.py → ass/ass.py} +150 -690
  25. lyrics_transcriber/output/ass/ass_specs.txt +732 -0
  26. lyrics_transcriber/output/ass/config.py +37 -0
  27. lyrics_transcriber/output/ass/constants.py +23 -0
  28. lyrics_transcriber/output/ass/event.py +94 -0
  29. lyrics_transcriber/output/ass/formatters.py +132 -0
  30. lyrics_transcriber/output/ass/lyrics_line.py +219 -0
  31. lyrics_transcriber/output/ass/lyrics_screen.py +252 -0
  32. lyrics_transcriber/output/ass/section_detector.py +89 -0
  33. lyrics_transcriber/output/ass/section_screen.py +106 -0
  34. lyrics_transcriber/output/ass/style.py +187 -0
  35. lyrics_transcriber/output/cdg.py +503 -0
  36. lyrics_transcriber/output/cdgmaker/__init__.py +0 -0
  37. lyrics_transcriber/output/cdgmaker/cdg.py +262 -0
  38. lyrics_transcriber/output/cdgmaker/composer.py +1919 -0
  39. lyrics_transcriber/output/cdgmaker/config.py +151 -0
  40. lyrics_transcriber/output/cdgmaker/images/instrumental.png +0 -0
  41. lyrics_transcriber/output/cdgmaker/images/intro.png +0 -0
  42. lyrics_transcriber/output/cdgmaker/pack.py +507 -0
  43. lyrics_transcriber/output/cdgmaker/render.py +346 -0
  44. lyrics_transcriber/output/cdgmaker/transitions/centertexttoplogobottomtext.png +0 -0
  45. lyrics_transcriber/output/cdgmaker/transitions/circlein.png +0 -0
  46. lyrics_transcriber/output/cdgmaker/transitions/circleout.png +0 -0
  47. lyrics_transcriber/output/cdgmaker/transitions/fizzle.png +0 -0
  48. lyrics_transcriber/output/cdgmaker/transitions/largecentertexttoplogo.png +0 -0
  49. lyrics_transcriber/output/cdgmaker/transitions/rectangle.png +0 -0
  50. lyrics_transcriber/output/cdgmaker/transitions/spiral.png +0 -0
  51. lyrics_transcriber/output/cdgmaker/transitions/topleftmusicalnotes.png +0 -0
  52. lyrics_transcriber/output/cdgmaker/transitions/wipein.png +0 -0
  53. lyrics_transcriber/output/cdgmaker/transitions/wipeleft.png +0 -0
  54. lyrics_transcriber/output/cdgmaker/transitions/wipeout.png +0 -0
  55. lyrics_transcriber/output/cdgmaker/transitions/wiperight.png +0 -0
  56. lyrics_transcriber/output/cdgmaker/utils.py +132 -0
  57. lyrics_transcriber/output/fonts/AvenirNext-Bold.ttf +0 -0
  58. lyrics_transcriber/output/fonts/DMSans-VariableFont_opsz,wght.ttf +0 -0
  59. lyrics_transcriber/output/fonts/DMSerifDisplay-Regular.ttf +0 -0
  60. lyrics_transcriber/output/fonts/Oswald-SemiBold.ttf +0 -0
  61. lyrics_transcriber/output/fonts/Zurich_Cn_BT_Bold.ttf +0 -0
  62. lyrics_transcriber/output/fonts/arial.ttf +0 -0
  63. lyrics_transcriber/output/fonts/georgia.ttf +0 -0
  64. lyrics_transcriber/output/fonts/verdana.ttf +0 -0
  65. lyrics_transcriber/output/generator.py +140 -171
  66. lyrics_transcriber/output/lyrics_file.py +102 -0
  67. lyrics_transcriber/output/plain_text.py +91 -0
  68. lyrics_transcriber/output/segment_resizer.py +416 -0
  69. lyrics_transcriber/output/subtitles.py +328 -302
  70. lyrics_transcriber/output/video.py +219 -0
  71. lyrics_transcriber/review/__init__.py +1 -0
  72. lyrics_transcriber/review/server.py +138 -0
  73. lyrics_transcriber/storage/dropbox.py +110 -134
  74. lyrics_transcriber/transcribers/audioshake.py +171 -105
  75. lyrics_transcriber/transcribers/base_transcriber.py +149 -0
  76. lyrics_transcriber/transcribers/whisper.py +267 -133
  77. lyrics_transcriber/types.py +454 -0
  78. {lyrics_transcriber-0.30.0.dist-info → lyrics_transcriber-0.32.1.dist-info}/METADATA +14 -3
  79. lyrics_transcriber-0.32.1.dist-info/RECORD +86 -0
  80. {lyrics_transcriber-0.30.0.dist-info → lyrics_transcriber-0.32.1.dist-info}/WHEEL +1 -1
  81. lyrics_transcriber-0.32.1.dist-info/entry_points.txt +4 -0
  82. lyrics_transcriber/core/corrector.py +0 -56
  83. lyrics_transcriber/core/fetcher.py +0 -143
  84. lyrics_transcriber/storage/tokens.py +0 -116
  85. lyrics_transcriber/transcribers/base.py +0 -31
  86. lyrics_transcriber-0.30.0.dist-info/RECORD +0 -22
  87. lyrics_transcriber-0.30.0.dist-info/entry_points.txt +0 -3
  88. {lyrics_transcriber-0.30.0.dist-info → lyrics_transcriber-0.32.1.dist-info}/LICENSE +0 -0
@@ -0,0 +1,262 @@
1
+ from collections.abc import Sequence
2
+ from enum import Enum
3
+ from typing import BinaryIO, NamedTuple, TypeAlias
4
+
5
+ from .utils import *
6
+
7
+
8
+ _RGBColor: TypeAlias = tuple[int, int, int]
9
+
10
+
11
+ CDG_COMMAND = 0x09
12
+ # TODO Find out how to store proper parity bytes
13
+ CDG_PARITY = 0xa5
14
+ CDG_MASK = 0x3f
15
+
16
+ CDG_SCREEN_WIDTH = 300
17
+ CDG_SCREEN_HEIGHT = 216
18
+ CDG_VISIBLE_WIDTH = 280
19
+ CDG_VISIBLE_HEIGHT = 192
20
+ CDG_VISIBLE_X = 6
21
+ CDG_VISIBLE_Y = 12
22
+ CDG_TILE_WIDTH = 6
23
+ CDG_TILE_HEIGHT = 12
24
+
25
+ CDG_FPS = 300
26
+
27
+
28
+ class CDGInstruction(Enum):
29
+ NO_INSTRUCTION = 0x00
30
+ MEMORY_PRESET = 0x01
31
+ BORDER_PRESET = 0x02
32
+ TILE_BLOCK = 0x06
33
+ SCROLL_PRESET = 0x14
34
+ SCROLL_COPY = 0x18
35
+ DEFINE_TRANSPARENT = 0x1c
36
+ LOAD_COLOR_TABLE_LO = 0x1e
37
+ LOAD_COLOR_TABLE_HI = 0x1f
38
+ TILE_BLOCK_XOR = 0x26
39
+
40
+
41
+ class CDGScrollCommand(Enum):
42
+ NO_SCROLL = 0
43
+ SCROLL_RIGHT = 1
44
+ SCROLL_DOWN = 1
45
+ SCROLL_AHEAD = 1
46
+ SCROLL_LEFT = 2
47
+ SCROLL_UP = 2
48
+ SCROLL_BACK = 2
49
+
50
+
51
+ class CDGPacket(NamedTuple):
52
+ command: bool
53
+ instruction: CDGInstruction
54
+ data: bytes
55
+
56
+
57
+ class CDGWriter:
58
+ def __init__(self):
59
+ self.packets: list[CDGPacket] = []
60
+
61
+ def queue_packet(self, packet: CDGPacket):
62
+ self.packets.append(packet)
63
+
64
+ def queue_packets(self, packets: Sequence[CDGPacket]):
65
+ for packet in packets:
66
+ self.queue_packet(packet)
67
+
68
+ @property
69
+ def packets_queued(self) -> int:
70
+ return len(self.packets)
71
+
72
+ def write_packets(self, stream: BinaryIO):
73
+ for packet in self.packets:
74
+ self.write_packet(stream, packet)
75
+
76
+ def write_packet(self, stream: BinaryIO, packet: CDGPacket):
77
+ stream.write((CDG_COMMAND if packet.command else 0x00).to_bytes())
78
+ stream.write(packet.instruction.value.to_bytes())
79
+ stream.write(CDG_PARITY.to_bytes() * 2)
80
+ stream.write(packet.data)
81
+ stream.write(CDG_PARITY.to_bytes() * 4)
82
+
83
+
84
+ def no_instruction() -> CDGPacket:
85
+ return CDGPacket(
86
+ command=False,
87
+ instruction=CDGInstruction.NO_INSTRUCTION,
88
+ data=b"\x00" * 16,
89
+ )
90
+
91
+ def memory_preset(color: int, repeat: int = 0) -> CDGPacket:
92
+ return CDGPacket(
93
+ command=True,
94
+ instruction=CDGInstruction.MEMORY_PRESET,
95
+ data=bytes(pad(
96
+ [
97
+ color & 0xf,
98
+ repeat & 0xf,
99
+ ],
100
+ 16,
101
+ padvalue=0,
102
+ )),
103
+ )
104
+
105
+ def border_preset(color: int) -> CDGPacket:
106
+ return CDGPacket(
107
+ command=True,
108
+ instruction=CDGInstruction.BORDER_PRESET,
109
+ data=bytes(pad(
110
+ [
111
+ color & 0xf,
112
+ ],
113
+ 16,
114
+ padvalue=0,
115
+ )),
116
+ )
117
+
118
+ def tile_block(
119
+ color0: int,
120
+ color1: int,
121
+ row: int,
122
+ column: int,
123
+ tile: Sequence[int],
124
+ ) -> CDGPacket:
125
+ assert len(tile) == 12, "tile must have 12 rows"
126
+ return CDGPacket(
127
+ command=True,
128
+ instruction=CDGInstruction.TILE_BLOCK,
129
+ data=bytes([
130
+ color0 & 0xf,
131
+ color1 & 0xf,
132
+ row & 0x1f,
133
+ column & 0x3f,
134
+ *[t & 0x3f for t in tile],
135
+ ]),
136
+ )
137
+
138
+ def scroll_preset(
139
+ color: int = 0,
140
+ hcmd: CDGScrollCommand = CDGScrollCommand.NO_SCROLL,
141
+ hoffset: int = 0,
142
+ vcmd: CDGScrollCommand = CDGScrollCommand.NO_SCROLL,
143
+ voffset: int = 0,
144
+ ) -> CDGPacket:
145
+ return CDGPacket(
146
+ command=True,
147
+ instruction=CDGInstruction.SCROLL_PRESET,
148
+ data=bytes(pad(
149
+ [
150
+ color & 0xf,
151
+ (hcmd.value << 4) | (hoffset & 0x7),
152
+ (vcmd.value << 4) | (voffset & 0xf),
153
+ ],
154
+ 16,
155
+ padvalue=0,
156
+ )),
157
+ )
158
+
159
+ def scroll_copy(
160
+ color: int = 0,
161
+ hcmd: CDGScrollCommand = CDGScrollCommand.NO_SCROLL,
162
+ hoffset: int = 0,
163
+ vcmd: CDGScrollCommand = CDGScrollCommand.NO_SCROLL,
164
+ voffset: int = 0,
165
+ ) -> CDGPacket:
166
+ return CDGPacket(
167
+ command=True,
168
+ instruction=CDGInstruction.SCROLL_COPY,
169
+ data=bytes(pad(
170
+ [
171
+ color & 0xf,
172
+ (hcmd.value << 4) | (hoffset & 0x7),
173
+ (vcmd.value << 4) | (voffset & 0xf),
174
+ ],
175
+ 16,
176
+ padvalue=0,
177
+ )),
178
+ )
179
+
180
+ def define_transparent(levels: Sequence[int]) -> CDGPacket:
181
+ assert len(levels) == 16, "must load 16 transparency levels"
182
+ return CDGPacket(
183
+ command=True,
184
+ instruction=CDGInstruction.DEFINE_TRANSPARENT,
185
+ data=bytes([level & CDG_MASK for level in levels]),
186
+ )
187
+
188
+ def load_color_table_lo(colors: Sequence[_RGBColor]) -> CDGPacket:
189
+ assert len(colors) == 8, "must load 8 colors into low table"
190
+ return CDGPacket(
191
+ command=True,
192
+ instruction=CDGInstruction.LOAD_COLOR_TABLE_LO,
193
+ data=b"".join(map(_rgb_to_bytes, colors)),
194
+ )
195
+
196
+ def load_color_table_hi(colors: Sequence[_RGBColor]) -> CDGPacket:
197
+ assert len(colors) == 8, "must load 8 colors into high table"
198
+ return CDGPacket(
199
+ command=True,
200
+ instruction=CDGInstruction.LOAD_COLOR_TABLE_HI,
201
+ data=b"".join(map(_rgb_to_bytes, colors)),
202
+ )
203
+
204
+ def tile_block_xor(
205
+ color0: int,
206
+ color1: int,
207
+ row: int,
208
+ column: int,
209
+ tile: Sequence[int],
210
+ ) -> CDGPacket:
211
+ assert len(tile) == 12, "tile must have 12 rows"
212
+ return CDGPacket(
213
+ command=True,
214
+ instruction=CDGInstruction.TILE_BLOCK_XOR,
215
+ data=bytes([
216
+ color0 & 0xf,
217
+ color1 & 0xf,
218
+ row & 0x1f,
219
+ column & 0x3f,
220
+ *[t & 0x3f for t in tile],
221
+ ]),
222
+ )
223
+
224
+
225
+ def memory_preset_repeat(color: int) -> list[CDGPacket]:
226
+ return [
227
+ memory_preset(color, repeat)
228
+ for repeat in range(16)
229
+ ]
230
+
231
+ def load_color_table(colors: Sequence[_RGBColor]) -> list[CDGPacket]:
232
+ assert len(colors) == 16, "must load 16 colors into table"
233
+ return [
234
+ load_color_table_lo(colors[:8]),
235
+ load_color_table_hi(colors[8:]),
236
+ ]
237
+
238
+
239
+ def _rgb_to_bytes(rgb: _RGBColor) -> bytes:
240
+ r, g, b = rgb
241
+ hi = ((r & 0xf0) >> 2) | ((g & 0xc0) >> 6)
242
+ lo = (g & 0x30) | ((b & 0xf0) >> 4)
243
+ return bytes([hi, lo])
244
+
245
+
246
+ __all__ = [
247
+ "CDG_COMMAND", "CDG_PARITY", "CDG_MASK",
248
+ "CDG_SCREEN_WIDTH", "CDG_SCREEN_HEIGHT",
249
+ "CDG_VISIBLE_WIDTH", "CDG_VISIBLE_HEIGHT",
250
+ "CDG_VISIBLE_X", "CDG_VISIBLE_Y",
251
+ "CDG_TILE_WIDTH", "CDG_TILE_HEIGHT",
252
+ "CDG_FPS",
253
+
254
+ "CDGInstruction", "CDGScrollCommand", "CDGPacket",
255
+ "CDGWriter",
256
+
257
+ "no_instruction", "memory_preset", "border_preset", "tile_block",
258
+ "scroll_preset", "scroll_copy", "define_transparent",
259
+ "load_color_table_lo", "load_color_table_hi", "tile_block_xor",
260
+
261
+ "memory_preset_repeat", "load_color_table",
262
+ ]