Skip to content

Instantly share code, notes, and snippets.

@atulkhatri
atulkhatri / PlayerViewController7.swift
Created July 12, 2021 17:52
tvOS Bootcamp Player 7
private let kAdvertUrl = "https://bitdash-a.akamaihd.net/content/MI201109210084_1/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.m3u8".toUrl
@atulkhatri
atulkhatri / PlayerViewController7.swift
Created July 12, 2021 17:52
tvOS Bootcamp Player 7
extension PlayerViewController: AVPlayerViewControllerDelegate {
func playerViewController(_ playerViewController: AVPlayerViewController, willPresent interstitial: AVInterstitialTimeRange) {
let playerVC = PlayerViewController()
playerVC.url = kAdvertUrl
present(playerVC, animated: false, completion: nil)
}
}
@atulkhatri
atulkhatri / PlayerViewController6.swift
Created July 12, 2021 17:51
tvOS Bootcamp Player 6
private func createPlayerItem(url: URL) -> AVPlayerItem {
let playerItem = AVPlayerItem(url: url)
// Add advertisement timerange
var timeRanges: [AVInterstitialTimeRange] = []
for index in stride(from: 60, to: 600, by: 60) {
let range = AVInterstitialTimeRange(timeRange: CMTimeRange(start: CMTime(seconds: Double(index), preferredTimescale: .max), duration: CMTime(seconds: 1, preferredTimescale: .max)))
timeRanges.append(range)
}
playerItem.interstitialTimeRanges = timeRanges
return playerItem
@atulkhatri
atulkhatri / PlayerViewController5.swift
Created July 12, 2021 17:50
tvOS Bootcamp Player 5
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
player?.pause()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
player?.play()
}
@atulkhatri
atulkhatri / PlayerViewController4.swift
Created July 12, 2021 17:50
tvOS Bootcamp Player 4
class PlayerViewController: AVPlayerViewController {
var url: URL?
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if !initialized {
if asset != nil {
startAssetPlayback()
} else {
startAdvertPlayback()
@atulkhatri
atulkhatri / PlayerViewController3.swift
Created July 12, 2021 17:49
tvOS Bootcamp Player 3
private func setupPlayer() {
self.delegate = self
NotificationCenter.default.addObserver(self, selector: #selector(playbackFinished), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
}
@objc private func playbackFinished() {
if let queuePlayer = player as? AVQueuePlayer {
if queuePlayer.currentItem != queuePlayer.items().last {
return
}
@atulkhatri
atulkhatri / PlayerViewController2.swift
Created July 12, 2021 17:48
tvOS Bootcamp Player 2
private func startAssetPlayback() {
switch asset?.type {
case .movie:
if let url = asset?.url.toUrl {
let playerItem = createPlayerItem(url: url)
player = AVPlayer(playerItem: playerItem)
}
case .series:
var playerItems: [AVPlayerItem] = []
if let rail = rail?.list {
@atulkhatri
atulkhatri / DetailViewController5.swift
Created July 12, 2021 17:47
tvOS Bootcamp Detail Screen 5
private func openPlayer(with asset: AssetModel) {
let playerVC = PlayerViewController()
playerVC.asset = asset
playerVC.rail = rail
present(playerVC, animated: true, completion: nil)
}
@atulkhatri
atulkhatri / PlayerViewController.swift
Created July 12, 2021 17:46
tvOS Bootcamp Player
class PlayerViewController: AVPlayerViewController {
var asset: AssetModel?
var rail: RailModel?
var initialized: Bool = false
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if !initialized {
if asset != nil {
startAssetPlayback()
@atulkhatri
atulkhatri / DetailViewController4.swift
Created July 12, 2021 17:42
tvOS Bootcamp Detail Screen 4
override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
super.didUpdateFocus(in: context, with: coordinator)
print("Previous focused item: \(String(describing: context.previouslyFocusedView)) \nNext focused item: \(String(describing: context.nextFocusedView)) \nFocus direction: \(context.focusHeading.rawValue)")
}