easyrip 4.10.0__py3-none-any.whl → 4.11.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/global_val.py CHANGED
@@ -3,7 +3,7 @@ import sys
3
3
  from pathlib import Path
4
4
 
5
5
  PROJECT_NAME = "Easy Rip"
6
- PROJECT_VERSION = "4.10.0"
6
+ PROJECT_VERSION = "4.11.0"
7
7
  PROJECT_TITLE = f"{PROJECT_NAME} v{PROJECT_VERSION}"
8
8
  PROJECT_URL = "https://github.com/op200/EasyRip"
9
9
  PROJECT_RELEASE_API = "https://api.github.com/repos/op200/EasyRip/releases/latest"
@@ -2,11 +2,13 @@ import enum
2
2
  import itertools
3
3
  import re
4
4
  from dataclasses import dataclass, field
5
+ from functools import total_ordering
5
6
  from pathlib import Path
7
+ from typing import Self
6
8
 
7
9
  from ...easyrip_log import log
8
10
  from ...easyrip_mlang import Mlang_exception
9
- from ...utils import read_text, uudecode_ssa, uuencode_ssa
11
+ from ...utils import read_text, time_str_to_sec, uudecode_ssa, uuencode_ssa
10
12
 
11
13
 
12
14
  class Style_fmt_it(enum.Enum):
@@ -264,6 +266,75 @@ class Styles:
264
266
  )
265
267
 
266
268
 
269
+ @total_ordering
270
+ class Ass_time:
271
+ def __init__(
272
+ self,
273
+ h: int = 0,
274
+ m: int = 0,
275
+ s: int = 0,
276
+ ms: int = 0,
277
+ ) -> None:
278
+ self.h = h
279
+ self.m = m
280
+ self.s = s
281
+ self.ms = ms
282
+
283
+ def __str__(self) -> str:
284
+ return f"{self.h:02d}:{self.m:02d}:{self.s:02d}.{self.ms // 10:02d}"
285
+
286
+ def __hash__(self) -> int:
287
+ return hash((self.h, self.m, self.s, self.ms))
288
+
289
+ def __eq__(self, value: object) -> bool:
290
+ if isinstance(value, Ass_time):
291
+ return (self.h, self.m, self.s, self.ms) == (
292
+ value.h,
293
+ value.m,
294
+ value.s,
295
+ value.ms,
296
+ )
297
+ return NotImplemented
298
+
299
+ def __lt__(self, value: object) -> bool:
300
+ if isinstance(value, Ass_time):
301
+ return (self.h, self.m, self.s, self.ms) < (
302
+ value.h,
303
+ value.m,
304
+ value.s,
305
+ value.ms,
306
+ )
307
+ return NotImplemented
308
+
309
+ def __add__(self, other: object) -> Self:
310
+ if isinstance(other, Ass_time):
311
+ return self.__class__.from_ms(self.total_ms() + other.total_ms())
312
+ return NotImplemented
313
+
314
+ def __sub__(self, other: object) -> Self:
315
+ if isinstance(other, Ass_time):
316
+ return self.__class__.from_ms(self.total_ms() - other.total_ms())
317
+ return NotImplemented
318
+
319
+ @classmethod
320
+ def from_ms(cls, ms: int) -> Self:
321
+ return cls(
322
+ ms // 3_600_000,
323
+ (ms % 3_600_000) // 60_000,
324
+ (ms % 60_000) // 1000,
325
+ ms % 1000,
326
+ )
327
+
328
+ @classmethod
329
+ def from_str(cls, ass_time_str: str) -> Self:
330
+ return cls.from_ms(
331
+ round(time_str_to_sec(ass_time_str) * 1000),
332
+ )
333
+
334
+ def total_ms(self) -> int:
335
+ return self.h * 3_600_000 + self.m * 60_000 + self.s * 1000 + self.ms
336
+
337
+
267
338
  class Event_fmt_it(enum.Enum):
268
339
  Layer = "Layer"
269
340
  Start = "Start"
@@ -291,8 +362,8 @@ class Event_data:
291
362
  type: Event_type
292
363
 
293
364
  Layer: int
294
- Start: str
295
- End: str
365
+ Start: Ass_time
366
+ End: Ass_time
296
367
  Style: str
297
368
  Name: str
298
369
  MarginL: int
@@ -451,8 +522,12 @@ class Events:
451
522
  res = Event_data(
452
523
  type=event_type,
453
524
  Layer=int(event_tuple[self.fmt_index[Event_fmt_it.Layer]]),
454
- Start=event_tuple[self.fmt_index[Event_fmt_it.Start]],
455
- End=event_tuple[self.fmt_index[Event_fmt_it.End]],
525
+ Start=Ass_time.from_str(
526
+ event_tuple[self.fmt_index[Event_fmt_it.Start]],
527
+ ),
528
+ End=Ass_time.from_str(
529
+ event_tuple[self.fmt_index[Event_fmt_it.End]],
530
+ ),
456
531
  Style=event_tuple[self.fmt_index[Event_fmt_it.Style]],
457
532
  Name=event_tuple[self.fmt_index[Event_fmt_it.Name]],
458
533
  MarginL=int(event_tuple[self.fmt_index[Event_fmt_it.MarginL]]),
@@ -496,7 +571,11 @@ class Events:
496
571
  )
