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