Files
Woka_Native_iOS/WOKA/WOKAFM/ViewModel/WokaFMVM.swift
Bilal dcbbfc3417 - made theme 2 banner dynamic, if ad loads then only it will be shown
- made radio ad dynamic, now ad will show up only if ad is received
- added a retry count to fm, it will try 4 times to connect to the server if not then showing the reload btn
2024-09-19 01:22:04 +05:30

174 lines
5.9 KiB
Swift

//
// WokaFMVM.swift
// WOKA
//
// Created by MacBook Pro on 01/08/24.
//
import UIKit
import AVFoundation
import GoogleMobileAds
import MediaPlayer
class WokaFMVM{
weak var vc : WokaFMVC!
var player: AVPlayer!
var playerItem: AVPlayerItem!
var startTimeStamp = Date()
var bottomBannerView = GADBannerView()
// if retry count is 4 reset it to 0
var retryCount = 0
func initView(){
startTimeStamp = Date()
vc.mainView.roundCorners(radius: 10, corners: [.topLeft, .topRight])
let color1 = #colorLiteral(red: 0.5921568627, green: 0.2588235294, blue: 0.8941176471, alpha: 1)
let color2 = #colorLiteral(red: 0.368627451, green: 0.1215686275, blue: 0.768627451, alpha: 1)
vc.roundView.applyGradient(colors: [color2, color1], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0.8, y: 0))
vc.playBtn.applyGradientBtn(colors: [color2, color1], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0.8, y: 0))
vc.playBtn.roundCorner()
vc.mainView.roundCorners(radius: 10, corners: [.topLeft, . topRight])
setupPlayer()
vc.addObservers()
setupAudioSession()
vc.blackView.addTapGesture { [weak self] in
guard let self else{return}
PersistentStorage.shared.addRadioCount()
if let postID = AuthFunc.shareInstance.staticURLs?.liveFmData?.id {
let duration = DateFormatterLib.dateDifferenceINT(date1: self.startTimeStamp, date2: Date())
AuthFunc.shareInstance.userVideoView(postID: postID, postType: PostType.FM.rawValue, duration: duration, catID: 0) { _ in}
}
self.vc.dismiss(animated: true)
}
setGoogleAd()
// updateNowPlayingInfo()
}
// MARK: - SetupAd
func stopMPNowPlayin(){
MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
}
func setupNowPlayingInfo() {
let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()
var nowPlayingInfo: [String: Any] = [:]
// Set the media title, artist, and album name
nowPlayingInfo[MPMediaItemPropertyTitle] = "Live FM"
nowPlayingInfo[MPMediaItemPropertyArtist] = "WOKA"
nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = "Album Name"
// Optional: Set the artwork
if let artworkImage = UIImage(named: "WokaLogo") {
let artwork = MPMediaItemArtwork(boundsSize: artworkImage.size) { size in
return artworkImage
}
nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
}
// Set the duration and current playback position
if let currentItem = player.currentItem {
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = currentItem.asset.duration.seconds
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
}
// Assign the nowPlayingInfo to the center
nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo
}
func setupRemoteCommandCenter() {
let commandCenter = MPRemoteCommandCenter.shared()
// Enable play command
commandCenter.playCommand.addTarget { [unowned self] event in
if player.rate == 0.0 {
player.play()
return .success
}
return .commandFailed
}
// Enable pause command
commandCenter.pauseCommand.addTarget { [unowned self] event in
if player.rate == 1.0 {
player.pause()
return .success
}
return .commandFailed
}
// Enable next and previous track commands if needed
commandCenter.nextTrackCommand.isEnabled = false
commandCenter.previousTrackCommand.isEnabled = false
}
func updateNowPlayingInfo() {
if let currentItem = player.currentItem {
var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo ?? [:]
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}
}
func setGoogleAd(){
/*
Show google ads with dispatch queue.
*/
DispatchQueue.main.asyncAfter(deadline: .now() + 0.8, execute: { [weak self] in
guard let self else{return}
AdReusable.sharedInstance.setupBannerAd(bannerView: self.bottomBannerView, in: vc.adView, adUnitID: K.GoogleAdIDs.themeTwo, viewController: self.vc)
// vc.adView.isHidden = false
})
}
// MARK: - Setup AV & Player
func setupAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(.playback, mode: .default)
try session.setActive(true)
} catch {
print("Failed to set up audio session")
}
}
func setupPlayer() {
guard let data = AuthFunc.shareInstance.staticURLs , let liveFmURL = data.liveFmData?.liveFmURL else{
AuthFunc.shareInstance.getStaticURLs()
self.vc.toast(msg: "Issue with radio, please try after sometime.", time: 2)
return
}
guard let url = URL(string: liveFmURL) else{return}
// guard let url = URL(string: "https://a9.asurahosting.com:7530/radio.mp3") else{return}
playerItem = AVPlayerItem(url: url)
player = AVPlayer(playerItem: playerItem)
player.play()
// setGoogleAd()
}
func retryConnect(){
vc.activityIndicator.startAnimating()
vc.playBtn.isEnabled = false
setupPlayer()
vc.addObservers()
setupAudioSession()
}
}