- started working on karaoke

- made storyboard and module folder
- create ui for listing of karaoke
- added api for karaoke list, with data model
- made ui dynamic for karaoke listing
- Matched the continue watching data with the karaoke listing and decreased code
- made custom player view for karaoke
- added timer to show hide controls in player
This commit is contained in:
Bilal
2024-07-05 19:24:20 +05:30
parent 70b951de42
commit b405c17a7a
26 changed files with 2092 additions and 28 deletions

View File

@@ -183,6 +183,9 @@
9C0A85432BEE3EC90093783D /* NewPasswordVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C0A85422BEE3EC90093783D /* NewPasswordVM.swift */; };
9C1C69FA2C106B290035B2C7 /* RSKPlaceholderTextView in Frameworks */ = {isa = PBXBuildFile; productRef = 9C1C69F92C106B290035B2C7 /* RSKPlaceholderTextView */; };
9C1C69FC2C106C240035B2C7 /* ContactSupportVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C1C69FB2C106C240035B2C7 /* ContactSupportVM.swift */; };
9C21F81C2C37E1FA0050BFCC /* KaraokeContinueWatchingDM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C21F81B2C37E1FA0050BFCC /* KaraokeContinueWatchingDM.swift */; };
9C21F81E2C37E3CA0050BFCC /* AVPlayerVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C21F81D2C37E3CA0050BFCC /* AVPlayerVC.swift */; };
9C21F8222C382A580050BFCC /* AVPlayerVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C21F8212C382A580050BFCC /* AVPlayerVM.swift */; };
9C27E1602BDB6ECA00EC1DA9 /* UserDefaultsStruct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C27E15F2BDB6ECA00EC1DA9 /* UserDefaultsStruct.swift */; };
9C27E1632BDB6F1900EC1DA9 /* AuthFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C27E1622BDB6F1900EC1DA9 /* AuthFunc.swift */; };
9C27E1652BDB6FBC00EC1DA9 /* StoryBoardID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C27E1642BDB6FBC00EC1DA9 /* StoryBoardID.swift */; };
@@ -232,6 +235,11 @@
9C9BEEC72BEE1BBF004ECC2F /* CollectionViewCenteredFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C9BEEC62BEE1BBF004ECC2F /* CollectionViewCenteredFlowLayout.swift */; };
9CA7C6C02C1093E500D73742 /* ProfileVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA7C6BF2C1093E500D73742 /* ProfileVC.swift */; };
9CA7C6C22C1095B600D73742 /* ProfileVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA7C6C12C1095B600D73742 /* ProfileVM.swift */; };
9CB3D0852C37BA530062869D /* Karaoke.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9CB3D0842C37BA530062869D /* Karaoke.storyboard */; };
9CB3D08B2C37BBA50062869D /* KaraokeListingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB3D08A2C37BBA50062869D /* KaraokeListingVC.swift */; };
9CB3D08D2C37CDD60062869D /* KaraokeListingVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB3D08C2C37CDD50062869D /* KaraokeListingVM.swift */; };
9CB3D08F2C37D0D60062869D /* KaraokeListingDM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB3D08E2C37D0D60062869D /* KaraokeListingDM.swift */; };
9CB3D0912C37D6930062869D /* KaraokeDetailsVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB3D0902C37D6930062869D /* KaraokeDetailsVC.swift */; };
9CB4C5A92C118EF300737C00 /* NavBarColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB4C5A82C118EF300737C00 /* NavBarColor.swift */; };
9CBCB29B2BE4D614007D7934 /* LoginVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBCB29A2BE4D614007D7934 /* LoginVC.swift */; };
9CBCB29D2BE4D6BB007D7934 /* LoginVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBCB29C2BE4D6BB007D7934 /* LoginVM.swift */; };
@@ -455,6 +463,9 @@
9C0A85402BEE35670093783D /* ResetPassUserNameVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPassUserNameVM.swift; sourceTree = "<group>"; };
9C0A85422BEE3EC90093783D /* NewPasswordVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewPasswordVM.swift; sourceTree = "<group>"; };
9C1C69FB2C106C240035B2C7 /* ContactSupportVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactSupportVM.swift; sourceTree = "<group>"; };
9C21F81B2C37E1FA0050BFCC /* KaraokeContinueWatchingDM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KaraokeContinueWatchingDM.swift; sourceTree = "<group>"; };
9C21F81D2C37E3CA0050BFCC /* AVPlayerVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVPlayerVC.swift; sourceTree = "<group>"; };
9C21F8212C382A580050BFCC /* AVPlayerVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVPlayerVM.swift; sourceTree = "<group>"; };
9C27E15F2BDB6ECA00EC1DA9 /* UserDefaultsStruct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsStruct.swift; sourceTree = "<group>"; };
9C27E1622BDB6F1900EC1DA9 /* AuthFunc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthFunc.swift; sourceTree = "<group>"; };
9C27E1642BDB6FBC00EC1DA9 /* StoryBoardID.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryBoardID.swift; sourceTree = "<group>"; };
@@ -493,6 +504,11 @@
9C9BEEC62BEE1BBF004ECC2F /* CollectionViewCenteredFlowLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewCenteredFlowLayout.swift; sourceTree = "<group>"; };
9CA7C6BF2C1093E500D73742 /* ProfileVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileVC.swift; sourceTree = "<group>"; };
9CA7C6C12C1095B600D73742 /* ProfileVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileVM.swift; sourceTree = "<group>"; };
9CB3D0842C37BA530062869D /* Karaoke.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Karaoke.storyboard; sourceTree = "<group>"; };
9CB3D08A2C37BBA50062869D /* KaraokeListingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KaraokeListingVC.swift; sourceTree = "<group>"; };
9CB3D08C2C37CDD50062869D /* KaraokeListingVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KaraokeListingVM.swift; sourceTree = "<group>"; };
9CB3D08E2C37D0D60062869D /* KaraokeListingDM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KaraokeListingDM.swift; sourceTree = "<group>"; };
9CB3D0902C37D6930062869D /* KaraokeDetailsVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KaraokeDetailsVC.swift; sourceTree = "<group>"; };
9CB4C5A82C118EF300737C00 /* NavBarColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavBarColor.swift; sourceTree = "<group>"; };
9CBCB29A2BE4D614007D7934 /* LoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginVC.swift; sourceTree = "<group>"; };
9CBCB29C2BE4D6BB007D7934 /* LoginVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginVM.swift; sourceTree = "<group>"; };
@@ -658,6 +674,7 @@
523ED25C2BDA2BC700CFED02 /* WOKA */ = {
isa = PBXGroup;
children = (
9CB3D0832C37BA470062869D /* Karaoke */,
526A436D2C36A96A00AE148F /* Games */,
52BFB52B2C33DA9700BAAE15 /* Audio Books */,
52DAC6462C21761700E2F85B /* WebSeries */,
@@ -1347,6 +1364,53 @@
path = HTML;
sourceTree = "<group>";
};
9CB3D0832C37BA470062869D /* Karaoke */ = {
isa = PBXGroup;
children = (
9CB3D0892C37BA650062869D /* Model */,
9CB3D0882C37BA630062869D /* View */,
9CB3D0872C37BA610062869D /* ViewModel */,
9CB3D0862C37BA5F0062869D /* Controller */,
9CB3D0842C37BA530062869D /* Karaoke.storyboard */,
);
path = Karaoke;
sourceTree = "<group>";
};
9CB3D0862C37BA5F0062869D /* Controller */ = {
isa = PBXGroup;
children = (
9CB3D08A2C37BBA50062869D /* KaraokeListingVC.swift */,
9CB3D0902C37D6930062869D /* KaraokeDetailsVC.swift */,
9C21F81D2C37E3CA0050BFCC /* AVPlayerVC.swift */,
);
path = Controller;
sourceTree = "<group>";
};
9CB3D0872C37BA610062869D /* ViewModel */ = {
isa = PBXGroup;
children = (
9CB3D08C2C37CDD50062869D /* KaraokeListingVM.swift */,
9C21F8212C382A580050BFCC /* AVPlayerVM.swift */,
);
path = ViewModel;
sourceTree = "<group>";
};
9CB3D0882C37BA630062869D /* View */ = {
isa = PBXGroup;
children = (
);
path = View;
sourceTree = "<group>";
};
9CB3D0892C37BA650062869D /* Model */ = {
isa = PBXGroup;
children = (
9CB3D08E2C37D0D60062869D /* KaraokeListingDM.swift */,
9C21F81B2C37E1FA0050BFCC /* KaraokeContinueWatchingDM.swift */,
);
path = Model;
sourceTree = "<group>";
};
9CBCB2A62BE5104F007D7934 /* Home */ = {
isa = PBXGroup;
children = (
@@ -1557,6 +1621,7 @@
9C834ED62C1C1F9200B29A9C /* Exo2-ExtraBold.ttf in Resources */,
9C834ED72C1C1F9200B29A9C /* Exo2-Regular.ttf in Resources */,
9C834ED82C1C1F9200B29A9C /* Exo2-Thin.ttf in Resources */,
9CB3D0852C37BA530062869D /* Karaoke.storyboard in Resources */,
52C6E0262BE3B46A00E22D59 /* SelectAvatarCell.xib in Resources */,
52C8B0712BDA7512003B51D0 /* PassingCloud.json in Resources */,
9C8C4FB02C1328060017DD3B /* Disclaimer.rtf in Resources */,
@@ -1693,6 +1758,7 @@
52D2F3D82C24043D009E52FF /* ShimmerEffectView.swift in Sources */,
9C27E16F2BDB866500EC1DA9 /* CellIdentifier.swift in Sources */,
52BC3BF22C170264002FACA6 /* MoreVM.swift in Sources */,
9CB3D08F2C37D0D60062869D /* KaraokeListingDM.swift in Sources */,
9CBE1B412C0F37B300CA6E61 /* DPDUIView+Extension.swift in Sources */,
9C27E1632BDB6F1900EC1DA9 /* AuthFunc.swift in Sources */,
9C0A85412BEE35670093783D /* ResetPassUserNameVM.swift in Sources */,
@@ -1704,6 +1770,7 @@
52B8D4D92C04A25E00ED65F3 /* UIViewController+Container.swift in Sources */,
9C834EDC2C1C26CD00B29A9C /* HtmlText.swift in Sources */,
527AC6F72C171C8F00434FB7 /* BlogsCell.swift in Sources */,
9C21F81C2C37E1FA0050BFCC /* KaraokeContinueWatchingDM.swift in Sources */,
523ED25E2BDA2BC700CFED02 /* AppDelegate.swift in Sources */,
9C7939132C0EFCAE00F5D6E6 /* FaqVM.swift in Sources */,
52D774ED2BDFC13F001D87DE /* OTPVM.swift in Sources */,
@@ -1766,6 +1833,7 @@
9CBCB2A12BE4E50A007D7934 /* TextFieldPassword.swift in Sources */,
52BC3BEC2C16DF9F002FACA6 /* MyOrdersVC.swift in Sources */,
9C56E8482BDBEFAB00E4CA14 /* AssetColor.swift in Sources */,
9C21F8222C382A580050BFCC /* AVPlayerVM.swift in Sources */,
52BFB5372C33E0C500BAAE15 /* AudioBookHomeVM.swift in Sources */,
9C0A85432BEE3EC90093783D /* NewPasswordVM.swift in Sources */,
526A43752C36AA4A00AE148F /* GamesListVC.swift in Sources */,
@@ -1773,17 +1841,20 @@
524C42332C049D590016A11C /* CustomizableSegmentControl.swift in Sources */,
9C535DB52C005A6D00DA6DCD /* KeyWindowFix.swift in Sources */,
9C9BEEC72BEE1BBF004ECC2F /* CollectionViewCenteredFlowLayout.swift in Sources */,
9CB3D08D2C37CDD60062869D /* KaraokeListingVM.swift in Sources */,
5222426A2BFC7AFC0085C632 /* SideMenuVC.swift in Sources */,
527AC7012C182DCE00434FB7 /* TimeStringToSeconds.swift in Sources */,
9CBCB29D2BE4D6BB007D7934 /* LoginVM.swift in Sources */,
524C42312C0499560016A11C /* NotificationCenterReloads.swift in Sources */,
9C8C4FAE2C1315410017DD3B /* WebViewVC.swift in Sources */,
52BC3BE22C0E02EE002FACA6 /* FaqVC.swift in Sources */,
9C21F81E2C37E3CA0050BFCC /* AVPlayerVC.swift in Sources */,
52A981D02C1AFEE8000E0BEC /* MyListVM.swift in Sources */,
5272FCE52BDFDC8C000ECB1D /* UserDetailsRegisterVM.swift in Sources */,
528E5F222C24660F00E33E4E /* SeasonCategoryCell.swift in Sources */,
525954272BE9178F00191286 /* UserDataDM.swift in Sources */,
9C27E1652BDB6FBC00EC1DA9 /* StoryBoardID.swift in Sources */,
9CB3D08B2C37BBA50062869D /* KaraokeListingVC.swift in Sources */,
52FDBA782BFF23F4009D7AC7 /* TimePeriod.swift in Sources */,
527AC6FA2C17387300434FB7 /* SongBlogDM.swift in Sources */,
522A931C2C0DE9150098FE49 /* AboutUsVc.swift in Sources */,
@@ -1801,6 +1872,7 @@
52AC2D252C295A7900337473 /* TeaserDM.swift in Sources */,
9C535DC22C00B36900DA6DCD /* ThemeTwoVC.swift in Sources */,
9CA7C6C22C1095B600D73742 /* ProfileVM.swift in Sources */,
9CB3D0912C37D6930062869D /* KaraokeDetailsVC.swift in Sources */,
52E214C72C2AD47F00BC2D29 /* EpisodeDetailsVC.swift in Sources */,
52D774F12BDFC53B001D87DE /* StringSubScript.swift in Sources */,
9CBE1B3F2C0F37B300CA6E61 /* DPDConstants.swift in Sources */,

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Microphone.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Microphone@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Microphone@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -63,6 +63,37 @@ class ContinueAudioCell: UICollectionViewCell {
}
}
func setKaraokeData(data: KaraokeListingDM.KaraokeDatum){
//heart.fill , heart , hand.thumbsup.fill , hand.thumbsup
if AuthFunc.shareInstance.getDefaultLanguage() == .english{
audioBookTitle.text = data.contentMoreDetails?.filter({$0.languageMasterID == 1}).first?.title
}else{
audioBookTitle.text = data.contentMoreDetails?.filter({$0.languageMasterID == 2}).first?.title
}
totalLikes.text = data.likesCount?.toString() ?? "0"
if let url = data.thumbnailPath{
audioBookThumbnail.imageURL(url)
}
if let like = data.isLiked{
switch like{
case true:
likeBtn.setImage(UIImage(named: "LikeAdd"), for: .normal)
case false:
likeBtn.setImage(UIImage(named: "LikeRemove"), for: .normal)
}
}
if let favourite = data.markAsFavourite{
if favourite == true{
favBtn.setImage(UIImage(named: "FavouriteAdd"), for: .normal)
}else{
favBtn.setImage(UIImage(named: "FavouriteRemove"), for: .normal)
}
}
}
@IBAction func btnTapped(_ sender: UIButton) {
switch sender{
case likeBtn:

View File

@@ -19,5 +19,6 @@ extension K{
static let webSeries = "WebSeries"
static let audioBooks = "AudioBooks"
static let Games = "Games"
static let Karaoke = "Karaoke"
}
}

View File

@@ -81,5 +81,13 @@ extension K{
static let gamesWebViewVC = "GamesWebViewVC"
}
// MARK: - Karaoke
struct Karaoke{
static let karaokeListingVC = "KaraokeListingVC"
static let karaokeDetailsVC = "KaraokeDetailsVC"
static let aVPlayerVC = "AVPlayerVC"
}
}
}

View File

@@ -227,6 +227,7 @@ enum DateFormats: String, CaseIterable {
case d = "d" // 2
case EEEE = "EEEE" // wednesday
case EEE = "EEE" // wed
case yyyy = "yyyy" // year 2023
case yyyy_MM_dd_T_HH_mm_ss_SSSZ = "yyyy_MM_dd_T_HH_mm_ss_SSSZ"
case yyyy_MM_dd_THH_mm_ss_SSSZ = "yyyy_MM_dd_THH:mm:ss.SSSZ" // 2024-05-21T17:50:15.000000Z

View File

@@ -506,7 +506,7 @@ extension MyListVC : ReloadSeriesFavLike{
}
print(index , type , isFav, isLike)
// print(index , type , isFav, isLike)
}

View File

@@ -0,0 +1,263 @@
//
// AVPlayerVC.swift
// WOKA
//
// Created by Bilal on 05/07/2024.
//
import UIKit
import AVFoundation
class AVPlayerVC: UIViewController {
@IBOutlet weak var videoPlayer: UIView!
// @IBOutlet weak var videoPlayerHeight: NSLayoutConstraint!
@IBOutlet weak var viewControll: UIView!
@IBOutlet weak var stackCtrView: UIStackView!
@IBOutlet weak var sliderStack: UIStackView!
@IBOutlet weak var tintView: UIView!
@IBOutlet weak var videoTitle: UILabel!
@IBOutlet weak var img10SecBack: UIImageView! {
didSet {
self.img10SecBack.isUserInteractionEnabled = true
self.img10SecBack.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onTap10SecBack)))
}
}
@IBOutlet weak var imgPlay: UIImageView! {
didSet {
self.imgPlay.isUserInteractionEnabled = true
self.imgPlay.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onTapPlayPause)))
}
}
@IBOutlet weak var img10SecFor: UIImageView! {
didSet {
self.img10SecFor.isUserInteractionEnabled = true
self.img10SecFor.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onTap10SecNext)))
}
}
@IBOutlet weak var lbCurrentTime: UILabel!
@IBOutlet weak var lbTotalTime: UILabel!
@IBOutlet weak var seekSlider: UISlider! {
didSet {
self.seekSlider.addTarget(self, action: #selector(onTapToSlide), for: .valueChanged)
}
}
var videoURL : String?
var timer : Timer?
var titleVideo : String?
var vm = AVPlayerVM()
override func viewDidLoad() {
super.viewDidLoad()
vm.vc = self
vm.initView()
self.videoTitle.text = titleVideo
startTimer()
viewControll.addTapGesture {
self.timer?.invalidate()
self.showHideControls()
}
}
override func viewDidAppear(_ animated: Bool) {
self.setVideoPlayer()
}
@IBAction func closeBtnTapped(_ sender: UIButton) {
self.dismiss(animated: true)
}
func startTimer(){
timer = Timer.scheduledTimer(withTimeInterval: 3.5, repeats: false) { _ in
self.showHideControls()
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.player?.pause()
self.player = nil
}
// MARK: - ShowHideControls
func showHideControls(){
stackCtrView.isHidden.toggle()
sliderStack.isHidden.toggle()
tintView.isHidden.toggle()
if !stackCtrView.isHidden{
startTimer()
}
}
private var player : AVPlayer? = nil
private var playerLayer : AVPlayerLayer? = nil
private func setVideoPlayer() {
guard let videoURL, let url = URL(string: videoURL) else { return }
if self.player == nil {
self.player = AVPlayer(url: url)
self.playerLayer = AVPlayerLayer(player: self.player)
self.playerLayer?.videoGravity = .resizeAspectFill
self.playerLayer?.frame = self.videoPlayer.bounds
self.playerLayer?.addSublayer(self.viewControll.layer)
if let playerLayer = self.playerLayer {
self.videoPlayer.layer.addSublayer(playerLayer)
}
self.player?.play()
self.imgPlay.image = UIImage(systemName: "pause.circle")
}
self.setObserverToPlayer()
}
// private var windowInterface : UIInterfaceOrientation? {
// return self.view.window?.windowScene?.interfaceOrientation
// }
// override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
// super.willTransition(to: newCollection, with: coordinator)
// guard let windowInterface = self.windowInterface else { return }
// if windowInterface.isPortrait == true {
// self.videoPlayerHeight.constant = 300
// } else {
// self.videoPlayerHeight.constant = self.view.layer.bounds.width
// }
// print(self.videoPlayerHeight.constant)
// DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: {
// self.playerLayer?.frame = self.videoPlayer.bounds
// })
// }
private var timeObserver : Any? = nil
private func setObserverToPlayer() {
let interval = CMTime(seconds: 0.3, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
timeObserver = player?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { elapsed in
self.updatePlayerTime()
})
}
private func updatePlayerTime() {
guard let currentTime = self.player?.currentTime() else { return }
guard let duration = self.player?.currentItem?.duration else { return }
let currentTimeInSecond = CMTimeGetSeconds(currentTime)
let durationTimeInSecond = CMTimeGetSeconds(duration)
if self.isThumbSeek == false {
self.seekSlider.value = Float(currentTimeInSecond/durationTimeInSecond)
}
let value = Float64(self.seekSlider.value) * CMTimeGetSeconds(duration)
var hours = value / 3600
var mins = (value / 60).truncatingRemainder(dividingBy: 60)
var secs = value.truncatingRemainder(dividingBy: 60)
var timeformatter = NumberFormatter()
timeformatter.minimumIntegerDigits = 2
timeformatter.minimumFractionDigits = 0
timeformatter.roundingMode = .down
guard let hoursStr = timeformatter.string(from: NSNumber(value: hours)), let minsStr = timeformatter.string(from: NSNumber(value: mins)), let secsStr = timeformatter.string(from: NSNumber(value: secs)) else {
return
}
self.lbCurrentTime.text = "\(hoursStr):\(minsStr):\(secsStr)"
hours = durationTimeInSecond / 3600
mins = (durationTimeInSecond / 60).truncatingRemainder(dividingBy: 60)
secs = durationTimeInSecond.truncatingRemainder(dividingBy: 60)
timeformatter = NumberFormatter()
timeformatter.minimumIntegerDigits = 2
timeformatter.minimumFractionDigits = 0
timeformatter.roundingMode = .down
guard let hoursStr = timeformatter.string(from: NSNumber(value: hours)), let minsStr = timeformatter.string(from: NSNumber(value: mins)), let secsStr = timeformatter.string(from: NSNumber(value: secs)) else {
return
}
self.lbTotalTime.text = "\(hoursStr):\(minsStr):\(secsStr)"
}
@objc private func onTap10SecNext() {
guard let currentTime = self.player?.currentTime() else { return }
let seekTime10Sec = CMTimeGetSeconds(currentTime).advanced(by: 10)
let seekTime = CMTime(value: CMTimeValue(seekTime10Sec), timescale: 1)
self.player?.seek(to: seekTime, completionHandler: { completed in
})
}
@objc private func onTap10SecBack() {
guard let currentTime = self.player?.currentTime() else { return }
let seekTime10Sec = CMTimeGetSeconds(currentTime).advanced(by: -10)
let seekTime = CMTime(value: CMTimeValue(seekTime10Sec), timescale: 1)
self.player?.seek(to: seekTime, completionHandler: { completed in
})
}
@objc private func onTapPlayPause() {
if self.player?.timeControlStatus == .playing {
self.imgPlay.image = UIImage(systemName: "play.circle")
self.player?.pause()
} else {
self.imgPlay.image = UIImage(systemName: "pause.circle")
self.player?.play()
}
}
private var isThumbSeek : Bool = false
@objc private func onTapToSlide() {
if timer != nil{
timer?.invalidate()
timer = nil
}
self.isThumbSeek = true
guard let duration = self.player?.currentItem?.duration else { return }
let value = Float64(self.seekSlider.value) * CMTimeGetSeconds(duration)
if value.isNaN == false {
let seekTime = CMTime(value: CMTimeValue(value), timescale: 1)
self.player?.seek(to: seekTime, completionHandler: { completed in
if completed {
self.isThumbSeek = false
self.startTimer()
// print("Completed")
}
})
}
}
@objc private func onTapToggleScreen() {
if #available(iOS 16.0, *) {
guard let windowSceen = self.view.window?.windowScene else { return }
if windowSceen.interfaceOrientation == .portrait {
windowSceen.requestGeometryUpdate(.iOS(interfaceOrientations: .landscape)) { error in
print(error.localizedDescription)
}
} else {
windowSceen.requestGeometryUpdate(.iOS(interfaceOrientations: .portrait)) { error in
print(error.localizedDescription)
}
}
} else {
if UIDevice.current.orientation == .portrait {
let orientation = UIInterfaceOrientation.landscapeRight.rawValue
UIDevice.current.setValue(orientation, forKey: "orientation")
} else {
let orientation = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(orientation, forKey: "orientation")
}
}
}
}

