import vapoursynth as vs
from vapoursynth import core

def FixFrameDurations(out, src, num , den):
    src0 = core.std.Interleave([src] * num)
    src1 = src.std.Trim(first=1)
    src1 = core.std.Interleave([src1] * num)
    if den>1:
        src0 = src0.std.SelectEvery(cycle=den, offsets=0)
        src1 = src1.std.SelectEvery(cycle=den, offsets=0)

    def set_duration(n, f):
        fout = f[0].copy()
        if not '_DurationNum' in f[1].props or not '_DurationNum' in f[2].props:
              return fout
        dur_rel = den / num
        tm = n * dur_rel - int(n * dur_rel)
        dur_src0 = f[1].props['_DurationNum'] / f[1].props['_DurationDen'] / dur_rel
        dur_src1 = f[2].props['_DurationNum'] / f[2].props['_DurationDen'] / dur_rel
        dur = dur_src0 * dur_rel if tm + dur_rel <= 1.0 else dur_src0 * (1.0 - tm) + dur_src1 * (tm + dur_rel - 1.0)
        fout.props['_DurationNum'] = int(dur*10000000)
        fout.props['_DurationDen'] = 10000000
        return fout
    res = core.std.ModifyFrame(clip=out, clips=[out,src0,src1], selector=set_duration)
    return res
