Пример #1
0
def det(tf):
    # fmt: off
    sp.check_call([
        b"ffmpeg", b"-nostdin", b"-hide_banner", b"-v", b"fatal", b"-ss",
        b"13", b"-y", b"-i",
        fsenc(sys.argv[1]), b"-map", b"0:a:0", b"-ac", b"1", b"-ar", b"22050",
        b"-t", b"300", b"-f", b"f32le",
        fsenc(tf)
    ])
    # fmt: on

    with open(tf, "rb") as f:
        d = np.fromfile(f, dtype=np.float32)
        try:
            # 98% accuracy on jcore
            c = vamp.collect(d, 22050, "beatroot-vamp:beatroot")
            cl = c["list"]
        except:
            # fallback; 73% accuracy
            plug = "vamp-example-plugins:fixedtempo"
            c = vamp.collect(d, 22050, plug, parameters={"maxdflen": 40})
            print(c["list"][0]["label"].split(" ")[0])
            return

        # throws if detection failed:
        bpm = float(cl[-1]["timestamp"] - cl[1]["timestamp"])
        bpm = round(60 * ((len(cl) - 1) / bpm), 2)
        print(f"{bpm:.2f}")
Пример #2
0
def det(tf):
    # fmt: off
    sp.check_call([
        b"ffmpeg", b"-nostdin", b"-hide_banner", b"-v", b"fatal", b"-y", b"-i",
        fsenc(sys.argv[1]), b"-map", b"0:a:0", b"-t", b"300", b"-sample_fmt",
        b"s16",
        fsenc(tf)
    ])
    # fmt: on

    print(keyfinder.key(tf).camelot())
Пример #3
0
def slice(tf):
    dur = get_duration()
    dur = min(dur, 600)  # max 10min
    segs = get_segs(dur)

    # fmt: off
    cmd = ["ffmpeg", "-nostdin", "-hide_banner", "-v", "fatal", "-y"]

    for seg in segs:
        cmd.extend(["-ss", str(seg[0]), "-i", fsenc(sys.argv[1])])

    filt = ""
    for n, seg in enumerate(segs):
        filt += "[{}:a:0]atrim=duration={}[a{}]; ".format(n, seg[1], n)

    prev = "a0"
    for n in range(1, len(segs)):
        nxt = "b{}".format(n)
        filt += "[{}][a{}]acrossfade=d=0.5[{}]; ".format(prev, n, nxt)
        prev = nxt

    cmd.extend([
        "-filter_complex", filt[:-2], "-map", "[{}]".format(nxt),
        "-sample_fmt", "s16", tf
    ])
    # fmt: on

    # print(cmd)
    sp.check_call(cmd)
Пример #4
0
def main():
    cwd, fn = os.path.split(sys.argv[1])
    if os.path.basename(cwd) == "noexif":
        return

    os.chdir(cwd)
    f1 = fsenc(fn)
    f2 = os.path.join(b"noexif", f1)
    cmd = [
        b"exiftool",
        b"-exif:all=",
        b"-iptc:all=",
        b"-xmp:all=",
        b"-P",
        b"-o",
        b"noexif/",
        b"--",
        f1,
    ]
    sp.check_output(cmd)
    if not os.path.exists(f2):
        print("failed")
        return

    if filecmp.cmp(f1, f2, shallow=False):
        print("clean")
    else:
        print("exif")
Пример #5
0
def det():
    # fmt: off
    cmd = [
        b"ffmpeg", b"-nostdin", b"-hide_banner", b"-v", b"fatal", b"-i",
        fsenc(sys.argv[1]), b"-f", b"framemd5", b"-"
    ]
    # fmt: on

    p = sp.Popen(cmd, stdout=sp.PIPE)
    # ps = io.TextIOWrapper(p.stdout, encoding="utf-8")
    ps = p.stdout

    chans = {}
    for ln in ps:
        if ln.startswith(b"#stream#"):
            break

        m = re.match(r"^#media_type ([0-9]): ([a-zA-Z])", ln.decode("utf-8"))
        if m:
            chans[m.group(1)] = m.group(2)

    hashers = [hashlib.sha512(), hashlib.sha512()]
    for ln in ps:
        n = int(ln[:1])
        v = ln.rsplit(b",", 1)[-1].strip()
        hashers[n].update(v)

    r = {}
    for k, v in chans.items():
        dg = hashers[int(k)].digest()[:12]
        dg = base64.urlsafe_b64encode(dg).decode("ascii")
        r[v[0].lower() + "hash"] = dg

    print(json.dumps(r, indent=4))
Пример #6
0
def get_duration():
    # TODO provide ffprobe tags to mtp as json

    # fmt: off
    dur = sp.check_output([
        "ffprobe", "-hide_banner", "-v", "fatal", "-show_streams",
        "-show_format",
        fsenc(sys.argv[1])
    ])
    # fmt: on

    dur = dur.decode("ascii", "replace").split("\n")
    dur = [x.split("=")[1] for x in dur if x.startswith("duration=")]
    dur = [float(x) for x in dur if re.match(r"^[0-9\.,]+$", x)]
    return list(sorted(dur))[-1] if dur else None
Пример #7
0
def main():
    config = "crc32 md5 md5b sha1 sha1b sha256 sha256b sha512/240 sha512b/240"
    # b suffix = base64 encoded
    # slash = truncate to n bits

    known = {
        "md5": hashlib.md5,
        "sha1": hashlib.sha1,
        "sha256": hashlib.sha256,
        "sha512": hashlib.sha512,
    }
    config = config.split()
    hashers = {
        k: v()
        for k, v in known.items()
        if k in [x.split("/")[0].rstrip("b") for x in known]
    }
    crc32 = 0 if "crc32" in config else None

    with open(fsenc(sys.argv[1]), "rb", 512 * 1024) as f:
        while True:
            buf = f.read(64 * 1024)
            if not buf:
                break

            for x in hashers.values():
                x.update(buf)

            if crc32 is not None:
                crc32 = zlib.crc32(buf, crc32)

    ret = {}
    for s in config:
        alg = s.split("/")[0]
        b64 = alg.endswith("b")
        alg = alg.rstrip("b")
        if alg in hashers:
            v = hashers[alg].digest()
        elif alg == "crc32":
            v = crc32
            if v < 0:
                v &= 2**32 - 1
            v = struct.pack(">L", v)
        else:
            raise Exception("what is {}".format(s))

        if "/" in s:
            v = v[:int(int(s.split("/")[1]) / 8)]

        if b64:
            v = base64.b64encode(v).decode("ascii").rstrip("=")
        else:
            try:
                v = v.hex()
            except:
                import binascii

                v = binascii.hexlify(v)

        ret[s] = v

    print(json.dumps(ret, indent=4))