View File

@@ -0,0 +1,174 @@
//
// KaraokeDetailsVC.swift
// WOKA
//
// Created by Bilal on 05/07/2024.
//
import UIKit
class KaraokeDetailsVC: UIViewController {
@IBOutlet weak var watchingImage: UIImageView!
@IBOutlet weak var watchingTitle: UILabel!
@IBOutlet weak var watchingDesc: UITextView!
@IBOutlet weak var releaseDate: UILabel!
@IBOutlet weak var addIcon: UIImageView!
@IBOutlet weak var addLabel: UILabel!
@IBOutlet weak var likeIcon: UIImageView!
@IBOutlet weak var likeLabel: UILabel!
@IBOutlet weak var totalLikes: UILabel!
@IBOutlet weak var addView: UIView!
@IBOutlet weak var shareView: UIView!
@IBOutlet weak var likeView: UIView!
var karaokeData : KaraokeListingDM.KaraokeDatum?
var delegate : ReloadAudioBooksFavLike?
override func viewDidLoad() {
super.viewDidLoad()
initView()
tapHandler()
}
func initView(){
if let karaokeData{
if let url = karaokeData.thumbnailPath{
watchingImage.imageURL(url, color: .white)
}
totalLikes.text = karaokeData.likesCount?.toString() ?? "0"
if let releaseDate = karaokeData.releaseDate{
if let formatDate = DateFormatterLib.dateMods(dateStr: releaseDate, dateCurrentFormat: .yyyy_MM_dd_HH_mm_ss, dateReturnFormat: .yyyy, stringOrDate: .string).0{
self.releaseDate.text = formatDate
}
}
if let like = karaokeData.isLiked{
switch like{
case true:
likeIcon.image = UIImage(systemName: "hand.thumbsup.fill")
likeLabel.text = "LIKED".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
case false:
likeIcon.image = UIImage(systemName: "hand.thumbsup")
likeLabel.text = "LIKE".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
}
}
if let favourite = karaokeData.markAsFavourite{
if favourite == true{
addIcon.image = UIImage(systemName: "heart.fill")
addLabel.text = "ADDED".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
}else{
addIcon.image = UIImage(systemName: "heart")
addLabel.text = "ADD".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
}
}
if AuthFunc.shareInstance.getDefaultLanguage() == .english{
if let englishData = karaokeData.contentMoreDetails?.filter({$0.languageMasterID == 1}).first{
watchingTitle.text = englishData.title
if let desc = englishData.description?.replacingOccurrences(of: "<br>", with: "").htmlToAttributedString{
let sizeText = NSMutableAttributedString(attributedString: desc)
sizeText.setFontFace(font: FontCustom.shareInstance.customFont(fontName: .Exo2_Regular, size: 15),color: UIColor.appColor(.TextDarkBlue)!)
self.watchingDesc.attributedText = sizeText
}
}
}else{
if let hindiData = karaokeData.contentMoreDetails?.filter({$0.languageMasterID == 2}).first{
watchingTitle.text = hindiData.title
if let desc = hindiData.description?.replacingOccurrences(of: "<br>", with: "").htmlToAttributedString{
let sizeText = NSMutableAttributedString(attributedString: desc)
sizeText.setFontFace(font: FontCustom.shareInstance.customFont(fontName: .Exo2_Regular, size: 15),color: UIColor.appColor(.TextDarkBlue)!)
self.watchingDesc.attributedText = sizeText
}
}
}
}
}
func tapHandler(){
self.view.addTapGesture {
self.dismiss(animated: true)
}
addView.addTapGesture { [weak self] in
guard let self else{return}
if let karaokeData{
guard let showID = karaokeData.id, let isFav = karaokeData.markAsFavourite, let postType = karaokeData.contentMoreDetails?.first?.postType else{return}
if isFav {
LikeFavCommonFunc.shareInstance.removeFavourite(postID: showID, postType: postType, categoryID: 0, vc: self) { isDone in
self.karaokeData?.markAsFavourite = false
K.GVar.reloadMyList = true
self.delegate?.updateRows(id: showID, type: .favourite, isFav: false, isLike: nil)
self.initView()
}
}else{
LikeFavCommonFunc.shareInstance.addFavourite(postID: showID, postType: postType, categoryID: 0, vc: self) { isDone in
self.karaokeData?.markAsFavourite = true
K.GVar.reloadMyList = true
self.delegate?.updateRows(id: showID, type: .favourite, isFav: true, isLike: nil)
self.initView()
}
}
}
}
likeView.addTapGesture { [weak self] in
guard let self else{return}
if let karaokeData{
guard let showID = karaokeData.id, let isLiked = karaokeData.isLiked, let postType = karaokeData.contentMoreDetails?.first?.postType else{return}
if isLiked{
LikeFavCommonFunc.shareInstance.unlikePost(postID: showID, postType: postType, vc: self) { isDone in
self.karaokeData?.isLiked = false
K.GVar.reloadMyList = true
self.delegate?.updateRows(id: showID, type: .liked, isFav: nil, isLike: false)
self.initView()
}
}else{
LikeFavCommonFunc.shareInstance.likePost(postID: showID, postType: postType, vc: self) { isDone in
self.karaokeData?.isLiked = true
K.GVar.reloadMyList = true
self.delegate?.updateRows(id: showID, type: .liked, isFav: nil, isLike: true)
self.initView()
}
}
}
}
shareView.addTapGesture {
print("share")
}
}
@IBAction func playNowBtnTapped(_ sender: LocalisedElementsButton) {
let sb = UIStoryboard(name: K.StoryBoard.Karaoke, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Karaoke.aVPlayerVC) as! AVPlayerVC
if AuthFunc.shareInstance.getDefaultLanguage() == .english{
if let englishData = karaokeData?.contentMoreDetails?.filter({$0.languageMasterID == 1}).first{
vcPush.titleVideo = englishData.title
vcPush.videoURL = englishData.url
}
}else{
if let hindiData = karaokeData?.contentMoreDetails?.filter({$0.languageMasterID == 2}).first{
vcPush.titleVideo = hindiData.title
vcPush.videoURL = hindiData.url
}
}
self.present(vcPush, animated: true)
}
@IBAction func closeBtnTapped(_ sender: UIButton) {
self.dismiss(animated: true) {
}
}
}

