easyrip 4.11.3__py3-none-any.whl → 4.13.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.
- easyrip/__init__.py +1 -10
- easyrip/__main__.py +3 -1
- easyrip/easyrip_command.py +29 -11
- easyrip/easyrip_main.py +84 -37
- easyrip/easyrip_mlang/__init__.py +2 -11
- easyrip/easyrip_mlang/global_lang_val.py +26 -164
- easyrip/easyrip_mlang/lang_en.py +2 -2
- easyrip/easyrip_mlang/lang_tag_val.py +145 -0
- easyrip/easyrip_mlang/lang_zh_Hans_CN.py +17 -15
- easyrip/easyrip_mlang/translator.py +24 -29
- easyrip/global_val.py +1 -1
- easyrip/ripper/param.py +57 -17
- easyrip/ripper/ripper.py +284 -208
- easyrip/ripper/sub_and_font/ass.py +160 -0
- easyrip/ripper/sub_and_font/subset.py +1 -1
- {easyrip-4.11.3.dist-info → easyrip-4.13.0.dist-info}/METADATA +1 -1
- easyrip-4.13.0.dist-info/RECORD +32 -0
- easyrip-4.11.3.dist-info/RECORD +0 -31
- {easyrip-4.11.3.dist-info → easyrip-4.13.0.dist-info}/WHEEL +0 -0
- {easyrip-4.11.3.dist-info → easyrip-4.13.0.dist-info}/entry_points.txt +0 -0
- {easyrip-4.11.3.dist-info → easyrip-4.13.0.dist-info}/licenses/LICENSE +0 -0
- {easyrip-4.11.3.dist-info → easyrip-4.13.0.dist-info}/top_level.txt +0 -0
easyrip/__init__.py
CHANGED
|
@@ -7,13 +7,7 @@ from .easyrip_main import (
|
|
|
7
7
|
init,
|
|
8
8
|
run_command,
|
|
9
9
|
)
|
|
10
|
-
from .easyrip_mlang import
|
|
11
|
-
Global_lang_val,
|
|
12
|
-
Lang_tag,
|
|
13
|
-
Lang_tag_language,
|
|
14
|
-
Lang_tag_region,
|
|
15
|
-
Lang_tag_script,
|
|
16
|
-
)
|
|
10
|
+
from .easyrip_mlang import Global_lang_val, Lang_tag
|
|
17
11
|
from .ripper.media_info import Media_info
|
|
18
12
|
from .ripper.ripper import Ripper
|
|
19
13
|
from .ripper.sub_and_font import Ass, Font, load_fonts
|
|
@@ -23,9 +17,6 @@ __all__ = [
|
|
|
23
17
|
"Font",
|
|
24
18
|
"Global_lang_val",
|
|
25
19
|
"Lang_tag",
|
|
26
|
-
"Lang_tag_language",
|
|
27
|
-
"Lang_tag_region",
|
|
28
|
-
"Lang_tag_script",
|
|
29
20
|
"Media_info",
|
|
30
21
|
"Ripper",
|
|
31
22
|
"check_env",
|
easyrip/__main__.py
CHANGED
|
@@ -74,6 +74,7 @@ def run() -> NoReturn:
|
|
|
74
74
|
in {
|
|
75
75
|
*Cmd_type.cd.value.names,
|
|
76
76
|
*Cmd_type.mediainfo.value.names,
|
|
77
|
+
*Cmd_type.assinfo.value.names,
|
|
77
78
|
*Cmd_type.fontinfo.value.names,
|
|
78
79
|
}
|
|
79
80
|
else ()
|
|
@@ -98,6 +99,7 @@ def run() -> NoReturn:
|
|
|
98
99
|
*Opt_type._i.value.names,
|
|
99
100
|
*Opt_type._o_dir.value.names,
|
|
100
101
|
*Opt_type._o.value.names,
|
|
102
|
+
*Opt_type._pipe.value.names,
|
|
101
103
|
*Opt_type._sub.value.names,
|
|
102
104
|
*Opt_type._only_mux_sub_path.value.names,
|
|
103
105
|
*Opt_type._soft_sub.value.names,
|
|
@@ -141,7 +143,7 @@ def run() -> NoReturn:
|
|
|
141
143
|
|
|
142
144
|
try:
|
|
143
145
|
if not run_command(command):
|
|
144
|
-
log.warning("
|
|
146
|
+
log.warning("Command run terminated")
|
|
145
147
|
except KeyboardInterrupt:
|
|
146
148
|
log.warning("Manually stop run command")
|
|
147
149
|
|
easyrip/easyrip_command.py
CHANGED
|
@@ -18,7 +18,7 @@ from prompt_toolkit.document import Document
|
|
|
18
18
|
|
|
19
19
|
from . import global_val
|
|
20
20
|
from .easyrip_config.config_key import Config_key
|
|
21
|
-
from .ripper.param import
|
|
21
|
+
from .ripper.param import Audio_codec, Muxer, Preset_name
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
@final
|
|
@@ -268,7 +268,6 @@ class Cmd_type(enum.Enum):
|
|
|
268
268
|
"Translate subtitle files\n"
|
|
269
269
|
"e.g. 'translate zh-Hans zh-Hant' will translate all '*.zh-Hans.ass' files into zh-Hant"
|
|
270
270
|
),
|
|
271
|
-
childs=(Cmd_type_val(("-overwrite",)),),
|
|
272
271
|
)
|
|
273
272
|
mediainfo = Cmd_type_val(
|
|
274
273
|
("mediainfo",),
|
|
@@ -279,6 +278,15 @@ class Cmd_type(enum.Enum):
|
|
|
279
278
|
Cmd_type_val(("cfd",)),
|
|
280
279
|
),
|
|
281
280
|
)
|
|
281
|
+
assinfo = Cmd_type_val(
|
|
282
|
+
("assinfo",),
|
|
283
|
+
param="<<path> | 'fd' | 'cfd'> [-use-libass-spec <0|1>] [-show-chars-len <0|1>]",
|
|
284
|
+
description="Get the ass info by the Ass class",
|
|
285
|
+
childs=(
|
|
286
|
+
Cmd_type_val(("fd",)),
|
|
287
|
+
Cmd_type_val(("cfd",)),
|
|
288
|
+
),
|
|
289
|
+
)
|
|
282
290
|
fontinfo = Cmd_type_val(
|
|
283
291
|
("fontinfo",),
|
|
284
292
|
param="<<path> | 'fd' | 'cfd'>",
|
|
@@ -353,7 +361,8 @@ class Opt_type(enum.Enum):
|
|
|
353
361
|
param="<string>",
|
|
354
362
|
description=(
|
|
355
363
|
"Setting preset\n"
|
|
356
|
-
"
|
|
364
|
+
"\n" # .
|
|
365
|
+
"Preset name:\n"
|
|
357
366
|
f"{Preset_name.to_help_string(' ')}"
|
|
358
367
|
),
|
|
359
368
|
childs=(Cmd_type_val(tuple(Preset_name._value2member_map_)),),
|
|
@@ -442,7 +451,7 @@ class Opt_type(enum.Enum):
|
|
|
442
451
|
'e.g. "11\\{22}33" ->\n'
|
|
443
452
|
' "11\\33" (VSFilter)\n'
|
|
444
453
|
' "11{22}33" (libass)\n'
|
|
445
|
-
"Default:
|
|
454
|
+
"Default: 1"
|
|
446
455
|
),
|
|
447
456
|
childs=(Cmd_type_val(("0", "1")),),
|
|
448
457
|
)
|
|
@@ -486,7 +495,8 @@ class Opt_type(enum.Enum):
|
|
|
486
495
|
param="<string>",
|
|
487
496
|
description=(
|
|
488
497
|
"Setting audio encoder\n"
|
|
489
|
-
"
|
|
498
|
+
"\n" # .
|
|
499
|
+
"Audio encoder:\n"
|
|
490
500
|
f"{Audio_codec.to_help_string(' ')}"
|
|
491
501
|
),
|
|
492
502
|
childs=(Cmd_type_val(tuple(Audio_codec._value2member_map_)),),
|
|
@@ -501,11 +511,11 @@ class Opt_type(enum.Enum):
|
|
|
501
511
|
param="<string>",
|
|
502
512
|
description=(
|
|
503
513
|
"Setting muxer\n"
|
|
504
|
-
"
|
|
514
|
+
"\n" # .
|
|
505
515
|
"Muxer:\n"
|
|
506
|
-
"
|
|
507
|
-
" mkv\n"
|
|
516
|
+
f"{Audio_codec.to_help_string(' ')}"
|
|
508
517
|
),
|
|
518
|
+
childs=(Cmd_type_val(tuple(Muxer._value2member_map_)),),
|
|
509
519
|
)
|
|
510
520
|
_r = _fps = Cmd_type_val(
|
|
511
521
|
("-r", "-fps"),
|
|
@@ -789,8 +799,10 @@ class OptCompleter(Completer):
|
|
|
789
799
|
_preset_name = None
|
|
790
800
|
if _preset in Preset_name._member_map_:
|
|
791
801
|
_preset_name = Preset_name[_preset]
|
|
792
|
-
if _preset_name is not None
|
|
793
|
-
add_set: set[str] = {
|
|
802
|
+
if _preset_name is not None:
|
|
803
|
+
add_set: set[str] = {
|
|
804
|
+
f"-{n}" for n in _preset_name.get_param_name_set(set())
|
|
805
|
+
}
|
|
794
806
|
add_comp_words |= add_set
|
|
795
807
|
add_comp_meta_dict |= dict.fromkeys(add_set, f"{_preset} param")
|
|
796
808
|
|
|
@@ -859,7 +871,13 @@ class OptCompleter(Completer):
|
|
|
859
871
|
|
|
860
872
|
yield from merge_completers(
|
|
861
873
|
(
|
|
862
|
-
|
|
874
|
+
merge_completers(
|
|
875
|
+
(
|
|
876
|
+
_nested_dict_to_nc(new_nd),
|
|
877
|
+
FuzzyCompleter(_nested_dict_to_nc(new_nd), WORD=True),
|
|
878
|
+
),
|
|
879
|
+
deduplicate=True,
|
|
880
|
+
),
|
|
863
881
|
FuzzyCompleter(
|
|
864
882
|
WordCompleter(
|
|
865
883
|
words=tuple(opt_tree_pos_list[-1]),
|
easyrip/easyrip_main.py
CHANGED
|
@@ -30,16 +30,14 @@ from .easyrip_log import log
|
|
|
30
30
|
from .easyrip_mlang import (
|
|
31
31
|
Global_lang_val,
|
|
32
32
|
Lang_tag,
|
|
33
|
-
Lang_tag_language,
|
|
34
33
|
get_system_language,
|
|
35
34
|
gettext,
|
|
36
35
|
translate_subtitles,
|
|
37
36
|
)
|
|
38
37
|
from .easyrip_prompt import easyrip_prompt
|
|
39
38
|
from .ripper.media_info import Media_info
|
|
40
|
-
from .ripper.param import DEFAULT_PRESET_PARAMS, PRESET_OPT_NAME
|
|
41
39
|
from .ripper.ripper import Ripper
|
|
42
|
-
from .ripper.sub_and_font import load_fonts
|
|
40
|
+
from .ripper.sub_and_font import Ass, load_fonts
|
|
43
41
|
from .utils import change_title, check_ver, read_text
|
|
44
42
|
|
|
45
43
|
__all__ = ["init", "run_command"]
|
|
@@ -307,6 +305,10 @@ def run_ripper_list(
|
|
|
307
305
|
except Exception as e:
|
|
308
306
|
log.error(e, deep=True)
|
|
309
307
|
log.warning("Stop run Ripper")
|
|
308
|
+
except KeyboardInterrupt:
|
|
309
|
+
log.warning("Manually stop run and clear Ripper list")
|
|
310
|
+
Ripper.ripper_list.clear()
|
|
311
|
+
raise
|
|
310
312
|
|
|
311
313
|
with ThreadPoolExecutor() as executor:
|
|
312
314
|
for ripper in Ripper.ripper_list:
|
|
@@ -324,6 +326,10 @@ def run_ripper_list(
|
|
|
324
326
|
except Exception as e:
|
|
325
327
|
log.error(e, deep=True)
|
|
326
328
|
log.warning("Stop run Ripper")
|
|
329
|
+
except KeyboardInterrupt:
|
|
330
|
+
log.warning("Manually stop run and clear Ripper list")
|
|
331
|
+
Ripper.ripper_list.clear()
|
|
332
|
+
raise
|
|
327
333
|
sleep(0.5)
|
|
328
334
|
|
|
329
335
|
if log.warning_num > warning_num:
|
|
@@ -419,40 +425,41 @@ def run_command(command: Iterable[str] | str) -> bool:
|
|
|
419
425
|
log.send(_want_doc_cmd_type.value.to_doc(), is_format=False)
|
|
420
426
|
elif cmd_list[2] in Ripper.Preset_name._value2member_map_:
|
|
421
427
|
_preset = Ripper.Preset_name(cmd_list[2])
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
):
|
|
426
|
-
if _preset in PRESET_OPT_NAME:
|
|
427
|
-
log.send(
|
|
428
|
-
"Params that can be directly used:\n{}",
|
|
429
|
-
textwrap.indent(
|
|
430
|
-
"\n".join(
|
|
431
|
-
f"-{n}"
|
|
432
|
-
for n in PRESET_OPT_NAME[_preset]
|
|
433
|
-
),
|
|
434
|
-
prefix=" ",
|
|
435
|
-
),
|
|
436
|
-
)
|
|
437
|
-
if _preset in DEFAULT_PRESET_PARAMS:
|
|
438
|
-
_default_params = DEFAULT_PRESET_PARAMS[_preset]
|
|
439
|
-
max_name_len = (
|
|
440
|
-
max(len(str(n)) for n in _default_params) + 1
|
|
441
|
-
)
|
|
442
|
-
log.send(
|
|
443
|
-
"Default val:\n{}",
|
|
444
|
-
textwrap.indent(
|
|
445
|
-
"\n".join(
|
|
446
|
-
f"{f'-{n}':>{max_name_len}} {v}"
|
|
447
|
-
for n, v in _default_params.items()
|
|
448
|
-
),
|
|
449
|
-
prefix=" ",
|
|
450
|
-
),
|
|
451
|
-
)
|
|
452
|
-
else:
|
|
428
|
+
_param_default_dict = _preset.get_param_default_dict()
|
|
429
|
+
_param_name_set = _preset.get_param_name_set()
|
|
430
|
+
if not any((_param_default_dict, _param_name_set)):
|
|
453
431
|
log.send(
|
|
454
432
|
"The preset '{}' has no separate help", cmd_list[2]
|
|
455
433
|
)
|
|
434
|
+
if _param_name_set:
|
|
435
|
+
log.send(
|
|
436
|
+
"Params that can be directly used:\n{}",
|
|
437
|
+
textwrap.indent(
|
|
438
|
+
"\n".join(f"-{n}" for n in _param_name_set),
|
|
439
|
+
prefix=" ",
|
|
440
|
+
),
|
|
441
|
+
)
|
|
442
|
+
if _param_default_dict:
|
|
443
|
+
max_name_len = (
|
|
444
|
+
max(len(str(n)) for n in _param_default_dict) + 1
|
|
445
|
+
)
|
|
446
|
+
log.send(
|
|
447
|
+
"Default val:\n{}",
|
|
448
|
+
textwrap.indent(
|
|
449
|
+
"\n".join(
|
|
450
|
+
f"{f'-{n}':>{max_name_len}} {v}"
|
|
451
|
+
for n, v in _param_default_dict.items()
|
|
452
|
+
),
|
|
453
|
+
prefix=" ",
|
|
454
|
+
),
|
|
455
|
+
)
|
|
456
|
+
log.send(
|
|
457
|
+
" FFmpeg format:\n {}",
|
|
458
|
+
":".join(
|
|
459
|
+
f"{n}={v}"
|
|
460
|
+
for n, v in _param_default_dict.items()
|
|
461
|
+
),
|
|
462
|
+
)
|
|
456
463
|
else:
|
|
457
464
|
log.error("'{}' is not a member of preset", cmd_list[2])
|
|
458
465
|
|
|
@@ -495,8 +502,8 @@ def run_command(command: Iterable[str] | str) -> bool:
|
|
|
495
502
|
case Cmd_type.exit:
|
|
496
503
|
sys.exit(0)
|
|
497
504
|
|
|
498
|
-
case Cmd_type.cd | Cmd_type.mediainfo | Cmd_type.fontinfo:
|
|
499
|
-
_path_tuple:
|
|
505
|
+
case Cmd_type.cd | Cmd_type.mediainfo | Cmd_type.assinfo | Cmd_type.fontinfo:
|
|
506
|
+
_path_tuple: Iterable[str] | None = None
|
|
500
507
|
|
|
501
508
|
match cmd_list[1]:
|
|
502
509
|
case "fd" | "cfd" as fd_param:
|
|
@@ -528,6 +535,46 @@ def run_command(command: Iterable[str] | str) -> bool:
|
|
|
528
535
|
case Cmd_type.mediainfo:
|
|
529
536
|
for _path in _path_tuple:
|
|
530
537
|
log.send(f"{_path}: {Media_info.from_path(_path)}")
|
|
538
|
+
case Cmd_type.assinfo:
|
|
539
|
+
USE_LIBASS_SPEC_OPT_NAME = "-use-libass-spec"
|
|
540
|
+
use_libass_spec: bool = True
|
|
541
|
+
SHOW_CHARS_LEN_OPT_NAME = "-show-chars-len"
|
|
542
|
+
show_chars_len: bool = False
|
|
543
|
+
is_use_opt: bool = False
|
|
544
|
+
for i, s in tuple(enumerate(cmd_list))[2:]:
|
|
545
|
+
if s == USE_LIBASS_SPEC_OPT_NAME:
|
|
546
|
+
use_libass_spec = cmd_list[i + 1] != "0"
|
|
547
|
+
is_use_opt = True
|
|
548
|
+
if s == SHOW_CHARS_LEN_OPT_NAME:
|
|
549
|
+
show_chars_len = cmd_list[i + 1] != "0"
|
|
550
|
+
is_use_opt = True
|
|
551
|
+
if is_use_opt:
|
|
552
|
+
_path_tuple = cmd_list[1:2]
|
|
553
|
+
log.send(
|
|
554
|
+
" ".join(
|
|
555
|
+
(
|
|
556
|
+
f"{USE_LIBASS_SPEC_OPT_NAME} {1 if use_libass_spec else 0}",
|
|
557
|
+
f"{SHOW_CHARS_LEN_OPT_NAME} {1 if show_chars_len else 0}",
|
|
558
|
+
)
|
|
559
|
+
)
|
|
560
|
+
)
|
|
561
|
+
for _path in _path_tuple:
|
|
562
|
+
try:
|
|
563
|
+
ass = Ass(_path)
|
|
564
|
+
except Exception as e:
|
|
565
|
+
log.error(e)
|
|
566
|
+
return False
|
|
567
|
+
|
|
568
|
+
log.send(_path)
|
|
569
|
+
for font_sign, ss in ass.get_font_info(
|
|
570
|
+
use_libass_spec=use_libass_spec,
|
|
571
|
+
).items():
|
|
572
|
+
show_chars_len_log_str = ""
|
|
573
|
+
if show_chars_len:
|
|
574
|
+
show_chars_len_log_str = f": {len(ss)}"
|
|
575
|
+
log.send(
|
|
576
|
+
f" ( {font_sign[0]} / {font_sign[1].name} ){show_chars_len_log_str}"
|
|
577
|
+
)
|
|
531
578
|
case Cmd_type.fontinfo:
|
|
532
579
|
for _font in itertools.chain.from_iterable(
|
|
533
580
|
load_fonts(_path) for _path in _path_tuple
|
|
@@ -1156,7 +1203,7 @@ def init(is_first_run: bool = False) -> None:
|
|
|
1156
1203
|
|
|
1157
1204
|
if (
|
|
1158
1205
|
lang_tag := Lang_tag.from_str(file.stem[5:])
|
|
1159
|
-
).language is not
|
|
1206
|
+
).language is not Lang_tag.Language.Unknown:
|
|
1160
1207
|
easyrip_mlang.all_supported_lang_map[lang_tag] = lang_map
|
|
1161
1208
|
|
|
1162
1209
|
log.debug("Loading \"{}\" as '{}' language successfully", file, lang_tag)
|
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
import locale
|
|
2
2
|
|
|
3
3
|
from . import lang_en, lang_zh_Hans_CN
|
|
4
|
-
from .global_lang_val import
|
|
5
|
-
|
|
6
|
-
Lang_tag,
|
|
7
|
-
Lang_tag_language,
|
|
8
|
-
Lang_tag_region,
|
|
9
|
-
Lang_tag_script,
|
|
10
|
-
Lang_tag_val,
|
|
11
|
-
)
|
|
4
|
+
from .global_lang_val import Global_lang_val, Lang_tag
|
|
5
|
+
from .lang_tag_val import Lang_tag_val
|
|
12
6
|
from .translator import translate_subtitles
|
|
13
7
|
|
|
14
8
|
__all__ = [
|
|
15
9
|
"Global_lang_val",
|
|
16
10
|
"Lang_tag",
|
|
17
|
-
"Lang_tag_language",
|
|
18
|
-
"Lang_tag_region",
|
|
19
|
-
"Lang_tag_script",
|
|
20
11
|
"Lang_tag_val",
|
|
21
12
|
"Mlang_exception",
|
|
22
13
|
"get_system_language",
|
|
@@ -4,154 +4,16 @@ from dataclasses import dataclass
|
|
|
4
4
|
from typing import Self, final
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
@final
|
|
8
|
-
@dataclass(slots=True, init=False, eq=False)
|
|
9
|
-
class Lang_tag_val:
|
|
10
|
-
en_name: str
|
|
11
|
-
_local_name: str | None
|
|
12
|
-
|
|
13
|
-
@property
|
|
14
|
-
def local_name(self) -> str:
|
|
15
|
-
return self.en_name if self._local_name is None else self._local_name
|
|
16
|
-
|
|
17
|
-
@local_name.setter
|
|
18
|
-
def local_name(self, val: str | None) -> None:
|
|
19
|
-
if val is not None and len(val) == 0:
|
|
20
|
-
raise ValueError("The length of the name cannot be 0")
|
|
21
|
-
|
|
22
|
-
self._local_name = val
|
|
23
|
-
|
|
24
|
-
def __init__(self, *, en_name: str, local_name: str | None = None) -> None:
|
|
25
|
-
if len(en_name) == 0:
|
|
26
|
-
raise ValueError("The length of the name cannot be 0")
|
|
27
|
-
|
|
28
|
-
self.en_name = en_name
|
|
29
|
-
self.local_name = local_name
|
|
30
|
-
|
|
31
|
-
def __str__(self) -> str:
|
|
32
|
-
return f"{self.__class__.__name__}(en_name={self.en_name}, local_name={self._local_name})"
|
|
33
|
-
|
|
34
|
-
def __eq__(self, other: object) -> bool:
|
|
35
|
-
if isinstance(other, Lang_tag_val):
|
|
36
|
-
return self.en_name == other.en_name
|
|
37
|
-
return False
|
|
38
|
-
|
|
39
|
-
def __hash__(self) -> int:
|
|
40
|
-
return hash(self.en_name)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
class Lang_tag_language(enum.Enum):
|
|
44
|
-
Unknown = Lang_tag_val(en_name="Unknown")
|
|
45
|
-
|
|
46
|
-
# ISO 639-1
|
|
47
|
-
en = Lang_tag_val(en_name="English", local_name="English")
|
|
48
|
-
zh = Lang_tag_val(en_name="Chinese", local_name="中文")
|
|
49
|
-
fr = Lang_tag_val(en_name="French", local_name="Français")
|
|
50
|
-
de = Lang_tag_val(en_name="German", local_name="Deutsch")
|
|
51
|
-
es = Lang_tag_val(en_name="Spanish", local_name="Español")
|
|
52
|
-
it = Lang_tag_val(en_name="Italian", local_name="Italiano")
|
|
53
|
-
ja = Lang_tag_val(en_name="Japanese", local_name="日本語")
|
|
54
|
-
ko = Lang_tag_val(en_name="Korean", local_name="한국어")
|
|
55
|
-
ru = Lang_tag_val(en_name="Russian", local_name="Русский")
|
|
56
|
-
ar = Lang_tag_val(en_name="Arabic", local_name="العربية")
|
|
57
|
-
|
|
58
|
-
# ISO 639-2
|
|
59
|
-
eng = en
|
|
60
|
-
zho = chi = zh
|
|
61
|
-
fra = fre = fr
|
|
62
|
-
deu = ger = de
|
|
63
|
-
spa = es
|
|
64
|
-
ita = it
|
|
65
|
-
jpn = ja
|
|
66
|
-
kor = ko
|
|
67
|
-
rus = ru
|
|
68
|
-
ara = ar
|
|
69
|
-
|
|
70
|
-
# ISO 639-3
|
|
71
|
-
# 与 p2 重叠的放在 p2
|
|
72
|
-
cdo = Lang_tag_val(en_name="Min Dong Chinese", local_name="闽东语")
|
|
73
|
-
cjy = Lang_tag_val(en_name="Jinyu Chinese", local_name="晋语")
|
|
74
|
-
cmn = Lang_tag_val(en_name="Mandarin Chinese", local_name="普通话")
|
|
75
|
-
cnp = Lang_tag_val(en_name="Northern Ping Chinese", local_name="北平语")
|
|
76
|
-
wuu = Lang_tag_val(en_name="Wu Chinese", local_name="吴语")
|
|
77
|
-
yue = Lang_tag_val(en_name="Yue Chinese", local_name="粤语")
|
|
78
|
-
hak = Lang_tag_val(en_name="Hakka Chinese", local_name="客家话")
|
|
79
|
-
nan = Lang_tag_val(en_name="Min Nan Chinese", local_name="闽南语")
|
|
80
|
-
och = Lang_tag_val(en_name="Old Chinese", local_name="古汉语")
|
|
81
|
-
|
|
82
|
-
@classmethod
|
|
83
|
-
def _missing_(cls, value: object):
|
|
84
|
-
return cls.Unknown
|
|
85
|
-
|
|
86
|
-
@classmethod
|
|
87
|
-
def from_name(cls, name: str):
|
|
88
|
-
try:
|
|
89
|
-
return cls[name]
|
|
90
|
-
except KeyError:
|
|
91
|
-
return cls.Unknown
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
class Lang_tag_script(enum.Enum):
|
|
95
|
-
Unknown = Lang_tag_val(en_name="Unknown")
|
|
96
|
-
|
|
97
|
-
Hans = Lang_tag_val(en_name="Simplified Chinese", local_name="简体")
|
|
98
|
-
Hant = Lang_tag_val(en_name="Traditional Chinese", local_name="繁體")
|
|
99
|
-
Latn = Lang_tag_val(en_name="Latin", local_name="Latina")
|
|
100
|
-
Cyrl = Lang_tag_val(en_name="Cyrillic", local_name="Кириллица")
|
|
101
|
-
Arab = Lang_tag_val(en_name="Arabic", local_name="العربية")
|
|
102
|
-
|
|
103
|
-
@classmethod
|
|
104
|
-
def _missing_(cls, value: object):
|
|
105
|
-
return cls.Unknown
|
|
106
|
-
|
|
107
|
-
@classmethod
|
|
108
|
-
def from_name(cls, name: str):
|
|
109
|
-
try:
|
|
110
|
-
return cls[name]
|
|
111
|
-
except KeyError:
|
|
112
|
-
return cls.Unknown
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
class Lang_tag_region(enum.Enum):
|
|
116
|
-
Unknown = Lang_tag_val(en_name="Unknown")
|
|
117
|
-
|
|
118
|
-
US = Lang_tag_val(en_name="United States", local_name="United States")
|
|
119
|
-
GB = Lang_tag_val(en_name="United Kingdom", local_name="United Kingdom")
|
|
120
|
-
AU = Lang_tag_val(en_name="Australia", local_name="Australia")
|
|
121
|
-
CA = Lang_tag_val(en_name="Canada", local_name="Canada")
|
|
122
|
-
NZ = Lang_tag_val(en_name="New Zealand", local_name="New Zealand")
|
|
123
|
-
IE = Lang_tag_val(en_name="Ireland", local_name="Éire")
|
|
124
|
-
ZA = Lang_tag_val(en_name="South Africa", local_name="South Africa")
|
|
125
|
-
JM = Lang_tag_val(en_name="Jamaica", local_name="Jamaica")
|
|
126
|
-
TT = Lang_tag_val(en_name="Caribbean", local_name="Caribbean")
|
|
127
|
-
BZ = Lang_tag_val(en_name="Belize", local_name="Belize")
|
|
128
|
-
PH = Lang_tag_val(en_name="Philippines", local_name="Pilipinas")
|
|
129
|
-
IN = Lang_tag_val(en_name="India", local_name="भारत")
|
|
130
|
-
MY = Lang_tag_val(en_name="Malaysia", local_name="Malaysia")
|
|
131
|
-
SG = Lang_tag_val(en_name="Singapore", local_name="Singapura")
|
|
132
|
-
MO = Lang_tag_val(en_name="Macau SAR", local_name="澳門")
|
|
133
|
-
HK = Lang_tag_val(en_name="Hong Kong SAR", local_name="香港")
|
|
134
|
-
TW = Lang_tag_val(en_name="Taiwan", local_name="台灣")
|
|
135
|
-
CN = Lang_tag_val(en_name="China", local_name="中国大陆")
|
|
136
|
-
|
|
137
|
-
@classmethod
|
|
138
|
-
def _missing_(cls, value: object):
|
|
139
|
-
return cls.Unknown
|
|
140
|
-
|
|
141
|
-
@classmethod
|
|
142
|
-
def from_name(cls, name: str):
|
|
143
|
-
try:
|
|
144
|
-
return cls[name]
|
|
145
|
-
except KeyError:
|
|
146
|
-
return cls.Unknown
|
|
147
|
-
|
|
148
|
-
|
|
149
7
|
@final
|
|
150
8
|
@dataclass(slots=True, kw_only=True)
|
|
151
9
|
class Lang_tag:
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
10
|
+
from .lang_tag_val import Lang_tag_language as Language
|
|
11
|
+
from .lang_tag_val import Lang_tag_region as Region
|
|
12
|
+
from .lang_tag_val import Lang_tag_script as Script
|
|
13
|
+
|
|
14
|
+
language: Language = Language.Unknown
|
|
15
|
+
script: Script = Script.Unknown
|
|
16
|
+
region: Region = Region.Unknown
|
|
155
17
|
|
|
156
18
|
class Match_priority(enum.Enum):
|
|
157
19
|
script = enum.auto()
|
|
@@ -193,7 +55,7 @@ class Lang_tag:
|
|
|
193
55
|
|
|
194
56
|
if priority_same_tuple := (
|
|
195
57
|
same_script_tuple + same_region_tuple
|
|
196
|
-
if priority is
|
|
58
|
+
if priority is self.__class__.Match_priority.script
|
|
197
59
|
else same_region_tuple + same_script_tuple
|
|
198
60
|
):
|
|
199
61
|
return priority_same_tuple[0]
|
|
@@ -214,19 +76,19 @@ class Lang_tag:
|
|
|
214
76
|
|
|
215
77
|
str_tag_list = str_tag.split("-")
|
|
216
78
|
|
|
217
|
-
language =
|
|
218
|
-
script:
|
|
219
|
-
region:
|
|
79
|
+
language: Lang_tag.Language = cls.Language.from_name(str_tag_list[0])
|
|
80
|
+
script: Lang_tag.Script = cls.Script.Unknown
|
|
81
|
+
region: Lang_tag.Region = cls.Region.Unknown
|
|
220
82
|
|
|
221
83
|
for i, s in enumerate(str_tag_list[1:]):
|
|
222
|
-
if s in
|
|
84
|
+
if s in cls.Script._member_map_:
|
|
223
85
|
if i != 0:
|
|
224
86
|
raise ValueError(
|
|
225
87
|
gettext("The input language tag string format is illegal")
|
|
226
88
|
)
|
|
227
|
-
script =
|
|
228
|
-
elif s in
|
|
229
|
-
region =
|
|
89
|
+
script = cls.Script[s]
|
|
90
|
+
elif s in cls.Region._member_map_:
|
|
91
|
+
region = cls.Region[s]
|
|
230
92
|
|
|
231
93
|
return cls(
|
|
232
94
|
language=language,
|
|
@@ -236,13 +98,13 @@ class Lang_tag:
|
|
|
236
98
|
|
|
237
99
|
def __str__(self) -> str:
|
|
238
100
|
"""返回语言标签字符串"""
|
|
239
|
-
if self.language ==
|
|
101
|
+
if self.language == self.__class__.Language.Unknown:
|
|
240
102
|
raise Exception("The Language is Unknown")
|
|
241
103
|
|
|
242
104
|
res_str: str = self.language.name
|
|
243
|
-
if self.script !=
|
|
105
|
+
if self.script != self.__class__.Script.Unknown:
|
|
244
106
|
res_str += f"-{self.script.name}"
|
|
245
|
-
if self.region !=
|
|
107
|
+
if self.region != self.__class__.Region.Unknown:
|
|
246
108
|
res_str += f"-{self.region.name}"
|
|
247
109
|
|
|
248
110
|
return res_str
|
|
@@ -266,18 +128,18 @@ class Global_lang_val:
|
|
|
266
128
|
|
|
267
129
|
res_str_list: list[str] = [
|
|
268
130
|
_local_name
|
|
269
|
-
if (_org_name := tag_list[0]) in
|
|
270
|
-
and (_local_name :=
|
|
131
|
+
if (_org_name := tag_list[0]) in Lang_tag.Language._member_map_
|
|
132
|
+
and (_local_name := Lang_tag.Language[_org_name].value.local_name)
|
|
271
133
|
else _org_name
|
|
272
134
|
]
|
|
273
135
|
|
|
274
136
|
if tag_list_len >= 2:
|
|
275
137
|
_org_name = tag_list[1]
|
|
276
138
|
|
|
277
|
-
if _org_name in
|
|
278
|
-
_local_name =
|
|
279
|
-
elif _org_name in
|
|
280
|
-
_local_name =
|
|
139
|
+
if _org_name in Lang_tag.Script.__members__:
|
|
140
|
+
_local_name = Lang_tag.Script[_org_name].value.local_name
|
|
141
|
+
elif _org_name in Lang_tag.Region._member_map_:
|
|
142
|
+
_local_name = Lang_tag.Region[_org_name].value.local_name
|
|
281
143
|
else:
|
|
282
144
|
_local_name = _org_name
|
|
283
145
|
|
|
@@ -286,8 +148,8 @@ class Global_lang_val:
|
|
|
286
148
|
if tag_list_len >= 3:
|
|
287
149
|
_org_name = tag_list[2]
|
|
288
150
|
|
|
289
|
-
if _org_name in
|
|
290
|
-
_local_name =
|
|
151
|
+
if _org_name in Lang_tag.Region._member_map_:
|
|
152
|
+
_local_name = Lang_tag.Region[_org_name].value.local_name
|
|
291
153
|
else:
|
|
292
154
|
_local_name = _org_name
|
|
293
155
|
|
easyrip/easyrip_mlang/lang_en.py
CHANGED