Music_Player3/MusicPlayer/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift

136 lines
5.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.

//
// 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)
}
}
}
}
///ID
var currentVideoId:String!
///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 = []
self.currentVideoId = currentVideoId
}
///Video23VideoViewModel,
func improveData(_ targetVideoId:String) {
//targetVideoId
guard let targetIndex = self.songVideos.firstIndex(where: {$0.videoId == targetVideoId}) else {
return
}
//Video
var array:[MPPositive_SongItemModel] = []
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()
var numbers = 0
//,
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
item.coverUrls = coverUrls
//,ViewModellistViewVideos
self?.listViewVideos.append(.init(item))
self?.group?.leave()
}
}
group?.notify(queue: .main, execute: {
//
self.listViewVideos = self.listViewVideos.sorted(by: {$0.index < $1.index})
//
self.currentVideo = self.listViewVideos.first(where: {$0.song.videoId == targetVideoId})
self.group = nil
})
}
///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]?) -> Void)) {
//player
MP_NetWorkManager.shared.requestPlayer(song) { resourceUrls, coverUrls in
completion(resourceUrls,coverUrls)
}
}
}