Package: timecode
Python Module for manipulating SMPTE timecode. Supports 23.976, 23.98, 24, 25,
29.97, 30, 50, 59.94, 60 frame rates and milliseconds (1000 fps).This library is a fork of the original PyTimeCode python library. You should
not use the two library together (PyTimeCode is not maintained and has known
bugs).The math behind the drop frame calculation is based on theblog post of David Heidelberger.Simple math operations like, addition, subtraction, multiplication or division
with an integer value or with a timecode is possible. Math operations between
timecodes with different frame rates are supported. So:from timecode import Timecode

tc1 = Timecode('29.97', '00:00:00:00')
tc2 = Timecode('24', '00:00:00:10')
tc3 = tc1 + tc2
assert tc3.framerate == '29.97'
assert tc3.frames == 12
assert tc3 == '00:00:00:11'Creating a Timecode instance with a start timecode of ‘00:00:00:00’ will
result a timecode object where the total number of frames is 1. So:tc4 = Timecode('24', '00:00:00:00')
assert tc4.frames == 1Use theframe_numberattribute if you want to get a 0 based frame number:assert tc4.frame_number == 0Frame rates 29.97 and 59.94 are always drop frame, and all the others are non
drop frame.The timecode library supports rational frame rates passed as a either a stringor tuple:tc5 = Timecode('30000/1001', '00:00:00;00')
assert tc5.framerate == '29.97'

tc6 = Timecode((30000, 1001), '00:00:00;00')
assert tc6.framerate == '29.97'You may also pass a big “Binary Coded Decimal” integer as start timecode:tc7 = Timecode('24', 421729315)
assert repr(tc7) == '19:23:14:23'This is useful for parsing timecodes stored in OpenEXR’s and extracted through
OpenImageIO for instance.Timecode also supports passing start timecodes formatted like HH:MM:SS.sss where
SS.sss is seconds and fractions of seconds:tc8 = Timecode(25, '00:00:00.040')
assert tc8.frame_number == 1You may set any timecode to be represented as fractions of seconds:tc9 = Timecode(24, '19:23:14:23')
assert repr(tc9) == '19:23:14:23'