View File

@@ -0,0 +1,233 @@
//
// KaraokeListingVC.swift
// WOKA
//
// Created by Bilal on 05/07/2024.
//
import UIKit
class KaraokeListingVC: UIViewController {
@IBOutlet weak var headerView: ShimmerEffectView!
@IBOutlet weak var selectedShowView: ShimmerEffectView!
@IBOutlet weak var headerHeight: NSLayoutConstraint!
@IBOutlet weak var headerImage: UIImageView!
@IBOutlet weak var headerTitleLabel: UILabel!
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var continueWatchingCV: UICollectionView!
@IBOutlet weak var continueWatchingStack: UIStackView!
@IBOutlet weak var karaokeListingTableView: UITableView!
@IBOutlet weak var tableHeight: NSLayoutConstraint!
var vm = KaraokeListingVM()
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
vm.vc = self
vm.initView()
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(false, animated: animated)
self.navigationController?.setColor(color: .white)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: animated)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// Customize the navigation bar's appearance
self.navigationController?.setColor(color: .black)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
vm.updateTableHeight()
}
}
// MARK: - CollectionView Delegate and Data Source
extension KaraokeListingVC : CollectionViewSRC{
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return vm.continueWatchingData.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: K.CellIdentifier.AudioBooks.continueAudioCell, for: indexPath) as! ContinueAudioCell
let data = vm.continueWatchingData[indexPath.row]
cell.setKaraokeData(data: data)
cell.btnTapped = { [self] (type) -> Void in
vm.updateFavLikes(type: type,id: vm.continueWatchingData[indexPath.row].id ?? 0)
}
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let data = vm.continueWatchingData[indexPath.row]
/*
Updated the top header data
*/
vm.indexToLoad = vm.karaokeListData.firstIndex(where: {$0.id == data.id}) ?? 0
vm.setHeaderData()
let sb = UIStoryboard(name: K.StoryBoard.Karaoke, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Karaoke.karaokeDetailsVC) as! KaraokeDetailsVC
vcPush.modalPresentationStyle = .overCurrentContext
vcPush.modalTransitionStyle = .crossDissolve
vcPush.karaokeData = data
vcPush.delegate = self
self.present(vcPush, animated: true)
}
}
// MARK: - Collection Flow Layout
extension KaraokeListingVC : UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 5
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
let inset: CGFloat = 10
return UIEdgeInsets(top: 0, left: inset, bottom: 0, right: inset)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0 // Space between cells
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let widthPerItem = collectionView.frame.width - 30 // Adjust to your desired width
return CGSize(width: widthPerItem, height: 230)
}
}
// MARK: - TableView DataSource , Delegates
extension KaraokeListingVC : TableViewSRC{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return vm.karaokeListData.count == 0 ? 2 : vm.karaokeListData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: K.CellIdentifier.WebSeries.webSeriesShowListingCell) as! WebSeriesShowListingCell
if vm.karaokeListData.count == 0{
cell.showShimmer()
}else{
let data = vm.karaokeListData[indexPath.row]
cell.setKaraokeData(data: data)
cell.stopShimmer()
}
cell.btnTapped = { [weak self] (type) -> Void in
guard let self , let id = vm.karaokeListData[indexPath.row].id else{return}
vm.updateFavLikes(type: type, id: id)
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
/*
Updated the top header data
*/
vm.indexToLoad = indexPath.row
vm.setHeaderData()
let data = vm.karaokeListData[indexPath.row]
let sb = UIStoryboard(name: K.StoryBoard.Karaoke, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Karaoke.karaokeDetailsVC) as! KaraokeDetailsVC
vcPush.modalPresentationStyle = .overCurrentContext
vcPush.modalTransitionStyle = .crossDissolve
vcPush.karaokeData = data
vcPush.delegate = self
self.present(vcPush, animated: true)
}
}
extension KaraokeListingVC : ReloadAudioBooksFavLike{
func updateRows(id: Int, type: FavCellCLick, isFav: Bool?, isLike: Bool?) {
if let isFav{
if let continueDataIndex = vm.continueWatchingData.firstIndex(where:{$0.id == id}) {
vm.continueWatchingData[continueDataIndex].markAsFavourite = isFav
continueWatchingCV.reloadItems(at: [IndexPath(row: continueDataIndex, section: 0)])
}
if let audioListDataIndex = vm.karaokeListData.firstIndex(where:{$0.id == id}) {
vm.karaokeListData[audioListDataIndex].markAsFavourite = isFav
karaokeListingTableView.reloadRows(at: [IndexPath(row: audioListDataIndex, section: 0)],with: .none)
K.GVar.reloadMyList = true
}
}
if let isLike{
if let continueDataIndex = vm.continueWatchingData.firstIndex(where:{$0.id == id}) {
vm.continueWatchingData[continueDataIndex].isLiked = isLike
continueWatchingCV.reloadItems(at: [IndexPath(row: continueDataIndex, section: 0)])
}
if let audioListDataIndex = vm.karaokeListData.firstIndex(where:{$0.id == id}) {
vm.karaokeListData[audioListDataIndex].isLiked = isLike
karaokeListingTableView.reloadRows(at: [IndexPath(row: audioListDataIndex, section: 0)],with: .none)
K.GVar.reloadMyList = true
}
}
}
}
// MARK: - Animating scrollView
extension KaraokeListingVC: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// Get the current vertical offset of the scroll view
let y = scrollView.contentOffset.y
// Define the height range for the header view
let minHeaderHeight: CGFloat = 0.0 // Height at which the header becomes invisible
let maxHeaderHeight: CGFloat = 200.0 // Maximum height when fully visible
// Calculate the new height for the header view based on the scroll position
let newHeaderHeight: CGFloat
if y < 0 {
// When scrolling up beyond the top, ensure the header view is fully expanded
newHeaderHeight = maxHeaderHeight
} else {
// Calculate the new height for the header view, ensuring it doesn't go below the minimum height
newHeaderHeight = max(minHeaderHeight, maxHeaderHeight - y)
}
// Update the header view's height constraint with the new height
headerHeight.constant = newHeaderHeight
// Animate the layout changes to smoothly transition the header height
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
}

