Music_Player3/MusicPlayer/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift
2024-05-11 09:48:37 +08:00

138 lines
5.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]!
///ViewModel
var currentVideo:MPPositive_SongViewModel!{
didSet{
if currentVideo != nil {
//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.listViewVideos = []
self.currentVideoId = currentVideoId
}
///Video23VideoViewModel,
func improveData(_ targetVideoId:String) {
guard let targetVideo = self.songVideos.first(where: {$0.videoId == targetVideoId}) else {
return
}
//Video
var array:[MPPositive_SongItemModel] = []
//
if let previous = self.songVideos.first(where: {$0.index == (targetVideo.index-1)}) {
array.append(previous)
}
array.append(targetVideo)
//
if let next = self.songVideos.first(where: {$0.index == (targetVideo.index+1)}) {
array.append(next)
}
//ViewModelvideo
let videoIDs = Set(listViewVideos.map({$0.song.videoId}))
//videoID,
array = array.filter({!videoIDs.contains($0.videoId)})
group = DispatchGroup()
//,
array.forEach { item in
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})
})
}
///songlistViewVideosindex
func removeData(_ targetVideoId:String) {
let targetIndex = songVideos.firstIndex(where: {$0.videoId == targetVideoId})
//listView
songVideos = songVideos.filter({$0.videoId != targetVideoId})
listViewVideos = listViewVideos.filter({$0.song.videoId != targetVideoId})
///
for (index, item) in songVideos.enumerated() {
item.index = index
}
listViewVideos.forEach { listModel in
songVideos.forEach { song in
if listModel.song.videoId == song.videoId {
listModel.index = song.index
listModel.song.index = song.index
}
if currentVideo.song.videoId == song.videoId {
currentVideo.index = song.index
currentVideo.song.index = song.index
}
}
}
//
if currentVideo.song.videoId == targetVideoId {
if let videoId = songVideos.first(where: {$0.index == 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)
}
}
}