tc9.set_fractional(True)
assert repr(tc9) == '19:23:14.958'Fraction of seconds is useful when working with tools like FFmpeg.The SMPTE standard limits the timecode with 24 hours. Even though, Timecode
instance will show the current timecode inline with the SMPTE standard, it will
keep counting the total frames without clipping it.Please report any bugs to theGitHubpage.Copyright 2014 Joshua Banton and PyTimeCode developers.Changes1.3.1Fix:Fixed 23.98, 29.97 DF, 29.97 NDF, 59.94 and 59.94 NDF rollover to00:00:00:00after 24 hours.1.3.0Fix:Fixed a huge bug in 29.97 NDF and 59.97 NDF calculations introduced
in v1.2.3.Fix:FixedTimecode.frameratewhen it is given as23.98. Theframerateattribute will not be forced to24and it will stay23.98.Update:Timecode.tc_to_frames()method now accepts Timecode instances
with possibly different frame rates then the instance itself.Fix:FixedTimecode.div_frames()method.Update:Test coverage has been increased to 100% (yay!)1.2.5Fix:Fixed an edge case when two Timecodes are subtracted the resultant
Timecode will always have the correct amount of frames. But it is not
possible to have a Timecode with negative or zero frames as this is changed
in 1.2.3.Fix:FixedTimecode.floatproperty for drop frames.1.2.4Update:It is now possible to supply aFractioninstances for theframerateargument.1.2.3Update:Passingframes=0will now raise a ValueError. This hopefully
will clarify the usage of the TimeCode as a duration. If there is no
duration, hence theframes=0, meaning that the number of frames of the
duration that this TimeCode represents is 0, which is meaningless.Update:Also added some validation for theframesproperty
(oh yes it is a property now).1.2.2.1Fix:Fixed theCHANGELOG.rstandsetup.pyto be able to properly
package and upload to PyPI.1.2.2Fix:FixedTimecode.parse_timecodefor int inputs.Update:Timecodenow accepts afractionalbool argument that
forces the timecode to be fractional.Update:Timecodenow accepts a`force_non_drop_frameargument
that forces the timecode to be non-drop frame.1.2.1Update:Added support for 23.976 fps which is a common variation of 23.98.1.2.0NEW:Support for passing a tuple with numerator and denominator when
passing rational framerate.NEW:set_fractional method for setting whether or not to represent a
timecode as fractional seconds.Update:Updated README’s with info on new featuresFIX:Some merge issues.1.1.0New:Support for passing “binary coded decimal” (BCD) integer to
timecode argument as it’s stored in certain formats like OpenEXR and DPX.
Useful for parsing timecode from metadata through OpenImageIO for instance.
Example:Timecode(24, 421729315)->19:23:14:23https://en.wikipedia.org/wiki/SMPTE_timecode1.0.1Update:To prevent confusion, passing 0 forstart_secondsargument
will raise a ValueError now inTimecode.__init__method.1.0.0New:Added support for passing rational frame rate. 24000/1001 for 23.97
etc.New:Added tests for new functionality. Fractional seconds and
rational frame rates.New:added __ge__ and __le__ methods for better comparison between two
timecodes.New:Added support for fractional seconds in the frame field as used in
ffmpeg’s duration for instance.Important:When passing fractional second style timecode, the
Timecode.frs will return a float representing the fraction of a second. This
is a major change for people expecting int values0.4.2Update:Version bump for PyPI.0.4.1Fix:Fixed a test that was testing overloaded operators.0.4.0New:Frame delimiter is now set to “:” for Non Drop Frame, “;” for Drop
Frame and “.” for millisecond based time codes.
IfTimecode.__init__()start_timecode is passed a string with the wrong
delimiter it will be converted automatically.Update:All tests involving Drop Frame and millisecond time codes are now
set to use the new delimiter.New:Timecode.tc_to_string()method added to present the correctly
formatted time code.New:Timecode.ms_frameboolean attribute added.New:Timecode.__init__()now supports strings, ints and floats for
the framerate argument.0.3.0New:Renamed the library totimecode.0.2.0New:Rewritten the whole library from scratch.New:Most important change is the licencing. There was now license
defined in the previous implementation. The library is now licensed under MIT
license.Update:Timecode.__init__() arguments has been changed, removed the
unnecessarydrop_frame,iter_returnsarguments.Drop frame can be interpreted from theframerateargument anditer_returnsis unnecessary cause any iteration on the object will return
anotherTimecodeinstance.If you want to get a string representation useTimecode.__str__()orstr(Timecode)orTimecode.__repr__()or\`Timecode\`or'%s' % Timecodeany other thing that will convert it to a string.If you want to get an integer useTimecode.framesorTimecode.frame_countdepending on what you want to get out of it.So setting theiter_returnsto something and nailing the output was
unnecessary.Update:Updated the drop frame calculation to a much better one, which
is based on to the blog post of David Heidelberger athttp://www.davidheidelberger.com/blog/?p=29New:AddedTimecode.__eq__()so it is now possible to check the
equality of two timecode instances or a timecode and a string or a timecode
and an integer (which will check the total frame count).Update:Timecode.tc_to_frames()now needs a timecode as a string
and will return an integer value which is the number of frames in that
timecode.Update:Timecode.frames_to_tc()now needs an integer frame count
and returns 4 integers for hours, minutes, seconds and frames.Update:Timecode.hrs,Timecode.mins,Timecode.secsandTimecode.frsattributes are now properties. Because it was so rare to
check the individual hours, minutes, seconds or frame values, their values
are calculated withTimecode.frames_to_tc()method. But in future they
can still be converted to attributes and their value will be updated each
time theTimecode.framesattribute is changed (so add a_framesattribute and makeframesa property with a getter and setter, and update
the hrs, mins, secs and frs in setter etc.).Update:RemovedTimecode.calc_drop_frame()method. The drop frame
calculation is neatly done insideTimecode.frames_to_tc()andTimecode.tc_to_frames()methods.Update:UpdatedTimecode.parse_timecode()method to a much simpler
algorithm.Update:RemovedTimecode.__return_item__()method. It is not
necessary to return an item in that way anymore.Update:RemovedTimecode.make_timecode()method. It was another
unnecessary method, so it is removed. Now using simple python string
templates for string representations.New:Addedtimecode.__version__string, and set the value to
“0.2.0”.Update:RemovedTimecode.set_int_framerate()method. Setting the
framerate will automatically set theTimecode.int_framerateattribute.