Music_Player3/MusicPlayer/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift
2024-05-22 14:25:58 +08:00

174 lines
7.5 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.

//
// MPPositive_PlayerLoadViewModel.swift
// MusicPlayer
//
// Created by Mr.Zhou on 2024/5/9.
//
import UIKit
///ViewModel
class MPPositive_PlayerLoadViewModel: NSObject {
///
var songVideos:[MPPositive_SongItemModel]!
///
var randomVideos:[MPPositive_SongItemModel]!
///ViewModel
var currentVideo:MPPositive_SongViewModel!{
willSet{
if newValue != nil {
if currentVideo != nil {
//UI
NotificationCenter.notificationKey.post(notificationName: .positive_player_reload, object: currentVideo)
}else {
//UI
NotificationCenter.notificationKey.post(notificationName: .positive_player_reload)
}
}
}
}
///ViewModel
var listViewVideos:[MPPositive_SongViewModel]!
///
var group:DispatchGroup?
///palyermodel
/// - Parameters:
/// - songs:
/// - firstVideoId:
init(_ songs:[MPPositive_SongItemModel], currentVideoId: String) {
super.init()
self.songVideos = songs
//
self.randomVideos = self.songVideos.shuffled()
self.listViewVideos = []
}
///Video23VideoViewModel,
func improveData(_ targetVideoId:String, isRandom:Bool = false) {
//Video
var array:[MPPositive_SongItemModel] = []
if isRandom {
//targetVideoId
guard let targetIndex = self.randomVideos.firstIndex(where: {$0.videoId == targetVideoId}) else {
return
}
array.append(self.randomVideos[targetIndex])
//
let previousIndex = targetIndex-1
if previousIndex >= 0 {
array.append(self.randomVideos[previousIndex])
}
let nextIndex = targetIndex+1
if nextIndex < randomVideos.count {
array.append(self.randomVideos[nextIndex])
}
}else {
//targetVideoId
guard let targetIndex = self.songVideos.firstIndex(where: {$0.videoId == targetVideoId}) else {
return
}
array.append(self.songVideos[targetIndex])
//
let previousIndex = targetIndex-1
if previousIndex >= 0 {
array.append(self.songVideos[previousIndex])
}
let nextIndex = targetIndex+1
if nextIndex < songVideos.count {
array.append(self.songVideos[nextIndex])
}
}
//ViewModelvideo
let videoIDs = Set(listViewVideos.map({$0.song.videoId}))
//videoID,
array = array.filter({!videoIDs.contains($0.videoId)})
group = DispatchGroup()
//,
for item in array {
group?.enter()
//idid
improveDataforLycirsAndRelated(item) {[weak self] (result) in
item.lyricsID = result.0
item.relatedID = result.1
self?.group?.leave()
}
group?.enter()
//
improveDataforResouceAndCover(item) {[weak self] resourceUrls, coverUrls in
item.resourceUrls = resourceUrls.1
item.audioUrls = resourceUrls.0
item.coverUrls = coverUrls
//,ViewModellistViewVideos
self?.listViewVideos.append(.init(item))
self?.group?.leave()
}
}
group?.notify(queue: .main, execute: {
[weak self] in
//
self?.currentVideo = self?.listViewVideos.first(where: {$0.song.videoId == targetVideoId})
//
self?.listViewVideos = self?.listViewVideos.suffix(3)
self?.group = nil
})
}
///
func remakeImproveData(_ completion:@escaping (() -> Void)) {
//
improveDataforResouceAndCover(currentVideo.song) {[weak self] resourceUrls, coverUrls in
guard let self = self else {return}
currentVideo.song.resourceUrls = resourceUrls.1
currentVideo.song.audioUrls = resourceUrls.0
//listViewVideos
listViewVideos.forEach({ item in
if item.song.videoId == self.currentVideo.song.videoId {
item.song.resourceUrls = self.currentVideo.song.resourceUrls
item.song.audioUrls = self.currentVideo.song.audioUrls
}
})
currentVideo.resourceAsset = .init(url: .init(string: currentVideo.song.resourceUrls!.first!)!)
currentVideo.resourcePlayerItem = .init(asset: currentVideo.resourceAsset!)
//UI
NotificationCenter.notificationKey.post(notificationName: .positive_player_reload)
completion()
}
}
///songlistViewVideosindex
func removeData(_ targetVideoId:String) {
let targetIndex = songVideos.firstIndex(where: {$0.videoId == targetVideoId}) ?? 0
//listView
songVideos = songVideos.filter({$0.videoId != targetVideoId})
randomVideos = randomVideos.filter({$0.videoId != targetVideoId})
listViewVideos = listViewVideos.filter({$0.song.videoId != targetVideoId})
if currentVideo != nil {
//
if currentVideo.song.videoId == targetVideoId {
//targetIndex
if targetIndex < songVideos.count {
let videoId = songVideos[targetIndex].videoId ?? ""
improveData(videoId)
}else {
//
let videoId = songVideos.last?.videoId ?? ""
improveData(videoId)
}
}
}
}
///nextIDID
private func improveDataforLycirsAndRelated(_ song:MPPositive_SongItemModel, completion:@escaping(((String?,String?)) -> Void)) {
//next
MP_NetWorkManager.shared.requestNextLyricsAndRelated(song){ result in
completion(result)
}
}
///player
private func improveDataforResouceAndCover(_ song:MPPositive_SongItemModel, completion:@escaping((([String],[String]), [String]?) -> Void)) {
//player
MP_NetWorkManager.shared.requestPlayer(song) { resourceUrls, coverUrls in
completion(resourceUrls,coverUrls)
}
}
}