Music_Player3/relax.offline.mp3.music/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift
2024-08-15 15:50:48 +08:00

212 lines
8.6 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!{
didSet{
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
if currentVideo != nil {
print("当前播放音乐是:\(currentVideo?.song?.title ?? "")")
//
startObservingCurrentVideoItem()
//UI
NotificationCenter.notificationKey.post(notificationName: .positive_player_reload)
}
}
}
}
//
var currentVideoId:String?
//
private var itemObservation: NSKeyValueObservation?
// private var loadQueue:DispatchQueue!
///
// private var group:DispatchGroup!
///ViewModel
var listViewVideos:[MPPositive_SongViewModel]!
///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
}
//
private func startObservingCurrentVideoItem() {
itemObservation?.invalidate() //
//currentVideo
if currentVideo?.resourcePlayerItem != nil {
//
postNoticeAction()
}else {
//
itemObservation = currentVideo?.observe(\.resourcePlayerItem, options: [.new], changeHandler: { [weak self] video, change in
guard let self = self else {return}
if change.newValue != nil {
// newItem
postNoticeAction()
}else {
//nil
print("无效更新")
}
})
}
}
//
private func postNoticeAction() {
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
if currentVideo != nil {
MP_AnalyticsManager.shared.player_b_pvAction(currentVideo.song.videoId, videoname: currentVideo.title ?? "", artistname: currentVideo.song.shortBylineText ?? "")
//UI
NotificationCenter.notificationKey.post(notificationName: .positive_player_reload, object: currentVideo)
}
}
}
///Video14VideoViewModel,
func improveData(_ targetVideoId:String, isRandom:Bool = false) {
//ID
self.currentVideoId = targetVideoId
//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
let lastIndex = targetIndex+2
if nextIndex < randomVideos.count {
array.append(self.randomVideos[nextIndex])
}
if lastIndex < randomVideos.count {
array.append(self.randomVideos[lastIndex])
}
}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
let lastIndex = targetIndex+2
if nextIndex < songVideos.count {
array.append(self.songVideos[nextIndex])
}
if lastIndex < songVideos.count {
array.append(self.songVideos[lastIndex])
}
}
//ViewModelvideo
let videoIDs = Set(listViewVideos.map({$0.song.videoId}))
//videoID,
array = array.filter({!videoIDs.contains($0.videoId)})
//MPPositive_SongViewModel
let viewModels = array.map({(MPPositive_SongViewModel($0))})
//ViewModel
self.listViewVideos.append(contentsOf: viewModels)
//
self.currentVideo = self.listViewVideos.first(where: {$0.song.videoId == targetVideoId})
//7
self.listViewVideos = self.listViewVideos.suffix(7)
}
///
func remakeImproveData(_ completion:@escaping (() -> Void)) {
currentVideo.configure()
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)
}
}
}
}
///
func playNextAction(_ next:MPPositive_SongItemModel) {
//
if let index = songVideos.firstIndex(where: {$0.videoId == currentVideo?.song.videoId}) {
//
let nextIndex:Int = index + 1
if songVideos.indices.contains(nextIndex) {
//,
songVideos.insert(next, at: nextIndex)
}else {
//
songVideos.append(next)
}
}
//
if let index = randomVideos.firstIndex(where: {$0.videoId == currentVideo?.song.videoId}) {
//
let nextIndex:Int = index + 1
if randomVideos.indices.contains(nextIndex) {
//,
randomVideos.insert(next, at: nextIndex)
}else {
//
randomVideos.append(next)
}
}
MP_HUD.success("Successfully added to next song".localizableString(), delay: 1.0) {
print("用户将\(next.title ?? "")添加到下一首播放")
}
}
//
deinit {
itemObservation?.invalidate()
//
songVideos = nil
currentVideo = nil
randomVideos = nil
listViewVideos = nil
}
}