- added a check for live tv player, checking if its not playing for a long time. - fixed the apiversion check on splash - Fixed the guest user issue, if no internet connect and app is started. - fixed woka fm issue for google and normal ads.
258 lines
10 KiB
Swift
258 lines
10 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 = [:]
|
|
UIApplication.shared.endReceivingRemoteControlEvents()
|
|
let commandCenter = MPRemoteCommandCenter.shared()
|
|
|
|
// Disable play/pause commands
|
|
commandCenter.playCommand.removeTarget(nil)
|
|
commandCenter.pauseCommand.removeTarget(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] = ""
|
|
nowPlayingInfo[MPNowPlayingInfoPropertyIsLiveStream] = true
|
|
|
|
if let originalImage = UIImage(named: "MasilaCharacter") {
|
|
|
|
let artworkImage = imageWithBackground(color: #colorLiteral(red: 0.4495816827, green: 0.2344398499, blue: 0.8120074868, alpha: 1), originalImage: originalImage)
|
|
|
|
let artwork = MPMediaItemArtwork(boundsSize: originalImage.size) { size in
|
|
return artworkImage ?? originalImage
|
|
}
|
|
|
|
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 { [weak self] event in
|
|
guard let self else{return .commandFailed}
|
|
if player.rate == 0.0 {
|
|
player.play()
|
|
return .success
|
|
}
|
|
return .commandFailed
|
|
}
|
|
|
|
// Enable pause command
|
|
commandCenter.pauseCommand.addTarget { [weak self] event in
|
|
guard let self else{return .commandFailed}
|
|
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 imageWithBackground(color: UIColor, originalImage: UIImage) -> UIImage? {
|
|
let size = originalImage.size
|
|
UIGraphicsBeginImageContextWithOptions(size, false, originalImage.scale)
|
|
let rect = CGRect(origin: CGPoint.zero, size: size)
|
|
|
|
// Fill the background with a color
|
|
color.setFill()
|
|
UIRectFill(rect)
|
|
|
|
// Draw the original image on top
|
|
originalImage.draw(in: rect)
|
|
|
|
// Capture the new image with background
|
|
let imageWithBackground = UIGraphicsGetImageFromCurrentImageContext()
|
|
UIGraphicsEndImageContext()
|
|
|
|
return imageWithBackground
|
|
}
|
|
|
|
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(){
|
|
/*
|
|
First check if webSeries ad is present via slug, then check for Local Ads, if not then check google ads.
|
|
*/
|
|
if let adsData = AuthFunc.shareInstance.adsData, let fmAd = adsData.result?.filter({$0.slug == AdsEnum.fm.rawValue}).first{
|
|
|
|
// check if ads data contains LocalAD for webseries
|
|
if let advertisement = fmAd.advertisement,let bannerImage = advertisement.bannerImage{
|
|
vc.imageAdView.imageURL(bannerImage, color: .textDarkBlue,type: .ads) { [weak self] isDone in
|
|
guard let self else{return}
|
|
// if image gives error hide the ad banner
|
|
if isDone == false{
|
|
vc.imageAdView.isHidden = true
|
|
}else{
|
|
vc.imageAdView.isHidden = false
|
|
vc.imageAdView.alpha = 0
|
|
let height = UIScreen.main.bounds.width * 0.192
|
|
vc.imageAdHeight.constant = height
|
|
UIView.animate(withDuration: 0.2, animations: { [weak self] in
|
|
guard let self else{return}
|
|
vc.imageAdView.alpha = 1
|
|
vc.imageAdView.isHidden = false
|
|
})
|
|
|
|
vc.imageAdView.addTapGesture {
|
|
if let adID = fmAd.id{
|
|
PersistentStorage.shared.addAdsCount(adID: adID ,clicks: 1)
|
|
}
|
|
if let adLink = fmAd.advertisement?.adLink ,let url = URL(string: adLink), UIApplication.shared.canOpenURL(url) {
|
|
UIApplication.shared.open(url)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// vc.imageAdView.imageURL(bannerImage, color: .white)
|
|
// vc.imageAdView.alpha = 0
|
|
// let height = UIScreen.main.bounds.width * 0.192
|
|
// vc.imageAdHeight.constant = height
|
|
// UIView.animate(withDuration: 0.2, animations: { [weak self] in
|
|
// guard let self else{return}
|
|
// vc.imageAdView.alpha = 1
|
|
// vc.imageAdView.isHidden = false
|
|
// })
|
|
//
|
|
// vc.imageAdView.addTapGesture {
|
|
// if let adID = fmAd.id{
|
|
// PersistentStorage.shared.addAdsCount(adID: adID ,clicks: 1)
|
|
// }
|
|
// if let adLink = fmAd.advertisement?.adLink ,let url = URL(string: adLink), UIApplication.shared.canOpenURL(url) {
|
|
// UIApplication.shared.open(url)
|
|
// }
|
|
// }
|
|
}else if fmAd.googleAd != nil{
|
|
/*
|
|
Show google ads with dispatch queue.
|
|
*/
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: { [weak self] in
|
|
guard let self else{return}
|
|
AdReusable.sharedInstance.setupBannerAd(bannerView: self.bottomBannerView, in: vc.imageAdView, adUnitID: K.GoogleAdIDs.wokaFM, viewController: self.vc)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
// 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()
|
|
}
|
|
|
|
}
|