View File

@@ -0,0 +1,838 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<customFonts key="customFonts">
<array key="Exo2-Bold.ttf">
<string>Exo2-Bold</string>
</array>
<array key="Exo2-Medium.ttf">
<string>Exo2-Medium</string>
</array>
<array key="Exo2-Regular.ttf">
<string>Exo2-Regular</string>
</array>
</customFonts>
<scenes>
<!--Karaoke ListingVC-->
<scene sceneID="s0d-6b-0kx">
<objects>
<viewController storyboardIdentifier="KaraokeListingVC" id="Y6W-OH-hqX" customClass="KaraokeListingVC" customModule="WOKA" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="5EZ-qb-Rvc">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="V10-F3-AfA" customClass="ShimmerEffectView" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="0.0" y="48" width="414" height="200"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="uTJ-KB-jeA">
<rect key="frame" x="0.0" y="0.0" width="414" height="200"/>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="uTJ-KB-jeA" firstAttribute="top" secondItem="V10-F3-AfA" secondAttribute="top" id="09V-JP-CNV"/>
<constraint firstAttribute="trailing" secondItem="uTJ-KB-jeA" secondAttribute="trailing" id="WH5-tw-Sla"/>
<constraint firstAttribute="height" constant="200" id="bn9-gt-j6P"/>
<constraint firstItem="uTJ-KB-jeA" firstAttribute="leading" secondItem="V10-F3-AfA" secondAttribute="leading" id="gaM-gD-jLl"/>
<constraint firstAttribute="bottom" secondItem="uTJ-KB-jeA" secondAttribute="bottom" id="oig-tw-8u6"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
</userDefinedRuntimeAttributes>
</view>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="Bmz-QF-ndz">
<rect key="frame" x="0.0" y="248" width="414" height="648"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JKB-7I-uN7" customClass="ShimmerEffectView" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="414" height="108"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="wYf-OM-xmz">
<rect key="frame" x="0.0" y="0.0" width="414" height="108"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fQH-gr-lSI">
<rect key="frame" x="182" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="Dm6-9O-x7v"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="26"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gwc-TP-cJR" customClass="LocalisedElementsButton" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="147" y="58" width="120" height="50"/>
<color key="backgroundColor" red="0.80000000000000004" green="0.29411764705882354" blue="0.11372549019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="width" constant="120" id="J9K-JW-0vT"/>
<constraint firstAttribute="height" constant="50" id="frA-2o-y3J"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="14"/>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" title="SING"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="25"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</button>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="wYf-OM-xmz" secondAttribute="trailing" id="BZK-jr-793"/>
<constraint firstItem="wYf-OM-xmz" firstAttribute="top" secondItem="JKB-7I-uN7" secondAttribute="top" id="m4X-so-gUD"/>
<constraint firstItem="wYf-OM-xmz" firstAttribute="leading" secondItem="JKB-7I-uN7" secondAttribute="leading" id="seZ-wm-9Vq"/>
<constraint firstAttribute="bottom" secondItem="wYf-OM-xmz" secondAttribute="bottom" id="v3K-Iy-2YN"/>
</constraints>
</view>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5mW-wO-b1Z">
<rect key="frame" x="0.0" y="116" width="414" height="532"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="15" translatesAutoresizingMaskIntoConstraints="NO" id="WYB-AZ-whM">
<rect key="frame" x="0.0" y="0.0" width="414" height="40"/>
<subviews>
<stackView hidden="YES" opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="CKh-Ui-Z3R">
<rect key="frame" x="10" y="0.0" width="394" height="270"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SING AGAIN" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pLt-VK-ajf" customClass="LocalisedElementsLabel" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="394" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="ber-7r-qLk"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="Dty-MN-L9A">
<rect key="frame" x="0.0" y="40" width="394" height="230"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="230" id="q7K-wL-Efx"/>
</constraints>
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="10" minimumInteritemSpacing="10" id="b0a-SJ-X5m">
<size key="itemSize" width="128" height="128"/>
<size key="headerReferenceSize" width="0.0" height="0.0"/>
<size key="footerReferenceSize" width="0.0" height="0.0"/>
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
</collectionViewFlowLayout>
<cells/>
</collectionView>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="Bm6-Ps-enL">
<rect key="frame" x="10" y="0.0" width="394" height="40"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SING ALONG &amp; DANCE" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Zzw-da-LsG" customClass="LocalisedElementsLabel" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="394" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="S4f-t9-OdX"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="-1" estimatedRowHeight="244" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="haV-Gw-hD2">
<rect key="frame" x="0.0" y="40" width="394" height="0.0"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" id="X5Z-qL-DJr"/>
</constraints>
</tableView>
</subviews>
</stackView>
</subviews>
<edgeInsets key="layoutMargins" top="0.0" left="10" bottom="0.0" right="10"/>
</stackView>
</subviews>
<constraints>
<constraint firstItem="WYB-AZ-whM" firstAttribute="top" secondItem="5mW-wO-b1Z" secondAttribute="top" id="Yqp-1t-ibi"/>
<constraint firstItem="Ecj-Dm-Zf6" firstAttribute="trailing" secondItem="WYB-AZ-whM" secondAttribute="trailing" id="bsf-Fh-0CV"/>
<constraint firstItem="WYB-AZ-whM" firstAttribute="width" secondItem="GOx-RM-5Mz" secondAttribute="width" id="rg4-Ic-iec"/>
<constraint firstAttribute="bottom" secondItem="WYB-AZ-whM" secondAttribute="bottom" id="uDk-CJ-hxo"/>
<constraint firstItem="WYB-AZ-whM" firstAttribute="leading" secondItem="Ecj-Dm-Zf6" secondAttribute="leading" id="ydx-8y-EMr"/>
</constraints>
<viewLayoutGuide key="contentLayoutGuide" id="GOx-RM-5Mz"/>
<viewLayoutGuide key="frameLayoutGuide" id="Ecj-Dm-Zf6"/>
</scrollView>
</subviews>
<color key="backgroundColor" red="0.019607843140000001" green="0.0" blue="0.21960784310000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</stackView>
</subviews>
<viewLayoutGuide key="safeArea" id="vDu-zF-Fre"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="vDu-zF-Fre" firstAttribute="trailing" secondItem="V10-F3-AfA" secondAttribute="trailing" id="1l9-kz-QKW"/>
<constraint firstItem="Bmz-QF-ndz" firstAttribute="top" secondItem="V10-F3-AfA" secondAttribute="bottom" id="8Cn-al-lcF"/>
<constraint firstItem="vDu-zF-Fre" firstAttribute="trailing" secondItem="Bmz-QF-ndz" secondAttribute="trailing" id="CSf-km-OSA"/>
<constraint firstItem="V10-F3-AfA" firstAttribute="leading" secondItem="5EZ-qb-Rvc" secondAttribute="leading" id="E9a-Th-8Ln"/>
<constraint firstItem="Bmz-QF-ndz" firstAttribute="leading" secondItem="vDu-zF-Fre" secondAttribute="leading" id="VKC-SK-X0W"/>
<constraint firstAttribute="bottom" secondItem="Bmz-QF-ndz" secondAttribute="bottom" id="dHE-iN-hq9"/>
<constraint firstItem="V10-F3-AfA" firstAttribute="top" secondItem="vDu-zF-Fre" secondAttribute="top" id="dS9-NE-Ap0"/>
</constraints>
</view>
<connections>
<outlet property="continueWatchingCV" destination="Dty-MN-L9A" id="A3d-Vy-ObE"/>
<outlet property="continueWatchingStack" destination="CKh-Ui-Z3R" id="LPT-Y3-630"/>
<outlet property="headerHeight" destination="bn9-gt-j6P" id="ZJh-vu-Mfq"/>
<outlet property="headerImage" destination="uTJ-KB-jeA" id="z8L-VL-5Ay"/>
<outlet property="headerTitleLabel" destination="fQH-gr-lSI" id="vjR-Yu-eZO"/>
<outlet property="headerView" destination="V10-F3-AfA" id="gZb-F6-pQ2"/>
<outlet property="karaokeListingTableView" destination="haV-Gw-hD2" id="1En-mN-yVg"/>
<outlet property="scrollView" destination="5mW-wO-b1Z" id="vX8-Dp-fHu"/>
<outlet property="selectedShowView" destination="JKB-7I-uN7" id="1hm-Jj-hg2"/>
<outlet property="tableHeight" destination="X5Z-qL-DJr" id="4j9-E7-nL6"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Ief-a0-LHa" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="132" y="-27"/>
</scene>
<!--Karaoke DetailsVC-->
<scene sceneID="71D-kH-SvO">
<objects>
<viewController storyboardIdentifier="KaraokeDetailsVC" id="fax-bi-Mb9" customClass="KaraokeDetailsVC" customModule="WOKA" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="QYY-qP-IoV">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view alpha="0.60000002384185791" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ikh-9O-ugN">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="olX-Tk-Nc1">
<rect key="frame" x="0.0" y="161.5" width="414" height="587"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="WebSeriesSeasonsBackground" translatesAutoresizingMaskIntoConstraints="NO" id="RCC-UY-QBI">
<rect key="frame" x="0.0" y="0.0" width="414" height="587"/>
</imageView>
<stackView opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="tph-nP-MrO">
<rect key="frame" x="0.0" y="0.0" width="414" height="572"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="IDh-Ai-rlj">
<rect key="frame" x="0.0" y="0.0" width="414" height="50"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="TJj-V5-5nj">
<rect key="frame" x="369" y="10" width="40" height="40"/>
<constraints>
<constraint firstAttribute="width" secondItem="TJj-V5-5nj" secondAttribute="height" multiplier="1:1" id="UOo-se-mdq"/>
</constraints>
<color key="tintColor" red="0.1058823529" green="0.050980392159999999" blue="0.60392156860000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" image="CloseIconEmpty"/>
<connections>
<action selector="closeBtnTapped:" destination="fax-bi-Mb9" eventType="touchUpInside" id="a0p-cO-OSj"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="TJj-V5-5nj" secondAttribute="bottom" id="0bb-vU-QkU"/>
<constraint firstItem="TJj-V5-5nj" firstAttribute="top" secondItem="IDh-Ai-rlj" secondAttribute="top" constant="10" id="L4y-6J-Ugx"/>
<constraint firstAttribute="height" constant="50" id="nXW-an-dJK"/>
<constraint firstAttribute="trailing" secondItem="TJj-V5-5nj" secondAttribute="trailing" constant="5" id="ttc-Ua-Yx3"/>
</constraints>
</view>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="p7n-Nl-4Tf" userLabel="MainStack">
<rect key="frame" x="0.0" y="50" width="414" height="522"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hNm-hD-9HZ" customClass="ShadowView" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="13" y="5" width="388" height="200"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="ljT-wJ-GOw">
<rect key="frame" x="8" y="8" width="372" height="184"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</imageView>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="ljT-wJ-GOw" firstAttribute="leading" secondItem="hNm-hD-9HZ" secondAttribute="leading" constant="8" id="2Wj-Rt-Khs"/>
<constraint firstItem="ljT-wJ-GOw" firstAttribute="top" secondItem="hNm-hD-9HZ" secondAttribute="top" constant="8" id="BqF-S9-Yfa"/>
<constraint firstAttribute="trailing" secondItem="ljT-wJ-GOw" secondAttribute="trailing" constant="8" id="KrJ-ua-ehk"/>
<constraint firstAttribute="bottom" secondItem="ljT-wJ-GOw" secondAttribute="bottom" constant="8" id="M3e-gf-hvb"/>
<constraint firstAttribute="height" constant="200" id="lQ6-z8-OoO"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="AAT-V8-hYA">
<rect key="frame" x="13" y="215" width="388" height="27"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="pj3-9k-Ey5">
<rect key="frame" x="0.0" y="0.0" width="25" height="27"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="NA" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yfE-Jp-skN">
<rect key="frame" x="0.0" y="0.0" width="25" height="22"/>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="18"/>
<color key="textColor" name="TextDarkBlue"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="imq-Oe-kqw">
<rect key="frame" x="0.0" y="27" width="25" height="0.0"/>
<fontDescription key="fontDescription" name="Exo2-Regular" family="Exo 2" pointSize="14"/>
<color key="textColor" name="TextDarkBlue"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="MAx-LS-LUd">
<rect key="frame" x="355" y="0.0" width="33" height="27"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="hand.thumbsup.fill" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="k5s-tz-fsM">
<rect key="frame" x="0.0" y="0.5" width="20.5" height="26"/>
<color key="tintColor" red="0.035294117649999998" green="0.0" blue="0.36470588240000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lVK-jF-yhG">
<rect key="frame" x="24.5" y="0.0" width="8.5" height="27"/>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="13"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
</subviews>
</stackView>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" editable="NO" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="bdm-wK-Ct6">
<rect key="frame" x="13" y="252" width="388" height="180"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="180" id="Axj-37-UpH"/>
</constraints>
<string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.</string>
<color key="textColor" systemColor="labelColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
<stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" translatesAutoresizingMaskIntoConstraints="NO" id="hgO-37-pqN">
<rect key="frame" x="13" y="442" width="388" height="50"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ULn-gu-noT" customClass="LocalisedElementsButton" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="155" height="50"/>
<color key="backgroundColor" red="0.80000000000000004" green="0.29411764709999999" blue="0.1137254902" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="width" constant="155" id="IUH-j8-s0J"/>
<constraint firstAttribute="height" constant="50" id="loe-uS-9Ji"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="18"/>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="titleEdgeInsets" minX="5" minY="0.0" maxX="0.0" maxY="0.0"/>
<inset key="imageEdgeInsets" minX="-10" minY="0.0" maxX="10" maxY="0.0"/>
<state key="normal" title="SING NOW" image="Microphone"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="25"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="playNowBtnTapped:" destination="fax-bi-Mb9" eventType="touchUpInside" id="Wre-hM-W9P"/>
</connections>
</button>
<stackView opaque="NO" contentMode="scaleToFill" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="2mA-u5-c91">
<rect key="frame" x="234.5" y="0.0" width="153.5" height="50"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OCW-TW-vnc">
<rect key="frame" x="0.0" y="0.0" width="40" height="50"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="b7n-B7-UcT">
<rect key="frame" x="0.0" y="0.0" width="40" height="50"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" image="FavouriteRemove" translatesAutoresizingMaskIntoConstraints="NO" id="iIo-ei-G5K">
<rect key="frame" x="5" y="0.0" width="30" height="36"/>
<color key="tintColor" name="ImageDarkBlue"/>
<constraints>
<constraint firstAttribute="width" constant="30" id="Loo-CS-Ns2"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ADDED" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LUw-S0-LS7" customClass="LocalisedElementsLabel" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="0.5" y="36" width="38.5" height="14"/>
<constraints>
<constraint firstAttribute="height" constant="14" id="Rea-e5-Gi4"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Regular" family="Exo 2" pointSize="12"/>
<color key="textColor" name="ImageDarkBlue"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="b7n-B7-UcT" secondAttribute="bottom" id="Llz-q5-f20"/>
<constraint firstItem="b7n-B7-UcT" firstAttribute="leading" secondItem="OCW-TW-vnc" secondAttribute="leading" id="VFj-nh-da6"/>
<constraint firstAttribute="trailing" secondItem="b7n-B7-UcT" secondAttribute="trailing" id="gdg-AQ-d0e"/>
<constraint firstAttribute="width" constant="40" id="hw7-EK-Oju"/>
<constraint firstItem="b7n-B7-UcT" firstAttribute="top" secondItem="OCW-TW-vnc" secondAttribute="top" id="oKH-Tr-5LJ"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TCc-f5-EUy" userLabel="Seperator">
<rect key="frame" x="48" y="0.0" width="0.5" height="50"/>
<color key="backgroundColor" name="TextDarkBlue"/>
<constraints>
<constraint firstAttribute="width" constant="0.80000000000000004" id="eih-QJ-Tnq"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="D0l-lG-ZC6">
<rect key="frame" x="56.5" y="0.0" width="40" height="50"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="0pH-6w-IXC">
<rect key="frame" x="0.0" y="0.0" width="40" height="50"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" image="ShareImage" translatesAutoresizingMaskIntoConstraints="NO" id="nvR-XQ-ABS">
<rect key="frame" x="10" y="0.0" width="20" height="36"/>
<color key="tintColor" name="ImageDarkBlue"/>
<constraints>
<constraint firstAttribute="width" constant="20" id="WZy-6q-dBa"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SHARE" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Qhs-1n-fon" customClass="LocalisedElementsLabel" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="2" y="36" width="36.5" height="14"/>
<constraints>
<constraint firstAttribute="height" constant="14" id="Kmh-oY-MiV"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Regular" family="Exo 2" pointSize="12"/>
<color key="textColor" name="ImageDarkBlue"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="width" constant="40" id="HNF-dd-2o0"/>
</constraints>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="0pH-6w-IXC" secondAttribute="trailing" id="AQd-PO-jTG"/>
<constraint firstItem="0pH-6w-IXC" firstAttribute="leading" secondItem="D0l-lG-ZC6" secondAttribute="leading" id="T3z-tT-FA3"/>
<constraint firstAttribute="bottom" secondItem="0pH-6w-IXC" secondAttribute="bottom" id="epT-kt-kmh"/>
<constraint firstItem="0pH-6w-IXC" firstAttribute="top" secondItem="D0l-lG-ZC6" secondAttribute="top" id="fJy-Gj-ng9"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CCM-fu-vha" userLabel="Seperator">
<rect key="frame" x="104.5" y="0.0" width="1" height="50"/>
<color key="backgroundColor" name="TextDarkBlue"/>
<constraints>
<constraint firstAttribute="width" constant="0.80000000000000004" id="ayh-gM-YoD"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7yn-Pm-yFj">
<rect key="frame" x="113.5" y="0.0" width="40" height="50"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="ncN-pj-m9R">
<rect key="frame" x="0.0" y="0.0" width="40" height="50"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" image="LikeRemove" translatesAutoresizingMaskIntoConstraints="NO" id="Xt6-nt-uzN">
<rect key="frame" x="7.5" y="0.0" width="25" height="36"/>
<color key="tintColor" name="ImageDarkBlue"/>
<constraints>
<constraint firstAttribute="width" constant="25" id="QL7-5I-O9B"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="LIKE" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bc1-gA-wdL" customClass="LocalisedElementsLabel" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="8.5" y="36" width="23.5" height="14"/>
<constraints>
<constraint firstAttribute="height" constant="14" id="JSW-cc-qnq"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Regular" family="Exo 2" pointSize="12"/>
<color key="textColor" name="ImageDarkBlue"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="ncN-pj-m9R" firstAttribute="top" secondItem="7yn-Pm-yFj" secondAttribute="top" id="7OO-oj-kaq"/>
<constraint firstItem="ncN-pj-m9R" firstAttribute="leading" secondItem="7yn-Pm-yFj" secondAttribute="leading" id="C3J-4x-ncF"/>
<constraint firstAttribute="trailing" secondItem="ncN-pj-m9R" secondAttribute="trailing" id="Jp8-rv-9Jz"/>
<constraint firstAttribute="bottom" secondItem="ncN-pj-m9R" secondAttribute="bottom" id="LZd-Ue-Ynr"/>
<constraint firstAttribute="width" constant="40" id="XKb-CY-wj3"/>
</constraints>
</view>
</subviews>
</stackView>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="50" id="8cV-Cu-v3L"/>
</constraints>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<edgeInsets key="layoutMargins" top="5" left="13" bottom="30" right="13"/>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="RCC-UY-QBI" firstAttribute="top" secondItem="olX-Tk-Nc1" secondAttribute="top" id="9DR-FP-t3I"/>
<constraint firstItem="tph-nP-MrO" firstAttribute="leading" secondItem="olX-Tk-Nc1" secondAttribute="leading" id="AU0-1w-j86"/>
<constraint firstAttribute="bottom" secondItem="tph-nP-MrO" secondAttribute="bottom" constant="15" id="KYc-N3-n2p"/>
<constraint firstAttribute="bottom" secondItem="RCC-UY-QBI" secondAttribute="bottom" id="N8s-Ge-hqZ"/>
<constraint firstItem="tph-nP-MrO" firstAttribute="top" secondItem="olX-Tk-Nc1" secondAttribute="top" id="XLQ-OQ-1ov"/>
<constraint firstAttribute="trailing" secondItem="RCC-UY-QBI" secondAttribute="trailing" id="e6c-mv-kEl"/>
<constraint firstItem="RCC-UY-QBI" firstAttribute="leading" secondItem="olX-Tk-Nc1" secondAttribute="leading" id="jgd-Ha-EsM"/>
<constraint firstAttribute="trailing" secondItem="tph-nP-MrO" secondAttribute="trailing" id="vze-yd-9eD"/>
</constraints>
</view>
</subviews>
<viewLayoutGuide key="safeArea" id="9Xz-Cb-aa1"/>
<constraints>
<constraint firstItem="9Xz-Cb-aa1" firstAttribute="trailing" secondItem="ikh-9O-ugN" secondAttribute="trailing" id="8CP-lV-JgW"/>
<constraint firstItem="olX-Tk-Nc1" firstAttribute="centerY" secondItem="9Xz-Cb-aa1" secondAttribute="centerY" id="Kjz-TN-SBM"/>
<constraint firstAttribute="bottom" secondItem="ikh-9O-ugN" secondAttribute="bottom" id="bAO-ZZ-ef8"/>
<constraint firstItem="olX-Tk-Nc1" firstAttribute="leading" secondItem="9Xz-Cb-aa1" secondAttribute="leading" id="bVr-oR-6Mj"/>
<constraint firstItem="ikh-9O-ugN" firstAttribute="top" secondItem="QYY-qP-IoV" secondAttribute="top" id="nsf-dT-eNg"/>
<constraint firstItem="9Xz-Cb-aa1" firstAttribute="trailing" secondItem="olX-Tk-Nc1" secondAttribute="trailing" id="pEb-7H-BTe"/>
<constraint firstItem="ikh-9O-ugN" firstAttribute="leading" secondItem="QYY-qP-IoV" secondAttribute="leading" id="wAl-8v-5RR"/>
</constraints>
</view>
<connections>
<outlet property="addIcon" destination="iIo-ei-G5K" id="DtQ-lC-hxs"/>
<outlet property="addLabel" destination="LUw-S0-LS7" id="duA-PF-SKa"/>
<outlet property="addView" destination="OCW-TW-vnc" id="Cfd-ml-ETG"/>
<outlet property="likeIcon" destination="Xt6-nt-uzN" id="rq8-zW-60b"/>
<outlet property="likeLabel" destination="bc1-gA-wdL" id="7Fy-2p-kRj"/>
<outlet property="likeView" destination="7yn-Pm-yFj" id="UmV-JD-fkM"/>
<outlet property="releaseDate" destination="imq-Oe-kqw" id="WgI-LF-gx2"/>
<outlet property="shareView" destination="D0l-lG-ZC6" id="P0S-7X-ToM"/>
<outlet property="totalLikes" destination="lVK-jF-yhG" id="os1-on-OtU"/>
<outlet property="watchingDesc" destination="bdm-wK-Ct6" id="Sps-Fk-4Nj"/>
<outlet property="watchingImage" destination="ljT-wJ-GOw" id="SS0-yn-egm"/>
<outlet property="watchingTitle" destination="yfE-Jp-skN" id="89J-Q2-OGK"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="5cV-6X-hPO" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="900" y="-27"/>
</scene>
<!--PlayerVC-->
<scene sceneID="Lao-sU-GdG">
<objects>
<viewController storyboardIdentifier="AVPlayerVC" id="kQu-aO-Siv" customClass="AVPlayerVC" customModule="WOKA" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="yFi-ud-U3v">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" translatesAutoresizingMaskIntoConstraints="NO" id="s55-L0-QBA" userLabel="PlayerView">
<rect key="frame" x="0.0" y="330" width="418" height="250"/>
<subviews>
<view contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l7y-7N-uz2">
<rect key="frame" x="0.0" y="0.0" width="418" height="250"/>
<subviews>
<view alpha="0.5" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7Lc-Yp-x8G">
<rect key="frame" x="0.0" y="0.0" width="418" height="250"/>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
<stackView opaque="NO" contentMode="scaleToFill" spacing="6" translatesAutoresizingMaskIntoConstraints="NO" id="Mhh-bR-zKm" userLabel="SliderStack">
<rect key="frame" x="5" y="218" width="408" height="30"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="00:00:00" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="PZq-WO-H32">
<rect key="frame" x="0.0" y="0.0" width="50" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="nYl-FL-Ois"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Medium" family="Exo 2" pointSize="11"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="VKq-Xn-4Nn">
<rect key="frame" x="54" y="0.0" width="300" height="31"/>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="thumbTintColor" red="0.80000000000000004" green="0.29411764709999999" blue="0.1137254902" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</slider>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="0xZ-En-mzk">
<rect key="frame" x="358" y="0.0" width="50" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="13R-ht-Ooc"/>
</constraints>
<attributedString key="attributedText">
<fragment content="00:00:00">
<attributes>
<color key="NSColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<font key="NSFont" size="11" name="Exo2-Medium"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="truncatingTail" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
</attributedString>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="6xv-b4-3da">
<rect key="frame" x="114" y="100" width="190" height="50"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="M0h-b5-LXf">
<rect key="frame" x="0.0" y="0.0" width="50" height="50"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.80000000000000004" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="goforward.10" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="IKL-qY-FkR">
<rect key="frame" x="10" y="8.5" width="30" height="31"/>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="fYi-bd-7Oh"/>
<constraint firstAttribute="width" secondItem="IKL-qY-FkR" secondAttribute="height" multiplier="1:1" id="pb2-c9-VEp"/>
<constraint firstAttribute="width" constant="30" id="qsk-r1-nkf"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="IKL-qY-FkR" firstAttribute="centerY" secondItem="M0h-b5-LXf" secondAttribute="centerY" id="Qan-Kc-atl"/>
<constraint firstItem="IKL-qY-FkR" firstAttribute="centerX" secondItem="M0h-b5-LXf" secondAttribute="centerX" id="TLc-gj-6lL"/>
<constraint firstAttribute="width" secondItem="M0h-b5-LXf" secondAttribute="height" multiplier="1:1" id="sg0-5u-jyP"/>
</constraints>
</view>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="play.circle" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="IXg-pG-vEl">
<rect key="frame" x="70" y="0.5" width="50" height="49"/>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" secondItem="IXg-pG-vEl" secondAttribute="height" multiplier="1:1" id="HvT-nI-eDI"/>
</constraints>
</imageView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Odf-qx-Pl1">
<rect key="frame" x="140" y="0.0" width="50" height="50"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.80000000000000004" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="goforward.10" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="5Xm-AY-vbf">
<rect key="frame" x="10" y="8.5" width="30" height="31"/>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="30" id="W0I-ls-sHd"/>
<constraint firstAttribute="height" constant="30" id="fsd-FR-ina"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="5Xm-AY-vbf" firstAttribute="centerY" secondItem="Odf-qx-Pl1" secondAttribute="centerY" id="GaV-xD-TS9"/>
<constraint firstItem="5Xm-AY-vbf" firstAttribute="centerX" secondItem="Odf-qx-Pl1" secondAttribute="centerX" id="Qdx-Kz-QQD"/>
<constraint firstAttribute="width" secondItem="Odf-qx-Pl1" secondAttribute="height" multiplier="1:1" id="Yan-Ab-Yql"/>
</constraints>
</view>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="50" id="Jgh-NB-a3z"/>
</constraints>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="6xv-b4-3da" firstAttribute="centerY" secondItem="l7y-7N-uz2" secondAttribute="centerY" id="7EU-vQ-24M"/>
<constraint firstItem="7Lc-Yp-x8G" firstAttribute="top" secondItem="l7y-7N-uz2" secondAttribute="top" id="CKx-0J-Lhi"/>
<constraint firstItem="Mhh-bR-zKm" firstAttribute="leading" secondItem="l7y-7N-uz2" secondAttribute="leading" constant="5" id="FqT-om-cEo"/>
<constraint firstAttribute="bottom" secondItem="7Lc-Yp-x8G" secondAttribute="bottom" id="Rm8-TM-tAn"/>
<constraint firstAttribute="bottom" secondItem="Mhh-bR-zKm" secondAttribute="bottom" constant="2" id="ZKX-ak-gaz"/>
<constraint firstAttribute="trailing" secondItem="7Lc-Yp-x8G" secondAttribute="trailing" id="bNn-ua-lIq"/>
<constraint firstAttribute="trailing" secondItem="Mhh-bR-zKm" secondAttribute="trailing" constant="5" id="cOg-cb-irB"/>
<constraint firstItem="7Lc-Yp-x8G" firstAttribute="leading" secondItem="l7y-7N-uz2" secondAttribute="leading" id="fLe-ch-yLB"/>
<constraint firstItem="6xv-b4-3da" firstAttribute="centerX" secondItem="l7y-7N-uz2" secondAttribute="centerX" id="wM7-r1-Oob"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="l7y-7N-uz2" firstAttribute="leading" secondItem="s55-L0-QBA" secondAttribute="leading" id="4Hy-iL-uA7"/>
<constraint firstAttribute="bottom" secondItem="l7y-7N-uz2" secondAttribute="bottom" id="BPP-v5-npt"/>
<constraint firstAttribute="bottom" secondItem="l7y-7N-uz2" secondAttribute="bottom" id="Dpu-H8-UIT"/>
<constraint firstAttribute="trailing" secondItem="l7y-7N-uz2" secondAttribute="trailing" id="Mgf-Yb-iW1"/>
<constraint firstItem="l7y-7N-uz2" firstAttribute="leading" secondItem="s55-L0-QBA" secondAttribute="leading" id="Ppx-0A-xU4"/>
<constraint firstAttribute="height" constant="250" id="VSu-g6-K76"/>
<constraint firstItem="l7y-7N-uz2" firstAttribute="top" secondItem="s55-L0-QBA" secondAttribute="top" id="mcF-Rx-XSf"/>
<constraint firstAttribute="trailing" secondItem="l7y-7N-uz2" secondAttribute="trailing" id="r6B-rl-7Kz"/>
</constraints>
</view>
<stackView opaque="NO" contentMode="scaleToFill" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="hXe-Fv-Zk9">
<rect key="frame" x="10" y="58" width="398" height="30"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="NA" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="alm-nS-A2I">
<rect key="frame" x="0.0" y="0.0" width="358" height="30"/>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="jlb-0g-59l">
<rect key="frame" x="368" y="0.0" width="30" height="30"/>
<constraints>
<constraint firstAttribute="width" secondItem="jlb-0g-59l" secondAttribute="height" multiplier="1:1" id="9KW-Ku-fD3"/>
</constraints>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" image="CloseIconEmpty"/>
<connections>
<action selector="closeBtnTapped:" destination="kQu-aO-Siv" eventType="touchUpInside" id="Muc-ee-FGZ"/>
<action selector="closeBtnTapped:" destination="fax-bi-Mb9" eventType="touchUpInside" id="jMq-CG-juV"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="jlb-0g-59l" firstAttribute="width" secondItem="jlb-0g-59l" secondAttribute="height" multiplier="1:1" id="Ig1-El-cep"/>
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="15" translatesAutoresizingMaskIntoConstraints="NO" id="jTd-8Q-0y7">
<rect key="frame" x="25" y="658" width="368" height="95"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="gLz-mh-ln0">
<rect key="frame" x="0.0" y="0.0" width="368" height="50"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4KA-5y-qg7" customClass="LocalisedElementsButton" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="174" height="50"/>
<color key="backgroundColor" red="0.80000000000000004" green="0.29411764709999999" blue="0.1137254902" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="3ZS-GJ-VKY"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="14"/>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="titleEdgeInsets" minX="5" minY="0.0" maxX="0.0" maxY="0.0"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="5" maxY="0.0"/>
<state key="normal" title="Start Recording" image="Microphone"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="25"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="playNowBtnTapped:" destination="fax-bi-Mb9" eventType="touchUpInside" id="dwL-Ob-ZbF"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="249" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dz2-DJ-auS" customClass="LocalisedElementsButton" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="194" y="0.0" width="174" height="50"/>
<color key="backgroundColor" name="TextDarkBlue"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="7d9-YY-TdQ"/>
<constraint firstAttribute="width" constant="135" id="DlE-SG-wUQ"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="16"/>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="titleEdgeInsets" minX="5" minY="0.0" maxX="0.0" maxY="0.0"/>
<inset key="imageEdgeInsets" minX="-10" minY="0.0" maxX="10" maxY="0.0"/>
<state key="normal" title="Play" image="PlayButtonSmall"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="25"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="playNowBtnTapped:" destination="fax-bi-Mb9" eventType="touchUpInside" id="hwK-OY-rQq"/>
</connections>
</button>
</subviews>
</stackView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" hasAttributedTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="k45-7s-jnN" customClass="LocalisedElementsButton" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="0.0" y="65" width="368" height="30"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="titleEdgeInsets" minX="5" minY="0.0" maxX="0.0" maxY="0.0"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="5" maxY="0.0"/>
<state key="normal">
<attributedString key="attributedTitle">
<fragment content="Download">
<attributes>
<font key="NSFont" size="16" name=".SFNS-Regular"/>
<font key="NSOriginalFont" size="16" name="Farah"/>
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content=" ">
<attributes>
<font key="NSFont" size="16" name="Farah"/>
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content="Recording">
<attributes>
<font key="NSFont" size="14" name="Exo2-Regular"/>
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
</attributedString>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="25"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="playNowBtnTapped:" destination="fax-bi-Mb9" eventType="touchUpInside" id="owb-s2-DxU"/>
</connections>
</button>
</subviews>
</stackView>
</subviews>
<viewLayoutGuide key="safeArea" id="oGN-nm-I6a"/>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="s55-L0-QBA" firstAttribute="centerY" secondItem="oGN-nm-I6a" secondAttribute="centerY" id="3PR-ix-bDs"/>
<constraint firstItem="s55-L0-QBA" firstAttribute="leading" secondItem="yFi-ud-U3v" secondAttribute="leading" id="4XW-Wj-pXp"/>
<constraint firstItem="jTd-8Q-0y7" firstAttribute="leading" secondItem="oGN-nm-I6a" secondAttribute="leading" constant="25" id="9KV-Cx-Hoq"/>
<constraint firstItem="oGN-nm-I6a" firstAttribute="trailing" secondItem="hXe-Fv-Zk9" secondAttribute="trailing" constant="10" id="BHo-KM-sod"/>
<constraint firstItem="hXe-Fv-Zk9" firstAttribute="leading" secondItem="oGN-nm-I6a" secondAttribute="leading" constant="10" id="FLp-pS-iEw"/>
<constraint firstItem="oGN-nm-I6a" firstAttribute="trailing" secondItem="jTd-8Q-0y7" secondAttribute="trailing" constant="25" id="UbH-Km-hc2"/>
<constraint firstItem="hXe-Fv-Zk9" firstAttribute="top" secondItem="oGN-nm-I6a" secondAttribute="top" constant="10" id="ZyD-u6-icH"/>
<constraint firstItem="oGN-nm-I6a" firstAttribute="trailing" secondItem="s55-L0-QBA" secondAttribute="trailing" id="bEp-Tx-cmK"/>
<constraint firstItem="jTd-8Q-0y7" firstAttribute="top" secondItem="s55-L0-QBA" secondAttribute="bottom" constant="78" id="qj9-jV-aGM"/>
</constraints>
</view>
<connections>
<outlet property="img10SecBack" destination="IKL-qY-FkR" id="GuA-TX-UHu"/>
<outlet property="img10SecFor" destination="5Xm-AY-vbf" id="LPy-C0-Twz"/>
<outlet property="imgPlay" destination="IXg-pG-vEl" id="L33-Hc-mGN"/>
<outlet property="lbCurrentTime" destination="PZq-WO-H32" id="n5q-bm-hVP"/>
<outlet property="lbTotalTime" destination="0xZ-En-mzk" id="g1U-2U-svw"/>
<outlet property="seekSlider" destination="VKq-Xn-4Nn" id="ims-DY-5HR"/>
<outlet property="sliderStack" destination="Mhh-bR-zKm" id="Noa-Nd-AK4"/>
<outlet property="stackCtrView" destination="6xv-b4-3da" id="BbF-dD-Iek"/>
<outlet property="tintView" destination="7Lc-Yp-x8G" id="bOc-mG-HwG"/>
<outlet property="videoPlayer" destination="s55-L0-QBA" id="OHf-Ru-O1Y"/>
<outlet property="videoTitle" destination="alm-nS-A2I" id="RQN-Uc-WgF"/>
<outlet property="viewControll" destination="l7y-7N-uz2" id="zly-5u-1kS"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="4Za-1C-I6p" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1657.9710144927537" y="-27.455357142857142"/>
</scene>
</scenes>
<resources>
<image name="CloseIconEmpty" width="30" height="30"/>
<image name="FavouriteRemove" width="42.5" height="42.5"/>
<image name="LikeRemove" width="42.5" height="42.5"/>
<image name="Microphone" width="31" height="31"/>
<image name="PlayButtonSmall" width="28.333333969116211" height="28.333333969116211"/>
<image name="ShareImage" width="18" height="18"/>
<image name="WebSeriesSeasonsBackground" width="142.66667175292969" height="187.33332824707031"/>
<image name="goforward.10" catalog="system" width="119" height="128"/>
<image name="hand.thumbsup.fill" catalog="system" width="128" height="121"/>
<image name="play.circle" catalog="system" width="128" height="123"/>
<namedColor name="ImageDarkBlue">
<color red="0.035000000149011612" green="0.0" blue="0.36500000953674316" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
<namedColor name="TextDarkBlue">
<color red="0.10599999874830246" green="0.050999999046325684" blue="0.60399997234344482" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
<systemColor name="labelColor">
<color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>

