Skip to content

Commit

Permalink
Integrate IMA, initial providers, and more (#4)
Browse files Browse the repository at this point in the history
* Fixed license

* Fixed license and more

* MockMediaProvider (#2)

* Update git ignore to ignore pod folder

* move ads plugin to core

* remove unused 'throw'
rename canPlayAd -> shouldPlayAd

* fix logic around the ad_ready and ad_loaded events

* taking pip functionality into separate class in order to support ios8

* handle errors in ima

* handle errors in ima - missing changes

* print ads events

* Cleanup.

* MessageBus: check is observers array is nil.

* Added missing prepare() call.

* Fixed gitignore

* Removed Pods from Example app.

* Removed commented-out code.

* Update Podfile.lock.
  • Loading branch information
noamtamim committed Nov 23, 2016
1 parent ed4aae3 commit 28e4b5f
Show file tree
Hide file tree
Showing 55 changed files with 601 additions and 3,149 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ xcuserdata/
*.xccheckout
*.xcscmblueprint

/Example/Pods
# CocoaPods
Pods/
8 changes: 2 additions & 6 deletions Classes/Managers/PlayKitManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,15 @@

import UIKit

public enum PlayKitError: Error {
case multipleDecoratorsDetected
}

public class PlayKitManager: NSObject {

public static let sharedInstance : PlayKitManager = PlayKitManager()

var pluginRegistry = Dictionary<String, PKPlugin.Type>()

public func loadPlayer(config: PlayerConfig) throws -> Player {
public func loadPlayer(config: PlayerConfig) -> Player {
let loader = PlayerLoader()
try loader.load(config)
loader.load(config)
return loader
}

Expand Down
25 changes: 13 additions & 12 deletions MessageBus.swift → Classes/MessageBus.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ import Foundation

private struct Observation {
weak var observer: AnyObject?
let block: Any
let block: (_ info: Any)->Void
}

public class MessageBus: NSObject {
private static var observations = [String: [Observation]]()
private static let lock: AnyObject = UUID().uuidString as AnyObject
private var observations = [String: [Observation]]()
private let lock: AnyObject = UUID().uuidString as AnyObject

public static func addObserver(_ observer: AnyObject, event: PKEvent, block: @escaping (_ info: Any)->Void) {
public func addObserver(_ observer: AnyObject, event: PKEvent, block: @escaping (_ info: Any)->Void) {
sync {
if var array: [Observation]? = observations[event.rawValue] {
array!.append(Observation(observer: observer, block: block))
Expand All @@ -27,7 +27,7 @@ public class MessageBus: NSObject {
}
}

public static func removeObserver(_ observer: AnyObject, event: PKEvent) {
public func removeObserver(_ observer: AnyObject, event: PKEvent) {
sync {
if var array: [Observation]? = observations[event.rawValue] {
array = array!.filter { $0.observer! !== observer }
Expand All @@ -37,19 +37,20 @@ public class MessageBus: NSObject {
}
}

public static func post(_ event: PKEvent) {
public func post(_ event: PKEvent) {
sync {
if var array: [Observation]? = observations[event.rawValue] {
array = array!.filter { $0.observer != nil } // Remove nil observers
array!.forEach {
if let block = $0.block as? (_ info: Any)->Void {
block(event) }
// TODO: remove nil observers
if let array = observations[event.rawValue] {
array.forEach {
if let observer = $0.observer {
$0.block(event)
}
}
}
}
}

private static func sync(block: () -> ()) {
private func sync(block: () -> ()) {
objc_sync_enter(lock)
block()
objc_sync_exit(lock)
Expand Down
17 changes: 17 additions & 0 deletions Classes/Network/Response.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// Response.swift
// Pods
//
// Created by Admin on 08/11/2016.
//
//

import UIKit


public struct Response<T> {

public let data: T?
public let error : Error?

}
4 changes: 0 additions & 4 deletions Classes/Player/AVPlayerEngine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,6 @@ class AVPlayerEngine : AVPlayer, PlayerEngine {
return false
}

func addBoundaryTimeObserver(origin: Origin, offset: TimeInterval, wait: Bool, observer: TimeObserver) {

}

func destroy() {

}
Expand Down
75 changes: 43 additions & 32 deletions Classes/Player/MediaEntry.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,58 @@
//

import UIKit
import SwiftyJSON

public class MediaEntry: NSObject {
let id: String
var sources: [MediaSource]?
var duration: Int64?
internal var id: String?
internal var sources: [MediaSource]?
internal var duration: Int64?

init(_ id: String) {
private let idKey = "id"
private let sourcesKey = "sources"
private let durationKey = "duration"


public init(json: JSON) {

guard let id = json[idKey].string else { return}
self.id = id
self.duration = json[durationKey].int64
var sources : [MediaSource] = [MediaSource]()
for jsonSource in json[sourcesKey].array! {

let mediaSource : MediaSource = MediaSource(json: jsonSource)
sources.append(mediaSource)
}

self.sources = sources
}
}

public class MediaSource {
let id: String
var contentUrl: URL?
var mimeType: String?
var drmData: DRMData?
internal var id: String
internal var contentUrl: URL?
internal var mimeType: String?
internal var drmData: DRMData?

init(id: String) {
self.id = id


private let idKey: String = "id"
private let contentUrlKey: String = "url"
private let mimeTypeKey: String = "mimeType"
private let drmDataKey: String = "drmData"


public init(json:JSON) {
self.id = json[idKey].string!

if let pathString = json[contentUrlKey].string {
self.contentUrl = URL(string: pathString)
}

if let mimeTypeString = json[mimeTypeKey].string {
self.mimeType = mimeTypeString
}
}
}

Expand All @@ -36,25 +69,3 @@ open class DRMData {
public class FairPlayDRMData: DRMData {
var fpsCertificate: Data?
}

public protocol MediaEntryProvider {
var mediaEntry: MediaEntry? { get }
func addSource(_ id: String, contentUrl: String)
}

public class MockMediaEntryProvider : MediaEntryProvider {
public var mediaEntry: MediaEntry?

public init(_ mockId: String) {
mediaEntry = MediaEntry(mockId)
}

public func addSource(_ id: String, contentUrl: String) {
if mediaEntry?.sources == nil {
mediaEntry?.sources = [MediaSource]()
}
let source = MediaSource(id: id)
source.contentUrl = URL(string: contentUrl)
mediaEntry?.sources?.append(source)
}
}
30 changes: 3 additions & 27 deletions Classes/Player/Player.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,38 +10,25 @@ import UIKit
import AVFoundation
import AVKit

public protocol PlayerDataSource: class {
func playerCanPlayAd(_ player: Player) -> Bool
}

public protocol PlayerDelegate: class {
func playerShouldPlayAd(_ player: Player) -> Bool
func player(_ player: Player, failedWith error: String)
}

public protocol Player {

var dataSource: PlayerDataSource? { get set }
var delegate: PlayerDelegate? { get set }

/**
Get the player's layer component.
*/
var view: UIView! { get }

var playerEngine: PlayerEngine? { get }

/**
Get/set the current player position.
*/
var currentTime: TimeInterval? { get set }

/**
Should playback start when ready?
If set to true after entry is loaded, this will start playback.
If set to false while entry is playing, this will pause playback.
*/
var autoPlay: Bool? { get set }

/**
Prepare for playing an entry. If `config.autoPlay` is true, the entry will automatically
play when it's ready.
Expand Down Expand Up @@ -79,21 +66,10 @@ public protocol Player {
*/
func destroy()

func addBoundaryTimeObserver(origin: Origin, offset: TimeInterval, wait: Bool, observer: TimeObserver)

@available(iOS 9.0, *)
func createPiPController(with delegate: AVPictureInPictureControllerDelegate) -> AVPictureInPictureController?
}

public protocol TimeObserver {
func timeReached(player: Player, origin: Origin, offset: TimeInterval)
}

public enum Origin {
case start
case end
}

protocol PlayerDecorator {
func getDecoratedPlayer() -> PlayerDecoratorBase?
protocol PlayerDecoratorProvider {
func getPlayerDecorator() -> PlayerDecoratorBase?
}
7 changes: 1 addition & 6 deletions Classes/Player/PlayerController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import AVKit
class PlayerController: Player {
//public var messageBus: PKMessageBus?

var dataSource: PlayerDataSource?
var delegate: PlayerDelegate?

private var currentPlayer: PlayerEngine?
Expand Down Expand Up @@ -51,7 +50,7 @@ class PlayerController: Player {
}
}

public init(mediaEntry: MediaEntry) {
public init(mediaEntry: PlayerConfig) {
self.currentPlayer = AVPlayerEngine()
}

Expand Down Expand Up @@ -84,10 +83,6 @@ class PlayerController: Player {
return false
}

func addBoundaryTimeObserver(origin: Origin, offset: TimeInterval, wait: Bool, observer: TimeObserver) {

}

@available(iOS 9.0, *)
func createPiPController(with delegate: AVPictureInPictureControllerDelegate) -> AVPictureInPictureController? {
return self.currentPlayer?.createPiPController(with: delegate)
Expand Down
56 changes: 9 additions & 47 deletions Classes/Player/PlayerDecoratorBase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,25 @@ import Foundation
import AVFoundation
import AVKit

class PlayerDecoratorBase: Player, PlayerDataSource, PlayerDelegate {
class PlayerDecoratorBase: Player {

private var player: Player!

var dataSource: PlayerDataSource? {
didSet {
self.player.dataSource = self
public var delegate: PlayerDelegate? {
get {
return self.player.delegate
}
}

var delegate: PlayerDelegate? {
didSet {
self.player.delegate = self
set {
self.player.delegate = newValue
}
}

public var currentTime: TimeInterval? {
get {
return self.player.currentTime
}
set {
self.player.currentTime = currentTime
self.player.currentTime = newValue
}
}

Expand All @@ -41,21 +38,6 @@ class PlayerDecoratorBase: Player, PlayerDataSource, PlayerDelegate {
}
}

public var playerEngine: PlayerEngine? {
get {
return self.player.playerEngine
}
}

public var autoPlay: Bool? {
get {
return self.player.autoPlay
}
set {
self.player.autoPlay = autoPlay
}
}

public func prepare(_ config: PlayerConfig) {
return self.player.prepare(config)
}
Expand All @@ -77,11 +59,7 @@ class PlayerDecoratorBase: Player, PlayerDataSource, PlayerDelegate {
}

public func destroy() {
self.player.destroy()
}

public func addBoundaryTimeObserver(origin: Origin, offset: TimeInterval, wait: Bool, observer: TimeObserver) {
self.player.addBoundaryTimeObserver(origin: origin, offset: offset, wait: wait, observer: observer)

}

public func play() {
Expand All @@ -104,20 +82,4 @@ class PlayerDecoratorBase: Player, PlayerDataSource, PlayerDelegate {
func createPiPController(with delegate: AVPictureInPictureControllerDelegate) -> AVPictureInPictureController? {
return self.player.createPiPController(with: delegate)
}

//MARK: Player DataSource methods

func playerCanPlayAd(_ player: Player) -> Bool {
return self.dataSource!.playerCanPlayAd(self)
}

//MARK: Player Delegate methods

func player(_ player: Player, failedWith error: String) {
self.delegate?.player(self, failedWith: error)
}

func player(_ player: Player, didReceive event: PKEvent, with eventData: Any?) {
// self.delegate?.player(self, didReceive: event, with: eventData)
}
}
Loading

0 comments on commit 28e4b5f

Please sign in to comment.