"""Lambda acrcloud_recognizer function module.""" import json from acrcloud.recognizer import ACRCloudRecognizer from acrcloud.recognizer import ACRCloudRecognizeType import boto3 import pymysql from pydub import AudioSegment import config from lambdacommon import common_query from lambdacommon import mysql from s3_file import S3File import query import util def get_or_create_song_id(cursor: pymysql.cursors.Cursor, key: str) -> int: song_name, extension = util.get_audio_name_from_path(key) s3_path = key.split(song_name)[0] cursor.execute(common_query.SELECT_SONG_ID_BY_NAME, (song_name,)) result = cursor.fetchone() if result: song_id = result['song_id'] else: cursor.execute(common_query.INSERT_SONG, (song_name, extension, s3_path,)) song_id = cursor.lastrowid return song_id def handler(event, context): """Lambda entry point.""" trigger = event['Records'][0]['s3'] try: with mysql.mysql_connection(**config.DB_CONFIG) as conn: with conn.cursor() as cursor: bucket = trigger['bucket']['name'] key = trigger['object']['key'] song_id = get_or_create_song_id(cursor, key) s3_resource = boto3.resource('s3', region_name='us-east-1') s3_object = s3_resource.Object(bucket_name=bucket, key=key) s3_file = S3File(s3_object) # read the first 50mb audiofile, buf = AudioSegment.from_mp3(s3_file) acrcloud_config = { 'host': 'identify-us-west-2.acrcloud.com', 'access_key': config.ACRCLOUD_ACCESS_KEY, 'access_secret': config.ACRCLOUD_SECRET, 'recognize_type': ACRCloudRecognizeType.ACR_OPT_REC_AUDIO, 'debug': False, 'timeout': 10 # seconds } re = ACRCloudRecognizer(acrcloud_config) response = json.loads(re.recognize_by_filebuffer(buf, round(audiofile.duration_seconds / 2 - 10), 20)) print(response) if response['status']['msg'] == 'Success': matches = response['metadata']['music'] for match in matches: parsed = { 'song_id': song_id, 'acrid': match['acrid'], 'label': match.get('label', None), 'isrc': match['external_ids'].get('isrc', None), 'upc': match['external_ids'].get('upc', None), 'title': match['title'], 'album': match['album']['name'], 'release_date': match.get('release_date'), 'artist': ','.join([artist['name'] for artist in match['artists']]), 'distributor': ','.join(claim['distributor']['name'] for claim in match['rights_claim']) if 'rights_claim' in match else None, 'response': json.dumps(match) } cursor.execute(query.INSERT_ACRCCLOUD_RIGHTS_MATCH, parsed) cursor.execute(query.UPDATE_SONG_ACRCLOUD_RIGHTS_RECOGNIZED, (1, song_id,)) else: print(response) if response['status']['msg'] == 'No result': cursor.execute(query.UPDATE_SONG_ACRCLOUD_RIGHTS_RECOGNIZED, (0, song_id,)) return True except Exception as e: config.logger.exception(e) raise e if __name__ == '__main__': event = { 'Records': [{ 'eventVersion': '2.1', 'eventSource': 'aws:s3', 'awsRegion': 'us-east-1', 'eventTime': '2020-12-04T22:45:44.917Z', 'eventName': 'ObjectCreated:Put', 'userIdentity': { 'principalId': 'AWS:AIDAJFXGE4FOWXNQI2WKI' }, 'requestParameters': { 'sourceIPAddress': '98.14.233.7' }, 'responseElements': { 'x-amz-request-id': 'B331D57F083665B1', 'x-amz-id-2': 'xxx' }, 's3': { 's3SchemaVersion': '1.0', 'configurationId': 'tf-s3-lambda-20201204222352945200000001', 'bucket': { 'name': 'prod-orcd-raw-assets', 'ownerIdentity': { 'principalId': 'A2C1PL85TBWITW' }, 'arn': 'arn:aws:s3:::dev-orcd-raw-assets' }, 'object': { 'key': 'fingerprinting/What+Goes+Around+Comes+Around+%28Part+1%29.wav', 'size': 2813340, 'eTag': '7720c4f2b1b8a7de58c607eb2e0517fb', 'versionId': 'xl955KffyDywbZzs7gOcX5nfrDOLH8ts', 'sequencer': '005FCABC22159BDC90' } } }] } handler(event, None)