mazash/src/endpoints/mazash.py

116 lines
3.5 KiB
Python

from flask import Blueprint, jsonify, request
from dejavu import Dejavu
from dejavu.logic.recognizer.file_recognizer import FileRecognizer
import os
import ipfsapi
import tempfile
mazash = Blueprint(name="mazash", import_name=__name__)
config = {
"database" : {
"host" : os.getenv("POSTGRES_HOST", "db"),
"user" : os.getenv("POSTGRES_USER","postgres"),
"password" : os.getenv("POSTGRES_PASSWORD", "changeme"),
"database" : os.getenv("POSTGRES_DB", "dejavu")
},
"database_type": "postgres"
}
def transform_resultToJsonable(r):
jsonable = {
"song_id": r["song_id"],
"song_name": r["song_name"].decode("utf-8"),
"input_total_hashes": r["input_total_hashes"],
"fingerprinted_hashes_in_db": r["fingerprinted_hashes_in_db"],
"hashes_matched_in_input": r["hashes_matched_in_input"],
"input_confidence": r["input_confidence"],
"fingerprinted_confidence": r["fingerprinted_confidence"],
"offset": int(r["offset"]),
"offset_seconds": r["offset_seconds"],
"file_sha1": r["file_sha1"].decode("utf-8")
}
return jsonable
@mazash.route('/fingerprint', methods=['POST'])
def fingerprint():
"""
---
post:
description: fingerprint a file by CID IPFS
requestBody:
required: true
content:
application/json:
schema: FingerprintInputSchema
responses:
'200':
description: call successful
content:
application/json:
schema: FingerprintOuputSchema
tags:
- mazash
"""
ipfs_api = ipfsapi.connect(os.getenv("IPFS_HOST"), int(os.getenv("IPFS_PORT")))
djv = Dejavu(config)
if request.is_json :
ipfs_hash = request.json.get("cid")
song_name = request.json.get("song")
extension = request.json.get("extension")
content = ipfs_api.cat(ipfs_hash)
temp_file = tempfile.NamedTemporaryFile(suffix=extension)
temp_file.write(content)
link_filename = f"/tmp/{song_name}{extension}"
os.link(temp_file.name, link_filename)
print("{} tempfile created for {}".format(temp_file.name, song_name))
temp_file.close()
djv.fingerprint_directory("/tmp/", [extension])
os.remove(link_filename)
output = {"reponse":"success"}
else :
return 400, "waiting JSON valid"
return jsonify(output)
@mazash.route('/recognize', methods=['POST'])
def recognize():
"""
---
post:
description: recognize a song by CID IPFS
requestBody:
required: true
content:
application/json:
schema: RecognizeInputSchema
responses:
'200':
description: call successful
content:
application/json:
schema: RecognizeOuputSchema
tags:
- mazash
"""
ipfs_api = ipfsapi.connect(os.getenv("IPFS_HOST"), int(os.getenv("IPFS_PORT")))
djv = Dejavu(config)
if request.is_json :
ipfs_hash = request.json.get("cid")
extension = request.json.get("extension")
content = ipfs_api.cat(ipfs_hash)
temp_file = tempfile.NamedTemporaryFile(suffix=extension)
temp_file.write(content)
print("{} tempfile created for {}".format(temp_file.name, ipfs_hash))
song = djv.recognize(FileRecognizer, temp_file.name)
temp_file.close()
print(f"{song}")
result = {
"total_time": song["total_time"],
"fingerprint_time": song["fingerprint_time"],
"query_time": song["query_time"],
"align_time": song["align_time"],
"results": list(map(transform_resultToJsonable, song["results"]))
}
else :
return 400, "waiting JSON valid"
return jsonify(result)