From c1862d736587c9a5c10a368dabaeb72be2df4bcb Mon Sep 17 00:00:00 2001 From: 无故事王国 <841720330@qq.com> Date: 星期二, 18 六月 2024 16:26:23 +0800 Subject: [PATCH] fix --- DolphinEnglishLearnStudent/Config/VoicePlayer.swift | 124 ++++++++++++++++++++++++++++++++++------- 1 files changed, 102 insertions(+), 22 deletions(-) diff --git a/DolphinEnglishLearnStudent/Config/VoicePlayer.swift b/DolphinEnglishLearnStudent/Config/VoicePlayer.swift index dfea953..c64fbab 100644 --- a/DolphinEnglishLearnStudent/Config/VoicePlayer.swift +++ b/DolphinEnglishLearnStudent/Config/VoicePlayer.swift @@ -20,6 +20,7 @@ private let voiceCacheDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("voices") private static var _sharedInstance: VoicePlayer? private var player:AVAudioPlayer? + private var tempPlayer:AVAudioPlayer? var delegate:VoicePlayerDelegate? @@ -52,27 +53,89 @@ guard let u = url else {return} if player?.isPlaying ?? false{ player?.stop() - self.playComplete?() //先通知完成播放 } + //文件存在:直接播放缓存路径的语音 + let fileURL = self.voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent).droppedScheme() + if FileManager.default.fileExists(atPath: fileURL!.absoluteString){ + self.player = try? AVAudioPlayer(contentsOf: fileURL!) + self.player?.delegate = self + self.player?.play() + self.delegate?.playing() + }else{ + //文件不存在:执行下载 + let downloadTask = URLSession.shared.downloadTask(with: URL(string: u)!) { tempLocalUrl, response, error in + if let tempLocalUrl = tempLocalUrl, error == nil { + do { + let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent) + try FileManager.default.moveItem(at: tempLocalUrl, to: finalCacheUrl) + self.player = try? AVAudioPlayer(contentsOf: finalCacheUrl) + self.player?.delegate = self + self.player?.play() + self.delegate?.playing() + } catch { + print("视频缓存失败:catch") + } + } else { + print("视频缓存失败:\(error?.localizedDescription ?? "")") + } + } + downloadTask.resume() + } + } - //文件存在:直接播放缓存路径的语音 - let fileURL = voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent).droppedScheme() - if FileManager.default.fileExists(atPath: fileURL!.absoluteString){ - player = try? AVAudioPlayer(contentsOf: fileURL!) - player?.delegate = self - player?.play() - delegate?.playing() - }else{ + func playerEnd(){ + player?.stop() + playComplete?() + } + + //打断播放未完全播放 + func playerInterrupt(){ + player?.stop() + } + + func playEnd(course:@escaping ()->Void){ + self.playComplete = course + } + + func playSuccessVoice(){ + let list = try? FileManager.default.contentsOfDirectory(atPath: voiceCacheDirectory.droppedScheme()!.absoluteString) + var promoteName:String? + for v in list ?? []{ + if v.contains("SuccessPromote"){promoteName = v;break} + } + guard let url = promoteName else { return } + let promote = self.voiceCacheDirectory.appendingPathComponent(url) + tempPlayer = try? AVAudioPlayer(contentsOf: promote) + tempPlayer?.play() + } + + func playFailVoice(){ + let list = try? FileManager.default.contentsOfDirectory(atPath: voiceCacheDirectory.droppedScheme()!.absoluteString) + var promoteName:String? + for v in list ?? []{ + if v.contains("FailPromote"){promoteName = v;break} + } + guard let url = promoteName else { return } + let promote = self.voiceCacheDirectory.appendingPathComponent(url) + tempPlayer = try? AVAudioPlayer(contentsOf: promote) + tempPlayer?.play() + } + + func donwloadPromoteVoice(successVoice:String,failVoice:String,updateTime:String){ + print("-->\(VoicePlayer.share().voiceCacheDirectory)") + let group = DispatchGroup() + let promoteQueue = DispatchQueue(label: "promoteVoice") + promoteQueue.async(group: group){ //文件不存在:执行下载 - let downloadTask = URLSession.shared.downloadTask(with: URL(string: u)!) { tempLocalUrl, response, error in + let downloadTask = URLSession.shared.downloadTask(with: URL(string: successVoice)!) { tempLocalUrl, response, error in if let tempLocalUrl = tempLocalUrl, error == nil { do { - let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent) + let fileType = URL(fileURLWithPath: successVoice).lastPathComponent.components(separatedBy: ".").last ?? "mp3" + let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent("SuccessPromote.\(fileType)") + if FileManager.default.fileExists(atPath: finalCacheUrl.droppedScheme()!.absoluteString){ + try? FileManager.default.removeItem(at: finalCacheUrl) + } try FileManager.default.moveItem(at: tempLocalUrl, to: finalCacheUrl) - self.player = try? AVAudioPlayer(contentsOf: finalCacheUrl) - self.player?.delegate = self - self.player?.play() - self.delegate?.playing() } catch { print("视频缓存失败:catch") } @@ -82,15 +145,32 @@ } downloadTask.resume() } - } - func playerEnd(){ - player?.stop() - playComplete?() - } + promoteQueue.async(group: group){ + //文件不存在:执行下载 + let downloadTask = URLSession.shared.downloadTask(with: URL(string: failVoice)!) { tempLocalUrl, response, error in + if let tempLocalUrl = tempLocalUrl, error == nil { + do { + let fileType = URL(fileURLWithPath: successVoice).lastPathComponent.components(separatedBy: ".").last ?? "mp3" + let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent("FailPromote.\(fileType)") + if FileManager.default.fileExists(atPath: finalCacheUrl.droppedScheme()!.absoluteString){ + try? FileManager.default.removeItem(at: finalCacheUrl) + } + try FileManager.default.moveItem(at: tempLocalUrl, to: finalCacheUrl) + } catch { + print("视频缓存失败:catch") + } + } else { + print("视频缓存失败:\(error?.localizedDescription ?? "")") + } + } + downloadTask.resume() + } - func playEnd(course:@escaping ()->Void){ - self.playComplete = course + group.notify(queue: .main){ + UserDefaults.standard.setValue(updateTime, forKey: "promptVoiceDate") + UserDefaults.standard.synchronize() + } } } -- Gitblit v1.7.1