497
572
  for event in self.data
498
573
  if (drop_non_render is False)
499
- or (event.type != Event_type.Comment and event.Text)
574
+ or (
575
+ event.type != Event_type.Comment
576
+ and event.Text
577
+ and event.Start < event.End
578
+ )
500
579
  ),
501
580
  )
502
581
  )
@@ -762,6 +841,7 @@ class Ass:
762
841
 
763
842
  def __str__(
764
843
  self,
844
+ *,
765
845
  drop_non_render: bool = False,
766
846
  drop_unkow_data: bool = False,
767
847
  drop_fonts: bool = False,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: easyrip
3
- Version: 4.10.0
3
+ Version: 4.11.0
4
4
  Author: op200
5
5
  License-Expression: AGPL-3.0-or-later
6
6
  Project-URL: Homepage, https://github.com/op200/EasyRip
@@ -4,7 +4,7 @@ easyrip/easyrip_command.py,sha256=X9_8t9Sxl1-gILpsQ5PueCwozTQgjgL2cImzOZ6pO7w,27
4
4
  easyrip/easyrip_log.py,sha256=R-dM3CWUBFITtG7GSD1zy4X4MhZqxkoiBPjlIpI76cY,15573
5
5
  easyrip/easyrip_main.py,sha256=QgIrsonjXNin72nv7WWePTlpj9soGZCBVv1cwFNS4a4,44691
6
6
  easyrip/easyrip_prompt.py,sha256=A5S7ybeJSGFkCmwdJ9TCQ_-lde7NWgkbFytZ2KnvkWI,2145
7
- easyrip/global_val.py,sha256=P4tP5GtjMQAkrsLQ6TnnhkQeUnyFZhYtA_NIFIjx5Gg,774
7
+ easyrip/global_val.py,sha256=Z9Y8N7MpqegW-5LDs8bn1dhmqjSSbEB2P6Oeye_sJ-4,774
8
8
  easyrip/utils.py,sha256=N1rMF1MyoC-YFBgy10_u29cFoowfhR-5Viea93O7wQ4,8750
9
9
  easyrip/easyrip_config/config.py,sha256=aj6Vg1rJkvICSTZ0ZONznR_MkvVr5u5ngkX_zfZopvU,9859
10
10
  easyrip/easyrip_config/config_key.py,sha256=_jjdKOunskUoG7UUWOz3QZK-s4LF_x6hmM9MKttyS2Q,766
@@ -20,12 +20,12 @@ easyrip/ripper/media_info.py,sha256=mQq_vbQ7S9fWpb39HLkoZlAL-pqNfwxewv6X776Nf50,
20
20
  easyrip/ripper/param.py,sha256=y1n2XaW55TJQ_r858pB4kYZVgT6TRpmS5vv9iMEIESc,11736
21
21
  easyrip/ripper/ripper.py,sha256=xTwKpgkqqhh0x6J8DnE5fnXmEN_Q6ZZAdCPky68P-DE,50437
22
22
  easyrip/ripper/sub_and_font/__init__.py,sha256=cBT7mxL7RRFaJXFPXuZ7RT-YK6FbnanaU5v6U9BOquw,153
23
- easyrip/ripper/sub_and_font/ass.py,sha256=vQ_bP_-h2KHfSIYzqVpyRXG95m0f8jBYjFCc9X853-o,26419
23
+ easyrip/ripper/sub_and_font/ass.py,sha256=hJhVN7CqehN9xW1W295gmkPnG-somqlxnwXzRidbA2M,28645
24
24
  easyrip/ripper/sub_and_font/font.py,sha256=X2dPcPzbwQf3fv_g_mxO-zY7puVAX9Nv-9QHn88q4oA,7745
25
25
  easyrip/ripper/sub_and_font/subset.py,sha256=qGH3H26nHnyGFfFwvktEIKncHpm086DqxYjVhNoVDdM,18654
26
- easyrip-4.10.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
27
- easyrip-4.10.0.dist-info/METADATA,sha256=wWeHJfrBy8Lp2MHJhd4_x9bEYxmCr3ldaaabZkbkmgs,3507
28
- easyrip-4.10.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
- easyrip-4.10.0.dist-info/entry_points.txt,sha256=D6GBMMTzZ-apgX76KyZ6jxMmIFqGYwU9neeLLni_qKI,49
30
- easyrip-4.10.0.dist-info/top_level.txt,sha256=kuEteBXm-Gf90jRQgH3-fTo-Z-Q6czSuUEqY158H4Ww,8
31
- easyrip-4.10.0.dist-info/RECORD,,
26
+ easyrip-4.11.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
27
+ easyrip-4.11.0.dist-info/METADATA,sha256=-5Cnc5K0zC8oUEFqgcomSavHeKGeejLu-h6-xhysxsA,3507
28
+ easyrip-4.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
+ easyrip-4.11.0.dist-info/entry_points.txt,sha256=D6GBMMTzZ-apgX76KyZ6jxMmIFqGYwU9neeLLni_qKI,49
30
+ easyrip-4.11.0.dist-info/top_level.txt,sha256=kuEteBXm-Gf90jRQgH3-fTo-Z-Q6czSuUEqY158H4Ww,8
31
+ easyrip-4.11.0.dist-info/RECORD,,