Music_Player3/MusicPlayer/MP/Common/Tool(工具封装)/MP_DownloadManager.swift
2024-05-31 17:05:17 +08:00

113 lines
4.7 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// MP_DownloadManager.swift
// MusicPlayer
//
// Created by 16 on 2024/5/14.
//
import Foundation
import Foundation
import Tiercel
class MP_DownloadManager: NSObject {
static let shared = MP_DownloadManager()
var session: SessionManager!
var progressHandlers: [String: (CGFloat) -> Void] = [:]
var completionHandlers: [URL: (Result<MPPositive_SongItemModel, Error>) -> Void] = [:]
var downloadTasks: [URL: URLSessionDownloadTask] = [:]
var progressStorage: [String: CGFloat] = [:] //
var songHandlers:[URL: MPPositive_SongItemModel] = [:]
private override init() {
super.init()
var configuration = SessionConfiguration()
configuration.timeoutIntervalForRequest = 60
configuration.maxConcurrentTasksLimit = 6
configuration.allowsCellularAccess = true
session = SessionManager("com.yourApp.backgroundDownload", configuration: configuration)
}
func downloadVideo(from url: URL, song:MPPositive_SongItemModel, progressHandler: @escaping (CGFloat) -> Void, completion: @escaping (Result<MPPositive_SongItemModel, Error>) -> Void) {
progressHandlers[song.videoId] = progressHandler
completionHandlers[url] = completion
songHandlers[url] = song
let downloadTask = session.download(url, headers: ["Accept-Encoding": "gzip, deflate"])
//
downloadTask?.progress(handler: { [weak self] (task) in
guard let self = self else {return}
progressHandlers[song.videoId]?(task.progress.fractionCompleted)
progressStorage[song.videoId] = task.progress.fractionCompleted
})
//
downloadTask?.success(handler: { [weak self] (task) in
guard let self = self else {return}
//,
let originalURL = task.url
//
let filePathUrl:URL = URL(fileURLWithPath: task.filePath)
print("任务下载地址:\(filePathUrl)")
let downloadsURL = DocumentsURL.appendingPathComponent("Downloads")
if !FileManager.default.fileExists(atPath: downloadsURL.path) {
do {
try FileManager.default.createDirectory(at: downloadsURL, withIntermediateDirectories: true, attributes: nil)
} catch {
completionHandlers[originalURL]?(.failure(error))
return
}
}
let fileURL = downloadsURL.appendingPathComponent("\(song.videoId ?? "").mp4")
do {
try FileManager.default.moveItem(at: filePathUrl, to: fileURL)
//VideoID
completionHandlers[originalURL]?(.success(songHandlers[originalURL]!))
progressStorage[song.videoId] = nil //
} catch {
completionHandlers[originalURL]?(.failure(error))
}
//
if task.status == .succeeded {
session.remove(task, completely: true) {_ in
print("\(song.title ?? "")下载任务完成,移除任务")
}
}
}).failure(handler: { [weak self] (task) in
guard let self = self else {return}
//
let originalURL = task.url
if let error = task.error {
completionHandlers[originalURL]?(.failure(error))
}
if task.status == .failed {
session.cancel(task) { _ in
print("\(song.title ?? "")下载任务失败,取消任务")
}
}
})
}
func getProgress(for videoId: String) -> CGFloat? {
return progressStorage[videoId]
}
func cancelAllTasksIfNeeded() {
//
for key in progressStorage.keys {
session.cancel(key)
}
}
//
func deleteFileDocuments(_ videoId:String, completion:@escaping((String) -> Void)) {
let downloadsURL = DocumentsURL.appendingPathComponent("Downloads")
let fileURL = downloadsURL.appendingPathComponent("\(videoId).mp4")
if FileManager.default.fileExists(atPath: fileURL.path) {
do{
try FileManager.default.removeItem(at: fileURL)
//
completion(videoId)
print("成功删除了\(videoId)文件")
}catch{
print("删除文件时发生错误:\(error)")
}
}else {
print("文件不存在")
}
}
}