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.
- lyrics_transcriber/__init__.py +2 -1
- lyrics_transcriber/cli/{main.py → cli_main.py} +47 -14
- lyrics_transcriber/core/config.py +35 -0
- lyrics_transcriber/core/controller.py +164 -166
- lyrics_transcriber/correction/anchor_sequence.py +471 -0
- lyrics_transcriber/correction/corrector.py +256 -0
- lyrics_transcriber/correction/handlers/__init__.py +0 -0
- lyrics_transcriber/correction/handlers/base.py +30 -0
- lyrics_transcriber/correction/handlers/extend_anchor.py +91 -0
- lyrics_transcriber/correction/handlers/levenshtein.py +147 -0
- lyrics_transcriber/correction/handlers/no_space_punct_match.py +98 -0
- lyrics_transcriber/correction/handlers/relaxed_word_count_match.py +55 -0
- lyrics_transcriber/correction/handlers/repeat.py +71 -0
- lyrics_transcriber/correction/handlers/sound_alike.py +223 -0
- lyrics_transcriber/correction/handlers/syllables_match.py +182 -0
- lyrics_transcriber/correction/handlers/word_count_match.py +54 -0
- lyrics_transcriber/correction/handlers/word_operations.py +135 -0
- lyrics_transcriber/correction/phrase_analyzer.py +426 -0
- lyrics_transcriber/correction/text_utils.py +30 -0
- lyrics_transcriber/lyrics/base_lyrics_provider.py +125 -0
- lyrics_transcriber/lyrics/genius.py +73 -0
- lyrics_transcriber/lyrics/spotify.py +82 -0
- lyrics_transcriber/output/ass/__init__.py +21 -0
- lyrics_transcriber/output/{ass.py → ass/ass.py} +150 -690
- lyrics_transcriber/output/ass/ass_specs.txt +732 -0
- lyrics_transcriber/output/ass/config.py +37 -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 +219 -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 +503 -0
- lyrics_transcriber/output/cdgmaker/__init__.py +0 -0
- lyrics_transcriber/output/cdgmaker/cdg.py +262 -0
- lyrics_transcriber/output/cdgmaker/composer.py +1919 -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/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 +140 -171
- lyrics_transcriber/output/lyrics_file.py +102 -0
- lyrics_transcriber/output/plain_text.py +91 -0
- lyrics_transcriber/output/segment_resizer.py +416 -0
- lyrics_transcriber/output/subtitles.py +328 -302
- lyrics_transcriber/output/video.py +219 -0
- lyrics_transcriber/review/__init__.py +1 -0
- lyrics_transcriber/review/server.py +138 -0
- lyrics_transcriber/storage/dropbox.py +110 -134
- lyrics_transcriber/transcribers/audioshake.py +171 -105
- lyrics_transcriber/transcribers/base_transcriber.py +149 -0
- lyrics_transcriber/transcribers/whisper.py +267 -133
- lyrics_transcriber/types.py +454 -0
- {lyrics_transcriber-0.30.0.dist-info → lyrics_transcriber-0.32.1.dist-info}/METADATA +14 -3
- lyrics_transcriber-0.32.1.dist-info/RECORD +86 -0
- {lyrics_transcriber-0.30.0.dist-info → lyrics_transcriber-0.32.1.dist-info}/WHEEL +1 -1
- lyrics_transcriber-0.32.1.dist-info/entry_points.txt +4 -0
- lyrics_transcriber/core/corrector.py +0 -56
- lyrics_transcriber/core/fetcher.py +0 -143
- lyrics_transcriber/storage/tokens.py +0 -116
- lyrics_transcriber/transcribers/base.py +0 -31
- lyrics_transcriber-0.30.0.dist-info/RECORD +0 -22
- lyrics_transcriber-0.30.0.dist-info/entry_points.txt +0 -3
- {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
|
+
]
|