2024-MacC-M14-Medio / ShazamExtractor / Sources / ShazamExtractor / ShazamMatcher.swift
ShazamMatcher.swift
Raw
//
//  ShazamMatcher.swift
//  ShazamExtractor
//
//  Created by  on 10/5/24.
//

import SwiftUI
import ShazamKit

// MARK: - Error

enum ShazamMatchError: Error {
    case noMediaItem
}

///  Signature Shazaming 
final class ShazamMatcher: NSObject, ShazamMatchable {
    
    // MARK: - Properties
    
    private var session: SHSession?
    private var reprogress: Double
    private var audioEngine = AVAudioEngine()
    
    private var matchContinuation: CheckedContinuation<SHMatchedMediaItem?, Error>?
    
    // MARK: - Initializer
    
    init(reprogress: Double) {
        self.reprogress = reprogress
    }
    
    // MARK: - Functions
    
    func songSearch(signature: SHSignature) async throws -> SHMatchedMediaItem? {
        return try await withCheckedThrowingContinuation { continuation in
            session = SHSession()
            session?.delegate = self
            self.matchContinuation = continuation // 
            
            session?.match(signature)
        }
    }
}

// MARK: - Extensions

extension ShazamMatcher: SHSessionDelegate {
    
    func session(_ session: SHSession, didFind match: SHMatch) {
        if let matchedMediaItem = match.mediaItems.first {
            matchContinuation?.resume(returning: matchedMediaItem)
        } else {
            matchContinuation?.resume(throwing: ShazamMatchError.noMediaItem)
        }
        matchContinuation = nil
    }
    
    func session(_ session: SHSession, didNotFindMatchFor signature: SHSignature, error: Error?) {
        matchContinuation?.resume(throwing: ShazamMatchError.noMediaItem)
        matchContinuation = nil
    }
}