View File

@@ -0,0 +1,19 @@
//
// KaraokeContinueWatchingDM.swift
// WOKA
//
// Created by Bilal on 05/07/2024.
//
import Foundation
// MARK: - KaraokeListingDM
struct KaraokeContinueWatchingDM: Codable {
let result: [KaraokeListingDM.KaraokeDatum]?
let totalRecords: Int?
enum CodingKeys: String, CodingKey {
case result
case totalRecords = "total_records"
}
}

View File

@@ -0,0 +1,73 @@
//
// KaraokeListingDM.swift
// WOKA
//
// Created by Bilal on 05/07/2024.
//
import Foundation
// MARK: - KaraokeListingDM
struct KaraokeListingDM: Codable {
let karaokeData: [KaraokeDatum]?
let totalRecords: Int?
enum CodingKeys: String, CodingKey {
case karaokeData = "karaoke_data"
case totalRecords = "total_records"
}
// MARK: - KaraokeDatum
struct KaraokeDatum: Codable {
let id: Int?
let title, description: String?
let videoURL: String?
let thumbnailPath: String?
let releaseDate: String?
let duration, categoryMasterID, ageRangeMasterID, genderMasterID: String?
let languageMasterID: Int?
let contentMoreDetails: [ContentMoreDetail]?
// let categoryData, ageRangeData, genderData: [JSONAny]?
var markAsFavourite, isLiked: Bool?
var viewsCount, likesCount, bookmarkCount: Int?
enum CodingKeys: String, CodingKey {
case id, title, description
case videoURL = "video_url"
case thumbnailPath = "thumbnail_path"
case releaseDate = "release_date"
case duration
case categoryMasterID = "category_master_id"
case ageRangeMasterID = "age_range_master_id"
case genderMasterID = "gender_master_id"
case languageMasterID = "language_master_id"
case contentMoreDetails = "content_more_details"
// case categoryData = "category_data"
// case ageRangeData = "age_range_data"
// case genderData = "gender_data"
case markAsFavourite = "mark_as_favourite"
case isLiked = "is_liked"
case viewsCount = "views_count"
case likesCount = "likes_count"
case bookmarkCount = "bookmark_count"
}
}
// MARK: - ContentMoreDetail
struct ContentMoreDetail: Codable {
let id, contentID, postType, languageMasterID: Int?
let title, description: String?
let url: String?
let tagsKeywords: String?
enum CodingKeys: String, CodingKey {
case id
case contentID = "content_id"
case postType = "post_type"
case languageMasterID = "language_master_id"
case title, description, url
case tagsKeywords = "tags_keywords"
}
}
}

