Arguments: timecode: A frame number (`int`), number of seconds (`float`), timecode string in the form `'HH:MM:SS'` or `'HH:MM:SS.nnn'`, or a `Timecode`. fps: The framerate to use for distance between frames and to calculate frame numbers.
(
self,
timecode: "TimecodeLike",
fps: "float | FrameTimecode | Fraction | None" = None,
)
| 207 | """ |
| 208 | |
| 209 | def __init__( |
| 210 | self, |
| 211 | timecode: "TimecodeLike", |
| 212 | fps: "float | FrameTimecode | Fraction | None" = None, |
| 213 | ): |
| 214 | """ |
| 215 | Arguments: |
| 216 | timecode: A frame number (`int`), number of seconds (`float`), timecode string in |
| 217 | the form `'HH:MM:SS'` or `'HH:MM:SS.nnn'`, or a `Timecode`. |
| 218 | fps: The framerate to use for distance between frames and to calculate frame numbers. |
| 219 | For a VFR video, this may just be the average framerate. |
| 220 | Raises: |
| 221 | TypeError: Thrown if either `timecode` or `fps` are unsupported types. |
| 222 | ValueError: Thrown when specifying a negative timecode or framerate. |
| 223 | """ |
| 224 | self._time: _FrameNumber | _Seconds | Timecode |
| 225 | """Internal time representation.""" |
| 226 | self._rate: Fraction | None = None |
| 227 | """Rate at which time passes between frames, measured in frames/sec.""" |
| 228 | |
| 229 | # Copy constructor. |
| 230 | if isinstance(timecode, FrameTimecode): |
| 231 | self._time = timecode._time |
| 232 | self._rate = timecode._rate if fps is None else self._ensure_fractional(fps) |
| 233 | return |
| 234 | |
| 235 | # Ensure args are consistent with API. |
| 236 | if fps is None: |
| 237 | raise TypeError("fps is a required argument.") |
| 238 | self._rate = self._ensure_fractional(fps) |
| 239 | |
| 240 | # Timecode with a time base. |
| 241 | if isinstance(timecode, Timecode): |
| 242 | self._time = timecode |
| 243 | return |
| 244 | |
| 245 | # Process the timecode value, storing it as an exact number of frames only if required. |
| 246 | if isinstance(timecode, str) and timecode.isdigit(): |
| 247 | timecode = int(timecode) |
| 248 | |
| 249 | if isinstance(timecode, str): |
| 250 | self._time = _Seconds(self._timecode_to_seconds(timecode)) |
| 251 | elif isinstance(timecode, float): |
| 252 | if timecode < 0.0: |
| 253 | raise ValueError("Timecode frame number must be positive and greater than zero.") |
| 254 | self._time = _Seconds(timecode) |
| 255 | else: |
| 256 | # Only `int` remains: `Timecode`/`FrameTimecode` returned earlier and `str`/`float` |
| 257 | # were just handled above. |
| 258 | if timecode < 0: |
| 259 | raise ValueError("Timecode frame number must be positive and greater than zero.") |
| 260 | self._time = _FrameNumber(timecode) |
| 261 | |
| 262 | @property |
| 263 | def frame_num(self) -> int: |
nothing calls this directly
no test coverage detected