//
// 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
}
}