View File

@@ -0,0 +1,17 @@
//
// AVPlayerVM.swift
// WOKA
//
// Created by Bilal on 05/07/2024.
//
import Foundation
class AVPlayerVM{
weak var vc : AVPlayerVC!
func initView(){
}
}

View File

@@ -0,0 +1,241 @@
//
// KaraokeListingVM.swift
// WOKA
//
// Created by Bilal on 05/07/2024.
//
import UIKit
import Alamofire
class KaraokeListingVM{
weak var vc : KaraokeListingVC!
var karaokeListData = [KaraokeListingDM.KaraokeDatum]()
var continueWatchingData = [KaraokeListingDM.KaraokeDatum]()
var indexToLoad = 0
func initView(){
setupCell()
let color1 = #colorLiteral(red: 0.8, green: 0.6078431373, blue: 0.1098039216, alpha: 1)
let color2 = #colorLiteral(red: 0.8, green: 0.2901960784, blue: 0.1098039216, alpha: 1)
vc.title = "KARAOKE".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
vc.view.applyGradient(colors: [color2, color1], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0.8, y: 0))
startShimmer()
getContinueWatching()
getKaraokeListing()
}
func setupCell(){
vc.continueWatchingCV.register(UINib(nibName: K.CellIdentifier.AudioBooks.continueAudioCell, bundle: nil), forCellWithReuseIdentifier: K.CellIdentifier.AudioBooks.continueAudioCell)
vc.continueWatchingCV.delegate = vc.self
vc.continueWatchingCV.dataSource = vc.self
vc.karaokeListingTableView.register(UINib(nibName: K.CellIdentifier.WebSeries.webSeriesShowListingCell, bundle: nil), forCellReuseIdentifier: K.CellIdentifier.WebSeries.webSeriesShowListingCell)
vc.karaokeListingTableView.delegate = vc.self
vc.karaokeListingTableView.dataSource = vc.self
}
func updateTableHeight(){
self.vc.tableHeight.constant = self.vc.karaokeListingTableView.contentSize.height + 100
self.vc.karaokeListingTableView.layoutIfNeeded()
self.vc.tableHeight.constant = self.vc.karaokeListingTableView.contentSize.height
}
func setHeaderData(){
let data = karaokeListData[indexToLoad]
if let url = data.thumbnailPath{
self.vc.headerImage.imageURL(url, color: .white)
}
if AuthFunc.shareInstance.getDefaultLanguage() == .english{
let englishData = data.contentMoreDetails?.filter({$0.languageMasterID == 1}).first
vc.headerTitleLabel.text = englishData?.title
}else{
let hindiData = data.contentMoreDetails?.filter({$0.languageMasterID == 2}).first
vc.headerTitleLabel.text = hindiData?.title
}
}
// MARK: - GetKaraoke Listing
func getContinueWatching(){
// Utilities.startProgressHUD()
let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()]
let params : Parameters = ["post_type" : 8] // 8 - Karaoke
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.WebSeries.continue_watching, method: .post,parameters: params,headers : headers) { [weak self](result : Result<BaseResponseModel<KaraokeContinueWatchingDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
guard let self else{
Utilities.dismissProgressHUD()
return
}
switch data.success{
case 0:
/*
Error
*/
Utilities.dismissProgressHUD()
// vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
self.vc.continueWatchingStack.isHidden = true
case 1:
Utilities.dismissProgressHUD()
guard let data = data.data?.result else{return}
if data.count == 0{
self.vc.continueWatchingStack.isHidden = true
}else{
self.vc.continueWatchingStack.isHidden = false
}
self.continueWatchingData = data.reversed()
self.vc.continueWatchingCV.reloadData()
default:
break
}
case .failure(let error):
guard let self else{
Utilities.dismissProgressHUD()
return
}
Utilities.dismissProgressHUD()
self.vc.continueWatchingStack.isHidden = true
vc.toast(msg: error.localizedDescription , time: 2)
}
}
}
func getKaraokeListing(){
// Utilities.startProgressHUD()
let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()]
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Karaoke.sing_karaoke_listing, method: .post,headers: headers) { [weak self](result : Result<BaseResponseModel<KaraokeListingDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
guard let self else{
Utilities.dismissProgressHUD()
return
}
switch data.success{
case 0:
/*
Error
*/
Utilities.dismissProgressHUD()
vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
case 1:
Utilities.dismissProgressHUD()
guard let data = data.data?.karaokeData else{return}
self.karaokeListData.removeAll()
self.karaokeListData = data
self.vc.karaokeListingTableView.reloadData()
self.vc.tableHeight.constant = self.vc.karaokeListingTableView.contentSize.height + 100
self.vc.karaokeListingTableView.layoutIfNeeded()
self.vc.tableHeight.constant = self.vc.karaokeListingTableView.contentSize.height
setHeaderData()
self.stopShimmer()
default:
break
}
case .failure(let error):
guard let self else{
Utilities.dismissProgressHUD()
return
}
Utilities.dismissProgressHUD()
vc.toast(msg: error.localizedDescription , time: 2)
}
}
}
func startShimmer(){
vc.headerView.startShimmer()
vc.selectedShowView.startShimmer()
}
func stopShimmer(){
self.vc.headerView.stopShimmer()
self.vc.selectedShowView.stopShimmer()
}
// MARK: - Update Fav Likes
func updateFavLikes(type : FavCellCLick, id : Int){
guard let data = karaokeListData.filter({$0.id == id}).first, let audioListIndex = karaokeListData.firstIndex(where: {$0.id == id}) else{return}
switch type {
case .favourite:
guard let isFav = data.markAsFavourite ,let postID = data.id,let postType = data.contentMoreDetails?.first?.postType else{return}
if isFav == true {
LikeFavCommonFunc.shareInstance.removeFavourite(postID: postID, postType: postType, categoryID: 0, vc: self.vc) { [unowned self] isDone in
if isDone{
karaokeListData[audioListIndex].markAsFavourite = false
vc.karaokeListingTableView.reloadRows(at: [IndexPath(row: audioListIndex, section: 0)],with: .none)
K.GVar.reloadMyList = true
/*
Check if the data is in continue watching
*/
if let continueWatchingIndex = continueWatchingData.firstIndex(where: { $0.id == id }){
continueWatchingData[continueWatchingIndex].markAsFavourite = false
vc.continueWatchingCV.reloadItems(at: [IndexPath(row: continueWatchingIndex, section: 0)])
}
}
}
}else{
LikeFavCommonFunc.shareInstance.addFavourite(postID: postID, postType: postType, categoryID: 0, vc: self.vc) { [unowned self] isDone in
if isDone{
karaokeListData[audioListIndex].markAsFavourite = true
vc.karaokeListingTableView.reloadRows(at: [IndexPath(row: audioListIndex, section: 0)],with: .none)
K.GVar.reloadMyList = true
/*
Check if the data is in continue watching
*/
if let continueWatchingIndex = continueWatchingData.firstIndex(where: { $0.id == id }){
continueWatchingData[continueWatchingIndex].markAsFavourite = true
vc.continueWatchingCV.reloadItems(at: [IndexPath(row: continueWatchingIndex, section: 0)])
}
}
}
}
return
case .liked:
guard let isLiked = data.isLiked ,let postID = data.id,let postType = data.contentMoreDetails?.first?.postType else{return}
if isLiked{
LikeFavCommonFunc.shareInstance.unlikePost(postID: postID, postType: postType, vc: self.vc) { [unowned self] isDone in
if isDone{
karaokeListData[audioListIndex].isLiked = false
karaokeListData[audioListIndex].likesCount! -= 1
vc.karaokeListingTableView.reloadRows(at: [IndexPath(row: audioListIndex, section: 0)],with: .none)
K.GVar.reloadMyList = true
/*
Check if the data is in continue watching
*/
if let continueWatchingIndex = continueWatchingData.firstIndex(where: { $0.id == id }){
continueWatchingData[continueWatchingIndex].isLiked = false
continueWatchingData[continueWatchingIndex].likesCount! -= 1
vc.continueWatchingCV.reloadItems(at: [IndexPath(row: continueWatchingIndex, section: 0)])
}
}
}
}else{
LikeFavCommonFunc.shareInstance.likePost(postID: postID, postType: postType, vc: self.vc){ [unowned self] isDone in
if isDone{
karaokeListData[audioListIndex].isLiked = true
karaokeListData[audioListIndex].likesCount! += 1
vc.karaokeListingTableView.reloadRows(at: [IndexPath(row: audioListIndex, section: 0)],with: .none)
K.GVar.reloadMyList = true
/*
Check if the data is in continue watching
*/
if let continueWatchingIndex = continueWatchingData.firstIndex(where: { $0.id == id }){
continueWatchingData[continueWatchingIndex].isLiked = true
continueWatchingData[continueWatchingIndex].likesCount! += 1
vc.continueWatchingCV.reloadItems(at: [IndexPath(row: continueWatchingIndex, section: 0)])
}
}
}
}
}
}
}

