fix
无故事王国
2024-06-18 c1862d736587c9a5c10a368dabaeb72be2df4bcb
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,16 +53,14 @@
                        guard let u = url else {return}
                        if player?.isPlaying ?? false{
                                    player?.stop()
                                    self.playComplete?() //先通知完成播放
                        }
                        //文件存在:直接播放缓存路径的语音
                        let fileURL = voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent).droppedScheme()
                                    let fileURL = self.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()
                                                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
@@ -89,9 +88,90 @@
                        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: successVoice)!) { 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("SuccessPromote.\(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()
                        }
                        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()
                        }
                        group.notify(queue: .main){
                                    UserDefaults.standard.setValue(updateTime, forKey: "promptVoiceDate")
                                    UserDefaults.standard.synchronize()
                        }
            }
}
extension VoicePlayer:AVAudioPlayerDelegate{