update
This commit is contained in:
@@ -1187,6 +1187,7 @@ class Download_File(Cmdlet):
|
||||
hydrus_available=hydrus_available,
|
||||
final_output_dir=final_output_dir,
|
||||
auto_continue_duplicates=False,
|
||||
force_prompt_in_pipeline=bool(kwargs.get("force_prompt_in_pipeline")),
|
||||
)
|
||||
|
||||
def _preflight_url_duplicates_bulk(
|
||||
@@ -1554,6 +1555,7 @@ class Download_File(Cmdlet):
|
||||
final_output_dir=final_output_dir,
|
||||
candidate_url=canonical_url,
|
||||
extra_urls=[url],
|
||||
force_prompt_in_pipeline=bool(clip_ranges),
|
||||
):
|
||||
duplicate_skipped_count += 1
|
||||
log(f"Skipping download (duplicate found): {url}", file=sys.stderr)
|
||||
@@ -2823,6 +2825,101 @@ class Download_File(Cmdlet):
|
||||
return f"{hours:02d}:{minutes:02d}:{secs:02d}"
|
||||
return f"{minutes:02d}:{secs:02d}"
|
||||
|
||||
@staticmethod
|
||||
def _rebase_subtitle_timestamp_text(text: str, offset_seconds: int) -> str:
|
||||
if not text:
|
||||
return text
|
||||
|
||||
try:
|
||||
offset_value = float(offset_seconds)
|
||||
except Exception:
|
||||
return text
|
||||
|
||||
if offset_value <= 0:
|
||||
return text
|
||||
|
||||
timestamp_re = re.compile(r"(?<!\d)(?P<ts>(?:\d{2}:)?\d{2}:\d{2}(?:[\.,]\d{1,3})?)(?!\d)")
|
||||
|
||||
def _shift(match: re.Match[str]) -> str:
|
||||
original = str(match.group("ts") or "")
|
||||
if not original:
|
||||
return original
|
||||
|
||||
frac_sep = "."
|
||||
frac_digits = 0
|
||||
base = original
|
||||
frac_seconds = 0.0
|
||||
if "." in original:
|
||||
base, frac = original.split(".", 1)
|
||||
frac_sep = "."
|
||||
frac_digits = len(frac)
|
||||
try:
|
||||
frac_seconds = float(f"0.{frac}") if frac else 0.0
|
||||
except Exception:
|
||||
frac_seconds = 0.0
|
||||
elif "," in original:
|
||||
base, frac = original.split(",", 1)
|
||||
frac_sep = ","
|
||||
frac_digits = len(frac)
|
||||
try:
|
||||
frac_seconds = float(f"0.{frac}") if frac else 0.0
|
||||
except Exception:
|
||||
frac_seconds = 0.0
|
||||
|
||||
parts = base.split(":")
|
||||
if len(parts) == 3:
|
||||
hours_s, minutes_s, seconds_s = parts
|
||||
include_hours = True
|
||||
elif len(parts) == 2:
|
||||
hours_s = "0"
|
||||
minutes_s, seconds_s = parts
|
||||
include_hours = False
|
||||
else:
|
||||
return original
|
||||
|
||||
try:
|
||||
total = (
|
||||
(int(hours_s) * 3600)
|
||||
+ (int(minutes_s) * 60)
|
||||
+ int(seconds_s)
|
||||
+ frac_seconds
|
||||
+ offset_value
|
||||
)
|
||||
except Exception:
|
||||
return original
|
||||
|
||||
total = max(0.0, total)
|
||||
whole_seconds = int(total)
|
||||
fraction = total - whole_seconds
|
||||
hours, remainder = divmod(whole_seconds, 3600)
|
||||
minutes, seconds = divmod(remainder, 60)
|
||||
|
||||
if frac_digits > 0:
|
||||
scale = 10 ** frac_digits
|
||||
frac_value = int(round(fraction * scale))
|
||||
if frac_value >= scale:
|
||||
frac_value = 0
|
||||
seconds += 1
|
||||
if seconds >= 60:
|
||||
seconds = 0
|
||||
minutes += 1
|
||||
if minutes >= 60:
|
||||
minutes = 0
|
||||
hours += 1
|
||||
frac_text = f"{frac_value:0{frac_digits}d}"
|
||||
if include_hours or hours > 0:
|
||||
return f"{hours:02d}:{minutes:02d}:{seconds:02d}{frac_sep}{frac_text}"
|
||||
return f"{minutes:02d}:{seconds:02d}{frac_sep}{frac_text}"
|
||||
|
||||
if include_hours or hours > 0:
|
||||
return f"{hours:02d}:{minutes:02d}:{seconds:02d}"
|
||||
return f"{minutes:02d}:{seconds:02d}"
|
||||
|
||||
try:
|
||||
return timestamp_re.sub(_shift, str(text))
|
||||
except Exception:
|
||||
return text
|
||||
|
||||
@classmethod
|
||||
def _format_clip_range(cls, start_s: int, end_s: int) -> str:
|
||||
force_hours = bool(start_s >= 3600 or end_s >= 3600)
|
||||
@@ -2854,6 +2951,13 @@ class Download_File(Cmdlet):
|
||||
|
||||
po["tag"] = tags
|
||||
|
||||
notes = po.get("notes")
|
||||
if isinstance(notes, dict):
|
||||
sub_text = notes.get("sub")
|
||||
if isinstance(sub_text, str) and sub_text.strip():
|
||||
notes["sub"] = cls._rebase_subtitle_timestamp_text(sub_text, start_s)
|
||||
po["notes"] = notes
|
||||
|
||||
if len(pipe_objects) < 2:
|
||||
return
|
||||
|
||||
|
||||
Reference in New Issue
Block a user