View File

@@ -243,3 +243,9 @@
Games
*/
"HAVE A FUN TIME" = "आनंद करने का समय";
/*
Karaoke
*/
"SING ALONG & DANCE" = "साथ गायें और नाचें";
"SING NOW" = "अभी गायें";

View File

@@ -99,6 +99,10 @@ struct APIEndPoints {
static let get_token_to_auth_player = makeURL(path: "get_token_to_auth_player")
}
struct Karaoke{
static let sing_karaoke_listing = makeURL(path: "sing_karaoke_listing")
}
// Other endpoint categories...
struct Links {
static let privacyPolicy = "https://www.wokaland.com/privacy-policy/"

View File

@@ -314,28 +314,8 @@
<constraint firstAttribute="bottom" secondItem="r88-JP-phS" secondAttribute="bottom" id="meH-ml-MUc"/>
</constraints>
</view>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillProportionally" spacing="1" translatesAutoresizingMaskIntoConstraints="NO" id="9fz-vc-Ufb" userLabel="Karaoke">
<rect key="frame" x="10" y="192.33333333333331" width="95" height="95"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Karaoke" translatesAutoresizingMaskIntoConstraints="NO" id="DWF-Lu-F24">
<rect key="frame" x="0.0" y="0.0" width="95" height="79"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="KARAOKE" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Yyo-6X-Jk4" customClass="LocalisedElementsLabel" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="0.0" y="80" width="95" height="15"/>
<constraints>
<constraint firstAttribute="height" constant="15" id="Z4M-G5-Rob"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="13"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="width" secondItem="9fz-vc-Ufb" secondAttribute="height" multiplier="1:1" id="91B-pD-rvh"/>
</constraints>
</stackView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ugr-Tf-Y1l">
<rect key="frame" x="165" y="200.33333333333331" width="95" height="95"/>
<rect key="frame" x="160" y="202.33333333333331" width="95" height="95"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillProportionally" spacing="1" translatesAutoresizingMaskIntoConstraints="NO" id="JHO-R6-WGZ" userLabel="Audio Books">
<rect key="frame" x="0.0" y="0.0" width="95" height="95"/>
@@ -364,23 +344,55 @@
<constraint firstAttribute="trailing" secondItem="JHO-R6-WGZ" secondAttribute="trailing" id="wrd-vn-ogp"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gk8-xm-Hh5">
<rect key="frame" x="10" y="192.33333333333331" width="95" height="95"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillProportionally" spacing="1" translatesAutoresizingMaskIntoConstraints="NO" id="9fz-vc-Ufb" userLabel="Karaoke">
<rect key="frame" x="0.0" y="0.0" width="95" height="95"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Karaoke" translatesAutoresizingMaskIntoConstraints="NO" id="DWF-Lu-F24">
<rect key="frame" x="0.0" y="0.0" width="95" height="79"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="KARAOKE" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Yyo-6X-Jk4" customClass="LocalisedElementsLabel" customModule="WOKA" customModuleProvider="target">
<rect key="frame" x="0.0" y="80" width="95" height="15"/>
<constraints>
<constraint firstAttribute="height" constant="15" id="Z4M-G5-Rob"/>
</constraints>
<fontDescription key="fontDescription" name="Exo2-Bold" family="Exo 2" pointSize="13"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="95" id="Mnv-Cn-1mN"/>
<constraint firstAttribute="width" constant="95" id="st2-Tx-v7T"/>
</constraints>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="9fz-vc-Ufb" firstAttribute="top" secondItem="gk8-xm-Hh5" secondAttribute="top" id="DGl-Ue-JdK"/>
<constraint firstAttribute="trailing" secondItem="9fz-vc-Ufb" secondAttribute="trailing" id="vsl-Ld-Iam"/>
<constraint firstAttribute="bottom" secondItem="9fz-vc-Ufb" secondAttribute="bottom" id="xGV-rs-7OT"/>
<constraint firstItem="9fz-vc-Ufb" firstAttribute="leading" secondItem="gk8-xm-Hh5" secondAttribute="leading" id="yji-Es-JPT"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="Ehe-Th-asW" firstAttribute="baseline" secondItem="lRy-nX-Xia" secondAttribute="firstBaseline" constant="40" id="6HI-BQ-pxx"/>
<constraint firstItem="9fz-vc-Ufb" firstAttribute="centerX" secondItem="GGC-rX-Pyw" secondAttribute="centerX" id="7c7-bD-KbL"/>
<constraint firstItem="gk8-xm-Hh5" firstAttribute="top" secondItem="GGC-rX-Pyw" secondAttribute="bottom" constant="30" id="6fZ-aH-GOz"/>
<constraint firstItem="GGC-rX-Pyw" firstAttribute="leading" secondItem="ppi-HI-rj1" secondAttribute="leading" constant="10" id="Go0-Ui-etR"/>
<constraint firstItem="ugr-Tf-Y1l" firstAttribute="centerY" secondItem="gk8-xm-Hh5" secondAttribute="centerY" constant="10" id="Mqx-zA-KmU"/>
<constraint firstItem="GGC-rX-Pyw" firstAttribute="centerY" secondItem="lRy-nX-Xia" secondAttribute="centerY" constant="25" id="NmB-T5-Lvq"/>
<constraint firstItem="9fz-vc-Ufb" firstAttribute="height" secondItem="ppi-HI-rj1" secondAttribute="height" multiplier="0.208333" id="RjE-7v-VJf"/>
<constraint firstItem="lRy-nX-Xia" firstAttribute="height" secondItem="ppi-HI-rj1" secondAttribute="height" multiplier="0.208333" id="Slx-Jj-1Nl"/>
<constraint firstItem="ugr-Tf-Y1l" firstAttribute="centerY" secondItem="9fz-vc-Ufb" secondAttribute="centerY" constant="8" id="X1t-Qn-V4F"/>
<constraint firstItem="lRy-nX-Xia" firstAttribute="centerX" secondItem="ppi-HI-rj1" secondAttribute="centerX" id="ZMq-Za-1eg"/>
<constraint firstItem="Ehe-Th-asW" firstAttribute="height" secondItem="ppi-HI-rj1" secondAttribute="height" multiplier="0.208333" id="bYM-Cl-mWm"/>
<constraint firstItem="ugr-Tf-Y1l" firstAttribute="leading" secondItem="9fz-vc-Ufb" secondAttribute="trailing" constant="60" id="d6T-jS-Fvp"/>
<constraint firstItem="gk8-xm-Hh5" firstAttribute="leading" secondItem="ppi-HI-rj1" secondAttribute="leading" constant="10" id="c7p-1g-qdM"/>
<constraint firstItem="yuF-d6-Tag" firstAttribute="top" secondItem="Ehe-Th-asW" secondAttribute="bottom" constant="40" id="dOG-0I-sH8"/>
<constraint firstAttribute="trailing" secondItem="Ehe-Th-asW" secondAttribute="trailing" constant="10" id="h6R-gj-t8n"/>
<constraint firstItem="ugr-Tf-Y1l" firstAttribute="leading" secondItem="gk8-xm-Hh5" secondAttribute="trailing" constant="55" id="iiR-AX-YQG"/>
<constraint firstItem="Ehe-Th-asW" firstAttribute="top" secondItem="ppi-HI-rj1" secondAttribute="top" constant="-10" id="rPo-rh-Nry"/>
<constraint firstItem="9fz-vc-Ufb" firstAttribute="top" secondItem="GGC-rX-Pyw" secondAttribute="bottom" constant="30" id="v9C-zO-CMS"/>
</constraints>
</view>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="-2" translatesAutoresizingMaskIntoConstraints="NO" id="LYo-Uy-0nM" userLabel="More">
@@ -458,6 +470,7 @@
<outlet property="gamesView" destination="yuF-d6-Tag" id="vpd-Cs-PPf"/>
<outlet property="gradientView" destination="jdZ-WQ-xcr" id="EPt-cC-wNC"/>
<outlet property="homeGrass" destination="bNd-CB-wx1" id="Rhs-zT-ChZ"/>
<outlet property="karaokeView" destination="gk8-xm-Hh5" id="ewe-SE-uSJ"/>
<outlet property="liveTVView" destination="kzE-UE-7KK" id="wh1-1v-X4B"/>
<outlet property="liveTvPlayer" destination="edI-4n-4AY" id="Ofv-d0-YP4"/>
<outlet property="moonImage" destination="Jbf-Kl-35X" id="WBx-uu-r3W"/>

View File

@@ -41,7 +41,7 @@ class PlayerVC: JWPlayerViewController, JWPlayerViewControllerDelegate {
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: UIInterfaceOrientationMask.portrait))
} else {
UIDevice.current.setValue(UIInterfaceOrientationMask.landscapeRight.rawValue, forKey: "orientation")
UIDevice.current.setValue(UIInterfaceOrientationMask.portrait.rawValue, forKey: "orientation")
}
// UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
UIView.setAnimationsEnabled(true)

