From c9075de3c436e41eff69a564a09e51ef67572955 Mon Sep 17 00:00:00 2001 From: joseelinchevalay Date: Thu, 29 Oct 2020 16:37:13 +0100 Subject: [PATCH] initial commit --- .gitignore | 140 +++++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 39 +++++++++++++ README.md | 79 ++++++++++++++++++++++++++ app.ini | 9 +++ docker-compose.yaml | 50 +++++++++++++++++ python/Dockerfile | 12 ++++ requirements.txt | 18 ++++++ run_app_dev.sh | 3 + run_app_prod.sh | 3 + src/api_spec.py | 67 +++++++++++++++++++++++ src/app.py | 38 +++++++++++++ src/endpoints/mazash.py | 116 +++++++++++++++++++++++++++++++++++++++ src/endpoints/swagger.py | 15 +++++ swagger_ui.png | Bin 0 -> 90082 bytes test/conftest.py | 16 ++++++ test/test_endpoints.py | 14 +++++ wsgi.py | 13 +++++ 17 files changed, 632 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 app.ini create mode 100644 docker-compose.yaml create mode 100644 python/Dockerfile create mode 100644 requirements.txt create mode 100755 run_app_dev.sh create mode 100755 run_app_prod.sh create mode 100644 src/api_spec.py create mode 100644 src/app.py create mode 100644 src/endpoints/mazash.py create mode 100644 src/endpoints/swagger.py create mode 100644 swagger_ui.png create mode 100644 test/conftest.py create mode 100644 test/test_endpoints.py create mode 100644 wsgi.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bf11e46 --- /dev/null +++ b/.gitignore @@ -0,0 +1,140 @@ +# Created by https://www.toptal.com/developers/gitignore/api/python +# Edit at https://www.toptal.com/developers/gitignore?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +pytestdebug.log + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ +doc/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# End of https://www.toptal.com/developers/gitignore/api/python \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..384b148 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +FROM debian:buster +LABEL version 1.0+beta.2 + +ENV JENKINS_HOME /var/jenkins +ENV DEBIAN_FRONTEND noninteractive +ENV REQUESTS_CA_BUNDLE /etc/ssl/certs/ca-certificates.crt + +#download through the french mirror +RUN sed -i 's/deb\./ftp.fr./' /etc/apt/sources.list + +RUN echo "moonlight:/share/dev-common/Applications/x86-64/linux /mnt/applis nfs defaults 0 0" >> /etc/fstab && \ + echo "moonlight:/share/home /home nfs defaults 0 0" >> /etc/fstab && \ + echo "sharing:/mnt/samba/share /mnt/share nfs defaults 0 0" >> /etc/fstab + +# Global config +# FIXME: nfs mounting hangs forever, so no path, etc... +RUN echo "nslcd nslcd/ldap-base string dc=openldap,dc=ullink,dc=lan" | debconf-set-selections && \ + echo "nslcd nslcd/ldap-uris string ldap://ldap" | debconf-set-selections && \ + echo "libnss-ldapd:amd64 libnss-ldapd/nsswitch multiselect group, passwd, shadow" | debconf-set-selections + +RUN apt-get upgrade -y && apt-get update +RUN apt-get -y install \ + git \ + libnss-ldapd \ + libpam-ldapd \ + locales \ + maven \ + nfs-common \ + ntp \ + openjdk-8-jdk \ + openssh-server \ + python2.7 \ + sudo \ + supervisor \ + unzip \ + vim \ + wget \ + ca-certificates \ + nginx \ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..cb314d7 --- /dev/null +++ b/README.md @@ -0,0 +1,79 @@ +# Mazash +![Swagger UI API documentation](swagger_ui.png) +Minimal application IPFS & Dejavu + +The following features are included in the application: + +* Recognize song by CID ipfs and extension +* Fingerpint CID IPFS, extension, song name +* API documentation using the OpenAPI 3 specification and Swagger UI + + +## Setup + +To set up the application, you need Python 3. After cloning the repository change to the project directory and install the dependencies via: + +``` +python3 -m pip install requirements.txt +``` + +## Development + +To start the app in development mode, execute + +``` +./run_app_dev.sh +``` + +The application will then be available at `localhost:5000`. You can test the functionality manually using `curl`, e.g. via + +``` +curl localhost:5000/api/v1/path_for_blueprint_x/test +``` + +or through the automated tests, by running + +``` +pytest +``` + +The commands should output +``` +{ + "msg": "I'm the test endpoint from blueprint_x." +} +``` + +and + +``` +test/test_endpoints.py .... + +============= 4 passed in 0.14s ============== +``` + +respectively. + +To view the API documentation through the Swagger user interface, navivate your browser to `localhost:5000/api/docs`. + +## Production + +To run the app in production, execute +``` +./run_app_prod.sh +``` + +Now the application is served on `localhost:8600`. To run the automated tests for the production host, use + +``` +pytest --host http://localhost:8600 +``` + +## mp3 for test + +https://github.com/worldveil/dejavu/blob/master/mp3/Brad-Sucks--Total-Breakdown.mp3 -> QmU3XRYZiebdDMcUwKrvecxyDgtgVY6zaNYrzQBeCkFb2r + +curl -X POST "http://localhost:8600/api/v1/mazash/recognize" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"cid\":\"QmU3XRYZiebdDMcUwKrvecxyDgtgVY6zaNYrzQBeCkFb2r\",\"extension\":\".mp3\",\"song\":\"Brad-Sucks--Total-Breakdown\"}" + + +curl -X POST "http://localhost:8600/api/v1/mazash/recognize" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"cid\":\"QmU3XRYZiebdDMcUwKrvecxyDgtgVY6zaNYrzQBeCkFb2r\",\"extension\":\".mp3\"}" \ No newline at end of file diff --git a/app.ini b/app.ini new file mode 100644 index 0000000..73580ed --- /dev/null +++ b/app.ini @@ -0,0 +1,9 @@ +[uwsgi] +module = wsgi:app +master = true +processes = 5 +http-socket = 0.0.0.0:8600 +socket = /tmp/app_socket.sock +chmod-socket = 660 +vacuum = true +die-on-term = true diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..cb2054f --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,50 @@ +version: '3' +services: + ipfs: + image: ipfs/go-ipfs:release + ports: + - 5001:5001 + - 4001:4001 + - 8080:8080 + volumes: + - data_ipfs:/data/ipfs + networks: + - db_networks + db: + image: postgres:10.7-alpine + environment: + - POSTGRES_DB=dejavu + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=password + - PGDATA=/var/lib/postgresql/data/pgdata + volumes: + - data_postgresql:/var/lib/postgresql/data/pgdata + networks: + - db_networks + python: + build: + context: ./python + entrypoint: bash -c "pip install -r requirements.txt && pip install https://github.com/worldveil/dejavu/zipball/master && /code/run_app_prod.sh" + environment: + - POSTGRES_HOST=mazash_db_1.mazash_db_networks + - POSTGRES_DB=dejavu + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=password + - IPFS_HOST=ipfs + - IPFS_PORT=5001 + volumes: + - .:/code + working_dir: /code + ports: + - 5000:5000 + - 8600:8600 + depends_on: + - db + - ipfs + networks: + - db_networks +networks: + db_networks: +volumes: + data_ipfs: + data_postgresql: diff --git a/python/Dockerfile b/python/Dockerfile new file mode 100644 index 0000000..4155a6f --- /dev/null +++ b/python/Dockerfile @@ -0,0 +1,12 @@ +FROM python:3.7 +RUN apt-get update -y && apt-get upgrade -y +RUN apt-get install \ + gcc nano \ + ffmpeg libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0 \ + postgresql postgresql-contrib -y && \ + useradd -m app +RUN pip install --upgrade pip +RUN pip install numpy scipy matplotlib pydub pyaudio psycopg2 uwsgi +RUN mkdir /code && chown app /code +USER app +WORKDIR /code \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e6c0c48 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,18 @@ +flask + +# testing +pytest +requests + +# production +uwsgi + +# swagger api docs +apispec +apispec_webframeworks +marshmallow +flask_swagger_ui +openapi_spec_validator + +#ipfs +ipfsapi diff --git a/run_app_dev.sh b/run_app_dev.sh new file mode 100755 index 0000000..a5d0b57 --- /dev/null +++ b/run_app_dev.sh @@ -0,0 +1,3 @@ +#!/bin/bash +FLASK_ENV=development flask run + diff --git a/run_app_prod.sh b/run_app_prod.sh new file mode 100755 index 0000000..2da6824 --- /dev/null +++ b/run_app_prod.sh @@ -0,0 +1,3 @@ +#!/bin/bash +uwsgi --ini app.ini --need-app + diff --git a/src/api_spec.py b/src/api_spec.py new file mode 100644 index 0000000..61a0d10 --- /dev/null +++ b/src/api_spec.py @@ -0,0 +1,67 @@ +"""OpenAPI v3 Specification""" + +# apispec via OpenAPI +from apispec import APISpec +from apispec.ext.marshmallow import MarshmallowPlugin +from apispec_webframeworks.flask import FlaskPlugin +from marshmallow import Schema, fields + +# Create an APISpec +spec = APISpec( + title="My App", + version="1.0.0", + openapi_version="3.0.2", + plugins=[FlaskPlugin(), MarshmallowPlugin()], +) + +# Define schemas +class FingerprintOuputSchema(Schema): + response = fields.String(description="A message.", required=True) + +class FingerprintInputSchema(Schema): + cid = fields.String(description="IPFS cid", required=True) + song = fields.String(description="song name", required=True) + extension = fields.String(description="extension of file", required=True) + +class RecognizeResultSchema(Schema): + file_sha1 = fields.String(description="hash of file", required=True) + fingerprinted_confidence = fields.Int(description="", required=True) + fingerprinted_hashes_in_db = fields.Int(description="fingerprinted hashes into database", required=True) + hashes_matched_in_input = fields.Int(description="hashes matched into database", required=True) + input_confidence = fields.Int(description="input confidence", required=True) + input_total_hashes = fields.Int(description="input total hashes", required=True) + offset = fields.Int(description="offset", required=True) + offset_seconds = fields.Int(description="seconds offset", required=True) + song_id = fields.Int(description="song id", required=True) + song_name = fields.String(description="song name", required=True) + + +class RecognizeOuputSchema(Schema): + align_time = fields.Float(description="", required=True) + fingerprint_time = fields.Float(description="Fingerprinted time", required=True) + query_time = fields.Float(description="query time", required=True) + results = fields.List(fields.Nested(RecognizeResultSchema)) + total_time = fields.Float(description="total time of execution", required=True) + +class RecognizeInputSchema(Schema): + cid = fields.String(description="IPFS cid", required=True) + extension = fields.String(description="extension of file", required=True) + +# register schemas with spec +spec.components.schema("FingerprintOutputResponse", schema=FingerprintOuputSchema) +spec.components.schema("FingerprintInputResponse", schema=FingerprintInputSchema) +spec.components.schema("RecognizeOutputResponse", schema=RecognizeOuputSchema) +spec.components.schema("RecognizeInputResponse", schema=RecognizeInputSchema) +#spec.components.schema("RecognizeResult", schema=RecognizeResultSchema) + + +# add swagger tags that are used for endpoint annotation +tags = [ + {'name': 'mazash', + 'description': 'Mazash API' + } + ] + +for tag in tags: + print(f"Adding tag: {tag['name']}") + spec.tag(tag) diff --git a/src/app.py b/src/app.py new file mode 100644 index 0000000..2ba2815 --- /dev/null +++ b/src/app.py @@ -0,0 +1,38 @@ +"""Flask Application""" + +# load libaries +from flask import Flask, jsonify +import sys + +# load modules +from src.endpoints.mazash import mazash +from src.endpoints.swagger import swagger_ui_blueprint, SWAGGER_URL + +# init Flask app +app = Flask(__name__) + +# register blueprints. ensure that all paths are versioned! +app.register_blueprint(mazash, url_prefix="/api/v1/mazash") + +from src.api_spec import spec +# register all swagger documented functions here + +with app.test_request_context(): + for fn_name in app.view_functions: + if fn_name == 'static': + continue + print(f"Loading swagger docs for function: {fn_name}") + view_fn = app.view_functions[fn_name] + spec.path(view=view_fn) + +@app.route("/api/swagger.json") +def create_swagger_spec(): + """ + Swagger API definition. + """ + return jsonify(spec.to_dict()) + +app.register_blueprint(swagger_ui_blueprint, url_prefix=SWAGGER_URL) + +if __name__ == "__main__": + app.run(host='0.0.0.0', debug=True) diff --git a/src/endpoints/mazash.py b/src/endpoints/mazash.py new file mode 100644 index 0000000..68235ca --- /dev/null +++ b/src/endpoints/mazash.py @@ -0,0 +1,116 @@ +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) \ No newline at end of file diff --git a/src/endpoints/swagger.py b/src/endpoints/swagger.py new file mode 100644 index 0000000..8d8976a --- /dev/null +++ b/src/endpoints/swagger.py @@ -0,0 +1,15 @@ +"""Definition of the Swagger UI Blueprint.""" + +from flask_swagger_ui import get_swaggerui_blueprint + +SWAGGER_URL = '/api/docs' +API_URL = "/api/swagger.json" + +# Call factory function to create our blueprint +swagger_ui_blueprint = get_swaggerui_blueprint( + SWAGGER_URL, + API_URL, + config={ + 'app_name': "My App" + } +) diff --git a/swagger_ui.png b/swagger_ui.png new file mode 100644 index 0000000000000000000000000000000000000000..f351fdf372b1aa713757eb0598fc90b9cb28d499 GIT binary patch literal 90082 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 literal 0 HcmV?d00001 diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 0000000..f2e3d36 --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,16 @@ +import pytest +import os + +def pytest_addoption(parser): + # ability to test API on different hosts + parser.addoption("--host", action="store", default="http://localhost:5000") + +@pytest.fixture(scope="session") +def host(request): + return request.config.getoption("--host") + +@pytest.fixture(scope="session") +def api_v1_host(host): + return os.path.join(host, "api", "v1") + + diff --git a/test/test_endpoints.py b/test/test_endpoints.py new file mode 100644 index 0000000..979a065 --- /dev/null +++ b/test/test_endpoints.py @@ -0,0 +1,14 @@ +import os +import requests +from openapi_spec_validator import validate_spec_url + +def test_mazash_recognize_test(api_v1_host): + endpoint = os.path.join(api_v1_host, 'mazash', 'count') + response = requests.get(endpoint) + assert response.status_code == 200 + + +def test_swagger_specification(host): + endpoint = os.path.join(host, 'api', 'swagger.json') + validate_spec_url(endpoint) + # use https://editor.swagger.io/ to fix issues diff --git a/wsgi.py b/wsgi.py new file mode 100644 index 0000000..83eb225 --- /dev/null +++ b/wsgi.py @@ -0,0 +1,13 @@ +"""Web Server Gateway Interface""" + +################## +# FOR PRODUCTION +#################### +from src.app import app + +if __name__ == "__main__": + #################### + # FOR DEVELOPMENT + #################### + app.run(host='0.0.0.0', debug=True) +