CNLiveShortVideoViewController.swift 14.7 KB
//
//  CNLiveVideoViewController.swift
//  metaCode
//
//  Created by open on 2024/1/5.
//

import Foundation
import ZFPlayer
import APButton
import EmptyDataSet_Swift
import MJRefresh

class CNLiveShortVideoViewController : CNLiveBaseViewController, UITableViewDelegate, UITableViewDataSource, CNLiveShortVideoListTableViewCellDelegate, EmptyDataSetSource, EmptyDataSetDelegate {
    
    var player: ZFPlayerController!
    let kVideoBodyListViewCellIdentifier = "kVideoBodyListViewCellIdentifier"
    lazy var tableView : UITableView = {
        let tableView = UITableView(frame: .zero, style: .plain)
        tableView.dataSource = self
        tableView.delegate = self
        tableView.emptyDataSetSource = self
        tableView.emptyDataSetDelegate = self
        tableView.isPagingEnabled = true
        tableView.estimatedRowHeight = 0
        tableView.estimatedSectionFooterHeight = 0
        tableView.estimatedSectionHeaderHeight = 0
        tableView.frame = view.bounds
        tableView.rowHeight = tableView.frame.size.height
        tableView.backgroundColor = .black
        tableView.tableFooterView = UIView.init()
        tableView.separatorStyle = .none
        tableView.scrollsToTop = false
        if #available(iOS 11.0, *) {
            tableView.contentInsetAdjustmentBehavior = .never;
        } else {
            self.automaticallyAdjustsScrollViewInsets = false;
        }
        tableView.showsVerticalScrollIndicator = false
        tableView.showsHorizontalScrollIndicator = false
        tableView.register(CNLiveShortVideoListTableViewCell.self, forCellReuseIdentifier: kVideoBodyListViewCellIdentifier)
        return tableView
    }()
    
    lazy var backBtn: UIButton = {
        let button = UIButton(type: .custom)
        button.setImage(UIImage(named: "short_video_close"), for: .normal)
        button.addTarget(self, action: #selector(backClick(_:)), for: .touchUpInside)
        return button
    }()
    
    lazy var controlView: CNLiveShortVideoControlView = {
        let controlView = CNLiveShortVideoControlView.init(frame: CGRectZero)
        return controlView
    }()
    
    lazy var headerRefreshView: UIRefreshControl = {
        let headerRefreshView = UIRefreshControl()
        headerRefreshView.tintColor = .white
        headerRefreshView.addTarget(self, action: #selector(headerRefresh), for: .valueChanged)
        return headerRefreshView
    }()
    
    lazy var dataArray: NSMutableArray = {
        let dataArray = NSMutableArray.init()
        return dataArray
    }()
    lazy var dataURLArray: NSMutableArray = {
        let dataArray = NSMutableArray.init()
        return dataArray
    }()
    
    var aid: String! = ""
    var pageNum: NSInteger! = 1
    var currentIndex: NSInteger! = 0
    var footerRefreshView: CNLiveFooterRefresh!
    var playerManager = ZFIJKPlayerManager.init()
//    var playerManager = ZFAVPlayerManager.init()
    
    /// 初始化播放器
    /// - Parameters:
    ///   - aid: 专辑 id
    ///   - page: 当前页数
    ///   - currentIndex: 当前点击的索引
    ///   - dataArray: 当前请求的数据
    init(aid: String,page: NSInteger, currentIndex: NSInteger, dataArray: [CNLiveAlbumListModel]) {
        self.aid = aid
        self.pageNum = page
        self.currentIndex = currentIndex
        super.init(nibName:nil, bundle:nil)
        self.dataArray.addObjects(from: dataArray)
        dataArray.forEach {[weak self] listModel in
            guard let self = self else { return }
            self.dataURLArray.add(listModel.videoUrl)
        }
    }
    
    /// 初始化播放器
    /// - Parameter aid: 专辑 id
    init(aid: String) {
        self.aid = aid
        super.init(nibName:nil, bundle:nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .black
        view.addSubview(tableView)
        view.addSubview(backBtn)
        
        requestData {}
        addRefreshView()

        player = ZFPlayerController(scrollView: tableView, playerManager: playerManager, containerViewTag: 100)
        player.disableGestureTypes = [.pan, .pinch]
        player.controlView = controlView
        player.allowOrentitaionRotation = false
        player.isWWANAutoPlay = true
        player.playerDisapperaPercent = 1.0
        player.playerDidToEnd = { [weak self] asset in
            guard let self = self else { return }
            self.player.currentPlayerManager.replay()
        }
        player.playerReadyToPlay = {[weak self] asset, assetURL in
            guard let self = self else { return }
            self.controlView.videoPlayer((self.player)!, currentTime: self.player.currentTime, totalTime: self.player.totalTime)
            let index = self.dataURLArray.index(of: assetURL.absoluteString)
            let homeModel = self.dataArray[index] as! CNLiveAlbumListModel
            if (homeModel.product!.albumProductType != "0") {
                (self.player)!.stopCurrentPlayingCell()
            }
        }
        // 更新另一个控制层的时间
        player.playerPlayTimeChanged = { [weak self] asset, currentTime, duration in
            guard let self = self else { return }
            self.controlView.videoPlayer((self.player)!, currentTime: currentTime, totalTime: duration)
        }
        // 更新另一个控制层的缓冲时间
        player.playerBufferTimeChanged = { [weak self] asset, bufferTime in
            guard let self = self else { return }
            self.controlView.videoPlayer((self.player)!, bufferTime: bufferTime)
        }
        // 停止的时候找出最合适的播放
        player.zf_scrollViewDidEndScrollingCallback = { [weak self] indexPath in
            guard let self = self else { return }
            if self.player.playingIndexPath != nil {
                return
            }
            self.playVideo(at: indexPath)
        }
    }
    
    func addRefreshView() {
        self.tableView.refreshControl = headerRefreshView
        footerRefreshView = CNLiveFooterRefresh(refreshingBlock: { [weak self] in
            guard let self = self else { return }
            self.player.stopCurrentPlayingCell()
            self.pageNum += 1
            self.requestData {}
        })
    }
    
    @objc func headerRefresh() {
        self.pageNum = 1
        self.requestData {}
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        self.backBtn.frame = CGRectMake(15, CGRectGetMaxY(UIApplication.shared.statusBarFrame), 45, 45)
    }
    
    func requestData(resultBlock: @escaping () -> Void) {
        CNLiveShortVideoViewModel.requstWithShortVideo(aid: self.aid, page: self.pageNum) { [weak self] result, respStatue in
            guard let self = self else { return }
            if respStatue == .success {
                if self.pageNum == 1 {
                    self.dataArray.removeAllObjects()
                    self.dataURLArray.removeAllObjects()
                    if self.currentIndex == 0 {
                        self.tableView.setContentOffset(CGPoint.zero, animated: false)
                    }
                }
                let listArray = (result as! [Any]).first as! [CNLiveAlbumListModel]
                self.dataArray.addObjects(from: listArray)
                let urlArray = (result as! [Any]).last as! [String]
                self.dataURLArray.addObjects(from: urlArray)
                if self.tableView.mj_footer != nil {
                    self.tableView.mj_footer?.endRefreshing()
                }
                self.tableView.refreshControl?.endRefreshing()
                self.tableView.reloadData()
                DispatchQueue.main.async {
                    self.tableView.contentOffset = CGPoint.zero
                }
                let hasNextPage = (result as! [Any])[1] as! Bool
                if listArray.count == 0 && urlArray.count == 0 {
                    if !hasNextPage {
                        self.tableView.mj_footer?.endRefreshingWithNoMoreData()
                        self.tableView.reloadData()
                    }
                } else {
                    if self.tableView.mj_footer == nil  {
                        self.tableView.mj_footer = footerRefreshView
                    }
                }
                if self.pageNum == 1 {
                    self.playTheIndex(index: self.currentIndex)
                }
            } else {
                if self.tableView.mj_footer != nil {
                    self.tableView.mj_footer?.endRefreshing()
                }
                self.tableView.contentOffset = CGPoint.zero
                self.tableView.refreshControl?.endRefreshing()
                if self.dataArray.count == 0 {
                    self.tableView.reloadEmptyDataSet()
                }
            }
        }
    }
    
    open func playTheIndex(index: NSInteger) {
        // 指定到某一行播放
        let indexPath = IndexPath(row: index, section: 0)
        tableView.scrollToRow(at: indexPath, at: .none, animated: false)

        // 使用zf_filterShouldPlayCellWhileScrolled过滤播放
        self.player.zf_filterShouldPlayCellWhileScrolled { [weak self] indexPath in
            guard let self = self else { return }
            self.playVideo(at: indexPath)
        }
    }

    override var shouldAutorotate: Bool {
        return false
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
    
    @objc func backClick(_ sender: UIButton) {
        self.navigationController?.popViewController(animated: true)
    }
    
    func playVideo(at indexPath: IndexPath) {
        let data: CNLiveAlbumListModel = dataArray[indexPath.row] as! CNLiveAlbumListModel
        self.player.playTheIndexPath(indexPath, assetURL: URL(string: data.videoUrl)!)
        controlView.resetControlView()
        controlView.showCoverView(withUrl: data.poster)
    }
    
    deinit {
        tableView.delegate = nil
        tableView.dataSource = nil
        controlView.removeFromSuperview()
        player.stopCurrentPlayingCell()
        if (playerManager.player != nil) {
            playerManager.player.stop()
        }
        print("销毁了")
    }
}
extension CNLiveShortVideoViewController {
    
    func likeActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        CNLiveShortVideoViewModel.requestRankWithLike(contentId: viewcell.homeModel.pid, contentTitle: viewcell.homeModel.title, contentSid: viewcell.homeModel.icon!.id, support: viewcell.homeModel.tool!.liked, tagName: viewcell.homeModel.tagName) {result, respStatue in
            if respStatue == .success {
                viewcell.homeModel.tool!.liked = !viewcell.homeModel.tool!.liked
                if viewcell.homeModel.tool!.liked {
                    viewcell.homeModel.tool?.likesNum = "\(Int(viewcell.homeModel.tool!.likesNum)! + 1)"
                } else {
                    viewcell.homeModel.tool?.likesNum = "\(Int(viewcell.homeModel.tool!.likesNum)! - 1)"
                }
                button.setTitle(viewcell.homeModel.tool?.likesNum, for: .normal)
                button.isSelected = viewcell.homeModel.tool!.liked
            }
        }
    }
    func commentActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        CNLiveShortVideoCommentListView.showVideoCommentListView(pid: viewcell.homeModel.pid, contentSid: viewcell.homeModel.icon!.id, result: { commentModel in
            
        })
    }
    func shareActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        
    }
    func iconActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        
    }
    func faviActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        
    }
    func listActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        CNLiveShortVideoContentListView.showVideoContentListView(title: viewcell.homeModel.albumMsgModel!.albumName,dataArray: dataArray, result: {[weak self] listModel in
            guard let self = self else { return }
            let index = self.dataArray.index(of: listModel) as NSInteger
            self.playTheIndex(index: index)
        })
    }
    func payActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        let payButton = button as! APButton
        payButton.startAnimating()
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
            guard let self = self else { return }
            payButton.stopAnimating()
            for item in self.dataArray {
                let homeModel = item as! CNLiveAlbumListModel
                homeModel.product!.albumProductType = "0"
                self.tableView.reloadData()
            }
            let index = self.dataArray.index(of: viewcell.homeModel as Any)
            self.playTheIndex(index: index)
        }

    }
}

extension CNLiveShortVideoViewController {
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: kVideoBodyListViewCellIdentifier) as? CNLiveShortVideoListTableViewCell else {
            return CNLiveShortVideoListTableViewCell()
        }
        cell.delegate = self
        cell.setupWithData(model: dataArray[indexPath.row] as! CNLiveAlbumListModel)
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.playVideo(at: indexPath)
    }
    
    func image(forEmptyDataSet scrollView: UIScrollView) -> UIImage? {
        return UIImage(named: "short_video_default")
    }
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        scrollView.zf_scrollViewDidEndDecelerating()
    }
    
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        scrollView.zf_scrollViewDidEndDraggingWillDecelerate(decelerate)
    }
    
    func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
        scrollView.zf_scrollViewDidScrollToTop()
    }
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        scrollView.zf_scrollViewDidScroll()
    }
    
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        scrollView.zf_scrollViewWillBeginDragging()
    }
    
    func zf_playTheVideo(at indexPath: IndexPath) {
        self.playVideo(at: indexPath)
    }
}