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}")
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())
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)
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")
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))
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
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))