- A failure keeps its traceback unless it is yt-dlp's or our own StatedFailure (a message that is the whole story). A plain RuntimeError, RecursionError or OSError is also what a bug of ours raises, and its stack is the only lead. - The stack is scrubbed link by link (logs.scrubbed_stack): a chained DownloadError under a DB error no longer prints yt-dlp's text unscrubbed. - Engine hide_parameters: a DB error's message no longer carries the title or path it was writing. - The download and edit failure lines go out even when their DB write fails. - The worker's child_exit/crash/supervisor lines say download.job.failed only when the job failed there; a crash the DB will not record no longer ends the thread. Stopping a paused child is download.child.stopped, not a second abort. - log_safe also covers generic ids with spaces, playlist titles and bare ids. - The ffmpeg image steps log the failure kind, not the argv with its path. - The consent contract accepts only the body of a plain consented_trace() check, and any level that may be TRACE. - Tests for each; every one mutation-checked.
14 lines
779 B
Python
14 lines
779 B
Python
"""The failures the download pipeline raises itself, with the whole story in the message.
|
|
|
|
`ffmpeg failed (1): …`, `yt-dlp produced no output file`, a post that shows no video: the message
|
|
says what happened, and the stack is only the `except` that caught it. A failure line leaves that
|
|
stack off (`pipeline._failure_stack`) — but ONLY for these. A plain `RuntimeError` is also what
|
|
Python raises for a bug of ours (a dict changed size during iteration, a generator's
|
|
StopIteration, `RecursionError`, `NotImplementedError`), and that one's stack is the only lead.
|
|
"""
|
|
|
|
|
|
class StatedFailure(RuntimeError):
|
|
"""A failure we raised on purpose, whose message is its full explanation. A `RuntimeError` so
|
|
every `except RuntimeError` that caught these before still does."""
|