View File

@@ -29,6 +29,7 @@ class ThemeOneVC: UIViewController {
@IBOutlet weak var moreStack: UIStackView!
@IBOutlet weak var bottomArrow: UIImageView!
@IBOutlet weak var gamesView: UIView!
@IBOutlet weak var karaokeView: UIView!
var timer: Timer?

View File

@@ -144,6 +144,15 @@ class ThemeOneVM{
vc.navigationController?.pushViewController(vcPush, animated: true)
}
}
vc.karaokeView.addTapGesture { [self] in
ViewButtonAnimation.sharedInstance.btnTapped(in: self.vc, view: self.vc.karaokeView) { [weak self] in
guard let self else{return}
let sb = UIStoryboard(name: K.StoryBoard.Karaoke, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Karaoke.karaokeListingVC) as! KaraokeListingVC
vc.navigationController?.pushViewController(vcPush, animated: true)
}
}
}
// MARK: - Animate Clouds and LiveTV

View File

@@ -135,6 +135,37 @@ class WebSeriesShowListingCell: UITableViewCell {
}
}
func setKaraokeData(data: KaraokeListingDM.KaraokeDatum){
//heart.fill , heart , hand.thumbsup.fill , hand.thumbsup
if AuthFunc.shareInstance.getDefaultLanguage() == .english{
showTitle.text = data.contentMoreDetails?.filter({$0.languageMasterID == 1}).first?.title
}else{
showTitle.text = data.contentMoreDetails?.filter({$0.languageMasterID == 2}).first?.title
}
totalLikes.text = data.likesCount?.toString() ?? "0"
if let url = data.thumbnailPath{
showThumbnail.imageURL(url)
}
if let like = data.isLiked{
switch like{
case true:
likeBtn.setImage(UIImage(named: "LikeAdd"), for: .normal)
case false:
likeBtn.setImage(UIImage(named: "LikeRemove"), for: .normal)
}
}
if let favourite = data.markAsFavourite{
if favourite == true{
favBtn.setImage(UIImage(named: "FavouriteAdd"), for: .normal)
}else{
favBtn.setImage(UIImage(named: "FavouriteRemove"), for: .normal)
}
}
}
@IBAction func btnTapped(_ sender: UIButton) {
switch sender{
case likeBtn: